This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Audio Clicks issue in ALSA application

Dear TI E2E Community,

Am hearing the clicks sound as soon as my GSM call ALSA application is started, I tried turning off the ADC & DAC in my stereo codec(UDA1345TS interfaced to davinci mcasp0) during bootup using amixer & then ran my GSM app, but still am hearing this issue

For your reference, I have hereby attached the GSM application & the asound.conf(modified for routing)

Application design

----------------------

GSM MIC [Analog Data]->GSM_PCM_OUT [Digital Data]->SDIN[Digital Data]->OUTP[Analog Data] ->VINR[Analog Data] ->I2S[Digital Data]-> VOUTR[Analog Data]-> Board Speaker[Analog Data]

 

GSM Speaker [Analog Data] <- GSM_PCM_IN[Digital Data] <- SDOUT[Digital Data] <- MICLP [Analog Data]<- VOUTL [Analog Data]<- I2S [Digital Data] <-VINL[Analog Data]<-Board MIC [Analog Data]

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#define BUF_BYTES 128
 
int main (int argc, char *argv[]) {
	int err, rc ;
	unsigned char buf_right[BUF_BYTES];
	unsigned char buf_left[BUF_BYTES];
	 //char *buf;
	int size; 
	snd_pcm_t *playback_handle_right;
	snd_pcm_t *capture_handle_right;
	
	snd_pcm_t *playback_handle_left;
	snd_pcm_t *capture_handle_left;


#if 0	
	char* device = "default";
	if (argc > 1) device = argv[1];
#endif
	char* crdevice ;
        char* prdevice ;
        char* cldevice ;
        char* pldevice ;


	unsigned int rate ;
	unsigned int nchannels = 1;
	snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
	unsigned int buf_frames_right = BUF_BYTES / nchannels / 2;
	unsigned int buf_frames_left = BUF_BYTES / nchannels / 2;

        if(argc != 2 )
        {
            printf("\nUsage is : application  sampling_rate \n\n\t Ex: ./gsm_application_target 8000 \n\n\t Supported sampling rates are: \n\t 1) 8000 \n\t 2) 16000 \n\t 3) 32000 \n\t 4) 44100 \n\t 5) 48000 \n\n NOTE: Any number other than given sampling rate takes default as 48000\n\n");
            exit(1);
        }

        rate = (int)atoi(argv[1]);

        if(rate == 8000)
        {
           crdevice = "VINR8";
           prdevice = "VOUTR8";
           cldevice = "VINL8";
           pldevice = "VOUTL8";

           
        }else if(rate == 16000)
        {
            crdevice = "VINR16";
            prdevice = "VOUTR16";
            cldevice = "VINL16";
            pldevice = "VOUTL16";

        }else if(rate == 32000)
        {
            crdevice = "VINR32";
            prdevice = "VOUTR32";
            cldevice = "VINL32";
            pldevice = "VOUTL32";

        }else if(rate == 44100)
        {
            crdevice = "VINR44";
            prdevice = "VOUTR44";
            cldevice = "VINL44";
            pldevice = "VOUTL44";

        }else
        {
            crdevice = "VINR48";
            prdevice = "VOUTR48";
            cldevice = "VINL48";
            pldevice = "VOUTL48";
            rate = 48000;
        }



///// RIGHT CHANNEL 
newStart:
	if ((err = snd_pcm_open (&playback_handle_right, prdevice, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
	fprintf (stderr, "cannot open playback right audio device %s (%s)\n", prdevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Playback right audio device  successfully %s \n", prdevice);
	}
	
	if ((err = snd_pcm_set_params(playback_handle_right, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "Playback right open error: %s\n", snd_strerror(err)); exit(1);
	}

	if ((err = snd_pcm_open (&capture_handle_right, crdevice, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
	fprintf (stderr, "cannot open capture right audio device %s (%s)\n", crdevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Capture right audio device successfully %s \n", crdevice);
	}

	if ((err = snd_pcm_set_params(capture_handle_right, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "capture right open error: %s\n", snd_strerror(err)); exit(1);
	}	

////LEFT CHANNEL
	if ((err = snd_pcm_open (&playback_handle_left, pldevice, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
	fprintf (stderr, "cannot open playback left audio device %s (%s)\n", pldevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Playback left audio device successfully %s \n", pldevice);
	}
	
	if ((err = snd_pcm_set_params(playback_handle_left, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "Playback left open error: %s\n", snd_strerror(err)); exit(1);
	}

	if ((err = snd_pcm_open (&capture_handle_left, cldevice, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
	fprintf (stderr, "cannot open capture left audio device %s (%s)\n", cldevice, snd_strerror (err)); exit (1);
	}
	else
	{
	  printf("Opened Capture left audio device successfully %s \n", crdevice);
	}

	if ((err = snd_pcm_set_params(capture_handle_left, format, SND_PCM_ACCESS_RW_INTERLEAVED, nchannels, rate, 1, 500000)) < 0) { /* 0.5sec */
	fprintf(stderr, "capture left open error: %s\n", snd_strerror(err)); exit(1);
	}



	while(1) {
///// RIGHT CHANNEL 
                /***** Read the Frames from the Capture Device ******/
                err = snd_pcm_readi(capture_handle_right, buf_right, buf_frames_right);
                if(err == -EPIPE)
                {
                    printf("capture right func: overrun!");
                    rc = snd_pcm_prepare(capture_handle_right);
                    if(rc < 0)
                    {
                       printf("Fail to recover from problem, Need to reopen the device\n");
                      // goto reStart;
                    }
                }else if(err < 0)
                {
                    fprintf (stderr, "read from audio interface right failed (%s)\n", snd_strerror (err));
                    rc = snd_pcm_recover(capture_handle_right,err,0);
                    if(rc < 0)
                    {
                       printf("Fail to recover from problem, Need to reopen the device\n");
                      // goto reStart;
                    }
                }else if(err != (int)buf_frames_right)
                {
                    fprintf(stderr, "short read, read %d frames\n", err);
                }


               /****  Write the capture frame to playback ******/
                err = snd_pcm_writei (playback_handle_right, buf_right, buf_frames_right);
                if(err == -EPIPE)
                {
                  printf("Playback right func: overrun!");
                  rc = snd_pcm_prepare(playback_handle_right);
                  if(rc < 0)
                  {
                      printf("Fail to recover from problem, Need to reopen the device\n");
                     // goto reStart;
                  }
                }else if(err < 0)
                {
                    fprintf (stderr, "write to audio interface right failed (%s)\n", snd_strerror (err));
                    rc = snd_pcm_recover(playback_handle_right, err, 0);
                    if(rc < 0)
                    {
                        printf("Fail to recover from problem, Need to reopen the device\n");
                        //goto reStart;
                    }
                }else if(err != (int)buf_frames_right)
                {
                    fprintf(stderr, "short write, write %d frames\n", err);
                }


////LEFT CHANNEL
	        /***** Read the Frames from the Capture Device ******/
                err = snd_pcm_readi(capture_handle_left, buf_left, buf_frames_left);
                if(err == -EPIPE)
                {
                    printf("capture right func: overrun!");
                    rc = snd_pcm_prepare(capture_handle_left);
                    if(rc < 0)
                    {
                       printf("Fail to recover from problem, Need to reopen the device\n");
                      // goto reStart;
                    }
                }else if(err < 0)
                {
                    fprintf (stderr, "read from audio interface right failed (%s)\n", snd_strerror (err));
                    rc = snd_pcm_recover(capture_handle_left,err,0);
                    if(rc < 0)
                    {
                       printf("Fail to recover from problem, Need to reopen the device\n");
                      // goto reStart;
                    }
                }else if(err != (int)buf_frames_left)
                {
                    fprintf(stderr, "short read, read %d frames\n", err);
                }
	        

		   /****  Write the capture frame to playback ******/
                err = snd_pcm_writei (playback_handle_left, buf_left, buf_frames_left);
                if(err == -EPIPE)
                {
                  printf("Playback right func: overrun!");
                  rc = snd_pcm_prepare(playback_handle_left);
                  if(rc < 0)
                  {
                      printf("Fail to recover from problem, Need to reopen the device\n");
                     // goto reStart;
                  }
                }else if(err < 0)
                {
                    fprintf (stderr, "write to audio interface right failed (%s)\n", snd_strerror (err));
                    rc = snd_pcm_recover(playback_handle_left, err, 0);
                    if(rc < 0)
                    {
                        printf("Fail to recover from problem, Need to reopen the device\n");
                       // goto reStart;
                    }
                }else if(err != (int)buf_frames_left)
                {
                    fprintf(stderr, "short write, write %d frames\n", err);
                }


	}
 
reStart:	fprintf (stderr, "close handles\n");
	        snd_pcm_close (playback_handle_right);
	        snd_pcm_close (capture_handle_right);

	        snd_pcm_close (playback_handle_left);
	        snd_pcm_close (capture_handle_left);
                sleep(2);              
                //goto newStart;
                
	        return 0;
} 

#This configuration for 3.14 kernel
pcm.card0 {
  type hw
  card 0
}

ctl.card0 {
  type hw
  card 0
}


###Dshare 

pcm.VOUTL8 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
		        rate 8000
                buffer_size 4097
                period_size 1000
                period_time 125000

        }
        bindings {
                0 0
        }
}

pcm.VOUTR8 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
		        rate 8000
		        buffer_size 4097
                period_size 1000
         	    period_time 125000
		
        }
        bindings {
                0 1
        }
}
### Dsnoop splited channels
pcm.VINL8 {
        type dsnoop
        ipc_key 32
        slave {

	            pcm "hw:0,0"
	            rate 8000
                buffer_size 4097    
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  0
}

pcm.VINR8 {
     type dsnoop
     ipc_key 32
     slave {
	            pcm "hw:0,0"
	            rate 8000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  1
}



###Dshare 16k 

pcm.VOUTL16 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 16000
                buffer_size 4097
                period_size 1000
                period_time 125000

        }
        bindings {
                0 0
        }
}

pcm.VOUTR16 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 16000
                buffer_size 4097
                period_size 1000
                period_time 125000


        }
        bindings {
                0 1
        }
}
### Dsnoop splited channels
pcm.VINL16 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 16000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  0
}

pcm.VINR16 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 16000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  1
}


###Dshare 32k

pcm.VOUTL32 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 32000
                buffer_size 4097
                period_size 1000
                period_time 125000

        }
        bindings {
                0 0
        }
}

pcm.VOUTR32 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 32000
                buffer_size 4097
                period_size 1000
                period_time 125000


        }
        bindings {
                0 1
        }
}
### Dsnoop splited channels
pcm.VINL32 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 32000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  0
}

pcm.VINR32 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 32000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  1
}


###Dshare 44k

pcm.VOUTL44 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 44100
                buffer_size 4097
                period_size 1000
                period_time 125000

        }
        bindings {
                0 0
        }
}

pcm.VOUTR44 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 44100
                buffer_size 4097
                period_size 1000
                period_time 125000


        }
        bindings {
                0 1
        }
}
### Dsnoop splited channels
pcm.VINL44 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 44100
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  0
}

pcm.VINR44 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 44100
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  1
}

###Dshare 48k
pcm.VOUTL48 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 48000
                buffer_size 4097
                period_size 1000
                period_time 125000

        }
        bindings {
                0 0
        }
}

pcm.VOUTR48 {
        type dshare
        ipc_key 6678293
        ipc_key_add_uid yes
        slave {
                pcm "hw:0,0"
                rate 48000
                buffer_size 4097
                period_size 1000
                period_time 125000


        }
        bindings {
                0 1
        }
}

### Dsnoop splited channels
pcm.VINL48 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 48000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  0
}

pcm.VINR48 {
     type dsnoop
     ipc_key 32
     slave {

                pcm "hw:0,0"
                rate 48000
                buffer_size 4097
                period_size 1000
                period_time 125000

         channels 2
     }
     bindings.0  1
}



pcm.!default VOUTR8
pcm.!default VOUTL8
pcm.!default VOUTR16
pcm.!default VOUTL16
pcm.!default VOUTR32
pcm.!default VOUTL32
pcm.!default VOUTR44
pcm.!default VOUTL44
pcm.!default VOUTR48
pcm.!default VOUTL48


Could you please help me out or provide any valuable inputs or guidance w.r.t the issue

Other option am thinking is to turn off the ADC & DAC in stereo codec inside the GSM app

Kindly do the needful as early as possible,

Many thanks in advance

  • GSM clicks usually are inducted directly onto PCB traces during initial phase of call, when GSM power levels are established with the GSM network. Software will not help you here. You will need filtering on the audio lines and possibly on power supplies to suppress these noises.