[alsa-devel] [PATCH 2/2] pcm:plugin: Fix sound capture via MMAP access
From: Timo Wischer twischer@de.adit-jv.com
Distorted sound is heard if the capture device of an ioplug plugin is used, which is accessed through any ALSA plugin (like copy, linear, ...) via MMAP access. E.g. aplay -> loop -> copy -> arecord -M -> aplay -> hw:0 As mentioned in the ALSA API (see pcm/pcm.c:942): The function #snd_pcm_avail_update() have to be called before any mmap begin+commit operation.
Signed-off-by: Timo Wischer twischer@de.adit-jv.com Signed-off-by: Mounesh Sutar sutar.mounesh@gmail.com
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c index aaea2ab..ec57f6e 100644 --- a/src/pcm/pcm_plugin.c +++ b/src/pcm/pcm_plugin.c @@ -490,7 +490,14 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm) snd_pcm_uframes_t slave_offset; snd_pcm_uframes_t slave_frames = ULONG_MAX; snd_pcm_sframes_t result; - + /* As mentioned in the ALSA API (see pcm/pcm.c:942): + * The function #snd_pcm_avail_update() + * have to be called before any mmap begin+commit operation. + * Otherwise the snd_pcm_areas_copy will not called a second time. + * But this is needed, if the ring buffer wrap is reached and + * there is more data available. + */ + slave_size = snd_pcm_avail_update(slave); result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames); if (result < 0) { err = result;
On Tue, 04 Apr 2017 08:30:18 +0200, sutar.mounesh@gmail.com wrote:
From: Timo Wischer twischer@de.adit-jv.com
Distorted sound is heard if the capture device of an ioplug plugin is used, which is accessed through any ALSA plugin (like copy, linear, ...) via MMAP access. E.g. aplay -> loop -> copy -> arecord -M -> aplay -> hw:0 As mentioned in the ALSA API (see pcm/pcm.c:942): The function #snd_pcm_avail_update() have to be called before any mmap begin+commit operation.
Signed-off-by: Timo Wischer twischer@de.adit-jv.com Signed-off-by: Mounesh Sutar sutar.mounesh@gmail.com
Applied this one, too. Thanks.
Takashi
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c index aaea2ab..ec57f6e 100644 --- a/src/pcm/pcm_plugin.c +++ b/src/pcm/pcm_plugin.c @@ -490,7 +490,14 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm) snd_pcm_uframes_t slave_offset; snd_pcm_uframes_t slave_frames = ULONG_MAX; snd_pcm_sframes_t result;
/* As mentioned in the ALSA API (see pcm/pcm.c:942):
* The function #snd_pcm_avail_update()
* have to be called before any mmap begin+commit operation.
* Otherwise the snd_pcm_areas_copy will not called a second time.
* But this is needed, if the ring buffer wrap is reached and
* there is more data available.
*/
slave_size = snd_pcm_avail_update(slave); result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames); if (result < 0) { err = result;
-- 2.7.4
participants (2)
-
sutar.mounesh@gmail.com
-
Takashi Iwai