mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-03 09:01:52 -05:00
pcm: direct - move the direct struct init to _snd_pcm_direct_new()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
446777c67e
commit
27f4a85a95
5 changed files with 78 additions and 131 deletions
|
|
@ -2097,3 +2097,66 @@ void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix)
|
||||||
((dmix->slave_hw_ptr / dmix->slave_period_size) *
|
((dmix->slave_hw_ptr / dmix->slave_period_size) *
|
||||||
dmix->slave_period_size);
|
dmix->slave_period_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type,
|
||||||
|
const char *name, struct snd_pcm_direct_open_conf *opts,
|
||||||
|
struct slave_params *params, snd_pcm_stream_t stream, int mode)
|
||||||
|
{
|
||||||
|
snd_pcm_direct_t *dmix;
|
||||||
|
int fail_sem_loop = 10;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
dmix = calloc(1, sizeof(snd_pcm_direct_t));
|
||||||
|
if (!dmix)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = snd_pcm_direct_parse_bindings(dmix, params, opts->bindings);
|
||||||
|
if (ret < 0) {
|
||||||
|
free(dmix);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
dmix->ipc_key = opts->ipc_key;
|
||||||
|
dmix->ipc_perm = opts->ipc_perm;
|
||||||
|
dmix->ipc_gid = opts->ipc_gid;
|
||||||
|
dmix->tstamp_type = opts->tstamp_type;
|
||||||
|
dmix->semid = -1;
|
||||||
|
dmix->shmid = -1;
|
||||||
|
dmix->shmptr = (void *) -1;
|
||||||
|
dmix->type = type;
|
||||||
|
|
||||||
|
ret = snd_pcm_new(pcmp, type, name, stream, mode);
|
||||||
|
if (ret < 0) {
|
||||||
|
_err_nosem:
|
||||||
|
free(dmix->bindings);
|
||||||
|
free(dmix);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ret = snd_pcm_direct_semaphore_create_or_connect(dmix);
|
||||||
|
if (ret < 0) {
|
||||||
|
SNDERR("unable to create IPC semaphore");
|
||||||
|
goto _err_nosem;
|
||||||
|
}
|
||||||
|
ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
|
||||||
|
if (ret < 0) {
|
||||||
|
snd_pcm_direct_semaphore_discard(dmix);
|
||||||
|
if (--fail_sem_loop <= 0)
|
||||||
|
goto _err_nosem;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = snd_pcm_direct_shm_create_or_connect(dmix);
|
||||||
|
if (ret < 0) {
|
||||||
|
SNDERR("unable to create IPC shm instance");
|
||||||
|
snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
|
||||||
|
goto _err_nosem;
|
||||||
|
} else {
|
||||||
|
*_dmix = dmix;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -365,3 +365,7 @@ struct snd_pcm_direct_open_conf {
|
||||||
};
|
};
|
||||||
|
|
||||||
int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf, int stream, struct snd_pcm_direct_open_conf *rec);
|
int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf, int stream, struct snd_pcm_direct_open_conf *rec);
|
||||||
|
|
||||||
|
int _snd_pcm_direct_new(snd_pcm_t **pcmp, snd_pcm_direct_t **_dmix, int type,
|
||||||
|
const char *name, struct snd_pcm_direct_open_conf *opts,
|
||||||
|
struct slave_params *params, snd_pcm_stream_t stream, int mode);
|
||||||
|
|
|
||||||
|
|
@ -999,9 +999,8 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
snd_pcm_stream_t stream, int mode)
|
snd_pcm_stream_t stream, int mode)
|
||||||
{
|
{
|
||||||
snd_pcm_t *pcm = NULL, *spcm = NULL;
|
snd_pcm_t *pcm = NULL, *spcm = NULL;
|
||||||
snd_pcm_direct_t *dmix = NULL;
|
snd_pcm_direct_t *dmix;
|
||||||
int ret, first_instance;
|
int ret, first_instance;
|
||||||
int fail_sem_loop = 10;
|
|
||||||
|
|
||||||
assert(pcmp);
|
assert(pcmp);
|
||||||
|
|
||||||
|
|
@ -1010,50 +1009,11 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dmix = calloc(1, sizeof(snd_pcm_direct_t));
|
ret = _snd_pcm_direct_new(pcmp, &dmix, SND_PCM_TYPE_DMIX, name, opts, params, stream, mode);
|
||||||
if (!dmix) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto _err_nosem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_pcm_direct_parse_bindings(dmix, params, opts->bindings);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto _err_nosem;
|
return ret;
|
||||||
|
first_instance = ret;
|
||||||
dmix->ipc_key = opts->ipc_key;
|
|
||||||
dmix->ipc_perm = opts->ipc_perm;
|
|
||||||
dmix->ipc_gid = opts->ipc_gid;
|
|
||||||
dmix->tstamp_type = opts->tstamp_type;
|
|
||||||
dmix->semid = -1;
|
|
||||||
dmix->shmid = -1;
|
|
||||||
|
|
||||||
ret = snd_pcm_new(&pcm, dmix->type = SND_PCM_TYPE_DMIX, name, stream, mode);
|
|
||||||
if (ret < 0)
|
|
||||||
goto _err;
|
|
||||||
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
ret = snd_pcm_direct_semaphore_create_or_connect(dmix);
|
|
||||||
if (ret < 0) {
|
|
||||||
SNDERR("unable to create IPC semaphore");
|
|
||||||
goto _err_nosem;
|
|
||||||
}
|
|
||||||
ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
|
|
||||||
if (ret < 0) {
|
|
||||||
snd_pcm_direct_semaphore_discard(dmix);
|
|
||||||
if (--fail_sem_loop <= 0)
|
|
||||||
goto _err_nosem;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
first_instance = ret = snd_pcm_direct_shm_create_or_connect(dmix);
|
|
||||||
if (ret < 0) {
|
|
||||||
SNDERR("unable to create IPC shm instance");
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pcm->ops = &snd_pcm_dmix_ops;
|
pcm->ops = &snd_pcm_dmix_ops;
|
||||||
pcm->fast_ops = &snd_pcm_dmix_fast_ops;
|
pcm->fast_ops = &snd_pcm_dmix_fast_ops;
|
||||||
pcm->private_data = dmix;
|
pcm->private_data = dmix;
|
||||||
|
|
|
||||||
|
|
@ -694,7 +694,6 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
snd_pcm_direct_t *dshare = NULL;
|
snd_pcm_direct_t *dshare = NULL;
|
||||||
int ret, first_instance;
|
int ret, first_instance;
|
||||||
unsigned int chn;
|
unsigned int chn;
|
||||||
int fail_sem_loop = 10;
|
|
||||||
|
|
||||||
assert(pcmp);
|
assert(pcmp);
|
||||||
|
|
||||||
|
|
@ -703,50 +702,10 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dshare = calloc(1, sizeof(snd_pcm_direct_t));
|
ret = _snd_pcm_direct_new(pcmp, &dshare, SND_PCM_TYPE_DSHARE, name, opts, params, stream, mode);
|
||||||
if (!dshare) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto _err_nosem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_pcm_direct_parse_bindings(dshare, params, opts->bindings);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto _err_nosem;
|
return ret;
|
||||||
|
first_instance = ret;
|
||||||
dshare->ipc_key = opts->ipc_key;
|
|
||||||
dshare->ipc_perm = opts->ipc_perm;
|
|
||||||
dshare->ipc_gid = opts->ipc_gid;
|
|
||||||
dshare->tstamp_type = opts->tstamp_type;
|
|
||||||
dshare->semid = -1;
|
|
||||||
dshare->shmid = -1;
|
|
||||||
dshare->shmptr = (void *) -1;
|
|
||||||
|
|
||||||
ret = snd_pcm_new(&pcm, dshare->type = SND_PCM_TYPE_DSHARE, name, stream, mode);
|
|
||||||
if (ret < 0)
|
|
||||||
goto _err_nosem;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
ret = snd_pcm_direct_semaphore_create_or_connect(dshare);
|
|
||||||
if (ret < 0) {
|
|
||||||
SNDERR("unable to create IPC semaphore");
|
|
||||||
goto _err_nosem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_pcm_direct_semaphore_down(dshare, DIRECT_IPC_SEM_CLIENT);
|
|
||||||
if (ret < 0) {
|
|
||||||
snd_pcm_direct_semaphore_discard(dshare);
|
|
||||||
if (--fail_sem_loop <= 0)
|
|
||||||
goto _err_nosem;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
first_instance = ret = snd_pcm_direct_shm_create_or_connect(dshare);
|
|
||||||
if (ret < 0) {
|
|
||||||
SNDERR("unable to create IPC shm instance");
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dshare->bindings) {
|
if (!dshare->bindings) {
|
||||||
pcm->ops = &snd_pcm_dshare_dummy_ops;
|
pcm->ops = &snd_pcm_dshare_dummy_ops;
|
||||||
|
|
|
||||||
|
|
@ -566,7 +566,7 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
{
|
{
|
||||||
snd_pcm_t *pcm = NULL, *spcm = NULL;
|
snd_pcm_t *pcm = NULL, *spcm = NULL;
|
||||||
snd_pcm_direct_t *dsnoop = NULL;
|
snd_pcm_direct_t *dsnoop = NULL;
|
||||||
int ret, first_instance, fail_sem_loop = 10;
|
int ret, first_instance;
|
||||||
|
|
||||||
assert(pcmp);
|
assert(pcmp);
|
||||||
|
|
||||||
|
|
@ -575,50 +575,11 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dsnoop = calloc(1, sizeof(snd_pcm_direct_t));
|
ret = _snd_pcm_direct_new(pcmp, &dsnoop, SND_PCM_TYPE_DSNOOP, name, opts, params, stream, mode);
|
||||||
if (!dsnoop) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto _err_nosem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_pcm_direct_parse_bindings(dsnoop, params, opts->bindings);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto _err_nosem;
|
return ret;
|
||||||
|
first_instance = ret;
|
||||||
dsnoop->ipc_key = opts->ipc_key;
|
|
||||||
dsnoop->ipc_perm = opts->ipc_perm;
|
|
||||||
dsnoop->ipc_gid = opts->ipc_gid;
|
|
||||||
dsnoop->tstamp_type = opts->tstamp_type;
|
|
||||||
dsnoop->semid = -1;
|
|
||||||
dsnoop->shmid = -1;
|
|
||||||
|
|
||||||
ret = snd_pcm_new(&pcm, dsnoop->type = SND_PCM_TYPE_DSNOOP, name, stream, mode);
|
|
||||||
if (ret < 0)
|
|
||||||
goto _err_nosem;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
ret = snd_pcm_direct_semaphore_create_or_connect(dsnoop);
|
|
||||||
if (ret < 0) {
|
|
||||||
SNDERR("unable to create IPC semaphore");
|
|
||||||
goto _err_nosem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_pcm_direct_semaphore_down(dsnoop, DIRECT_IPC_SEM_CLIENT);
|
|
||||||
if (ret < 0) {
|
|
||||||
snd_pcm_direct_semaphore_discard(dsnoop);
|
|
||||||
if (--fail_sem_loop <= 0)
|
|
||||||
goto _err_nosem;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
first_instance = ret = snd_pcm_direct_shm_create_or_connect(dsnoop);
|
|
||||||
if (ret < 0) {
|
|
||||||
SNDERR("unable to create IPC shm instance");
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pcm->ops = &snd_pcm_dsnoop_ops;
|
pcm->ops = &snd_pcm_dsnoop_ops;
|
||||||
pcm->fast_ops = &snd_pcm_dsnoop_fast_ops;
|
pcm->fast_ops = &snd_pcm_dsnoop_fast_ops;
|
||||||
pcm->private_data = dsnoop;
|
pcm->private_data = dsnoop;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue