[alsa-devel] [PATCH] Sample generation on big endian platforms was broken.

Takashi Iwai tiwai at suse.de
Fri Jul 3 16:39:20 CEST 2009


At Fri, 03 Jul 2009 16:19:31 +0200,
Kenneth Johansson wrote:
> 
> Has not worked since commit 3d1fa924906996463ac33cba5b5143f762d913cf
> 
> Signed-off-by: Kenneth Johansson <kenneth at southpole.se>

Hrm, sorry, but your version is also broken as doing type-punning.
The code has to be rewritten completely...


Takashi



> ---
>  test/pcm.c |   24 ++++++++++++++----------
>  1 files changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/test/pcm.c b/test/pcm.c
> index ee27422..9b8a923 100644
> --- a/test/pcm.c
> +++ b/test/pcm.c
> @@ -34,14 +34,11 @@ static void generate_sine(const
> snd_pcm_channel_area_t *areas,
>  	static double max_phase = 2. * M_PI;
>  	double phase = *_phase;
>  	double step = max_phase*freq/(double)rate;
> -	double res;
> +	int res;
>  	unsigned char *samples[channels], *tmp;
>  	int steps[channels];
> -	unsigned int chn, byte;
> -	union {
> -		int i;
> -		unsigned char c[4];
> -	} ires;
> +	unsigned int chn;
> +
>  	unsigned int maxval = (1 << (snd_pcm_format_width(format) - 1)) - 1;
>  	int bps = snd_pcm_format_width(format) / 8;  /* bytes per sample */
>  	
> @@ -62,11 +59,18 @@ static void generate_sine(const
> snd_pcm_channel_area_t *areas,
>  	/* fill the channel areas */
>  	while (count-- > 0) {
>  		res = sin(phase) * maxval;
> -		ires.i = res;
> -		tmp = ires.c;
>  		for (chn = 0; chn < channels; chn++) {
> -			for (byte = 0; byte < (unsigned int)bps; byte++)
> -				*(samples[chn] + byte) = tmp[byte];
> +			/* Generate data in native endian format */
> +			switch(bps){
> +			case 1:
> +				*(samples[chn]) = res;
> +				break;
> +			case 2:
> +				*(short*)(samples[chn]) = res;
> +				break;
> +			case 4:
> +				*(int*)(samples[chn]) = res;
> +			}
>  			samples[chn] += steps[chn];
>  		}
>  		phase += step;
> -- 
> 1.6.1.GIT
> 
> 
> 


More information about the Alsa-devel mailing list