⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch15p1_i3dl2reverb.cpp

📁 游戏音频程序设计-Beginning.Game.Audio.Programming
💻 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 + -