At Fri, 03 Jul 2009 17:58:50 +0200, Kenneth Johansson wrote: > > On Fri, 2009-07-03 at 17:28 +0200, Takashi Iwai 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@xxxxxxxxxxxx> > > > > > > > > > > > > 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; > > + } > > But only one of them will ever be used. whenever this function is > entered the pointer is only using one type ever. the memory is never > accessed with any other type and it's only using this one pointer. Hrm, OK, that makes sense. > What exactly do you think the compiler can do ?? it's not like it can > cache the samples[chn] value that is the char pointer and make a > constant pointer out of it. There is no mixed type accesses. > > Aliasing happens when two pointers of different type point to the same > memory. then you can have funny things happening if you access the > memory from the two pointers. > > There is no pointer aliasing here there is only one pointer. We just > change the type of this one pointer in the one place it's used. > > Is it aliasing with itself ? would the write magically happen in some > other size or not at all what ?? > > could you point me to some documentation for this I'm not getting it. Maybe my unneeded concern. But still your patch breaks the 3-byte format, so it causes another regression. Takashi _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel