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: Daniel Mack <daniel@caiaq.de> Tested-by: Mark Hills <mark@pogo.org.uk> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
1313e70414
commit
9311c9b4f1
3 changed files with 9 additions and 1 deletions
|
@ -377,6 +377,9 @@ static void read_in_urb_mode2(struct snd_usb_caiaqdev *dev,
|
|||
|
||||
for (stream = 0; stream < dev->n_streams; stream++, i++) {
|
||||
sub = dev->sub_capture[stream];
|
||||
if (dev->input_panic)
|
||||
usb_buf[i] = 0;
|
||||
|
||||
if (sub) {
|
||||
struct snd_pcm_runtime *rt = sub->runtime;
|
||||
char *audio_buf = rt->dma_area;
|
||||
|
@ -398,6 +401,9 @@ static void read_in_urb(struct snd_usb_caiaqdev *dev,
|
|||
if (!dev->streaming)
|
||||
return;
|
||||
|
||||
if (iso->actual_length < dev->bpp)
|
||||
return;
|
||||
|
||||
switch (dev->spec.data_alignment) {
|
||||
case 0:
|
||||
read_in_urb_mode0(dev, urb, iso);
|
||||
|
|
|
@ -251,6 +251,8 @@ int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *dev,
|
|||
|
||||
if (dev->audio_parm_answer != 1)
|
||||
debug("unable to set the device's audio params\n");
|
||||
else
|
||||
dev->bpp = bpp;
|
||||
|
||||
return dev->audio_parm_answer == 1 ? 0 : -EINVAL;
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ struct snd_usb_caiaqdev {
|
|||
int period_out_count[MAX_STREAMS];
|
||||
int input_panic, output_panic, warned;
|
||||
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_capture[MAX_STREAMS];
|
||||
|
|
Loading…
Reference in a new issue