aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2021-10-11 17:49:23 +0200
committerTakashi Iwai <tiwai@suse.de>2021-10-11 17:49:23 +0200
commit097c3f74a96670bf8b7c7f2beec19eb80c027ccd (patch)
tree895575291d571e50a4c6dbd098e4a725467608c7
parent63e7c13d86141f3c9de51dcf2cf3510dc753b45e (diff)
downloadsalsa-lib-097c3f74a96670bf8b7c7f2beec19eb80c027ccd.tar.gz
Implementations of snd_pcm_mmap_writei() and snd_pcm_mmap_readi()
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--src/pcm.c8
-rw-r--r--src/pcm_macros.h36
2 files changed, 28 insertions, 16 deletions
diff --git a/src/pcm.c b/src/pcm.c
index da958e3..560be6c 100644
--- a/src/pcm.c
+++ b/src/pcm.c
@@ -577,14 +577,6 @@ int snd_pcm_dump(snd_pcm_t *pcm, snd_output_t *out)
* SILENCE AND COPY AREAS
*/
-static inline
-void *snd_pcm_channel_area_addr(const snd_pcm_channel_area_t *area,
- snd_pcm_uframes_t offset)
-{
- unsigned int bitofs = area->first + area->step * offset;
- return (char *) area->addr + bitofs / 8;
-}
-
#if SALSA_SUPPORT_4BIT_PCM
static int area_silence_4bit(const snd_pcm_channel_area_t *dst_area,
snd_pcm_uframes_t dst_offset,
diff --git a/src/pcm_macros.h b/src/pcm_macros.h
index 07cd538..ba46e96 100644
--- a/src/pcm_macros.h
+++ b/src/pcm_macros.h
@@ -2158,6 +2158,14 @@ int snd_pcm_get_params(snd_pcm_t *pcm,
return 0;
}
+static inline
+void *snd_pcm_channel_area_addr(const snd_pcm_channel_area_t *area,
+ snd_pcm_uframes_t offset)
+{
+ unsigned int bitofs = area->first + area->step * offset;
+ return (char *) area->addr + bitofs / 8;
+}
+
/*
* not implemented yet
*/
@@ -2170,23 +2178,35 @@ int snd_pcm_open_lconf(snd_pcm_t **pcm, const char *name,
return -ENXIO;
}
-__SALSA_EXPORT_FUNC __SALSA_NOT_IMPLEMENTED
+__SALSA_EXPORT_FUNC
snd_pcm_sframes_t snd_pcm_mmap_writei(snd_pcm_t *pcm, const void *buffer,
snd_pcm_uframes_t size)
{
- return -ENXIO;
+ const snd_pcm_channel_area_t *areas;
+ snd_pcm_uframes_t offset;
+
+ snd_pcm_mmap_begin(pcm, &areas, &offset, &size);
+ memcpy(snd_pcm_channel_area_addr(areas, offset), buffer,
+ snd_pcm_frames_to_bytes(pcm, size));
+ return snd_pcm_mmap_commit(pcm, offset, size);
}
-__SALSA_EXPORT_FUNC __SALSA_NOT_IMPLEMENTED
-snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs,
- snd_pcm_uframes_t size)
+__SALSA_EXPORT_FUNC
+snd_pcm_sframes_t snd_pcm_mmap_readi(snd_pcm_t *pcm, void *buffer,
+ snd_pcm_uframes_t size)
{
- return -ENXIO;
+ const snd_pcm_channel_area_t *areas;
+ snd_pcm_uframes_t offset;
+
+ snd_pcm_mmap_begin(pcm, &areas, &offset, &size);
+ memcpy(buffer, snd_pcm_channel_area_addr(areas, offset),
+ snd_pcm_frames_to_bytes(pcm, size));
+ return snd_pcm_mmap_commit(pcm, offset, size);
}
__SALSA_EXPORT_FUNC __SALSA_NOT_IMPLEMENTED
-snd_pcm_sframes_t snd_pcm_mmap_readi(snd_pcm_t *pcm, void *buffer,
- snd_pcm_uframes_t size)
+snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs,
+ snd_pcm_uframes_t size)
{
return -ENXIO;
}