xref: /OK3568_Linux_fs/buildroot/package/madplay/0001-switch-to-new-alsa-api.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1Switch madplay to the new API. This is done thanks to a patch written
2by Micha Nelissen <micha@neli.hopto.org> and available at
3http://article.gmane.org/gmane.comp.audio.mad.devel/729.
4
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 @@
8
9 #include <errno.h>
10
11-#define ALSA_PCM_OLD_HW_PARAMS_API
12-#define ALSA_PCM_OLD_SW_PARAMS_API
13 #include <alsa/asoundlib.h>
14
15 #include <mad.h>
16
17 #include "audio.h"
18
19-char *buf	= NULL;
20-int paused	= 0;
21+#define BUFFER_TIME_MAX     500000
22
23-int rate	= -1;
24-int channels	= -1;
25-int bitdepth	= -1;
26-int sample_size	= -1;
27-
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;
33+
34+unsigned int rate           = 0;
35+unsigned int channels	    = -1;
36+unsigned int bitdepth	    = -1;
37+unsigned int sample_size    = -1;
38+
39+unsigned int buffer_time;
40+unsigned int period_time;
41+char *defaultdev	    = "plughw:0,0";
42
43 snd_pcm_hw_params_t *alsa_hwparams;
44 snd_pcm_sw_params_t *alsa_swparams;
45
46-snd_pcm_sframes_t buffer_size;
47-snd_pcm_sframes_t period_size;
48+snd_pcm_uframes_t buffer_size;
49
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)
55 {
56-	int err, dir;
57-
58+	int err;
59+
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;
65 	}
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;
77 	}
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;
84 	}
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;
102 	}
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;
112 	}
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;
119+        }
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)
126 {
127+        unsigned int start_threshold;
128 	int err;
129
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;
135-										        }
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;
141-												        }
142+	}
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;
148
149 	if ( bitdepth == 0 )
150-		config->precision = bitdepth = 32;
151+		config->precision = bitdepth = 16;
152
153 	switch (bitdepth)
154 	{
155@@ -241,7 +250,7 @@
156 		return -1;
157 	}
158
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)
166 {
167 	int err, len;
168-	char *ptr;
169+	unsigned char *ptr;
170
171 	ptr = buf;
172 	len = play->nsamples;
173
174