//设置音量值 bool WINAPI SetVolume(LONG vol) { bool Result=false; //用于判断函数是否执行成功 MIXERCONTROL volCtrl; HMIXER hmixer; if(mixerOpen(&hmixer, 0, 0, 0, 0)) return 0; if(GetVolumeControl(hmixer,MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl)) { int ChangeValue=volCtrl.Bounds.lMaximum/INTERVAL; int TotalValue=ChangeValue*vol; if(SetVolumeValue(hmixer,&volCtrl,TotalValue)) Result=true; } mixerClose(hmixer); return Result; }
//获得音量部分, 目前只支持XP的主音量, 要完美支持看D:\workspace\DownLoadCode\VolumeCtrl int CMyVolume::GetVolume() { long device = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; unsigned int rt = 0; MIXERCONTROL volCtrl; HMIXER hmixer; if ( mixerOpen(&hmixer, 0, 0, 0, 0) != MMSYSERR_NOERROR ) { return 0; } GetVolumeControl(hmixer, device, MIXERCONTROL_CONTROLTYPE_VOLUME, &volCtrl); int iValue = GetVolumeValue(hmixer, &volCtrl); iValue = iValue * MAX_VOL / volCtrl.Bounds.lMaximum; return iValue; }
//设置/开启 静音 BOOL CMyVolume::SetMute(BOOL bMute) { HMIXER hmixer; if ( mixerOpen(&hmixer, 0, 0, 0, 0) ) { return FALSE; } long device = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; MIXERCONTROL volCtrl; GetVolumeControl(hmixer, device, MIXERCONTROL_CONTROLTYPE_MUTE, &volCtrl); BOOL rc(FALSE); if (SetMuteValue(hmixer, &volCtrl, (BOOL)bMute)) { rc = TRUE; } mixerClose(hmixer); return rc; }
//返回音量值 unsigned WINAPI GetVolume() { unsigned rt=0; MIXERCONTROL volCtrl; HMIXER hmixer; if(mixerOpen(&hmixer, 0, 0, 0, 0)) return 0; MIXERLINE mxl = {0}; mxl.cbStruct = sizeof(mxl); mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; MMRESULT mr = mixerGetLineInfo((HMIXEROBJ)hmixer, &mxl, MIXER_GETLINEINFOF_DESTINATION); mixerGetLineControls() if(!GetVolumeControl(hmixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl)) return 0; int ChangeValue=volCtrl.Bounds.lMaximum/INTERVAL; //每一次调用函数改变的音量值 rt=GetVolumeValue(hmixer,&volCtrl)/ChangeValue; //GetVolumeValue得到的是具体值 mixerClose(hmixer); return rt; }
BOOL CMyVolume::SetValue(int nVol) { BOOL bSet = FALSE; HMIXER hmier; if (mixerOpen(&hmier, 0, 0, 0, 0)) { return FALSE; } long device = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; MIXERCONTROL volCtrl; BOOL bRet(FALSE); if ( GetVolumeControl(hmier, device, MIXERCONTROL_CONTROLTYPE_VOLUME, &volCtrl) ) { nVol = nVol* volCtrl.Bounds.lMaximum/MAX_VOL; if ( SetVolumeValue(hmier,&volCtrl, nVol ) ) { bRet = TRUE; } } mixerClose(hmier); return bRet; }
VOID InitVolumeControls(HWND hwndDlg, PGLOBAL_DATA pGlobalData) { UINT NumMixers; MIXERCAPS mxc; TCHAR szNoDevices[256]; CheckDlgButton(hwndDlg, IDC_ICON_IN_TASKBAR, GetSystrayVolumeIconState() ? BST_CHECKED : BST_UNCHECKED); LoadString(hApplet, IDS_NO_DEVICES, szNoDevices, _countof(szNoDevices)); NumMixers = mixerGetNumDevs(); if (!NumMixers) { EnableWindow(GetDlgItem(hwndDlg, IDC_VOLUME_TRACKBAR), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_MUTE_CHECKBOX), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ADVANCED_BTN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_SPEAKER_VOL_BTN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ADVANCED2_BTN), FALSE); SendDlgItemMessage(hwndDlg, IDC_MUTE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pGlobalData->hIconNoHW); SetDlgItemText(hwndDlg, IDC_DEVICE_NAME, szNoDevices); return; } if (mixerOpen(&pGlobalData->hMixer, 0, PtrToUlong(hwndDlg), 0, MIXER_OBJECTF_MIXER | CALLBACK_WINDOW) != MMSYSERR_NOERROR) { MessageBox(hwndDlg, _T("Cannot open mixer"), NULL, MB_OK); return; } ZeroMemory(&mxc, sizeof(MIXERCAPS)); if (mixerGetDevCaps(PtrToUint(pGlobalData->hMixer), &mxc, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR) { MessageBox(hwndDlg, _T("mixerGetDevCaps failed"), NULL, MB_OK); return; } GetMuteControl(pGlobalData); GetMuteState(pGlobalData); if (pGlobalData->muteVal) { SendDlgItemMessage(hwndDlg, IDC_MUTE_CHECKBOX, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0); SendDlgItemMessage(hwndDlg, IDC_MUTE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pGlobalData->hIconMuted); } else { SendDlgItemMessage(hwndDlg, IDC_MUTE_CHECKBOX, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0); SendDlgItemMessage(hwndDlg, IDC_MUTE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pGlobalData->hIconUnMuted); } GetVolumeControl(pGlobalData); GetVolumeValue(pGlobalData); SendDlgItemMessage(hwndDlg, IDC_DEVICE_NAME, WM_SETTEXT, 0, (LPARAM)mxc.szPname); SendDlgItemMessage(hwndDlg, IDC_VOLUME_TRACKBAR, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(pGlobalData->volumeMinimum, pGlobalData->volumeMaximum/VOLUME_DIVIDER)); SendDlgItemMessage(hwndDlg, IDC_VOLUME_TRACKBAR, TBM_SETPAGESIZE, (WPARAM)FALSE, (LPARAM)1); SendDlgItemMessage(hwndDlg, IDC_VOLUME_TRACKBAR, TBM_SETSEL, (WPARAM)FALSE, (LPARAM)MAKELONG(pGlobalData->volumeMinimum, pGlobalData->volumeValue/VOLUME_DIVIDER)); SendDlgItemMessage(hwndDlg, IDC_VOLUME_TRACKBAR, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pGlobalData->volumeValue/VOLUME_DIVIDER); }