Hi guys...
We need some clues about to downmix 5.1 and 7.1 channels to 2 channels
for the moment we are using the following code ->
It works but fails miserably if all channels have data at same time
#define AR_K_P_ATTENUATION_LEVEL 1.0
int p = 0; int i; int save_channel_0_k_p; int save_channel_1_k_p; double save_channel_0_data_double_k_p; double save_channel_1_data_double_k_p; double sample_double_temp_k_p; int number_of_samples_k_p = decoded_frame->nb_samples; int ricardo_deslocador__ = 0; frame_processed_k_p = 1;
int outputBufferLen = number_of_samples_k_p * 2 * 2; *size_out=outputBufferLen; short *outputBuffer = (int16_t *)buf; int16_t * ar_buffer_ = (int16_t *) decoded_frame->data[0];
for(i=0; i < number_of_samples_k_p; i++) { //channel 0 int16_t sample_k_p = ar_buffer_[ricardo_deslocador__++];
save_channel_0_k_p = p;
save_channel_0_data_double_k_p = (double) sample_k_p;
p++;
/////////////////////////////////////////////// //channel 1 sample_k_p = ar_buffer_[ricardo_deslocador__++];
save_channel_1_k_p = p;//so usa no final...
save_channel_1_data_double_k_p = (double) sample_k_p;
p++;
//////////////////////////////////////////////// //center sample_k_p = ar_buffer_[ricardo_deslocador__++];
sample_double_temp_k_p = (double) sample_k_p;
sample_double_temp_k_p *= AR_K_P_ATTENUATION_LEVEL;
save_channel_0_data_double_k_p += sample_double_temp_k_p;
if(32767.0 < save_channel_0_data_double_k_p) { save_channel_0_data_double_k_p = 32767.0; }
if(-32768.0 > save_channel_0_data_double_k_p) { save_channel_0_data_double_k_p = -32768.0; }
sample_double_temp_k_p = (double) sample_k_p;
sample_double_temp_k_p *= AR_K_P_ATTENUATION_LEVEL;
save_channel_1_data_double_k_p += sample_double_temp_k_p;
if(32767.0 < save_channel_1_data_double_k_p) { save_channel_1_data_double_k_p = 32767.0; }
if(-32768.0 > save_channel_1_data_double_k_p) { save_channel_1_data_double_k_p = -32768.0; }
////////////////////////////////////////////////////// ///////subwoffer sample_k_p = ar_buffer_[ricardo_deslocador__++];
sample_double_temp_k_p = (double) sample_k_p;
sample_double_temp_k_p *= AR_K_P_ATTENUATION_LEVEL;
save_channel_0_data_double_k_p += sample_double_temp_k_p;
if(32767.0 < save_channel_0_data_double_k_p) { save_channel_0_data_double_k_p = 32767.0; }
if(-32768.0 > save_channel_0_data_double_k_p) { save_channel_0_data_double_k_p = -32768.0; }
sample_double_temp_k_p = (double) sample_k_p;
sample_double_temp_k_p *= AR_K_P_ATTENUATION_LEVEL;
save_channel_1_data_double_k_p += sample_double_temp_k_p;
if(32767.0 < save_channel_1_data_double_k_p) { save_channel_1_data_double_k_p = 32767.0; }
if(-32768.0 > save_channel_1_data_double_k_p) { save_channel_1_data_double_k_p = -32768.0; } //////////////////////////////////////////////////// /////surround left 4 sample_k_p = ar_buffer_[ricardo_deslocador__++];
sample_double_temp_k_p = (double) sample_k_p;
sample_double_temp_k_p *= AR_K_P_ATTENUATION_LEVEL;
save_channel_0_data_double_k_p += sample_double_temp_k_p;
if(32767.0 < save_channel_0_data_double_k_p) { save_channel_0_data_double_k_p = 32767.0; }
if(-32768.0 > save_channel_0_data_double_k_p) { save_channel_0_data_double_k_p = -32768.0; } /////////////////////////////////////////////// //////////surround right 5 sample_k_p = ar_buffer_[ricardo_deslocador__++];
sample_double_temp_k_p = (double) sample_k_p;
sample_double_temp_k_p *= AR_K_P_ATTENUATION_LEVEL;
save_channel_1_data_double_k_p += sample_double_temp_k_p;
if(32767.0 < save_channel_1_data_double_k_p) { save_channel_1_data_double_k_p = 32767.0; }
if(-32768.0 > save_channel_1_data_double_k_p) { save_channel_1_data_double_k_p = -32768.0; } ///////////////////////////////////////////// //finalizing
outputBuffer[save_channel_0_k_p] = (signed short) save_channel_0_data_double_k_p; outputBuffer[save_channel_1_k_p] = (signed short) save_channel_1_data_double_k_p; }
/*
if possible point us to the files in ALSA that make the downmix and it will be enough
Thanks a lot
*/
Ricardo