23 #include <linux/time.h>
36 static u32 mixart_analog_level[256] = {
295 #define MIXART_ANALOG_CAPTURE_LEVEL_MIN 0
296 #define MIXART_ANALOG_CAPTURE_LEVEL_MAX 255
297 #define MIXART_ANALOG_CAPTURE_ZERO_LEVEL 176
299 #define MIXART_ANALOG_PLAYBACK_LEVEL_MIN 0
300 #define MIXART_ANALOG_PLAYBACK_LEVEL_MAX 192
301 #define MIXART_ANALOG_PLAYBACK_ZERO_LEVEL 189
303 static int mixart_update_analog_audio_level(
struct snd_mixart*
chip,
int is_capture)
310 memset(&io_level, 0,
sizeof(io_level));
327 request.
data = &io_level;
328 request.
size =
sizeof(io_level);
378 for (i = 0; i < 2; i++) {
379 int new_volume = ucontrol->
value.integer.value[
i];
380 int *stored_volume = is_capture ?
392 if (*stored_volume != new_volume) {
393 *stored_volume = new_volume;
398 mixart_update_analog_audio_level(chip, is_capture);
410 .
info = mixart_analog_vol_info,
411 .
get = mixart_analog_vol_get,
412 .
put = mixart_analog_vol_put,
413 .
tlv = { .p = db_scale_analog },
417 #define mixart_sw_info snd_ctl_boolean_stereo_info
435 for (i = 0; i < 2; i++) {
437 ucontrol->
value.integer.value[i]) {
439 !!ucontrol->
value.integer.value[
i];
444 mixart_update_analog_audio_level(chip, 0);
451 .name =
"Master Playback Switch",
453 .get = mixart_audio_sw_get,
454 .put = mixart_audio_sw_put
457 static u32 mixart_digital_level[256] = {
716 #define MIXART_DIGITAL_LEVEL_MIN 0
717 #define MIXART_DIGITAL_LEVEL_MAX 255
718 #define MIXART_DIGITAL_ZERO_LEVEL 219
730 memset(&set_level, 0,
sizeof(set_level));
755 set_level.
stream_level.out_level.left_to_out1_level = mixart_digital_level[volume[0]];
756 set_level.
stream_level.out_level.right_to_out2_level = mixart_digital_level[volume[1]];
760 request.
data = &set_level;
761 request.
size =
sizeof(set_level);
764 if((err<0) || status) {
791 memset(&set_level, 0,
sizeof(set_level));
803 request.
data = &set_level;
804 request.
size =
sizeof(set_level);
807 if((err<0) || status) {
825 #define MIXART_VOL_REC_MASK 1
826 #define MIXART_VOL_AES_MASK 2
831 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->
id);
844 ucontrol->
value.integer.value[0] = stored_volume[0];
845 ucontrol->
value.integer.value[1] = stored_volume[1];
853 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->
id);
872 for (i = 0; i < 2; i++) {
873 int vol = ucontrol->
value.integer.value[
i];
877 if (stored_volume[i] != vol) {
878 stored_volume[
i] =
vol;
901 .
info = mixart_digital_vol_info,
902 .
get = mixart_pcm_vol_get,
903 .
put = mixart_pcm_vol_put,
904 .
tlv = { .p = db_scale_digital },
911 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->
id);
927 int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->
id);
934 for (i = 0; i < 2; i++) {
936 ucontrol->
value.integer.value[i]) {
938 !!ucontrol->
value.integer.value[
i];
953 .get = mixart_pcm_sw_get,
954 .put = mixart_pcm_sw_put
971 request.size =
sizeof(audio_level);
973 memset(&audio_level, 0,
sizeof(audio_level));
975 audio_level.monitor_level = mixart_digital_level[chip->
monitoring_volume[channel!=0]];
979 if((err<0) || resp) {
1006 for (i = 0; i < 2; i++) {
1008 ucontrol->
value.integer.value[i]) {
1010 !!ucontrol->
value.integer.value[
i];
1011 mixart_update_monitoring(chip, i);
1023 .
name =
"Monitoring Volume",
1024 .
info = mixart_digital_vol_info,
1025 .
get = mixart_monitor_vol_get,
1026 .
put = mixart_monitor_vol_put,
1027 .
tlv = { .p = db_scale_digital },
1050 for (i = 0; i < 2; i++) {
1052 ucontrol->
value.integer.value[i]) {
1054 !!ucontrol->
value.integer.value[
i];
1069 mixart_update_monitoring(chip, 0);
1071 mixart_update_monitoring(chip, 1);
1083 return (changed != 0);
1088 .name =
"Monitoring Switch",
1090 .get = mixart_monitor_sw_get,
1091 .put = mixart_monitor_sw_put
1095 static void mixart_reset_audio_levels(
struct snd_mixart *chip)
1098 mixart_update_analog_audio_level(chip, 0);
1101 mixart_update_analog_audio_level(chip, 1);
1116 chip = mgr->
chip[
i];
1119 temp = mixart_control_analog_level;
1120 temp.
name =
"Master Playback Volume";
1130 temp = mixart_control_analog_level;
1131 temp.
name =
"Master Capture Volume";
1137 temp = snd_mixart_pcm_vol;
1138 temp.
name =
"PCM Playback Volume";
1144 temp.
name =
"PCM Capture Volume";
1151 temp.
name =
"AES Playback Volume";
1157 temp.
name =
"AES Capture Volume";
1163 temp = mixart_control_pcm_switch;
1164 temp.
name =
"PCM Playback Switch";
1170 temp.
name =
"AES Playback Switch";
1183 mixart_reset_audio_levels(chip);