int __devinit usb6fire_control_init(struct sfire_chip *chip) { int i; int ret; struct control_runtime *rt = kzalloc(sizeof(struct control_runtime), GFP_KERNEL); struct comm_runtime *comm_rt = chip->comm; if (!rt) return -ENOMEM; rt->chip = chip; rt->update_streaming = usb6fire_control_streaming_update; rt->set_rate = usb6fire_control_set_rate; rt->set_channels = usb6fire_control_set_channels; i = 0; while (init_data[i].type) { comm_rt->write8(comm_rt, init_data[i].type, init_data[i].reg, init_data[i].value); i++; } usb6fire_control_opt_coax_update(rt); usb6fire_control_line_phono_update(rt); usb6fire_control_output_vol_update(rt); usb6fire_control_output_mute_update(rt); usb6fire_control_input_vol_update(rt); usb6fire_control_streaming_update(rt); ret = usb6fire_control_add_virtual(rt, chip->card, "Master Playback Volume", vol_elements); if (ret) { snd_printk(KERN_ERR PREFIX "cannot add control.\n"); kfree(rt); return ret; } ret = usb6fire_control_add_virtual(rt, chip->card, "Master Playback Switch", mute_elements); if (ret) { snd_printk(KERN_ERR PREFIX "cannot add control.\n"); kfree(rt); return ret; } i = 0; while (elements[i].name) { ret = snd_ctl_add(chip->card, snd_ctl_new1(&elements[i], rt)); if (ret < 0) { kfree(rt); snd_printk(KERN_ERR PREFIX "cannot add control.\n"); return ret; } i++; } chip->control = rt; return 0; }
static int usb6fire_control_digital_thru_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct control_runtime *rt = snd_kcontrol_chip(kcontrol); int changed = 0; if (rt->digital_thru_switch != ucontrol->value.integer.value[0]) { rt->digital_thru_switch = ucontrol->value.integer.value[0]; usb6fire_control_streaming_update(rt); changed = 1; } return changed; }