annotate libao2/ao_alsa.c @ 16429:84174804804b

Updates to NUT spec: 1. remove average_bitrate 2. add other_stream_header, for subtitles and metadata 3. add max_pts to index 4. index_ptr - a 64 bit integer to say the total length of all index packets 5. specify how to write "multiple" indexes 6. change forward_ptr behavior, starts right after forward_ptr, ends after checksum 7. remove stream_id <-> stream_class limitation. 8. time_base_nom must also be non zero. 9. rename time_base_nom and time_base_denom, now timebase means the length of a tick, not amounts of ticks 10. remove (old?) sample_rate_mul stuff. 11. specify what exactly the checksum covers. 12. specify that stream classes which have multiple streams must have an info packet.. (in new Semantic requirements section) 13. Rename 'timestamp' to pts. 14. Change date of draft... 15. Add myself to authors...
author ods15
date Fri, 09 Sep 2005 10:26:21 +0000
parents aa7829aa8428
children 3473cbf126d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
2 ao_alsa9/1.x - ALSA-0.9.x-1.x output plugin for MPlayer
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
3
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
4 (C) Alex Beregszaszi
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
5
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
6 modified for real alsa-0.9.0-support by Zsolt Barat <joy@streamminister.de>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
7 additional AC3 passthrough support by Andy Lo A Foe <andy@alsaplayer.org>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
8 08/22/2002 iec958-init rewritten and merged with common init, zsolt
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
9 04/13/2004 merged with ao_alsa1.x, fixes provided by Jindrich Makovicka
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
10 04/25/2004 printfs converted to mp_msg, Zsolt.
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
11
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
12 Any bugreports regarding to this driver are welcome.
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
13 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
14
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
15 #include <errno.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
16 #include <sys/time.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
17 #include <stdlib.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
18 #include <math.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
19 #include <string.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
20 #include <sys/poll.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
21
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
22 #include "config.h"
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
23 #include "subopt-helper.h"
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
24 #include "mixer.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13661
diff changeset
25 #include "mp_msg.h"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
26
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
27 #define ALSA_PCM_NEW_HW_PARAMS_API
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
28 #define ALSA_PCM_NEW_SW_PARAMS_API
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
29
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
30 #if HAVE_SYS_ASOUNDLIB_H
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
31 #include <sys/asoundlib.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
32 #elif HAVE_ALSA_ASOUNDLIB_H
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
33 #include <alsa/asoundlib.h>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
34 #else
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
35 #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
36 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
37
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
38
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
39 #include "audio_out.h"
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
40 #include "audio_out_internal.h"
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
41 #include "libaf/af_format.h"
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
42
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
43 static ao_info_t info =
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
44 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
45 "ALSA-0.9.x-1.x audio output",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
46 "alsa",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
47 "Alex Beregszaszi, Zsolt Barat <joy@streamminister.de>",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
48 "under developement"
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
49 };
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
50
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
51 LIBAO_EXTERN(alsa)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
52
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
53 static snd_pcm_t *alsa_handler;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
54 static snd_pcm_format_t alsa_format;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
55 static snd_pcm_hw_params_t *alsa_hwparams;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
56 static snd_pcm_sw_params_t *alsa_swparams;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
57
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
58 /* possible 4096, original 8192
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
59 * was only needed for calculating chunksize? */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
60 static int alsa_fragsize = 4096;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
61 /* 16 sets buffersize to 16 * chunksize is as default 1024
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
62 * which seems to be good avarge for most situations
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
63 * so buffersize is 16384 frames by default */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
64 static int alsa_fragcount = 16;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
65 static snd_pcm_uframes_t chunk_size = 1024;//is alsa_fragsize / 4
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 #define MIN_CHUNK_SIZE 1024
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
68
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
69 static size_t bits_per_sample, bytes_per_sample, bits_per_frame;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
70 static size_t chunk_bytes;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
71
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
72 int ao_mmap = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
73 int ao_noblock = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
74 int first = 1;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
75
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
76 static int open_mode;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
77 static int set_block_mode;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
78 static int alsa_can_pause = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
79
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
80 #define ALSA_DEVICE_SIZE 256
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
81
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
82 #undef BUFFERTIME
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
83 #define SET_CHUNKSIZE
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
84 #undef USE_POLL
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
85
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
86 /* to set/get/query special features/parameters */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
87 static int control(int cmd, void *arg)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
88 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
89 switch(cmd) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
90 case AOCONTROL_QUERY_FORMAT:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
91 return CONTROL_TRUE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
92 #ifndef WORDS_BIGENDIAN
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
93 case AOCONTROL_GET_VOLUME:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
94 case AOCONTROL_SET_VOLUME:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
95 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
96 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
97
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
98 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
99 snd_mixer_t *handle;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
100 snd_mixer_elem_t *elem;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
101 snd_mixer_selem_id_t *sid;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
102
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
103 static char *mix_name = "PCM";
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
104 static char *card = "default";
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
105 static int mix_index = 0;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
106
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
107 long pmin, pmax;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
108 long get_vol, set_vol;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
109 float f_multi;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
110
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
111 if(mixer_channel) {
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
112 char *test_mix_index;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
113
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
114 mix_name = strdup(mixer_channel);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
115 if (test_mix_index = strchr(mix_name, ',')){
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
116 *test_mix_index = 0;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
117 test_mix_index++;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
118 mix_index = strtol(test_mix_index, &test_mix_index, 0);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
119
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
120 if (*test_mix_index){
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
121 mp_msg(MSGT_AO,MSGL_ERR,
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
122 "alsa-control: invalid mixer index. Defaulting to 0\n");
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
123 mix_index = 0 ;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
124 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
125 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
126 }
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
127 if(mixer_device) card = mixer_device;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
128
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
129 if(ao_data.format == AF_FORMAT_AC3)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
130 return CONTROL_TRUE;
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 //allocate simple id
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
133 snd_mixer_selem_id_alloca(&sid);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
134
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
135 //sets simple-mixer index and name
13434
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
136 snd_mixer_selem_id_set_index(sid, mix_index);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
137 snd_mixer_selem_id_set_name(sid, mix_name);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
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 free(mix_name);
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
141 mix_name = NULL;
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
142 }
2df414ae2d2a allow to select an alsa mixer channel index.
reimar
parents: 12919
diff changeset
143
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
144 if ((err = snd_mixer_open(&handle, 0)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
145 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: mixer open error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
146 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
147 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
148
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
149 if ((err = snd_mixer_attach(handle, card)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
150 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: mixer attach %s error: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
151 card, snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
152 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
153 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
154 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
155
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
156 if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
157 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: mixer register error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
158 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
159 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
160 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
161 err = snd_mixer_load(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
162 if (err < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
163 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: mixer load error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
164 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
165 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
166 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
167
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
168 elem = snd_mixer_find_selem(handle, sid);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
169 if (!elem) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
170 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: unable to find simple control '%s',%i\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
171 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
172 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
173 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
174 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
175
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
176 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
177 f_multi = (100 / (float)(pmax - pmin));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
178
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
179 if (cmd == AOCONTROL_SET_VOLUME) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
180
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
181 set_vol = vol->left / f_multi + pmin + 0.5;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
182
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
183 //setting channels
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
184 if ((err = snd_mixer_selem_set_playback_volume(elem, 0, set_vol)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
185 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: error setting left channel, %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
186 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
187 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
188 }
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
189 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
190
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
191 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
192
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
193 if ((err = snd_mixer_selem_set_playback_volume(elem, 1, set_vol)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
194 mp_msg(MSGT_AO,MSGL_ERR,"alsa-control: error setting right channel, %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
195 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
196 return CONTROL_ERROR;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
197 }
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
198 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
199 set_vol, pmin, pmax, f_multi);
12465
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 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
202 snd_mixer_selem_get_playback_volume(elem, 0, &get_vol);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
203 vol->left = (get_vol - pmin) * f_multi;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
204 snd_mixer_selem_get_playback_volume(elem, 1, &get_vol);
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
205 vol->right = (get_vol - pmin) * f_multi;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
206
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
207 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
208 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
209 snd_mixer_close(handle);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
210 return CONTROL_OK;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
211 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
212 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
213
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
214 } //end switch
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
215 return(CONTROL_UNKNOWN);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
216 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
217
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
218 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
219 {
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
220 char *tmp;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
221 memmove(dest, src, len);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
222 dest[len] = 0;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
223 while ((tmp = strrchr(dest, '.')))
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
224 tmp[0] = ',';
12919
aba44b58dea7 Use = instead if # in ALSA device name, as # irritates our config-parser.
reimar
parents: 12819
diff changeset
225 while ((tmp = strrchr(dest, '=')))
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
226 tmp[0] = ':';
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
227 }
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
228
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
229 static void print_help ()
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
230 {
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
231 mp_msg (MSGT_AO, MSGL_FATAL,
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
232 "\n-ao alsa commandline help:\n"
12919
aba44b58dea7 Use = instead if # in ALSA device name, as # irritates our config-parser.
reimar
parents: 12819
diff changeset
233 "Example: mplayer -ao alsa:mmap:device=hw=0.3\n"
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
234 " sets mmap-mode and first card fourth device\n"
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
235 "\nOptions:\n"
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
236 " mmap\n"
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
237 " Set memory-mapped mode, experimental\n"
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
238 " noblock\n"
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
239 " Sets non-blocking mode\n"
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
240 " device=<device-name>\n"
12919
aba44b58dea7 Use = instead if # in ALSA device name, as # irritates our config-parser.
reimar
parents: 12819
diff changeset
241 " Sets device (change , to . and : to =)\n");
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
242 }
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
243
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
244 static int str_maxlen(strarg_t *str) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
245 if (str->len > ALSA_DEVICE_SIZE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
246 return 0;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
247 return 1;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
248 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
249
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
250 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
251 open & setup audio device
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
252 return: 1=success 0=fail
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
253 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
254 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
255 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
256 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
257 int cards = -1;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
258 snd_pcm_info_t *alsa_info;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
259 char *str_block_mode;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
260 int dir = 0;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
261 int block;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
262 strarg_t device;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
263 snd_pcm_uframes_t bufsize;
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
264 opt_t subopts[] = {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
265 {"mmap", OPT_ARG_BOOL, &ao_mmap, NULL},
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
266 {"block", OPT_ARG_BOOL, &block, NULL},
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
267 {"device", OPT_ARG_STR, &device, (opt_test_f)str_maxlen},
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
268 {NULL}
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
269 };
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
270
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
271 char alsa_device[ALSA_DEVICE_SIZE + 1];
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
272 // make sure alsa_device is null-terminated even when using strncpy etc.
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
273 memset(alsa_device, 0, ALSA_DEVICE_SIZE + 1);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
274
14249
8f59f661f317 hopefully final fix
alex
parents: 14245
diff changeset
275 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
276 channels, format);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
277 alsa_handler = NULL;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
278 mp_msg(MSGT_AO,MSGL_V,"alsa-init: compiled for ALSA-%s\n", SND_LIB_VERSION_STR);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
279
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
280 if ((err = snd_card_next(&cards)) < 0 || cards < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
281 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
282 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: no soundcards found: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
283 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
284 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
285
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
286 ao_data.samplerate = rate_hz;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
287 ao_data.format = format;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
288 ao_data.channels = channels;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
289 ao_data.outburst = OUTBURST;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
290
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
291 switch (format)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
292 {
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
293 case AF_FORMAT_S8:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
294 alsa_format = SND_PCM_FORMAT_S8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
295 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
296 case AF_FORMAT_U8:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
297 alsa_format = SND_PCM_FORMAT_U8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
298 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
299 case AF_FORMAT_U16_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
300 alsa_format = SND_PCM_FORMAT_U16_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
301 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
302 case AF_FORMAT_U16_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
303 alsa_format = SND_PCM_FORMAT_U16_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
304 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
305 #ifndef WORDS_BIGENDIAN
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
306 case AF_FORMAT_AC3:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
307 #endif
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
308 case AF_FORMAT_S16_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
309 alsa_format = SND_PCM_FORMAT_S16_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
310 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
311 #ifdef WORDS_BIGENDIAN
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
312 case AF_FORMAT_AC3:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
313 #endif
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
314 case AF_FORMAT_S16_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
315 alsa_format = SND_PCM_FORMAT_S16_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
316 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
317 case AF_FORMAT_S32_LE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
318 alsa_format = SND_PCM_FORMAT_S32_LE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
319 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
320 case AF_FORMAT_S32_BE:
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
321 alsa_format = SND_PCM_FORMAT_S32_BE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
322 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
323 case AF_FORMAT_FLOAT_LE:
12570
148f3c98a041 additional formats - 8bit & float
henry
parents: 12465
diff changeset
324 alsa_format = SND_PCM_FORMAT_FLOAT_LE;
148f3c98a041 additional formats - 8bit & float
henry
parents: 12465
diff changeset
325 break;
12465
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 default:
14251
89c1422b367b maybe now..
alex
parents: 14249
diff changeset
328 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
329 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
330 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
331
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
332 //subdevice parsing
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
333 // set defaults
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
334 ao_mmap = 0;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
335 block = 1;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
336 /* switch for spdif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
337 * sets opening sequence for SPDIF
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
338 * sets also the playback and other switches 'on the fly'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
339 * while opening the abstract alias for the spdif subdevice
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
340 * 'iec958'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
341 */
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
342 if (format == AF_FORMAT_AC3) {
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
343 unsigned char s[4];
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
344
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
345 s[0] = IEC958_AES0_NONAUDIO |
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
346 IEC958_AES0_CON_EMPHASIS_NONE;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
347 s[1] = IEC958_AES1_CON_ORIGINAL |
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
348 IEC958_AES1_CON_PCM_CODER;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
349 s[2] = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
350 s[3] = IEC958_AES3_CON_FS_48000;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
351
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
352 snprintf(alsa_device, ALSA_DEVICE_SIZE,
14612
4825fb5a45b9 Typo in hwac3 string
reimar
parents: 14606
diff changeset
353 "iec958:{CARD 0 AES0 0x%02x AES1 0x%02x AES2 0x%02x AES3 0x%02x}",
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
354 s[0], s[1], s[2], s[3]);
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
355 device.str = alsa_device;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
356
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
357 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
358 }
13661
07dc40f25068 Only use S/PDIF output when no other alsa device is set, allows to use
reimar
parents: 13434
diff changeset
359 else
14328
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
360 /* in any case for multichannel playback we should select
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
361 * appropriate device
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
362 */
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
363 switch (channels) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
364 case 1:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
365 case 2:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
366 device.str = "default";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
367 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
368 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
369 case 4:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
370 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
371 // hack - use the converter plugin
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
372 device.str = "plug:surround40";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
373 else
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
374 device.str = "surround40";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
375 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
376 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
377 case 6:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
378 if (alsa_format == SND_PCM_FORMAT_FLOAT_LE)
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
379 device.str = "plug:surround51";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
380 else
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
381 device.str = "surround51";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
382 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
383 break;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
384 default:
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
385 device.str = "default";
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
386 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: %d channels are not supported\n",channels);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
387 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
388 device.len = strlen(device.str);
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
389 if (subopt_parse(ao_subdevice, subopts) != 0) {
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
390 print_help();
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
391 return 0;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
392 }
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
393 ao_noblock = !block;
fb9bf2e782a9 Use the subopt-helper for parsing suboptions.
reimar
parents: 14264
diff changeset
394 parse_device(alsa_device, device.str, device.len);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
395
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
396 mp_msg(MSGT_AO,MSGL_INFO,"alsa-init: %d soundcard%s found, using: %s\n", cards+1,(cards >= 0) ? "" : "s", alsa_device);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
397
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
398 //setting modes for block or nonblock-mode
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
399 if (ao_noblock) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
400 open_mode = SND_PCM_NONBLOCK;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
401 set_block_mode = 1;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
402 str_block_mode = "nonblock-mode";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
403 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
404 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
405 open_mode = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
406 set_block_mode = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
407 str_block_mode = "block-mode";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
408 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
409
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
410 //sets buff/chunksize if its set manually
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
411 if (ao_data.buffersize) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
412 switch (ao_data.buffersize)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
413 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
414 case 1:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
415 alsa_fragcount = 16;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
416 chunk_size = 512;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
417 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
418 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
419 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
420 case 2:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
421 alsa_fragcount = 8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
422 chunk_size = 1024;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
423 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
424 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
425 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
426 case 3:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
427 alsa_fragcount = 32;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
428 chunk_size = 512;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
429 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
430 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
431 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
432 case 4:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
433 alsa_fragcount = 16;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
434 chunk_size = 1024;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
435 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
436 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
437 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
438 default:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
439 alsa_fragcount = 16;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
440 if (ao_mmap)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
441 chunk_size = 512;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
442 else
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
443 chunk_size = 1024;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
444 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
445 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
446 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
447
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
448 if (!alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
449 //modes = 0, SND_PCM_NONBLOCK, SND_PCM_ASYNC
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
450 if ((err = snd_pcm_open(&alsa_handler, alsa_device, SND_PCM_STREAM_PLAYBACK, open_mode)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
451 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
452 if (err != -EBUSY && ao_noblock) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
453 mp_msg(MSGT_AO,MSGL_INFO,"alsa-init: open in nonblock-mode failed, trying to open in block-mode\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
454 if ((err = snd_pcm_open(&alsa_handler, alsa_device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
455 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: playback open error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
456 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
457 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
458 set_block_mode = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
459 str_block_mode = "block-mode";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
460 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
461 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
462 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: playback open error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
463 return(0);
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 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
466
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
467 if ((err = snd_pcm_nonblock(alsa_handler, set_block_mode)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
468 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: error set block-mode %s\n", snd_strerror(err));
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 mp_msg(MSGT_AO,MSGL_V,"alsa-init: pcm opend in %s\n", str_block_mode);
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 snd_pcm_hw_params_alloca(&alsa_hwparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
474 snd_pcm_sw_params_alloca(&alsa_swparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
475
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
476 // setting hw-parameters
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
477 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
478 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
479 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to get initial parameters: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
480 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
481 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
482 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
483
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
484 if (ao_mmap) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
485 snd_pcm_access_mask_t *mask = alloca(snd_pcm_access_mask_sizeof());
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
486 snd_pcm_access_mask_none(mask);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
487 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
488 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
489 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
490 err = snd_pcm_hw_params_set_access_mask(alsa_handler, alsa_hwparams, mask);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
491 mp_msg(MSGT_AO,MSGL_INFO,"alsa-init: mmap set\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
492 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
493 err = snd_pcm_hw_params_set_access(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
494 SND_PCM_ACCESS_RW_INTERLEAVED);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
495 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
496 if (err < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
497 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set access type: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
498 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
499 return (0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
500 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
501
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
502 /* workaround for nonsupported formats
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
503 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
504 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
505 alsa_format)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
506 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
507 mp_msg(MSGT_AO,MSGL_INFO,
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14251
diff changeset
508 "alsa-init: format %s are not supported by hardware, trying default\n", af_fmt2str_short(format));
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
509 alsa_format = SND_PCM_FORMAT_S16_LE;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
510 ao_data.format = AF_FORMAT_S16_LE;
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
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
513 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
514 alsa_format)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
515 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
516 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set format: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
517 snd_strerror(err));
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
518 return(0);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
519 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
520
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
521 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
522 &ao_data.channels)) < 0)
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
523 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
524 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set channels: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
525 snd_strerror(err));
16308
41278ab73e9b set the nearest number of channels, return(0) upon errors
henry
parents: 14849
diff changeset
526 return(0);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
527 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
528
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
529 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
530 &ao_data.samplerate, &dir)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
531 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
532 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set samplerate-2: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
533 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
534 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
535 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
536
16309
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
537 ao_data.bps = ao_data.channels * ao_data.samplerate;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
538
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
539 //setting bw according to the input-format. resolution seems to be always s16_le or
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
540 //u16_le so 32bit is probably obsolet.
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
541 switch(alsa_format)
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
542 {
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
543 case SND_PCM_FORMAT_S8:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
544 case SND_PCM_FORMAT_U8:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
545 ao_data.bps *= 1;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
546 break;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
547 case SND_PCM_FORMAT_S16_LE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
548 case SND_PCM_FORMAT_U16_LE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
549 case SND_PCM_FORMAT_S16_BE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
550 case SND_PCM_FORMAT_U16_BE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
551 ao_data.bps *= 2;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
552 break;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
553 case SND_PCM_FORMAT_S32_LE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
554 case SND_PCM_FORMAT_S32_BE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
555 case SND_PCM_FORMAT_FLOAT_LE:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
556 ao_data.bps *= 4;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
557 break;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
558 case -1:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
559 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: invalid format (%s) requested - output disabled\n",af_fmt2str_short(format));
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
560 return(0);
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
561 break;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
562 default:
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
563 ao_data.bps *= 2;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
564 mp_msg(MSGT_AO,MSGL_WARN,"alsa-init: couldn't convert to right format. setting bps to: %d", ao_data.bps);
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
565 }
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
566
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
567 bytes_per_sample = ao_data.bps / ao_data.samplerate;
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
568
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
569 #ifdef BUFFERTIME
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
570 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
571 int alsa_buffer_time = 500000; /* original 60 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
572 int alsa_period_time;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
573 alsa_period_time = alsa_buffer_time/4;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
574 if ((err = snd_pcm_hw_params_set_buffer_time_near(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
575 &alsa_buffer_time, &dir)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
576 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
577 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set buffer time near: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
578 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
579 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
580 } else
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
581 alsa_buffer_time = err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
582
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
583 if ((err = snd_pcm_hw_params_set_period_time_near(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
584 &alsa_period_time, &dir)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
585 /* original: alsa_buffer_time/ao_data.bps */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
586 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
587 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set period time: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
588 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
589 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
590 mp_msg(MSGT_AO,MSGL_INFO,"alsa-init: buffer_time: %d, period_time :%d\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
591 alsa_buffer_time, err);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
592 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
593 #endif//end SET_BUFFERTIME
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 #ifdef SET_CHUNKSIZE
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
596 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
597 //set chunksize
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
598 dir=0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
599 if ((err = snd_pcm_hw_params_set_period_size_near(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
600 &chunk_size, &dir)) < 0)
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 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set periodsize(%d): %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
603 chunk_size, snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
604 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
605 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
606 mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set to %i\n", chunk_size);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
607 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
608 if ((err = snd_pcm_hw_params_set_periods_near(alsa_handler, alsa_hwparams,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
609 &alsa_fragcount, &dir)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
610 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set periods: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
611 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
612 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
613 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
614 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
615 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
616 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
617 #endif//end SET_CHUNKSIZE
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
618
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
619 /* finally install hardware parameters */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
620 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
621 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
622 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set hw-parameters: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
623 snd_strerror(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 // end setting hw-params
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
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
628 // gets buffersize for control
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
629 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
630 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
631 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to get buffersize: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
632 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
633 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
634 ao_data.buffersize = bufsize * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
635 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
636 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
637
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
638 // setting sw-params (only avail-min) if noblocking mode was choosed
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
639 if (ao_noblock)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
640 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
641
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
642 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
643 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
644 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to get parameters: %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
645 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
646
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
647 }
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 //set min available frames to consider pcm ready (4)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
650 //increased for nonblock-mode should be set dynamically later
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
651 if ((err = snd_pcm_sw_params_set_avail_min(alsa_handler, alsa_swparams, 4)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
652 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
653 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set avail_min %s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
654 snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
655 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
656
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
657 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0)
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 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to install sw-params\n");
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 bits_per_sample = snd_pcm_format_physical_width(alsa_format);
16309
aa7829aa8428 reordered bps calculation
henry
parents: 16308
diff changeset
663 bits_per_frame = bits_per_sample * ao_data.channels;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
664 chunk_bytes = chunk_size * bits_per_frame / 8;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
665
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
666 mp_msg(MSGT_AO,MSGL_V,"alsa-init: bits per sample (bps)=%i, bits per frame (bpf)=%i, chunk_bytes=%i\n",bits_per_sample,bits_per_frame,chunk_bytes);}
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
667 //end swparams
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
668
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
669 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
670 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
671 mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: pcm prepare error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
672 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
673
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
674 mp_msg(MSGT_AO,MSGL_INFO,"alsa: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
675 ao_data.samplerate, ao_data.channels, bytes_per_sample, ao_data.buffersize,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
676 snd_pcm_format_description(alsa_format));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
677
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
678 } // end switch alsa_handler (spdif)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
679 alsa_can_pause = snd_pcm_hw_params_can_pause(alsa_hwparams);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
680 return(1);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
681 } // end init
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
682
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
683
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
684 /* close audio device */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
685 static void uninit(int immed)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
686 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
687
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
688 if (alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
689 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
690
14849
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
691 if (!immed)
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
692 snd_pcm_drain(alsa_handler);
d313f591d1a4 aos should respect the immed uninit flag (quit immediatly vs waiting till file
reimar
parents: 14612
diff changeset
693
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
694 if (!ao_noblock) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
695 if ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
696 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
697 mp_msg(MSGT_AO,MSGL_ERR,"alsa-uninit: pcm drop error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
698 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
699 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
700 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
701
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
702 if ((err = snd_pcm_close(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
703 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
704 mp_msg(MSGT_AO,MSGL_ERR,"alsa-uninit: pcm close error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
705 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
706 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
707 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
708 alsa_handler = NULL;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
709 mp_msg(MSGT_AO,MSGL_INFO,"alsa-uninit: pcm closed\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
710 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
711 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
712 else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
713 mp_msg(MSGT_AO,MSGL_ERR,"alsa-uninit: no handler defined!\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
714 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
715 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
716
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
717 static void audio_pause()
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
718 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
719 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
720
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
721 if (alsa_can_pause) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
722 if ((err = snd_pcm_pause(alsa_handler, 1)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
723 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
724 mp_msg(MSGT_AO,MSGL_ERR,"alsa-pause: pcm pause error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
725 return;
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 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
728 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
729 if ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
730 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
731 mp_msg(MSGT_AO,MSGL_ERR,"alsa-pause: pcm drop error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
732 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
733 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
734 }
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 static void audio_resume()
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
738 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
739 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
740
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
741 if (alsa_can_pause) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
742 if ((err = snd_pcm_pause(alsa_handler, 0)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
743 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
744 mp_msg(MSGT_AO,MSGL_ERR,"alsa-resume: pcm resume error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
745 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
746 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
747 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
748 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
749 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
750 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
751 mp_msg(MSGT_AO,MSGL_ERR,"alsa-resume: pcm prepare error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
752 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
753 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
754 }
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 /* stop playing and empty buffers (for seeking/pause) */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
758 static void reset()
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 ((err = snd_pcm_drop(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
763 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
764 mp_msg(MSGT_AO,MSGL_ERR,"alsa-reset: pcm drop error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
765 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
766 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
767 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
768 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
769 mp_msg(MSGT_AO,MSGL_ERR,"alsa-reset: pcm prepare error: %s\n", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
770 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
771 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
772 return;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
773 }
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 #ifdef USE_POLL
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
776 static int wait_for_poll(snd_pcm_t *handle, struct pollfd *ufds, unsigned int count)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
777 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
778 unsigned short revents;
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 while (1) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
781 poll(ufds, count, -1);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
782 snd_pcm_poll_descriptors_revents(handle, ufds, count, &revents);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
783 if (revents & POLLERR)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
784 return -EIO;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
785 if (revents & POLLOUT)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
786 return 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
787 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
788 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
789 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
790
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
791 #ifndef timersub
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
792 #define timersub(a, b, result) \
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
793 do { \
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
794 (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
795 (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
796 if ((result)->tv_usec < 0) { \
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
797 --(result)->tv_sec; \
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
798 (result)->tv_usec += 1000000; \
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 } while (0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
801 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
802
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
803 /* I/O error handler */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
804 static int xrun(u_char *str_mode)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
805 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
806 int err;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
807 snd_pcm_status_t *status;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
808
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
809 snd_pcm_status_alloca(&status);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
810
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
811 if ((err = snd_pcm_status(alsa_handler, status))<0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
812 mp_msg(MSGT_AO,MSGL_ERR,"status error: %s", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
813 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
814 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
815
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
816 if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
817 struct timeval now, diff, tstamp;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
818 gettimeofday(&now, 0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
819 snd_pcm_status_get_trigger_tstamp(status, &tstamp);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
820 timersub(&now, &tstamp, &diff);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
821 mp_msg(MSGT_AO,MSGL_INFO,"alsa-%s: xrun of at least %.3f msecs. resetting stream\n",
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
822 str_mode,
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
823 diff.tv_sec * 1000 + diff.tv_usec / 1000.0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
824 }
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 if ((err = snd_pcm_prepare(alsa_handler))<0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
827 mp_msg(MSGT_AO,MSGL_ERR,"xrun: prepare error: %s", snd_strerror(err));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
828 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
829 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
830
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
831 return(1); /* ok, data should be accepted again */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
832 }
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 static int play_normal(void* data, int len);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
835 static int play_mmap(void* data, int len);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
836
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
837 static int play(void* data, int len, int flags)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
838 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
839 int result;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
840 if (ao_mmap)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
841 result = play_mmap(data, len);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
842 else
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
843 result = play_normal(data, len);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
844
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
845 return result;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
846 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
847
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
848 /*
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
849 plays 'len' bytes of 'data'
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
850 returns: number of bytes played
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
851 modified last at 29.06.02 by jp
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
852 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
853 */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
854
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
855 static int play_normal(void* data, int len)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
856 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
857
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
858 //bytes_per_sample is always 4 for 2 chn S16_LE
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
859 int num_frames = len / bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
860 char *output_samples = (char *)data;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
861 snd_pcm_sframes_t res = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
862
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
863 //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
864
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
865 if (!alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
866 mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: device configuration error");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
867 return 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
868 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
869
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
870 while (num_frames > 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
871
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
872 res = snd_pcm_writei(alsa_handler, (void *)output_samples, num_frames);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
873
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
874 if (res == -EAGAIN) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
875 snd_pcm_wait(alsa_handler, 1000);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
876 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
877 else if (res == -EPIPE) { /* underrun */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
878 if (xrun("play") <= 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
879 mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: xrun reset error");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
880 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
881 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
882 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
883 else if (res == -ESTRPIPE) { /* suspend */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
884 mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: pcm in suspend mode. trying to resume\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
885 while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
886 sleep(1);
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 else if (res < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
889 mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: unknown status, trying to reset soundcard\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
890 if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
891 mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: snd prepare error");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
892 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
893 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
894 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
895 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
896
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
897 if (res > 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
898
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
899 /* output_samples += ao_data.channels * res; */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
900 output_samples += res * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
901
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
902 num_frames -= res;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
903 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
904
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
905 } //end while
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
906
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
907 if (res < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
908 mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: write error %s", snd_strerror(res));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
909 return 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
910 }
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
911 return len - len % bytes_per_sample;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
912 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
913
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
914 /* mmap-mode mainly based on descriptions by Joshua Haberman <joshua@haberman.com>
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
915 * 'An overview of the ALSA API' http://people.debian.org/~joshua/x66.html
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
916 * and some help by Paul Davis <pbd@op.net> */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
917
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
918 static int play_mmap(void* data, int len)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
919 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
920 snd_pcm_sframes_t commitres, frames_available;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
921 snd_pcm_uframes_t frames_transmit, size, offset;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
922 const snd_pcm_channel_area_t *area;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
923 void *outbuffer;
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
924 int result;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
925
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
926 #ifdef USE_POLL //seems not really be needed
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
927 struct pollfd *ufds;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
928 int count;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
929
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
930 count = snd_pcm_poll_descriptors_count (alsa_handler);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
931 ufds = malloc(sizeof(struct pollfd) * count);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
932 snd_pcm_poll_descriptors(alsa_handler, ufds, count);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
933
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
934 //first wait_for_poll
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
935 if (err = (wait_for_poll(alsa_handler, ufds, count) < 0)) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
936 if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_XRUN ||
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
937 snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
938 xrun("play");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
939 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
940 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
941 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
942
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
943 outbuffer = alloca(ao_data.buffersize);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
944
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
945 //don't trust get_space() ;)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
946 frames_available = snd_pcm_avail_update(alsa_handler) * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
947 if (frames_available < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
948 xrun("play");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
949
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
950 if (frames_available < 4) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
951 if (first) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
952 first = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
953 snd_pcm_start(alsa_handler);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
954 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
955 else { //FIXME should break and return 0?
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
956 snd_pcm_wait(alsa_handler, -1);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
957 first = 1;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
958 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
959 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
960
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
961 /* len is simply the available bufferspace got by get_space()
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
962 * but real avail_buffer in frames is ab/bytes_per_sample */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
963 size = len / bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
964
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
965 //mp_msg(MSGT_AO,MSGL_V,"len: %i size %i, f_avail %i, bps %i ...\n", len, size, frames_available, bytes_per_sample);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
966
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
967 frames_transmit = size;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
968
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
969 /* prepare areas and set sw-pointers
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
970 * frames_transmit returns the real available buffer-size
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
971 * sometimes != frames_available cause of ringbuffer 'emulation' */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
972 snd_pcm_mmap_begin(alsa_handler, &area, &offset, &frames_transmit);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
973
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
974 /* this is specific to interleaved streams (or non-interleaved
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
975 * streams with only one channel) */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
976 outbuffer = ((char *) area->addr + (area->first + area->step * offset) / 8); //8
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
977
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
978 //write data
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
979 memcpy(outbuffer, data, (frames_transmit * bytes_per_sample));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
980
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
981 commitres = snd_pcm_mmap_commit(alsa_handler, offset, frames_transmit);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
982
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
983 if (commitres < 0 || commitres != frames_transmit) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
984 if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_XRUN ||
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
985 snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
986 xrun("play");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
987 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
988 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
989
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
990 //mp_msg(MSGT_AO,MSGL_V,"mmap ft: %i, cres: %i\n", frames_transmit, commitres);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
991
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
992 /* err = snd_pcm_area_copy(&area, offset, &data, offset, len, alsa_format); */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
993 /* if (err < 0) { */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
994 /* mp_msg(MSGT_AO,MSGL_ERR,"area-copy-error\n"); */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
995 /* return 0; */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
996 /* } */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
997
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
998
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
999 //calculate written frames!
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1000 result = commitres * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1001
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1002
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1003 /* if (verbose) { */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1004 /* if (len == result) */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1005 /* mp_msg(MSGT_AO,MSGL_V,"result: %i, frames written: %i ...\n", result, frames_transmit); */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1006 /* else */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1007 /* mp_msg(MSGT_AO,MSGL_V,"result: %i, frames written: %i, result != len ...\n", result, frames_transmit); */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1008 /* } */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1009
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1010 //mplayer doesn't like -result
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1011 if (result < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1012 result = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1013
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1014 #ifdef USE_POLL
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1015 free(ufds);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1016 #endif
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1017
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1018 return result;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1019 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1020
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1021 /* how many byes are free in the buffer */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1022 static int get_space()
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1023 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1024 snd_pcm_status_t *status;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1025 int ret;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1026 char *str_status;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1027
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1028 //snd_pcm_sframes_t avail_frames = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1029
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
1030 snd_pcm_status_alloca(&status);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1031
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1032 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1033 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1034 mp_msg(MSGT_AO,MSGL_ERR,"alsa-space: cannot get pcm status: %s\n", snd_strerror(ret));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1035 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1036 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1037
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1038 switch(snd_pcm_status_get_state(status))
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1039 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1040 case SND_PCM_STATE_OPEN:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1041 str_status = "open";
12805
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
1042 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
0b154063a3ca fixes provided by reimar drfinger. mixer, subdevice parsing, alsa#help,
joyping
parents: 12747
diff changeset
1043 break;
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1044 case SND_PCM_STATE_PREPARED:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1045 str_status = "prepared";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1046 first = 1;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1047 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1048 if (ret == 0) //ugly workaround for hang in mmap-mode
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1049 ret = 10;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1050 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1051 case SND_PCM_STATE_RUNNING:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1052 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1053 //avail_frames = snd_pcm_avail_update(alsa_handler) * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1054 if (str_status != "open" && str_status != "prepared")
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1055 str_status = "running";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1056 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1057 case SND_PCM_STATE_PAUSED:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1058 mp_msg(MSGT_AO,MSGL_V,"alsa-space: paused");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1059 str_status = "paused";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1060 ret = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1061 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1062 case SND_PCM_STATE_XRUN:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1063 xrun("space");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1064 str_status = "xrun";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1065 first = 1;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1066 ret = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1067 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1068 default:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1069 str_status = "undefined";
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1070 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1071 if (ret <= 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1072 xrun("space");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1073 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1074 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1075
12811
d5f8efddac6c volume calc fixes for mixer, by reimar dffinger, 10l reverse by me
joyping
parents: 12805
diff changeset
1076 if (snd_pcm_status_get_state(status) != SND_PCM_STATE_RUNNING)
12819
e28849cfac27 removed status in debug_msg as it is nonsens anyway.
joyping
parents: 12811
diff changeset
1077 mp_msg(MSGT_AO,MSGL_V,"alsa-space: free space = %i, %s --\n", ret, str_status);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1078
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1079 if (ret < 0) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1080 mp_msg(MSGT_AO,MSGL_ERR,"negative value!!\n");
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1081 ret = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1082 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1083
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1084 // workaround for too small value returned
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1085 if (ret < MIN_CHUNK_SIZE)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1086 ret = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1087
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1088 return(ret);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1089 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1090
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1091 /* delay in seconds between first and last sample in buffer */
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1092 static float get_delay()
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1093 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1094
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1095 if (alsa_handler) {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1096
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1097 snd_pcm_status_t *status;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1098 float ret;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1099
12747
60c75c601bf1 string, alloca etc. fixes
joyping
parents: 12570
diff changeset
1100 snd_pcm_status_alloca(&status);
12465
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1101
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1102 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1103 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1104 mp_msg(MSGT_AO,MSGL_ERR,"alsa-delay: cannot get pcm status: %s\n", snd_strerror(ret));
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1105 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1106
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1107 switch(snd_pcm_status_get_state(status))
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1108 {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1109 case SND_PCM_STATE_OPEN:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1110 case SND_PCM_STATE_PREPARED:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1111 case SND_PCM_STATE_RUNNING:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1112 ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1113 break;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1114 default:
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1115 ret = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1116 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1117
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1118
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1119 if (ret < 0)
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1120 ret = 0;
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1121 return(ret);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1122
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1123 } else {
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1124 return(0);
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1125 }
dea4857df1c6 alsa9/1.x merge, now with api_compat-definition
joyping
parents:
diff changeset
1126 }