[alsa-devel] Cleanup patches for snd-usb-caiaq
Following up to this mail are 3 patches to clean up the snd-usb-caiaq driver.
[PATCH 1/3] snd-usb-caiaq: only warn once on streaming errors [PATCH 2/3] snd-usb-caiaq: drop bogus iso packets [PATCH 3/3] snd-usb-caiaq: bump version number
Limit the number of printed warnings to one in case of streaming errors. printk() happens to be expensive, especially in code called as often as here.
Signed-off-by: Daniel Mack daniel@caiaq.de --- sound/usb/caiaq/caiaq-audio.c | 4 +++- sound/usb/caiaq/caiaq-device.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/sound/usb/caiaq/caiaq-audio.c b/sound/usb/caiaq/caiaq-audio.c index fc6d571..577b112 100644 --- a/sound/usb/caiaq/caiaq-audio.c +++ b/sound/usb/caiaq/caiaq-audio.c @@ -114,6 +114,7 @@ static int stream_start(struct snd_usb_caiaqdev *dev) dev->output_panic = 0; dev->first_packet = 1; dev->streaming = 1; + dev->warned = 0;
for (i = 0; i < N_URBS; i++) { ret = usb_submit_urb(dev->data_urbs_in[i], GFP_ATOMIC); @@ -406,10 +407,11 @@ static void read_in_urb(struct snd_usb_caiaqdev *dev, break; }
- if (dev->input_panic || dev->output_panic) { + if ((dev->input_panic || dev->output_panic) && !dev->warned) { debug("streaming error detected %s %s\n", dev->input_panic ? "(input)" : "", dev->output_panic ? "(output)" : ""); + dev->warned = 1; } }
diff --git a/sound/usb/caiaq/caiaq-device.h b/sound/usb/caiaq/caiaq-device.h index 3edd94d..4aa8631 100644 --- a/sound/usb/caiaq/caiaq-device.h +++ b/sound/usb/caiaq/caiaq-device.h @@ -90,7 +90,7 @@ struct snd_usb_caiaqdev { int audio_out_buf_pos[MAX_STREAMS]; int period_in_count[MAX_STREAMS]; int period_out_count[MAX_STREAMS]; - int input_panic, output_panic; + int input_panic, output_panic, warned; char *audio_in_buf, *audio_out_buf; unsigned int samplerates;
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 --- sound/usb/caiaq/caiaq-audio.c | 6 ++++++ sound/usb/caiaq/caiaq-device.c | 2 ++ sound/usb/caiaq/caiaq-device.h | 2 +- 3 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/sound/usb/caiaq/caiaq-audio.c b/sound/usb/caiaq/caiaq-audio.c index 577b112..08d51e0 100644 --- a/sound/usb/caiaq/caiaq-audio.c +++ b/sound/usb/caiaq/caiaq-audio.c @@ -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); diff --git a/sound/usb/caiaq/caiaq-device.c b/sound/usb/caiaq/caiaq-device.c index 5cf841e..8af47c2 100644 --- a/sound/usb/caiaq/caiaq-device.c +++ b/sound/usb/caiaq/caiaq-device.c @@ -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; } diff --git a/sound/usb/caiaq/caiaq-device.h b/sound/usb/caiaq/caiaq-device.h index 4aa8631..1a2a21d 100644 --- a/sound/usb/caiaq/caiaq-device.h +++ b/sound/usb/caiaq/caiaq-device.h @@ -92,7 +92,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];
Signed-off-by: Daniel Mack daniel@caiaq.de --- sound/usb/caiaq/caiaq-device.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/sound/usb/caiaq/caiaq-device.c b/sound/usb/caiaq/caiaq-device.c index 8af47c2..cf573a9 100644 --- a/sound/usb/caiaq/caiaq-device.c +++ b/sound/usb/caiaq/caiaq-device.c @@ -42,7 +42,7 @@ #endif
MODULE_AUTHOR("Daniel Mack daniel@caiaq.de"); -MODULE_DESCRIPTION("caiaq USB audio, version 1.3.12"); +MODULE_DESCRIPTION("caiaq USB audio, version 1.3.13"); MODULE_LICENSE("GPL"); MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2}," "{Native Instruments, RigKontrol3},"
At Wed, 18 Mar 2009 11:03:52 +0100, Daniel Mack wrote:
Following up to this mail are 3 patches to clean up the snd-usb-caiaq driver.
[PATCH 1/3] snd-usb-caiaq: only warn once on streaming errors [PATCH 2/3] snd-usb-caiaq: drop bogus iso packets [PATCH 3/3] snd-usb-caiaq: bump version number
All look good and are applied now. Thanks!
Takashi
participants (2)
-
Daniel Mack
-
Takashi Iwai