Fix rbspeex on big endian hosts.

Big endian hosts need to byteswap the wave data when reading or writing to
disk. Should fix speex based voice- and talkfiles only containing garbage on
PPC machines.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25177 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dominik Riebeling 2010-03-14 18:20:18 +00:00
parent 3e9222de38
commit b6ed0b606f
2 changed files with 19 additions and 1 deletions

View file

@ -136,6 +136,7 @@ bool encode_file(FILE *fin, FILE *fout, float quality, int complexity,
int i, tmp, target_sr, numchan, bps, sr, numsamples, frame_size, lookahead; int i, tmp, target_sr, numchan, bps, sr, numsamples, frame_size, lookahead;
int nbytes; int nbytes;
bool ret = true; bool ret = true;
int a;
if (!get_wave_metadata(fin, &numchan, &bps, &sr, &numsamples)) { if (!get_wave_metadata(fin, &numchan, &bps, &sr, &numsamples)) {
snprintf(errstr, errlen, "invalid WAV file"); snprintf(errstr, errlen, "invalid WAV file");
@ -179,7 +180,15 @@ bool encode_file(FILE *fin, FILE *fout, float quality, int complexity,
snprintf(errstr, errlen, "could not read input file data"); snprintf(errstr, errlen, "could not read input file data");
ret = false; ret = false;
goto finish; goto finish;
} }
#if defined(__BIG_ENDIAN__)
/* byteswap read bytes to host endianess. */
a = numsamples;
while(a--) {
*(in + a) = ((unsigned short)(*(in + a)) >> 8) & 0x00ff
| ((unsigned short)(*(in + a)) << 8) & 0xff00;
}
#endif
if (volume != 1.0f) { if (volume != 1.0f) {
for (i = 0; i < numsamples; ++i) for (i = 0; i < numsamples; ++i)

View file

@ -89,6 +89,15 @@ int main(int argc, char **argv)
speex_bits_set_bit_buffer(&bits, indata, insize); speex_bits_set_bit_buffer(&bits, indata, insize);
while (speex_decode_int(st, &bits, out) == 0) { while (speex_decode_int(st, &bits, out) == 0) {
/* if no error, write decoded audio */ /* if no error, write decoded audio */
#if defined(__BIG_ENDIAN__)
/* byteswap samples from host (big) endianess to file (little) before
* writing. */
unsigned int a = frame_size - lookahead;
while(a--) {
out[lookahead + a] = ((unsigned short)out[lookahead+a]<<8)&0xff00
| ((unsigned short)out[lookahead+a]>>8)&0x00ff;
}
#endif
fwrite(out + lookahead, sizeof(short), frame_size - lookahead, fout); fwrite(out + lookahead, sizeof(short), frame_size - lookahead, fout);
samples += frame_size - lookahead; samples += frame_size - lookahead;
lookahead = 0; /* only skip samples at the start */ lookahead = 0; /* only skip samples at the start */