]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: dshare: allow missing bindings
authorAdam Miartus <amiartus@de.adit-jv.com>
Wed, 24 Jul 2019 10:13:00 +0000 (12:13 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 24 Jul 2019 13:18:05 +0000 (15:18 +0200)
allow opening the device and start the audio clock without blocking
any channel

this is required if the audio clock has to be available all the time,
even when application is not streaming audio data

Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Adam Miartus <amiartus@de.adit-jv.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_dshare.c

index b75809c8aa06ca5c510681d98b8622937e45fa05..bf28db98d9bd3303a74f04f46464833c2994e0c9 100644 (file)
@@ -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);