How to downmix 5.1 and 7.1 channels to 2 channels
Amanda Ava Koci Pereira
arsoftware10 at gmail.com
Tue Oct 20 04:32:12 CEST 2020
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
More information about the Alsa-devel
mailing list