📄 ch15p1_i3dl2reverb.cpp
字号:
// Ch15p1_I3DL2Reverb.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <sstream>
#include <string>
#include <math.h>
#include <conio.h>
#include <windows.h>
#include <mmreg.h>
#include "dsound.h"
#include "dxerr8.h"
#include "AudioEngine/dxutil.h"
#include "AudioEngine/AudioEngine.h"
#include "AudioEngine/SoundInstance.h"
using namespace std;
using namespace AudioEngine;
CAudioManager g_AudioMgr;
CAudioManager *AudioEngine::GetAudioManager() { return(&g_AudioMgr); }
void Exit(int errorcode)
{
#ifdef _DEBUG
cout << endl << endl << "(Program ended, press a key to exit.)";
// so that the console window doesn't disappear before we have
// a chance to look at it.
getch();
#endif
exit(errorcode);
}
HWND GetConsoleWindowHandle()
{
char title[512];
HWND hWnd;
GetConsoleTitle(title, sizeof(title));
hWnd = FindWindow(NULL, title);
return(hWnd);
}
int main(int argc, char* argv[])
{
try {
// initialize audio manager
cout << "Initializing Audio Manager..." << endl;
g_AudioMgr.Init(GetConsoleWindowHandle());
// load a WAV file
cout << "Loading WAV File..." << endl;
CSoundPtr snd = g_AudioMgr.LoadSound("test.wav");
// full volume on performance
GetAudioManager()->SetVolume(CVolume(0));
bool done=false;
CDirectMusicSegment *seg = dynamic_cast<CDirectMusicSegment *>(snd.Get());
if (NULL == seg) Throw("can't dynamic cast to segment!");
while (!done) {
CSoundInstance *inst = new CSoundInstance();
CI3DL2Effect *i3dl2fx = new CI3DL2Effect;
inst->AddEffect(i3dl2fx);
cout << endl;
cout << "Your wish is my command: " << endl;
cout << "1) Play sound with no environment" << endl;
cout << "2) Select preset environment" << endl;
cout << "3) Play with custom environment" << endl;
cout << "x) Exit!" << endl;
char choice = getch();
switch(choice) {
case '1': // play sound
cout << "Playing sound..." << endl;
seg->Play(inst, false);
// play sound
Sleep(500);
while (inst->IsPlaying()) Sleep(500);
break;
case '2': // select preset environment
{
cout << "Select preset:" << endl;
cout << "1) default" << endl;
cout << "2) generic" << endl;
cout << "3) padded cell" << endl;
cout << "4) room" << endl;
cout << "5) bathroom" << endl;
cout << "6) living room" << endl;
cout << "7) stone room" << endl;
cout << "8) auditorium" << endl;
cout << "9) concert hall" << endl;
cout << "10) cave" << endl;
cout << "11) arena" << endl;
cout << "12) hangar" << endl;
cout << "13) carpeted hallway" << endl;
cout << "14) hallway" << endl;
cout << "15) stone corridor" << endl;
cout << "16) alley" << endl;
cout << "17) forest" << endl;
cout << "18) city" << endl;
cout << "19) mountains" << endl;
cout << "20) quarry" << endl;
cout << "21) plain" << endl;
cout << "22) parking lot" << endl;
cout << "23) sewer pipe" << endl;
cout << "24) underwater" << endl;
cout << "25) small room" << endl;
cout << "26) medium room" << endl;
cout << "27) large room" << endl;
cout << "28) medium hall" << endl;
cout << "29) large hall" << endl;
cout << "30) plate" << endl;
int envchoice; cin >> envchoice;
switch(envchoice) {
case 1: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_DEFAULT); seg->Play(inst, false); break;
case 2: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_GENERIC); seg->Play(inst, false); break;
case 3: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL); seg->Play(inst, false); break;
case 4: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_ROOM); seg->Play(inst, false); break;
case 5: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_BATHROOM); seg->Play(inst, false); break;
case 6: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM); seg->Play(inst, false); break;
case 7: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_STONEROOM); seg->Play(inst, false); break;
case 8: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM); seg->Play(inst, false); break;
case 9: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL); seg->Play(inst, false); break;
case 10: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_CAVE); seg->Play(inst, false); break;
case 11: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_ARENA); seg->Play(inst, false); break;
case 12: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_HANGAR); seg->Play(inst, false); break;
case 13: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY); seg->Play(inst, false); break;
case 14: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_HALLWAY); seg->Play(inst, false); break;
case 15: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR); seg->Play(inst, false); break;
case 16: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_ALLEY); seg->Play(inst, false); break;
case 17: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_FOREST); seg->Play(inst, false); break;
case 18: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_CITY); seg->Play(inst, false); break;
case 19: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS); seg->Play(inst, false); break;
case 20: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_QUARRY); seg->Play(inst, false); break;
case 21: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_PLAIN); seg->Play(inst, false); break;
case 22: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT); seg->Play(inst, false); break;
case 23: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE); seg->Play(inst, false); break;
case 24: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_UNDERWATER); seg->Play(inst, false); break;
case 25: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_SMALLROOM); seg->Play(inst, false); break;
case 26: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM); seg->Play(inst, false); break;
case 27: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEROOM); seg->Play(inst, false); break;
case 28: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL); seg->Play(inst, false); break;
case 29: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_LARGEHALL); seg->Play(inst, false); break;
case 30: i3dl2fx->SetPreset(DSFX_I3DL2_ENVIRONMENT_PRESET_PLATE); seg->Play(inst, false); break;
}
}
break;
case '3': // custom environment - big ol' room
{
i3dl2fx->m_Params.lRoom = DSFX_I3DL2REVERB_ROOM_MAX;
i3dl2fx->m_Params.lRoomHF = DSFX_I3DL2REVERB_ROOMHF_MAX;
i3dl2fx->m_Params.flRoomRolloffFactor = DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MIN;
i3dl2fx->m_Params.flDecayTime = DSFX_I3DL2REVERB_DECAYTIME_DEFAULT;
i3dl2fx->m_Params.flDecayHFRatio = DSFX_I3DL2REVERB_DECAYHFRATIO_DEFAULT;
i3dl2fx->m_Params.lReflections = DSFX_I3DL2REVERB_REFLECTIONS_DEFAULT;
i3dl2fx->m_Params.flReflectionsDelay = DSFX_I3DL2REVERB_REFLECTIONSDELAY_DEFAULT;
i3dl2fx->m_Params.lReverb = DSFX_I3DL2REVERB_REVERB_MAX;
i3dl2fx->m_Params.flReverbDelay = DSFX_I3DL2REVERB_REVERBDELAY_DEFAULT;
i3dl2fx->m_Params.flDiffusion = DSFX_I3DL2REVERB_DIFFUSION_MIN;
i3dl2fx->m_Params.flDensity = DSFX_I3DL2REVERB_DENSITY_DEFAULT;
i3dl2fx->m_Params.flHFReference = DSFX_I3DL2REVERB_HFREFERENCE_DEFAULT;
seg->Play(inst, false);
}
break;
case 'x': // exit
done=true;
break;
}
if (kbhit()) getch();
delete inst;
}
// uninit audio manager
cout << endl << "UnIniting audio manager..." << endl;
g_AudioMgr.UnInit();
}
catch(CError &e) {
MessageBox(GetConsoleWindowHandle(), e.GetMessageBoxString().c_str(), "Ch15p1_I3DL2Reverb", MB_ICONSTOP);
Exit(-1);
}
catch(...) {
MessageBox(GetConsoleWindowHandle(), "This sample program has encountered an error and must close.", "Ch15p1_I3DL2Reverb", MB_ICONSTOP);
Exit(-1);
}
Exit(0);
return(0); // to avoid warning C4508
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -