mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2026-02-26 01:40:07 -05:00
pcm: add SND_CTL_EINTR open mode
Add possibility to return -EINTR instead waiting for the event. The applications may want to handle -EINTR condition themselves. BugLink: https://github.com/alsa-project/alsa-lib/issues/228 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
d6d5982d3a
commit
507d906abb
8 changed files with 13 additions and 8 deletions
|
|
@ -356,6 +356,9 @@ typedef enum _snd_ctl_type {
|
||||||
/** Read only (flag for open mode) \hideinitializer */
|
/** Read only (flag for open mode) \hideinitializer */
|
||||||
#define SND_CTL_READONLY 0x0004
|
#define SND_CTL_READONLY 0x0004
|
||||||
|
|
||||||
|
/** Return EINTR instead blocking (flag for open mode) \hideinitializer */
|
||||||
|
#define SND_CTL_EINTR 0x0080
|
||||||
|
|
||||||
/** CTL handle */
|
/** CTL handle */
|
||||||
typedef struct _snd_ctl snd_ctl_t;
|
typedef struct _snd_ctl snd_ctl_t;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -265,13 +265,14 @@ int snd_ctl_nonblock(snd_ctl_t *ctl, int nonblock)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef DOC_HIDDEN
|
#ifndef DOC_HIDDEN
|
||||||
int snd_ctl_new(snd_ctl_t **ctlp, snd_ctl_type_t type, const char *name)
|
int snd_ctl_new(snd_ctl_t **ctlp, snd_ctl_type_t type, const char *name, int mode)
|
||||||
{
|
{
|
||||||
snd_ctl_t *ctl;
|
snd_ctl_t *ctl;
|
||||||
ctl = calloc(1, sizeof(*ctl));
|
ctl = calloc(1, sizeof(*ctl));
|
||||||
if (!ctl)
|
if (!ctl)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
ctl->type = type;
|
ctl->type = type;
|
||||||
|
ctl->mode = mode;
|
||||||
if (name)
|
if (name)
|
||||||
ctl->name = strdup(name);
|
ctl->name = strdup(name);
|
||||||
INIT_LIST_HEAD(&ctl->async_handlers);
|
INIT_LIST_HEAD(&ctl->async_handlers);
|
||||||
|
|
|
||||||
|
|
@ -716,7 +716,7 @@ int snd_ctl_ext_create(snd_ctl_ext_t *ext, const char *name, int mode)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_ctl_new(&ctl, SND_CTL_TYPE_EXT, name);
|
err = snd_ctl_new(&ctl, SND_CTL_TYPE_EXT, name, mode);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -444,7 +444,7 @@ int snd_ctl_hw_open(snd_ctl_t **handle, const char *name, int card, int mode)
|
||||||
hw->fd = fd;
|
hw->fd = fd;
|
||||||
hw->protocol = ver;
|
hw->protocol = ver;
|
||||||
|
|
||||||
err = snd_ctl_new(&ctl, SND_CTL_TYPE_HW, name);
|
err = snd_ctl_new(&ctl, SND_CTL_TYPE_HW, name, mode);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
free(hw);
|
free(hw);
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ struct _snd_ctl {
|
||||||
snd_ctl_type_t type;
|
snd_ctl_type_t type;
|
||||||
const snd_ctl_ops_t *ops;
|
const snd_ctl_ops_t *ops;
|
||||||
void *private_data;
|
void *private_data;
|
||||||
|
int mode;
|
||||||
int nonblock;
|
int nonblock;
|
||||||
int poll_fd;
|
int poll_fd;
|
||||||
struct list_head async_handlers;
|
struct list_head async_handlers;
|
||||||
|
|
@ -93,7 +94,7 @@ struct _snd_hctl {
|
||||||
/* make local functions really local */
|
/* make local functions really local */
|
||||||
#define snd_ctl_new snd1_ctl_new
|
#define snd_ctl_new snd1_ctl_new
|
||||||
|
|
||||||
int snd_ctl_new(snd_ctl_t **ctlp, snd_ctl_type_t type, const char *name);
|
int snd_ctl_new(snd_ctl_t **ctlp, snd_ctl_type_t type, const char *name, int mode);
|
||||||
int _snd_ctl_poll_descriptor(snd_ctl_t *ctl);
|
int _snd_ctl_poll_descriptor(snd_ctl_t *ctl);
|
||||||
#define _snd_ctl_async_descriptor _snd_ctl_poll_descriptor
|
#define _snd_ctl_async_descriptor _snd_ctl_poll_descriptor
|
||||||
int snd_ctl_hw_open(snd_ctl_t **handle, const char *name, int card, int mode);
|
int snd_ctl_hw_open(snd_ctl_t **handle, const char *name, int card, int mode);
|
||||||
|
|
|
||||||
|
|
@ -1148,7 +1148,7 @@ static int parse_map(snd_ctl_remap_t *priv, snd_config_t *conf)
|
||||||
* changed in future.
|
* changed in future.
|
||||||
*/
|
*/
|
||||||
int snd_ctl_remap_open(snd_ctl_t **handlep, const char *name, snd_config_t *remap,
|
int snd_ctl_remap_open(snd_ctl_t **handlep, const char *name, snd_config_t *remap,
|
||||||
snd_config_t *map, snd_ctl_t *child, int mode ATTRIBUTE_UNUSED)
|
snd_config_t *map, snd_ctl_t *child, int mode)
|
||||||
{
|
{
|
||||||
snd_ctl_remap_t *priv;
|
snd_ctl_remap_t *priv;
|
||||||
snd_ctl_t *ctl;
|
snd_ctl_t *ctl;
|
||||||
|
|
@ -1195,7 +1195,7 @@ int snd_ctl_remap_open(snd_ctl_t **handlep, const char *name, snd_config_t *rema
|
||||||
priv->numid_remap_active = priv->map_items > 0;
|
priv->numid_remap_active = priv->map_items > 0;
|
||||||
|
|
||||||
priv->child = child;
|
priv->child = child;
|
||||||
err = snd_ctl_new(&ctl, SND_CTL_TYPE_REMAP, name);
|
err = snd_ctl_new(&ctl, SND_CTL_TYPE_REMAP, name, mode);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
result = err;
|
result = err;
|
||||||
goto _err;
|
goto _err;
|
||||||
|
|
|
||||||
|
|
@ -502,7 +502,7 @@ int snd_ctl_shm_open(snd_ctl_t **handlep, const char *name, const char *sockname
|
||||||
shm->socket = sock;
|
shm->socket = sock;
|
||||||
shm->ctrl = ctrl;
|
shm->ctrl = ctrl;
|
||||||
|
|
||||||
err = snd_ctl_new(&ctl, SND_CTL_TYPE_SHM, name);
|
err = snd_ctl_new(&ctl, SND_CTL_TYPE_SHM, name, mode);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
result = err;
|
result = err;
|
||||||
goto _err;
|
goto _err;
|
||||||
|
|
|
||||||
|
|
@ -696,7 +696,7 @@ int snd_hctl_wait(snd_hctl_t *hctl, int timeout)
|
||||||
pollio = 0;
|
pollio = 0;
|
||||||
err_poll = poll(pfd, npfds, timeout);
|
err_poll = poll(pfd, npfds, timeout);
|
||||||
if (err_poll < 0) {
|
if (err_poll < 0) {
|
||||||
if (errno == EINTR && !CTLINABORT(hctl->ctl))
|
if (errno == EINTR && !CTLINABORT(hctl->ctl) && !(hctl->ctl->mode & SND_CTL_EINTR))
|
||||||
continue;
|
continue;
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue