1*4882a593SmuzhiyunFrom d967585c6178fab1e1d39c9bfd278e0b2432664d Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Nyx Zheng <zyh@rock-chips.com> 3*4882a593SmuzhiyunDate: Mon, 16 Jul 2018 17:33:30 +0800 4*4882a593SmuzhiyunSubject: [PATCH 3/4] add gain for audio input 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunSigned-off-by: Nyx Zheng <zyh@rock-chips.com> 7*4882a593Smuzhiyun--- 8*4882a593Smuzhiyun src/pcm/pcm.c | 19 +++++++++++++++++++ 9*4882a593Smuzhiyun 1 file changed, 19 insertions(+) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyundiff --git a/src/pcm/pcm.c b/src/pcm/pcm.c 12*4882a593Smuzhiyunindex a2eb529..2720f07 100644 13*4882a593Smuzhiyun--- a/src/pcm/pcm.c 14*4882a593Smuzhiyun+++ b/src/pcm/pcm.c 15*4882a593Smuzhiyun@@ -854,6 +854,24 @@ void DCBDoing(void* pIn, int length, int channels) 16*4882a593Smuzhiyun } 17*4882a593Smuzhiyun #endif 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun+void add_gain(void* pIn, int length, int channels) 20*4882a593Smuzhiyun+{ 21*4882a593Smuzhiyun+ int i = 0; 22*4882a593Smuzhiyun+ int16_t * pInBuf = (int16_t *)pIn; 23*4882a593Smuzhiyun+ char *alsa_gain_level = getenv("ALSA_LIB_ADD_GAIN"); 24*4882a593Smuzhiyun+ if(alsa_gain_level) { 25*4882a593Smuzhiyun+ int level = atoi(alsa_gain_level); 26*4882a593Smuzhiyun+ //printf("gain level:%d\n",level); 27*4882a593Smuzhiyun+ for(i = 0; i < length; i ++ ) { 28*4882a593Smuzhiyun+ int curChannel = i % channels; 29*4882a593Smuzhiyun+ if(curChannel < channels - 2 ) {//audio loopback no need to add gain 30*4882a593Smuzhiyun+ (*pInBuf) <<= level; 31*4882a593Smuzhiyun+ } 32*4882a593Smuzhiyun+ pInBuf++; 33*4882a593Smuzhiyun+ } 34*4882a593Smuzhiyun+ } 35*4882a593Smuzhiyun+} 36*4882a593Smuzhiyun+ 37*4882a593Smuzhiyun /* check whether the PCM is in the unexpected state */ 38*4882a593Smuzhiyun static int bad_pcm_state(snd_pcm_t *pcm, unsigned int supported_states, 39*4882a593Smuzhiyun unsigned int noop_states) 40*4882a593Smuzhiyun@@ -1813,6 +1831,7 @@ snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t 41*4882a593Smuzhiyun #ifdef DCB_FILTER_16BIT 42*4882a593Smuzhiyun DCBDoing((void*)buffer, tmp * pcm->frame_bits / 8 / sizeof(int16_t), pcm->channels); 43*4882a593Smuzhiyun #endif 44*4882a593Smuzhiyun+ add_gain((void*)buffer, tmp * pcm->frame_bits / 8 / sizeof(int16_t), pcm->channels); 45*4882a593Smuzhiyun return tmp; 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun-- 49*4882a593Smuzhiyun2.20.1 50*4882a593Smuzhiyun 51