PaError CloseAudioStream( PABLIO_Stream *aStream ) { PaError err; int bytesEmpty; int byteSize = aStream->outFIFO.bufferSize; /* If we are writing data, make sure we play everything written. */ if( byteSize > 0 ) { bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO ); while( bytesEmpty < byteSize ) { NPa_Sleep( 10 ); /* MSP */ bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO ); } } err = Pa_StopStream( aStream->stream ); if( err != paNoError ) goto error; err = Pa_CloseStream( aStream->stream ); if( err != paNoError ) goto error; Pa_Terminate(); error: PABLIO_TermFIFO( &aStream->inFIFO ); PABLIO_TermFIFO( &aStream->outFIFO ); free( aStream ); return err; }
PaError CloseAudioStream(PABLIO_Stream * aStream) { int bytesEmpty; int byteSize; int c = 0; if (aStream->has_out) { for (c = 0; c < aStream->channelCount; c++) { byteSize = aStream->outFIFOs[c].bufferSize; /* If we are writing data, make sure we play everything written. */ if (byteSize > 0) { bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFOs[c]); while (bytesEmpty < byteSize) { Pa_Sleep(10); bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFOs[c]); } } } } if (aStream->do_dual) { if (aStream->has_in && aStream->istream) { if (Pa_IsStreamActive(aStream->istream)) { Pa_StopStream(aStream->istream); } Pa_CloseStream(aStream->istream); aStream->istream = NULL; } if (aStream->has_out && aStream->ostream) { if (Pa_IsStreamActive(aStream->ostream)) { Pa_StopStream(aStream->ostream); } Pa_CloseStream(aStream->ostream); aStream->ostream = NULL; } } else { if (aStream->iostream) { if (Pa_IsStreamActive(aStream->iostream)) { Pa_StopStream(aStream->iostream); } Pa_CloseStream(aStream->iostream); aStream->iostream = NULL; } } if (aStream->has_in) { for (c = 0; c < aStream->channelCount; c++) { PABLIO_TermFIFO(&aStream->inFIFOs[c]); } } if (aStream->has_out) { for (c = 0; c < aStream->channelCount; c++) { PABLIO_TermFIFO(&aStream->outFIFOs[c]); } } free(aStream); switch_yield(500000); return paNoError; }