diff options
author | Eliot Blennerhassett <eblennerhassett@audioscience.com> | 2011-02-09 23:26:11 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-02-10 12:49:32 -0500 |
commit | fc3a399019a5a54258095c9bb0e17d4be5d51e67 (patch) | |
tree | e097f648fe07054328300a51ff51870cba87eb60 /sound/pci | |
parent | 1225367a481ae751738630158c7ca96aa1c7bac8 (diff) |
ALSA: asihpi - Add volume mute control.
Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/asihpi/hpi.h | 9 | ||||
-rw-r--r-- | sound/pci/asihpi/hpi_internal.h | 17 | ||||
-rw-r--r-- | sound/pci/asihpi/hpicmn.c | 20 | ||||
-rw-r--r-- | sound/pci/asihpi/hpifunc.c | 10 |
4 files changed, 54 insertions, 2 deletions
diff --git a/sound/pci/asihpi/hpi.h b/sound/pci/asihpi/hpi.h index bef90d44361e..5ac978d07740 100644 --- a/sound/pci/asihpi/hpi.h +++ b/sound/pci/asihpi/hpi.h | |||
@@ -645,6 +645,11 @@ enum HPI_SWITCH_STATES { | |||
645 | */ | 645 | */ |
646 | #define HPI_GAIN_OFF (-100 * HPI_UNITS_PER_dB) | 646 | #define HPI_GAIN_OFF (-100 * HPI_UNITS_PER_dB) |
647 | 647 | ||
648 | /** channel mask specifying all channels | ||
649 | \ingroup volume | ||
650 | */ | ||
651 | #define HPI_BITMASK_ALL_CHANNELS (0xFFFFFFFF) | ||
652 | |||
648 | /** value returned for no signal | 653 | /** value returned for no signal |
649 | \ingroup meter | 654 | \ingroup meter |
650 | */ | 655 | */ |
@@ -1312,6 +1317,10 @@ u16 hpi_volume_get_gain(u32 h_control, | |||
1312 | short an_gain0_01dB_out[HPI_MAX_CHANNELS] | 1317 | short an_gain0_01dB_out[HPI_MAX_CHANNELS] |
1313 | ); | 1318 | ); |
1314 | 1319 | ||
1320 | u16 hpi_volume_set_mute(u32 h_control, u32 mute); | ||
1321 | |||
1322 | u16 hpi_volume_get_mute(u32 h_control, u32 *mute); | ||
1323 | |||
1315 | #define hpi_volume_get_range hpi_volume_query_range | 1324 | #define hpi_volume_get_range hpi_volume_query_range |
1316 | u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, | 1325 | u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, |
1317 | short *max_gain_01dB, short *step_gain_01dB); | 1326 | short *max_gain_01dB, short *step_gain_01dB); |
diff --git a/sound/pci/asihpi/hpi_internal.h b/sound/pci/asihpi/hpi_internal.h index 10de7e0aff14..990816085561 100644 --- a/sound/pci/asihpi/hpi_internal.h +++ b/sound/pci/asihpi/hpi_internal.h | |||
@@ -114,6 +114,18 @@ enum HPI_SUBSYS_OPTIONS { | |||
114 | HPI_SUBSYS_OPT_NET_ADAPTER_ADDRESS_ADD = 262 | 114 | HPI_SUBSYS_OPT_NET_ADAPTER_ADDRESS_ADD = 262 |
115 | }; | 115 | }; |
116 | 116 | ||
117 | /** Volume flags | ||
118 | */ | ||
119 | enum HPI_VOLUME_FLAGS { | ||
120 | /** Set if the volume control is muted */ | ||
121 | HPI_VOLUME_FLAG_MUTED = (1 << 0), | ||
122 | /** Set if the volume control has a mute function */ | ||
123 | HPI_VOLUME_FLAG_HAS_MUTE = (1 << 1), | ||
124 | /** Set if volume control can do autofading */ | ||
125 | HPI_VOLUME_FLAG_HAS_AUTOFADE = (1 << 2) | ||
126 | /* Note Flags >= (1<<8) are for DSP internal use only */ | ||
127 | }; | ||
128 | |||
117 | /******************************************* CONTROL ATTRIBUTES ****/ | 129 | /******************************************* CONTROL ATTRIBUTES ****/ |
118 | /* (in order of control type ID */ | 130 | /* (in order of control type ID */ |
119 | 131 | ||
@@ -139,6 +151,8 @@ enum HPI_CONTROL_ATTRIBUTES { | |||
139 | 151 | ||
140 | HPI_VOLUME_GAIN = HPI_CTL_ATTR(VOLUME, 1), | 152 | HPI_VOLUME_GAIN = HPI_CTL_ATTR(VOLUME, 1), |
141 | HPI_VOLUME_AUTOFADE = HPI_CTL_ATTR(VOLUME, 2), | 153 | HPI_VOLUME_AUTOFADE = HPI_CTL_ATTR(VOLUME, 2), |
154 | HPI_VOLUME_MUTE = HPI_CTL_ATTR(VOLUME, 3), | ||
155 | HPI_VOLUME_GAIN_AND_FLAGS = HPI_CTL_ATTR(VOLUME, 4), | ||
142 | HPI_VOLUME_NUM_CHANNELS = HPI_CTL_ATTR(VOLUME, 6), | 156 | HPI_VOLUME_NUM_CHANNELS = HPI_CTL_ATTR(VOLUME, 6), |
143 | HPI_VOLUME_RANGE = HPI_CTL_ATTR(VOLUME, 10), | 157 | HPI_VOLUME_RANGE = HPI_CTL_ATTR(VOLUME, 10), |
144 | 158 | ||
@@ -1389,7 +1403,8 @@ struct hpi_control_cache_info { | |||
1389 | struct hpi_control_cache_vol { | 1403 | struct hpi_control_cache_vol { |
1390 | struct hpi_control_cache_info i; | 1404 | struct hpi_control_cache_info i; |
1391 | short an_log[2]; | 1405 | short an_log[2]; |
1392 | char temp_padding[4]; | 1406 | unsigned short flags; |
1407 | char padding[2]; | ||
1393 | }; | 1408 | }; |
1394 | 1409 | ||
1395 | struct hpi_control_cache_meter { | 1410 | struct hpi_control_cache_meter { |
diff --git a/sound/pci/asihpi/hpicmn.c b/sound/pci/asihpi/hpicmn.c index e0a08f61a348..4b3f4761cba5 100644 --- a/sound/pci/asihpi/hpicmn.c +++ b/sound/pci/asihpi/hpicmn.c | |||
@@ -347,8 +347,21 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache, | |||
347 | if (phm->u.c.attribute == HPI_VOLUME_GAIN) { | 347 | if (phm->u.c.attribute == HPI_VOLUME_GAIN) { |
348 | phr->u.c.an_log_value[0] = pC->u.vol.an_log[0]; | 348 | phr->u.c.an_log_value[0] = pC->u.vol.an_log[0]; |
349 | phr->u.c.an_log_value[1] = pC->u.vol.an_log[1]; | 349 | phr->u.c.an_log_value[1] = pC->u.vol.an_log[1]; |
350 | } else | 350 | } else if (phm->u.c.attribute == HPI_VOLUME_MUTE) { |
351 | if (pC->u.vol.flags & HPI_VOLUME_FLAG_HAS_MUTE) { | ||
352 | if (pC->u.vol.flags & HPI_VOLUME_FLAG_MUTED) | ||
353 | phr->u.c.param1 = | ||
354 | HPI_BITMASK_ALL_CHANNELS; | ||
355 | else | ||
356 | phr->u.c.param1 = 0; | ||
357 | } else { | ||
358 | phr->error = | ||
359 | HPI_ERROR_INVALID_CONTROL_ATTRIBUTE; | ||
360 | phr->u.c.param1 = 0; | ||
361 | } | ||
362 | } else { | ||
351 | found = 0; | 363 | found = 0; |
364 | } | ||
352 | break; | 365 | break; |
353 | case HPI_CONTROL_MULTIPLEXER: | 366 | case HPI_CONTROL_MULTIPLEXER: |
354 | if (phm->u.c.attribute == HPI_MULTIPLEXER_SOURCE) { | 367 | 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 | if (phm->u.c.attribute == HPI_VOLUME_GAIN) { | 557 | if (phm->u.c.attribute == HPI_VOLUME_GAIN) { |
545 | pC->u.vol.an_log[0] = phr->u.c.an_log_value[0]; | 558 | pC->u.vol.an_log[0] = phr->u.c.an_log_value[0]; |
546 | pC->u.vol.an_log[1] = phr->u.c.an_log_value[1]; | 559 | pC->u.vol.an_log[1] = phr->u.c.an_log_value[1]; |
560 | } else if (phm->u.c.attribute == HPI_VOLUME_MUTE) { | ||
561 | if (phm->u.c.param1) | ||
562 | pC->u.vol.flags |= HPI_VOLUME_FLAG_MUTED; | ||
563 | else | ||
564 | pC->u.vol.flags &= ~HPI_VOLUME_FLAG_MUTED; | ||
547 | } | 565 | } |
548 | break; | 566 | break; |
549 | case HPI_CONTROL_MULTIPLEXER: | 567 | case HPI_CONTROL_MULTIPLEXER: |
diff --git a/sound/pci/asihpi/hpifunc.c b/sound/pci/asihpi/hpifunc.c index 53924e494161..b79eba1ee0f5 100644 --- a/sound/pci/asihpi/hpifunc.c +++ b/sound/pci/asihpi/hpifunc.c | |||
@@ -2888,6 +2888,16 @@ u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] | |||
2888 | &an_log_gain[0], &an_log_gain[1]); | 2888 | &an_log_gain[0], &an_log_gain[1]); |
2889 | } | 2889 | } |
2890 | 2890 | ||
2891 | u16 hpi_volume_set_mute(u32 h_control, u32 mute) | ||
2892 | { | ||
2893 | return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0); | ||
2894 | } | ||
2895 | |||
2896 | u16 hpi_volume_get_mute(u32 h_control, u32 *mute) | ||
2897 | { | ||
2898 | return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute); | ||
2899 | } | ||
2900 | |||
2891 | u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, | 2901 | u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, |
2892 | short *max_gain_01dB, short *step_gain_01dB) | 2902 | short *max_gain_01dB, short *step_gain_01dB) |
2893 | { | 2903 | { |