On Fri, Mar 22, 2013 at 16:32:19 +0100, Clemens Ladisch wrote:
Torstein Hegge wrote:
- 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) {
snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n",
dev->devnum, iface, fmt->altsetting);
return err;
- }
This code requires that all devices allow reading the sample rate.
When you cannot read the current rate, just assume it needs to be set.
Good point, read failure shouldn't have to be fatal, or cause set_sample_rate_v2() to return before actually setting the sample rate. But set_sample_rate_v2() already depends on being able to read the sample rate, and will propagate errors back to snd_usb_pcm_prepare(), even if the returned rate isn't used for anything except for a snd_printd.
On the other hand, set_sample_rate_v1() does return 0; /* some devices don't support reading */ when it fails to read the current rate.
Both the existing sample rate read and the sample rate read added by this patch could be replaced by
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); cur_rate = 0; } else { cur_rate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); }
Torstein