aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorEliot Blennerhassett <eblennerhassett@audioscience.com>2011-02-09 23:26:11 -0500
committerTakashi Iwai <tiwai@suse.de>2011-02-10 12:49:32 -0500
commitfc3a399019a5a54258095c9bb0e17d4be5d51e67 (patch)
treee097f648fe07054328300a51ff51870cba87eb60 /sound/pci
parent1225367a481ae751738630158c7ca96aa1c7bac8 (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.h9
-rw-r--r--sound/pci/asihpi/hpi_internal.h17
-rw-r--r--sound/pci/asihpi/hpicmn.c20
-rw-r--r--sound/pci/asihpi/hpifunc.c10
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
1320u16 hpi_volume_set_mute(u32 h_control, u32 mute);
1321
1322u16 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
1316u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, 1325u16 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*/
119enum 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 {
1389struct hpi_control_cache_vol { 1403struct 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
1395struct hpi_control_cache_meter { 1410struct 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
2891u16 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
2896u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
2897{
2898 return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
2899}
2900
2891u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, 2901u16 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{