diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c index b75809c8..bf28db98 100644 --- a/src/pcm/pcm_dshare.c +++ b/src/pcm/pcm_dshare.c @@ -508,7 +508,8 @@ static int snd_pcm_dshare_close(snd_pcm_t *pcm) if (dshare->timer) snd_timer_close(dshare->timer); - do_silence(pcm); + if (dshare->bindings) + do_silence(pcm); snd_pcm_direct_semaphore_down(dshare, DIRECT_IPC_SEM_CLIENT); dshare->shmptr->u.dshare.chn_mask &= ~dshare->u.dshare.chn_mask; snd_pcm_close(dshare->spcm); @@ -621,6 +622,12 @@ static void snd_pcm_dshare_dump(snd_pcm_t *pcm, snd_output_t *out) snd_pcm_dump(dshare->spcm, out); } +static const snd_pcm_ops_t snd_pcm_dshare_dummy_ops = { + .close = snd_pcm_dshare_close, +}; + +static const snd_pcm_fast_ops_t snd_pcm_dshare_fast_dummy_ops; + static const snd_pcm_ops_t snd_pcm_dshare_ops = { .close = snd_pcm_dshare_close, .info = snd_pcm_direct_info, @@ -712,13 +719,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name, ret = snd_pcm_direct_parse_bindings(dshare, params, opts->bindings); if (ret < 0) goto _err_nosem; - - if (!dshare->bindings) { - SNDERR("dshare: specify bindings!!!"); - ret = -EINVAL; - goto _err_nosem; - } - + dshare->ipc_key = opts->ipc_key; dshare->ipc_perm = opts->ipc_perm; dshare->ipc_gid = opts->ipc_gid; @@ -751,9 +752,14 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name, SNDERR("unable to create IPC shm instance"); goto _err; } - - pcm->ops = &snd_pcm_dshare_ops; - pcm->fast_ops = &snd_pcm_dshare_fast_ops; + + if (!dshare->bindings) { + pcm->ops = &snd_pcm_dshare_dummy_ops; + pcm->fast_ops = &snd_pcm_dshare_fast_dummy_ops; + } else { + pcm->ops = &snd_pcm_dshare_ops; + pcm->fast_ops = &snd_pcm_dshare_fast_ops; + } pcm->private_data = dshare; dshare->state = SND_PCM_STATE_OPEN; dshare->slowptr = opts->slowptr; @@ -843,7 +849,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name, dshare->spcm = spcm; } - for (chn = 0; chn < dshare->channels; chn++) { + for (chn = 0; dshare->bindings && (chn < dshare->channels); chn++) { unsigned int dchn = dshare->bindings ? dshare->bindings[chn] : chn; if (dchn != UINT_MAX) dshare->u.dshare.chn_mask |= (1ULL << dchn);