espeak-1.45.05-runtime-detection.patch 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. diff -up espeak-1.45.05-source/src/Makefile.runtime-detection espeak-1.45.05-source/src/Makefile
  2. --- espeak-1.45.05-source/src/Makefile.runtime-detection 2011-09-15 14:02:16.601703780 +0200
  3. +++ espeak-1.45.05-source/src/Makefile 2011-09-15 14:02:16.609703969 +0200
  4. @@ -25,12 +25,18 @@ INSTALL = install
  5. LN_SF = /bin/ln -sf
  6. MKDIR = mkdir -p
  7. -AUDIO = portaudio
  8. +AUDIO = runtime
  9. +#AUDIO = portaudio
  10. #AUDIO = portaudio0
  11. #AUDIO = portaudio2
  12. #AUDIO = pulseaudio
  13. #AUDIO = sada
  14. +ifeq ($(AUDIO),runtime)
  15. +WAVE=wave.cpp wave_pulse.cpp
  16. +LIB_AUDIO=-lpulse -lpulse-simple -lportaudio
  17. +USE_AUDIO=-DUSE_PULSEAUDIO -DUSE_PORTAUDIO
  18. +else
  19. ifeq ($(AUDIO),pulseaudio)
  20. WAVE=wave_pulse.cpp
  21. LIB_AUDIO=-lpulse
  22. @@ -61,6 +68,7 @@ endif
  23. endif
  24. endif
  25. endif
  26. +endif
  27. speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \
  28. readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \
  29. diff -up espeak-1.45.05-source/src/wave.cpp.runtime-detection espeak-1.45.05-source/src/wave.cpp
  30. --- espeak-1.45.05-source/src/wave.cpp.runtime-detection 2011-08-11 23:38:05.000000000 +0200
  31. +++ espeak-1.45.05-source/src/wave.cpp 2011-09-15 14:02:16.603703826 +0200
  32. @@ -53,6 +53,145 @@ enum {ONE_BILLION=1000000000};
  33. #endif
  34. +#ifdef USE_PULSEAUDIO
  35. +// create some wrappers for runtime detection
  36. +
  37. +// checked on wave_init
  38. +static int pulse_running;
  39. +
  40. +// wave.cpp (this file)
  41. +void wave_port_init(int);
  42. +void* wave_port_open(const char* the_api);
  43. +size_t wave_port_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize);
  44. +int wave_port_close(void* theHandler);
  45. +int wave_port_is_busy(void* theHandler);
  46. +void wave_port_terminate();
  47. +uint32_t wave_port_get_read_position(void* theHandler);
  48. +uint32_t wave_port_get_write_position(void* theHandler);
  49. +void wave_port_flush(void* theHandler);
  50. +void wave_port_set_callback_is_output_enabled(t_wave_callback* cb);
  51. +void* wave_port_test_get_write_buffer();
  52. +int wave_port_get_remaining_time(uint32_t sample, uint32_t* time);
  53. +
  54. +// wave_pulse.cpp
  55. +int is_pulse_running();
  56. +void wave_pulse_init(int);
  57. +void* wave_pulse_open(const char* the_api);
  58. +size_t wave_pulse_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize);
  59. +int wave_pulse_close(void* theHandler);
  60. +int wave_pulse_is_busy(void* theHandler);
  61. +void wave_pulse_terminate();
  62. +uint32_t wave_pulse_get_read_position(void* theHandler);
  63. +uint32_t wave_pulse_get_write_position(void* theHandler);
  64. +void wave_pulse_flush(void* theHandler);
  65. +void wave_pulse_set_callback_is_output_enabled(t_wave_callback* cb);
  66. +void* wave_pulse_test_get_write_buffer();
  67. +int wave_pulse_get_remaining_time(uint32_t sample, uint32_t* time);
  68. +
  69. +// wrappers
  70. +void wave_init(int srate) {
  71. + pulse_running = is_pulse_running();
  72. +
  73. + if (pulse_running)
  74. + wave_pulse_init(srate);
  75. + else
  76. + wave_port_init(srate);
  77. +}
  78. +
  79. +void* wave_open(const char* the_api) {
  80. + if (pulse_running)
  81. + return wave_pulse_open(the_api);
  82. + else
  83. + return wave_port_open(the_api);
  84. +}
  85. +
  86. +size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {
  87. + if (pulse_running)
  88. + return wave_pulse_write(theHandler, theMono16BitsWaveBuffer, theSize);
  89. + else
  90. + return wave_port_write(theHandler, theMono16BitsWaveBuffer, theSize);
  91. +}
  92. +
  93. +int wave_close(void* theHandler) {
  94. + if (pulse_running)
  95. + return wave_pulse_close(theHandler);
  96. + else
  97. + return wave_port_close(theHandler);
  98. +}
  99. +
  100. +int wave_is_busy(void* theHandler) {
  101. + if (pulse_running)
  102. + return wave_pulse_is_busy(theHandler);
  103. + else
  104. + return wave_port_is_busy(theHandler);
  105. +}
  106. +
  107. +void wave_terminate() {
  108. + if (pulse_running)
  109. + wave_pulse_terminate();
  110. + else
  111. + wave_port_terminate();
  112. +}
  113. +
  114. +uint32_t wave_get_read_position(void* theHandler) {
  115. + if (pulse_running)
  116. + return wave_pulse_get_read_position(theHandler);
  117. + else
  118. + return wave_port_get_read_position(theHandler);
  119. +}
  120. +
  121. +uint32_t wave_get_write_position(void* theHandler) {
  122. + if (pulse_running)
  123. + return wave_pulse_get_write_position(theHandler);
  124. + else
  125. + return wave_port_get_write_position(theHandler);
  126. +}
  127. +
  128. +void wave_flush(void* theHandler) {
  129. + if (pulse_running)
  130. + wave_pulse_flush(theHandler);
  131. + else
  132. + wave_port_flush(theHandler);
  133. +}
  134. +
  135. +void wave_set_callback_is_output_enabled(t_wave_callback* cb) {
  136. + if (pulse_running)
  137. + wave_pulse_set_callback_is_output_enabled(cb);
  138. + else
  139. + wave_port_set_callback_is_output_enabled(cb);
  140. +}
  141. +
  142. +void* wave_test_get_write_buffer() {
  143. + if (pulse_running)
  144. + return wave_pulse_test_get_write_buffer();
  145. + else
  146. + return wave_port_test_get_write_buffer();
  147. +}
  148. +
  149. +int wave_get_remaining_time(uint32_t sample, uint32_t* time)
  150. +{
  151. + if (pulse_running)
  152. + return wave_pulse_get_remaining_time(sample, time);
  153. + else
  154. + return wave_port_get_remaining_time(sample, time);
  155. +}
  156. +
  157. +// rename functions to be wrapped
  158. +#define wave_init wave_port_init
  159. +#define wave_open wave_port_open
  160. +#define wave_write wave_port_write
  161. +#define wave_close wave_port_close
  162. +#define wave_is_busy wave_port_is_busy
  163. +#define wave_terminate wave_port_terminate
  164. +#define wave_get_read_position wave_port_get_read_position
  165. +#define wave_get_write_position wave_port_get_write_position
  166. +#define wave_flush wave_port_flush
  167. +#define wave_set_callback_is_output_enabled wave_port_set_callback_is_output_enabled
  168. +#define wave_test_get_write_buffer wave_port_test_get_write_buffer
  169. +#define wave_get_remaining_time wave_port_get_remaining_time
  170. +#endif
  171. +
  172. +
  173. static t_wave_callback* my_callback_is_output_enabled=NULL;
  174. #define N_WAV_BUF 10
  175. diff -up espeak-1.45.05-source/src/wave_pulse.cpp.runtime-detection espeak-1.45.05-source/src/wave_pulse.cpp
  176. --- espeak-1.45.05-source/src/wave_pulse.cpp.runtime-detection 2011-08-11 23:38:05.000000000 +0200
  177. +++ espeak-1.45.05-source/src/wave_pulse.cpp 2011-09-15 14:24:42.662695100 +0200
  178. @@ -65,6 +65,7 @@ enum {
  179. static t_wave_callback* my_callback_is_output_enabled=NULL;
  180. +#define SAMPLE_RATE 22050
  181. #define ESPEAK_FORMAT PA_SAMPLE_S16LE
  182. #define ESPEAK_CHANNEL 1
  183. @@ -74,6 +75,39 @@ static t_wave_callback* my_callback_is_o
  184. #define MINREQ 880
  185. #define FRAGSIZE 0
  186. +#ifdef USE_PORTAUDIO
  187. +// rename functions to be wrapped
  188. +#define wave_init wave_pulse_init
  189. +#define wave_open wave_pulse_open
  190. +#define wave_write wave_pulse_write
  191. +#define wave_close wave_pulse_close
  192. +#define wave_is_busy wave_pulse_is_busy
  193. +#define wave_terminate wave_pulse_terminate
  194. +#define wave_get_read_position wave_pulse_get_read_position
  195. +#define wave_get_write_position wave_pulse_get_write_position
  196. +#define wave_flush wave_pulse_flush
  197. +#define wave_set_callback_is_output_enabled wave_pulse_set_callback_is_output_enabled
  198. +#define wave_test_get_write_buffer wave_pulse_test_get_write_buffer
  199. +#define wave_get_remaining_time wave_pulse_get_remaining_time
  200. +
  201. +// check whether we can connect to PulseAudio
  202. +#include <pulse/simple.h>
  203. +int is_pulse_running()
  204. +{
  205. + pa_sample_spec ss;
  206. + ss.format = ESPEAK_FORMAT;
  207. + ss.rate = SAMPLE_RATE;
  208. + ss.channels = ESPEAK_CHANNEL;
  209. +
  210. + pa_simple *s = pa_simple_new(NULL, "eSpeak", PA_STREAM_PLAYBACK, NULL, "is_pulse_running", &ss, NULL, NULL, NULL);
  211. + if (s) {
  212. + pa_simple_free(s);
  213. + return 1;
  214. + } else
  215. + return 0;
  216. +}
  217. +#endif
  218. +
  219. static pthread_mutex_t pulse_mutex;
  220. static pa_context *context = NULL;
  221. @@ -843,8 +877,9 @@ int wave_get_remaining_time(uint32_t sam
  222. return 0;
  223. }
  224. -#endif // of USE_PORTAUDIO
  225. +#endif // of USE_PULSEAUDIO
  226. +#ifndef USE_PORTAUDIO
  227. //>
  228. //<clock_gettime2, add_time_in_ms
  229. @@ -878,6 +913,7 @@ void add_time_in_ms(struct timespec *ts,
  230. }
  231. ts->tv_nsec = (long int)t_ns;
  232. }
  233. +#endif
  234. #endif // USE_ASYNC