initialize portaudio playback only once
This commit is contained in:
1 parent
9bcf209d49
commit
57d301018e
1 file changed
+53
-25
@@ -388,7 +388,9 @@ namespace Vocaluxe.Lib.Sound
|
||||
const long BEGINREFILL = 800000L;
|
||||
|
||||
private CSyncTimer _SyncTimer;
|
||||
private bool _Initialized;
|
||||
private static bool _Initialized = false;
|
||||
private static int _NumStreams = 0;
|
||||
private static Object _Mutex = new object();
|
||||
private int _ByteCount = 4;
|
||||
private float _Volume = 1f;
|
||||
private float _VolumeMax = 1f;
|
||||
@@ -403,8 +405,8 @@ namespace Vocaluxe.Lib.Sound
|
||||
private bool _fading = false;
|
||||
|
||||
|
||||
private PortAudio.PaHostApiInfo _apiInfo;
|
||||
private PortAudio.PaDeviceInfo _outputDeviceInfo;
|
||||
private static PortAudio.PaHostApiInfo _apiInfo;
|
||||
private static PortAudio.PaDeviceInfo _outputDeviceInfo;
|
||||
private IntPtr _Ptr = new IntPtr(0);
|
||||
|
||||
private Stopwatch _FadeTimer = new Stopwatch();
|
||||
@@ -446,7 +448,6 @@ namespace Vocaluxe.Lib.Sound
|
||||
|
||||
public PortAudioStream()
|
||||
{
|
||||
_Initialized = false;
|
||||
_SyncTimer = new CSyncTimer(0f, 1f, 0.02f);
|
||||
_DecoderThread = new Thread(Execute);
|
||||
}
|
||||
@@ -578,12 +579,18 @@ namespace Vocaluxe.Lib.Sound
|
||||
{
|
||||
Paused = false;
|
||||
_pauseStreamAfterFade = false;
|
||||
errorCheck("StartStream", PortAudio.Pa_StartStream(_Ptr));
|
||||
lock (_Mutex)
|
||||
{
|
||||
errorCheck("StartStream", PortAudio.Pa_StartStream(_Ptr));
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
errorCheck("StartStream", PortAudio.Pa_StopStream(_Ptr));
|
||||
lock (_Mutex)
|
||||
{
|
||||
errorCheck("StopStream (playback)", PortAudio.Pa_StopStream(_Ptr));
|
||||
}
|
||||
Skip(0f);
|
||||
}
|
||||
|
||||
@@ -609,17 +616,23 @@ namespace Vocaluxe.Lib.Sound
|
||||
|
||||
try
|
||||
{
|
||||
if (errorCheck("Initialize", PortAudio.Pa_Initialize()))
|
||||
return -1;
|
||||
lock (_Mutex)
|
||||
{
|
||||
if (!_Initialized)
|
||||
{
|
||||
if (errorCheck("Initialize", PortAudio.Pa_Initialize()))
|
||||
return -1;
|
||||
_Initialized = true;
|
||||
|
||||
_Initialized = true;
|
||||
int hostApi = apiSelect();
|
||||
_apiInfo = PortAudio.Pa_GetHostApiInfo(hostApi);
|
||||
_outputDeviceInfo = PortAudio.Pa_GetDeviceInfo(_apiInfo.defaultOutputDevice);
|
||||
_paStreamCallback = new PortAudio.PaStreamCallbackDelegate(_PaStreamCallback);
|
||||
int hostApi = apiSelect();
|
||||
_apiInfo = PortAudio.Pa_GetHostApiInfo(hostApi);
|
||||
_outputDeviceInfo = PortAudio.Pa_GetDeviceInfo(_apiInfo.defaultOutputDevice);
|
||||
if (_outputDeviceInfo.defaultLowOutputLatency < 0.1)
|
||||
_outputDeviceInfo.defaultLowOutputLatency = 0.1;
|
||||
}
|
||||
}
|
||||
|
||||
if (_outputDeviceInfo.defaultLowOutputLatency < 0.1)
|
||||
_outputDeviceInfo.defaultLowOutputLatency = 0.1;
|
||||
_paStreamCallback = new PortAudio.PaStreamCallbackDelegate(_PaStreamCallback);
|
||||
}
|
||||
|
||||
catch (Exception)
|
||||
@@ -634,6 +647,9 @@ namespace Vocaluxe.Lib.Sound
|
||||
_Duration = _Decoder.GetLength();
|
||||
|
||||
FormatInfo format = _Decoder.GetFormatInfo();
|
||||
if (format.SamplesPerSecond == 0)
|
||||
return -1;
|
||||
|
||||
_ByteCount = 2 * format.ChannelCount;
|
||||
_BytesPerSecond = format.SamplesPerSecond * _ByteCount;
|
||||
_CurrentTime = 0f;
|
||||
@@ -650,20 +666,24 @@ namespace Vocaluxe.Lib.Sound
|
||||
outputParams.suggestedLatency = _outputDeviceInfo.defaultLowOutputLatency;
|
||||
|
||||
uint bufsize = (uint)CConfig.AudioBufferSize;
|
||||
errorCheck("OpenDefaultStream (playback)", PortAudio.Pa_OpenStream(
|
||||
out _Ptr,
|
||||
IntPtr.Zero,
|
||||
ref outputParams,
|
||||
format.SamplesPerSecond,
|
||||
bufsize,
|
||||
PortAudio.PaStreamFlags.paNoFlag,
|
||||
_paStreamCallback,
|
||||
data));
|
||||
lock (_Mutex)
|
||||
{
|
||||
errorCheck("OpenDefaultStream (playback)", PortAudio.Pa_OpenStream(
|
||||
out _Ptr,
|
||||
IntPtr.Zero,
|
||||
ref outputParams,
|
||||
format.SamplesPerSecond,
|
||||
bufsize,
|
||||
PortAudio.PaStreamFlags.paNoFlag,
|
||||
_paStreamCallback,
|
||||
data));
|
||||
}
|
||||
|
||||
stream.handle = _Ptr.ToInt32();
|
||||
|
||||
if (stream.handle != 0)
|
||||
{
|
||||
_NumStreams++;
|
||||
_Paused = true;
|
||||
_waiting = true;
|
||||
_FileOpened = true;
|
||||
@@ -808,7 +828,15 @@ namespace Vocaluxe.Lib.Sound
|
||||
if (_Initialized)
|
||||
{
|
||||
Stop();
|
||||
PortAudio.Pa_Terminate();
|
||||
_NumStreams--;
|
||||
if (_NumStreams == 0)
|
||||
{
|
||||
lock (_Mutex)
|
||||
{
|
||||
PortAudio.Pa_Terminate();
|
||||
_Initialized = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_Closeproc(_StreamID);
|
||||
|
||||
Reference in new issue
Block a user