Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 362232
b: refs/heads/master
c: 690a863
h: refs/heads/master
v: v3
  • Loading branch information
Torstein Hegge authored and Takashi Iwai committed Apr 3, 2013
1 parent 2dab49d commit c2f25f6
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 10250911c6f3531e9c2f4f1c6017782bc9bcd6d4
refs/heads/master: 690a863ff03d9a29ace2b752b8f802fba78a842f
45 changes: 35 additions & 10 deletions trunk/sound/usb/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface,
{
struct usb_device *dev = chip->dev;
unsigned char data[4];
int err, crate;
int err, cur_rate, prev_rate;
int clock = snd_usb_clock_find_source(chip, fmt->clock);

if (clock < 0)
Expand All @@ -266,6 +266,19 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface,
return -ENXIO;
}

err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
UAC2_CS_CONTROL_SAM_FREQ << 8,
snd_usb_ctrl_intf(chip) | (clock << 8),
data, sizeof(data));
if (err < 0) {
snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n",
dev->devnum, iface, fmt->altsetting);
prev_rate = 0;
} else {
prev_rate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
}

data[0] = rate;
data[1] = rate >> 8;
data[2] = rate >> 16;
Expand All @@ -280,19 +293,31 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface,
return err;
}

if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
UAC2_CS_CONTROL_SAM_FREQ << 8,
snd_usb_ctrl_intf(chip) | (clock << 8),
data, sizeof(data))) < 0) {
err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
UAC2_CS_CONTROL_SAM_FREQ << 8,
snd_usb_ctrl_intf(chip) | (clock << 8),
data, sizeof(data));
if (err < 0) {
snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n",
dev->devnum, iface, fmt->altsetting);
return err;
cur_rate = 0;
} else {
cur_rate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
}

crate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
if (crate != rate)
snd_printd(KERN_WARNING "current rate %d is different from the runtime rate %d\n", crate, rate);
if (cur_rate != rate) {
snd_printd(KERN_WARNING
"current rate %d is different from the runtime rate %d\n",
cur_rate, rate);
}

/* Some devices doesn't respond to sample rate changes while the
* interface is active. */
if (rate != prev_rate) {
usb_set_interface(dev, iface, 0);
usb_set_interface(dev, iface, fmt->altsetting);
}

return 0;
}
Expand Down

0 comments on commit c2f25f6

Please sign in to comment.