[alsa-devel] [PATCH] Sample generation on big endian platforms was broken.
Takashi Iwai
tiwai at suse.de
Fri Jul 3 17:41:54 CEST 2009
At Fri, 03 Jul 2009 17:28:55 +0200,
I wrote:
>
> At Fri, 03 Jul 2009 17:11:37 +0200,
> Kenneth Johansson wrote:
> >
> > On Fri, 2009-07-03 at 17:00 +0200, Takashi Iwai wrote:
> > > At Fri, 03 Jul 2009 16:51:35 +0200,
> > > Kenneth Johansson wrote:
> > > >
> > > > On Fri, 2009-07-03 at 16:39 +0200, Takashi Iwai wrote:
> > > > > 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
> > > >
> > > > hmm I think you have to explain this. now it works on both little/big
> > > > endian without any explicit byte moves.
> > > >
> > > > It did not understand what problem you see.
> > >
> > > You can't cast from a char pointer to another type (e.g. short) and
> > > read the value. This is called "type-punning" and doesn't work
> > > properly with the recent GCC (depending on the optimization and
> > > code parsing) since it handles strict-aliasing.
> > >
> > > See GCC info for details.
> > >
> > >
> > > Takashi
> >
> > But there is no aliasing problem in that code. The memory is only
> > accessed(written in this case) using one type.
>
> One type?
>
> + switch(bps){
> + case 1:
> + *(samples[chn]) = res;
> + break;
> + case 2:
> + *(short*)(samples[chn]) = res;
> + break;
> + case 4:
> + *(int*)(samples[chn]) = res;
> + }
... and the code doesn't handle the case of 3 byte format, too.
Takashi
More information about the Alsa-devel
mailing list