From: Nilhcraiv <nilhcraiv@gmail.com>
To: alsa-devel@alsa-project.org
Subject: Playback - Overwrite buffer with silence
Date: Sat, 11 Apr 2015 17:47:39 +0200 [thread overview]
Message-ID: <5529421B.7050601@gmail.com> (raw)
Hello,
I am working 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
but this does not work. Does the doc is wrong?
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_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
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
next reply other threads:[~2015-04-11 15:47 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-11 15:47 Nilhcraiv [this message]
2015-04-11 20:05 ` Playback - Overwrite buffer with silence Clemens Ladisch
[not found] ` <14caab5d6d0.2759.f6cded7c48a54b1428bcde82a72ee7d7@gmail.com>
2015-04-11 23:15 ` Nilhcraiv
2015-04-12 5:58 ` Clemens Ladisch
[not found] ` <14cb331e1c8.2759.f6cded7c48a54b1428bcde82a72ee7d7@gmail.com>
2015-04-13 14:45 ` Nilhcraiv
2015-04-14 12:37 ` Clemens Ladisch
2015-04-14 17:29 ` Nilhcraiv
2015-04-14 19:46 ` Clemens Ladisch
2015-04-15 3:14 ` Raymond Yau
[not found] ` <552EBB90.8040707@gmail.com>
2015-04-15 19:40 ` Clemens Ladisch
2015-04-16 18:32 ` Nilhcraiv
2015-04-16 20:16 ` Clemens Ladisch
2015-04-17 0:57 ` Raymond Yau
2015-04-22 18:13 ` Nilhcraiv
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5529421B.7050601@gmail.com \
--to=nilhcraiv@gmail.com \
--cc=alsa-devel@alsa-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox