From: Bjørn Damstedt Rasmussen Date: Tue, 29 Dec 2020 06:31:58 +0000 (+0100) Subject: Report thread running so Pa_StartStream can return prior to PaStreamCallback X-Git-Tag: v19.7.0~68^2 X-Git-Url: https://andrewgundersen.net/repos?a=commitdiff_plain;h=2d8c7eb0f72931e9ef7847db298ce8a15f40c5a8;p=portaudio Report thread running so Pa_StartStream can return prior to PaStreamCallback StartStream() calls WaitForSingleObject(stream->hThreadStart, 60*1000) but it will not be able to return until X number of PaStreamCallback have been performed by ProcessOutputBuffer(). The above behaviour will cause a deadlock if the user supplied PaStreamCallback tries to access a shared lock currently held by the function calling Pa_StartStream(). Also it's a bit weird that you start receiving PaStreamCallbacks before Pa_StartStream() is able to complete. --- diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index d791b66..1914550 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -5890,6 +5890,12 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) goto thread_error; } + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + // Initialize event & start INPUT stream if (stream->in.clientProc) { @@ -5940,12 +5946,6 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) } - // Signal: stream running - stream->running = TRUE; - - // Notify: thread started - SetEvent(stream->hThreadStart); - // Notify: state NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); @@ -6171,6 +6171,12 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Boost thread priority PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + // Initialize event & start INPUT stream if (stream->in.clientProc) { @@ -6238,12 +6244,6 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) } } - // Signal: stream running - stream->running = TRUE; - - // Notify: thread started - SetEvent(stream->hThreadStart); - // Notify: state NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS);