At Fri, 03 Jul 2009 19:04:20 +0200, Kenneth Johansson wrote:
On Fri, 2009-07-03 at 17:41 +0200, Takashi Iwai wrote:
... and the code doesn't handle the case of 3 byte format, too.
Takashi
Soo ? there is a lot of formats this code can't generate. It's a test program and I doubt anybody has ever tried to change the output format since it has never worked for most formats.
24bit 3byte format is very popular (e.g. used by USB audio), and the commit that broke the big-endian was to support such formats. It works actually.
but if you want to add support for 3 bytes then there is no way around having two different storage methods one for BIG and one for LITTLE endian machines.
3 byte format is just 24bit linear data packed into 3 bytes. The difference is only the length of the bytes. So, the difference of endian exists.
BTW, a simpler solution is to use memcpy() with a certain offset. For example,
int offset, size; size = snd_pcm_format_physical_width(fmt) / 8; #ifdef BIG_ENDIAN offset = 4 - size; #else offset = 0; #endif
for (...) { ... memcpy(dest, src + offset, size); ... }
memcpy() isn't so expensive with the recent gcc/glibc.
Could you rewrite the patch in that way and test it on big-endian machines?
thanks,
Takashi