Пример #1
0
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;
}
Пример #2
0
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;
}