diff -Nraub mplayer.ori/libmpcodecs/ad_pcm.c mplayer/libmpcodecs/ad_pcm.c --- mplayer.ori/libmpcodecs/ad_pcm.c 2006-09-12 11:58:43.000000000 -0400 +++ mplayer/libmpcodecs/ad_pcm.c 2006-10-10 13:15:11.000000000 -0400 @@ -17,6 +17,8 @@ LIBAD_EXTERN(pcm) +static void *tmp_buff = NULL; + static int init(sh_audio_t *sh_audio) { WAVEFORMATEX *h=sh_audio->wf; @@ -90,6 +92,8 @@ } if (!sh_audio->samplesize) // this would cause MPlayer to hang later sh_audio->samplesize = 2; + if (sh_audio->channels == 6 || sh_audio->channels == 5) + tmp_buff = malloc(2 * sh_audio->samplesize); return 1; } @@ -101,6 +105,10 @@ static void uninit(sh_audio_t *sh) { + if (tmp_buff) { + free(tmp_buff); + tmp_buff = NULL; + } } static int control(sh_audio_t *sh,int cmd,void* arg, ...) @@ -126,5 +134,15 @@ // based on channels in preinit() return -1; len=demux_read_data(sh_audio->ds,buf,len); + if (sh_audio->channels == 6 || sh_audio->channels == 5) { + //Source channel order: L R C LFE SL SR or L R C SL SR + //We want: L R SL SR C LFE or L R SL SR C + int i, samples = len / sh_audio->samplesize; + for (i = 0; i < samples; i += sh_audio->channels) { + memcpy(tmp_buff, buf+(i+2)*sh_audio->samplesize, ((sh_audio->channels+1)%2+1)*sh_audio->samplesize); // C (LFE) -> tmp + memcpy(buf+(i+2)*sh_audio->samplesize, buf+(i+(sh_audio->channels+1)%2+3)*sh_audio->samplesize, 2*sh_audio->samplesize); // SL SR -> 2,3 + memcpy(buf+(i+4)*sh_audio->samplesize, tmp_buff, ((sh_audio->channels+1)%2+1)*sh_audio->samplesize); // C (LFE) -> 4(,5) + } + } return len; }