diff options
author | Takashi Iwai <tiwai@suse.de> | 2021-10-11 17:49:23 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2021-10-11 17:49:23 +0200 |
commit | 097c3f74a96670bf8b7c7f2beec19eb80c027ccd (patch) | |
tree | 895575291d571e50a4c6dbd098e4a725467608c7 | |
parent | 63e7c13d86141f3c9de51dcf2cf3510dc753b45e (diff) | |
download | salsa-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.c | 8 | ||||
-rw-r--r-- | src/pcm_macros.h | 36 |
2 files changed, 28 insertions, 16 deletions
@@ -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; } |