Skip to content

Commit

Permalink
ALSA: usb-audio: fix Line6 Helix audio format rates
Browse files Browse the repository at this point in the history
Line6 Helix and HX stomp devices don't support retrieving
the number of clock sample rate.

Add a quirk to set it to 48Khz by default.

[ fixed wrong variable initialization changes by tiwai ]

Signed-off-by: Nicola Lunghi <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
Nicola Lunghi authored and tiwai committed Jul 7, 2019
1 parent ba18ca2 commit d4bd305
Showing 1 changed file with 43 additions and 3 deletions.
46 changes: 43 additions & 3 deletions sound/usb/format.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,33 @@ static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip,
return nr_rates;
}

/* Line6 Helix series don't support the UAC2_CS_RANGE usb function
* call. Return a static table of known clock rates.
*/
static int line6_parse_audio_format_rates_quirk(struct snd_usb_audio *chip,
struct audioformat *fp)
{
switch (chip->usb_id) {
case USB_ID(0x0E41, 0x4241): /* Line6 Helix */
case USB_ID(0x0E41, 0x4242): /* Line6 Helix Rack */
case USB_ID(0x0E41, 0x4244): /* Line6 Helix LT */
case USB_ID(0x0E41, 0x4246): /* Line6 HX-Stomp */
/* supported rates: 48Khz */
kfree(fp->rate_table);
fp->rate_table = kmalloc(sizeof(int), GFP_KERNEL);
if (!fp->rate_table)
return -ENOMEM;
fp->nr_rates = 1;
fp->rate_min = 48000;
fp->rate_max = 48000;
fp->rates = SNDRV_PCM_RATE_48000;
fp->rate_table[0] = 48000;
return 0;
}

return -ENODEV;
}

/*
* parse the format descriptor and stores the possible sample rates
* on the audioformat table (audio class v2 and v3).
Expand All @@ -307,7 +334,7 @@ static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip,
{
struct usb_device *dev = chip->dev;
unsigned char tmp[2], *data;
int nr_triplets, data_size, ret = 0;
int nr_triplets, data_size, ret = 0, ret_l6;
int clock = snd_usb_clock_find_source(chip, fp->protocol,
fp->clock, false);

Expand All @@ -326,9 +353,22 @@ static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip,
tmp, sizeof(tmp));

if (ret < 0) {
dev_err(&dev->dev,
"%s(): unable to retrieve number of sample rates (clock %d)\n",
/* line6 helix devices don't support UAC2_CS_CONTROL_SAM_FREQ call */
ret_l6 = line6_parse_audio_format_rates_quirk(chip, fp);
if (ret_l6 == -ENODEV) {
/* no line6 device found continue showing the error */
dev_err(&dev->dev,
"%s(): unable to retrieve number of sample rates (clock %d)\n",
__func__, clock);
goto err;
}
if (ret_l6 == 0) {
dev_info(&dev->dev,
"%s(): unable to retrieve number of sample rates: set it to a predefined value (clock %d).\n",
__func__, clock);
return 0;
}
ret = ret_l6;
goto err;
}

Expand Down

0 comments on commit d4bd305

Please sign in to comment.