Moved poll_* callbacks to fast_ops.
These callbacks may be called frequently indeed.
int snd_pcm_poll_descriptors_count(snd_pcm_t *pcm)
{
assert(pcm);
- if (pcm->ops->poll_descriptors_count)
- return pcm->ops->poll_descriptors_count(pcm->op_arg);
+ if (pcm->fast_ops->poll_descriptors_count)
+ return pcm->fast_ops->poll_descriptors_count(pcm->fast_op_arg);
return pcm->poll_fd_count;
}
*/
int snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
{
- int err;
-
assert(pcm && pfds);
- if (pcm->ops->poll_descriptors)
- return pcm->ops->poll_descriptors(pcm->op_arg, pfds, space);
+ if (pcm->fast_ops->poll_descriptors)
+ return pcm->fast_ops->poll_descriptors(pcm->fast_op_arg, pfds, space);
if (pcm->poll_fd < 0) {
SNDMSG("poll_fd < 0");
return -EIO;
int snd_pcm_poll_descriptors_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
{
assert(pcm && pfds && revents);
- if (pcm->ops->poll_revents)
- return pcm->ops->poll_revents(pcm->op_arg, pfds, nfds, revents);
+ if (pcm->fast_ops->poll_revents)
+ return pcm->fast_ops->poll_revents(pcm->fast_op_arg, pfds, nfds, revents);
if (nfds == 1) {
*revents = pfds->revents;
return 0;
.dump = snd_pcm_adpcm_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_alaw_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_copy_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_dmix_dump,
.nonblock = snd_pcm_direct_nonblock,
.async = snd_pcm_direct_async,
- .poll_revents = snd_pcm_dmix_poll_revents,
.mmap = snd_pcm_direct_mmap,
.munmap = snd_pcm_direct_munmap,
};
.readn = snd_pcm_dmix_readn,
.avail_update = snd_pcm_dmix_avail_update,
.mmap_commit = snd_pcm_dmix_mmap_commit,
+ .poll_descriptors = NULL,
+ .poll_descriptors_count = NULL,
+ .poll_revents = snd_pcm_dmix_poll_revents,
};
/**
.dump = snd_pcm_dshare_dump,
.nonblock = snd_pcm_direct_nonblock,
.async = snd_pcm_direct_async,
- .poll_revents = snd_pcm_direct_poll_revents,
.mmap = snd_pcm_direct_mmap,
.munmap = snd_pcm_direct_munmap,
};
.readn = snd_pcm_dshare_readn,
.avail_update = snd_pcm_dshare_avail_update,
.mmap_commit = snd_pcm_dshare_mmap_commit,
+ .poll_descriptors = NULL,
+ .poll_descriptors_count = NULL,
+ .poll_revents = snd_pcm_direct_poll_revents,
};
/**
.dump = snd_pcm_dsnoop_dump,
.nonblock = snd_pcm_direct_nonblock,
.async = snd_pcm_direct_async,
- .poll_revents = snd_pcm_direct_poll_revents,
.mmap = snd_pcm_direct_mmap,
.munmap = snd_pcm_direct_munmap,
};
.readn = snd_pcm_mmap_readn,
.avail_update = snd_pcm_dsnoop_avail_update,
.mmap_commit = snd_pcm_dsnoop_mmap_commit,
+ .poll_descriptors = NULL,
+ .poll_descriptors_count = NULL,
+ .poll_revents = snd_pcm_direct_poll_revents,
};
/**
.dump = snd_pcm_extplug_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_file_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_file_mmap,
.munmap = snd_pcm_file_munmap,
};
.readn = snd_pcm_file_readn,
.avail_update = snd_pcm_generic_avail_update,
.mmap_commit = snd_pcm_file_mmap_commit,
+ .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_generic_poll_descriptors,
+ .poll_revents = snd_pcm_generic_poll_revents,
};
/**
.dump = snd_pcm_hooks_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.readn = snd_pcm_generic_readn,
.avail_update = snd_pcm_generic_avail_update,
.mmap_commit = snd_pcm_generic_mmap_commit,
+ .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_generic_poll_descriptors,
+ .poll_revents = snd_pcm_generic_poll_revents,
};
/**
.dump = snd_pcm_hw_dump,
.nonblock = snd_pcm_hw_nonblock,
.async = snd_pcm_hw_async,
- .poll_revents = NULL,
.mmap = snd_pcm_hw_mmap,
.munmap = snd_pcm_hw_munmap,
};
.readn = snd_pcm_hw_readn,
.avail_update = snd_pcm_hw_avail_update,
.mmap_commit = snd_pcm_hw_mmap_commit,
+ .poll_descriptors = NULL,
+ .poll_descriptors_count = NULL,
+ .poll_revents = NULL,
};
/**
.dump = snd_pcm_iec958_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.close = snd_pcm_ioplug_close,
.nonblock = snd_pcm_ioplug_nonblock,
.async = snd_pcm_ioplug_async,
- .poll_descriptors_count = snd_pcm_ioplug_poll_descriptors_count,
- .poll_descriptors = snd_pcm_ioplug_poll_descriptors,
- .poll_revents = snd_pcm_ioplug_poll_revents,
.info = snd_pcm_ioplug_info,
.hw_refine = snd_pcm_ioplug_hw_refine,
.hw_params = snd_pcm_ioplug_hw_params,
.readn = snd_pcm_ioplug_readn,
.avail_update = snd_pcm_ioplug_avail_update,
.mmap_commit = snd_pcm_ioplug_mmap_commit,
+ .poll_descriptors_count = snd_pcm_ioplug_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_ioplug_poll_descriptors,
+ .poll_revents = snd_pcm_ioplug_poll_revents,
};
#endif /* !DOC_HIDDEN */
.dump = snd_pcm_ladspa_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_lfloat_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_linear_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
int (*close)(snd_pcm_t *pcm);
int (*nonblock)(snd_pcm_t *pcm, int nonblock);
int (*async)(snd_pcm_t *pcm, int sig, pid_t pid);
- int (*poll_descriptors_count)(snd_pcm_t *pcm);
- int (*poll_descriptors)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space);
- int (*poll_revents)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
int (*info)(snd_pcm_t *pcm, snd_pcm_info_t *info);
int (*hw_refine)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
int (*hw_params)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
snd_pcm_sframes_t (*readn)(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size);
snd_pcm_sframes_t (*avail_update)(snd_pcm_t *pcm);
snd_pcm_sframes_t (*mmap_commit)(snd_pcm_t *pcm, snd_pcm_uframes_t offset, snd_pcm_uframes_t size);
+ int (*poll_descriptors_count)(snd_pcm_t *pcm);
+ int (*poll_descriptors)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space);
+ int (*poll_revents)(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
} snd_pcm_fast_ops_t;
struct _snd_pcm {
snd_pcm_rbptr_t appl;
snd_pcm_rbptr_t hw;
snd_pcm_uframes_t min_align;
- unsigned int mmap_rw: 1;
- unsigned int mmap_shadow: 1;
- unsigned int donot_close: 1;
+ unsigned int mmap_rw: 1; /* use always mmapped buffer */
+ unsigned int mmap_shadow: 1; /* don't call actual mmap */
+ unsigned int donot_close: 1; /* don't close this PCM */
snd_pcm_channel_info_t *mmap_channels;
snd_pcm_channel_area_t *running_areas;
snd_pcm_channel_area_t *stopped_areas;
.dump = snd_pcm_meter_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.readn = snd_pcm_mmap_readn,
.avail_update = snd_pcm_meter_avail_update,
.mmap_commit = snd_pcm_meter_mmap_commit,
+ .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_generic_poll_descriptors,
+ .poll_revents = snd_pcm_generic_poll_revents,
};
/**
.dump = snd_pcm_mulaw_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_multi_dump,
.nonblock = snd_pcm_multi_nonblock,
.async = snd_pcm_multi_async,
- .poll_descriptors_count = snd_pcm_multi_poll_descriptors_count,
- .poll_descriptors = snd_pcm_multi_poll_descriptors,
- .poll_revents = snd_pcm_multi_poll_revents,
.mmap = snd_pcm_multi_mmap,
.munmap = snd_pcm_multi_munmap,
};
.unlink = snd_pcm_multi_unlink,
.avail_update = snd_pcm_multi_avail_update,
.mmap_commit = snd_pcm_multi_mmap_commit,
+ .poll_descriptors_count = snd_pcm_multi_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_multi_poll_descriptors,
+ .poll_revents = snd_pcm_multi_poll_revents,
};
/**
.dump = snd_pcm_plug_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_plug_mmap,
.munmap = snd_pcm_plug_munmap,
};
.readn = snd_pcm_plugin_readn,
.avail_update = snd_pcm_plugin_avail_update,
.mmap_commit = snd_pcm_plugin_mmap_commit,
+ .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_generic_poll_descriptors,
+ .poll_revents = snd_pcm_generic_poll_revents,
};
#endif
.readn = snd_pcm_mmap_readn,
.avail_update = snd_pcm_rate_avail_update,
.mmap_commit = snd_pcm_rate_mmap_commit,
+ .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
+ .poll_descriptors = snd_pcm_rate_poll_descriptors,
+ .poll_revents = snd_pcm_rate_poll_revents,
};
static snd_pcm_ops_t snd_pcm_rate_ops = {
.dump = snd_pcm_rate_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_revents = snd_pcm_rate_poll_revents,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_rate_poll_descriptors,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_route_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};
.dump = snd_pcm_softvol_dump,
.nonblock = snd_pcm_generic_nonblock,
.async = snd_pcm_generic_async,
- .poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_generic_poll_descriptors,
- .poll_revents = snd_pcm_generic_poll_revents,
.mmap = snd_pcm_generic_mmap,
.munmap = snd_pcm_generic_munmap,
};