Hello, I am developing an application and I have problems playing the audio with ALSA. In my application, I receive the sound data, this data must be decoded to be reproduce. In this process, always obtain an under-runerror. To fix this problem, I followed the documentation i.e. I use snd_pcm_sw_params_set_silence_size() and snd_pcm_sw_params_set_silence_threshold() to overwrite the buffer with silence. --> http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m___s_w___params.html#gaeb4a335a16981b5ea3fa671946fbdca3 If I obtain the boundary for ring pointers in frames at the start (snd_pcm_sw_params_get_boundary), the boundary is always zero. If I obtain the boundary each time (in the received_data() function) it is more than the buffer size and I get error when I put it in snd_pcm_sw_params_set_silence_size(), ¿Why?, Is it correct to use the boundary value?, ¿How I can avoid under-run by putting silence if I have not data at time? Here you can see a light version of my code (without error checking): #define FRAMES 240 #define PERIOD 1*FRAMES #define BUFFER_SIZE PERIOD*2 #define CHANNELS 1 #define SAMPLE_RATE 48000 snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams; int exact_rate,dir; snd_pcm_uframes_t boundary=0; snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_hw_params_alloca(&hwparams); snd_pcm_sw_params_alloca(&swparams); //PlayBack hw snd_pcm_open(&pcm_handle, "default", stream, 0); snd_pcm_hw_params_any(pcm_handle, hwparams); snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S16_LE); exact_rate = SAMPLE_RATE; snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &exact_rate, 0); snd_pcm_hw_params_set_channels(pcm_handle, hwparams, CHANNELS); snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams, BUFFER_SIZE); snd_pcm_hw_params(pcm_handle, hwparams); /*Avoid under-run sw*/ snd_pcm_sw_params_current(pcm_handle, swparams); snd_pcm_sw_params_get_boundary(swparams, &boundary); //Here, boundary is allways ZERO. snd_pcm_sw_params_set_stop_threshold(pcm_handle, swparams, 0); snd_pcm_sw_params_set_silence_threshold(pcm_handle, swparams, 0); //According to the doc. snd_pcm_sw_params_set_silence_size(pcm_handle, swparams, boundary); //According to the doc. snd_pcm_sw_params(pcm_handle,swparams); /*END Avoid under-run*/ snd_pcm_prepare(pcm_handle); void received_data(void *t_data)//short version of the function { short *decoded_data = NULL; int len=0; decoded_data = (short *)malloc(PERIOD * FRAME_SIZE); len = decoder(&decoded_data,t_data); snd_pcm_sw_params_get_boundary(swparams, &boundary); //Here, boundary is always a large number. snd_pcm_sw_params_set_silence_size(pcm_handle, swparams, boundary);// Here, boundary in frames is always a large number, and there are an error... snd_pcm_sw_params(pcm_handle,swparams); pcmreturn = snd_pcm_writei(pcm_handle, decoded_data, len);//In most cases there are UNDERRUN... xrun_recovery(&pcm_handle, pcmreturn);//Recover in case of an error. } Thanks in advance! Vicente ------------------------------------------------------------------------------ BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT Develop your own process in accordance with the BPMN 2 standard Learn Process modeling best practices with Bonita BPM through live exercises http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_ source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF _______________________________________________ Alsa-user mailing list Alsa-user@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/alsa-user