|
@@ -192,6 +192,11 @@ static inline void loopback_timer_stop(struct loopback_pcm *dpcm)
|
|
|
dpcm->timer.expires = 0;
|
|
|
}
|
|
|
|
|
|
+static inline void loopback_timer_stop_sync(struct loopback_pcm *dpcm)
|
|
|
+{
|
|
|
+ del_timer_sync(&dpcm->timer);
|
|
|
+}
|
|
|
+
|
|
|
#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK)
|
|
|
#define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE)
|
|
|
#define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE)
|
|
@@ -326,6 +331,8 @@ static int loopback_prepare(struct snd_pcm_substream *substream)
|
|
|
struct loopback_cable *cable = dpcm->cable;
|
|
|
int bps, salign;
|
|
|
|
|
|
+ loopback_timer_stop_sync(dpcm);
|
|
|
+
|
|
|
salign = (snd_pcm_format_width(runtime->format) *
|
|
|
runtime->channels) / 8;
|
|
|
bps = salign * runtime->rate;
|
|
@@ -744,7 +751,7 @@ static int loopback_close(struct snd_pcm_substream *substream)
|
|
|
struct loopback *loopback = substream->private_data;
|
|
|
struct loopback_pcm *dpcm = substream->runtime->private_data;
|
|
|
|
|
|
- loopback_timer_stop(dpcm);
|
|
|
+ loopback_timer_stop_sync(dpcm);
|
|
|
mutex_lock(&loopback->cable_lock);
|
|
|
free_cable(substream);
|
|
|
mutex_unlock(&loopback->cable_lock);
|