Commit 9311c9b4 authored by Daniel Mack's avatar Daniel Mack Committed by Takashi Iwai

ALSA: snd-usb-caiaq: drop bogus iso packets

Drop inbound packets that are smaller than expected. This has been
observed at the very beginning of the streaming transaction.

And when the hardware is in panic mode (which can only very rarely
happen in case of massive EMI chaos), mute the input channels.
Signed-off-by: default avatarDaniel Mack <daniel@caiaq.de>
Tested-by: default avatarMark Hills <mark@pogo.org.uk>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1313e704
...@@ -377,6 +377,9 @@ static void read_in_urb_mode2(struct snd_usb_caiaqdev *dev, ...@@ -377,6 +377,9 @@ static void read_in_urb_mode2(struct snd_usb_caiaqdev *dev,
for (stream = 0; stream < dev->n_streams; stream++, i++) { for (stream = 0; stream < dev->n_streams; stream++, i++) {
sub = dev->sub_capture[stream]; sub = dev->sub_capture[stream];
if (dev->input_panic)
usb_buf[i] = 0;
if (sub) { if (sub) {
struct snd_pcm_runtime *rt = sub->runtime; struct snd_pcm_runtime *rt = sub->runtime;
char *audio_buf = rt->dma_area; char *audio_buf = rt->dma_area;
...@@ -398,6 +401,9 @@ static void read_in_urb(struct snd_usb_caiaqdev *dev, ...@@ -398,6 +401,9 @@ static void read_in_urb(struct snd_usb_caiaqdev *dev,
if (!dev->streaming) if (!dev->streaming)
return; return;
if (iso->actual_length < dev->bpp)
return;
switch (dev->spec.data_alignment) { switch (dev->spec.data_alignment) {
case 0: case 0:
read_in_urb_mode0(dev, urb, iso); read_in_urb_mode0(dev, urb, iso);
......
...@@ -251,6 +251,8 @@ int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *dev, ...@@ -251,6 +251,8 @@ int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *dev,
if (dev->audio_parm_answer != 1) if (dev->audio_parm_answer != 1)
debug("unable to set the device's audio params\n"); debug("unable to set the device's audio params\n");
else
dev->bpp = bpp;
return dev->audio_parm_answer == 1 ? 0 : -EINVAL; return dev->audio_parm_answer == 1 ? 0 : -EINVAL;
} }
......
...@@ -91,7 +91,7 @@ struct snd_usb_caiaqdev { ...@@ -91,7 +91,7 @@ struct snd_usb_caiaqdev {
int period_out_count[MAX_STREAMS]; int period_out_count[MAX_STREAMS];
int input_panic, output_panic, warned; int input_panic, output_panic, warned;
char *audio_in_buf, *audio_out_buf; char *audio_in_buf, *audio_out_buf;
unsigned int samplerates; unsigned int samplerates, bpp;
struct snd_pcm_substream *sub_playback[MAX_STREAMS]; struct snd_pcm_substream *sub_playback[MAX_STREAMS];
struct snd_pcm_substream *sub_capture[MAX_STREAMS]; struct snd_pcm_substream *sub_capture[MAX_STREAMS];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment