From 7aa38dd6a5210c277d560beff63f58278cc98729 Mon Sep 17 00:00:00 2001 From: Alban Peignier Date: Tue, 11 Nov 2014 14:10:24 +0100 Subject: [PATCH] Optimize passthroughs and output meters processing in AlsaPlay2Callback --- cae/cae_alsa.cpp | 83 ++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/cae/cae_alsa.cpp b/cae/cae_alsa.cpp index 6c7d7089..4de7561a 100644 --- a/cae/cae_alsa.cpp +++ b/cae/cae_alsa.cpp @@ -362,16 +362,24 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format) // Process Passthroughs // for(unsigned i=0;icapture_channels;i+=2) { - p=alsa_passthrough_ring[alsa_format->card][i/2]-> - read(alsa_format->passthrough_buffer,4*n)/4; - for(unsigned j=0;jchannels;j+=2) { - for(unsigned k=0;k<2;k++) { - for(int l=0;l - card_buffer)[alsa_format->channels*l+j+k]+= - (int16_t)((double)((int16_t *) - alsa_format->passthrough_buffer)[2*l+k]* - alsa_passthrough_volume[alsa_format->card][i/2][j/2]); + bool zero_volume = true; + for (unsigned j=0;jchannels && zero_volume;j+=1) { + zero_volume = (alsa_passthrough_volume[alsa_format->card][i/2][j] == 0.0); + } + if (!zero_volume) { + p=alsa_passthrough_ring[alsa_format->card][i/2]-> + read(alsa_format->passthrough_buffer,4*n)/4; + for(unsigned j=0;jchannels;j+=2) { + if (alsa_passthrough_volume[alsa_format->card][i/2][j/2] != 0.0) { + for(unsigned k=0;k<2;k++) { + for(int l=0;l + card_buffer)[alsa_format->channels*l+j+k]+= + (int16_t)((double)((int16_t *) + alsa_format->passthrough_buffer)[2*l+k]* + alsa_passthrough_volume[alsa_format->card][i/2][j/2]); + } + } } } } @@ -385,12 +393,11 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format) for(unsigned j=0;j<2;j++) { out_meter[port][j]=0; for(unsigned k=0;kbuffer_size;k++) { - if(((int16_t *)alsa_format-> - card_buffer)[alsa_format->channels*k+2*i+j]> - out_meter[i][j]) { - out_meter[i][j]= - ((int16_t *)alsa_format-> - card_buffer)[alsa_format->channels*k+2*i+j]; + int16_t sample = ((int16_t *)alsa_format-> + card_buffer)[alsa_format->channels*k+2*i+j]; + + if(sample> out_meter[i][j]) { + out_meter[i][j]= sample; } } alsa_output_meter[alsa_format->card][i][j]-> @@ -478,16 +485,24 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format) // Process Passthroughs // for(unsigned i=0;icapture_channels;i+=2) { - p=alsa_passthrough_ring[alsa_format->card][i/2]-> - read(alsa_format->passthrough_buffer,8*n)/8; - for(unsigned j=0;jchannels;j+=2) { - for(unsigned k=0;k<2;k++) { - for(int l=0;l - card_buffer)[alsa_format->channels*l+j+k]+= - (int32_t)((double)((int32_t *) - alsa_format->passthrough_buffer)[2*l+k]* - alsa_passthrough_volume[alsa_format->card][i/2][j/2]); + bool zero_volume = true; + for (unsigned j=0;jchannels && zero_volume;j+=1) { + zero_volume = (alsa_passthrough_volume[alsa_format->card][i/2][j] == 0.0); + } + if (!zero_volume) { + p=alsa_passthrough_ring[alsa_format->card][i/2]-> + read(alsa_format->passthrough_buffer,8*n)/8; + for(unsigned j=0;jchannels;j+=2) { + if (alsa_passthrough_volume[alsa_format->card][i/2][j/2] != 0.0) { + for(unsigned k=0;k<2;k++) { + for(int l=0;l + card_buffer)[alsa_format->channels*l+j+k]+= + (int32_t)((double)((int32_t *) + alsa_format->passthrough_buffer)[2*l+k]* + alsa_passthrough_volume[alsa_format->card][i/2][j/2]); + } + } } } } @@ -496,19 +511,17 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format) // // Process Output Meters // + unsigned buffer_width; + buffer_width = (alsa_format->buffer_size*2/alsa_format->periods); for(unsigned i=0;ichannels;i+=2) { unsigned port=i/2; for(unsigned j=0;j<2;j++) { out_meter[port][j]=0; - for(unsigned k=0; - k<(alsa_format->buffer_size*2/alsa_format->periods); - k++) { - if(((int16_t *)alsa_format-> - card_buffer)[alsa_format->channels*2*k+2*i+1+2*j]> - out_meter[port][j]) { - out_meter[port][j]= - ((int16_t *)alsa_format-> - card_buffer)[alsa_format->channels*2*k+2*i+1+2*j]; + for(unsigned k=0; k + card_buffer)[alsa_format->channels*2*k+2*i+1+2*j]; + if (sample > out_meter[port][j]) { + out_meter[port][j] = sample; } } alsa_output_meter[alsa_format->card][port][j]->