debianutils: bump to version 4.8.1
[buildroot-gz.git] / package / madplay / 0001-switch-to-new-alsa-api.patch
blob60d7bd37999d7cc68f82e89df504e415e8043531
1 Switch madplay to the new API. This is done thanks to a patch written
2 by Micha Nelissen <micha@neli.hopto.org> and available at
3 http://article.gmane.org/gmane.comp.audio.mad.devel/729.
5 --- madplay-0.15.2b/audio_alsa.c 2008-10-18 15:10:16.000000000 +0200
6 +++ madplay-0.15.2b/audio_alsa.c.new 2008-10-18 15:03:27.000000000 +0200
7 @@ -28,31 +28,30 @@
9 #include <errno.h>
11 -#define ALSA_PCM_OLD_HW_PARAMS_API
12 -#define ALSA_PCM_OLD_SW_PARAMS_API
13 #include <alsa/asoundlib.h>
15 #include <mad.h>
17 #include "audio.h"
19 -char *buf = NULL;
20 -int paused = 0;
21 +#define BUFFER_TIME_MAX 500000
23 -int rate = -1;
24 -int channels = -1;
25 -int bitdepth = -1;
26 -int sample_size = -1;
28 -int buffer_time = 500000;
29 -int period_time = 100000;
30 -char *defaultdev = "plughw:0,0";
31 +unsigned char *buf = NULL;
32 +int paused = 0;
34 +unsigned int rate = 0;
35 +unsigned int channels = -1;
36 +unsigned int bitdepth = -1;
37 +unsigned int sample_size = -1;
39 +unsigned int buffer_time;
40 +unsigned int period_time;
41 +char *defaultdev = "plughw:0,0";
43 snd_pcm_hw_params_t *alsa_hwparams;
44 snd_pcm_sw_params_t *alsa_swparams;
46 -snd_pcm_sframes_t buffer_size;
47 -snd_pcm_sframes_t period_size;
48 +snd_pcm_uframes_t buffer_size;
50 snd_pcm_format_t alsa_format = -1;
51 snd_pcm_access_t alsa_access = SND_PCM_ACCESS_MMAP_INTERLEAVED;
52 @@ -66,14 +65,20 @@
53 snd_pcm_hw_params_t *params,
54 snd_pcm_access_t access)
56 - int err, dir;
58 + int err;
60 /* choose all parameters */
61 err = snd_pcm_hw_params_any(handle,params);
62 if (err < 0) {
63 printf("Access type not available for playback: %s\n", snd_strerror(err));
64 return err;
66 + /* set the access type */
67 + err = snd_pcm_hw_params_set_access(handle, params, alsa_access);
68 + if (err < 0) {
69 + printf("Sample format not available for playback: %s\n", snd_strerror(err));
70 + return err;
71 + }
72 /* set the sample format */
73 err = snd_pcm_hw_params_set_format(handle, params, alsa_format);
74 if (err < 0) {
75 @@ -87,29 +92,38 @@
76 return err;
78 /* set the stream rate */
79 - err = snd_pcm_hw_params_set_rate_near(handle, params, rate, 0);
80 + err = snd_pcm_hw_params_set_rate(handle, params, rate, 0);
81 if (err < 0) {
82 printf("Rate %iHz not available for playback: %s\n", rate, snd_strerror(err));
83 return err;
85 - if (err != rate) {
86 - printf("Rate doesn't match (requested %iHz, get %iHz)\n", rate, err);
87 - return -EINVAL;
88 - }
89 + err = snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, NULL);
90 + if (err < 0) {
91 + printf("Unable to retrieve buffer time: %s\n", snd_strerror(err));
92 + return err;
93 + }
94 + if (buffer_time > BUFFER_TIME_MAX)
95 + buffer_time = BUFFER_TIME_MAX;
96 /* set buffer time */
97 - err = snd_pcm_hw_params_set_buffer_time_near(handle, params, buffer_time, &dir);
98 + err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0);
99 if (err < 0) {
100 printf("Unable to set buffer time %i for playback: %s\n", buffer_time, snd_strerror(err));
101 return err;
103 - buffer_size = snd_pcm_hw_params_get_buffer_size(params);
104 + if (period_time * 4 > buffer_time)
105 + period_time = buffer_time / 4;
106 /* set period time */
107 - err = snd_pcm_hw_params_set_period_time_near(handle, params, period_time, &dir);
108 + err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, NULL);
109 if (err < 0) {
110 printf("Unable to set period time %i for playback: %s\n", period_time, snd_strerror(err));
111 return err;
113 - period_size = snd_pcm_hw_params_get_period_size(params, &dir);
114 + /* retrieve buffer size */
115 + err = snd_pcm_hw_params_get_buffer_size(params, &buffer_size);
116 + if (err < 0) {
117 + printf("Unable to retrieve buffer size: %s\n", snd_strerror(err));
118 + return err;
120 /* write the parameters to device */
121 err = snd_pcm_hw_params(handle, params);
122 if (err < 0) {
123 @@ -123,6 +137,7 @@
124 int set_swparams(snd_pcm_t *handle,
125 snd_pcm_sw_params_t *params)
127 + unsigned int start_threshold;
128 int err;
130 /* get current swparams */
131 @@ -136,13 +151,7 @@
132 if (err < 0) {
133 printf("Unable to set start threshold mode for playback: %s\n", snd_strerror(err));
134 return err;
136 - /* allow transfer when at least period_size samples can be processed */
137 - err = snd_pcm_sw_params_set_avail_min(handle, params, period_size);
138 - if (err < 0) {
139 - printf("Unable to set avail min for playback: %s\n", snd_strerror(err));
140 - return err;
143 /* align all transfers to 1 samples */
144 err = snd_pcm_sw_params_set_xfer_align(handle, params, 1);
145 if (err < 0) {
146 @@ -190,7 +199,7 @@
147 rate = config->speed;
149 if ( bitdepth == 0 )
150 - config->precision = bitdepth = 32;
151 + config->precision = bitdepth = 16;
153 switch (bitdepth)
155 @@ -241,7 +250,7 @@
156 return -1;
159 - buf = malloc(buffer_size);
160 + buf = malloc(buffer_size * sample_size);
161 if (buf == NULL) {
162 audio_error="unable to allocate output buffer table";
163 return -1;
164 @@ -279,7 +288,7 @@
165 int play(struct audio_play *play)
167 int err, len;
168 - char *ptr;
169 + unsigned char *ptr;
171 ptr = buf;
172 len = play->nsamples;