diff options
Diffstat (limited to 'navit/support/espeak/wave.c')
-rw-r--r--[-rwxr-xr-x] | navit/support/espeak/wave.c | 460 |
1 files changed, 308 insertions, 152 deletions
diff --git a/navit/support/espeak/wave.c b/navit/support/espeak/wave.c index 364dcf577..591283665 100755..100644 --- a/navit/support/espeak/wave.c +++ b/navit/support/espeak/wave.c @@ -32,7 +32,9 @@ #include <time.h> #include "portaudio.h" -#ifndef PLATFORM_WINDOWS +#ifdef PLATFORM_WINDOWS +#include <windows.h> +#else #include <unistd.h> #endif #include "wave.h" @@ -40,6 +42,15 @@ //<Definitions +#ifdef NEED_STRUCT_TIMESPEC +#define HAVE_STRUCT_TIMESPEC 1 +struct timespec { + long tv_sec; + long tv_nsec; +}; +#endif /* HAVE_STRUCT_TIMESPEC */ + + enum {ONE_BILLION=1000000000}; #ifdef USE_PORTAUDIO @@ -53,18 +64,161 @@ enum {ONE_BILLION=1000000000}; #endif + + +#ifdef USE_PULSEAUDIO +// create some wrappers for runtime detection + +// checked on wave_init +static int pulse_running; + +// wave.cpp (this file) +int wave_port_init(int); +void* wave_port_open(const char* the_api); +size_t wave_port_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize); +int wave_port_close(void* theHandler); +int wave_port_is_busy(void* theHandler); +void wave_port_terminate(); +uint32_t wave_port_get_read_position(void* theHandler); +uint32_t wave_port_get_write_position(void* theHandler); +void wave_port_flush(void* theHandler); +void wave_port_set_callback_is_output_enabled(t_wave_callback* cb); +void* wave_port_test_get_write_buffer(); +int wave_port_get_remaining_time(uint32_t sample, uint32_t* time); + +// wave_pulse.cpp +int is_pulse_running(); +int wave_pulse_init(int); +void* wave_pulse_open(const char* the_api); +size_t wave_pulse_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize); +int wave_pulse_close(void* theHandler); +int wave_pulse_is_busy(void* theHandler); +void wave_pulse_terminate(); +uint32_t wave_pulse_get_read_position(void* theHandler); +uint32_t wave_pulse_get_write_position(void* theHandler); +void wave_pulse_flush(void* theHandler); +void wave_pulse_set_callback_is_output_enabled(t_wave_callback* cb); +void* wave_pulse_test_get_write_buffer(); +int wave_pulse_get_remaining_time(uint32_t sample, uint32_t* time); + +// wrappers +int wave_init(int srate) { + pulse_running = is_pulse_running(); + + if (pulse_running) + return wave_pulse_init(srate); + else + return wave_port_init(srate); +} + +void* wave_open(const char* the_api) { + if (pulse_running) + return wave_pulse_open(the_api); + else + return wave_port_open(the_api); +} + +size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) { + if (pulse_running) + return wave_pulse_write(theHandler, theMono16BitsWaveBuffer, theSize); + else + return wave_port_write(theHandler, theMono16BitsWaveBuffer, theSize); +} + +int wave_close(void* theHandler) { + if (pulse_running) + return wave_pulse_close(theHandler); + else + return wave_port_close(theHandler); +} + +int wave_is_busy(void* theHandler) { + if (pulse_running) + return wave_pulse_is_busy(theHandler); + else + return wave_port_is_busy(theHandler); +} + +void wave_terminate() { + if (pulse_running) + wave_pulse_terminate(); + else + wave_port_terminate(); +} + +uint32_t wave_get_read_position(void* theHandler) { + if (pulse_running) + return wave_pulse_get_read_position(theHandler); + else + return wave_port_get_read_position(theHandler); +} + +uint32_t wave_get_write_position(void* theHandler) { + if (pulse_running) + return wave_pulse_get_write_position(theHandler); + else + return wave_port_get_write_position(theHandler); +} + +void wave_flush(void* theHandler) { + if (pulse_running) + wave_pulse_flush(theHandler); + else + wave_port_flush(theHandler); +} + +void wave_set_callback_is_output_enabled(t_wave_callback* cb) { + if (pulse_running) + wave_pulse_set_callback_is_output_enabled(cb); + else + wave_port_set_callback_is_output_enabled(cb); +} + +void* wave_test_get_write_buffer() { + if (pulse_running) + return wave_pulse_test_get_write_buffer(); + else + return wave_port_test_get_write_buffer(); +} + +int wave_get_remaining_time(uint32_t sample, uint32_t* time) +{ + if (pulse_running) + return wave_pulse_get_remaining_time(sample, time); + else + return wave_port_get_remaining_time(sample, time); +} + +// rename functions to be wrapped +#define wave_init wave_port_init +#define wave_open wave_port_open +#define wave_write wave_port_write +#define wave_close wave_port_close +#define wave_is_busy wave_port_is_busy +#define wave_terminate wave_port_terminate +#define wave_get_read_position wave_port_get_read_position +#define wave_get_write_position wave_port_get_write_position +#define wave_flush wave_port_flush +#define wave_set_callback_is_output_enabled wave_port_set_callback_is_output_enabled +#define wave_test_get_write_buffer wave_port_test_get_write_buffer +#define wave_get_remaining_time wave_port_get_remaining_time + +#endif // USE_PULSEAUDIO + + static t_wave_callback* my_callback_is_output_enabled=NULL; #define N_WAV_BUF 10 -#define SAMPLE_RATE 22050 +#define MAX_SAMPLE_RATE 22050 #define FRAMES_PER_BUFFER 512 -#define BUFFER_LENGTH (SAMPLE_RATE*2*sizeof(uint16_t)) -#define THRESHOLD (BUFFER_LENGTH/5) +#define BUFFER_LENGTH (MAX_SAMPLE_RATE*2*sizeof(uint16_t)) +//#define THRESHOLD (BUFFER_LENGTH/5) static char myBuffer[BUFFER_LENGTH]; -static char* myRead=NULL; -static char* myWrite=NULL; +static char* myRead=NULL; +static char* myWrite=NULL; static int out_channels=1; static int my_stream_could_start=0; +static int wave_samplerate; static int mInCallbackFinishedState = false; #if (USE_PORTAUDIO == 18) @@ -80,7 +234,7 @@ static PaError pa_init_err=0; // time measurement // The read and write position audio stream in the audio stream are measured in ms. -// +// // * When the stream is opened, myReadPosition and myWritePosition are cleared. // * myWritePosition is updated in wave_write. // * myReadPosition is updated in pa_callback (+ sample delay). @@ -132,12 +286,12 @@ static void start_stream() PaError err; SHOW_TIME("start_stream"); - my_stream_could_start=0; + my_stream_could_start=0; mInCallbackFinishedState = false; err = Pa_StartStream(pa_stream); SHOW("start_stream > Pa_StartStream=%d (%s)\n", err, Pa_GetErrorText(err)); - + #if USE_PORTAUDIO == 19 if(err == paStreamIsNotStopped) { @@ -168,89 +322,89 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, PaStreamCallbackFlags flags, void *userData ) #endif { - int aResult=0; // paContinue - char* aWrite = myWrite; - size_t n = out_channels*sizeof(uint16_t)*framesPerBuffer; + int aResult=0; // paContinue + char* aWrite = myWrite; + size_t n = out_channels*sizeof(uint16_t)*framesPerBuffer; - myReadPosition += framesPerBuffer; - SHOW("pa_callback > myReadPosition=%u, framesPerBuffer=%lu (n=0x%x) \n",(int)myReadPosition, framesPerBuffer, n); + myReadPosition += framesPerBuffer; + SHOW("pa_callback > myReadPosition=%u, framesPerBuffer=%lu (n=0x%x) \n",(int)myReadPosition, framesPerBuffer, n); - if (aWrite >= myRead) - { - if((size_t)(aWrite - myRead) >= n) - { - memcpy(outputBuffer, myRead, n); - myRead += n; - } - else + if (aWrite >= myRead) { - SHOW_TIME("pa_callback > underflow"); - aResult=1; // paComplete; - mInCallbackFinishedState = true; - size_t aUsedMem=0; - aUsedMem = (size_t)(aWrite - myRead); - if (aUsedMem) - { - memcpy(outputBuffer, myRead, aUsedMem); - } - char* p = (char*)outputBuffer + aUsedMem; - memset(p, 0, n - aUsedMem); - // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); - myRead = aWrite; - } - } - else // myRead > aWrite - { - if ((size_t)(myBuffer + BUFFER_LENGTH - myRead) >= n) - { - memcpy(outputBuffer, myRead, n); - myRead += n; + if((size_t)(aWrite - myRead) >= n) + { + memcpy(outputBuffer, myRead, n); + myRead += n; + } + else + { + SHOW_TIME("pa_callback > underflow"); + aResult=1; // paComplete; + mInCallbackFinishedState = true; + size_t aUsedMem=0; + aUsedMem = (size_t)(aWrite - myRead); + if (aUsedMem) + { + memcpy(outputBuffer, myRead, aUsedMem); + } + char* p = (char*)outputBuffer + aUsedMem; + memset(p, 0, n - aUsedMem); + // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); + myRead = aWrite; + } } - else if ((size_t)(aWrite + BUFFER_LENGTH - myRead) >= n) + else // myRead > aWrite { - int aTopMem = myBuffer + BUFFER_LENGTH - myRead; - if (aTopMem) - { - SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); - memcpy(outputBuffer, myRead, aTopMem); - } - int aRest = n - aTopMem; - if (aRest) - { - SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); - char* p = (char*)outputBuffer + aTopMem; - memcpy(p, myBuffer, aRest); - } - myRead = myBuffer + aRest; - } - else - { - SHOW_TIME("pa_callback > underflow"); - aResult=1; // paComplete; - - int aTopMem = myBuffer + BUFFER_LENGTH - myRead; - if (aTopMem) - { - SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); - memcpy(outputBuffer, myRead, aTopMem); - } - int aRest = aWrite - myBuffer; - if (aRest) - { - SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); - char* p = (char*)outputBuffer + aTopMem; - memcpy(p, myBuffer, aRest); - } - - size_t aUsedMem = aTopMem + aRest; - char* p = (char*)outputBuffer + aUsedMem; - memset(p, 0, n - aUsedMem); - // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); - myRead = aWrite; + if ((size_t)(myBuffer + BUFFER_LENGTH - myRead) >= n) + { + memcpy(outputBuffer, myRead, n); + myRead += n; + } + else if ((size_t)(aWrite + BUFFER_LENGTH - myRead) >= n) + { + int aTopMem = myBuffer + BUFFER_LENGTH - myRead; + if (aTopMem) + { + SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); + memcpy(outputBuffer, myRead, aTopMem); + } + int aRest = n - aTopMem; + if (aRest) + { + SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); + char* p = (char*)outputBuffer + aTopMem; + memcpy(p, myBuffer, aRest); + } + myRead = myBuffer + aRest; + } + else + { + SHOW_TIME("pa_callback > underflow"); + aResult=1; // paComplete; + + int aTopMem = myBuffer + BUFFER_LENGTH - myRead; + if (aTopMem) + { + SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); + memcpy(outputBuffer, myRead, aTopMem); + } + int aRest = aWrite - myBuffer; + if (aRest) + { + SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); + char* p = (char*)outputBuffer + aTopMem; + memcpy(p, myBuffer, aRest); + } + + size_t aUsedMem = aTopMem + aRest; + char* p = (char*)outputBuffer + aUsedMem; + memset(p, 0, n - aUsedMem); + // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); + myRead = aWrite; + } } - } - SHOW("pa_callback > myRead=%x\n",(int)myRead); + SHOW("pa_callback > myRead=%x\n",(int)myRead); // #if USE_PORTAUDIO == 18 @@ -288,7 +442,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, #endif - return(aResult); + return(aResult); //#endif } // end of WaveCallBack @@ -335,7 +489,7 @@ static int wave_open_sound() out_channels = 1; #if USE_PORTAUDIO == 18 - // err = Pa_OpenDefaultStream(&pa_stream,0,1,paInt16,SAMPLE_RATE,FRAMES_PER_BUFFER,N_WAV_BUF,pa_callback,(void *)userdata); + // err = Pa_OpenDefaultStream(&pa_stream,0,1,paInt16,wave_samplerate,FRAMES_PER_BUFFER,N_WAV_BUF,pa_callback,(void *)userdata); PaDeviceID playbackDevice = Pa_GetDefaultOutputDeviceID(); @@ -351,12 +505,12 @@ static int wave_open_sound() paInt16, NULL, /* general parameters */ - SAMPLE_RATE, FRAMES_PER_BUFFER, 0, + wave_samplerate, FRAMES_PER_BUFFER, 0, //paClipOff | paDitherOff, paNoFlag, pa_callback, (void *)userdata); - - SHOW("wave_open_sound > Pa_OpenDefaultStream(1): err=%d (%s)\n",err, Pa_GetErrorText(err)); + + SHOW("wave_open_sound > Pa_OpenDefaultStream(1): err=%d (%s)\n",err, Pa_GetErrorText(err)); if(err == paInvalidChannelCount) { @@ -376,12 +530,12 @@ static int wave_open_sound() paInt16, NULL, /* general parameters */ - SAMPLE_RATE, FRAMES_PER_BUFFER, 0, + wave_samplerate, FRAMES_PER_BUFFER, 0, //paClipOff | paDitherOff, paNoFlag, pa_callback, (void *)userdata); // err = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16, -// SAMPLE_RATE, +// wave_samplerate, // FRAMES_PER_BUFFER, // N_WAV_BUF,pa_callback,(void *)userdata); SHOW("wave_open_sound > Pa_OpenDefaultStream(2): err=%d (%s)\n",err, Pa_GetErrorText(err)); @@ -395,13 +549,13 @@ static int wave_open_sound() &pa_stream, NULL, /* no input */ &myOutputParameters, - SAMPLE_RATE, + wave_samplerate, framesPerBuffer, paNoFlag, // paClipOff | paDitherOff, pa_callback, (void *)userdata); - if ((err!=paNoError) + if ((err!=paNoError) && (err!=paInvalidChannelCount)) //err==paUnanticipatedHostError { fprintf(stderr, "wave_open_sound > Pa_OpenStream : err=%d (%s)\n",err,Pa_GetErrorText(err)); @@ -410,7 +564,7 @@ static int wave_open_sound() &pa_stream, NULL, /* no input */ &myOutputParameters, - SAMPLE_RATE, + wave_samplerate, framesPerBuffer, paNoFlag, // paClipOff | paDitherOff, @@ -427,14 +581,14 @@ static int wave_open_sound() &pa_stream, NULL, /* no input */ &myOutputParameters, - SAMPLE_RATE, + wave_samplerate, framesPerBuffer, paNoFlag, // paClipOff | paDitherOff, pa_callback, (void *)userdata); - // err = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16,(double)SAMPLE_RATE,FRAMES_PER_BUFFER,pa_callback,(void *)userdata); + // err = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16,(double)wave_samplerate,FRAMES_PER_BUFFER,pa_callback,(void *)userdata); } mInCallbackFinishedState = false; #endif @@ -457,13 +611,13 @@ static void update_output_parameters(int selectedDevice, const PaDeviceInfo *dev myOutputParameters.channelCount = 1; myOutputParameters.sampleFormat = paInt16; - // Latency greater than 100ms for avoiding glitches + // Latency greater than 100ms for avoiding glitches // (e.g. when moving a window in a graphical desktop) // deviceInfo = Pa_GetDeviceInfo(selectedDevice); if (deviceInfo) { double aLatency = deviceInfo->defaultLowOutputLatency; - double aCoeff = round(0.100 / aLatency); +// double aCoeff = round(0.100 / aLatency); // myOutputParameters.suggestedLatency = aCoeff * aLatency; // to avoid glitches ? myOutputParameters.suggestedLatency = aLatency; // for faster response ? SHOW("Device=%d, myOutputParameters.suggestedLatency=%f, aCoeff=%f\n", @@ -511,40 +665,40 @@ static void select_device(const char* the_api) for( i=0; i<numDevices; i++ ) { deviceInfo = Pa_GetDeviceInfo( i ); - + if (deviceInfo == NULL) { break; } const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi ); - + if (hostInfo && hostInfo->type == paALSA) - { + { // Check (once) the default output device if (defaultAlsaIndex == numDevices) { defaultAlsaIndex = hostInfo->defaultOutputDevice; const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo( defaultAlsaIndex ); update_output_parameters(defaultAlsaIndex, deviceInfo); - if (Pa_IsFormatSupported(NULL, &myOutputParameters, SAMPLE_RATE) == 0) + if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) { - SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); + SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); selectedIndex = defaultAlsaIndex; selectedDeviceInfo = deviceInfo; break; } } - - // if the default output device does not match, - // look for the device with the highest number of output channels + + // if the default output device does not match, + // look for the device with the highest number of output channels SHOW( "select_device > ALSA, i=%d (numDevices=%d)\n", i, numDevices); - + update_output_parameters(i, deviceInfo); - - if (Pa_IsFormatSupported(NULL, &myOutputParameters, SAMPLE_RATE) == 0) + + if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) { SHOW( "select_device > ALSA, name=%s (#%d)\n", deviceInfo->name, i); - + if (!selectedDeviceInfo || (selectedDeviceInfo->maxOutputChannels < deviceInfo->maxOutputChannels)) { @@ -560,14 +714,14 @@ static void select_device(const char* the_api) { update_output_parameters(selectedIndex, selectedDeviceInfo); } - else + else { i = Pa_GetDefaultOutputDevice(); deviceInfo = Pa_GetDeviceInfo( i ); update_output_parameters(i, deviceInfo); } -#endif +#endif } //> @@ -613,12 +767,13 @@ void wave_set_callback_is_output_enabled(t_wave_callback* cb) //<wave_init // TBD: the arg could be "alsa", "oss",... -void wave_init() +int wave_init(int srate) { ENTER("wave_init"); PaError err; pa_stream = NULL; + wave_samplerate = srate; mInCallbackFinishedState = false; init_buffer(); @@ -629,6 +784,7 @@ void wave_init() { SHOW_TIME("wave_init > Failed to initialise the PortAudio sound"); } + return err == paNoError; } //> @@ -653,18 +809,18 @@ void* wave_open(const char* the_api) //<copyBuffer -static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) -{ +static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) +{ size_t bytes_written = 0; unsigned int i = 0; uint16_t* a_dest = NULL; uint16_t* a_src = NULL; - + if ((src != NULL) && dest != NULL) - { + { // copy for one channel (mono)? if(out_channels==1) - { + { SHOW("copyBuffer > 1 channel > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes); memcpy(dest, src, theSizeInBytes); bytes_written = theSizeInBytes; @@ -675,7 +831,7 @@ static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) i = 0; a_dest = (uint16_t* )dest; a_src = (uint16_t* )src; - + for(i=0; i<theSizeInBytes/2; i++) { a_dest[2*i] = a_src[i]; @@ -684,8 +840,8 @@ static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) bytes_written = 2*theSizeInBytes; } // end if(out_channels==1) } // end if ((src != NULL) && dest != NULL) - - return bytes_written; + + return bytes_written; } //> @@ -698,7 +854,7 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz // space in ringbuffer for the sample needed: 1x mono channel but 2x for 1 stereo channel size_t bytes_to_write = (out_channels==1) ? theSize : theSize*2; my_stream_could_start = 0; - + if(pa_stream == NULL) { SHOW_TIME("wave_write > wave_open_sound\n"); @@ -714,16 +870,16 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz my_stream_could_start = 1; } assert(BUFFER_LENGTH >= bytes_to_write); - + if (myWrite >= myBuffer + BUFFER_LENGTH) { myWrite = myBuffer; } // end if (myWrite >= myBuffer + BUFFER_LENGTH) - + size_t aTotalFreeMem=0; char* aRead = myRead; SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); - + while (1) { if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) @@ -731,9 +887,9 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); return 0; } - + aRead = myRead; - + // write pointer is before read pointer? if (myWrite >= aRead) { @@ -743,27 +899,27 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz { aTotalFreeMem = aRead - myWrite; } // end if (myWrite >= aRead) - + if (aTotalFreeMem>1) { // -1 because myWrite must be different of aRead // otherwise buffer would be considered as empty aTotalFreeMem -= 1; } // end if (aTotalFreeMem>1) - + if (aTotalFreeMem >= bytes_to_write) { break; } // end if (aTotalFreeMem >= bytes_to_write) - + //SHOW_TIME("wave_write > wait"); SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem); SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); usleep(10000); } // end while (1) - + aRead = myRead; - + // write pointer is ahead the read pointer? if (myWrite >= aRead) { @@ -800,17 +956,17 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz SHOW_TIME("wave_write > myWrite <= aRead"); myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize); } // end if (myWrite >= aRead) - + bytes_written = bytes_to_write; myWritePosition += theSize/sizeof(uint16_t); // add number of samples - + if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) { start_stream(); } // end if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) - + SHOW_TIME("wave_write > LEAVE"); - + return bytes_written; } @@ -829,7 +985,7 @@ int wave_close(void* theHandler) SHOW_TIME("wave_close > LEAVE (NULL stream)"); return 0; } - + if( Pa_IsStreamStopped( pa_stream ) ) { SHOW_TIME("wave_close > LEAVE (stopped)"); @@ -841,7 +997,7 @@ int wave_close(void* theHandler) SHOW_TIME("wave_close > LEAVE (NULL stream)"); return 0; } - + if( Pa_StreamActive( pa_stream ) == false && mInCallbackFinishedState == false ) { SHOW_TIME("wave_close > LEAVE (not active)"); @@ -857,20 +1013,20 @@ int wave_close(void* theHandler) SHOW_TIME("wave_close > LEAVE (stopStreamCount)"); return 0; } - - // Comment from Audacity-1.2.4b adapted to the eSpeak context. + + // Comment from Audacity-1.2.4b adapted to the eSpeak context. // // We got here in one of two ways: // - // 1. The calling program calls the espeak_Cancel function and we - // therefore want to stop as quickly as possible. + // 1. The calling program calls the espeak_Cancel function and we + // therefore want to stop as quickly as possible. // So we use AbortStream(). If this is // the case the portaudio stream is still in the Running state // (see PortAudio state machine docs). // // 2. The callback told PortAudio to stop the stream since it had - // reached the end of the selection. - // The event polling thread discovered this by noticing that + // reached the end of the selection. + // The event polling thread discovered this by noticing that // wave_is_busy() returned false. // wave_is_busy() (which calls Pa_GetStreamActive()) will not return // false until all buffers have finished playing, so we can call @@ -885,7 +1041,7 @@ int wave_close(void* theHandler) // call StopStream if the callback brought us here, and AbortStream // if the user brought us here. // - + #if (USE_PORTAUDIO == 19) if (pa_stream) { @@ -969,14 +1125,14 @@ int wave_is_busy(void* theHandler) if (pa_stream) { #if USE_PORTAUDIO == 18 - active = Pa_StreamActive(pa_stream) + active = Pa_StreamActive(pa_stream) && (mInCallbackFinishedState == false); #else active = Pa_IsStreamActive(pa_stream) && (mInCallbackFinishedState == false); #endif } - + SHOW("wave_is_busy: %d\n",active); @@ -1015,7 +1171,7 @@ int wave_get_remaining_time(uint32_t sample, uint32_t* time) if (!time || !pa_stream) { - SHOW("event get_remaining_time> %s\n","audio device not available"); + SHOW("event get_remaining_time> %s\n","audio device not available"); return -1; } @@ -1023,7 +1179,7 @@ int wave_get_remaining_time(uint32_t sample, uint32_t* time) { // TBD: take in account time suplied by portaudio V18 API a_time = sample - myReadPosition; - a_time = 0.5 + (a_time * 1000.0) / SAMPLE_RATE; + a_time = 0.5 + (a_time * 1000.0) / wave_samplerate; } else { @@ -1050,7 +1206,7 @@ void *wave_test_get_write_buffer() // notdef USE_PORTAUDIO -void wave_init() {} +int wave_init(int srate) {return 1;} void* wave_open(const char* the_api) {return (void *)1;} size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {return theSize;} int wave_close(void* theHandler) {return 0;} @@ -1101,7 +1257,7 @@ void add_time_in_ms(struct timespec *ts, int time_in_ms) { SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); ts->tv_sec += 1; - t_ns -= ONE_BILLION; + t_ns -= ONE_BILLION; } ts->tv_nsec = (long int)t_ns; } |