annotate libao2/ao_alsa5.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 91f801a94a59
children d141f1e9cc36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
1 /*
1046
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
2 ao_alsa5 - ALSA-0.5.x output plugin for MPlayer
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
3
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
4 (C) Alex Beregszaszi <alex@naxine.org>
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
5
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
6 Thanks to Arpi for helping me ;)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
7 */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
8
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
9 #include <errno.h>
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
10 #include <sys/asoundlib.h>
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
11
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
12 #include "../config.h"
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
13
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
14 #include "audio_out.h"
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
15 #include "audio_out_internal.h"
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1055
diff changeset
16 #include "afmt.h"
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
17
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
18 extern int verbose;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
19
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
20 static ao_info_t info =
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
21 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
22 "ALSA-0.5.x audio output",
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
23 "alsa5",
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
24 "Alex Beregszaszi <alex@naxine.org>",
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
25 ""
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
26 };
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
27
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
28 LIBAO_EXTERN(alsa5)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
29
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
30 static snd_pcm_t *alsa_handler;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
31 static snd_pcm_format_t alsa_format;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
32 static int alsa_rate = SND_PCM_RATE_CONTINUOUS;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
33
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
34 /* to set/get/query special features/parameters */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
35 static int control(int cmd, int arg)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
36 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
37 return(CONTROL_UNKNOWN);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
38 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
39
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
40 /*
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
41 open & setup audio device
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
42 return: 1=success 0=fail
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
43 */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
44 static int init(int rate_hz, int channels, int format, int flags)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
45 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
46 int err;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
47 int cards = -1;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
48 snd_pcm_channel_params_t params;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
49 snd_pcm_channel_setup_t setup;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
50 snd_pcm_info_t info;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
51 snd_pcm_channel_info_t chninfo;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
52
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
53 printf("alsa-init: requested format: %d Hz, %d channels, %s\n", rate_hz,
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
54 channels, audio_out_format_name(format));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
55
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
56 alsa_handler = NULL;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
57
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
58 if (verbose)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
59 printf("alsa-init: compiled for ALSA-%s (%d)\n", SND_LIB_VERSION_STR,
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
60 SND_LIB_VERSION);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
61
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
62 if ((cards = snd_cards()) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
63 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
64 printf("alsa-init: no soundcards found\n");
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
65 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
66 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
67
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
68 ao_data.format = format;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
69 ao_data.channels = channels - 1;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
70 ao_data.samplerate = rate_hz;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
71 ao_data.bps = ao_data.samplerate*(ao_data.channels+1);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
72 ao_data.outburst = OUTBURST;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
73 ao_data.buffersize = 16384;
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
74
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
75 memset(&alsa_format, 0, sizeof(alsa_format));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
76 switch (format)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
77 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
78 case AFMT_S8:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
79 alsa_format.format = SND_PCM_SFMT_S8;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
80 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
81 case AFMT_U8:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
82 alsa_format.format = SND_PCM_SFMT_U8;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
83 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
84 case AFMT_U16_LE:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
85 alsa_format.format = SND_PCM_SFMT_U16_LE;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
86 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
87 case AFMT_U16_BE:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
88 alsa_format.format = SND_PCM_SFMT_U16_BE;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
89 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
90 case AFMT_S16_LE:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
91 alsa_format.format = SND_PCM_SFMT_S16_LE;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
92 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
93 case AFMT_S16_BE:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
94 alsa_format.format = SND_PCM_SFMT_S16_BE;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
95 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
96 default:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
97 alsa_format.format = SND_PCM_SFMT_MPEG;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
98 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
99 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
100
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
101 switch(alsa_format.format)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
102 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
103 case SND_PCM_SFMT_S16_LE:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
104 case SND_PCM_SFMT_U16_LE:
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
105 ao_data.bps *= 2;
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
106 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
107 case -1:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
108 printf("alsa-init: invalid format (%s) requested - output disabled\n",
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
109 audio_out_format_name(format));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
110 return(0);
1111
a3c3e1de6f02 little -Wall fix
al3x
parents: 1058
diff changeset
111 default:
a3c3e1de6f02 little -Wall fix
al3x
parents: 1058
diff changeset
112 break;
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
113 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
114
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
115 switch(rate_hz)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
116 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
117 case 8000:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
118 alsa_rate = SND_PCM_RATE_8000;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
119 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
120 case 11025:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
121 alsa_rate = SND_PCM_RATE_11025;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
122 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
123 case 16000:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
124 alsa_rate = SND_PCM_RATE_16000;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
125 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
126 case 22050:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
127 alsa_rate = SND_PCM_RATE_22050;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
128 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
129 case 32000:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
130 alsa_rate = SND_PCM_RATE_32000;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
131 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
132 case 44100:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
133 alsa_rate = SND_PCM_RATE_44100;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
134 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
135 case 48000:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
136 alsa_rate = SND_PCM_RATE_48000;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
137 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
138 case 88200:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
139 alsa_rate = SND_PCM_RATE_88200;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
140 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
141 case 96000:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
142 alsa_rate = SND_PCM_RATE_96000;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
143 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
144 case 176400:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
145 alsa_rate = SND_PCM_RATE_176400;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
146 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
147 case 192000:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
148 alsa_rate = SND_PCM_RATE_192000;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
149 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
150 default:
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
151 alsa_rate = SND_PCM_RATE_CONTINUOUS;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
152 break;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
153 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
154
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
155 alsa_format.rate = ao_data.samplerate;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
156 alsa_format.voices = ao_data.channels*2;
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
157 alsa_format.interleave = 1;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
158
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
159 if ((err = snd_pcm_open(&alsa_handler, 0, 0, SND_PCM_OPEN_PLAYBACK)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
160 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
161 printf("alsa-init: playback open error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
162 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
163 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
164
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
165 if ((err = snd_pcm_info(alsa_handler, &info)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
166 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
167 printf("alsa-init: pcm info error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
168 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
169 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
170
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
171 printf("alsa-init: %d soundcard%s found, using: %s\n", cards,
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
172 (cards == 1) ? "" : "s", info.name);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
173
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
174 if (info.flags & SND_PCM_INFO_PLAYBACK)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
175 {
3700
91f801a94a59 memset is more portable than bzero ("BSD"ism)
pl
parents: 3095
diff changeset
176 memset(&chninfo, 0, sizeof(chninfo));
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
177 chninfo.channel = SND_PCM_CHANNEL_PLAYBACK;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
178 if ((err = snd_pcm_channel_info(alsa_handler, &chninfo)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
179 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
180 printf("alsa-init: pcm channel info error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
181 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
182 }
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
183
3087
08947e067d80 compiling under qnx, hope it works on all qnx release :)
alex
parents: 1111
diff changeset
184 #ifndef __QNX__
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
185 if (chninfo.buffer_size)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
186 ao_data.buffersize = chninfo.buffer_size;
3087
08947e067d80 compiling under qnx, hope it works on all qnx release :)
alex
parents: 1111
diff changeset
187 #endif
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
188
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
189 if (verbose)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
190 printf("alsa-init: setting preferred buffer size from driver: %d bytes\n",
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
191 ao_data.buffersize);
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
192 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
193
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
194 memset(&params, 0, sizeof(params));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
195 params.channel = SND_PCM_CHANNEL_PLAYBACK;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
196 params.mode = SND_PCM_MODE_STREAM;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
197 params.format = alsa_format;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
198 params.start_mode = SND_PCM_START_DATA;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
199 params.stop_mode = SND_PCM_STOP_ROLLOVER;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
200 params.buf.stream.queue_size = ao_data.buffersize;
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
201 params.buf.stream.fill = SND_PCM_FILL_NONE;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
202
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
203 if ((err = snd_pcm_channel_params(alsa_handler, &params)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
204 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
205 printf("alsa-init: error setting parameters: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
206 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
207 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
208
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
209 memset(&setup, 0, sizeof(setup));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
210 setup.channel = SND_PCM_CHANNEL_PLAYBACK;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
211 setup.mode = SND_PCM_MODE_STREAM;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
212 setup.format = alsa_format;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
213 setup.buf.stream.queue_size = ao_data.buffersize;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
214 setup.msbits_per_sample = ao_data.bps;
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
215
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
216 if ((err = snd_pcm_channel_setup(alsa_handler, &setup)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
217 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
218 printf("alsa-init: error setting up channel: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
219 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
220 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
221
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
222 if ((err = snd_pcm_channel_prepare(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
223 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
224 printf("alsa-init: channel prepare error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
225 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
226 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
227
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
228 printf("AUDIO: %d Hz/%d channels/%d bps/%d bytes buffer/%s\n",
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
229 ao_data.samplerate, ao_data.channels+1, ao_data.bps, ao_data.buffersize,
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
230 snd_pcm_get_format_name(alsa_format.format));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
231 return(1);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
232 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
233
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
234 /* close audio device */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
235 static void uninit()
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
236 {
1055
50c49c976f23 Added missing declaration of variables 'err'.
bertrand
parents: 1046
diff changeset
237 int err;
50c49c976f23 Added missing declaration of variables 'err'.
bertrand
parents: 1046
diff changeset
238
1046
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
239 if ((err = snd_pcm_playback_drain(alsa_handler)) < 0)
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
240 {
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
241 printf("alsa-uninit: playback drain error: %s\n", snd_strerror(err));
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
242 return;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
243 }
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
244
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
245 if ((err = snd_pcm_channel_flush(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
246 {
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
247 printf("alsa-uninit: playback flush error: %s\n", snd_strerror(err));
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
248 return;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
249 }
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
250
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
251 if ((err = snd_pcm_close(alsa_handler)) < 0)
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
252 {
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
253 printf("alsa-uninit: pcm close error: %s\n", snd_strerror(err));
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
254 return;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
255 }
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
256 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
257
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
258 /* stop playing and empty buffers (for seeking/pause) */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
259 static void reset()
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
260 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
261 int err;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
262
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
263 if ((err = snd_pcm_playback_drain(alsa_handler)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
264 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
265 printf("alsa-reset: playback drain error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
266 return;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
267 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
268
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
269 if ((err = snd_pcm_channel_flush(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
270 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
271 printf("alsa-reset: playback flush error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
272 return;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
273 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
274
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
275 if ((err = snd_pcm_channel_prepare(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
276 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
277 printf("alsa-reset: channel prepare error: %s\n", snd_strerror(err));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
278 return;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
279 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
280 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
281
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
282 /* stop playing, keep buffers (for pause) */
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
283 static void audio_pause()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
284 {
1046
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
285 int err;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
286
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
287 if ((err = snd_pcm_playback_drain(alsa_handler)) < 0)
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
288 {
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
289 printf("alsa-pause: playback drain error: %s\n", snd_strerror(err));
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
290 return;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
291 }
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
292
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
293 if ((err = snd_pcm_channel_flush(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
294 {
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
295 printf("alsa-pause: playback flush error: %s\n", snd_strerror(err));
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
296 return;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
297 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
298 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
299
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
300 /* resume playing, after audio_pause() */
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
301 static void audio_resume()
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
302 {
1055
50c49c976f23 Added missing declaration of variables 'err'.
bertrand
parents: 1046
diff changeset
303 int err;
1046
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
304 if ((err = snd_pcm_channel_prepare(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
305 {
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
306 printf("alsa-resume: channel prepare error: %s\n", snd_strerror(err));
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
307 return;
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
308 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
309 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 996
diff changeset
310
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
311 /*
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
312 plays 'len' bytes of 'data'
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
313 returns: number of bytes played
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
314 */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
315 static int play(void* data, int len, int flags)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
316 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
317 if ((len = snd_pcm_write(alsa_handler, data, len)) != len)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
318 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
319 if (len == -EPIPE) /* underrun? */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
320 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
321 printf("alsa-play: alsa underrun, resetting stream\n");
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
322 if ((len = snd_pcm_channel_prepare(alsa_handler, SND_PCM_CHANNEL_PLAYBACK)) < 0)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
323 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
324 printf("alsa-play: playback prepare error: %s\n", snd_strerror(len));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
325 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
326 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
327 if ((len = snd_pcm_write(alsa_handler, data, len)) != len)
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
328 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
329 printf("alsa-play: write error after reset: %s - giving up\n",
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
330 snd_strerror(len));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
331 return(0);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
332 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
333 return(len); /* 2nd write was ok */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
334 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
335 printf("alsa-play: output error: %s\n", snd_strerror(len));
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
336 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
337 return(len);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
338 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
339
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
340 /* how many byes are free in the buffer */
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
341 static int get_space()
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
342 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
343 snd_pcm_channel_status_t ch_stat;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
344
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
345 ch_stat.channel = SND_PCM_CHANNEL_PLAYBACK;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
346
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
347 if (snd_pcm_channel_status(alsa_handler, &ch_stat) < 0)
1046
59fc1f75e486 audio_pause/resume implementacio es kozmetikai valtoztatasok
al3x
parents: 1038
diff changeset
348 return(0); /* error occured */
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
349 else
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
350 return(ch_stat.free);
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
351 }
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
352
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
353 /* delay in seconds between first and last sample in buffer */
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
354 static float get_delay()
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
355 {
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
356 snd_pcm_channel_status_t ch_stat;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
357
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
358 ch_stat.channel = SND_PCM_CHANNEL_PLAYBACK;
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
359
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
360 if (snd_pcm_channel_status(alsa_handler, &ch_stat) < 0)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
361 return((float)ao_data.buffersize/(float)ao_data.bps); /* error occured */
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
362 else
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 3087
diff changeset
363 return((float)ch_stat.count/(float)ao_data.bps);
996
a97eb50a2c3b initial alsa support by al3x
pontscho
parents:
diff changeset
364 }