annotate libao2/ao_alsa9.c @ 13249:a6642a4330fa

ensure that avi files have a valid header as soon as possible. without this, the header says 0x0 video size, which works with mplayer when the video size is stored in the codec data, but it does NOT work with other players or with codecs that don't store size (e.g. snow). actually i don't like having seeks in the muxer module, but i don't know any other way to implement this fix without major changes to mencoder. if you have a better fix, please reverse this and commit yours.
author rfelker
date Sun, 05 Sep 2004 16:51:15 +0000
parents 99798c3cdb93
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1 /*
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
2 ao_alsa9 - ALSA-0.9.x output plugin for MPlayer
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
3
10366
faa09ea4ed6d removing my (non-working) email address
alex
parents: 10258
diff changeset
4 (C) Alex Beregszaszi
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
5
7077
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
6 modified for real alsa-0.9.0-support by Joy Winter <joy@pingfm.org>
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
7 additional AC3 passthrough support by Andy Lo A Foe <andy@alsaplayer.org>
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
8 08/22/2002 iec958-init rewritten and merged with common init, joy
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
9
7077
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
10 Any bugreports regarding to this driver are welcome.
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
11 */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
12
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
13 #include <errno.h>
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
14 #include <sys/time.h>
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
15 #include <stdlib.h>
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
16 #include <math.h>
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
17 #include <string.h>
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
18 #include <sys/poll.h>
5855
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
19
5857
d9641a4e7dbb 10l pl =)
atmos4
parents: 5855
diff changeset
20 #include "../config.h"
11764
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
21 #include "../mixer.h"
5857
d9641a4e7dbb 10l pl =)
atmos4
parents: 5855
diff changeset
22
12096
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
23 #define ALSA_PCM_OLD_HW_PARAMS_API
5855
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
24 #include <alsa/asoundlib.h>
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
25
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
26 #include "audio_out.h"
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
27 #include "audio_out_internal.h"
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1050
diff changeset
28 #include "afmt.h"
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
29
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
30 extern int verbose;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
31
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
32 static ao_info_t info =
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
33 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
34 "ALSA-0.9.x audio output",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
35 "alsa9",
10366
faa09ea4ed6d removing my (non-working) email address
alex
parents: 10258
diff changeset
36 "Alex Beregszaszi, Joy Winter <joy@pingfm.org>",
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
37 "under developement"
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
38 };
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
39
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
40 LIBAO_EXTERN(alsa9)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
41
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
42 static snd_pcm_t *alsa_handler;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
43 static snd_pcm_format_t alsa_format;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
44 static snd_pcm_hw_params_t *alsa_hwparams;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
45 static snd_pcm_sw_params_t *alsa_swparams;
8036
de379e6d6ca9 warning fixes
henry
parents: 8027
diff changeset
46 static char *alsa_device;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
47
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
48 /* possible 4096, original 8192
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
49 * was only needed for calculating chunksize? */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
50 static int alsa_fragsize = 4096;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
51 /* 16 sets buffersize to 16 * chunksize is as default 1024
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
52 * which seems to be good avarge for most situations
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
53 * so buffersize is 16384 frames by default */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
54 static int alsa_fragcount = 16;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
55 static int chunk_size = 1024; //is alsa_fragsize / 4
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
56
8874
b8551709823d Workaround for returning very litte buffer space.
filon
parents: 8350
diff changeset
57 #define MIN_CHUNK_SIZE 1024
b8551709823d Workaround for returning very litte buffer space.
filon
parents: 8350
diff changeset
58
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
59 static size_t bits_per_sample, bytes_per_sample, bits_per_frame;
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
60 static size_t chunk_bytes;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
61
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
62 int ao_mmap = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
63 int ao_noblock = 0;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
64 int first = 1;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
65
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
66 static int open_mode;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
67 static int set_block_mode;
10514
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
68 static int alsa_can_pause = 0;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
69
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
70 #define ALSA_DEVICE_SIZE 48
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
71
12096
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
72 //#undef BUFFERTIME
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
73 //#undef SET_CHUNKSIZE
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
74 #undef USE_POLL
1128
d2dd25dd11bc Hacked it working, still needs fixings!
atmosfear
parents: 1115
diff changeset
75
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
76
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
77 /* to set/get/query special features/parameters */
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 9587
diff changeset
78 static int control(int cmd, void *arg)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
79 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
80 switch(cmd) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
81 case AOCONTROL_QUERY_FORMAT:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
82 return CONTROL_TRUE;
10659
alex
parents: 10623
diff changeset
83 #ifndef WORDS_BIGENDIAN
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
84 case AOCONTROL_GET_VOLUME:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
85 case AOCONTROL_SET_VOLUME:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
86 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
87 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
88
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
89 int err;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
90 snd_mixer_t *handle;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
91 snd_mixer_elem_t *elem;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
92 snd_mixer_selem_id_t *sid;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
93
12086
74df39a4596f 10l (some broken compilers take this serious)
alex
parents: 12003
diff changeset
94 static char *mix_name = NULL;
11764
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
95 static char *card = NULL;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
96
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
97 long pmin, pmax;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
98 long get_vol, set_vol;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
99 float calc_vol, diff, f_multi;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
100
11764
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
101 if(mix_name == NULL){
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
102 if(mixer_device) {
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
103 card = strdup(mixer_device);
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
104 mix_name = strchr(card, '/');
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
105 if(mix_name) {
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
106 *mix_name++ = 0;
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
107 } else {
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
108 mix_name = "PCM";
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
109 }
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
110 } else {
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
111 mix_name = "PCM";
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
112 card = "default";
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
113 }
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
114 }
129caea8bebc use -mixer with alsa9
attila
parents: 11000
diff changeset
115
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
116 if(ao_data.format == AFMT_AC3)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
117 return CONTROL_TRUE;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
118
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
119 //allocate simple id
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
120 snd_mixer_selem_id_alloca(&sid);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
121
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
122 //sets simple-mixer index and name
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
123 snd_mixer_selem_id_set_index(sid, 0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
124 snd_mixer_selem_id_set_name(sid, mix_name);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
125
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
126 if ((err = snd_mixer_open(&handle, 0)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
127 printf("alsa-control: mixer open error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
128 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
129 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
130
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
131 if ((err = snd_mixer_attach(handle, card)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
132 printf("alsa-control: mixer attach %s error: %s", card, snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
133 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
134 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
135 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
136
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
137 if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
138 printf("alsa-control: mixer register error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
139 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
140 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
141 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
142 err = snd_mixer_load(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
143 if (err < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
144 printf("alsa-control: mixer load error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
145 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
146 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
147 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
148
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
149 elem = snd_mixer_find_selem(handle, sid);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
150 if (!elem) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
151 printf("alsa-control: unable to find simple control '%s',%i\n", snd_mixer_selem_id_get_name(sid), snd_mixer_selem_id_get_index(sid));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
152 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
153 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
154 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
155
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
156 snd_mixer_selem_get_playback_volume_range(elem,&pmin,&pmax);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
157 f_multi = (100 / (float)pmax);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
158
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
159 if (cmd == AOCONTROL_SET_VOLUME) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
160
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
161 diff = (vol->left+vol->right) / 2;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
162 set_vol = rint(diff / f_multi);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
163
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
164 if (set_vol < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
165 set_vol = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
166 else if (set_vol > pmax)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
167 set_vol = pmax;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
168
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
169 //setting channels
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
170 if ((err = snd_mixer_selem_set_playback_volume(elem, 0, set_vol)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
171 printf("alsa-control: error setting left channel, %s",snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
172 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
173 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
174 if ((err = snd_mixer_selem_set_playback_volume(elem, 1, set_vol)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
175 printf("alsa-control: error setting right channel, %s",snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
176 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
177 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
178
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
179 //printf("diff=%f, set_vol=%i, pmax=%i, mult=%f\n", diff, set_vol, pmax, f_multi);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
180 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
181 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
182 snd_mixer_selem_get_playback_volume(elem, 0, &get_vol);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
183 calc_vol = get_vol;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
184 calc_vol = rintf(calc_vol * f_multi);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
185
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
186 vol->left = vol->right = (int)calc_vol;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
187
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
188 //printf("get_vol = %i, calc=%i\n",get_vol, calc_vol);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
189 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
190 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
191 return CONTROL_OK;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
192 }
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
193 #endif
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
194
10659
alex
parents: 10623
diff changeset
195 } //end switch
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
196 return(CONTROL_UNKNOWN);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
197 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
198
1128
d2dd25dd11bc Hacked it working, still needs fixings!
atmosfear
parents: 1115
diff changeset
199
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
200 /*
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
201 open & setup audio device
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
202 return: 1=success 0=fail
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
203 */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
204 static int init(int rate_hz, int channels, int format, int flags)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
205 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
206 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
207 int cards = -1;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
208 int period_val;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
209 snd_pcm_info_t *alsa_info;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
210 char *str_block_mode;
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
211 int device_set = 0;
10623
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
212
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
213 printf("alsa-init: requested format: %d Hz, %d channels, %s\n", rate_hz,
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
214 channels, audio_out_format_name(format));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
215
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
216 alsa_handler = NULL;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
217
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
218 if (verbose>0)
2059
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
219 printf("alsa-init: compiled for ALSA-%s\n", SND_LIB_VERSION_STR);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
220
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
221 if ((err = snd_card_next(&cards)) < 0 || cards < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
222 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
223 printf("alsa-init: no soundcards found: %s\n", snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
224 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
225 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
226
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
227 ao_data.samplerate = rate_hz;
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
228 ao_data.bps = channels * rate_hz;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
229 ao_data.format = format;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
230 ao_data.channels = channels;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
231 ao_data.outburst = OUTBURST;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
232 //ao_data.buffersize = MAX_OUTBURST; // was 16384
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
233
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
234 switch (format)
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
235 {
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
236 case AFMT_S8:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
237 alsa_format = SND_PCM_FORMAT_S8;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
238 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
239 case AFMT_U8:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
240 alsa_format = SND_PCM_FORMAT_U8;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
241 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
242 case AFMT_U16_LE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
243 alsa_format = SND_PCM_FORMAT_U16_LE;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
244 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
245 case AFMT_U16_BE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
246 alsa_format = SND_PCM_FORMAT_U16_BE;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
247 break;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
248 #ifndef WORDS_BIGENDIAN
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
249 case AFMT_AC3:
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
250 #endif
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
251 case AFMT_S16_LE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
252 alsa_format = SND_PCM_FORMAT_S16_LE;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
253 break;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
254 #ifdef WORDS_BIGENDIAN
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
255 case AFMT_AC3:
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
256 #endif
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
257 case AFMT_S16_BE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
258 alsa_format = SND_PCM_FORMAT_S16_BE;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
259 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
260 case AFMT_S32_LE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
261 alsa_format = SND_PCM_FORMAT_S32_LE;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
262 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
263 case AFMT_S32_BE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
264 alsa_format = SND_PCM_FORMAT_S32_BE;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
265 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
266
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
267 default:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
268 alsa_format = SND_PCM_FORMAT_MPEG;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
269 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
270 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
271
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
272 switch(alsa_format)
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
273 {
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
274 case SND_PCM_FORMAT_S16_LE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
275 case SND_PCM_FORMAT_U16_LE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
276 ao_data.bps *= 2;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
277 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
278 case SND_PCM_FORMAT_S32_LE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
279 case SND_PCM_FORMAT_S32_BE:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
280 ao_data.bps *= 4;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
281 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
282 case -1:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
283 printf("alsa-init: invalid format (%s) requested - output disabled\n",
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
284 audio_out_format_name(format));
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
285 return(0);
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
286 default:
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
287 break;
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
288 }
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
289
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
290 if (ao_subdevice) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
291 //start parsing ao_subdevice, ugly and not thread safe!
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
292 //maybe there's a better way?
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
293 int i2 = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
294 int i3 = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
295 char *sub_str;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
296
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
297 char *token_str[3];
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
298 char* test_str = strdup(ao_subdevice);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
299
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
300
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
301 if ((strcspn(ao_subdevice, ":")) > 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
302
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
303 sub_str = strtok(test_str, ":");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
304 *(token_str) = sub_str;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
305
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
306 while (((sub_str = strtok(NULL, ":")) != NULL) && (i2 <= 3)) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
307 *(token_str+i2) = sub_str;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
308 i2 += 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
309 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
310
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
311 for (i3=0; i3 <= i2-1; i3++) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
312 if (strcmp(*(token_str + i3), "mmap") == 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
313 ao_mmap = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
314 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
315 else if (strcmp(*(token_str+i3), "noblock") == 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
316 ao_noblock = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
317 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
318 else if (strcmp(*(token_str+i3), "hw") == 0) {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
319 if ((i3 < i2-1) && (strcmp(*(token_str+i3+1), "noblock") != 0) && (strcmp(*(token_str+i3+1), "mmap") != 0)) {
10258
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
320 char *tmp;
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
321
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
322 alsa_device = alloca(ALSA_DEVICE_SIZE);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
323 snprintf(alsa_device, ALSA_DEVICE_SIZE, "hw:%s", *(token_str+(i3+1)));
10258
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
324 if ((tmp = strrchr(alsa_device, '.')) && isdigit(*(tmp+1)))
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
325 *tmp = ',';
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
326 device_set = 1;
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
327 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
328 else {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
329 alsa_device = *(token_str+i3);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
330 device_set = 1;
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
331 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
332 }
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
333 else if (device_set == 0 && (!ao_mmap || !ao_noblock)) {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
334 alsa_device = *(token_str+i3);
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
335 device_set = 1;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
336 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
337 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
338 }
10623
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
339 } else { //end parsing ao_subdevice
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
340 /* in any case for multichannel playback we should select
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
341 * appropriate device
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
342 */
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
343 char devstr[128];
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
344
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
345 switch (channels) {
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
346 case 4:
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
347 strcpy(devstr, "surround40");
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
348 alsa_device = devstr;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
349 break;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
350 case 6:
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
351 strcpy(devstr, "surround51");
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
352 alsa_device = devstr;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
353 break;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
354 default:
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
355 }
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
356 }
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
357
1207
bf18175dfad7 ao_subdevice support added
al3x
parents: 1180
diff changeset
358
7077
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
359 /* switch for spdif
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
360 * sets opening sequence for SPDIF
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
361 * sets also the playback and other switches 'on the fly'
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
362 * while opening the abstract alias for the spdif subdevice
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
363 * 'iec958'
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
364 */
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
365 if (format == AFMT_AC3) {
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
366 char devstr[128];
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
367 unsigned char s[4];
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
368 int err, c;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
369
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
370 switch (channels) {
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
371 case 1:
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
372 case 2:
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
373
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
374 s[0] = IEC958_AES0_NONAUDIO |
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
375 IEC958_AES0_CON_EMPHASIS_NONE;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
376 s[1] = IEC958_AES1_CON_ORIGINAL |
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
377 IEC958_AES1_CON_PCM_CODER;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
378 s[2] = 0;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
379 s[3] = IEC958_AES3_CON_FS_48000;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
380
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
381 sprintf(devstr, "iec958:AES0=0x%x,AES1=0x%x,AES2=0x%x,AES3=0x%x",
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
382 s[0], s[1], s[2], s[3]);
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
383
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
384 if (verbose>0)
7077
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
385 printf("alsa-spdif-init: playing AC3, %i channels\n", channels);
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
386 break;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
387 case 4:
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
388 strcpy(devstr, "surround40");
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
389 break;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
390
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
391 case 6:
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
392 strcpy(devstr, "surround51");
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
393 break;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
394
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
395 default:
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
396 fprintf(stderr, "%d channels are not supported\n", channels);
10659
alex
parents: 10623
diff changeset
397 return(0);
7077
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
398 }
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
399
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
400 alsa_device = devstr;
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
401 }
a24f91c247cd iec958-init completly rewritten
joyping
parents: 7050
diff changeset
402
1146
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
403 if (alsa_device == NULL)
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
404 {
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
405 int tmp_device, tmp_subdevice, err;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
406
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
407 if ((err = snd_pcm_info_malloc(&alsa_info)) < 0)
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
408 {
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
409 printf("alsa-init: memory allocation error: %s\n", snd_strerror(err));
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
410 return(0);
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
411 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
412
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
413 if ((alsa_device = alloca(ALSA_DEVICE_SIZE)) == NULL)
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
414 {
1146
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
415 printf("alsa-init: memory allocation error: %s\n", strerror(errno));
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
416 return(0);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
417 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
418
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
419 if ((tmp_device = snd_pcm_info_get_device(alsa_info)) < 0)
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
420 {
11000
6e35326c742f many small typo and grammar fixes
gabucino
parents: 10898
diff changeset
421 printf("alsa-init: can't get device\n");
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
422 return(0);
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
423 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
424
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
425 if ((tmp_subdevice = snd_pcm_info_get_subdevice(alsa_info)) < 0)
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
426 {
11000
6e35326c742f many small typo and grammar fixes
gabucino
parents: 10898
diff changeset
427 printf("alsa-init: can't get subdevice\n");
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
428 return(0);
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
429 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
430
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
431 if (verbose>0)
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
432 printf("alsa-init: got device=%i, subdevice=%i\n", tmp_device, tmp_subdevice);
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
433
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
434 if ((err = snprintf(alsa_device, ALSA_DEVICE_SIZE, "hw:%1d,%1d", tmp_device, tmp_subdevice)) <= 0)
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
435 {
11000
6e35326c742f many small typo and grammar fixes
gabucino
parents: 10898
diff changeset
436 printf("alsa-init: can't write device-id\n");
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
437 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
438
1146
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
439 snd_pcm_info_free(alsa_info);
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
440 printf("alsa-init: %d soundcard%s found, using: %s\n", cards+1,
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
441 (cards >= 0) ? "" : "s", alsa_device);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
442 } else if (strcmp(alsa_device, "help") == 0) {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
443 printf("alsa-help: available options are:\n");
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
444 printf(" mmap: sets mmap-mode\n");
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
445 printf(" noblock: sets noblock-mode\n");
10258
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
446 printf(" device-name: sets device name (change comma to point)\n");
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
447 printf(" example -ao alsa9:mmap:noblock:hw:0.3 sets noblock-mode,\n");
d9371eecb619 -ao alsa9:hw:0,0 fix by Wojtek Kaniewski <wojtekka@bydg.pdi.net>
alex
parents: 9633
diff changeset
448 printf(" mmap-mode and the device-name as first card fourth device\n");
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
449 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
450 } else {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
451 printf("alsa-init: soundcard set to %s\n", alsa_device);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
452 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
453
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
454 //setting modes for block or nonblock-mode
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
455 if (ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
456 open_mode = SND_PCM_NONBLOCK;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
457 set_block_mode = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
458 str_block_mode = "nonblock-mode";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
459 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
460 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
461 open_mode = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
462 set_block_mode = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
463 str_block_mode = "block-mode";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
464 }
7050
a5b2b377ab50 changed spdif default from "hw:0,2" to general alias "iec958"
joyping
parents: 6749
diff changeset
465
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
466 //sets buff/chunksize if its set manually
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
467 if (ao_data.buffersize) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
468 switch (ao_data.buffersize)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
469 {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
470 case 1:
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
471 alsa_fragcount = 16;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
472 chunk_size = 512;
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
473 if (verbose>0) {
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
474 printf("alsa-init: buffersize set manually to 8192\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
475 printf("alsa-init: chunksize set manually to 512\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
476 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
477 break;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
478 case 2:
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
479 alsa_fragcount = 8;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
480 chunk_size = 1024;
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
481 if (verbose>0) {
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
482 printf("alsa-init: buffersize set manually to 8192\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
483 printf("alsa-init: chunksize set manually to 1024\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
484 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
485 break;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
486 case 3:
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
487 alsa_fragcount = 32;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
488 chunk_size = 512;
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
489 if (verbose>0) {
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
490 printf("alsa-init: buffersize set manually to 16384\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
491 printf("alsa-init: chunksize set manually to 512\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
492 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
493 break;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
494 case 4:
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
495 alsa_fragcount = 16;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
496 chunk_size = 1024;
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
497 if (verbose>0) {
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
498 printf("alsa-init: buffersize set manually to 16384\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
499 printf("alsa-init: chunksize set manually to 1024\n");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
500 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
501 break;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
502 default:
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
503 alsa_fragcount = 16;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
504 if (ao_mmap)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
505 chunk_size = 512;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
506 else
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
507 chunk_size = 1024;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
508 break;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
509 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
510 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
511
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
512 if (!alsa_handler) {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
513 //modes = 0, SND_PCM_NONBLOCK, SND_PCM_ASYNC
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
514 if ((err = snd_pcm_open(&alsa_handler, alsa_device, SND_PCM_STREAM_PLAYBACK, open_mode)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
515 {
10898
716edc005b18 patch from Pierre Lombard <p_l@gmx.fr>
attila
parents: 10659
diff changeset
516 if (err != -EBUSY && ao_noblock) {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
517 printf("alsa-init: open in nonblock-mode failed, trying to open in block-mode\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
518 if ((err = snd_pcm_open(&alsa_handler, alsa_device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
519 printf("alsa-init: playback open error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
520 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
521 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
522 set_block_mode = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
523 str_block_mode = "block-mode";
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
524 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
525 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
526 printf("alsa-init: playback open error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
527 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
528 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
529 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
530
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
531 if ((err = snd_pcm_nonblock(alsa_handler, set_block_mode)) < 0) {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
532 printf("alsa-init: error set block-mode %s\n", snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
533 }
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
534 else if (verbose>0) {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
535 printf("alsa-init: pcm opend in %s\n", str_block_mode);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
536 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
537
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
538 snd_pcm_hw_params_alloca(&alsa_hwparams);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
539 snd_pcm_sw_params_alloca(&alsa_swparams);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
540
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
541 // setting hw-parameters
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
542 if ((err = snd_pcm_hw_params_any(alsa_handler, alsa_hwparams)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
543 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
544 printf("alsa-init: unable to get initial parameters: %s\n",
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
545 snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
546 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
547 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
548
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
549 if (ao_mmap) {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
550 snd_pcm_access_mask_t *mask = alloca(snd_pcm_access_mask_sizeof());
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
551 snd_pcm_access_mask_none(mask);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
552 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
553 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
554 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
555 err = snd_pcm_hw_params_set_access_mask(alsa_handler, alsa_hwparams, mask);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
556 printf("alsa-init: mmap set\n");
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
557 } else {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
558 err = snd_pcm_hw_params_set_access(alsa_handler, alsa_hwparams,SND_PCM_ACCESS_RW_INTERLEAVED);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
559 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
560 if (err < 0) {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
561 printf("alsa-init: unable to set access type: %s\n", snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
562 return (0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
563 }
10623
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
564
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
565 /* workaround for nonsupported formats
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
566 sets default format to S16_LE if the given formats aren't supported */
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
567 if ((err = snd_pcm_hw_params_test_format(alsa_handler, alsa_hwparams,
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
568 alsa_format)) < 0)
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
569 {
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
570 printf("alsa-init: format %s are not supported by hardware, trying default\n",
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
571 audio_out_format_name(format));
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
572 alsa_format = SND_PCM_FORMAT_S16_LE;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
573 ao_data.format = AFMT_S16_LE;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
574 ao_data.bps = channels * rate_hz * 2;
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
575 }
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
576
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
577 bytes_per_sample = ao_data.bps / ao_data.samplerate; //it should be here
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
578
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
579
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
580 if ((err = snd_pcm_hw_params_set_format(alsa_handler, alsa_hwparams,
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
581 alsa_format)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
582 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
583 printf("alsa-init: unable to set format: %s\n",
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
584 snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
585 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
586 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
587
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
588 if ((err = snd_pcm_hw_params_set_channels(alsa_handler, alsa_hwparams,
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
589 ao_data.channels)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
590 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
591 printf("alsa-init: unable to set channels: %s\n",
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
592 snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
593 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
594 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
595
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
596 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams, ao_data.samplerate, 0)) < 0)
2059
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
597 {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
598 printf("alsa-init: unable to set samplerate-2: %s\n",
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
599 snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
600 return(0);
2059
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
601 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
602
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
603 #ifdef BUFFERTIME
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
604 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
605 int alsa_buffer_time = 500000; /* original 60 */
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
606
2059
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
607 if ((err = snd_pcm_hw_params_set_buffer_time_near(alsa_handler, alsa_hwparams, alsa_buffer_time, 0)) < 0)
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
608 {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
609 printf("alsa-init: unable to set buffer time near: %s\n",
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
610 snd_strerror(err));
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
611 return(0);
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
612 } else
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
613 alsa_buffer_time = err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
614
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
615 if ((err = snd_pcm_hw_params_set_period_time_near(alsa_handler, alsa_hwparams, alsa_buffer_time/4, 0)) < 0)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
616 /* original: alsa_buffer_time/ao_data.bps */
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
617 {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
618 printf("alsa-init: unable to set period time: %s\n",
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
619 snd_strerror(err));
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
620 return(0);
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
621 }
12109
b888e3fd8cc8 - compilation error fix
rathann
parents: 12096
diff changeset
622 // if (verbose>0)
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
623 printf("alsa-init: buffer_time: %d, period_time :%d\n",alsa_buffer_time, err);
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
624 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
625 #endif
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
626
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
627 #ifdef SET_CHUNKSIZE
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
628 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
629 //set chunksize
12003
48f1b211f43b replace set_periods and set_period_size with their _near cousins
henry
parents: 11764
diff changeset
630 if ((err = snd_pcm_hw_params_set_period_size_near(alsa_handler, alsa_hwparams, chunk_size, 0)) < 0)
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
631 {
12096
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
632 printf("alsa-init: unable to set periodsize(%d): %s\n",
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
633 chunk_size, snd_strerror(err));
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
634 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
635 }
12096
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
636 else // if (verbose>0) {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
637 printf("alsa-init: chunksize set to %i\n", chunk_size);
12096
54514e4733a1 ALSA syc is not so good as OSS - small corrections
atlka
parents: 12086
diff changeset
638 // }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
639
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
640 //set period_count
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
641 if ((period_val = snd_pcm_hw_params_get_periods_max(alsa_hwparams, 0)) < alsa_fragcount) {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
642 alsa_fragcount = period_val;
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
643 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
644
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
645 if (verbose>0)
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
646 printf("alsa-init: current val=%i, fragcount=%i\n", period_val, alsa_fragcount);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
647
12003
48f1b211f43b replace set_periods and set_period_size with their _near cousins
henry
parents: 11764
diff changeset
648 if ((err = snd_pcm_hw_params_set_periods_near(alsa_handler, alsa_hwparams, alsa_fragcount, 0)) < 0) {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
649 printf("alsa-init: unable to set periods: %s\n", snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
650 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
651 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
652 #endif
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
653
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
654 /* finally install hardware parameters */
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
655 if ((err = snd_pcm_hw_params(alsa_handler, alsa_hwparams)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
656 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
657 printf("alsa-init: unable to set hw-parameters: %s\n",
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
658 snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
659 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
660 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
661 // end setting hw-params
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
662
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
663
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
664 // gets buffersize for control
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
665 if ((err = snd_pcm_hw_params_get_buffer_size(alsa_hwparams)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
666 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
667 printf("alsa-init: unable to get buffersize: %s\n", snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
668 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
669 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
670 else {
8350
9e045c59ffb8 OK, I think I found why the alsa9 driver was breaking surround sound.
arpi
parents: 8346
diff changeset
671 ao_data.buffersize = err * bytes_per_sample;
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
672 if (verbose>0)
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
673 printf("alsa-init: got buffersize=%i\n", ao_data.buffersize);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
674 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
675
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
676 // setting sw-params (only avail-min) if noblocking mode was choosed
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
677 if (ao_noblock)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
678 {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
679
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
680 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
681 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
682 printf("alsa-init: unable to get parameters: %s\n",snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
683 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
684 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
685
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
686 //set min available frames to consider pcm ready (4)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
687 //increased for nonblock-mode should be set dynamically later
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
688 if ((err = snd_pcm_sw_params_set_avail_min(alsa_handler, alsa_swparams, 4)) < 0)
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
689 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
690 printf("alsa-init: unable to set avail_min %s\n",snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
691 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
692 }
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
693
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
694 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
695 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
696 printf("alsa-init: unable to install sw-params\n");
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
697 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
698 }
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
699
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
700 bits_per_sample = snd_pcm_format_physical_width(alsa_format);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
701 bits_per_frame = bits_per_sample * channels;
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
702 chunk_bytes = chunk_size * bits_per_frame / 8;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
703
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
704 if (verbose>0) {
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
705 printf("alsa-init: bits per sample (bps)=%i, bits per frame (bpf)=%i, chunk_bytes=%i\n",bits_per_sample,bits_per_frame,chunk_bytes);}
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
706
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
707 }//end swparams
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
708
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
709 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
710 {
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
711 printf("alsa-init: pcm prepare error: %s\n", snd_strerror(err));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
712 return(0);
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
713 }
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
714
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
715 printf("alsa9: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n",
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
716 ao_data.samplerate, ao_data.channels, bytes_per_sample, ao_data.buffersize,
6702
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
717 snd_pcm_format_description(alsa_format));
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
718
df3bf0f971d1 fixed spdif
joyping
parents: 6633
diff changeset
719 } // end switch alsa_handler (spdif)
10514
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
720 alsa_can_pause = snd_pcm_hw_params_can_pause(alsa_hwparams);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
721 return(1);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
722 } // end init
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
723
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
724
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
725 /* close audio device */
12145
99798c3cdb93 uninit immed flag
alex
parents: 12109
diff changeset
726 static void uninit(int immed)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
727 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
728
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
729 if (alsa_handler) {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
730 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
731
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
732 if (!ao_noblock) {
10514
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
733 if ((err = snd_pcm_drop(alsa_handler)) < 0)
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
734 {
10514
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
735 printf("alsa-uninit: pcm drop error: %s\n", snd_strerror(err));
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
736 return;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
737 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
738 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
739
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
740 if ((err = snd_pcm_close(alsa_handler)) < 0)
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
741 {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
742 printf("alsa-uninit: pcm close error: %s\n", snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
743 return;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
744 }
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
745 else {
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
746 alsa_handler = NULL;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
747 alsa_device = NULL;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
748 printf("alsa-uninit: pcm closed\n");
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
749 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
750 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
751 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
752 printf("alsa-uninit: no handler defined!\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
753 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
754 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
755
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
756 static void audio_pause()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
757 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
758 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
759
10514
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
760 if (alsa_can_pause) {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
761 if ((err = snd_pcm_pause(alsa_handler, 1)) < 0)
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
762 {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
763 printf("alsa-pause: pcm pause error: %s\n", snd_strerror(err));
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
764 return;
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
765 }
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
766 if (verbose)
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
767 printf("alsa-pause: pause supported by hardware\n");
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
768 } else {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
769 if ((err = snd_pcm_drop(alsa_handler)) < 0)
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
770 {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
771 printf("alsa-pause: pcm drop error: %s\n", snd_strerror(err));
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
772 return;
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
773 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
774 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
775 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
776
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
777 static void audio_resume()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
778 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
779 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
780
10514
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
781 if (alsa_can_pause) {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
782 if ((err = snd_pcm_pause(alsa_handler, 0)) < 0)
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
783 {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
784 printf("alsa-resume: pcm resume error: %s\n", snd_strerror(err));
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
785 return;
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
786 }
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
787 if (verbose)
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
788 printf("alsa-resume: resume supported by hardware\n");
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
789 } else {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
790 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
791 {
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
792 printf("alsa-resume: pcm prepare error: %s\n", snd_strerror(err));
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
793 return;
760e12774430 better pause mechanism and faster uninit support by Vladimir I. Umnov <uvi@ezmail.ru>
alex
parents: 10366
diff changeset
794 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
795 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
796 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
797
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
798 /* stop playing and empty buffers (for seeking/pause) */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
799 static void reset()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
800 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
801 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
802
9587
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
803 if ((err = snd_pcm_drop(alsa_handler)) < 0)
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
804 {
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
805 printf("alsa-reset: pcm drop error: %s\n", snd_strerror(err));
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
806 return;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
807 }
9587
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
808 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
809 {
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
810 printf("alsa-reset: pcm prepare error: %s\n", snd_strerror(err));
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
811 return;
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
812 }
f023b30c80e5 replace snd_pcm_drain with snd_pcm_drop
henry
parents: 8874
diff changeset
813 return;
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
814 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
815
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
816 #ifdef USE_POLL
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
817 static int wait_for_poll(snd_pcm_t *handle, struct pollfd *ufds, unsigned int count)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
818 {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
819 unsigned short revents;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
820
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
821 while (1) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
822 poll(ufds, count, -1);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
823 snd_pcm_poll_descriptors_revents(handle, ufds, count, &revents);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
824 if (revents & POLLERR)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
825 return -EIO;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
826 if (revents & POLLOUT)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
827 return 0;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
828 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
829 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
830 #endif
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
831
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
832 #ifndef timersub
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
833 #define timersub(a, b, result) \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
834 do { \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
835 (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
836 (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
837 if ((result)->tv_usec < 0) { \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
838 --(result)->tv_sec; \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
839 (result)->tv_usec += 1000000; \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
840 } \
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
841 } while (0)
1129
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
842 #endif
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
843
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
844 /* I/O error handler */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
845 static int xrun(u_char *str_mode)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
846 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
847 int err;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
848 snd_pcm_status_t *status;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
849
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
850 snd_pcm_status_alloca(&status);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
851
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
852 if ((err = snd_pcm_status(alsa_handler, status))<0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
853 printf("status error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
854 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
855 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
856
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
857 if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
858 struct timeval now, diff, tstamp;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
859 gettimeofday(&now, 0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
860 snd_pcm_status_get_trigger_tstamp(status, &tstamp);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
861 timersub(&now, &tstamp, &diff);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
862 printf("alsa-%s: xrun of at least %.3f msecs. resetting stream\n",
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
863 str_mode,
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
864 diff.tv_sec * 1000 + diff.tv_usec / 1000.0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
865 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
866
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
867 if ((err = snd_pcm_prepare(alsa_handler))<0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
868 printf("xrun: prepare error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
869 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
870 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
871
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
872 return(1); /* ok, data should be accepted again */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
873 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
874
8036
de379e6d6ca9 warning fixes
henry
parents: 8027
diff changeset
875 static int play_normal(void* data, int len);
de379e6d6ca9 warning fixes
henry
parents: 8027
diff changeset
876 static int play_mmap(void* data, int len);
de379e6d6ca9 warning fixes
henry
parents: 8027
diff changeset
877
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
878 static int play(void* data, int len, int flags)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
879 {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
880 int result;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
881 if (ao_mmap)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
882 result = play_mmap(data, len);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
883 else
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
884 result = play_normal(data, len);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
885
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
886 return result;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
887 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
888
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
889 /*
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
890 plays 'len' bytes of 'data'
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
891 returns: number of bytes played
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
892 modified last at 29.06.02 by jp
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
893 thanxs for marius <marius@rospot.com> for giving us the light ;)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
894 */
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
895
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
896 static int play_normal(void* data, int len)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
897 {
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
898
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
899 //bytes_per_sample is always 4 for 2 chn S16_LE
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
900 int num_frames = len / bytes_per_sample;
8346
368019e0153a The enclosed patch should fix problems associated with playing 8-bit wide
arpi
parents: 8036
diff changeset
901 char *output_samples = (char *)data;
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
902 snd_pcm_sframes_t res = 0;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
903
8346
368019e0153a The enclosed patch should fix problems associated with playing 8-bit wide
arpi
parents: 8036
diff changeset
904 //fprintf(stderr,"alsa-play: frames=%i, len=%i\n",num_frames,len);
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
905
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
906 if (!alsa_handler) {
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
907 printf("alsa-play: device configuration error");
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
908 return 0;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
909 }
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
910
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
911 while (num_frames > 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
912
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
913 res = snd_pcm_writei(alsa_handler, (void *)output_samples, num_frames);
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
914
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
915 if (res == -EAGAIN) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
916 snd_pcm_wait(alsa_handler, 1000);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
917 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
918 else if (res == -EPIPE) { /* underrun */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
919 if (xrun("play") <= 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
920 printf("alsa-play: xrun reset error");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
921 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
922 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
923 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
924 else if (res == -ESTRPIPE) { /* suspend */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
925 printf("alsa-play: pcm in suspend mode. trying to resume\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
926 while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
927 sleep(1);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
928 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
929 else if (res < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
930 printf("alsa-play: unknown status, trying to reset soundcard\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
931 if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
932 printf("alsa-play: snd prepare error");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
933 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
934 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
935 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
936 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
937
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
938 if (res > 0) {
8346
368019e0153a The enclosed patch should fix problems associated with playing 8-bit wide
arpi
parents: 8036
diff changeset
939
368019e0153a The enclosed patch should fix problems associated with playing 8-bit wide
arpi
parents: 8036
diff changeset
940 /* output_samples += ao_data.channels * res; */
368019e0153a The enclosed patch should fix problems associated with playing 8-bit wide
arpi
parents: 8036
diff changeset
941 output_samples += res * bytes_per_sample;
368019e0153a The enclosed patch should fix problems associated with playing 8-bit wide
arpi
parents: 8036
diff changeset
942
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
943 num_frames -= res;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
944 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
945
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
946 } //end while
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
947
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
948 if (res < 0) {
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
949 printf("alsa-play: write error %s", snd_strerror(res));
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
950 return 0;
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
951 }
10623
abdb28a904c8 no channels moving, autosubdievice, nonsupported fix by Vladimir I. Umnov <uvi@ezmail.ru>, removed braindeaded startup message
joyping
parents: 10605
diff changeset
952 return res < 0 ? (int)res : len - len % bytes_per_sample;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
953 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
954
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
955 /* mmap-mode mainly based on descriptions by Joshua Haberman <joshua@haberman.com>
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
956 * 'An overview of the ALSA API' http://people.debian.org/~joshua/x66.html
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
957 * and some help by Paul Davis <pbd@op.net> */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
958
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
959 static int play_mmap(void* data, int len)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
960 {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
961 snd_pcm_sframes_t commitres, frames_available;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
962 snd_pcm_uframes_t frames_transmit, size, offset;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
963 const snd_pcm_channel_area_t *area;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
964 void *outbuffer;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
965 int err, result;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
966
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
967 #ifdef USE_POLL //seems not really be needed
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
968 struct pollfd *ufds;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
969 int count;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
970
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
971 count = snd_pcm_poll_descriptors_count (alsa_handler);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
972 ufds = malloc(sizeof(struct pollfd) * count);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
973 snd_pcm_poll_descriptors(alsa_handler, ufds, count);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
974
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
975 //first wait_for_poll
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
976 if (err = (wait_for_poll(alsa_handler, ufds, count) < 0)) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
977 if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_XRUN ||
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
978 snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
979 xrun("play");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
980 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
981 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
982 #endif
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
983
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
984 outbuffer = alloca(ao_data.buffersize);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
985
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
986 //don't trust get_space() ;)
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
987 frames_available = snd_pcm_avail_update(alsa_handler) * bytes_per_sample;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
988 if (frames_available < 0)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
989 xrun("play");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
990
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
991 if (frames_available < 4) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
992 if (first) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
993 first = 0;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
994 snd_pcm_start(alsa_handler);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
995 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
996 else { //FIXME should break and return 0?
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
997 snd_pcm_wait(alsa_handler, -1);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
998 first = 1;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
999 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1000 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1001
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1002 /* len is simply the available bufferspace got by get_space()
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1003 * but real avail_buffer in frames is ab/bytes_per_sample */
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1004 size = len / bytes_per_sample;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1005
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1006 //if (verbose)
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1007 //printf("len: %i size %i, f_avail %i, bps %i ...\n", len, size, frames_available, bytes_per_sample);
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1008
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1009 frames_transmit = size;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1010
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1011 /* prepare areas and set sw-pointers
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1012 * frames_transmit returns the real available buffer-size
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1013 * sometimes != frames_available cause of ringbuffer 'emulation' */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1014 snd_pcm_mmap_begin(alsa_handler, &area, &offset, &frames_transmit);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1015
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1016 /* this is specific to interleaved streams (or non-interleaved
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1017 * streams with only one channel) */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1018 outbuffer = ((char *) area->addr + (area->first + area->step * offset) / 8); //8
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1019
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1020 //write data
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1021 memcpy(outbuffer, data, (frames_transmit * bytes_per_sample));
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1022
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1023 commitres = snd_pcm_mmap_commit(alsa_handler, offset, frames_transmit);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1024
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1025 if (commitres < 0 || commitres != frames_transmit) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1026 if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_XRUN ||
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1027 snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1028 xrun("play");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1029 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1030 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1031
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1032 //if (verbose)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1033 //printf("mmap ft: %i, cres: %i\n", frames_transmit, commitres);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1034
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1035 /* err = snd_pcm_area_copy(&area, offset, &data, offset, len, alsa_format); */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1036 /* if (err < 0) { */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1037 /* printf("area-copy-error\n"); */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1038 /* return 0; */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1039 /* } */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1040
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1041
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1042 //calculate written frames!
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1043 result = commitres * bytes_per_sample;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1044
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1045
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1046 /* if (verbose) { */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1047 /* if (len == result) */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1048 /* printf("result: %i, frames written: %i ...\n", result, frames_transmit); */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1049 /* else */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1050 /* printf("result: %i, frames written: %i, result != len ...\n", result, frames_transmit); */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1051 /* } */
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1052
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1053 //mplayer doesn't like -result
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1054 if (result < 0)
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1055 result = 0;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1056
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1057 #ifdef USE_POLL
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1058 free(ufds);
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1059 #endif
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1060
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1061 return result;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1062 }
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1063
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1064 /* how many byes are free in the buffer */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1065 static int get_space()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1066 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1067 snd_pcm_status_t *status;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1068 int ret;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1069 char *str_status;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1070
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1071 //snd_pcm_sframes_t avail_frames = 0;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1072
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1073 if ((ret = snd_pcm_status_malloc(&status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1074 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1075 printf("alsa-space: memory allocation error: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1076 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1077 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1078
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1079 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1080 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1081 printf("alsa-space: cannot get pcm status: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1082 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1083 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1084
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1085 switch(snd_pcm_status_get_state(status))
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1086 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1087 case SND_PCM_STATE_OPEN:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1088 str_status = "open";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1089 case SND_PCM_STATE_PREPARED:
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1090 if (str_status != "open") {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1091 str_status = "prepared";
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1092 first = 1;
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1093 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1094 if (ret == 0) //ugly workaround for hang in mmap-mode
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1095 ret = 10;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1096 break;
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1097 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1098 case SND_PCM_STATE_RUNNING:
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1099 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1100 //avail_frames = snd_pcm_avail_update(alsa_handler) * bytes_per_sample;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1101 if (str_status != "open" && str_status != "prepared")
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1102 str_status = "running";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1103 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1104 case SND_PCM_STATE_PAUSED:
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
1105 if (verbose>0) printf("alsa-space: paused");
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1106 str_status = "paused";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1107 ret = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1108 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1109 case SND_PCM_STATE_XRUN:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1110 xrun("space");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1111 str_status = "xrun";
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1112 first = 1;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1113 ret = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1114 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1115 default:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1116 str_status = "undefined";
7657
dda97c5190d7 fixed ao_data.bps - patch by Tobias Diedrich <td@sim.uni-hannover.de>
arpi
parents: 7077
diff changeset
1117 ret = snd_pcm_status_get_avail(status) * bytes_per_sample;
6749
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1118 if (ret <= 0) {
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1119 xrun("space");
7f619a5d6eb8 added real mmap support
joyping
parents: 6702
diff changeset
1120 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1121 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1122
8027
b9da278e4c92 verbose can be negative
arpi
parents: 7657
diff changeset
1123 if (verbose>0 && str_status != "running")
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1124 printf("alsa-space: free space = %i, status=%i, %s --\n", ret, status, str_status);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1125 snd_pcm_status_free(status);
1129
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
1126
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1127 if (ret < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1128 printf("negative value!!\n");
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
1129 ret = 0;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1130 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1131
8874
b8551709823d Workaround for returning very litte buffer space.
filon
parents: 8350
diff changeset
1132 // workaround for too small value returned
b8551709823d Workaround for returning very litte buffer space.
filon
parents: 8350
diff changeset
1133 if (ret < MIN_CHUNK_SIZE)
b8551709823d Workaround for returning very litte buffer space.
filon
parents: 8350
diff changeset
1134 ret = 0;
b8551709823d Workaround for returning very litte buffer space.
filon
parents: 8350
diff changeset
1135
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1136 return(ret);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1137 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1138
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
1139 /* delay in seconds between first and last sample in buffer */
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
1140 static float get_delay()
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1141 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1142
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1143 if (alsa_handler) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1144
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1145 snd_pcm_status_t *status;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
1146 float ret;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1147
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1148 if ((ret = snd_pcm_status_malloc(&status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1149 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1150 printf("alsa-delay: memory allocation error: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1151 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1152 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1153
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1154 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1155 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1156 printf("alsa-delay: cannot get pcm status: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1157 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1158 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1159
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1160 switch(snd_pcm_status_get_state(status))
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1161 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1162 case SND_PCM_STATE_OPEN:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1163 case SND_PCM_STATE_PREPARED:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1164 case SND_PCM_STATE_RUNNING:
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
1165 ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1166 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1167 default:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1168 ret = 0;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1169 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1170
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1171 snd_pcm_status_free(status);
1129
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
1172
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
1173 if (ret < 0)
6589
1595ca898d3b cleanup and bufferhandling fix by Joy Ping <joy at pingfm.org>. Bufferhandling fix based on idea by Marius David <marius at rohost.com>
alex
parents: 6194
diff changeset
1174 ret = 0;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1175 return(ret);
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1176
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1177 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1178 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
1179 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
1180 }