0001-switch-to-new-alsa-api.patch (5257B)
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. 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