annotate libao2/ao_alsa.c @ 24427:50159082a80b

Check wLongsPerEntry before using it. This fixes a potential crash for some values of it. As a side effect it works around broken callocs with an integer overflow vulnerability, but using MPlayer on such systems should never be assumed to be safe!
author reimar
date Thu, 13 Sep 2007 15:18:57 +0000
parents 68dceb30bbcf
children 2c238fa777ff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
2 ao_alsa9/1.x - ALSA-0.9.x-1.x output plugin for MPlayer
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
3
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
4 (C) Alex Beregszaszi
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
5
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
6 modified for real alsa-0.9.0-support by Zsolt Barat <joy@streamminister.de>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
7 additional AC3 passthrough support by Andy Lo A Foe <andy@alsaplayer.org>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
8 08/22/2002 iec958-init rewritten and merged with common init, zsolt
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
9 04/13/2004 merged with ao_alsa1.x, fixes provided by Jindrich Makovicka
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
10 04/25/2004 printfs converted to mp_msg, Zsolt.
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
11
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
12 Any bugreports regarding to this driver are welcome.
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
13 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
14
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
15 #include <errno.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
16 #include <sys/time.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
17 #include <stdlib.h>
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
18 #include <stdarg.h>
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
19 #include <ctype.h>
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
20 #include <math.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
21 #include <string.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
22
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
23 #include "config.h"
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
24 #include "subopt-helper.h"
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
25 #include "mixer.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
26 #include "mp_msg.h"
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
27 #include "help_mp.h"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
28
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
29 #define ALSA_PCM_NEW_HW_PARAMS_API
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
30 #define ALSA_PCM_NEW_SW_PARAMS_API
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
31
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
32 #if HAVE_SYS_ASOUNDLIB_H
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
33 #include <sys/asoundlib.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
34 #elif HAVE_ALSA_ASOUNDLIB_H
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
35 #include <alsa/asoundlib.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
36 #else
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
37 #error "asoundlib.h is not in sys/ or alsa/ - please bugreport"
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
38 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
39
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
40
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
41 #include "audio_out.h"
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
42 #include "audio_out_internal.h"
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
43 #include "libaf/af_format.h"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
44
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
45 static ao_info_t info =
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
46 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
47 "ALSA-0.9.x-1.x audio output",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
48 "alsa",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
49 "Alex Beregszaszi, Zsolt Barat <joy@streamminister.de>",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
50 "under developement"
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
51 };
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
52
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
53 LIBAO_EXTERN(alsa)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
54
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
55 static snd_pcm_t *alsa_handler;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
56 static snd_pcm_format_t alsa_format;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
57 static snd_pcm_hw_params_t *alsa_hwparams;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
58 static snd_pcm_sw_params_t *alsa_swparams;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
59
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
60 /* 16 sets buffersize to 16 * chunksize is as default 1024
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
61 * which seems to be good avarge for most situations
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
62 * so buffersize is 16384 frames by default */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
63 static int alsa_fragcount = 16;
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
64 static snd_pcm_uframes_t chunk_size = 1024;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
65
17619
9b619133f11a Using non-blocking writes makes sense when the program wants to do other
cladisch
parents: 17618
diff changeset
66 static size_t bytes_per_sample;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
67
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
68 static int ao_noblock = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
69
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
70 static int open_mode;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
71 static int alsa_can_pause = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
72
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
73 #define ALSA_DEVICE_SIZE 256
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
74
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
75 #undef BUFFERTIME
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
76 #define SET_CHUNKSIZE
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
77
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
78 static void alsa_error_handler(const char *file, int line, const char *function,
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
79 int err, const char *format, ...)
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
80 {
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
81 char tmp[0xc00];
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
82 va_list va;
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
83
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
84 va_start(va, format);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
85 vsnprintf(tmp, sizeof tmp, format, va);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
86 va_end(va);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
87 tmp[sizeof tmp - 1] = '\0';
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
88
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
89 if (err)
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
90 mp_msg(MSGT_AO, MSGL_ERR, "[AO_ALSA] alsa-lib: %s:%i:(%s) %s: %s\n",
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
91 file, line, function, tmp, snd_strerror(err));
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
92 else
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
93 mp_msg(MSGT_AO, MSGL_ERR, "[AO_ALSA] alsa-lib: %s:%i:(%s) %s\n",
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
94 file, line, function, tmp);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
95 }
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
96
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
97 /* to set/get/query special features/parameters */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
98 static int control(int cmd, void *arg)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
99 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
100 switch(cmd) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
101 case AOCONTROL_QUERY_FORMAT:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
102 return CONTROL_TRUE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
103 case AOCONTROL_GET_VOLUME:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
104 case AOCONTROL_SET_VOLUME:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
105 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
106 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
107
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
108 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
109 snd_mixer_t *handle;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
110 snd_mixer_elem_t *elem;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
111 snd_mixer_selem_id_t *sid;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
112
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
113 static char *mix_name = "PCM";
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
114 static char *card = "default";
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
115 static int mix_index = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
116
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
117 long pmin, pmax;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
118 long get_vol, set_vol;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
119 float f_multi;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
120
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
121 if(mixer_channel) {
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
122 char *test_mix_index;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
123
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
124 mix_name = strdup(mixer_channel);
17097
rathann
parents: 16309
diff changeset
125 if ((test_mix_index = strchr(mix_name, ','))){
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
126 *test_mix_index = 0;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
127 test_mix_index++;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
128 mix_index = strtol(test_mix_index, &test_mix_index, 0);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
129
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
130 if (*test_mix_index){
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
131 mp_msg(MSGT_AO,MSGL_ERR,
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
132 MSGTR_AO_ALSA_InvalidMixerIndexDefaultingToZero);
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
133 mix_index = 0 ;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
134 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
135 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
136 }
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
137 if(mixer_device) card = mixer_device;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
138
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
139 if(ao_data.format == AF_FORMAT_AC3)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
140 return CONTROL_TRUE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
141
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
142 //allocate simple id
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
143 snd_mixer_selem_id_alloca(&sid);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
144
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
145 //sets simple-mixer index and name
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
146 snd_mixer_selem_id_set_index(sid, mix_index);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
147 snd_mixer_selem_id_set_name(sid, mix_name);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
148
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
149 if (mixer_channel) {
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
150 free(mix_name);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
151 mix_name = NULL;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
152 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
153
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
154 if ((err = snd_mixer_open(&handle, 0)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
155 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_MixerOpenError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
156 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
157 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
158
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
159 if ((err = snd_mixer_attach(handle, card)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
160 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_MixerAttachError,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
161 card, snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
162 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
163 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
164 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
165
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
166 if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
167 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_MixerRegisterError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
168 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
169 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
170 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
171 err = snd_mixer_load(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
172 if (err < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
173 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_MixerLoadError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
174 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
175 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
176 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
177
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
178 elem = snd_mixer_find_selem(handle, sid);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
179 if (!elem) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
180 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToFindSimpleControl,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
181 snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
182 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
183 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
184 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
185
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
186 snd_mixer_selem_get_playback_volume_range(elem,&pmin,&pmax);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
187 f_multi = (100 / (float)(pmax - pmin));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
188
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
189 if (cmd == AOCONTROL_SET_VOLUME) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
190
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
191 set_vol = vol->left / f_multi + pmin + 0.5;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
192
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
193 //setting channels
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
194 if ((err = snd_mixer_selem_set_playback_volume(elem, 0, set_vol)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
195 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_ErrorSettingLeftChannel,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
196 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
197 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
198 }
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
199 mp_msg(MSGT_AO,MSGL_DBG2,"left=%li, ", set_vol);
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
200
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
201 set_vol = vol->right / f_multi + pmin + 0.5;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
202
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
203 if ((err = snd_mixer_selem_set_playback_volume(elem, 1, set_vol)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
204 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_ErrorSettingRightChannel,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
205 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
206 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
207 }
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
208 mp_msg(MSGT_AO,MSGL_DBG2,"right=%li, pmin=%li, pmax=%li, mult=%f\n",
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
209 set_vol, pmin, pmax, f_multi);
17194
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
210
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
211 if (snd_mixer_selem_has_playback_switch(elem)) {
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
212 int lmute = (vol->left == 0.0);
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
213 int rmute = (vol->right == 0.0);
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
214 if (snd_mixer_selem_has_playback_switch_joined(elem)) {
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
215 lmute = rmute = lmute && rmute;
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
216 } else {
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
217 snd_mixer_selem_set_playback_switch(elem, SND_MIXER_SCHN_FRONT_RIGHT, !rmute);
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
218 }
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
219 snd_mixer_selem_set_playback_switch(elem, SND_MIXER_SCHN_FRONT_LEFT, !lmute);
cd527e59d128 use snd_mixer_selem_set_playback_switch when muting ALSA, patch by Matthias Lederhofer <matled -at- gmx dot net>
wanderer
parents: 17097
diff changeset
220 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
221 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
222 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
223 snd_mixer_selem_get_playback_volume(elem, 0, &get_vol);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
224 vol->left = (get_vol - pmin) * f_multi;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
225 snd_mixer_selem_get_playback_volume(elem, 1, &get_vol);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
226 vol->right = (get_vol - pmin) * f_multi;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
227
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
228 mp_msg(MSGT_AO,MSGL_DBG2,"left=%f, right=%f\n",vol->left,vol->right);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
229 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
230 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
231 return CONTROL_OK;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
232 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
233
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
234 } //end switch
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
235 return(CONTROL_UNKNOWN);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
236 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
237
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
238 static void parse_device (char *dest, const char *src, int len)
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
239 {
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
240 char *tmp;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
241 memmove(dest, src, len);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
242 dest[len] = 0;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
243 while ((tmp = strrchr(dest, '.')))
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
244 tmp[0] = ',';
12919
aba44b58dea7 Use = instead if # in ALSA device name, as # irritates our config-parser.
reimar
parents: 12819
diff changeset
245 while ((tmp = strrchr(dest, '=')))
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
246 tmp[0] = ':';
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
247 }
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
248
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
249 static void print_help (void)
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
250 {
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
251 mp_msg (MSGT_AO, MSGL_FATAL,
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
252 MSGTR_AO_ALSA_CommandlineHelp);
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
253 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
254
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
255 static int str_maxlen(strarg_t *str) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
256 if (str->len > ALSA_DEVICE_SIZE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
257 return 0;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
258 return 1;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
259 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
260
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
261 static int try_open_device(const char *device, int open_mode, int try_ac3)
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
262 {
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
263 int err, len;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
264 char *ac3_device, *args;
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
265
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
266 if (try_ac3) {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
267 /* to set the non-audio bit, use AES0=6 */
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
268 len = strlen(device);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
269 ac3_device = malloc(len + 7 + 1);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
270 if (!ac3_device)
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
271 return -ENOMEM;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
272 strcpy(ac3_device, device);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
273 args = strchr(ac3_device, ':');
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
274 if (!args) {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
275 /* no existing parameters: add it behind device name */
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
276 strcat(ac3_device, ":AES0=6");
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
277 } else {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
278 do
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
279 ++args;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
280 while (isspace(*args));
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
281 if (*args == '\0') {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
282 /* ":" but no parameters */
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
283 strcat(ac3_device, "AES0=6");
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
284 } else if (*args != '{') {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
285 /* a simple list of parameters: add it at the end of the list */
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
286 strcat(ac3_device, ",AES0=6");
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
287 } else {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
288 /* parameters in config syntax: add it inside the { } block */
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
289 do
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
290 --len;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
291 while (len > 0 && isspace(ac3_device[len]));
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
292 if (ac3_device[len] == '}')
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
293 strcpy(ac3_device + len, " AES0=6}");
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
294 }
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
295 }
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
296 err = snd_pcm_open(&alsa_handler, ac3_device, SND_PCM_STREAM_PLAYBACK,
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
297 open_mode);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
298 free(ac3_device);
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
299 }
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
300 if (!try_ac3 || err < 0)
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
301 err = snd_pcm_open(&alsa_handler, device, SND_PCM_STREAM_PLAYBACK,
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
302 open_mode);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
303 return err;
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
304 }
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
305
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
306 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
307 open & setup audio device
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
308 return: 1=success 0=fail
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
309 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
310 static int init(int rate_hz, int channels, int format, int flags)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
311 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
312 int err;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
313 int block;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
314 strarg_t device;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
315 snd_pcm_uframes_t bufsize;
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
316 snd_pcm_uframes_t boundary;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
317 opt_t subopts[] = {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
318 {"block", OPT_ARG_BOOL, &block, NULL},
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
319 {"device", OPT_ARG_STR, &device, (opt_test_f)str_maxlen},
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
320 {NULL}
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
321 };
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
322
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
323 char alsa_device[ALSA_DEVICE_SIZE + 1];
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
324 // make sure alsa_device is null-terminated even when using strncpy etc.
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
325 memset(alsa_device, 0, ALSA_DEVICE_SIZE + 1);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
326
14249
8f59f661f317 hopefully final fix
alex
parents: 14245
diff changeset
327 mp_msg(MSGT_AO,MSGL_V,"alsa-init: requested format: %d Hz, %d channels, %x\n", rate_hz,
8f59f661f317 hopefully final fix
alex
parents: 14245
diff changeset
328 channels, format);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
329 alsa_handler = NULL;
17690
9ca95aee8449 Show the actual ALSA version instead of the version mplayer was compiled
cladisch
parents: 17621
diff changeset
330 #if SND_LIB_VERSION >= 0x010005
9ca95aee8449 Show the actual ALSA version instead of the version mplayer was compiled
cladisch
parents: 17621
diff changeset
331 mp_msg(MSGT_AO,MSGL_V,"alsa-init: using ALSA %s\n", snd_asoundlib_version());
9ca95aee8449 Show the actual ALSA version instead of the version mplayer was compiled
cladisch
parents: 17621
diff changeset
332 #else
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
333 mp_msg(MSGT_AO,MSGL_V,"alsa-init: compiled for ALSA-%s\n", SND_LIB_VERSION_STR);
17690
9ca95aee8449 Show the actual ALSA version instead of the version mplayer was compiled
cladisch
parents: 17621
diff changeset
334 #endif
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
335
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
336 snd_lib_error_set_handler(alsa_error_handler);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
337
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
338 ao_data.samplerate = rate_hz;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
339 ao_data.format = format;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
340 ao_data.channels = channels;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
341
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
342 switch (format)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
343 {
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
344 case AF_FORMAT_S8:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
345 alsa_format = SND_PCM_FORMAT_S8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
346 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
347 case AF_FORMAT_U8:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
348 alsa_format = SND_PCM_FORMAT_U8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
349 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
350 case AF_FORMAT_U16_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
351 alsa_format = SND_PCM_FORMAT_U16_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
352 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
353 case AF_FORMAT_U16_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
354 alsa_format = SND_PCM_FORMAT_U16_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
355 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
356 #ifndef WORDS_BIGENDIAN
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
357 case AF_FORMAT_AC3:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
358 #endif
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
359 case AF_FORMAT_S16_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
360 alsa_format = SND_PCM_FORMAT_S16_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
361 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
362 #ifdef WORDS_BIGENDIAN
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
363 case AF_FORMAT_AC3:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
364 #endif
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
365 case AF_FORMAT_S16_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
366 alsa_format = SND_PCM_FORMAT_S16_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
367 break;
17571
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
368 case AF_FORMAT_U32_LE:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
369 alsa_format = SND_PCM_FORMAT_U32_LE;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
370 break;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
371 case AF_FORMAT_U32_BE:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
372 alsa_format = SND_PCM_FORMAT_U32_BE;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
373 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
374 case AF_FORMAT_S32_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
375 alsa_format = SND_PCM_FORMAT_S32_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
376 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
377 case AF_FORMAT_S32_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
378 alsa_format = SND_PCM_FORMAT_S32_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
379 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
380 case AF_FORMAT_FLOAT_LE:
12570
148f3c98a041 additional formats - 8bit & float
henry
parents: 12465
diff changeset
381 alsa_format = SND_PCM_FORMAT_FLOAT_LE;
148f3c98a041 additional formats - 8bit & float
henry
parents: 12465
diff changeset
382 break;
17571
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
383 case AF_FORMAT_FLOAT_BE:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
384 alsa_format = SND_PCM_FORMAT_FLOAT_BE;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
385 break;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
386 case AF_FORMAT_MU_LAW:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
387 alsa_format = SND_PCM_FORMAT_MU_LAW;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
388 break;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
389 case AF_FORMAT_A_LAW:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
390 alsa_format = SND_PCM_FORMAT_A_LAW;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
391 break;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
392
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
393 default:
14251
89c1422b367b maybe now..
alex
parents: 14249
diff changeset
394 alsa_format = SND_PCM_FORMAT_MPEG; //? default should be -1
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
395 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
396 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
397
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
398 //subdevice parsing
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
399 // set defaults
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
400 block = 1;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
401 /* switch for spdif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
402 * sets opening sequence for SPDIF
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
403 * sets also the playback and other switches 'on the fly'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
404 * while opening the abstract alias for the spdif subdevice
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
405 * 'iec958'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
406 */
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
407 if (format == AF_FORMAT_AC3) {
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
408 device.str = "iec958";
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
409 mp_msg(MSGT_AO,MSGL_V,"alsa-spdif-init: playing AC3, %i channels\n", channels);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
410 }
13661
07dc40f25068 Only use S/PDIF output when no other alsa device is set, allows to use
reimar
parents: 13434
diff changeset
411 else
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
412 /* in any case for multichannel playback we should select
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
413 * appropriate device
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
414 */
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
415 switch (channels) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
416 case 1:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
417 case 2:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
418 device.str = "default";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
419 mp_msg(MSGT_AO,MSGL_V,"alsa-init: setup for 1/2 channel(s)\n");
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
420 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
421 case 4:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
422 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
423 // hack - use the converter plugin
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
424 device.str = "plug:surround40";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
425 else
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
426 device.str = "surround40";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
427 mp_msg(MSGT_AO,MSGL_V,"alsa-init: device set to surround40\n");
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
428 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
429 case 6:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
430 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
431 device.str = "plug:surround51";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
432 else
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
433 device.str = "surround51";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
434 mp_msg(MSGT_AO,MSGL_V,"alsa-init: device set to surround51\n");
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
435 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
436 default:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
437 device.str = "default";
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
438 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_ChannelsNotSupported,channels);
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
439 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
440 device.len = strlen(device.str);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
441 if (subopt_parse(ao_subdevice, subopts) != 0) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
442 print_help();
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
443 return 0;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
444 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
445 ao_noblock = !block;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
446 parse_device(alsa_device, device.str, device.len);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
447
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 20020
diff changeset
448 mp_msg(MSGT_AO,MSGL_V,"alsa-init: using device %s\n", alsa_device);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
449
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
450 //setting modes for block or nonblock-mode
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
451 if (ao_noblock) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
452 open_mode = SND_PCM_NONBLOCK;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
453 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
454 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
455 open_mode = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
456 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
457
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
458 //sets buff/chunksize if its set manually
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
459 if (ao_data.buffersize) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
460 switch (ao_data.buffersize)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
461 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
462 case 1:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
463 alsa_fragcount = 16;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
464 chunk_size = 512;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
465 mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 8192\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
466 mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 512\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
467 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
468 case 2:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
469 alsa_fragcount = 8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
470 chunk_size = 1024;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
471 mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 8192\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
472 mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 1024\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
473 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
474 case 3:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
475 alsa_fragcount = 32;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
476 chunk_size = 512;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
477 mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 16384\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
478 mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 512\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
479 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
480 case 4:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
481 alsa_fragcount = 16;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
482 chunk_size = 1024;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
483 mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 16384\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
484 mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 1024\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
485 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
486 default:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
487 alsa_fragcount = 16;
17616
92431bc3d014 This patch removes mmap support because it doesn't have any benefit.
cladisch
parents: 17575
diff changeset
488 chunk_size = 1024;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
489 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
490 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
491 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
492
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
493 if (!alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
494 //modes = 0, SND_PCM_NONBLOCK, SND_PCM_ASYNC
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
495 if ((err = try_open_device(alsa_device, open_mode, format == AF_FORMAT_AC3)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
496 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
497 if (err != -EBUSY && ao_noblock) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
498 mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_OpenInNonblockModeFailed);
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
499 if ((err = try_open_device(alsa_device, 0, format == AF_FORMAT_AC3)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
500 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PlaybackOpenError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
501 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
502 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
503 } else {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
504 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PlaybackOpenError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
505 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
506 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
507 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
508
17619
9b619133f11a Using non-blocking writes makes sense when the program wants to do other
cladisch
parents: 17618
diff changeset
509 if ((err = snd_pcm_nonblock(alsa_handler, 0)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
510 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_ErrorSetBlockMode, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
511 } else {
20743
diego
parents: 20185
diff changeset
512 mp_msg(MSGT_AO,MSGL_V,"alsa-init: pcm opened in blocking mode\n");
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
513 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
514
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
515 snd_pcm_hw_params_alloca(&alsa_hwparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
516 snd_pcm_sw_params_alloca(&alsa_swparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
517
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
518 // setting hw-parameters
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
519 if ((err = snd_pcm_hw_params_any(alsa_handler, alsa_hwparams)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
520 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
521 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetInitialParameters,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
522 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
523 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
524 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
525
17616
92431bc3d014 This patch removes mmap support because it doesn't have any benefit.
cladisch
parents: 17575
diff changeset
526 err = snd_pcm_hw_params_set_access(alsa_handler, alsa_hwparams,
92431bc3d014 This patch removes mmap support because it doesn't have any benefit.
cladisch
parents: 17575
diff changeset
527 SND_PCM_ACCESS_RW_INTERLEAVED);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
528 if (err < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
529 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetAccessType,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
530 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
531 return (0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
532 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
533
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
534 /* workaround for nonsupported formats
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
535 sets default format to S16_LE if the given formats aren't supported */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
536 if ((err = snd_pcm_hw_params_test_format(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
537 alsa_format)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
538 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
539 mp_msg(MSGT_AO,MSGL_INFO,
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
540 MSGTR_AO_ALSA_FormatNotSupportedByHardware, af_fmt2str_short(format));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
541 alsa_format = SND_PCM_FORMAT_S16_LE;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
542 ao_data.format = AF_FORMAT_S16_LE;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
543 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
544
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
545 if ((err = snd_pcm_hw_params_set_format(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
546 alsa_format)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
547 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
548 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetFormat,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
549 snd_strerror(err));
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
550 return(0);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
551 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
552
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
553 if ((err = snd_pcm_hw_params_set_channels_near(alsa_handler, alsa_hwparams,
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
554 &ao_data.channels)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
555 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
556 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetChannels,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
557 snd_strerror(err));
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
558 return(0);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
559 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
560
17849
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
561 /* workaround for buggy rate plugin (should be fixed in ALSA 1.0.11)
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
562 prefer our own resampler */
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
563 #if SND_LIB_VERSION >= 0x010009
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
564 if ((err = snd_pcm_hw_params_set_rate_resample(alsa_handler, alsa_hwparams,
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
565 0)) < 0)
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
566 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
567 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToDisableResampling,
17849
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
568 snd_strerror(err));
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
569 return(0);
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
570 }
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
571 #endif
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
572
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
573 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams,
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
574 &ao_data.samplerate, NULL)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
575 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
576 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetSamplerate2,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
577 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
578 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
579 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
580
17570
401521ec0d61 This replaces the hardcoded numbers for the sample format widths with a
cladisch
parents: 17566
diff changeset
581 bytes_per_sample = snd_pcm_format_physical_width(alsa_format) / 8;
401521ec0d61 This replaces the hardcoded numbers for the sample format widths with a
cladisch
parents: 17566
diff changeset
582 bytes_per_sample *= ao_data.channels;
401521ec0d61 This replaces the hardcoded numbers for the sample format widths with a
cladisch
parents: 17566
diff changeset
583 ao_data.bps = ao_data.samplerate * bytes_per_sample;
16309
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
584
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
585 #ifdef BUFFERTIME
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
586 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
587 int alsa_buffer_time = 500000; /* original 60 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
588 int alsa_period_time;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
589 alsa_period_time = alsa_buffer_time/4;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
590 if ((err = snd_pcm_hw_params_set_buffer_time_near(alsa_handler, alsa_hwparams,
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
591 &alsa_buffer_time, NULL)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
592 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
593 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetBufferTimeNear,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
594 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
595 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
596 } else
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
597 alsa_buffer_time = err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
598
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
599 if ((err = snd_pcm_hw_params_set_period_time_near(alsa_handler, alsa_hwparams,
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
600 &alsa_period_time, NULL)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
601 /* original: alsa_buffer_time/ao_data.bps */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
602 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
603 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriodTime,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
604 snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
605 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
606 }
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
607 mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_BufferTimePeriodTime,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
608 alsa_buffer_time, err);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
609 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
610 #endif//end SET_BUFFERTIME
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
611
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
612 #ifdef SET_CHUNKSIZE
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
613 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
614 //set chunksize
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
615 if ((err = snd_pcm_hw_params_set_period_size_near(alsa_handler, alsa_hwparams,
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
616 &chunk_size, NULL)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
617 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
618 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriodSize,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
619 chunk_size, snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
620 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
621 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
622 else {
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17194
diff changeset
623 mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set to %li\n", chunk_size);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
624 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
625 if ((err = snd_pcm_hw_params_set_periods_near(alsa_handler, alsa_hwparams,
17575
9972b744fd98 Small fixes: make all global variables static, remove some unused
cladisch
parents: 17574
diff changeset
626 &alsa_fragcount, NULL)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
627 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriods,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
628 snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
629 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
630 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
631 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
632 mp_msg(MSGT_AO,MSGL_V,"alsa-init: fragcount=%i\n", alsa_fragcount);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
633 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
634 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
635 #endif//end SET_CHUNKSIZE
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
636
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
637 /* finally install hardware parameters */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
638 if ((err = snd_pcm_hw_params(alsa_handler, alsa_hwparams)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
639 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
640 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetHwParameters,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
641 snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
642 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
643 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
644 // end setting hw-params
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
645
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
646
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
647 // gets buffersize for control
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
648 if ((err = snd_pcm_hw_params_get_buffer_size(alsa_hwparams, &bufsize)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
649 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
650 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetBufferSize, snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
651 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
652 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
653 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
654 ao_data.buffersize = bufsize * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
655 mp_msg(MSGT_AO,MSGL_V,"alsa-init: got buffersize=%i\n", ao_data.buffersize);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
656 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
657
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
658 if ((err = snd_pcm_hw_params_get_period_size(alsa_hwparams, &chunk_size, NULL)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
659 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetPeriodSize, snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
660 return 0;
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
661 } else {
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
662 mp_msg(MSGT_AO,MSGL_V,"alsa-init: got period size %li\n", chunk_size);
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
663 }
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
664 ao_data.outburst = chunk_size * bytes_per_sample;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
665
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
666 /* setting software parameters */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
667 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
668 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetSwParameters,
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
669 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
670 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
671 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
672 #if SND_LIB_VERSION >= 0x000901
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
673 if ((err = snd_pcm_sw_params_get_boundary(alsa_swparams, &boundary)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
674 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetBoundary,
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
675 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
676 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
677 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
678 #else
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
679 boundary = 0x7fffffff;
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
680 #endif
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
681 /* start playing when one period has been written */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
682 if ((err = snd_pcm_sw_params_set_start_threshold(alsa_handler, alsa_swparams, chunk_size)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
683 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetStartThreshold,
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
684 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
685 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
686 }
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
687 /* disable underrun reporting */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
688 if ((err = snd_pcm_sw_params_set_stop_threshold(alsa_handler, alsa_swparams, boundary)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
689 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetStopThreshold,
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
690 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
691 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
692 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
693 #if SND_LIB_VERSION >= 0x000901
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
694 /* play silence when there is an underrun */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
695 if ((err = snd_pcm_sw_params_set_silence_size(alsa_handler, alsa_swparams, boundary)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
696 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetSilenceSize,
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
697 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
698 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
699 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
700 #endif
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
701 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
702 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToGetSwParameters,
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
703 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
704 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
705 }
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
706 /* end setting sw-params */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
707
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 20020
diff changeset
708 mp_msg(MSGT_AO,MSGL_V,"alsa: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n",
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
709 ao_data.samplerate, ao_data.channels, bytes_per_sample, ao_data.buffersize,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
710 snd_pcm_format_description(alsa_format));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
711
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
712 } // end switch alsa_handler (spdif)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
713 alsa_can_pause = snd_pcm_hw_params_can_pause(alsa_hwparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
714 return(1);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
715 } // end init
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
716
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
717
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
718 /* close audio device */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
719 static void uninit(int immed)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
720 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
721
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
722 if (alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
723 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
724
14849
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
725 if (!immed)
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
726 snd_pcm_drain(alsa_handler);
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
727
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
728 if ((err = snd_pcm_close(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
729 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
730 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmCloseError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
731 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
732 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
733 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
734 alsa_handler = NULL;
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 20020
diff changeset
735 mp_msg(MSGT_AO,MSGL_V,"alsa-uninit: pcm closed\n");
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
736 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
737 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
738 else {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
739 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_NoHandlerDefined);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
740 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
741 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
742
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
743 static void audio_pause(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
744 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
745 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
746
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
747 if (alsa_can_pause) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
748 if ((err = snd_pcm_pause(alsa_handler, 1)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
749 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
750 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPauseError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
751 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
752 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
753 mp_msg(MSGT_AO,MSGL_V,"alsa-pause: pause supported by hardware\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
754 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
755 if ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
756 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
757 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmDropError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
758 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
759 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
760 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
761 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
762
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
763 static void audio_resume(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
764 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
765 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
766
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
767 if (alsa_can_pause) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
768 if ((err = snd_pcm_pause(alsa_handler, 0)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
769 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
770 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmResumeError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
771 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
772 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
773 mp_msg(MSGT_AO,MSGL_V,"alsa-resume: resume supported by hardware\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
774 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
775 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
776 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
777 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
778 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
779 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
780 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
781 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
782
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
783 /* stop playing and empty buffers (for seeking/pause) */
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
784 static void reset(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
785 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
786 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
787
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
788 if ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
789 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
790 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
791 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
792 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
793 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
794 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
795 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(err));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
796 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
797 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
798 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
799 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
800
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
801 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
802 plays 'len' bytes of 'data'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
803 returns: number of bytes played
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
804 modified last at 29.06.02 by jp
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
805 thanxs for marius <marius@rospot.com> for giving us the light ;)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
806 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
807
17617
adfab82139c0 After removing play_mmap(), the play() function just unconditionally
cladisch
parents: 17616
diff changeset
808 static int play(void* data, int len, int flags)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
809 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
810 int num_frames = len / bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
811 snd_pcm_sframes_t res = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
812
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
813 //mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: frames=%i, len=%i\n",num_frames,len);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
814
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
815 if (!alsa_handler) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
816 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_DeviceConfigurationError);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
817 return 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
818 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
819
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
820 if (num_frames == 0)
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
821 return 0;
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
822
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
823 do {
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
824 res = snd_pcm_writei(alsa_handler, data, num_frames);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
825
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
826 if (res == -EINTR) {
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
827 /* nothing to do */
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
828 res = 0;
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
829 }
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
830 else if (res == -ESTRPIPE) { /* suspend */
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
831 mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_PcmInSuspendModeTryingResume);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
832 while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
833 sleep(1);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
834 }
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
835 if (res < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
836 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_WriteError, snd_strerror(res));
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
837 mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_TryingToResetSoundcard);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
838 if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
839 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(res));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
840 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
841 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
842 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
843 }
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
844 } while (res == 0);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
845
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
846 return res < 0 ? res : res * bytes_per_sample;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
847 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
848
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
849 /* how many byes are free in the buffer */
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
850 static int get_space(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
851 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
852 snd_pcm_status_t *status;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
853 int ret;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
854
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
855 snd_pcm_status_alloca(&status);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
856
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
857 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
858 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
859 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_CannotGetPcmStatus, snd_strerror(ret));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
860 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
861 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
862
17572
580dc69d69bf Fix get_space(): we don't need to differentiate between the various PCM
cladisch
parents: 17571
diff changeset
863 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
580dc69d69bf Fix get_space(): we don't need to differentiate between the various PCM
cladisch
parents: 17571
diff changeset
864 if (ret > MAX_OUTBURST)
580dc69d69bf Fix get_space(): we don't need to differentiate between the various PCM
cladisch
parents: 17571
diff changeset
865 ret = MAX_OUTBURST;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
866 return(ret);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
867 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
868
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
869 /* delay in seconds between first and last sample in buffer */
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
870 static float get_delay(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
871 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
872 if (alsa_handler) {
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
873 snd_pcm_sframes_t delay;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
874
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
875 if (snd_pcm_delay(alsa_handler, &delay) < 0)
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
876 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
877
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
878 if (delay < 0) {
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
879 /* underrun - move the application pointer forward to catch up */
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
880 #if SND_LIB_VERSION >= 0x000901 /* snd_pcm_forward() exists since 0.9.0rc8 */
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
881 snd_pcm_forward(alsa_handler, -delay);
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
882 #endif
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
883 delay = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
884 }
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
885 return (float)delay / (float)ao_data.samplerate;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
886 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
887 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
888 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
889 }