annotate libao2/ao_alsa9.c @ 6633:769246a4eb41

cVS: --------------------------------------------------------------------- added get/set_sound controls stripped down initializing changed play() again outsourced xrun-handling added some cases to get_space() as xrun-handling added nonblock-mode added mmap-mode added subopts for mmap and noblock called mmap and noblock could be accessed as -ao alsa9:noblock:mmap
author joyping
date Wed, 03 Jul 2002 21:43:28 +0000
parents 1595ca898d3b
children df3bf0f971d1
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
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
4 (C) Alex Beregszaszi <alex@naxine.org>
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
5
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
6 modified for better alsa-0.9.0beta12(rc1)-support by Joy Winter <joy@pingfm.org>
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
7 additional AC3 passthrough support by Andy Lo A Foe <andy@alsaplayer.org>
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
8
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
9 Any bugreports regarding to this driver are welcome either to the mplayer-user-mailinglist or directly to the authors.
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
10 */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
11
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
12 #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
13 #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
14 #include <stdlib.h>
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
15 #include <math.h>
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
16 #include <string.h>
5855
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
17
5857
d9641a4e7dbb 10l pl =)
atmos4
parents: 5855
diff changeset
18 #include "../config.h"
d9641a4e7dbb 10l pl =)
atmos4
parents: 5855
diff changeset
19
5855
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
20 #if HAVE_SYS_ASOUNDLIB_H
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
21 #include <sys/asoundlib.h>
5855
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
22 #elif HAVE_ALSA_ASOUNDLIB_H
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
23 #include <alsa/asoundlib.h>
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
24 #else
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
25 #error "asoundlib.h is not in sys/ or alsa/ - please bugreport"
c21948cd027d fix for latest alsa (sys/asoundlib.h has been moved to alsa/asoundlib.h)
pl
parents: 5790
diff changeset
26 #endif
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
27
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
28 #include "audio_out.h"
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
29 #include "audio_out_internal.h"
1058
cab5ba9ffc6c fixed AFMT_ stuff (inclue afmt.h)
arpi_esp
parents: 1050
diff changeset
30 #include "afmt.h"
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
31
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
32 extern int verbose;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
33
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
34 static ao_info_t info =
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
35 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
36 "ALSA-0.9.x audio output",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
37 "alsa9",
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
38 "Alex Beregszaszi <alex@naxine.org>, Joy Winter <joy@pingfm.org>",
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
39 "under developement"
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
40 };
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
41
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
42 LIBAO_EXTERN(alsa9)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
43
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
44
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
45 static snd_pcm_t *alsa_handler;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
46 static snd_pcm_format_t alsa_format;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
47 static snd_pcm_hw_params_t *alsa_hwparams;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
48 static snd_pcm_sw_params_t *alsa_swparams;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
49 static char *alsa_device;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
50
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
51 /* possible 4096, original 8192, OUTBURST is set statically to 512 in config.h */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
52 static int alsa_fragsize = 4096; //OUTBURST
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
53 static int alsa_fragcount = 8;
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
54
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
55 static int chunk_size = -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
56 static size_t bits_per_sample, bits_per_frame;
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
57 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
58
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
59 int ao_mmap = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
60 int ao_noblock = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
61
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
62 static int open_mode;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
63 static int set_block_mode;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
64
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
65 #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
66
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
67 #undef BUFFERTIME
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
68 #define SET_CHUNKSIZE
1128
d2dd25dd11bc Hacked it working, still needs fixings!
atmosfear
parents: 1115
diff changeset
69
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
70 snd_pcm_t *
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
71
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
72 spdif_init(int acard, int adevice)
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
73 {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
74 //char *pcm_name = "hw:0,2"; /* first card second device */
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
75 char pcm_name[255];
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
76 static snd_aes_iec958_t spdif;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
77 snd_pcm_info_t *info;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
78 snd_pcm_t *handler;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
79 snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
80 unsigned int channels = 2;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
81 unsigned int rate = 48000;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
82 int err, c;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
83
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
84 if (err = snprintf(&pcm_name[0], 11, "hw:%1d,%1d", acard, adevice) <= 0)
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
85 {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
86 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
87 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
88
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
89 if ((err = snd_pcm_open(&handler, pcm_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0)
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
90 {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
91 fprintf(stderr, "open: %s\n", snd_strerror(err));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
92 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
93 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
94
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
95 snd_pcm_info_alloca(&info);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
96
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
97 if ((err = snd_pcm_info(handler, info)) < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
98 fprintf(stderr, "info: %s\n", snd_strerror(err));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
99 snd_pcm_close(handler);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
100 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
101 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
102 printf("device: %d, subdevice: %d\n", snd_pcm_info_get_device(info),
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
103 snd_pcm_info_get_subdevice(info));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
104 {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
105 snd_ctl_elem_value_t *ctl;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
106 snd_ctl_t *ctl_handler;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
107 char ctl_name[12];
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
108 int ctl_card;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
109
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
110 spdif.status[0] = IEC958_AES0_NONAUDIO |
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
111 IEC958_AES0_CON_EMPHASIS_NONE;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
112 spdif.status[1] = IEC958_AES1_CON_ORIGINAL |
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
113 IEC958_AES1_CON_PCM_CODER;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
114 spdif.status[2] = 0;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
115 spdif.status[3] = IEC958_AES3_CON_FS_48000;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
116
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
117 snd_ctl_elem_value_alloca(&ctl);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
118 snd_ctl_elem_value_set_interface(ctl, SND_CTL_ELEM_IFACE_PCM);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
119 snd_ctl_elem_value_set_device(ctl, snd_pcm_info_get_device(info));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
120 snd_ctl_elem_value_set_subdevice(ctl, snd_pcm_info_get_subdevice(info));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
121 snd_ctl_elem_value_set_name(ctl, SND_CTL_NAME_IEC958("", PLAYBACK,PCM_STREAM));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
122 snd_ctl_elem_value_set_iec958(ctl, &spdif);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
123 ctl_card = snd_pcm_info_get_card(info);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
124 if (ctl_card < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
125 fprintf(stderr, "Unable to setup the IEC958 (S/PDIF) interface - PCM has no assigned card");
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
126 goto __diga_end;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
127 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
128 sprintf(ctl_name, "hw:%d", ctl_card);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
129 printf("hw:%d\n", ctl_card);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
130 if ((err = snd_ctl_open(&ctl_handler, ctl_name, 0)) < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
131 fprintf(stderr, "Unable to open the control interface '%s': %s", ctl_name, snd_strerror(err));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
132 goto __diga_end;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
133 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
134 if ((err = snd_ctl_elem_write(ctl_handler, ctl)) < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
135 fprintf(stderr, "Unable to update the IEC958 control: %s", snd_strerror(err));
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
136 goto __diga_end;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
137 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
138 snd_ctl_close(ctl_handler);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
139 __diga_end:
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
140
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
141 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
142
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
143 {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
144 snd_pcm_hw_params_t *params;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
145 snd_pcm_sw_params_t *swparams;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
146
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
147 snd_pcm_hw_params_alloca(&params);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
148 snd_pcm_sw_params_alloca(&swparams);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
149
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
150 err = snd_pcm_hw_params_any(handler, params);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
151 if (err < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
152 fprintf(stderr, "Broken configuration for this PCM: no configurations available");
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
153 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
154 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
155
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
156 err = snd_pcm_hw_params_set_access(handler, params,SND_PCM_ACCESS_RW_INTERLEAVED);
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
157 if (err < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
158 fprintf(stderr, "Access tyep not available");
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
159 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
160 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
161 err = snd_pcm_hw_params_set_format(handler, params, format);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
162
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
163 if (err < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
164 fprintf(stderr, "Sample format non available");
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
165 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
166 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
167
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
168 err = snd_pcm_hw_params_set_channels(handler, params, channels);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
169
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
170 if (err < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
171 fprintf(stderr, "Channels count non avaible");
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
172 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
173 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
174
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
175 err = snd_pcm_hw_params_set_rate_near(handler, params, rate, 0); assert(err >= 0);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
176
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
177 err = snd_pcm_hw_params(handler, params);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
178
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
179 if (err < 0) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
180 fprintf(stderr, "Cannot set buffer size\n");
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
181 return NULL;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
182 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
183 snd_pcm_sw_params_current(handler, swparams);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
184 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
185 return handler;
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
186 }
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
187
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
188
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
189 /* to set/get/query special features/parameters */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
190 static int control(int cmd, int arg)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
191 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
192 switch(cmd) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
193 case AOCONTROL_QUERY_FORMAT:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
194 return CONTROL_TRUE;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
195 case AOCONTROL_GET_VOLUME:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
196 case AOCONTROL_SET_VOLUME:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
197 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
198 ao_control_vol_t *vol = (ao_control_vol_t *)arg;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
199
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
200 int err;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
201 snd_mixer_t *handle;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
202 snd_mixer_elem_t *elem;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
203 snd_mixer_selem_id_t *sid;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
204
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
205 const char *mix_name = "PCM";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
206 char *card = "default";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
207
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
208 long pmin, pmax;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
209 long get_vol, set_vol;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
210 float calc_vol, diff, f_multi;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
211
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
212 if(ao_data.format == AFMT_AC3)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
213 return CONTROL_TRUE;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
214
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
215 //allocate simple id
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
216 snd_mixer_selem_id_alloca(&sid);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
217
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
218 //sets simple-mixer index and name
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
219 snd_mixer_selem_id_set_index(sid, 0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
220 snd_mixer_selem_id_set_name(sid, mix_name);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
221
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
222 if ((err = snd_mixer_open(&handle, 0)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
223 printf("alsa-control: mixer open error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
224 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
225 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
226
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
227 if ((err = snd_mixer_attach(handle, card)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
228 printf("alsa-control: mixer attach %s error: %s", card, snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
229 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
230 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
231 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
232
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
233 if ((err = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
234 printf("alsa-control: mixer register error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
235 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
236 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
237 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
238 err = snd_mixer_load(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
239 if (err < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
240 printf("alsa-control: mixer load error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
241 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
242 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
243 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
244
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
245 elem = snd_mixer_find_selem(handle, sid);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
246 if (!elem) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
247 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
248 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
249 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
250 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
251
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
252 snd_mixer_selem_get_playback_volume_range(elem,&pmin,&pmax);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
253 f_multi = (100 / (float)pmax);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
254
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
255 if (cmd == AOCONTROL_SET_VOLUME) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
256
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
257 diff = (vol->left+vol->right) / 2;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
258 set_vol = rint(diff / f_multi);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
259
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
260 if (set_vol < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
261 set_vol = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
262 else if (set_vol > pmax)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
263 set_vol = pmax;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
264
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
265 //setting channels
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
266 if ((err = snd_mixer_selem_set_playback_volume(elem, 0, set_vol)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
267 printf("alsa-control: error setting left channel, %s",snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
268 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
269 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
270 if ((err = snd_mixer_selem_set_playback_volume(elem, 1, set_vol)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
271 printf("alsa-control: error setting right channel, %s",snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
272 return CONTROL_ERROR;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
273 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
274
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
275 //printf("diff=%f, set_vol=%i, pmax=%i, mult=%f\n", diff, set_vol, pmax, f_multi);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
276 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
277 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
278 snd_mixer_selem_get_playback_volume(elem, 0, &get_vol);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
279 calc_vol = get_vol;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
280 calc_vol = rintf(calc_vol * f_multi);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
281
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
282 vol->left = vol->right = (int)calc_vol;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
283
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
284 //printf("get_vol = %i, calc=%i\n",get_vol, calc_vol);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
285 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
286 snd_mixer_close(handle);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
287 return CONTROL_OK;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
288 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
289 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
290 return(CONTROL_UNKNOWN);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
291 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
292
1128
d2dd25dd11bc Hacked it working, still needs fixings!
atmosfear
parents: 1115
diff changeset
293
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
294 /*
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
295 open & setup audio device
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
296 return: 1=success 0=fail
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
297 */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
298 static int init(int rate_hz, int channels, int format, int flags)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
299 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
300 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
301 int cards = -1;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
302 int period_val;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
303 snd_pcm_info_t *alsa_info;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
304 char *str_block_mode;
1180
c50cd5db2359 added warning message
al3x
parents: 1146
diff changeset
305
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
306 printf("alsa-init: testing and bugreports are welcome.\n");
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
307 printf("alsa-init: requested format: %d Hz, %d channels, %s\n", rate_hz,
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
308 channels, audio_out_format_name(format));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
309
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
310 alsa_handler = NULL;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
311
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
312 if (verbose)
2059
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
313 printf("alsa-init: compiled for ALSA-%s\n", SND_LIB_VERSION_STR);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
314
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
315 if ((err = snd_card_next(&cards)) < 0 || cards < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
316 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
317 printf("alsa-init: no soundcards found: %s\n", snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
318 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
319 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
320
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
321 ao_data.samplerate = rate_hz;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
322 ao_data.bps = channels; /* really this is bytes per frame so bad varname */
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
323 ao_data.format = format;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
324 ao_data.channels = channels;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
325 ao_data.outburst = OUTBURST;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
326 ao_data.buffersize = MAX_OUTBURST; // was 16384
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
327
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
328 switch (format)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
329 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
330 case AFMT_S8:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
331 alsa_format = SND_PCM_FORMAT_S8;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
332 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
333 case AFMT_U8:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
334 alsa_format = SND_PCM_FORMAT_U8;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
335 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
336 case AFMT_U16_LE:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
337 alsa_format = SND_PCM_FORMAT_U16_LE;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
338 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
339 case AFMT_U16_BE:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
340 alsa_format = SND_PCM_FORMAT_U16_BE;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
341 break;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
342 #ifndef WORDS_BIGENDIAN
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
343 case AFMT_AC3:
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
344 #endif
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
345 case AFMT_S16_LE:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
346 alsa_format = SND_PCM_FORMAT_S16_LE;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
347 break;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
348 #ifdef WORDS_BIGENDIAN
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
349 case AFMT_AC3:
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 3135
diff changeset
350 #endif
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
351 case AFMT_S16_BE:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
352 alsa_format = SND_PCM_FORMAT_S16_BE;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
353 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
354 default:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
355 alsa_format = SND_PCM_FORMAT_MPEG;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
356 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
357 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
358
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
359 switch(alsa_format)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
360 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
361 case SND_PCM_FORMAT_S16_LE:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
362 case SND_PCM_FORMAT_U16_LE:
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
363 ao_data.bps *= 2;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
364 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
365 case -1:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
366 printf("alsa-init: invalid format (%s) requested - output disabled\n",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
367 audio_out_format_name(format));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
368 return(0);
1115
a16b569f2702 -Wall style cleanups, TEST IT, it can be working by others
al3x
parents: 1058
diff changeset
369 default:
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
370 break;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
371 }
1128
d2dd25dd11bc Hacked it working, still needs fixings!
atmosfear
parents: 1115
diff changeset
372
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
373 if (ao_subdevice) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
374 //start parsing ao_subdevice, ugly and not thread safe!
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
375 //maybe there's a better way?
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
376 int i2 = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
377 int i3 = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
378 char *sub_str;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
379
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
380 char *token_str[3];
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
381 char* test_str = strdup(ao_subdevice);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
382
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
383 //printf("subd=%s, test=%s\n", ao_subdevice,test_str);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
384
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
385 if ((strcspn(ao_subdevice, ":")) > 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
386
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
387 sub_str = strtok(test_str, ":");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
388 *(token_str) = sub_str;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
389
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
390 while (((sub_str = strtok(NULL, ":")) != NULL) && (i2 <= 3)) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
391 *(token_str+i2) = sub_str;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
392 //printf("token %i: %s\n", i2, *(token_str+i2));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
393 i2 += 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
394 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
395
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
396 for (i3=0; i3 <= i2-1; i3++) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
397 //printf("test %i, %s\n", i3, *(token_str+i3));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
398 if (strcmp(*(token_str + i3), "mmap") == 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
399 ao_mmap = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
400 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
401 else if (strcmp(*(token_str+i3), "noblock") == 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
402 ao_noblock = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
403 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
404 else if (strcmp(*(token_str+i3), "hw") == 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
405 alsa_device = *(token_str+i3);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
406 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
407 else if (!alsa_device || !ao_mmap || !ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
408 alsa_device = *(token_str+i3);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
409 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
410 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
411 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
412 } //end parsing ao_subdevice
1207
bf18175dfad7 ao_subdevice support added
al3x
parents: 1180
diff changeset
413
1146
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
414 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
415 {
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
416 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
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 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
419 {
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 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
421 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
422 }
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
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
424 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
425 {
1146
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
426 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
427 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
428 }
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 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
431 {
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: cant get device\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
433 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
434 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
435
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
436 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
437 {
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
438 printf("alsa-init: cant get subdevice\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
439 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
440 }
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
441
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
442 if (verbose)
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
443 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
444
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
445 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
446 {
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
447 printf("alsa-init: cant wrote device-id\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
448 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
449
1146
a84610bb5476 hacked aocontrol_set_device working, and cleaned up a bit
al3x
parents: 1129
diff changeset
450 snd_pcm_info_free(alsa_info);
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
451 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
452
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
453 printf("alsa-init: %d soundcard%s found, using: %s\n", cards+1,
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
454 (cards >= 0) ? "" : "s", alsa_device);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
455
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
456 if (format == AFMT_AC3) {
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
457 // Try to initialize the SPDIF interface
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
458 alsa_handler = spdif_init(0, 2);
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
459 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
460
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
461 //setting modes for block or nonblock-mode
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
462 if (ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
463 open_mode = SND_PCM_NONBLOCK;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
464 set_block_mode = 1;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
465 str_block_mode = "nonblock-mode";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
466 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
467 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
468 open_mode = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
469 set_block_mode = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
470 str_block_mode = "block-mode";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
471 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
472
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
473
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
474 //modes = 0, SND_PCM_NONBLOCK, SND_PCM_ASYNC
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
475 if (!alsa_handler) {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
476 if ((err = snd_pcm_open(&alsa_handler, alsa_device, SND_PCM_STREAM_PLAYBACK, open_mode)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
477 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
478 if (ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
479 printf("alsa-init: open in nonblock-mode failed, trying to open in block-mode\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
480 if ((err = snd_pcm_open(&alsa_handler, alsa_device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
481 printf("alsa-init: playback open error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
482 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
483 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
484 set_block_mode = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
485 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
486 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
487 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
488 printf("alsa-init: playback open error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
489 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
490 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
491 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
492 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
493
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
494 if ((err = snd_pcm_nonblock(alsa_handler, set_block_mode)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
495 printf("alsa-init: error set block-mode %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
496 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
497 else if (verbose) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
498 printf("alsa-init: pcm opend in %s\n", str_block_mode);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
499 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
500
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
501 snd_pcm_hw_params_alloca(&alsa_hwparams);
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
502 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
503
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
504 // setting hw-parameters
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
505 if ((err = snd_pcm_hw_params_any(alsa_handler, alsa_hwparams)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
506 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
507 printf("alsa-init: unable to get initial parameters: %s\n",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
508 snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
509 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
510 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
511
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
512 if (ao_mmap) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
513 snd_pcm_access_mask_t *mask = alloca(snd_pcm_access_mask_sizeof());
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
514 snd_pcm_access_mask_none(mask);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
515 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
516 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
517 snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
518 err = snd_pcm_hw_params_set_access_mask(alsa_handler, alsa_hwparams, mask);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
519 printf("alsa-init: mmap set\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
520 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
521 err = snd_pcm_hw_params_set_access(alsa_handler, alsa_hwparams,SND_PCM_ACCESS_RW_INTERLEAVED);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
522 printf("alsa-init: interleave set\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
523 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
524 if (err < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
525 printf("alsa-init: unable to set access type: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
526 return (0);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
527 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
528
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
529 if ((err = snd_pcm_hw_params_set_format(alsa_handler, alsa_hwparams,
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
530 alsa_format)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
531 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
532 printf("alsa-init: unable to set format: %s\n",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
533 snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
534 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
535 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
536
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
537 if ((err = snd_pcm_hw_params_set_channels(alsa_handler, alsa_hwparams,
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
538 ao_data.channels)) < 0)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
539 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
540 printf("alsa-init: unable to set channels: %s\n",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
541 snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
542 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
543 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
544
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
545 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
546 {
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
547 printf("alsa-init: unable to set samplerate-2: %s\n",
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
548 snd_strerror(err));
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
549 return(0);
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
550 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
551
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
552 #ifdef BUFFERTIME
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
553 {
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
554 int alsa_buffer_time = 500000; /* original 60 */
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
555
2059
3c390543302c alsa9 pecs by joy_ping <joy@pingfm.org>
pontscho
parents: 1207
diff changeset
556 if ((err = snd_pcm_hw_params_set_buffer_time_near(alsa_handler, alsa_hwparams, alsa_buffer_time, 0)) < 0)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
557 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
558 printf("alsa-init: unable to set buffer time near: %s\n",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
559 snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
560 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
561 } else
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
562 alsa_buffer_time = err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
563
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
564 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
565 /* original: alsa_buffer_time/ao_data.bps */
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
566 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
567 printf("alsa-init: unable to set period time: %s\n",
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
568 snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
569 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
570 }
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
571 if (verbose)
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
572 printf("alsa-init: buffer_time: %d, period_time :%d\n",alsa_buffer_time, err);
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
573 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
574 #endif
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
575
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
576 #ifdef SET_CHUNKSIZE
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
577 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
578 //set chunksize
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
579 chunk_size = alsa_fragsize / 4;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
580
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
581 if ((err = snd_pcm_hw_params_set_period_size(alsa_handler, alsa_hwparams, chunk_size, 0)) < 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
582 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
583 printf("alsa-init: unable to set periodsize: %s\n", snd_strerror(err));
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
584 return(0);
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
585 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
586 else if (verbose) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
587 printf("alsa-init: chunksize set to %i\n", chunk_size);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
588 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
589
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
590 //set period_count
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
591 if ((period_val = snd_pcm_hw_params_get_periods_max(alsa_hwparams, 0)) < alsa_fragcount) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
592 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
593 }
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
594
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
595 if (verbose)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
596 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
597
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
598 if ((err = snd_pcm_hw_params_set_periods(alsa_handler, alsa_hwparams, alsa_fragcount, 0)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
599 printf("alsa-init: unable to set periods: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
600 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
601 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
602 #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
603
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
604 /* finally install hardware parameters */
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
605 if ((err = snd_pcm_hw_params(alsa_handler, alsa_hwparams)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
606 {
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
607 printf("alsa-init: unable to set hw-parameters: %s\n",
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
608 snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
609 return(0);
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
610 }
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
611 // end setting hw-params
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
612
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
613
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
614 // gets buffersize for control
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
615 if ((err = snd_pcm_hw_params_get_buffer_size(alsa_hwparams)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
616 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
617 printf("alsa-init: unable to get buffersize: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
618 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
619 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
620 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
621 ao_data.buffersize = err;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
622 if (verbose)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
623 printf("alsa-init: got buffersize=%i\n", ao_data.buffersize);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
624 }
2209
a59f952fad34 applied patch by Joy Winter <joy@pingfm.org>
arpi
parents: 2059
diff changeset
625
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
626 // setting sw-params (only avail-min) if noblocking mode was choosed
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
627 if (ao_noblock)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
628 {
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
629
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
630 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 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
631 {
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
632 printf("alsa-init: unable to get parameters: %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
633 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
634 }
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
635
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
636 //set min available frames to consider pcm ready (4)
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
637 //increased for nonblock-mode should be set dynamically later
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
638 if ((err = snd_pcm_sw_params_set_avail_min(alsa_handler, alsa_swparams, chunk_size)) < 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
639 {
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
640 printf("alsa-init: unable to set avail_min %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
641 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
642 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
643
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
644 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 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
645 {
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
646 printf("alsa-init: unable to install sw-params\n");
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
647 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
648 }
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
649
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
650 bits_per_sample = snd_pcm_format_physical_width(alsa_format);
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
651 bits_per_frame = bits_per_sample * channels;
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
652 chunk_bytes = chunk_size * bits_per_frame / 8;
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
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
654 if (verbose) {
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
655 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);}
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
656
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
657 }//end 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
658
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
659 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
660 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
661 printf("alsa-init: pcm prepare error: %s\n", snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
662 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
663 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
664
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
665 printf("alsa9: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n",
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
666 ao_data.samplerate, ao_data.channels, ao_data.bps, ao_data.buffersize,
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
667 snd_pcm_format_description(alsa_format));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
668 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
669 } // 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
670
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
671
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
672 /* close audio device */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
673 static void uninit()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
674 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
675
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
676 if (alsa_handler) {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
677 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
678
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
679 if (!ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
680 if ((err = snd_pcm_drain(alsa_handler)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
681 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
682 printf("alsa-uninit: pcm drain error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
683 return;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
684 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
685 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
686
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
687 if ((err = snd_pcm_close(alsa_handler)) < 0)
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
688 {
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
689 printf("alsa-uninit: pcm close error: %s\n", snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
690 return;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
691 }
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
692 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
693 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
694 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
695 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
696 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
697 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
698 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
699 printf("alsa-uninit: no handler defined!\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
700 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
701 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
702
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
703 static void audio_pause()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
704 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
705 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
706
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
707 if (!ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
708 //drain causes error in nonblock-mode!
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
709 if ((err = snd_pcm_drain(alsa_handler)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
710 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
711 printf("alsa-pause: pcm drain error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
712 return;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
713 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
714 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
715 else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
716 if (verbose)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
717 printf("alsa-pause: paused nonblock\n");
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
718
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
719 return;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
720 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
721 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
722
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
723 static void audio_resume()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
724 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
725 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
726
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
727 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
728 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
729 printf("alsa-resume: pcm prepare error: %s\n", snd_strerror(err));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
730 return;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
731 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
732 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
733
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
734 /* stop playing and empty buffers (for seeking/pause) */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
735 static void reset()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
736 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
737 int err;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
738
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
739 if (!ao_noblock) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
740 //drain causes error in nonblock-mode!
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
741 if ((err = snd_pcm_drain(alsa_handler)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
742 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
743 printf("alsa-pause: pcm drain error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
744 return;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
745 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
746
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
747 if ((err = snd_pcm_prepare(alsa_handler)) < 0)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
748 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
749 printf("alsa-reset: pcm prepare error: %s\n", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
750 return;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
751 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
752 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
753 if (verbose)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
754 printf("alsa-reset: reset nonblocked");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
755 return;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
756 }
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
757 }
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
758
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
759 #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
760 #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
761 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
762 (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
763 (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
764 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
765 --(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
766 (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
767 } \
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
768 } while (0)
1129
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
769 #endif
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
770
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
771 /* I/O error handler */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
772 static int xrun(u_char *str_mode)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
773 {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
774 int err;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
775 snd_pcm_status_t *status;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
776
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
777 snd_pcm_status_alloca(&status);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
778
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
779 if ((err = snd_pcm_status(alsa_handler, status))<0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
780 printf("status error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
781 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
782 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
783
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
784 if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
785 struct timeval now, diff, tstamp;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
786 gettimeofday(&now, 0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
787 snd_pcm_status_get_trigger_tstamp(status, &tstamp);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
788 timersub(&now, &tstamp, &diff);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
789 printf("alsa-%s: xrun of at least %.3f msecs. resetting stream\n",
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
790 str_mode,
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
791 diff.tv_sec * 1000 + diff.tv_usec / 1000.0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
792 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
793
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
794 if ((err = snd_pcm_prepare(alsa_handler))<0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
795 printf("xrun: prepare error: %s", snd_strerror(err));
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
796 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
797 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
798
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
799 return(1); /* ok, data should be accepted again */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
800 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
801
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
802 /*
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
803 plays 'len' bytes of 'data'
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
804 returns: number of bytes played
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
805 modified last at 29.06.02 by jp
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
806 thanxs for marius <marius@rospot.com> for giving us the light ;)
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
807 */
6193
2fd9ec444098 AC3 passthrough support by Andy Lo A Foe <andy at alsaplayer dot org>
alex
parents: 5857
diff changeset
808
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
809 static int play(void* data, int len, int flags)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
810 {
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
811
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
812 //ao_data.bps is always 4 cause its set to channels * 2 by alsa_format??
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
813 int num_frames = len / ao_data.bps;
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 signed short *output_samples=data;
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 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
816
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
817 //printf("alsa-play: frames=%i, len=%i",num_frames,len);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
818
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
819 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
820 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
821 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
822 }
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
823
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
824 while (num_frames > 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
825
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
826 if (ao_mmap) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
827 res = snd_pcm_mmap_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
828 } else {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
829 res = snd_pcm_writei(alsa_handler, (void *)output_samples, num_frames);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
830 }
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
831
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
832 if (res == -EAGAIN) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
833 snd_pcm_wait(alsa_handler, 1000);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
834 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
835 else if (res == -EPIPE) { /* underrun */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
836 if (xrun("play") <= 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
837 printf("alsa-play: xrun reset error");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
838 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
839 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
840 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
841 else if (res == -ESTRPIPE) { /* suspend */
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
842 printf("alsa-play: pcm in suspend mode. trying to resume\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
843 while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
844 sleep(1);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
845 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
846 else if (res < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
847 printf("alsa-play: unknown status, trying to reset soundcard\n");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
848 if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
849 printf("alsa-play: snd prepare error");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
850 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
851 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
852 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
853 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
854
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
855 if (res > 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
856 output_samples += ao_data.channels * res;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
857 num_frames -= res;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
858 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
859
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
860 } //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
861
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
862 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
863 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
864 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
865 }
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
866 return res < 0 ? (int)res : len;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
867 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
868
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
869 /* how many byes are free in the buffer */
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
870 static int get_space()
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
871 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
872 snd_pcm_status_t *status;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
873 int ret;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
874 char *str_status;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
875
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
876 //snd_pcm_sframes_t avail_frames = 0;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
877
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
878 if ((ret = snd_pcm_status_malloc(&status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
879 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
880 printf("alsa-space: memory allocation error: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
881 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
882 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
883
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
884 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
885 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
886 printf("alsa-space: cannot get pcm status: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
887 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
888 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
889
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
890 switch(snd_pcm_status_get_state(status))
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
891 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
892 case SND_PCM_STATE_OPEN:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
893 str_status = "open";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
894 case SND_PCM_STATE_PREPARED:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
895 if (str_status != "open")
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
896 str_status = "prepared";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
897 case SND_PCM_STATE_RUNNING:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
898 ret = snd_pcm_status_get_avail(status) * ao_data.bps;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
899 //avail_frames = snd_pcm_avail_update(alsa_handler) * ao_data.bps;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
900 if (str_status != "open" && str_status != "prepared")
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
901 str_status = "running";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
902 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
903 case SND_PCM_STATE_PAUSED:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
904 if (verbose) printf("alsa-space: paused");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
905 str_status = "paused";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
906 ret = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
907 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
908 case SND_PCM_STATE_XRUN:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
909 xrun("space");
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
910 str_status = "xrun";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
911 ret = 0;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
912 break;
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
913 default:
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
914 str_status = "undefined";
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
915 ret = 0;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
916 }
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
917
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
918 if (verbose && str_status != "running")
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
919 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
920 snd_pcm_status_free(status);
1129
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
921
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
922 if (ret < 0) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
923 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
924 ret = 0;
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
925 }
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
926
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
927 return(ret);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
928 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
929
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
930 /* delay in seconds between first and last sample in buffer */
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
931 static float get_delay()
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
932 {
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
933
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
934 if (alsa_handler) {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
935
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
936 snd_pcm_status_t *status;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
937 float ret;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
938
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
939 if ((ret = snd_pcm_status_malloc(&status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
940 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
941 printf("alsa-delay: memory allocation error: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
942 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
943 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
944
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
945 if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
946 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
947 printf("alsa-delay: cannot get pcm status: %s\n", snd_strerror(ret));
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
948 return(0);
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
949 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
950
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
951 switch(snd_pcm_status_get_state(status))
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
952 {
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
953 case SND_PCM_STATE_OPEN:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
954 case SND_PCM_STATE_PREPARED:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
955 case SND_PCM_STATE_RUNNING:
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2209
diff changeset
956 ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
957 break;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
958 default:
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
959 ret = 0;
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
960 }
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
961
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
962 snd_pcm_status_free(status);
1129
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
963
705fa4ac4fed hacked to work seek/pause/resume/uninit
al3x
parents: 1128
diff changeset
964 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
965 ret = 0;
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
966 return(ret);
6633
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
967
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
968 } else {
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
969 return(0);
769246a4eb41 cVS: ---------------------------------------------------------------------
joyping
parents: 6589
diff changeset
970 }
1050
87eb4325baf6 first release, meg nem akar menni :(
al3x
parents:
diff changeset
971 }