ALSA: pcm: Don't notify internal PCMs
authorTakashi Iwai <tiwai@suse.de>
Fri, 20 Feb 2015 16:04:08 +0000 (17:04 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 20 Feb 2015 18:51:50 +0000 (19:51 +0100)
Notifier shouldn't listen to the changes of internal PCMs.

Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm.c

index d440629e08e2da242a4c8d1c52586adab8ba32c4..542dbc6f54e8222ee429ff84447785e38fa36a5c 100644 (file)
@@ -888,8 +888,9 @@ static int snd_pcm_free(struct snd_pcm *pcm)
 
        if (!pcm)
                return 0;
-       list_for_each_entry(notify, &snd_pcm_notify_list, list) {
-               notify->n_unregister(pcm);
+       if (!pcm->internal) {
+               list_for_each_entry(notify, &snd_pcm_notify_list, list)
+                       notify->n_unregister(pcm);
        }
        if (pcm->private_free)
                pcm->private_free(pcm);
@@ -1129,7 +1130,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
        mutex_lock(&pcm->open_mutex);
        wake_up(&pcm->open_wait);
        list_del_init(&pcm->list);
-       for (cidx = 0; cidx < 2; cidx++)
+       for (cidx = 0; cidx < 2; cidx++) {
                for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) {
                        snd_pcm_stream_lock_irq(substream);
                        if (substream->runtime) {
@@ -1139,8 +1140,10 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
                        }
                        snd_pcm_stream_unlock_irq(substream);
                }
-       list_for_each_entry(notify, &snd_pcm_notify_list, list) {
-               notify->n_disconnect(pcm);
+       }
+       if (!pcm->internal) {
+               list_for_each_entry(notify, &snd_pcm_notify_list, list)
+                       notify->n_disconnect(pcm);
        }
        for (cidx = 0; cidx < 2; cidx++) {
                snd_unregister_device(&pcm->streams[cidx].dev);