This call was used to update the written sample count used by wave_get_remaining_time. As that function has been removed, this code is no longer needed.master
return a_wave_can_be_played == 0; // 1 = stop synthesis, -1 = error | return a_wave_can_be_played == 0; // 1 = stop synthesis, -1 = error | ||||
} | } | ||||
static int create_events(short *outbuf, int length, espeak_EVENT *event_list, uint32_t the_write_pos) | |||||
static int create_events(short *outbuf, int length, espeak_EVENT *event_list) | |||||
{ | { | ||||
int finished; | int finished; | ||||
int i = 0; | int i = 0; | ||||
espeak_EVENT *event; | espeak_EVENT *event; | ||||
if (event_list_ix == 0) | if (event_list_ix == 0) | ||||
event = NULL; | event = NULL; | ||||
else { | |||||
else | |||||
event = event_list + i; | event = event_list + i; | ||||
event->sample += the_write_pos; | |||||
} | |||||
finished = dispatch_audio((short *)outbuf, length, event); | finished = dispatch_audio((short *)outbuf, length, event); | ||||
length = 0; // the wave data are played once. | length = 0; // the wave data are played once. | ||||
i++; | i++; | ||||
int length; | int length; | ||||
int finished = 0; | int finished = 0; | ||||
int count_buffers = 0; | int count_buffers = 0; | ||||
uint32_t a_write_pos = 0; | |||||
if ((outbuf == NULL) || (event_list == NULL)) | if ((outbuf == NULL) || (event_list == NULL)) | ||||
return ENS_NOT_INITIALIZED; | return ENS_NOT_INITIALIZED; | ||||
count_samples = 0; | count_samples = 0; | ||||
if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) | |||||
a_write_pos = wave_get_write_position(my_audio); | |||||
if (translator == NULL) | if (translator == NULL) | ||||
espeak_SetVoiceByName("default"); | espeak_SetVoiceByName("default"); | ||||
count_buffers++; | count_buffers++; | ||||
if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | ||||
finished = create_events((short *)outbuf, length, event_list, a_write_pos); | |||||
finished = create_events((short *)outbuf, length, event_list); | |||||
if (finished < 0) | if (finished < 0) | ||||
return ENS_AUDIO_ERROR; | return ENS_AUDIO_ERROR; | ||||
} else if (synth_callback) | } else if (synth_callback) |
int wave_port_close(void *theHandler); | int wave_port_close(void *theHandler); | ||||
int wave_port_is_busy(void *theHandler); | int wave_port_is_busy(void *theHandler); | ||||
void wave_port_terminate(); | void wave_port_terminate(); | ||||
uint32_t wave_port_get_write_position(void *theHandler); | |||||
void wave_port_flush(void *theHandler); | void wave_port_flush(void *theHandler); | ||||
void wave_port_set_callback_is_output_enabled(t_wave_callback *cb); | void wave_port_set_callback_is_output_enabled(t_wave_callback *cb); | ||||
void *wave_port_test_get_write_buffer(); | void *wave_port_test_get_write_buffer(); | ||||
int wave_pulse_close(void *theHandler); | int wave_pulse_close(void *theHandler); | ||||
int wave_pulse_is_busy(void *theHandler); | int wave_pulse_is_busy(void *theHandler); | ||||
void wave_pulse_terminate(); | void wave_pulse_terminate(); | ||||
uint32_t wave_pulse_get_write_position(void *theHandler); | |||||
void wave_pulse_flush(void *theHandler); | void wave_pulse_flush(void *theHandler); | ||||
void wave_pulse_set_callback_is_output_enabled(t_wave_callback *cb); | void wave_pulse_set_callback_is_output_enabled(t_wave_callback *cb); | ||||
void *wave_pulse_test_get_write_buffer(); | void *wave_pulse_test_get_write_buffer(); | ||||
wave_port_terminate(); | wave_port_terminate(); | ||||
} | } | ||||
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) | void wave_flush(void *theHandler) | ||||
{ | { | ||||
if (pulse_running) | if (pulse_running) | ||||
#define wave_close wave_port_close | #define wave_close wave_port_close | ||||
#define wave_is_busy wave_port_is_busy | #define wave_is_busy wave_port_is_busy | ||||
#define wave_terminate wave_port_terminate | #define wave_terminate wave_port_terminate | ||||
#define wave_get_write_position wave_port_get_write_position | |||||
#define wave_flush wave_port_flush | #define wave_flush wave_port_flush | ||||
#define wave_set_callback_is_output_enabled wave_port_set_callback_is_output_enabled | #define wave_set_callback_is_output_enabled wave_port_set_callback_is_output_enabled | ||||
Pa_Terminate(); | Pa_Terminate(); | ||||
} | } | ||||
uint32_t wave_get_write_position(void *theHandler) | |||||
{ | |||||
(void)theHandler; // unused | |||||
return myWritePosition; | |||||
} | |||||
#else | #else | ||||
void *wave_open(int srate, const char *device) | void *wave_open(int srate, const char *device) | ||||
{ | { | ||||
} | } | ||||
uint32_t wave_get_write_position(void *theHandler) | |||||
{ | |||||
(void)theHandler; // unused | |||||
return 0; | |||||
} | |||||
void wave_flush(void *theHandler) | void wave_flush(void *theHandler) | ||||
{ | { | ||||
(void)theHandler; // unused | (void)theHandler; // unused |
extern void wave_flush(void *theHandler); | extern void wave_flush(void *theHandler); | ||||
extern int wave_is_busy(void *theHandler); | extern int wave_is_busy(void *theHandler); | ||||
extern void wave_terminate(); | extern void wave_terminate(); | ||||
extern uint32_t wave_get_write_position(void *theHandler); | |||||
// set the callback which informs if the output is still enabled. | // set the callback which informs if the output is still enabled. | ||||
// Helpful if a new sample is waiting for free space whereas sound must be stopped. | // Helpful if a new sample is waiting for free space whereas sound must be stopped. |
#define wave_close wave_pulse_close | #define wave_close wave_pulse_close | ||||
#define wave_is_busy wave_pulse_is_busy | #define wave_is_busy wave_pulse_is_busy | ||||
#define wave_terminate wave_pulse_terminate | #define wave_terminate wave_pulse_terminate | ||||
#define wave_get_write_position wave_pulse_get_write_position | |||||
#define wave_flush wave_pulse_flush | #define wave_flush wave_pulse_flush | ||||
#define wave_set_callback_is_output_enabled wave_pulse_set_callback_is_output_enabled | #define wave_set_callback_is_output_enabled wave_pulse_set_callback_is_output_enabled | ||||
pthread_mutex_destroy(a_mutex); | pthread_mutex_destroy(a_mutex); | ||||
} | } | ||||
uint32_t wave_get_write_position(void *theHandler) | |||||
{ | |||||
(void)theHandler; // unused | |||||
pa_timing_info a_timing_info = {0}; | |||||
pulse_playing(&a_timing_info); | |||||
return a_timing_info.write_index; | |||||
} | |||||
#endif | #endif |
my_callback_is_output_enabled = cb; | my_callback_is_output_enabled = cb; | ||||
} | } | ||||
// wave_get_write_position | |||||
// | |||||
// DESCRIPTION: | |||||
// | |||||
// Returns an identifier for a new sample, where 'sample' is a small | |||||
// buffer of synthesized wave data, identified so that the user | |||||
// callback could be called when the 'sample' is really played. This | |||||
// implementation views the audio as one long continuous stream of | |||||
// 16-bit samples. | |||||
// | |||||
// PARAMETERS: | |||||
// | |||||
// theHandler: the audio device file descriptor | |||||
// | |||||
// GLOBALS USED/MODIFIED: | |||||
// | |||||
// total_samples_sent: used as the return value | |||||
// | |||||
// RETURNS: | |||||
// | |||||
// total_samples_sent, which is the index for the end of this long | |||||
// continuous stream. [[[WDW: with a unit32_t managing 16-bit | |||||
// samples at 22050Hz, we have about 54 hours of play time before | |||||
// the index wraps back to 0. We don't handle that wrapping, so | |||||
// the behavior after 54 hours of play time is undefined.]]] | |||||
// | |||||
uint32_t wave_get_write_position(void *theHandler) | |||||
{ | |||||
(void)theHandler; // unused | |||||
return total_samples_sent; | |||||
} | |||||
// wave_get_remaining_time | // wave_get_remaining_time | ||||
// | // | ||||
// DESCRIPTION: | // DESCRIPTION: |