Package: zynaddsubfx Version: 2.2.1-1 Severity: important Tags: patch hi,
zynaddsubfx works fine in jack mode on big endian machines, but outputs very strange noises when using the oss mode. the attached patch adds adequate conversion. it applies to the latest 2.2.1 (and probably earlier). cheers, piem -- System Information: Debian Release: 3.1 APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: powerpc (ppc) Kernel: Linux 2.6.12-rc3-powerpc Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) Versions of packages zynaddsubfx depends on: ii fftw3 3.0.1-11 Library for computing Fast Fourier ii libasound2 1.0.8-3 ALSA library ii libc6 2.3.2.ds1-21 GNU C Library: Shared libraries an ii libfltk1.1c102 1.1.6-2 Fast Light Toolkit shared librarie ii libgcc1 1:3.4.3-12 GCC support library ii libjack0.80.0-0 0.99.0-6 JACK Audio Connection Kit (librari ii libmxml1 2.2-1 development files for libmlxml ii libstdc++5 1:3.3.5-12 The GNU Standard C++ Library v3 ii libx11-6 4.3.0.dfsg.1-12 X Window System protocol client li ii libxext6 4.3.0.dfsg.1-12 X Window System miscellaneous exte ii libxft2 2.1.7-1 FreeType-based font drawing librar ii xlibs 4.3.0.dfsg.1-12 X Keyboard Extension (XKB) configu ii zlib1g 1:1.2.2-4 compression library - runtime -- no debconf information
--- ZynAddSubFX-2.2.1/src/Output/OSSaudiooutput.C 2005-03-14 19:57:49.000000000 +0000 +++ zynaddsubfx-2.2.1/src/Output/OSSaudiooutput.C 2005-04-28 18:48:22.000000000 +0100 @@ -31,6 +31,18 @@ #include "OSSaudiooutput.h" #include "../Misc/Util.h" +/* borrowed from glib2 */ +#define SHORT_SWAP_LE_BE(val) ((short) ( \ + (short) ((short) (val) >> 8) | \ + (short) ((short) (val) << 8))) + +static void swap_endian(short *data, int length) +{ + int i; + for (i = 0; i < length; i += 1, data++) + *data = SHORT_SWAP_LE_BE(*data); +} + OSSaudiooutput::OSSaudiooutput(){ int i; int snd_bitsize=16; @@ -76,6 +88,9 @@ smps[i*2]=(short int) (l*32767.0); smps[i*2+1]=(short int) (r*32767.0); }; +#ifdef __BIG_ENDIAN + swap_endian(smps, SOUND_BUFFER_SIZE*4); +#endif write(snd_handle,smps,SOUND_BUFFER_SIZE*4);// *2 because is 16 bit, again * 2 because is stereo };