/***************************************************************************** * * * WINAWE32 Sample demo for Sound Blaster Advanced WavEffects * * * * (C) Copyright Creative Technology Ltd. 1992-94. All rights reserved * * worldwide. * * * * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY * * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * * IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR * * PURPOSE. * * * * You have a royalty-free right to use, modify, reproduce and * * distribute the Sample Files (and/or any modified version) in * * any way you find useful, provided that you agree to * * the Creative's Software Licensing Aggreement and you also agree that * * Creative has no warranty obligations or liability for any Sample Files. * * * ******************************************************************************/ /*****************************************************************************\ * File name : WINAWE32.C * * * * Programmer : Cheng Kok Hoong * * Creative Technology Ltd, 1994. All rights reserved. * * * * Version : 1.1.1 * * * * WINAWE32 is a sample application that uses SB AWE32's AWEMAN.DLL * * and AWEGUI.DLL * * * ******************************************************************************/ #include "windows.h" #include "mmsystem.h" #include "winawe32.h" #include "awe_dll.h" #include "awe_api.h" #include "mci.h" #include "commdlg.h" #include "string.h" BOOL InitAWEDLL(void); BOOL OpenAWEMAN(void); BOOL CloseAWEMAN(void); BOOL FetchMIDIFile(HWND); BOOL FetchUserBankFile(HWND); void SetReverb(WORD); void SetChorus(WORD); BOOL bIsMIDIPlaying = FALSE; BOOL bIsUserBankLoaded = FALSE; typedef LRESULT (FAR PASCAL *LPCONTROLPANEL)(LPCSTR, BOOL); typedef LRESULT (FAR PASCAL *LPCONTROLLERBOB)(LPCSTR, BOOL); LPCONTROLPANEL lpControlPanel = NULL; LPCONTROLLERBOB lpControllerBob = NULL; LPFNAWEMANAGER lpAWEManager = NULL; HANDLE hInst; HANDLE hAWEGUIDLL = NULL; HANDLE hAWEMANDLL = NULL; AWEHANDLE hAWEHandle = NULL; WORD wMCIDeviceID = 0; HWND hWndDemo = NULL; char szFileName[128]; char szBareName[12]; char szUserBankName[128]; HMIDIOUT hMIDIOut; #define USER_BANK_NUM 1 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; if (hPrevInstance) return FALSE; else if (!InitApplication(hInstance)) return (FALSE); if (!InitInstance(hInstance, nCmdShow)) return (FALSE); if (!InitAWEDLL() ) return FALSE; if ( !OpenAWEMAN() ) { MessageBox(NULL, "Unable to open AWEMAN\0", "Error\0", MB_OK|MB_ICONHAND); return FALSE; } while (GetMessage(&msg, NULL, NULL, NULL) ) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); } BOOL InitApplication(HANDLE hInstance) { WNDCLASS wc; wc.style = NULL; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, (LPCSTR)IDI_ICON1); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "WinAWE32Menu"; wc.lpszClassName = "WinAWE32Class"; return (RegisterClass(&wc)); } BOOL InitInstance(HANDLE hInstance, int nCmdShow) { HWND hWnd; RECT rectWindow; hInst = hInstance; hWnd = CreateWindow( "WinAWE32Class", "WinAWE32 Sample Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if (!hWnd) return (FALSE); // Resize the Window #define WIN_WIDTH 400 #define WIN_HEIGHT 100 GetWindowRect(hWnd, &rectWindow); MoveWindow(hWnd, rectWindow.left, rectWindow.top, WIN_WIDTH, WIN_HEIGHT, TRUE); ShowWindow(hWnd, nCmdShow); hWndDemo = hWnd; return (TRUE); } long CALLBACK __export MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { CParamObject cObject; CBufferObject cBufferObj; DWORD dwMaxDRAM, dwAvailableDRAM; char ach[128]; HCURSOR hCursor; cObject.m_SBankIndex = 0; cObject.m_UBankIndex = 0; cObject.m_InstrIndex = 0; cObject.m_TypeIndex = REVERB_CHORUS; cObject.m_SubIndex = REVERB; switch (message) { case WM_COMMAND: { switch ( wParam ) { case ID_CLEAR_BANK: { if ( bIsUserBankLoaded == TRUE ) { if ( lpAWEManager(hAWEHandle, AWE_CLEAR_USER_BANK, USER_BANK_NUM, NULL) != AWE_NO_ERR ) MessageBox(NULL, "Error clearing user bank\0", "Error\0", MB_OK|MB_ICONHAND); else { MessageBox(NULL, "User Bank 1 unloaded\0", "Info\0", MB_OK); bIsUserBankLoaded = FALSE; } } } break; case ID_STOP_MIDI: if ( bIsMIDIPlaying == TRUE ) { if ( MCIEndPlay(wMCIDeviceID) ) MessageBox(NULL, "Error stop playing MCISEQ.\0", "Error.\0", MB_OK|MB_ICONSTOP); if ( MCICloseDevice(wMCIDeviceID) ) MessageBox(NULL, "Error closing MCISEQ.\0", "Error.\0", MB_OK|MB_ICONSTOP); bIsMIDIPlaying = FALSE; } break; case ID_LOAD_USERBANK: if ( FetchUserBankFile(hWnd) ) { // Now load the bank into user bank 1... not enough // time to do a flexible user bank dialog box cBufferObj.m_Size = 128; // Size of string buffer cBufferObj.m_Flag = OPER_FILE; cBufferObj.m_Buffer = (LPSTR)szUserBankName; hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); if ( lpAWEManager(hAWEHandle, AWE_LOAD_USER_BANK, (LPARAM)USER_BANK_NUM, (LPARAM)(LPSTR)&cBufferObj) == AWE_NO_ERR ) { MessageBox(NULL, "User Bank 1 load successful\0", "Info\0", MB_OK); bIsUserBankLoaded = TRUE; } else { MessageBox(NULL, "User Bank load failed.\0", "Error\0", MB_OK); } SetCursor(hCursor); } break; case ID_SETTINGS_TRIGGERME: DialogBox(hInst, /* current instance */ "TriggerMe", /* resource to use */ hWnd, /* parent handle */ TriggerMe); /* About() instance address */ break; case ID_FILE_OPEN: if ( FetchMIDIFile(hWnd) ) { if ( bIsMIDIPlaying == TRUE ) { MCIEndPlay(wMCIDeviceID); MCICloseDevice(wMCIDeviceID); } if ( MCIOpenDevice(&wMCIDeviceID, szFileName) ) { MessageBox(NULL, "Error in opening MCI.\0", "Error\0", MB_OK|MB_ICONSTOP); break; } else { MCIPlayDevice(hWnd, wMCIDeviceID); bIsMIDIPlaying = TRUE; // Update main windows's title to reflect the currently playing MIDI file SetWindowText(hWnd, szBareName); } } break; case ID_QUIT: PostMessage(hWnd, WM_DESTROY, NULL, NULL); break; case IDM_ABOUT: DialogBox(hInst, /* current instance */ "AboutBox", /* resource to use */ hWnd, /* parent handle */ About); /* About() instance address */ break; case ID_QUERY_SYNTH: { CBufferObject buffer; char voila; enum SBANK sBank; buffer.m_Size = sizeof(voila); buffer.m_Buffer = (LPSTR)&voila; lpAWEManager(hAWEHandle, AWE_GET_SYN_BANK, (LPARAM)(LPBUFFEROBJECT)&buffer, 0L); sBank = (enum SBANK)buffer.m_Flag; if ( sBank == GENERAL_MIDI ) MessageBox(NULL, "Current synthesizer mode is General MIDI\0", "Info\0", MB_OK); if ( sBank == ROLAND_GS ) MessageBox(NULL, "Current synthesizer mode is GS\0", "Info\0", MB_OK); if ( sBank == MT_32 ) MessageBox(NULL, "Current synthesizer mode is MT-32\0", "Info\0", MB_OK); } break; case ID_QUERY_DRAM: if ( lpAWEManager(hAWEHandle, AWE_QUERY_DRAM_SIZE, (LPARAM)(LPSTR)&dwMaxDRAM, (LPARAM)(LPSTR)&dwAvailableDRAM) == AWE_NO_ERR ) { (void)wsprintf(ach, "TotalDRAM = %lu bytes, AvailableDRAM = %lu bytes\0", dwMaxDRAM*2, dwAvailableDRAM*2); MessageBox(NULL, ach, "DRAM Info\0", MB_OK); } break; case ID_GUI_CONTROLPANEL: { LRESULT result = lpControlPanel("Peek-A-Boo !\0", FALSE); if ( result != AWE_NO_ERR ) { switch ( result ) { case AWE_ERR_DLL_BUSY: MessageBox(NULL, "DLL Busy\0", "Error\0", MB_OK); break; case AWE_ERR_SYSMEM_INSUFFICIENT: MessageBox(NULL,"Insufficient Memory\0", "Error\0", MB_OK); break; case AWE_ERR_ACTIVATE_BOB: MessageBox(NULL,"BOB already activated\0", "Error\0", MB_OK); break; case AWE_ERR_DEVICE_DRV_INVALID: MessageBox(NULL,"Invalid driver\0", "Error\0", MB_OK); break; } } break; } case ID_GUI_CONTROLLER: { LRESULT result = lpControllerBob("Peek-A-Boo Two !\0", FALSE); if ( result != AWE_NO_ERR ) { switch ( result ) { case AWE_ERR_DLL_BUSY: MessageBox(NULL,"DLL Busy\0", "Error\0", MB_OK); break; case AWE_ERR_SYSMEM_INSUFFICIENT: MessageBox(NULL,"Insufficient Memory\0", "Error\0", MB_OK); break; case AWE_ERR_ACTIVATE_BOB: MessageBox(NULL,"BOB already activated\0", "Error\0", MB_OK); break; case AWE_ERR_DEVICE_DRV_INVALID: MessageBox(NULL,"Invalid driver\0", "Error\0", MB_OK); break; } } break; } case ID_MISC_SYNTHBANK_GM: hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); if ( lpAWEManager(hAWEHandle, AWE_SELECT_SYN_BANK, GENERAL_MIDI, NULL) == AWE_NO_ERR ) MessageBox(NULL, "Set synthesizer mode to General MIDI successful.\0", "Info\0", MB_OK); else MessageBox(NULL, "Set GM failed.\0", "Error\0", MB_OK); SetCursor(hCursor); break; case ID_MISC_SYNTHBANK_GS: hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); if ( lpAWEManager(hAWEHandle, AWE_SELECT_SYN_BANK, ROLAND_GS, NULL) == AWE_NO_ERR ) MessageBox(NULL, "Set synthesizer mode to GS successful.\0", "Info\0", MB_OK); else MessageBox(NULL, "Set GS failed.\0", "Error\0", MB_OK); SetCursor(hCursor); break; case ID_MISC_SYNTHBANK_MT32: hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); if ( lpAWEManager(hAWEHandle, AWE_SELECT_SYN_BANK, MT_32, NULL) == AWE_NO_ERR ) MessageBox(NULL, "Set synthesizer mode to MT-32 successful.\0", "Info\0", MB_OK); else MessageBox(NULL, "Set MT-32 failed.\0", "Error\0", MB_OK); SetCursor(hCursor); break; case ID_SETTINGS_REVERB_ROOM1 : case ID_SETTINGS_REVERB_ROOM2 : case ID_SETTINGS_REVERB_ROOM3 : case ID_SETTINGS_REVERB_HALL1 : case ID_SETTINGS_REVERB_HALL2 : case ID_SETTINGS_REVERB_PLATE : case ID_SETTINGS_REVERB_DELAY : case ID_SETTINGS_REVERB_PANNINGDELAY : SetReverb(wParam); break; case ID_SETTINGS_CHORUS_CHORUS1 : case ID_SETTINGS_CHORUS_CHORUS2 : case ID_SETTINGS_CHORUS_CHORUS3 : case ID_SETTINGS_CHORUS_CHORUS4 : case ID_SETTINGS_CHORUS_FEEBACKCHORUS : case ID_SETTINGS_CHORUS_FLANGER : case ID_SETTINGS_CHORUS_SHORTDELAY : case ID_SETTINGS_CHORUS_SHORTDELAYFB : SetChorus(wParam); break; } break; } break; case WM_DESTROY: if ( bIsMIDIPlaying == TRUE ) { if ( MCIEndPlay(wMCIDeviceID) ) MessageBox(NULL, "Error stop playing MCISEQ.\0", "Error.\0", MB_OK|MB_ICONSTOP); if ( MCICloseDevice(wMCIDeviceID) ) MessageBox(NULL, "Error closing MCISEQ.\0", "Error.\0", MB_OK|MB_ICONSTOP); } if ( bIsUserBankLoaded == TRUE ) { if ( lpAWEManager(hAWEHandle, AWE_CLEAR_USER_BANK, USER_BANK_NUM, NULL) != AWE_NO_ERR ) MessageBox(NULL, "Error clearing user bank\0", "Error\0", MB_OK|MB_ICONHAND); } if ( CloseAWEMAN() == FALSE ) MessageBox(NULL, "Error closing AWEMAN\0", "Error", MB_OK|MB_ICONSTOP); FreeLibrary(hAWEMANDLL); FreeLibrary(hAWEGUIDLL); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (NULL); } BOOL __export CALLBACK About(HWND hDlg, unsigned message, WORD wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return (TRUE); case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return (FALSE); } BOOL __export CALLBACK TriggerMe(HWND hDlg, unsigned message, WORD wParam, LPARAM lParam) { #define BIG_ON 0x007F3C90 #define BIG_OFF 0x00003C90 #define PATCH_SET 0x00007FC0 DWORD dwErr; char ach[128]; DWORD dwPresetNumber; static DWORD dwMIDINumber = 0xF; BOOL fTranslated; switch (message) { case WM_INITDIALOG: // Set to preset 1 on startup, MIDI channel 16 SetDlgItemInt(hDlg, IDC_PC, 0x0, FALSE); SetDlgItemInt(hDlg, IDC_MIDI, 0xF, FALSE); return (TRUE); case WM_COMMAND: switch ( wParam ) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case IDC_BIGON: dwErr = lpAWEManager(hAWEHandle, AWE_SEND_MIDI, BIG_ON+dwMIDINumber, NULL); if ( dwErr != AWE_NO_ERR ) { (void)wsprintf(ach, "Error code = %d\0", (WORD)dwErr); MessageBox(NULL, ach, "Error\0", MB_OK|MB_ICONSTOP); } return TRUE; case IDC_BIGOFF: dwErr = lpAWEManager(hAWEHandle, AWE_SEND_MIDI, BIG_OFF+dwMIDINumber, NULL); if ( dwErr != AWE_NO_ERR ) { (void)wsprintf(ach, "Error code = %d\0", (WORD)dwErr); MessageBox(NULL, ach, "Error\0", MB_OK|MB_ICONSTOP); } return TRUE; case IDC_SETPATCH: // Get the patch number dwPresetNumber = (DWORD)GetDlgItemInt(hDlg, IDC_PC, (BOOL FAR*)&fTranslated, FALSE); if ( dwPresetNumber > 0x7F ) dwPresetNumber = 0x7F; dwPresetNumber = (dwPresetNumber << 8) + dwMIDINumber + 0xC0; dwErr = lpAWEManager(hAWEHandle, AWE_SEND_MIDI, dwPresetNumber, NULL); if ( dwErr != AWE_NO_ERR ) { (void)wsprintf(ach, "Error code = %d\0", (WORD)dwErr); MessageBox(NULL, ach, "Error\0", MB_OK|MB_ICONSTOP); } return TRUE; case IDC_SETMIDI: // Get the MIDI channel dwMIDINumber = (DWORD)GetDlgItemInt(hDlg, IDC_MIDI, (BOOL FAR*)&fTranslated, FALSE); if ( dwMIDINumber > 0xF ) dwMIDINumber = 0xF; return TRUE; } break; } return (FALSE); } BOOL InitAWEDLL(void) { hAWEGUIDLL = LoadLibrary("AWEGUI.DLL"); if ( hAWEGUIDLL > HINSTANCE_ERROR ) { lpControlPanel = (LPCONTROLPANEL)GetProcAddress(hAWEGUIDLL, "AWEControlPanel"); lpControllerBob = (LPCONTROLPANEL)GetProcAddress(hAWEGUIDLL, "AWEControllerBob"); if ( lpControlPanel == NULL || lpControllerBob == NULL ) return FALSE; } hAWEMANDLL = LoadLibrary("AWEMAN.DLL"); if ( hAWEGUIDLL > HINSTANCE_ERROR ) { lpAWEManager = (LPFNAWEMANAGER)GetProcAddress(hAWEMANDLL, "AWEManager"); if ( lpAWEManager == NULL) return FALSE; } return TRUE; } BOOL OpenAWEMAN() { if ( lpAWEManager(NULL, AWE_OPEN, (LPARAM)(LPSTR)&hAWEHandle, NULL) == AWE_NO_ERR ) return TRUE; else return FALSE; } BOOL CloseAWEMAN() { if ( lpAWEManager(hAWEHandle, AWE_CLOSE, NULL, NULL ) == AWE_NO_ERR ) return TRUE; else return FALSE; } BOOL FetchMIDIFile(HWND hWnd) { char szMIDIExt[] = "MIDI\0*.MID; *.RMI\0"; WORD wReturnVal = 0; DWORD dwErrorVal = 0; OPENFILENAME ofnMIDI; // char szInitFile[128] strcpy(szFileName, szBareName); // szFileName[0] = 0; ofnMIDI.lStructSize = sizeof(OPENFILENAME); ofnMIDI.hwndOwner = hWnd; ofnMIDI.hInstance = hInst; ofnMIDI.lpstrFilter = szMIDIExt; ofnMIDI.lpstrCustomFilter = NULL; ofnMIDI.nMaxCustFilter = 0L; ofnMIDI.nFilterIndex = 1L; ofnMIDI.lpstrFile = (LPSTR)szFileName; ofnMIDI.nMaxFile = 128; ofnMIDI.lpstrInitialDir = NULL; ofnMIDI.lpstrTitle = NULL; ofnMIDI.lpstrFileTitle = (LPSTR)szBareName; ofnMIDI.lpstrDefExt = NULL; ofnMIDI.Flags = 0; wReturnVal = GetOpenFileName((LPOPENFILENAME)&ofnMIDI); if ( wReturnVal > 0 ) return TRUE; else return FALSE; } BOOL FetchUserBankFile(HWND hWnd) { char szSBKExt[] = "SoundFont Bank\0*.SBK\0"; WORD wReturnVal = 0; DWORD dwErrorVal = 0; OPENFILENAME ofnSBK; ofnSBK.lStructSize = sizeof(OPENFILENAME); ofnSBK.hwndOwner = hWnd; ofnSBK.hInstance = hInst; ofnSBK.lpstrFilter = szSBKExt; ofnSBK.lpstrCustomFilter = NULL; ofnSBK.nMaxCustFilter = 0L; ofnSBK.nFilterIndex = 1L; ofnSBK.lpstrFile = (LPSTR)szUserBankName; ofnSBK.nMaxFile = 128; ofnSBK.lpstrInitialDir = NULL; ofnSBK.lpstrTitle = NULL; ofnSBK.lpstrFileTitle = NULL; ofnSBK.lpstrDefExt = NULL; ofnSBK.Flags = 0; wReturnVal = GetOpenFileName((LPOPENFILENAME)&ofnSBK); if ( wReturnVal > 0 ) return TRUE; else return FALSE; } void SetReverb(WORD wParam) { CParamObject param; enum TYPEINDEX m_CurEfxType; enum VARIINDEX m_CurTypeVari[2]; param.m_VariIndex[REVERB] = param.m_VariIndex[CHORUS] = 0; lpAWEManager(hAWEHandle, AWE_GET_EFX, (LPARAM)(LPSTR)¶m, (LPARAM)0L); m_CurEfxType = (enum TYPEINDEX)param.m_TypeIndex; if ( m_CurEfxType == REVERB_CHORUS ) { // Correct ! m_CurTypeVari[REVERB] = (enum VARIINDEX)param.m_VariIndex[REVERB]; m_CurTypeVari[CHORUS] = (enum VARIINDEX)param.m_VariIndex[CHORUS]; // Now issue selection on REVERB switch ( wParam ) { case ID_SETTINGS_REVERB_ROOM1 : param.m_VariIndex[REVERB] = (enum VARIINDEX)ROOM_1; break; case ID_SETTINGS_REVERB_ROOM2 : param.m_VariIndex[REVERB] = (enum VARIINDEX)ROOM_2; break; case ID_SETTINGS_REVERB_ROOM3 : param.m_VariIndex[REVERB] = (enum VARIINDEX)ROOM_3; break; case ID_SETTINGS_REVERB_HALL1 : param.m_VariIndex[REVERB] = (enum VARIINDEX)HALL_1; break; case ID_SETTINGS_REVERB_HALL2 : param.m_VariIndex[REVERB] = (enum VARIINDEX)HALL_2; break; case ID_SETTINGS_REVERB_PLATE : param.m_VariIndex[REVERB] = (enum VARIINDEX)PLATE; break; case ID_SETTINGS_REVERB_DELAY : param.m_VariIndex[REVERB] = (enum VARIINDEX)DELAY; break; case ID_SETTINGS_REVERB_PANNINGDELAY : param.m_VariIndex[REVERB] = (enum VARIINDEX)PANNING_DELAY; break; } if ( lpAWEManager(hAWEHandle, AWE_SELECT_EFX, (LPARAM)(LPSTR)¶m, (LPARAM)0L) != AWE_NO_ERR ) { MessageBox(NULL, "Error in setting effect.\0", "Error\0", MB_OK|MB_ICONSTOP); } else { MessageBox(NULL, "Effect setting successful.\0", "OK !\0", MB_OK|MB_ICONINFORMATION); } } else { MessageBox(NULL, "Current effect type is not Reverb/Chorus.\0", "Error\0", MB_OK|MB_ICONSTOP); } } void SetChorus(WORD wParam) { CParamObject param; enum TYPEINDEX m_CurEfxType; enum VARIINDEX m_CurTypeVari[2]; param.m_VariIndex[REVERB] = param.m_VariIndex[CHORUS] = 0; lpAWEManager(hAWEHandle, AWE_GET_EFX, (LPARAM)(LPSTR)¶m, 0L); m_CurEfxType = (enum TYPEINDEX)param.m_TypeIndex; if ( m_CurEfxType == REVERB_CHORUS ) { // Correct ! m_CurTypeVari[REVERB] = (enum VARIINDEX)param.m_VariIndex[REVERB]; m_CurTypeVari[CHORUS] = (enum VARIINDEX)param.m_VariIndex[CHORUS]; // Now issue selection on CHORUS switch ( wParam ) { case ID_SETTINGS_CHORUS_CHORUS1 : param.m_VariIndex[CHORUS] = (enum VARIINDEX)CHORUS_1; break; case ID_SETTINGS_CHORUS_CHORUS2 : param.m_VariIndex[CHORUS] = (enum VARIINDEX)CHORUS_2; break; case ID_SETTINGS_CHORUS_CHORUS3 : param.m_VariIndex[CHORUS] = (enum VARIINDEX)CHORUS_3; break; case ID_SETTINGS_CHORUS_CHORUS4 : param.m_VariIndex[CHORUS] = (enum VARIINDEX)CHORUS_4; break; case ID_SETTINGS_CHORUS_FEEBACKCHORUS : param.m_VariIndex[CHORUS] = (enum VARIINDEX)FEEDBACK_DELAY; break; case ID_SETTINGS_CHORUS_FLANGER : param.m_VariIndex[CHORUS] = (enum VARIINDEX)FLANGER; break; case ID_SETTINGS_CHORUS_SHORTDELAY : param.m_VariIndex[CHORUS] = (enum VARIINDEX)SHORT_DELAY; break; case ID_SETTINGS_CHORUS_SHORTDELAYFB : param.m_VariIndex[CHORUS] = (enum VARIINDEX)SHORT_DELAY_FB; break; } if ( lpAWEManager(hAWEHandle, AWE_SELECT_EFX, (LPARAM)(LPSTR)¶m, 0L) != AWE_NO_ERR ) { MessageBox(NULL, "Error in setting effect.\0", "Error\0", MB_OK|MB_ICONSTOP); } else { MessageBox(NULL, "Effect setting successful.\0", "OK !\0", MB_OK|MB_ICONINFORMATION); } } else { MessageBox(NULL, "Current effect type is not Reverb/Chorus.\0", "Error\0", MB_OK|MB_ICONSTOP); } }