//==========================================================================; // // cpl.c // // Copyright (c) 1991-1993 Microsoft Corporation. All Rights Reserved. // // Description: // // // History: // 07/94 VijR (Vij Rajarajan); // // 10/95 R Jernigan - removed link to Adv tab's treeview control // 09/99 tsharp - Ported back from W2K // //==========================================================================; #include "mmcpl.h" #include #include #include #include #include #include #include #include #include #include #include #include "gfxui.h" #include "drivers.h" #include "advaudio.h" #include "roland.h" #include #include #include #include #include #define WM_ACMMAP_ACM_NOTIFY (WM_USER + 100) #include #include #include #include #include "trayvol.h" #include "utils.h" #include "medhelp.h" /**************************************************************************** * WARNING - Hack Alert * The following declares are for DPLAY Voice ****************************************************************************/ #define _FACDPV 0x15 #define MAKE_DVHRESULT( code ) MAKE_HRESULT( 1, _FACDPV, code ) #define DV_FULLDUPLEX MAKE_HRESULT( 0, _FACDPV, 5 ) #define DV_HALFDUPLEX MAKE_HRESULT( 0, _FACDPV, 10 ) #define DVERR_COMMANDALREADYPENDING MAKE_DVHRESULT( 371 ) #define DVERR_SOUNDINITFAILURE MAKE_DVHRESULT( 372 ) #define DVERR_USERCANCEL MAKE_DVHRESULT( 384 ) // {D26AF734-208B-41da-8224-E0CE79810BE1} DEFINE_GUID(IID_IDirectPlayVoiceSetup, 0xd26af734, 0x208b, 0x41da, 0x82, 0x24, 0xe0, 0xce, 0x79, 0x81, 0xb, 0xe1); // {948CE83B-C4A2-44b3-99BF-279ED8DA7DF5} DEFINE_GUID(CLSID_DIRECTPLAYVOICE, 0x948ce83b, 0xc4a2, 0x44b3, 0x99, 0xbf, 0x27, 0x9e, 0xd8, 0xda, 0x7d, 0xf5); // {0F0F094B-B01C-4091-A14D-DD0CD807711A} DEFINE_GUID(CLSID_DirectPlayVoiceTest, 0xf0f094b, 0xb01c, 0x4091, 0xa1, 0x4d, 0xdd, 0xc, 0xd8, 0x7, 0x71, 0x1a); typedef struct IDirectPlayVoiceSetup FAR *LPDIRECTPLAYVOICESETUP, *PDIRECTPLAYVOICESETUP; #define DVFLAGS_WAVEIDS 0x80000000 #define IDirectPlayVoiceSetup_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) #define IDirectPlayVoiceSetup_AddRef(p) (p)->lpVtbl->AddRef(p) #define IDirectPlayVoiceSetup_Release(p) (p)->lpVtbl->Release(p) #define IDirectPlayVoiceSetup_CheckAudioSetup(p,a,b,c,d) (p)->lpVtbl->CheckAudioSetup(p,a,b,c,d) #undef INTERFACE #define INTERFACE IDirectPlayVoiceSetup DECLARE_INTERFACE_( IDirectPlayVoiceSetup, IUnknown ) { /*** IUnknown methods ***/ STDMETHOD(QueryInterface) (THIS_ REFIID riid, PVOID * ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; /*** IDirectPlayVoiceSetup methods ***/ STDMETHOD_(HRESULT, CheckAudioSetup) (THIS_ LPGUID, LPGUID, HWND, DWORD ) PURE; }; /**************************************************************************** * WARNING - Hack Alert End ****************************************************************************/ /* *************************************************************** * Globals *************************************************************** */ BOOL gfVocLoadedACM; BOOL gbVocSelectChanged = FALSE; BOOL gbVocCapPresent = FALSE; BOOL gbVocPlayPresent = FALSE; UINT giVocChange = 0; WNDPROC gfnVocPSProc = NULL; HWND ghVocDlg; /* *************************************************************** * Typedefs *************************************************************** */ /* *************************************************************** * File Globals *************************************************************** */ /* *************************************************************** * extern *************************************************************** */ /* *************************************************************** * Prototypes *************************************************************** */ BOOL PASCAL DoVocPropCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify); BOOL PASCAL DoVoiceCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify); void VOICEOUTInit(HWND hDlg, PAUDIODLGINFO paiVoc); void VOICECAPInit(HWND hDlg, PAUDIODLGINFO paiVoc); /////////////////////////////////////////////////////////////////////////////////////////// // Microsoft Confidential - DO NOT COPY THIS METHOD INTO ANY APPLICATION, THIS MEANS YOU!!! /////////////////////////////////////////////////////////////////////////////////////////// DWORD GetVoiceOutID(BOOL *pfPreferred) { MMRESULT mmr; DWORD dwWaveID; DWORD dwFlags = 0; if (pfPreferred) { *pfPreferred = TRUE; } mmr = waveOutMessage(HWAVEOUT_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, (DWORD_PTR) &dwWaveID, (DWORD_PTR) &dwFlags); if (!mmr && pfPreferred) { *pfPreferred = dwFlags & 0x00000001; } return(dwWaveID); } /////////////////////////////////////////////////////////////////////////////////////////// // Microsoft Confidential - DO NOT COPY THIS METHOD INTO ANY APPLICATION, THIS MEANS YOU!!! /////////////////////////////////////////////////////////////////////////////////////////// BOOL SetVoiceOutID(DWORD dwWaveID, BOOL fPrefOnly) { MMRESULT mmr; DWORD dwFlags = fPrefOnly ? 0x00000001 : 0x00000000; mmr = waveOutMessage(HWAVEOUT_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_SET, dwWaveID, dwFlags); return (!FAILED (mmr)); // TRUE; } /////////////////////////////////////////////////////////////////////////////////////////// // Microsoft Confidential - DO NOT COPY THIS METHOD INTO ANY APPLICATION, THIS MEANS YOU!!! /////////////////////////////////////////////////////////////////////////////////////////// DWORD GetVoiceCapID(BOOL *pfPreferred) { MMRESULT mmr; DWORD dwWaveID; DWORD dwFlags = 0; if (pfPreferred) { *pfPreferred = TRUE; } mmr = waveInMessage(HWAVEIN_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, (DWORD_PTR) &dwWaveID, (DWORD_PTR) &dwFlags); if (!mmr && pfPreferred) { *pfPreferred = dwFlags & 0x00000001; } return(dwWaveID); } /////////////////////////////////////////////////////////////////////////////////////////// // Microsoft Confidential - DO NOT COPY THIS METHOD INTO ANY APPLICATION, THIS MEANS YOU!!! /////////////////////////////////////////////////////////////////////////////////////////// BOOL SetVoiceCapID(DWORD dwWaveID, BOOL fPrefOnly) { MMRESULT mmr; DWORD dwFlags = fPrefOnly ? 0x00000001 : 0x00000000; mmr = waveInMessage(HWAVEIN_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_SET, dwWaveID, dwFlags); return (!FAILED (mmr)); // TRUE; } void GetVocPrefInfo(PAUDIODLGINFO paiVoc, HWND hDlg ) { // Load VoiceOut Info paiVoc->cNumOutDevs = waveOutGetNumDevs(); paiVoc->uPrefOut = GetVoiceOutID(&paiVoc->fPrefOnly); // Load VoiceCap Info paiVoc->cNumInDevs = waveInGetNumDevs(); paiVoc->uPrefIn = GetVoiceCapID(NULL); } STATIC void EnablePlayVoiceVolCtrls(HWND hDlg, BOOL fEnable) { EnableWindow( GetDlgItem(hDlg, IDC_LAUNCH_VOCVOL) , fEnable); EnableWindow( GetDlgItem(hDlg, IDC_PLAYBACK_ADVVOC) , fEnable); } STATIC void EnableRecVoiceVolCtrls(HWND hDlg, BOOL fEnable, BOOL fControl) { EnableWindow( GetDlgItem(hDlg, IDC_LAUNCH_CAPVOL) , fEnable); EnableWindow( GetDlgItem(hDlg, IDC_CAPTURE_ADVVOL) , fControl); } STATIC void SetVoiceOut(UINT uID, HWND hDlg) { BOOL fEnabled = FALSE; HMIXER hMixer = NULL; UINT uMixID; if(MMSYSERR_NOERROR == mixerGetID(HMIXEROBJ_INDEX(uID), &uMixID, MIXER_OBJECTF_WAVEOUT)) { if(MMSYSERR_NOERROR == mixerOpen(&hMixer, uMixID, 0L, 0L, 0L)) { fEnabled = TRUE; mixerClose(hMixer); } } EnablePlayVoiceVolCtrls(hDlg, fEnabled); gbVocPlayPresent = fEnabled; } DWORD CountVocInputs(DWORD dwMixID) { MIXERCAPS mc; MMRESULT mmr; DWORD dwCount = 0; mmr = mixerGetDevCaps(dwMixID, &mc, sizeof(mc)); if (mmr == MMSYSERR_NOERROR) { MIXERLINE mlDst; DWORD dwDestination; DWORD cDestinations; cDestinations = mc.cDestinations; for (dwDestination = 0; dwDestination < cDestinations; dwDestination++) { mlDst.cbStruct = sizeof ( mlDst ); mlDst.dwDestination = dwDestination; if (mixerGetLineInfo(HMIXEROBJ_INDEX(dwMixID), &mlDst, MIXER_GETLINEINFOF_DESTINATION ) == MMSYSERR_NOERROR) { if (mlDst.dwComponentType == (DWORD)MIXERLINE_COMPONENTTYPE_DST_WAVEIN || // needs to be a likely output destination mlDst.dwComponentType == (DWORD)MIXERLINE_COMPONENTTYPE_DST_VOICEIN) { DWORD cConnections = mlDst.cConnections; dwCount += mlDst.cControls; if (cConnections) { DWORD dwSource; for (dwSource = 0; dwSource < cConnections; dwSource++) { mlDst.dwDestination = dwDestination; mlDst.dwSource = dwSource; if (mixerGetLineInfo(HMIXEROBJ_INDEX(dwMixID), &mlDst, MIXER_GETLINEINFOF_SOURCE ) == MMSYSERR_NOERROR) { dwCount += mlDst.cControls; } } } } } } } return(dwCount); } STATIC void SetVoiceCap(UINT uID, HWND hDlg) { BOOL fEnabled = FALSE; BOOL fControl = FALSE; HMIXER hMixer = NULL; UINT uMixID; gbVocCapPresent = FALSE; if( (MMSYSERR_NOERROR == mixerGetID(HMIXEROBJ_INDEX(uID),&uMixID, MIXER_OBJECTF_WAVEIN))) { if( MMSYSERR_NOERROR == mixerOpen(&hMixer, uMixID, 0L, 0L, 0L)) { gbVocCapPresent = TRUE; // Even if the device has no inputs still enable test wizard if (CountVocInputs(uMixID)) { fEnabled = TRUE; // If the capture device is not GFX capable, then there are no tabs to display fControl = GFXUI_CheckDevice(uMixID, GFXTYPE_CAPTURE); } mixerClose(hMixer); } } EnableRecVoiceVolCtrls(hDlg, fEnabled, fControl); } STATIC void SetVocPrefInfo(PAUDIODLGINFO paiVoc, HWND hDlg ) { HWND hwndCBPlay = GetDlgItem(hDlg, IDC_VOICE_CB_PLAY); HWND hwndCBRec = GetDlgItem(hDlg, IDC_VOICE_CB_REC); UINT item, deviceID; GetVocPrefInfo(paiVoc, hDlg); if (gbVocSelectChanged == TRUE) { gbVocSelectChanged = FALSE; item = (UINT)ComboBox_GetCurSel(hwndCBPlay); if (item != CB_ERR) { deviceID = (UINT)ComboBox_GetItemData(hwndCBPlay, item); if(deviceID != paiVoc->uPrefOut) // Make sure device changed { if (SetVoiceOutID(deviceID, paiVoc->fPrefOnly)) { paiVoc->uPrefOut = deviceID; } } } item = (UINT)ComboBox_GetCurSel(hwndCBRec); if (item != CB_ERR) { deviceID = (UINT)ComboBox_GetItemData(hwndCBRec, item); if( deviceID != paiVoc->uPrefIn ) // Make sure device changed { if (SetVoiceCapID(deviceID, paiVoc->fPrefOnly)) { paiVoc->uPrefIn = deviceID; } } } } if (gbVocCapPresent && gbVocPlayPresent) EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_DIAG) , TRUE); // MIDI Devices are not remapped... } STATIC void VOICEOUTInit(HWND hDlg, PAUDIODLGINFO paiVoc) { HWND hwndCBPlay = GetDlgItem(hDlg, IDC_VOICE_CB_PLAY); UINT device; TCHAR szNoVoice[128]; szNoVoice[0] = TEXT('\0'); GetVocPrefInfo(paiVoc, hDlg); ComboBox_ResetContent(hwndCBPlay); gbVocPlayPresent = FALSE; if (paiVoc->cNumOutDevs == 0) { LoadString (ghInstance, IDS_NOAUDIOPLAY, szNoVoice, sizeof(szNoVoice)/sizeof(TCHAR)); ComboBox_AddString(hwndCBPlay, szNoVoice); ComboBox_SetItemData(hwndCBPlay, 0, (LPARAM)-1); ComboBox_SetCurSel(hwndCBPlay, 0); EnableWindow( hwndCBPlay, FALSE ); EnablePlayVoiceVolCtrls(hDlg, FALSE); } else { EnableWindow( hwndCBPlay, TRUE ); for (device = 0; device < paiVoc->cNumOutDevs; device++) { WAVEOUTCAPS woc; int newItem; woc.szPname[0] = TEXT('\0'); if (waveOutGetDevCaps(device, &woc, sizeof(woc))) { continue; } woc.szPname[sizeof(woc.szPname)/sizeof(TCHAR) - 1] = TEXT('\0'); newItem = ComboBox_AddString(hwndCBPlay, woc.szPname); if (newItem != CB_ERR && newItem != CB_ERRSPACE) { ComboBox_SetItemData(hwndCBPlay, newItem, (LPARAM)device); if (device == paiVoc->uPrefOut) { ComboBox_SetCurSel(hwndCBPlay, newItem); SetVoiceOut(device, hDlg); } } } } } STATIC void VOICECAPInit(HWND hDlg, PAUDIODLGINFO paiVoc) { HWND hwndCBRec = GetDlgItem(hDlg, IDC_VOICE_CB_REC); UINT device; TCHAR szNoVoice[128]; ComboBox_ResetContent(hwndCBRec); gbVocCapPresent = FALSE; if (paiVoc->cNumInDevs == 0) { LoadString (ghInstance, IDS_NOAUDIOREC, szNoVoice, sizeof(szNoVoice)/sizeof(TCHAR)); ComboBox_AddString(hwndCBRec, szNoVoice); ComboBox_SetItemData(hwndCBRec, 0, (LPARAM)-1); ComboBox_SetCurSel(hwndCBRec, 0); EnableWindow( hwndCBRec, FALSE ); EnableRecVoiceVolCtrls(hDlg, FALSE, FALSE); EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_DIAG) , FALSE); } else { EnableWindow( hwndCBRec, TRUE ); for (device = 0; device < paiVoc->cNumInDevs; device++) { WAVEINCAPS wic; int newItem; wic.szPname[0] = TEXT('\0'); if (waveInGetDevCaps(device, &wic, sizeof(wic))) { continue; } wic.szPname[sizeof(wic.szPname)/sizeof(TCHAR) - 1] = TEXT('\0'); newItem = ComboBox_AddString(hwndCBRec, wic.szPname); if (newItem != CB_ERR && newItem != CB_ERRSPACE) { ComboBox_SetItemData(hwndCBRec, newItem, (LPARAM)device); if (device == paiVoc->uPrefIn) { ComboBox_SetCurSel(hwndCBRec, newItem); SetVoiceCap(device, hDlg); } } } } } STATIC void VoiceDlgInit(HWND hDlg) { PAUDIODLGINFO paiVoc = (PAUDIODLGINFO)LocalAlloc(LPTR, sizeof(AUDIODLGINFO)); if (!paiVoc) return; SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)paiVoc); VOICEOUTInit(hDlg, paiVoc); VOICECAPInit(hDlg, paiVoc); if (gbVocCapPresent && gbVocPlayPresent) EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_DIAG) , TRUE); } const static DWORD aVoiceHelpIds[] = { // Context Help IDs IDC_GROUPBOX_VOC_1, IDH_COMM_GROUPBOX, IDC_VOICE_CB_PLAY, IDH_VOICE_SPEAKERICON, IDC_LAUNCH_VOCVOL, IDH_VOICE_LAUNCH_VOCVOL, IDC_PLAYBACK_ADVVOC, IDH_VOICE_PLAYBACK_ADVVOC, IDC_ICON_VOC_1, IDH_VOICE_SPEAKERICON, IDC_TEXT_32, NO_HELP, IDC_TEXT_VOC_1, IDH_VOICE_SPEAKERICON, IDC_TEXT_VOC_2, IDH_VOICE_RECORDICON, IDC_GROUPBOX_VOC_2, IDH_COMM_GROUPBOX, IDC_VOICE_CB_REC, IDH_VOICE_RECORDICON, IDC_LAUNCH_CAPVOL, IDH_VOICE_LAUNCH_CAPVOL, IDC_CAPTURE_ADVVOL, IDH_VOICE_CAPTURE_ADVVOL, IDC_ICON_VOC_2, IDH_VOICE_RECORDICON, IDC_ADVANCED_DIAG, IDH_VOICE_ADVANCED_TEST, 0, 0 }; void WinMMVoiceChange(HWND hDlg) { PAUDIODLGINFO paiVoc = (PAUDIODLGINFO)GetWindowLongPtr(hDlg, DWLP_USER); VOICEOUTInit(hDlg, paiVoc); VOICECAPInit(hDlg, paiVoc); if (gbVocCapPresent && gbVocPlayPresent) EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_DIAG) , TRUE); } LRESULT CALLBACK VoiceTabProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { if (iMsg == giVocChange) { WinMMVoiceChange(ghVocDlg); } return CallWindowProc(gfnVocPSProc,hwnd,iMsg,wParam,lParam); } void InitVoiceChange(HWND hDlg) { gfnVocPSProc = (WNDPROC) SetWindowLongPtr(GetParent(hDlg),GWLP_WNDPROC,(LPARAM)VoiceTabProc); giVocChange = RegisterWindowMessage(TEXT("winmm_devicechange")); } void UninitVoiceChange(HWND hDlg) { SetWindowLongPtr(GetParent(hDlg),GWLP_WNDPROC,(LPARAM)gfnVocPSProc); } BOOL CALLBACK VoiceDlg(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { NMHDR FAR *lpnm; PAUDIODLGINFO paiVoc; switch (uMsg) { case WM_NOTIFY: { lpnm = (NMHDR FAR *)lParam; switch(lpnm->code) { case PSN_KILLACTIVE: FORWARD_WM_COMMAND(hDlg, IDOK, 0, 0, SendMessage); break; case PSN_APPLY: FORWARD_WM_COMMAND(hDlg, ID_APPLY, 0, 0, SendMessage); break; case PSN_SETACTIVE: FORWARD_WM_COMMAND(hDlg, ID_INIT, 0, 0, SendMessage); break; case PSN_RESET: FORWARD_WM_COMMAND(hDlg, IDCANCEL, 0, 0, SendMessage); break; } } break; case WM_INITDIALOG: { ghVocDlg = hDlg; gfVoiceTab = TRUE; InitVoiceChange(hDlg); if (!gfVocLoadedACM) { if (LoadACM()) { gfVocLoadedACM = TRUE; } else { DPF("****Load ACM failed**\r\n"); ASSERT(FALSE); ErrorBox(hDlg, IDS_CANTLOADACM, NULL); ExitThread(0); } } VoiceDlgInit(hDlg); } break; case WM_DESTROY: { UninitVoiceChange(hDlg); paiVoc = (PAUDIODLGINFO)GetWindowLongPtr(hDlg, DWLP_USER); LocalFree((HLOCAL)paiVoc); if (gfVocLoadedACM) { if (!FreeACM()) { DPF("****Free ACM failed**\r\n"); ASSERT(FALSE); } gfVocLoadedACM = FALSE; } } break; case WM_CONTEXTMENU: { WinHelp ((HWND) wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR) (LPSTR) aVoiceHelpIds); return TRUE; } break; case WM_HELP: { LPHELPINFO lphi = (LPVOID) lParam; WinHelp (lphi->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR) (LPSTR) aVoiceHelpIds); return TRUE; } break; case WM_COMMAND: { HANDLE_WM_COMMAND(hDlg, wParam, lParam, DoVoiceCommand); } break; default: { } break; } return FALSE; } void ErrorVocMsgBox(HWND hDlg, UINT uTitle, UINT uMessage) { TCHAR szMsg[MAXSTR]; TCHAR szTitle[MAXSTR]; LoadString(ghInstance, uTitle, szTitle, sizeof(szTitle)/sizeof(TCHAR)); LoadString(ghInstance, uMessage, szMsg, sizeof(szMsg)/sizeof(TCHAR)); MessageBox(hDlg, szMsg,szTitle,MB_OK); } void LaunchVocPlaybackVolume(HWND hDlg) { HWND hwndCBPlay = GetDlgItem(hDlg, IDC_VOICE_CB_PLAY); UINT item; item = (UINT)ComboBox_GetCurSel(hwndCBPlay); if (item != CB_ERR) { TCHAR szCmd[MAXSTR]; UINT uDeviceID; MMRESULT mmr; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.wShowWindow = SW_SHOW; si.dwFlags = STARTF_USESHOWWINDOW; uDeviceID = (UINT)ComboBox_GetItemData(hwndCBPlay, item); mmr = mixerGetID(HMIXEROBJ_INDEX(uDeviceID), &uDeviceID, MIXER_OBJECTF_WAVEOUT); if (mmr == MMSYSERR_NOERROR) { wsprintf(szCmd,TEXT("sndvol32.exe -D %d"),uDeviceID); if (!CreateProcess(NULL,szCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE,IDS_ERROR_NOVOCVOL); } } else { ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE,IDS_ERROR_NOMIXER); } } } void LaunchCaptureVolume(HWND hDlg) { HWND hwndCBRec = GetDlgItem(hDlg, IDC_VOICE_CB_REC); UINT item; item = (UINT)ComboBox_GetCurSel(hwndCBRec); if (item != CB_ERR) { TCHAR szCmd[MAXSTR]; UINT uDeviceID; MMRESULT mmr; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); si.wShowWindow = SW_SHOW; si.dwFlags = STARTF_USESHOWWINDOW; uDeviceID = (UINT)ComboBox_GetItemData(hwndCBRec, item); mmr = mixerGetID(HMIXEROBJ_INDEX(uDeviceID), &uDeviceID, MIXER_OBJECTF_WAVEIN); if (mmr == MMSYSERR_NOERROR) { wsprintf(szCmd,TEXT("sndvol32.exe -R -D %d"),uDeviceID); if (!CreateProcess(NULL,szCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE,IDS_ERROR_NOVOCVOL); } } else { ErrorVocMsgBox(hDlg,IDS_ERROR_TITLE,IDS_ERROR_NOMIXER); } } } void LaunchVoiceTest(HWND hDlg) { HRESULT hr; GUID guidCapture; GUID guidPlayback; UINT item; HWND hwndVocPlay = GetDlgItem(hDlg, IDC_VOICE_CB_PLAY); HWND hwndVocCap = GetDlgItem(hDlg, IDC_VOICE_CB_REC); LPDIRECTPLAYVOICESETUP lpdpvs; item = (UINT)ComboBox_GetCurSel(hwndVocPlay); if (item != CB_ERR) { guidPlayback.Data1 = item; } else { ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE,IDS_ERROR_NOMIXER); return; } item = (UINT)ComboBox_GetCurSel(hwndVocCap); if (item != CB_ERR) { guidCapture.Data1 = item; } else { ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE,IDS_ERROR_NOMIXER); return; } if (FAILED(CoInitialize(NULL))) return; if (FAILED(CoCreateInstance(&CLSID_DirectPlayVoiceTest, 0, CLSCTX_ALL, &IID_IDirectPlayVoiceSetup, (void**)&lpdpvs))) { CoUninitialize(); ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE, IDS_ERROR_NOVOCDIAG); return; } hr = IDirectPlayVoiceSetup_CheckAudioSetup(lpdpvs, &guidPlayback, &guidCapture, hDlg, DVFLAGS_WAVEIDS ); if (FAILED(hr) && hr != DVERR_COMMANDALREADYPENDING && hr != DVERR_SOUNDINITFAILURE && hr != DVERR_USERCANCEL) { ErrorVocMsgBox(hDlg,IDS_ERROR_VOICE_TITLE, IDS_ERROR_NOVOCDIAG); } IDirectPlayVoiceSetup_Release(lpdpvs); CoUninitialize(); } BOOL PASCAL DoVoiceCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify) { PAUDIODLGINFO paiVoc = (PAUDIODLGINFO)GetWindowLongPtr(hDlg, DWLP_USER); if (!gfVocLoadedACM) { return FALSE; } switch (id) { case ID_APPLY: { SetVocPrefInfo(paiVoc, hDlg); } break; case IDC_VOICE_CB_PLAY: case IDC_VOICE_CB_REC: { switch (codeNotify) { case CBN_SELCHANGE: { PropSheet_Changed(GetParent(hDlg),hDlg); if ((id == IDC_VOICE_CB_PLAY) || (id == IDC_VOICE_CB_REC)) { int iIndex; iIndex = ComboBox_GetCurSel(hwndCtl); if (iIndex != CB_ERR) { gbVocSelectChanged = TRUE; if (id == IDC_VOICE_CB_REC) SetVoiceCap(iIndex, hDlg); if (id == IDC_VOICE_CB_PLAY) SetVoiceOut(iIndex, hDlg); if (gbVocCapPresent && gbVocPlayPresent) EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_DIAG) , TRUE); else EnableWindow( GetDlgItem(hDlg, IDC_ADVANCED_DIAG) , FALSE); } } } break; } } break; case IDC_ADVANCED_DIAG: { LaunchVoiceTest(hDlg); } break; case IDC_LAUNCH_VOCVOL: { LaunchVocPlaybackVolume(hDlg); } break; case IDC_LAUNCH_CAPVOL: { LaunchCaptureVolume(hDlg); } break; case IDC_PLAYBACK_ADVVOC: { HWND hwndVocPlay = GetDlgItem(hDlg, IDC_VOICE_CB_PLAY); DWORD dwDeviceID; UINT u; TCHAR szPrefOut[MAXSTR]; u = (UINT)ComboBox_GetCurSel(hwndVocPlay); if (u != CB_ERR) { ComboBox_GetLBText(hwndVocPlay, u, (LPARAM)(LPVOID)szPrefOut); dwDeviceID = (DWORD)ComboBox_GetItemData(hwndVocPlay, u); AdvancedAudio(hDlg, ghInstance, gszWindowsHlp, dwDeviceID, szPrefOut, FALSE); } } break; case IDC_CAPTURE_ADVVOL: { HWND hwndVocCap = GetDlgItem(hDlg, IDC_VOICE_CB_REC); DWORD dwDeviceID; UINT u; TCHAR szPrefIn[MAXSTR]; u = (UINT)ComboBox_GetCurSel(hwndVocCap); if (u != CB_ERR) { ComboBox_GetLBText(hwndVocCap, u, (LPARAM)(LPVOID)szPrefIn); dwDeviceID = (DWORD)ComboBox_GetItemData(hwndVocCap, u); AdvancedAudio(hDlg, ghInstance, gszWindowsHlp, dwDeviceID, szPrefIn, TRUE); } } break; } return FALSE; }