mirror of
https://github.com/9ParsonsB/Pulsar.git
synced 2025-07-03 09:03:42 -04:00
Herald v2 (#74)
* Add speech rate setting * Add volume slider * New speech manager skeleton * User API key from resx * Implement voice list retrieve via new api * Rewrite to use ObAPI, remove all dependancies * Use volume setting * Clean up using statements * Volume and timing adjustments * Lookup rate value * Use numeric rates for tighter spread * Manage plugin data folder via core interface * Add check that nullable settings are not null. * Get file size before it's deleted. * Improve old settings migration. * Ignore cache sizes below 1MB * Re-index orphaned files in cache, purge legacy wav files. * Call top level error logging for native voice exception. * Async title and detail requests to remove pause * Remove NetCoreAudio use of temp files. * Remove orphan using.
This commit is contained in:
110
ObservatoryHerald/NetCoreAudio/Players/UnixPlayerBase.cs
Normal file
110
ObservatoryHerald/NetCoreAudio/Players/UnixPlayerBase.cs
Normal file
@ -0,0 +1,110 @@
|
||||
using NetCoreAudio.Interfaces;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NetCoreAudio.Players
|
||||
{
|
||||
internal abstract class UnixPlayerBase : IPlayer
|
||||
{
|
||||
private Process _process = null;
|
||||
|
||||
internal const string PauseProcessCommand = "kill -STOP {0}";
|
||||
internal const string ResumeProcessCommand = "kill -CONT {0}";
|
||||
|
||||
public event EventHandler PlaybackFinished;
|
||||
|
||||
public bool Playing { get; private set; }
|
||||
|
||||
public bool Paused { get; private set; }
|
||||
|
||||
protected abstract string GetBashCommand(string fileName);
|
||||
|
||||
public async Task Play(string fileName)
|
||||
{
|
||||
await Stop();
|
||||
var BashToolName = GetBashCommand(fileName);
|
||||
_process = StartBashProcess($"{BashToolName} '{fileName}'");
|
||||
_process.EnableRaisingEvents = true;
|
||||
_process.Exited += HandlePlaybackFinished;
|
||||
_process.ErrorDataReceived += HandlePlaybackFinished;
|
||||
_process.Disposed += HandlePlaybackFinished;
|
||||
Playing = true;
|
||||
}
|
||||
|
||||
public Task Pause()
|
||||
{
|
||||
if (Playing && !Paused && _process != null)
|
||||
{
|
||||
var tempProcess = StartBashProcess(string.Format(PauseProcessCommand, _process.Id));
|
||||
tempProcess.WaitForExit();
|
||||
Paused = true;
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task Resume()
|
||||
{
|
||||
if (Playing && Paused && _process != null)
|
||||
{
|
||||
var tempProcess = StartBashProcess(string.Format(ResumeProcessCommand, _process.Id));
|
||||
tempProcess.WaitForExit();
|
||||
Paused = false;
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task Stop()
|
||||
{
|
||||
if (_process != null)
|
||||
{
|
||||
_process.Kill();
|
||||
_process.Dispose();
|
||||
_process = null;
|
||||
}
|
||||
|
||||
Playing = false;
|
||||
Paused = false;
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
protected Process StartBashProcess(string command)
|
||||
{
|
||||
var escapedArgs = command.Replace("\"", "\\\"");
|
||||
|
||||
var process = new Process()
|
||||
{
|
||||
StartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = "/bin/bash",
|
||||
Arguments = $"-c \"{escapedArgs}\"",
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardInput = true,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true,
|
||||
}
|
||||
};
|
||||
process.Start();
|
||||
return process;
|
||||
}
|
||||
|
||||
internal void HandlePlaybackFinished(object sender, EventArgs e)
|
||||
{
|
||||
if (Playing)
|
||||
{
|
||||
Playing = false;
|
||||
PlaybackFinished?.Invoke(this, e);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract Task SetVolume(byte percent);
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Stop().Wait();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user