|
@@ -666,7 +666,9 @@ static void free_cable(struct snd_pcm_substream *substream)
|
|
|
return;
|
|
|
if (cable->streams[!substream->stream]) {
|
|
|
/* other stream is still alive */
|
|
|
+ spin_lock_irq(&cable->lock);
|
|
|
cable->streams[substream->stream] = NULL;
|
|
|
+ spin_unlock_irq(&cable->lock);
|
|
|
} else {
|
|
|
/* free the cable */
|
|
|
loopback->cables[substream->number][dev] = NULL;
|
|
@@ -705,7 +707,6 @@ static int loopback_open(struct snd_pcm_substream *substream)
|
|
|
loopback->cables[substream->number][dev] = cable;
|
|
|
}
|
|
|
dpcm->cable = cable;
|
|
|
- cable->streams[substream->stream] = dpcm;
|
|
|
|
|
|
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
|
|
|
|
|
@@ -737,6 +738,11 @@ static int loopback_open(struct snd_pcm_substream *substream)
|
|
|
runtime->hw = loopback_pcm_hardware;
|
|
|
else
|
|
|
runtime->hw = cable->hw;
|
|
|
+
|
|
|
+ spin_lock_irq(&cable->lock);
|
|
|
+ cable->streams[substream->stream] = dpcm;
|
|
|
+ spin_unlock_irq(&cable->lock);
|
|
|
+
|
|
|
unlock:
|
|
|
if (err < 0) {
|
|
|
free_cable(substream);
|