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:
Jaroslav Kysela 2021-04-13 18:55:37 +02:00
parent 446777c67e
commit 27f4a85a95
5 changed files with 78 additions and 131 deletions

View file

@ -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_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;
}