mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-05 13:30:00 -05:00
pcm: add mmap_begin callback to snd_pcm_fast_ops_t api
main motivation for adding the callback is to use it to enable operation on mmaped buffer before user access for pcm_file plugin support for MMAP read access with masking by data from input file is not implemented for pcm_file plugin, by adding this callback implementing such feature can be done by rewriting next continuous portion of buffer on each mmap_begin call plugins like softvol use pcm_plugin interface and overwrite the buffer by looping around it in avail_update callback, this patch hopes to simplify the task by adding new api callback, removing the need for rewriting pcm_file (to use pcm_plugin callbacks) and careful checking when looping around whole mmaped buffer Signed-off-by: Adam Miartus <amiartus@de.adit-jv.com> Reviewed-by: Timo Wischer <twischer@de.adit-jv.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
108a2f4379
commit
e520f45480
2 changed files with 7 additions and 0 deletions
|
|
@ -7129,7 +7129,13 @@ int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
|
||||||
snd_pcm_uframes_t f;
|
snd_pcm_uframes_t f;
|
||||||
snd_pcm_uframes_t avail;
|
snd_pcm_uframes_t avail;
|
||||||
const snd_pcm_channel_area_t *xareas;
|
const snd_pcm_channel_area_t *xareas;
|
||||||
|
|
||||||
assert(pcm && areas && offset && frames);
|
assert(pcm && areas && offset && frames);
|
||||||
|
|
||||||
|
if (pcm->fast_ops->mmap_begin)
|
||||||
|
return pcm->fast_ops->mmap_begin(pcm->fast_op_arg, areas, offset, frames);
|
||||||
|
|
||||||
|
/* fallback for plugins that do not specify new callback */
|
||||||
xareas = snd_pcm_mmap_areas(pcm);
|
xareas = snd_pcm_mmap_areas(pcm);
|
||||||
if (xareas == NULL)
|
if (xareas == NULL)
|
||||||
return -EBADFD;
|
return -EBADFD;
|
||||||
|
|
|
||||||
|
|
@ -184,6 +184,7 @@ typedef struct {
|
||||||
int (*poll_descriptors)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space); /* locked */
|
int (*poll_descriptors)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space); /* locked */
|
||||||
int (*poll_revents)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents); /* locked */
|
int (*poll_revents)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents); /* locked */
|
||||||
int (*may_wait_for_avail_min)(snd_pcm_t *pcm, snd_pcm_uframes_t avail);
|
int (*may_wait_for_avail_min)(snd_pcm_t *pcm, snd_pcm_uframes_t avail);
|
||||||
|
int (*mmap_begin)(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames); /* locked */
|
||||||
} snd_pcm_fast_ops_t;
|
} snd_pcm_fast_ops_t;
|
||||||
|
|
||||||
struct _snd_pcm {
|
struct _snd_pcm {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue