Skip to content

Commit

Permalink
ALSA: bebob: Correction for return value of .put callback
Browse files Browse the repository at this point in the history
This commit is for correction of my misunderstanding about return value of
.put callback in ALSA Control interface.

According to 'Writing ALSA Driver' (*1), return value of the callback has
three patterns; 1: changed, 0: not changed, an negative value: fatal error.

But I misunderstood that it's boolean; zero or nonzero.

*1: Writing an ALSA Driver (2005, Takashi Iwai)
http://www.alsa-project.org/main/index.php/ALSA_Driver_Documentation

Signed-off-by: Takashi Sakamoto <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
takaswie authored and tiwai committed Jul 22, 2014
1 parent 5a0438f commit f77ac91
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions sound/firewire/bebob/bebob_maudio.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,10 @@ static int special_clk_ctl_put(struct snd_kcontrol *kctl,
params->clk_lock);
mutex_unlock(&bebob->mutex);

return err >= 0;
if (err >= 0)
err = 1;

return err;
}
static struct snd_kcontrol_new special_clk_ctl = {
.name = "Clock Source",
Expand Down Expand Up @@ -491,14 +494,16 @@ static int special_dig_in_iface_ctl_set(struct snd_kcontrol *kctl,
unsigned int id, dig_in_fmt, dig_in_iface;
int err;

mutex_lock(&bebob->mutex);

id = uval->value.enumerated.item[0];
if (id >= ARRAY_SIZE(special_dig_in_iface_labels))
return -EINVAL;

/* decode user value */
dig_in_fmt = (id >> 1) & 0x01;
dig_in_iface = id & 0x01;

mutex_lock(&bebob->mutex);

err = avc_maudio_set_special_clk(bebob,
params->clk_src,
dig_in_fmt,
Expand All @@ -508,14 +513,17 @@ static int special_dig_in_iface_ctl_set(struct snd_kcontrol *kctl,
goto end;

/* For ADAT, optical interface is only available. */
if (params->dig_in_fmt > 0)
if (params->dig_in_fmt > 0) {
err = 1;
goto end;
}

/* For S/PDIF, optical/coaxial interfaces are selectable. */
err = avc_audio_set_selector(bebob->unit, 0x00, 0x04, dig_in_iface);
if (err < 0)
dev_err(&bebob->unit->device,
"fail to set digital input interface: %d\n", err);
err = 1;
end:
special_stream_formation_set(bebob);
mutex_unlock(&bebob->mutex);
Expand Down Expand Up @@ -567,16 +575,20 @@ static int special_dig_out_iface_ctl_set(struct snd_kcontrol *kctl,
unsigned int id;
int err;

mutex_lock(&bebob->mutex);

id = uval->value.enumerated.item[0];
if (id >= ARRAY_SIZE(special_dig_out_iface_labels))
return -EINVAL;

mutex_lock(&bebob->mutex);

err = avc_maudio_set_special_clk(bebob,
params->clk_src,
params->dig_in_fmt,
id, params->clk_lock);
if (err >= 0)
if (err >= 0) {
special_stream_formation_set(bebob);
err = 1;
}

mutex_unlock(&bebob->mutex);
return err;
Expand Down

0 comments on commit f77ac91

Please sign in to comment.