|
|
/*
*************************************************************** * * This file contains the functions to display and submit changes * for sound effects * * Copyright 2000, Microsoft Corporation * * History: * * 03/2000 - tsharp (Created) * *************************************************************** */
#include <windows.h>
#include <mmsystem.h>
#include <string.h>
#include <cpl.h>
#include <shellapi.h>
#include <ole2.h>
#include <mmddkp.h>
#define NOSTATUSBAR
#include <commctrl.h>
#include <prsht.h>
#include <regstr.h>
#include "mmcpl.h"
#include "draw.h"
#include "medhelp.h"
#include "gfxui.h"
#include <dsound.h>
#include <dsprv.h>
#include "advaudio.h"
/****************** Debug Off *********************/ //#define DEBUG
//#define _INC_MMDEBUG_CODE_ TRUE
//#include "mmdebug.h"
// End debug stuff
#define MAX_GFX_COUNT 128 // maximum number of global effects (Gfx) processed
#define MAX_LIST_DESC 50 // maximum length of Gfx description in list view
#define FILLER_MSG 257 // maximum number of Gfx applicable to the system
const static DWORD aKeyWordIds[] = { IDC_EFFECT_STATIC, IDH_EFFECT_STATIC, IDC_TEXT_32, NO_HELP, IDB_EFFECT_PROP, IDH_EFFECT_PROP, 0,0 };
/****************************************************************
* Definitions ***************************************************************/
typedef HRESULT (WINAPI *GETCLASSOBJECTFUNC)( REFCLSID, REFIID, LPVOID * );
/***************************************************************
* File Globals ***************************************************************/ PGFXUILIST gpFullList; PGFXUILIST gpGfxInitList; PGFXUI gpGfxNodeArray[MAX_GFX_COUNT];
/***************************************************************
* extern ***************************************************************/ extern "C" { extern DWORD GetWaveOutID(BOOL *pfPreferred); }
/***************************************************************
* Prototypes ***************************************************************/
DWORD GetWaveOutID(void) { return GetWaveOutID(NULL); }
/***************************************************************
* GetListIndex * * Description: * Returns the selected index for the combobox. Always add one * for the first entry of "None" * * Parameters: * HWND DWORD - GFX ID * * Returns: * int - Index number of the selected item * ***************************************************************/
int GetListIndex(PGFXUI pGfx) { int iIndex = 0; int iCnt = 0;
if (pGfx) { while (gpGfxNodeArray[iCnt]) { if (lstrcmpi(pGfx->pszName, gpGfxNodeArray[iCnt++]->pszName) == 0 ) { iIndex = iCnt; break; } } } return (iIndex); }
/***************************************************************
* CheckEffect * * Description: * Check to see if effect has properties, * * Parameters: * HWND hDlg - handle to dialog window. * * Returns: BOOL * TRUE if all the events for the selected module were read from the reg * database, else FALSE ***************************************************************/
BOOL PASCAL CheckEffect(HWND hDlg) { PGFXUI pGfxTemp = NULL; PGFXUI pGfxBase = NULL; DWORD dwIndex = (DWORD)SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_GETCURSEL,0,0);
if (0 == dwIndex) return FALSE;
if (!gpGfxNodeArray[dwIndex-1]) return FALSE; else pGfxTemp = gpGfxNodeArray[dwIndex-1];
if (!gpGfxInitList->puiList) return FALSE; else pGfxBase = gpGfxInitList->puiList;
if (lstrcmpi(pGfxTemp->pszName, pGfxBase->pszName) == 0) return GFXUI_CanShowProperties(pGfxBase); else return FALSE;
}
/***************************************************************
* SetEffects * * Description: * Adds all the effects to the ListView, * * Parameters: * HWND hDlg - handle to dialog window. * * Returns: None ***************************************************************/
void SetEffects(HWND hDlg) { PGFXUI pGfxDelete; PGFXUI pGfxTemp; PGFXUI pGfxBase; DWORD dwIndex = (DWORD)SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_GETCURSEL,0,0);
// Check to see Index is in range
if ((0 != dwIndex)&&(gpGfxNodeArray[dwIndex-1])) pGfxBase = gpGfxNodeArray[dwIndex-1]; else pGfxBase = NULL;
if (gpGfxInitList->puiList) pGfxTemp = gpGfxInitList->puiList; else pGfxTemp = NULL; // No GFX Selected or previously set
if ((0 == dwIndex)&&(!pGfxTemp)) return;
// GFX has not been changed
if (pGfxTemp && pGfxBase) if (lstrcmpi(pGfxTemp->pszName, pGfxBase->pszName) == 0) return;
// If there was a previous GFX it is assigned to pGfxTemp
// to be deleted
gpGfxInitList->puiList = NULL;
if (pGfxBase) GFXUI_CreateAddGFX(&(gpGfxInitList->puiList), pGfxBase); GFXUI_Apply (&gpGfxInitList, &pGfxTemp);
EnableWindow(GetDlgItem(hDlg, IDB_EFFECT_PROP), CheckEffect(hDlg));
return; }
/***************************************************************
* LoadEffects * * Description: * Adds all the effects to the ListView, * * Parameters: * HWND hDlg - handle to dialog window. * * Returns: * None * ***************************************************************/
void LoadEffects(HWND hDlg) { TCHAR szBuffer[MAX_PATH]; DWORD dwDefDeviceId = 0; DWORD dwType =0; DWORD dwDeviceId = 0; DWORD dwIndex = 0; UINT uMixId; HRESULT hr;
PGFXUILIST pRetList = NULL; PGFXUI pTempGFX = NULL;
dwDeviceId = gAudData.waveId; dwDefDeviceId = GetWaveOutID();
if (dwDeviceId != dwDefDeviceId) ShowWindow (GetDlgItem(hDlg, IDB_EFFECT_PLAY), SW_HIDE); if (gAudData.fRecord) dwType = GFXTYPE_CAPTURE; else dwType = GFXTYPE_RENDER;
if (mixerGetID(HMIXEROBJ_INDEX(dwDeviceId), &uMixId, gAudData.fRecord ? MIXER_OBJECTF_WAVEIN : MIXER_OBJECTF_WAVEOUT)) uMixId = (-1);
hr = GFXUI_CreateList(uMixId, dwType, FALSE, &pRetList);
if (SUCCEEDED (hr)) { ASSERT(pRetList); gpGfxInitList = pRetList; pTempGFX = gpGfxInitList->puiList; }
if(SUCCEEDED (hr) && pTempGFX) { dwIndex = GetListIndex(pTempGFX); SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_SETCURSEL, dwIndex, 0); } else { SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_SETCURSEL,0,0); }
EnableWindow(GetDlgItem(hDlg, IDB_EFFECT_PROP), CheckEffect(hDlg));
}
/***************************************************************
* LoadEffectList * * Description: * Adds all the effects to the Combobox, * * Parameters: * HWND hDlg - handle to dialog window. * * Returns: * None * ***************************************************************/
void LoadEffectList(HWND hDlg) { int nItemNum = 0; TCHAR szBuffer[MAX_PATH]; DWORD dwType = 0; DWORD dwWaveId = 0; UINT uMixId; PGFXUI pList = NULL; HRESULT hr; SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_RESETCONTENT,0,0);
LoadString (ghInstance, IDS_NOGFXSET, szBuffer, sizeof(szBuffer)/sizeof(TCHAR)); SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) szBuffer);
if (gAudData.fRecord) dwType = GFXTYPE_CAPTURE; else dwType = GFXTYPE_RENDER;
dwWaveId = gAudData.waveId;
if (mixerGetID(HMIXEROBJ_INDEX(dwWaveId), &uMixId, gAudData.fRecord ? MIXER_OBJECTF_WAVEIN : MIXER_OBJECTF_WAVEOUT)) uMixId = (-1);
hr = GFXUI_CreateList(uMixId, dwType, TRUE, &gpFullList);
if (SUCCEEDED (hr)) { ASSERT(gpFullList); pList = gpFullList->puiList; }
if(SUCCEEDED (hr) && pList) { do { SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_INSERTSTRING, (WPARAM) -1, (LPARAM) pList->pszName); gpGfxNodeArray[nItemNum] = pList; nItemNum++;
pList = pList->pNext;
}while(pList); gpGfxNodeArray[nItemNum] = NULL;
} }
/****************************************************************
* ShowProperties * * Description: * Show properties button if applicable. * * Parameters: * HWND hDlg window handle of dialog window * * Returns: * None * ****************************************************************/
void ShowProperties (HWND hDlg) { PGFXUI pGfxTemp = NULL; PGFXUI pGfxBase = NULL; DWORD dwIndex = (DWORD)SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_GETCURSEL,0,0);
if (0 == dwIndex) return;
if (!gpGfxNodeArray[dwIndex-1]) return; else pGfxTemp = gpGfxNodeArray[dwIndex-1];
if (!gpGfxInitList->puiList) return; else pGfxBase = gpGfxInitList->puiList;
if (lstrcmpi(pGfxTemp->pszName, pGfxBase->pszName) == 0) GFXUI_Properties (pGfxBase, hDlg);; return; }
/****************************************************************
* ChangeGFX * * Description: * Show properties button if applicable. * * Parameters: * HWND hDlg window handle of dialog window * * Returns: * None * ****************************************************************/
void ChangeGFX (HWND hDlg) { DWORD dwIndex = 0; HWND hwndSheet = GetParent(hDlg);
EnableWindow(GetDlgItem(hDlg, IDB_EFFECT_PROP), FALSE);
dwIndex = (DWORD)SendDlgItemMessage(hDlg, IDC_EFFECT_LIST, CB_GETCURSEL,0,0);
if (dwIndex != CB_ERR) { EnableWindow(GetDlgItem(hDlg, IDB_EFFECT_PROP), CheckEffect(hDlg));
PropSheet_Changed(hwndSheet,hDlg); } }
/*
*************************************************************** * EffectDlg * * Description: * EffectDlg for MM control panel applet. * * Parameters: * HWND hDlg window handle of dialog window * UINT uiMessage message number * WPARAM wParam message-dependent * LPARAM lParam message-dependent * * Returns: BOOL * TRUE if message has been processed, else FALSE * *************************************************************** */ INT_PTR CALLBACK SoundEffectsDlg(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) { NMHDR FAR * lpnm;
switch (uMsg) { case WM_NOTIFY: lpnm = (NMHDR FAR *)lParam; switch(lpnm->code) { case PSN_APPLY: FORWARD_WM_COMMAND(hDlg, ID_APPLY, 0, 0, SendMessage); break;
case PSN_RESET: FORWARD_WM_COMMAND(hDlg, IDCANCEL, 0, 0, SendMessage); break;
break; } break;
case WM_INITDIALOG: { LoadEffectList(hDlg); if (gAudData.fRecord) { // Hide the "Play Default Sound" button for Recording devices
ShowWindow (GetDlgItem(hDlg, IDB_EFFECT_PLAY), SW_HIDE); } LoadEffects(hDlg); } break;
case WM_DESTROY: { GFXUI_FreeList(&gpGfxInitList); GFXUI_FreeList(&gpFullList); break; }
case WM_CONTEXTMENU: WinHelp((HWND)wParam, NULL, HELP_CONTEXTMENU, (UINT_PTR)(LPTSTR)aKeyWordIds); break;
case WM_HELP: WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP , (UINT_PTR)(LPTSTR)aKeyWordIds); break;
case WM_COMMAND: switch (LOWORD(wParam)) { case ID_APPLY: { SetEffects(hDlg); } break;
case IDC_EFFECT_LIST: { if (HIWORD(wParam) == CBN_SELCHANGE) ChangeGFX(hDlg); } break;
case IDB_EFFECT_PROP: { ShowProperties (hDlg); } break;
case IDB_EFFECT_PLAY: { PlaySound(TEXT(".Default"), NULL, SND_FILENAME | SND_ASYNC ); } break; } break;
default: break; } return FALSE; }
|