At Mon, 10 Nov 2014 21:17:54 +1100, Damien Zammit wrote:
+static int snd_mbox1_switch_get(struct snd_kcontrol *kctl,
struct snd_ctl_elem_value *ucontrol)+{
- if (kctl->private_value) {
ucontrol->value.enumerated.item[0] = true;return 0;- }
- ucontrol->value.enumerated.item[0] = false;
A simpler code would be just like:
ucontrol->value.enumerated.item[0] = kctl->private_value; return 0;
- return 0;
+}
+static int snd_mbox1_switch_put(struct snd_kcontrol *kctl,
struct snd_ctl_elem_value *ucontrol)+{
- struct snd_usb_audio *chip;
- struct usb_mixer_interface *mixer;
- int err;
- bool changed, cur_val, new_val;
- bool value;
I guess this "value" variable can be dropped completely?
- unsigned char buff[3];
- changed = false;
- value = false;
- cur_val = kctl->private_value;
- new_val = ucontrol->value.enumerated.item[0];
- mixer = snd_kcontrol_chip(kctl);
- if (snd_BUG_ON(!mixer))
return -EINVAL;- chip = mixer->chip;
- if (snd_BUG_ON(!chip))
return -EINVAL;- /* update value if needed */
- if (cur_val != new_val) {
value = new_val;down_read(&chip->shutdown_rwsem);if (chip->shutdown) {err = -ENODEV;goto err;} else {/* Prepare for magic command to toggle clock source */err = snd_usb_ctl_msg(chip->dev,usb_rcvctrlpipe(chip->dev, 0), 0x81,USB_DIR_IN |USB_TYPE_CLASS |USB_RECIP_INTERFACE, 0x00, 0x500, buff, 1);if (err < 0)goto err;err = snd_usb_ctl_msg(chip->dev,usb_rcvctrlpipe(chip->dev, 0), 0x81,USB_DIR_IN |USB_TYPE_CLASS |USB_RECIP_ENDPOINT, 0x100, 0x81, buff, 3);if (err < 0)goto err;/* 2 possibilities: Internal -> send sample rate* S/PDIF sync -> send zeroes* NB: Sample rate locked to 48kHz on purpose to* prevent user from resetting the sample rate* while S/PDIF sync is enabled and confusing* this configuration.*/if (new_val == 0) {buff[0] = 0x80;buff[1] = 0xbb;buff[2] = 0x00;} else {buff[0] = buff[1] = buff[2] = 0x00;}/* Send the magic command to toggle the clock source */err = snd_usb_ctl_msg(chip->dev,usb_sndctrlpipe(chip->dev, 0), 0x1,USB_TYPE_CLASS |USB_RECIP_ENDPOINT, 0x100, 0x81, buff, 3);if (err < 0)goto err;err = snd_usb_ctl_msg(chip->dev,usb_rcvctrlpipe(chip->dev, 0), 0x81,USB_DIR_IN |USB_TYPE_CLASS |USB_RECIP_ENDPOINT, 0x100, 0x81, buff, 3);if (err < 0)goto err;err = snd_usb_ctl_msg(chip->dev,usb_rcvctrlpipe(chip->dev, 0), 0x81,USB_DIR_IN |USB_TYPE_CLASS |USB_RECIP_ENDPOINT, 0x100, 0x2, buff, 3);if (err < 0)goto err;}up_read(&chip->shutdown_rwsem);kctl->private_value = new_val;changed = true;- }
- return changed;
+err:
- up_read(&chip->shutdown_rwsem);
- return err;
A bit better way would be something like:
if (cur_val == new_val) return 0;
down_read(&chip->shutdown_rwsem); if (chip->shutdown) { err = -ENODEV; goto err; }
/* Prepare for magic command to toggle clock source */ err = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), 0x81, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0x00, 0x500, buff, 1); if (err < 0) goto err; ....
kctl->private_value = new_val;
err: up_read(&chip->shutdown_rwsem); return err < 0 ? err : 1; }
This flattens the flow and combines the unlock in a single place. Also, "changed" variable can be dropped in this way.
Takashi