pa_linux_alsa: fix Mutex problem

This patch was written by Chris Brannon.
https://lists.columbia.edu/pipermail/portaudio/2016-October/000902.html

A discussion of the problem is here:
https://lists.columbia.edu/pipermail/portaudio/2016-October/000895.html

It is related to a patch for ticket #251
This commit is contained in:
Phil Burk 2016-10-25 08:33:00 -07:00
commit b3077642aa

View file

@ -3236,14 +3236,20 @@ static PaError AlsaRestart( PaAlsaStream *stream )
{
PaError result = paNoError;
PA_ENSURE( PaUnixMutex_Lock( &stream->stateMtx ) );
/* If in callback mode, the only thread calling this function
* should be the callback thread, in which case there's no need
* to lock the mutex. */
if( !stream->callbackMode )
PA_ENSURE( PaUnixMutex_Lock( &stream->stateMtx ) );
PA_ENSURE( AlsaStop( stream, 0 ) );
PA_ENSURE( AlsaStart( stream, 0 ) );
PA_DEBUG(( "%s: Restarted audio\n", __FUNCTION__ ));
error:
PA_ENSURE( PaUnixMutex_Unlock( &stream->stateMtx ) );
if( !stream->callbackMode )
PA_ENSURE( PaUnixMutex_Unlock( &stream->stateMtx ) );
return result;
}
@ -4224,9 +4230,18 @@ static void *CallbackThreadFunc( void *userData )
else
{
PA_ENSURE( PaUnixThread_PrepareNotify( &stream->thread ) );
#ifdef PTHREAD_CANCELED
/* Need to re-disable cancelability because of PaUnixMutex_* calls. */
pthread_testcancel();
pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, NULL );
#endif
/* Buffer will be zeroed */
PA_ENSURE( AlsaStart( stream, 0 ) );
PA_ENSURE( PaUnixThread_NotifyParent( &stream->thread ) );
#ifdef PTHREAD_CANCELED
pthread_testcancel();
pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, NULL );
#endif
streamStarted = 1;
}