ALSA: asihpi - Add volume mute control.
Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
1225367a48
commit
fc3a399019
|
@ -645,6 +645,11 @@ enum HPI_SWITCH_STATES {
|
||||||
*/
|
*/
|
||||||
#define HPI_GAIN_OFF (-100 * HPI_UNITS_PER_dB)
|
#define HPI_GAIN_OFF (-100 * HPI_UNITS_PER_dB)
|
||||||
|
|
||||||
|
/** channel mask specifying all channels
|
||||||
|
\ingroup volume
|
||||||
|
*/
|
||||||
|
#define HPI_BITMASK_ALL_CHANNELS (0xFFFFFFFF)
|
||||||
|
|
||||||
/** value returned for no signal
|
/** value returned for no signal
|
||||||
\ingroup meter
|
\ingroup meter
|
||||||
*/
|
*/
|
||||||
|
@ -1312,6 +1317,10 @@ u16 hpi_volume_get_gain(u32 h_control,
|
||||||
short an_gain0_01dB_out[HPI_MAX_CHANNELS]
|
short an_gain0_01dB_out[HPI_MAX_CHANNELS]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
u16 hpi_volume_set_mute(u32 h_control, u32 mute);
|
||||||
|
|
||||||
|
u16 hpi_volume_get_mute(u32 h_control, u32 *mute);
|
||||||
|
|
||||||
#define hpi_volume_get_range hpi_volume_query_range
|
#define hpi_volume_get_range hpi_volume_query_range
|
||||||
u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
|
u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
|
||||||
short *max_gain_01dB, short *step_gain_01dB);
|
short *max_gain_01dB, short *step_gain_01dB);
|
||||||
|
|
|
@ -114,6 +114,18 @@ enum HPI_SUBSYS_OPTIONS {
|
||||||
HPI_SUBSYS_OPT_NET_ADAPTER_ADDRESS_ADD = 262
|
HPI_SUBSYS_OPT_NET_ADAPTER_ADDRESS_ADD = 262
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Volume flags
|
||||||
|
*/
|
||||||
|
enum HPI_VOLUME_FLAGS {
|
||||||
|
/** Set if the volume control is muted */
|
||||||
|
HPI_VOLUME_FLAG_MUTED = (1 << 0),
|
||||||
|
/** Set if the volume control has a mute function */
|
||||||
|
HPI_VOLUME_FLAG_HAS_MUTE = (1 << 1),
|
||||||
|
/** Set if volume control can do autofading */
|
||||||
|
HPI_VOLUME_FLAG_HAS_AUTOFADE = (1 << 2)
|
||||||
|
/* Note Flags >= (1<<8) are for DSP internal use only */
|
||||||
|
};
|
||||||
|
|
||||||
/******************************************* CONTROL ATTRIBUTES ****/
|
/******************************************* CONTROL ATTRIBUTES ****/
|
||||||
/* (in order of control type ID */
|
/* (in order of control type ID */
|
||||||
|
|
||||||
|
@ -139,6 +151,8 @@ enum HPI_CONTROL_ATTRIBUTES {
|
||||||
|
|
||||||
HPI_VOLUME_GAIN = HPI_CTL_ATTR(VOLUME, 1),
|
HPI_VOLUME_GAIN = HPI_CTL_ATTR(VOLUME, 1),
|
||||||
HPI_VOLUME_AUTOFADE = HPI_CTL_ATTR(VOLUME, 2),
|
HPI_VOLUME_AUTOFADE = HPI_CTL_ATTR(VOLUME, 2),
|
||||||
|
HPI_VOLUME_MUTE = HPI_CTL_ATTR(VOLUME, 3),
|
||||||
|
HPI_VOLUME_GAIN_AND_FLAGS = HPI_CTL_ATTR(VOLUME, 4),
|
||||||
HPI_VOLUME_NUM_CHANNELS = HPI_CTL_ATTR(VOLUME, 6),
|
HPI_VOLUME_NUM_CHANNELS = HPI_CTL_ATTR(VOLUME, 6),
|
||||||
HPI_VOLUME_RANGE = HPI_CTL_ATTR(VOLUME, 10),
|
HPI_VOLUME_RANGE = HPI_CTL_ATTR(VOLUME, 10),
|
||||||
|
|
||||||
|
@ -1389,7 +1403,8 @@ struct hpi_control_cache_info {
|
||||||
struct hpi_control_cache_vol {
|
struct hpi_control_cache_vol {
|
||||||
struct hpi_control_cache_info i;
|
struct hpi_control_cache_info i;
|
||||||
short an_log[2];
|
short an_log[2];
|
||||||
char temp_padding[4];
|
unsigned short flags;
|
||||||
|
char padding[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hpi_control_cache_meter {
|
struct hpi_control_cache_meter {
|
||||||
|
|
|
@ -347,8 +347,21 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache,
|
||||||
if (phm->u.c.attribute == HPI_VOLUME_GAIN) {
|
if (phm->u.c.attribute == HPI_VOLUME_GAIN) {
|
||||||
phr->u.c.an_log_value[0] = pC->u.vol.an_log[0];
|
phr->u.c.an_log_value[0] = pC->u.vol.an_log[0];
|
||||||
phr->u.c.an_log_value[1] = pC->u.vol.an_log[1];
|
phr->u.c.an_log_value[1] = pC->u.vol.an_log[1];
|
||||||
} else
|
} else if (phm->u.c.attribute == HPI_VOLUME_MUTE) {
|
||||||
|
if (pC->u.vol.flags & HPI_VOLUME_FLAG_HAS_MUTE) {
|
||||||
|
if (pC->u.vol.flags & HPI_VOLUME_FLAG_MUTED)
|
||||||
|
phr->u.c.param1 =
|
||||||
|
HPI_BITMASK_ALL_CHANNELS;
|
||||||
|
else
|
||||||
|
phr->u.c.param1 = 0;
|
||||||
|
} else {
|
||||||
|
phr->error =
|
||||||
|
HPI_ERROR_INVALID_CONTROL_ATTRIBUTE;
|
||||||
|
phr->u.c.param1 = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
found = 0;
|
found = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case HPI_CONTROL_MULTIPLEXER:
|
case HPI_CONTROL_MULTIPLEXER:
|
||||||
if (phm->u.c.attribute == HPI_MULTIPLEXER_SOURCE) {
|
if (phm->u.c.attribute == HPI_MULTIPLEXER_SOURCE) {
|
||||||
|
@ -544,6 +557,11 @@ void hpi_cmn_control_cache_sync_to_msg(struct hpi_control_cache *p_cache,
|
||||||
if (phm->u.c.attribute == HPI_VOLUME_GAIN) {
|
if (phm->u.c.attribute == HPI_VOLUME_GAIN) {
|
||||||
pC->u.vol.an_log[0] = phr->u.c.an_log_value[0];
|
pC->u.vol.an_log[0] = phr->u.c.an_log_value[0];
|
||||||
pC->u.vol.an_log[1] = phr->u.c.an_log_value[1];
|
pC->u.vol.an_log[1] = phr->u.c.an_log_value[1];
|
||||||
|
} else if (phm->u.c.attribute == HPI_VOLUME_MUTE) {
|
||||||
|
if (phm->u.c.param1)
|
||||||
|
pC->u.vol.flags |= HPI_VOLUME_FLAG_MUTED;
|
||||||
|
else
|
||||||
|
pC->u.vol.flags &= ~HPI_VOLUME_FLAG_MUTED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case HPI_CONTROL_MULTIPLEXER:
|
case HPI_CONTROL_MULTIPLEXER:
|
||||||
|
|
|
@ -2888,6 +2888,16 @@ u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
|
||||||
&an_log_gain[0], &an_log_gain[1]);
|
&an_log_gain[0], &an_log_gain[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u16 hpi_volume_set_mute(u32 h_control, u32 mute)
|
||||||
|
{
|
||||||
|
return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
|
||||||
|
{
|
||||||
|
return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
|
||||||
|
}
|
||||||
|
|
||||||
u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
|
u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
|
||||||
short *max_gain_01dB, short *step_gain_01dB)
|
short *max_gain_01dB, short *step_gain_01dB)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue