File espeak-audio-runtime-detection.patch of Package espeak
diff -ur espeak-1.42.04-source/src/Makefile espeak-1.42.04-runtime-detection/src/Makefile
--- espeak-1.42.04-source/src/Makefile 2009-11-26 01:11:54.000000000 +0100
+++ espeak-1.42.04-runtime-detection/src/Makefile 2009-12-17 17:08:57.000000000 +0100
@@ -24,10 +24,16 @@
LN_SF = /bin/ln -sf
MKDIR = mkdir -p
-AUDIO = portaudio
+AUDIO = runtime
+#AUDIO = portaudio
#AUDIO = pulseaudio
#AUDIO = sada
+ifeq ($(AUDIO),runtime)
+WAVE=wave.cpp wave_pulse.cpp
+LIB_AUDIO=-lpulse -lpulse-simple -lportaudio
+USE_AUDIO=-DUSE_PULSEAUDIO -DUSE_PORTAUDIO
+else
ifeq ($(AUDIO),pulseaudio)
WAVE=wave_pulse.cpp
LIB_AUDIO=-lpulse
@@ -46,6 +52,7 @@
endif
endif
endif
+endif
speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \
readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \
diff -ur espeak-1.42.04-source/src/wave.cpp espeak-1.42.04-runtime-detection/src/wave.cpp
--- espeak-1.42.04-source/src/wave.cpp 2009-12-09 18:48:13.000000000 +0100
+++ espeak-1.42.04-runtime-detection/src/wave.cpp 2009-12-17 16:30:14.000000000 +0100
@@ -53,6 +53,145 @@
#endif
+#ifdef USE_PULSEAUDIO
+// create some wrappers for runtime detection
+
+// checked on wave_init
+static int pulse_running;
+
+// wave.cpp (this file)
+void wave_port_init();
+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();
+void wave_pulse_init();
+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
+void wave_init() {
+ pulse_running = is_pulse_running();
+
+ if (pulse_running)
+ wave_pulse_init();
+ else
+ wave_port_init();
+}
+
+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
+
+
static t_wave_callback* my_callback_is_output_enabled=NULL;
#define N_WAV_BUF 10
diff -ur espeak-1.42.04-source/src/wave_pulse.cpp espeak-1.42.04-runtime-detection/src/wave_pulse.cpp
--- espeak-1.42.04-source/src/wave_pulse.cpp 2009-12-09 18:48:13.000000000 +0100
+++ espeak-1.42.04-runtime-detection/src/wave_pulse.cpp 2009-12-17 17:11:35.000000000 +0100
@@ -75,6 +75,39 @@
#define MINREQ 880
#define FRAGSIZE 0
+#ifdef USE_PORTAUDIO
+// rename functions to be wrapped
+#define wave_init wave_pulse_init
+#define wave_open wave_pulse_open
+#define wave_write wave_pulse_write
+#define wave_close wave_pulse_close
+#define wave_is_busy wave_pulse_is_busy
+#define wave_terminate wave_pulse_terminate
+#define wave_get_read_position wave_pulse_get_read_position
+#define wave_get_write_position wave_pulse_get_write_position
+#define wave_flush wave_pulse_flush
+#define wave_set_callback_is_output_enabled wave_pulse_set_callback_is_output_enabled
+#define wave_test_get_write_buffer wave_pulse_test_get_write_buffer
+#define wave_get_remaining_time wave_pulse_get_remaining_time
+
+// check whether we can connect to PulseAudio
+#include <pulse/simple.h>
+int is_pulse_running()
+{
+ pa_sample_spec ss;
+ ss.format = ESPEAK_FORMAT;
+ ss.rate = SAMPLE_RATE;
+ ss.channels = ESPEAK_CHANNEL;
+
+ pa_simple *s = pa_simple_new(NULL, "eSpeak", PA_STREAM_PLAYBACK, NULL, "is_pulse_running", &ss, NULL, NULL, NULL);
+ if (s) {
+ pa_simple_free(s);
+ return 1;
+ } else
+ return 0;
+}
+#endif
+
static pthread_mutex_t pulse_mutex;
static pa_context *context = NULL;
@@ -893,8 +926,9 @@
return 0;
}
-#endif // of USE_PORTAUDIO
+#endif // of USE_PULSEAUDIO
+#ifndef USE_PORTAUDIO
//>
//<clock_gettime2, add_time_in_ms
@@ -928,6 +962,7 @@
}
ts->tv_nsec = (long int)t_ns;
}
+#endif
#endif // USE_ASYNC