diff -Nraub mplayer.ori/libmpcodecs/ae_pcm.c mplayer/libmpcodecs/ae_pcm.c --- mplayer.ori/libmpcodecs/ae_pcm.c 2006-06-05 15:43:08.000000000 -0400 +++ mplayer/libmpcodecs/ae_pcm.c 2006-10-10 23:06:51.000000000 -0400 @@ -37,7 +37,27 @@ static int encode_pcm(audio_encoder_t *encoder, uint8_t *dest, void *src, int nsamples, int max_size) { max_size = min(nsamples, max_size); + if (encoder->params.channels == 6 || encoder->params.channels == 5) { + //Codec wants: L R C LFE SL SR L R C SL SR + //We have: L R SL SR C LFE L R SL SR C + max_size -= max_size % (2*encoder->params.channels); + int i; + for (i = 0; i < max_size; i += 2*encoder->params.channels) { + if (encoder->params.channels == 6) { + ((uint32_t*)(dest+i))[0] = ((uint32_t*)(src+i))[0]; //L R -> 0,1 + ((uint32_t*)(dest+i))[1] = ((uint32_t*)(src+i))[2]; //C LFE -> 2,3 + ((uint32_t*)(dest+i))[2] = ((uint32_t*)(src+i))[1]; //SL SR -> 4,5 + } else { + ((uint16_t*)(dest+i))[0] = ((uint16_t*)(src+i))[0]; //L -> 0 + ((uint16_t*)(dest+i))[1] = ((uint16_t*)(src+i))[1]; //R -> 1 + ((uint16_t*)(dest+i))[2] = ((uint16_t*)(src+i))[4]; //C -> 2 + ((uint16_t*)(dest+i))[3] = ((uint16_t*)(src+i))[2]; //SL -> 3 + ((uint16_t*)(dest+i))[4] = ((uint16_t*)(src+i))[3]; //SR -> 4 + } + } + } else { memcpy(dest, src, max_size); + } return max_size; }