Commit fc3a3990 authored by Eliot Blennerhassett's avatar Eliot Blennerhassett Committed by Takashi Iwai

ALSA: asihpi - Add volume mute control.

Signed-off-by: default avatarEliot Blennerhassett <eblennerhassett@audioscience.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1225367a
...@@ -645,6 +645,11 @@ enum HPI_SWITCH_STATES { ...@@ -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, ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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] ...@@ -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)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment