summaryrefslogtreecommitdiff
path: root/src/audio_dec
diff options
context:
space:
mode:
authorDiego E. 'Flameeyes' Pettenò <flameeyes@gmail.com>2008-12-15 19:13:59 +0100
committerDiego E. 'Flameeyes' Pettenò <flameeyes@gmail.com>2008-12-15 19:13:59 +0100
commit4c90da28e5dd01cb5fa01a293c418690d395d9f6 (patch)
treea7f262652b9a62bab6ec567bfced62528f4e4b9d /src/audio_dec
parent9c92484c911e0f3d401a0230c90c4bcf40b84c05 (diff)
parente5be769581739cdafd385d55896abca4816ea29e (diff)
downloadxine-lib-4c90da28e5dd01cb5fa01a293c418690d395d9f6.tar.gz
xine-lib-4c90da28e5dd01cb5fa01a293c418690d395d9f6.tar.bz2
Merge from 1.1; update PO files; make buildable.
--HG-- rename : include/xine.h.in => include/xine.h rename : src/xine-utils/attributes.h => include/xine/attributes.h rename : src/xine-engine/buffer.h => include/xine/buffer.h rename : m4/_xine.m4 => m4/types.m4 rename : po/libxine1.pot => po/libxine2.pot rename : src/libfaad/xine_faad_decoder.c => src/audio_dec/xine_faad_decoder.c rename : src/libspucc/cc_decoder.h => src/spu_dec/cc_decoder.h rename : src/libspucmml/xine_cmml_decoder.c => src/spu_dec/cmml_decoder.c rename : src/libspudec/xine_spu_decoder.c => src/spu_dec/spu_decoder.c rename : src/libspudvb/xine_spudvb_decoder.c => src/spu_dec/spudvb_decoder.c rename : src/libspucc/xine_cc_decoder.c => src/spu_dec/xine_cc_decoder.c rename : src/libmpeg2/mpeg2.h => src/video_dec/libmpeg2/mpeg2.h
Diffstat (limited to 'src/audio_dec')
-rw-r--r--src/audio_dec/xine_faad_decoder.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/audio_dec/xine_faad_decoder.c b/src/audio_dec/xine_faad_decoder.c
index 30850c903..9e0fd9546 100644
--- a/src/audio_dec/xine_faad_decoder.c
+++ b/src/audio_dec/xine_faad_decoder.c
@@ -276,7 +276,32 @@ static void faad_decode_audio ( faad_decoder_t *this, int end_frame ) {
lprintf("decoded %d/%d output %ld\n",
used, this->size, this->faac_finfo.samples );
-
+
+ /* Performing necessary channel reordering because aac uses a different
+ * layout than alsa:
+ *
+ * aac 5.1 channel layout: c l r ls rs lfe
+ * alsa 5.1 channel layout: l r ls rs c lfe
+ *
+ * Reordering is only necessary for 5.0 and above. Currently only 5.0
+ * and 5.1 is being taken care of, the rest will stay in the wrong order
+ * for now.
+ *
+ * WARNING: the following needs a output format of 16 bits per sample.
+ * TODO: - reorder while copying (in the while() loop) and optimizing
+ */
+ if(this->num_channels == 5 || this->num_channels == 6)
+ {
+ int i = 0;
+ uint16_t* buf = (uint16_t*)(sample_buffer);
+
+ for(; i < this->faac_finfo.samples; i += this->num_channels) {
+ uint16_t center = buf[i];
+ *((uint64_t*)(buf + i)) = *((uint64_t*)(buf + i + 1));
+ buf[i + 4] = center;
+ }
+ }
+
while( decoded ) {
audio_buffer = this->stream->audio_out->get_buffer (this->stream->audio_out);