annotate libao2/ao_alsa.c @ 37195:ac6c37d85d65 default tip

configure: Fix initialization of variable def_local_aligned_32 It contiained the #define of HAVE_LOCAL_ALIGNED_16 instead of HAVE_LOCAL_ALIGNED_32.
author al
date Sun, 28 Sep 2014 18:38:41 +0000
parents 86893b300a45
children
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 /*
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
2 * ALSA 0.9.x-1.x audio output driver
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
3 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
4 * Copyright (C) 2004 Alex Beregszaszi
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
5 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
6 * modified for real ALSA 0.9.0 support by Zsolt Barat <joy@streamminister.de>
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
7 * additional AC-3 passthrough support by Andy Lo A Foe <andy@alsaplayer.org>
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
8 * 08/22/2002 iec958-init rewritten and merged with common init, zsolt
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
9 * 04/13/2004 merged with ao_alsa1.x, fixes provided by Jindrich Makovicka
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
10 * 04/25/2004 printfs converted to mp_msg, Zsolt.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
11 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
12 * This file is part of MPlayer.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
13 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
14 * MPlayer is free software; you can redistribute it and/or modify
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
15 * it under the terms of the GNU General Public License as published by
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
16 * the Free Software Foundation; either version 2 of the License, or
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
17 * (at your option) any later version.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
18 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
19 * MPlayer is distributed in the hope that it will be useful,
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
22 * GNU General Public License for more details.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
23 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
24 * You should have received a copy of the GNU General Public License along
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
25 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
e45b08f2f5d3 Add standard license headers.
diego
parents: 28118
diff changeset
27 */
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 #include <errno.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
30 #include <sys/time.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
31 #include <stdlib.h>
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
32 #include <stdarg.h>
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
33 #include <ctype.h>
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
34 #include <math.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
35 #include <string.h>
27281
e47193172586 Our ALSA code needs alloca, so check for it in configure and include alloca.h
reimar
parents: 26757
diff changeset
36 #include <alloca.h>
34259
a9bfa5a9fcac ao_alsa: drop check for sys/asoundlib.h and ALSA version
diego
parents: 34103
diff changeset
37 #define ALSA_PCM_NEW_HW_PARAMS_API
a9bfa5a9fcac ao_alsa: drop check for sys/asoundlib.h and ALSA version
diego
parents: 34103
diff changeset
38 #define ALSA_PCM_NEW_SW_PARAMS_API
a9bfa5a9fcac ao_alsa: drop check for sys/asoundlib.h and ALSA version
diego
parents: 34103
diff changeset
39 #include <alsa/asoundlib.h>
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
40
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
41 #include "config.h"
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
42 #include "subopt-helper.h"
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
43 #include "mixer.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
44 #include "mp_msg.h"
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
45 #include "help_mp.h"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
46 #include "audio_out.h"
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
47 #include "audio_out_internal.h"
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
48 #include "libaf/af_format.h"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
49
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
50 static const ao_info_t info =
12465
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 "ALSA-0.9.x-1.x audio output",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
53 "alsa",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
54 "Alex Beregszaszi, Zsolt Barat <joy@streamminister.de>",
31834
64ba1daa147a various spelling fixes, found by the Debian QA tool 'lintian'
siretart
parents: 30410
diff changeset
55 "under development"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
56 };
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
57
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
58 LIBAO_EXTERN(alsa)
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 static snd_pcm_t *alsa_handler;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
61 static snd_pcm_format_t alsa_format;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
62 static snd_pcm_hw_params_t *alsa_hwparams;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
63 static snd_pcm_sw_params_t *alsa_swparams;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
64
17619
9b619133f11a Using non-blocking writes makes sense when the program wants to do other
cladisch
parents: 17618
diff changeset
65 static size_t bytes_per_sample;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
66
30399
d280f1bbfe93 Remove useless initializers.
reimar
parents: 30398
diff changeset
67 static int alsa_can_pause;
34754
9d4720deada1 Use approach used by ao_oss to avoid audio desync
reimar
parents: 34753
diff changeset
68 static int prepause_space;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
69
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
70 #define ALSA_DEVICE_SIZE 256
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
71
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
72 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
73 int err, const char *format, ...)
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
74 {
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
75 char tmp[0xc00];
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
76 va_list va;
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
77
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
78 va_start(va, format);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
79 vsnprintf(tmp, sizeof tmp, format, va);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
80 va_end(va);
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
81
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
82 if (err)
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
83 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
84 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
85 else
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
86 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
87 file, line, function, tmp);
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
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
90 /* to set/get/query special features/parameters */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
91 static int control(int cmd, void *arg)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
92 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
93 switch(cmd) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
94 case AOCONTROL_QUERY_FORMAT:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
95 return CONTROL_TRUE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
96 case AOCONTROL_GET_VOLUME:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
97 case AOCONTROL_SET_VOLUME:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
98 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
99 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
100
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
101 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
102 snd_mixer_t *handle;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
103 snd_mixer_elem_t *elem;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
104 snd_mixer_selem_id_t *sid;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
105
30400
88fd2aa823e5 Do not needlessly make local variable static.
reimar
parents: 30399
diff changeset
106 char *mix_name = "PCM";
88fd2aa823e5 Do not needlessly make local variable static.
reimar
parents: 30399
diff changeset
107 char *card = "default";
88fd2aa823e5 Do not needlessly make local variable static.
reimar
parents: 30399
diff changeset
108 int mix_index = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
109
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
110 long pmin, pmax;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
111 long get_vol, set_vol;
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
112 float f_multi;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
113
35443
f045a1d92c06 Make AF_FORMAT_IS_IEC61937 include AF_FORMAT_IS_AC3.
reimar
parents: 35200
diff changeset
114 if(AF_FORMAT_IS_IEC61937(ao_data.format))
28118
4455edd2be89 100l, reorder check for AC3 format to avoid a possible memleak
reimar
parents: 27706
diff changeset
115 return CONTROL_TRUE;
4455edd2be89 100l, reorder check for AC3 format to avoid a possible memleak
reimar
parents: 27706
diff changeset
116
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
117 if(mixer_channel) {
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
118 char *test_mix_index;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
119
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
120 mix_name = strdup(mixer_channel);
17097
rathann
parents: 16309
diff changeset
121 if ((test_mix_index = strchr(mix_name, ','))){
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
122 *test_mix_index = 0;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
123 test_mix_index++;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
124 mix_index = strtol(test_mix_index, &test_mix_index, 0);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
125
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
126 if (*test_mix_index){
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
127 mp_msg(MSGT_AO,MSGL_ERR,
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
128 MSGTR_AO_ALSA_InvalidMixerIndexDefaultingToZero);
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
129 mix_index = 0 ;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
130 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
131 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
132 }
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
133 if(mixer_device) card = mixer_device;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
134
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
135 //allocate simple id
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
136 snd_mixer_selem_id_alloca(&sid);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
137
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
138 //sets simple-mixer index and name
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
139 snd_mixer_selem_id_set_index(sid, mix_index);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
140 snd_mixer_selem_id_set_name(sid, mix_name);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
141
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
142 if (mixer_channel) {
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
143 free(mix_name);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
144 mix_name = NULL;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
145 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
146
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
147 if ((err = snd_mixer_open(&handle, 0)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
148 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
149 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
150 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
151
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
152 if ((err = snd_mixer_attach(handle, card)) < 0) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
153 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
154 card, snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
155 snd_mixer_close(handle);
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_selem_register(handle, NULL, NULL)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
160 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
161 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
162 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
163 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
164 err = snd_mixer_load(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
165 if (err < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
166 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
167 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
168 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
169 }
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 elem = snd_mixer_find_selem(handle, sid);
37089
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
172 if (!elem && !mixer_channel) {
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
173 // if nothing specified just try picking the first
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
174 elem = snd_mixer_first_elem(handle);
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
175 if (elem)
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
176 mp_msg(MSGT_AO, MSGL_V, "[AO_ALSA] Auto-selected element %s\n", snd_mixer_selem_get_name(elem));
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
177 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
178 if (!elem) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
179 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
180 snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
37089
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
181 mp_msg(MSGT_AO, MSGL_INFO, "[AO_ALSA] Available elements for device:\n");
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
182 for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem))
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
183 mp_msg(MSGT_AO, MSGL_INFO, "[AO_ALSA] %s\n", snd_mixer_selem_get_name(elem));
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
184 mp_msg(MSGT_AO, MSGL_INFO, "\n");
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
185 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
186 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
187 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
188
37089
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
189 if (!snd_mixer_selem_has_playback_volume(elem) &&
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
190 !snd_mixer_selem_has_playback_volume_joined(elem))
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
191 {
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
192 if (!snd_mixer_selem_has_playback_switch(elem))
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
193 return CONTROL_FALSE;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
194 if (cmd == AOCONTROL_GET_VOLUME) {
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
195 int v;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
196 snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_FRONT_LEFT, &v);
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
197 vol->left = v ? 100 : 0;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
198 snd_mixer_selem_get_playback_switch(elem, SND_MIXER_SCHN_FRONT_RIGHT, &v);
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
199 vol->right = v ? 100 : 0;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
200 return CONTROL_TRUE;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
201 }
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
202 // special case: only mute supported
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
203 if (vol->left != 0 && vol->left != 100 ||
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
204 vol->right != 0 && vol->right != 100)
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
205 return CONTROL_FALSE;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
206 if (snd_mixer_selem_has_playback_switch_joined(elem)) {
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
207 if (vol->left != vol->right)
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
208 return CONTROL_FALSE;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
209 } else {
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
210 snd_mixer_selem_set_playback_switch(elem, SND_MIXER_SCHN_FRONT_RIGHT, vol->right != 0);
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
211 }
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
212 snd_mixer_selem_set_playback_switch(elem, SND_MIXER_SCHN_FRONT_LEFT, vol->left != 0);
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
213 return CONTROL_TRUE;
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
214 }
86893b300a45 alsa: Better volume control handling, especially for S/PDIF.
reimar
parents: 36493
diff changeset
215
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
216 snd_mixer_selem_get_playback_volume_range(elem,&pmin,&pmax);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar d«Óffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
217 f_multi = (100 / (float)(pmax - pmin));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
218
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
219 if (cmd == AOCONTROL_SET_VOLUME) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
220
12811
d5f8efddac6c volume calc fixes for mixer, by reimar d«Óffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
221 set_vol = vol->left / f_multi + pmin + 0.5;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
222
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
223 //setting channels
27706
8dec0335f75b Replace numeric constants by their defines.
cehoyos
parents: 27682
diff changeset
224 if ((err = snd_mixer_selem_set_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, set_vol)) < 0) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
225 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
226 snd_strerror(err));
29436
4537ed655f0b Do not leak the mixer handle if setting of a volume fails.
cladisch
parents: 29401
diff changeset
227 snd_mixer_close(handle);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
228 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
229 }
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
230 mp_msg(MSGT_AO,MSGL_DBG2,"left=%li, ", set_vol);
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
231
12811
d5f8efddac6c volume calc fixes for mixer, by reimar d«Óffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
232 set_vol = vol->right / f_multi + pmin + 0.5;
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
233
27706
8dec0335f75b Replace numeric constants by their defines.
cehoyos
parents: 27682
diff changeset
234 if ((err = snd_mixer_selem_set_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, set_vol)) < 0) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
235 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
236 snd_strerror(err));
29436
4537ed655f0b Do not leak the mixer handle if setting of a volume fails.
cladisch
parents: 29401
diff changeset
237 snd_mixer_close(handle);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
238 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
239 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
240 mp_msg(MSGT_AO,MSGL_DBG2,"right=%li, pmin=%li, pmax=%li, mult=%f\n",
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
241 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
242
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
243 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
244 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
245 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
246 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
247 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
248 } 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
249 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
250 }
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
251 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
252 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
253 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
254 else {
27706
8dec0335f75b Replace numeric constants by their defines.
cehoyos
parents: 27682
diff changeset
255 snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &get_vol);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar d«Óffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
256 vol->left = (get_vol - pmin) * f_multi;
27706
8dec0335f75b Replace numeric constants by their defines.
cehoyos
parents: 27682
diff changeset
257 snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, &get_vol);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar d«Óffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
258 vol->right = (get_vol - pmin) * f_multi;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
259
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
260 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
261 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
262 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
263 return CONTROL_OK;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
264 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
265
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
266 } //end switch
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
267 return CONTROL_UNKNOWN;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
268 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
269
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
270 static void parse_device (char *dest, const char *src, int len)
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
271 {
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
272 char *tmp;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
273 memmove(dest, src, len);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
274 dest[len] = 0;
35474
e53785e5205b Do not use strrchr when strchr works just as well.
reimar
parents: 35443
diff changeset
275 while ((tmp = strchr(dest, '.')))
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
276 tmp[0] = ',';
35474
e53785e5205b Do not use strrchr when strchr works just as well.
reimar
parents: 35443
diff changeset
277 while ((tmp = strchr(dest, '=')))
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
278 tmp[0] = ':';
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
279 }
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
280
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
281 static void print_help (void)
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
282 {
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
283 mp_msg (MSGT_AO, MSGL_FATAL,
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
284 MSGTR_AO_ALSA_CommandlineHelp);
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
285 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
286
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29826
diff changeset
287 static int str_maxlen(void *strp) {
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29826
diff changeset
288 strarg_t *str = strp;
30123
0f5f75b4a015 Simplify range-checking functions for subopt parsing.
reimar
parents: 30122
diff changeset
289 return str->len <= ALSA_DEVICE_SIZE;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
290 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
291
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
292 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
293 {
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
294 int err, len;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
295 char *ac3_device, *args;
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
296
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
297 if (try_ac3) {
36493
36820f219892 add comment about ac3 aes, patch by funman
compn
parents: 35474
diff changeset
298 /* to set the non-audio bit, use AES0=6
36820f219892 add comment about ac3 aes, patch by funman
compn
parents: 35474
diff changeset
299 * 6 == IEC958_AES0_NONAUDIO | IEC958_AES0_PRO_EMPHASIS_NONE */
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
300 len = strlen(device);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
301 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
302 if (!ac3_device)
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
303 return -ENOMEM;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
304 strcpy(ac3_device, device);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
305 args = strchr(ac3_device, ':');
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
306 if (!args) {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
307 /* 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
308 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
309 } else {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
310 do
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
311 ++args;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
312 while (isspace(*args));
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
313 if (*args == '\0') {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
314 /* ":" but no parameters */
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
315 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
316 } else if (*args != '{') {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
317 /* 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
318 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
319 } else {
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
320 /* 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
321 do
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
322 --len;
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
323 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
324 if (ac3_device[len] == '}')
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
325 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
326 }
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
327 }
22166
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
328 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
329 open_mode);
68dceb30bbcf When setting the non-audio bit for hwac3 output, just try to set the
cladisch
parents: 20764
diff changeset
330 free(ac3_device);
33347
f60b1fd07712 Simplify code and avoid an incorrect "may be used initialized"
reimar
parents: 31834
diff changeset
331 if (err >= 0)
f60b1fd07712 Simplify code and avoid an incorrect "may be used initialized"
reimar
parents: 31834
diff changeset
332 return err;
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
333 }
33347
f60b1fd07712 Simplify code and avoid an incorrect "may be used initialized"
reimar
parents: 31834
diff changeset
334 return snd_pcm_open(&alsa_handler, device, SND_PCM_STREAM_PLAYBACK, open_mode);
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
335 }
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
336
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 open & setup audio device
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
339 return: 1=success 0=fail
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
340 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
341 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
342 {
30398
acb92f578a08 Do not needlessly use (file-)global variables.
reimar
parents: 30241
diff changeset
343 unsigned int alsa_buffer_time = 500000; /* 0.5 s */
acb92f578a08 Do not needlessly use (file-)global variables.
reimar
parents: 30241
diff changeset
344 unsigned int alsa_fragcount = 16;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
345 int err;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
346 int block;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
347 strarg_t device;
29507
fc8416cffdcd Use a buffer of about half a second, instead of sizing it to have
cladisch
parents: 29436
diff changeset
348 snd_pcm_uframes_t chunk_size;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
349 snd_pcm_uframes_t bufsize;
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
350 snd_pcm_uframes_t boundary;
29586
2eff450157cd The suboption parser now takes a const options list, so mark them all const.
reimar
parents: 29507
diff changeset
351 const opt_t subopts[] = {
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
352 {"block", OPT_ARG_BOOL, &block, NULL},
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29826
diff changeset
353 {"device", OPT_ARG_STR, &device, str_maxlen},
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
354 {NULL}
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
355 };
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
356
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
357 char alsa_device[ALSA_DEVICE_SIZE + 1];
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
358 // make sure alsa_device is null-terminated even when using strncpy etc.
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
359 memset(alsa_device, 0, ALSA_DEVICE_SIZE + 1);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
360
14249
8f59f661f317 hopefully final fix
alex
parents: 14245
diff changeset
361 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
362 channels, format);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
363 alsa_handler = NULL;
17690
9ca95aee8449 Show the actual ALSA version instead of the version mplayer was compiled
cladisch
parents: 17621
diff changeset
364 #if SND_LIB_VERSION >= 0x010005
9ca95aee8449 Show the actual ALSA version instead of the version mplayer was compiled
cladisch
parents: 17621
diff changeset
365 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
366 #else
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
367 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
368 #endif
17691
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
369
b73103a82416 Output error messages from the ALSA library through mp_msg() instead of
cladisch
parents: 17690
diff changeset
370 snd_lib_error_set_handler(alsa_error_handler);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
371
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
372 ao_data.samplerate = rate_hz;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
373 ao_data.format = format;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
374 ao_data.channels = channels;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
375
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
376 switch (format)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
377 {
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
378 case AF_FORMAT_S8:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
379 alsa_format = SND_PCM_FORMAT_S8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
380 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
381 case AF_FORMAT_U8:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
382 alsa_format = SND_PCM_FORMAT_U8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
383 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
384 case AF_FORMAT_U16_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
385 alsa_format = SND_PCM_FORMAT_U16_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
386 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
387 case AF_FORMAT_U16_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
388 alsa_format = SND_PCM_FORMAT_U16_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
389 break;
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30237
diff changeset
390 case AF_FORMAT_AC3_LE:
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
391 case AF_FORMAT_S16_LE:
34103
febe300dbfc0 S/PDIF passthrough decoder
diego
parents: 33347
diff changeset
392 case AF_FORMAT_IEC61937_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
393 alsa_format = SND_PCM_FORMAT_S16_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
394 break;
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30237
diff changeset
395 case AF_FORMAT_AC3_BE:
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
396 case AF_FORMAT_S16_BE:
34103
febe300dbfc0 S/PDIF passthrough decoder
diego
parents: 33347
diff changeset
397 case AF_FORMAT_IEC61937_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
398 alsa_format = SND_PCM_FORMAT_S16_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
399 break;
17571
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
400 case AF_FORMAT_U32_LE:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
401 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
402 break;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
403 case AF_FORMAT_U32_BE:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
404 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
405 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
406 case AF_FORMAT_S32_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
407 alsa_format = SND_PCM_FORMAT_S32_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
408 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
409 case AF_FORMAT_S32_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
410 alsa_format = SND_PCM_FORMAT_S32_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
411 break;
29386
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
412 case AF_FORMAT_U24_LE:
29392
cd3ec59296a0 Use correct ALSA sample format for 24-bit samples packed in three bytes.
cladisch
parents: 29386
diff changeset
413 alsa_format = SND_PCM_FORMAT_U24_3LE;
29386
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
414 break;
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
415 case AF_FORMAT_U24_BE:
29392
cd3ec59296a0 Use correct ALSA sample format for 24-bit samples packed in three bytes.
cladisch
parents: 29386
diff changeset
416 alsa_format = SND_PCM_FORMAT_U24_3BE;
29386
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
417 break;
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
418 case AF_FORMAT_S24_LE:
29392
cd3ec59296a0 Use correct ALSA sample format for 24-bit samples packed in three bytes.
cladisch
parents: 29386
diff changeset
419 alsa_format = SND_PCM_FORMAT_S24_3LE;
29386
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
420 break;
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
421 case AF_FORMAT_S24_BE:
29392
cd3ec59296a0 Use correct ALSA sample format for 24-bit samples packed in three bytes.
cladisch
parents: 29386
diff changeset
422 alsa_format = SND_PCM_FORMAT_S24_3BE;
29386
9ccfc57f0eff Handle 24bit audio formats natively by ALSA.
iive
parents: 29263
diff changeset
423 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
424 case AF_FORMAT_FLOAT_LE:
12570
148f3c98a041 additional formats - 8bit & float
henry
parents: 12465
diff changeset
425 alsa_format = SND_PCM_FORMAT_FLOAT_LE;
148f3c98a041 additional formats - 8bit & float
henry
parents: 12465
diff changeset
426 break;
17571
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
427 case AF_FORMAT_FLOAT_BE:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
428 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
429 break;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
430 case AF_FORMAT_MU_LAW:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
431 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
432 break;
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
433 case AF_FORMAT_A_LAW:
e476a1d38087 This adds support for more sample formats (U32, float BE, mu/A-law).
cladisch
parents: 17570
diff changeset
434 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
435 break;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
436
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
437 default:
14251
89c1422b367b maybe now..
alex
parents: 14249
diff changeset
438 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
439 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
440 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
441
12805
0b154063a3ca fixes provided by reimar d«Órfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
442 //subdevice parsing
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
443 // set defaults
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
444 block = 1;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
445 /* switch for spdif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
446 * sets opening sequence for SPDIF
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
447 * sets also the playback and other switches 'on the fly'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
448 * while opening the abstract alias for the spdif subdevice
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
449 * 'iec958'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
450 */
35443
f045a1d92c06 Make AF_FORMAT_IS_IEC61937 include AF_FORMAT_IS_AC3.
reimar
parents: 35200
diff changeset
451 if (AF_FORMAT_IS_IEC61937(format)) {
19889
d4bb39d65f87 When the hardware sample format is AC3, do not force using an hardcoded
cladisch
parents: 19887
diff changeset
452 device.str = "iec958";
34103
febe300dbfc0 S/PDIF passthrough decoder
diego
parents: 33347
diff changeset
453 mp_msg(MSGT_AO,MSGL_V,"alsa-spdif-init: playing AC3/iec61937/iec958, %i channels\n", channels);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
454 }
13661
07dc40f25068 Only use S/PDIF output when no other alsa device is set, allows to use
reimar
parents: 13434
diff changeset
455 else
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
456 /* in any case for multichannel playback we should select
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
457 * appropriate device
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
458 */
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
459 switch (channels) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
460 case 1:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
461 case 2:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
462 device.str = "default";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
463 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
464 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
465 case 4:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
466 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
467 // hack - use the converter plugin
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
468 device.str = "plug:surround40";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
469 else
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
470 device.str = "surround40";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
471 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
472 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
473 case 6:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
474 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
475 device.str = "plug:surround51";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
476 else
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
477 device.str = "surround51";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
478 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
479 break;
29826
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
480 case 8:
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
481 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
482 device.str = "plug:surround71";
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
483 else
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
484 device.str = "surround71";
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
485 mp_msg(MSGT_AO,MSGL_V,"alsa-init: device set to surround71\n");
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29706
diff changeset
486 break;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
487 default:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
488 device.str = "default";
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
489 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
490 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
491 device.len = strlen(device.str);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
492 if (subopt_parse(ao_subdevice, subopts) != 0) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
493 print_help();
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
494 return 0;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
495 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
496 parse_device(alsa_device, device.str, device.len);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
497
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 20020
diff changeset
498 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
499
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
500 if (!alsa_handler) {
30402
9fc779fd3721 Declare variable closer to where it is used.
reimar
parents: 30401
diff changeset
501 int open_mode = block ? 0 : SND_PCM_NONBLOCK;
35443
f045a1d92c06 Make AF_FORMAT_IS_IEC61937 include AF_FORMAT_IS_AC3.
reimar
parents: 35200
diff changeset
502 int isac3 = AF_FORMAT_IS_IEC61937(format);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
503 //modes = 0, SND_PCM_NONBLOCK, SND_PCM_ASYNC
34763
6834d78ac904 Clarify the used opening modes by improving the verbose status messages.
ib
parents: 34754
diff changeset
504 mp_msg(MSGT_AO,MSGL_V,"alsa-init: opening device in %sblocking mode\n", block ? "" : "non-");
30234
9d09ff127c25 Add and use AF_FORMAT_IS_AC3 macro.
reimar
parents: 30123
diff changeset
505 if ((err = try_open_device(alsa_device, open_mode, isac3)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
506 {
30401
a97f9a9f30d1 Remove a useless global variable.
reimar
parents: 30400
diff changeset
507 if (err != -EBUSY && !block) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
508 mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_OpenInNonblockModeFailed);
30234
9d09ff127c25 Add and use AF_FORMAT_IS_AC3 macro.
reimar
parents: 30123
diff changeset
509 if ((err = try_open_device(alsa_device, 0, isac3)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
510 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PlaybackOpenError, snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
511 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
512 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
513 } else {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
514 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PlaybackOpenError, snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
515 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
516 }
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
17619
9b619133f11a Using non-blocking writes makes sense when the program wants to do other
cladisch
parents: 17618
diff changeset
519 if ((err = snd_pcm_nonblock(alsa_handler, 0)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
520 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
521 } else {
34763
6834d78ac904 Clarify the used opening modes by improving the verbose status messages.
ib
parents: 34754
diff changeset
522 mp_msg(MSGT_AO,MSGL_V,"alsa-init: device reopened in blocking mode\n");
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
523 }
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 snd_pcm_hw_params_alloca(&alsa_hwparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
526 snd_pcm_sw_params_alloca(&alsa_swparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
527
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
528 // setting hw-parameters
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
529 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
530 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
531 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
532 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
533 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
534 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
535
17616
92431bc3d014 This patch removes mmap support because it doesn't have any benefit.
cladisch
parents: 17575
diff changeset
536 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
537 SND_PCM_ACCESS_RW_INTERLEAVED);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
538 if (err < 0) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
539 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
540 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
541 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
542 }
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 /* workaround for nonsupported formats
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
545 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
546 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
547 alsa_format)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
548 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
549 mp_msg(MSGT_AO,MSGL_INFO,
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
550 MSGTR_AO_ALSA_FormatNotSupportedByHardware, af_fmt2str_short(format));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
551 alsa_format = SND_PCM_FORMAT_S16_LE;
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30237
diff changeset
552 if (AF_FORMAT_IS_AC3(ao_data.format))
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30237
diff changeset
553 ao_data.format = AF_FORMAT_AC3_LE;
34103
febe300dbfc0 S/PDIF passthrough decoder
diego
parents: 33347
diff changeset
554 else if (AF_FORMAT_IS_IEC61937(ao_data.format))
febe300dbfc0 S/PDIF passthrough decoder
diego
parents: 33347
diff changeset
555 ao_data.format = AF_FORMAT_IEC61937_LE;
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30237
diff changeset
556 else
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
557 ao_data.format = AF_FORMAT_S16_LE;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
558 }
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 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
561 alsa_format)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
562 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
563 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
564 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
565 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
566 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
567
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
568 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
569 &ao_data.channels)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
570 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
571 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
572 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
573 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
574 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
575
17849
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
576 /* workaround for buggy rate plugin (should be fixed in ALSA 1.0.11)
30410
67b70534caeb Explain why we still disable the ALSA resampler even though it is probably
reimar
parents: 30402
diff changeset
577 prefer our own resampler, since that allows users to choose the resampler,
67b70534caeb Explain why we still disable the ALSA resampler even though it is probably
reimar
parents: 30402
diff changeset
578 even per file if desired */
17849
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
579 #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
580 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
581 0)) < 0)
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
582 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
583 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
584 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
585 return 0;
17849
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
586 }
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
587 #endif
ebebe97331af To avoid a bug in ALSA's rate plugin that causes spurious overruns, try
cladisch
parents: 17848
diff changeset
588
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
589 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams,
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
590 &ao_data.samplerate, NULL)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
591 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
592 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
593 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
594 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
595 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
596
30237
9584cf67cea0 Use af_fmt2bits, it should give more sensible values than snd_pcm_format_physical_width,
reimar
parents: 30234
diff changeset
597 bytes_per_sample = af_fmt2bits(ao_data.format) / 8;
17570
401521ec0d61 This replaces the hardcoded numbers for the sample format widths with a
cladisch
parents: 17566
diff changeset
598 bytes_per_sample *= ao_data.channels;
401521ec0d61 This replaces the hardcoded numbers for the sample format widths with a
cladisch
parents: 17566
diff changeset
599 ao_data.bps = ao_data.samplerate * bytes_per_sample;
16309
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
600
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
601 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
602 &alsa_buffer_time, NULL)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
603 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
604 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
605 snd_strerror(err));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
606 return 0;
29507
fc8416cffdcd Use a buffer of about half a second, instead of sizing it to have
cladisch
parents: 29436
diff changeset
607 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
608
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
609 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
610 &alsa_fragcount, NULL)) < 0) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
611 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
612 snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
613 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
614 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
615
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
616 /* finally install hardware parameters */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
617 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
618 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
619 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
620 snd_strerror(err));
19887
1259d6add8e6 When one of the PCM configuration function in init() fails, abort
cladisch
parents: 18009
diff changeset
621 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
622 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
623 // end setting hw-params
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
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
626 // gets buffersize for control
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
627 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
628 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
629 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
630 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
631 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
632 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
633 ao_data.buffersize = bufsize * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
634 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
635 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
636
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
637 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
638 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
639 return 0;
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
640 } else {
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
641 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
642 }
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
643 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
644
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
645 /* setting software parameters */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
646 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
647 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
648 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
649 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
650 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
651 #if SND_LIB_VERSION >= 0x000901
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
652 if ((err = snd_pcm_sw_params_get_boundary(alsa_swparams, &boundary)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
653 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
654 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
655 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
656 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
657 #else
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
658 boundary = 0x7fffffff;
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
659 #endif
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
660 /* 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
661 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
662 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
663 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
664 return 0;
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 /* disable underrun reporting */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
667 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
668 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
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 /* play silence when there is an underrun */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
674 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
675 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
676 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
677 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
678 }
18009
fb7888812f13 Add workarounds for old prerelease versions of alsa-lib 0.9.0 that did
cladisch
parents: 17849
diff changeset
679 #endif
17620
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
680 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
681 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
682 snd_strerror(err));
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
683 return 0;
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
684 }
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
685 /* end setting sw-params */
dd4db8c43d92 This changes the software parameters to be more compatible with the
cladisch
parents: 17619
diff changeset
686
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 20020
diff changeset
687 mp_msg(MSGT_AO,MSGL_V,"alsa: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n",
27682
25245b3e962f Fix "format '%d' expects type 'int', but argument 6 has type 'size_t'" warning.
ranma
parents: 27680
diff changeset
688 ao_data.samplerate, ao_data.channels, (int)bytes_per_sample, ao_data.buffersize,
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
689 snd_pcm_format_description(alsa_format));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
690
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
691 } // end switch alsa_handler (spdif)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
692 alsa_can_pause = snd_pcm_hw_params_can_pause(alsa_hwparams);
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
693 return 1;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
694 } // end init
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
695
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
696
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
697 /* close audio device */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
698 static void uninit(int immed)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
699 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
700
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
701 if (alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
702 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
703
14849
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
704 if (!immed)
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
705 snd_pcm_drain(alsa_handler);
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
706
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
707 if ((err = snd_pcm_close(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
708 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
709 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
710 return;
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 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
713 alsa_handler = NULL;
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 20020
diff changeset
714 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
715 }
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 else {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
718 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
719 }
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
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
722 static void audio_pause(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
723 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
724 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
725
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
726 if (alsa_can_pause) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
727 if ((err = snd_pcm_pause(alsa_handler, 1)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
728 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
729 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
730 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
731 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
732 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
733 } else {
34754
9d4720deada1 Use approach used by ao_oss to avoid audio desync
reimar
parents: 34753
diff changeset
734 prepause_space = get_space();
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
735 if ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
736 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
737 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
738 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
739 }
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_resume(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
27680
a529f3763afa Make alsa resume after suspend to disk (would say 'file descriptor is in bad state' before this change)
ranma
parents: 27281
diff changeset
747 if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) {
a529f3763afa Make alsa resume after suspend to disk (would say 'file descriptor is in bad state' before this change)
ranma
parents: 27281
diff changeset
748 mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_PcmInSuspendModeTryingResume);
a529f3763afa Make alsa resume after suspend to disk (would say 'file descriptor is in bad state' before this change)
ranma
parents: 27281
diff changeset
749 while ((err = snd_pcm_resume(alsa_handler)) == -EAGAIN) sleep(1);
a529f3763afa Make alsa resume after suspend to disk (would say 'file descriptor is in bad state' before this change)
ranma
parents: 27281
diff changeset
750 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
751 if (alsa_can_pause) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
752 if ((err = snd_pcm_pause(alsa_handler, 0)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
753 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
754 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
755 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
756 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
757 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
758 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
759 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
760 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
761 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
762 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
763 }
34754
9d4720deada1 Use approach used by ao_oss to avoid audio desync
reimar
parents: 34753
diff changeset
764 mp_ao_resume_refill(&audio_out_alsa, prepause_space);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
765 }
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
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
768 /* stop playing and empty buffers (for seeking/pause) */
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
769 static void reset(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
770 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
771 int err;
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 if ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
774 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
775 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
776 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
777 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
778 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
779 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
780 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
781 return;
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 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
784 }
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 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
787 plays 'len' bytes of 'data'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
788 returns: number of bytes played
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
789 modified last at 29.06.02 by jp
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
790 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
791 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
792
17617
adfab82139c0 After removing play_mmap(), the play() function just unconditionally
cladisch
parents: 17616
diff changeset
793 static int play(void* data, int len, int flags)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
794 {
29706
54f54530a4d3 Make the ao_alsa play function always process a multiple of ao_data.outburst
reimar
parents: 29586
diff changeset
795 int num_frames;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
796 snd_pcm_sframes_t res = 0;
29706
54f54530a4d3 Make the ao_alsa play function always process a multiple of ao_data.outburst
reimar
parents: 29586
diff changeset
797 if (!(flags & AOPLAY_FINAL_CHUNK))
54f54530a4d3 Make the ao_alsa play function always process a multiple of ao_data.outburst
reimar
parents: 29586
diff changeset
798 len = len / ao_data.outburst * ao_data.outburst;
54f54530a4d3 Make the ao_alsa play function always process a multiple of ao_data.outburst
reimar
parents: 29586
diff changeset
799 num_frames = len / bytes_per_sample;
12465
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 //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
802
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
803 if (!alsa_handler) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
804 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
805 return 0;
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
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
808 if (num_frames == 0)
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
809 return 0;
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
810
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
811 do {
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
812 res = snd_pcm_writei(alsa_handler, data, num_frames);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
813
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
814 if (res == -EINTR) {
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
815 /* nothing to do */
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
816 res = 0;
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
817 }
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
818 else if (res == -ESTRPIPE) { /* suspend */
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
819 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
820 while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
821 sleep(1);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
822 }
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
823 if (res < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
824 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_WriteError, snd_strerror(res));
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
825 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
826 if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
827 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
828 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
829 }
35200
4078c5a09d8e Try to make code a bit clearer.
reimar
parents: 34763
diff changeset
830 res = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
831 }
17621
d9c518932302 Fix the error handling in the play() function: add a handler for EINTR,
cladisch
parents: 17620
diff changeset
832 } while (res == 0);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
833
35200
4078c5a09d8e Try to make code a bit clearer.
reimar
parents: 34763
diff changeset
834 return res < 0 ? 0 : res * bytes_per_sample;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
835 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
836
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
837 /* how many byes are free in the buffer */
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
838 static int get_space(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
839 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
840 snd_pcm_status_t *status;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
841 int ret;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
842
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
843 snd_pcm_status_alloca(&status);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
844
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
845 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
846 {
20764
62bb5a46fdcb MSGTRs for ao_alsa.c
kraymer
parents: 20743
diff changeset
847 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_CannotGetPcmStatus, snd_strerror(ret));
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
848 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
849 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
850
17572
580dc69d69bf Fix get_space(): we don't need to differentiate between the various PCM
cladisch
parents: 17571
diff changeset
851 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
24590
2c238fa777ff ao_alsa: Fix get_space() return values larger than buffersize
uau
parents: 22166
diff changeset
852 if (ret > ao_data.buffersize) // Buffer underrun?
2c238fa777ff ao_alsa: Fix get_space() return values larger than buffersize
uau
parents: 22166
diff changeset
853 ret = ao_data.buffersize;
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
854 return ret;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
855 }
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 /* delay in seconds between first and last sample in buffer */
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17366
diff changeset
858 static float get_delay(void)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
859 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
860 if (alsa_handler) {
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
861 snd_pcm_sframes_t delay;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
862
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
863 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
864 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
865
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
866 if (delay < 0) {
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
867 /* 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
868 #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
869 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
870 #endif
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
871 delay = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
872 }
17573
8921544f4114 Simplify get_delay(): we don't need to get the complete PCM status but
cladisch
parents: 17572
diff changeset
873 return (float)delay / (float)ao_data.samplerate;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
874 } else {
26757
0fdf04b07ecb cosmetics: Remove pointless parentheses from return statements.
diego
parents: 24590
diff changeset
875 return 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
876 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
877 }