annotate libao2/ao_alsa.c @ 28820:0581bb91e78e

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