提交 9311c9b4 编写于 作者: D Daniel Mack 提交者: 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: NDaniel Mack <daniel@caiaq.de>
Tested-by: NMark Hills <mark@pogo.org.uk>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册