1 --- flite-1.2-release/src/audio/au_alsa.c.alsa 2001-12-04 21:05:52 +0300
2 +++ flite-1.2-release/src/audio/au_alsa.c 2005-10-31 14:53:35 +0300
7 -#include <sys/asoundlib.h>
8 +#include <alsa/asoundlib.h>
13 -static int alsa_card = 0, alsa_device = 0;
14 +#ifndef CST_AUDIO_ALSA_DEVICE
15 +#define CST_AUDIO_ALSA_DEVICE "default"
18 +#ifdef CST_AUDIO_ALSA_DEBUG
19 +static snd_output_t *sndout;
22 +static int framebits;
24 cst_audiodev *audio_open_alsa(int sps, int channels, cst_audiofmt fmt)
26 - snd_pcm_channel_info_t pinfo;
27 - snd_pcm_channel_params_t params;
28 - snd_pcm_channel_setup_t setup;
31 + snd_pcm_hw_params_t *params;
32 + snd_pcm_format_t format = SND_PCM_FORMAT_S16;
33 + snd_pcm_access_t access = SND_PCM_ACCESS_RW_INTERLEAVED;
34 + unsigned int buffer_time = 500000; /* 0.5 sec */
35 + unsigned int period_time = 100000; /* 0.1 sec */
36 + unsigned int rate = sps;
40 - if (snd_pcm_open_preferred(&pcm,&alsa_card,&alsa_device,SND_PCM_OPEN_PLAYBACK) < 0)
42 - cst_errmsg("alsa_audio: failed to open audio device\n");
45 - if (snd_pcm_plugin_set_disable(pcm,PLUGIN_DISABLE_MMAP) < 0)
47 - cst_errmsg("alsa_audio: failed to disable mmap\n");
52 - if (snd_pcm_open(&pcm,alsa_card,alsa_device,SND_PCM_OPEN_PLAYBACK) < 0)
54 - cst_errmsg("alsa_audio: failed to open audio device\n");
60 - memset(&pinfo, 0, sizeof(pinfo));
61 - memset(¶ms, 0, sizeof(params));
62 - memset(&setup, 0, sizeof(setup));
64 - pinfo.channel = SND_PCM_CHANNEL_PLAYBACK;
65 - snd_pcm_plugin_info(pcm,&pinfo);
67 - params.mode = SND_PCM_MODE_BLOCK;
68 - params.channel = SND_PCM_CHANNEL_PLAYBACK;
69 - params.start_mode = SND_PCM_START_DATA;
70 - params.stop_mode = SND_PCM_STOP_STOP;
72 - params.buf.block.frag_size = pinfo.max_fragment_size;
73 - params.buf.block.frags_max = 1;
74 - params.buf.block.frags_min = 1;
76 - params.format.interleave = 1;
77 - params.format.rate = sps;
78 - params.format.voices = channels;
83 case CST_AUDIO_LINEAR16:
84 - if (CST_LITTLE_ENDIAN)
85 - params.format.format = SND_PCM_SFMT_S16_LE;
87 - params.format.format = SND_PCM_SFMT_S16_BE;
89 + if (CST_LITTLE_ENDIAN)
90 + format = SND_PCM_FORMAT_S16_LE;
92 + format = SND_PCM_FORMAT_S16_BE;
94 case CST_AUDIO_LINEAR8:
95 - params.format.format = SND_PCM_SFMT_U8;
97 + format = SND_PCM_FORMAT_U8;
100 - params.format.format = SND_PCM_SFMT_MU_LAW;
102 + format = SND_PCM_FORMAT_MU_LAW;
105 + cst_errmsg("alsa_audio: unexpected format requested\n");
108 - if((err = snd_pcm_plugin_params(pcm,¶ms)) < 0)
110 - cst_errmsg("alsa_audio params setting failed: %s\n",snd_strerror(err));
111 - snd_pcm_close(pcm);
114 - if((err = snd_pcm_plugin_setup(pcm,SND_PCM_CHANNEL_PLAYBACK)) > 0) {
115 - cst_errmsg("alsa_audio sound prepare setting failed: %s\n",snd_strerror(err));
116 - snd_pcm_close(pcm);
119 - if((err = snd_pcm_plugin_prepare(pcm,SND_PCM_CHANNEL_PLAYBACK)) > 0) {
120 - cst_errmsg("alsa_audio sound prepare setting failed: %s\n",snd_strerror(err));
121 - snd_pcm_close(pcm);
124 +#ifdef CST_AUDIO_ALSA_DEBUG
125 + if (0 > (err = snd_output_stdio_attach(&sndout, stderr, 0))) {
126 + cst_errmsg("alsa_audio: failed to open log\n");
132 - pinfo.channel = SND_PCM_CHANNEL_PLAYBACK;
133 - snd_pcm_plugin_info(pcm,&pinfo);
134 + if (0 > (err = snd_pcm_open(&pcm, CST_AUDIO_ALSA_DEVICE, SND_PCM_STREAM_PLAYBACK, 0))) {
135 + cst_errmsg("alsa_audio: failed to open audio device: %s\n", snd_strerror(err));
140 + snd_pcm_hw_params_alloca(¶ms);
142 + if ((err = snd_pcm_hw_params_any(pcm, params)) < 0) {
143 + cst_errmsg("alsa_audio: failed to get configuration: %s\n", snd_strerror(err));
147 + if ((err = snd_pcm_hw_params_set_access(pcm, params, access)) < 0) {
148 + cst_errmsg("alsa_audio: failed to set access type: %s\n", snd_strerror(err));
152 + if (0 > (err = snd_pcm_hw_params_set_format (pcm, params, format))) {
153 + cst_errmsg("alsa_audio: failed to set sample format: %s\n", snd_strerror(err));
157 + if (0 > (err = snd_pcm_hw_params_set_channels(pcm, params, channels))) {
158 + cst_errmsg("alsa_audio: failed to set channels count %d: %s\n", channels, snd_strerror(err));
162 + if (0 > (err = snd_pcm_hw_params_set_rate(pcm, params, rate, 0))) {
163 + cst_errmsg("alsa_audio: failed to set sample rate: %s\n", snd_strerror(err));
167 + if (0 > (err = snd_pcm_hw_params_set_buffer_time_near(pcm, params, &buffer_time, NULL))) {
168 + cst_errmsg("alsa_audio: failed to set buffer time: %s\n", snd_strerror(err));
172 + if (0 > (err = snd_pcm_hw_params_set_period_time_near(pcm, params, &period_time, NULL))) {
173 + cst_errmsg("alsa_audio: failed to set period time: %s\n", snd_strerror(err));
177 + if (0 > (err = snd_pcm_hw_params(pcm, params))) {
178 + cst_errmsg("alsa_audio: failed to set hw params: %s\n", snd_strerror(err));
183 + if (0 > (err = snd_pcm_hw_params_get_sbits(params))) {
184 + cst_errmsg("alsa_audio: failed to get sbits: %s\n", snd_strerror(err));
188 + framebits = err * channels;
190 +#ifdef CST_AUDIO_ALSA_DEBUG
191 + snd_pcm_hw_params_dump(params, sndout);
194 ad = cst_alloc(cst_audiodev, 1);
195 ad->platform_data = pcm;
197 ad->fmt = ad->real_fmt = fmt;
203 +#ifdef CST_AUDIO_ALSA_DEBUG
204 + snd_pcm_hw_params_dump(params, sndout);
206 + snd_pcm_close(pcm);
212 int audio_close_alsa(cst_audiodev *ad)
216 pcm = ad->platform_data;
217 - snd_pcm_plugin_flush(pcm,0);
222 @@ -166,21 +195,35 @@
223 int audio_write_alsa(cst_audiodev *ad, void *samples, int num_bytes)
225 snd_pcm_t *pcm = ad->platform_data;
226 + snd_pcm_uframes_t nframes = (num_bytes << 3) / framebits;
229 - return snd_pcm_plugin_write(pcm,samples,num_bytes);
230 + while (nframes > 0) {
231 + if (0 > (err = snd_pcm_writei(pcm, samples, nframes))) {
232 + if (err == -EAGAIN) continue;
233 + if (err == -EPIPE) {
234 + if (snd_pcm_prepare(pcm) < 0) return 0;
239 + samples += (err * framebits) >> 3;
246 int audio_flush_alsa(cst_audiodev *ad)
248 snd_pcm_t *pcm = ad->platform_data;
250 - return snd_pcm_plugin_flush(pcm,0);
251 + return snd_pcm_drop(pcm);
254 int audio_drain_alsa(cst_audiodev *ad)
256 snd_pcm_t *pcm = ad->platform_data;
258 - return snd_pcm_plugin_playback_drain(pcm);
259 + return snd_pcm_drain(pcm);
262 --- flite-1.2-release/configure.in.alsa 2003-02-18 03:45:45 +0300
263 +++ flite-1.2-release/configure.in 2005-10-31 14:50:54 +0300
265 AC_CHECK_HEADER(sys/audioio.h,
267 AUDIODEFS=-DCST_AUDIO_SUNOS])
268 -AC_CHECK_HEADER(sys/asoundlib.h,
269 +AC_CHECK_HEADER(alsa/asoundlib.h,
271 - AUDIODEFS=-DCST_AUDIO_ALSA])
272 + AUDIODEFS=-DCST_AUDIO_ALSA
273 + AUDIOLIBS=-lasound])
274 AC_CHECK_HEADER(mmsystem.h,
276 AUDIODEFS=-DCST_AUDIO_WINCE