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

📄 ch15p2_i3dl2enveditor.cpp

📁 游戏音频程序设计-Beginning.Game.Audio.Programming
💻 CPP
字号:
// Ch15p2_I3DL2EnvEditor.cpp : Defines the entry point for the application.
//

#include <windows.h>
#include <commctrl.h>
#include <string>
#include <vector>
#include <sstream>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>

#include <vector>

#include "resource.h"
#include "AudioEngine/AudioEngine.h"

using namespace AudioEngine;
using namespace std;

CAudioManager g_AudioMgr;
CAudioManager *AudioEngine::GetAudioManager() { return(&g_AudioMgr); }

string g_Filename;
CSoundPtr g_Sound;
DSFXI3DL2Reverb g_ReverbValues;
bool g_Updating = false;

const float ROOMROLLOFFFACTOR_TRACKBAR_FACTOR = 2000.0f;
const float DECAYTIME_TRACKBAR_FACTOR = 1000.0f;
const float DECAYHFRATIO_TRACKBAR_FACTOR = 2000.0f;
const float REFLECTIONSDELAY_TRACKBAR_FACTOR = 10000.0f;
const float REVERBDELAY_TRACKBAR_FACTOR = 10000.0f;
const float DIFFUSION_TRACKBAR_FACTOR = 30.0f;
const float DENSITY_TRACKBAR_FACTOR = 30.0f;
const float HFREFERENCE_TRACKBAR_FACTOR = 1.0f;

void OnLoadSound(HWND hDlg, string filename)
{
  try {
    g_Sound = GetAudioManager()->LoadSound(filename);
  }
  catch(...) {
    MessageBox(hDlg, "Error loading sound!", "Ch15p2_I3DL2EnvEditor", MB_OK | MB_ICONSTOP);
  }
  g_Filename = filename;
}

void OnBrowse(HWND hDlg)
{
  char filename[MAX_PATH] = { 0 };
    
  OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL,
                       "Audio Files\0*.wav\0All Files\0*.*\0\0", NULL,
                       0, 1, filename, MAX_PATH, NULL, 0, NULL,
                       "Open WAV File",
                       OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
                       TEXT(".wav"), 0, NULL, NULL };

  // Display the OpenFileName dialog. Then, try to load the specified file
  if(GetOpenFileName(&ofn))
  {
    OnLoadSound(hDlg, filename);
  }
}

void OnPlay()
{
  CDirectMusicSegment *seg = dynamic_cast<CDirectMusicSegment *>(g_Sound.Get());
  if (NULL == seg) Throw("can't dynamic cast to segment!");

  GetAudioManager()->SetVolume(CVolume(0));


  CSoundInstance *inst = new CSoundInstance();
	CI3DL2Effect *i3dl2fx = new CI3DL2Effect;
	inst->AddEffect(i3dl2fx);
  memcpy(&i3dl2fx->m_Params, &g_ReverbValues, sizeof(DSFXI3DL2Reverb));
  seg->Play(inst, false);

  delete inst; // also deletes i3dl2fx
}

void RefreshSlider(HWND hDlg, UINT sliderresid, UINT lblresid, int min, int max, int value, string units)
{
  SendMessage(GetDlgItem(hDlg, sliderresid), TBM_SETRANGE, FALSE, MAKELONG(min, max));
  SendMessage(GetDlgItem(hDlg, sliderresid), TBM_SETPOS, TRUE, value);

  // update associated label text
  stringstream str;

  str << value << " " << units;
  SetWindowText(GetDlgItem(hDlg, lblresid), str.str().c_str());
}

void RefreshSlider(HWND hDlg, UINT sliderresid, UINT lblresid, float min, float max, float value, string units, float factor)
{
  SendMessage(GetDlgItem(hDlg, sliderresid), TBM_SETRANGE, FALSE, MAKELONG((int)(min*factor), (int)(max*factor)));
  SendMessage(GetDlgItem(hDlg, sliderresid), TBM_SETPOS, TRUE, (float)value*factor);

  // update associated label text
  stringstream str;

  str << value << " " << units;
  SetWindowText(GetDlgItem(hDlg, lblresid), str.str().c_str());
}

void RefreshGUI(HWND hDlg)
{
  SetWindowText(GetDlgItem( hDlg, IDC_FILENAME ), g_Filename.c_str());

  // set ranges and positions of sliders
  RefreshSlider(hDlg, IDC_ROOMATTENUATION, IDC_LBL_ROOMATTENUATION, 
    DSFX_I3DL2REVERB_ROOM_MIN, DSFX_I3DL2REVERB_ROOM_MAX, 
    g_ReverbValues.lRoom, string("mB"));
  
  RefreshSlider(hDlg, IDC_HIGHFREQATTENUATION, IDC_LBL_HIGHFREQATTENUATION,
    DSFX_I3DL2REVERB_ROOMHF_MIN, DSFX_I3DL2REVERB_ROOMHF_MAX, 
    g_ReverbValues.lRoomHF, string("mB"));
  
  RefreshSlider(hDlg, IDC_ROOMROLLOFFFACTOR, IDC_LBL_ROOMROLLOFFFACTOR,
    DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MIN, DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_MAX, 
    g_ReverbValues.flRoomRolloffFactor, string(""), ROOMROLLOFFFACTOR_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_DECAYTIME, IDC_LBL_DECAYTIME,
    DSFX_I3DL2REVERB_DECAYTIME_MIN, DSFX_I3DL2REVERB_DECAYTIME_MAX, 
    g_ReverbValues.flDecayTime, string("secs"), DECAYTIME_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_DECAYHFRATIO, IDC_LBL_DECAYHFRATIO,
    DSFX_I3DL2REVERB_DECAYHFRATIO_MIN, DSFX_I3DL2REVERB_DECAYHFRATIO_MAX, 
    g_ReverbValues.flDecayHFRatio, string(""), DECAYHFRATIO_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_EARLYREFL, IDC_LBL_EARLYREFL,
    DSFX_I3DL2REVERB_REFLECTIONS_MIN, DSFX_I3DL2REVERB_REFLECTIONS_MAX, 
    g_ReverbValues.lReflections, string("mB"));

  RefreshSlider(hDlg, IDC_REFLDELAY, IDC_LBL_REFLDELAY,
    DSFX_I3DL2REVERB_REFLECTIONSDELAY_MIN, DSFX_I3DL2REVERB_REFLECTIONSDELAY_MAX, 
    g_ReverbValues.flReflectionsDelay, string("secs"), REFLECTIONSDELAY_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_LATEREVERB, IDC_LBL_LATEREVERB,
    DSFX_I3DL2REVERB_REVERB_MIN, DSFX_I3DL2REVERB_REVERB_MAX, 
    g_ReverbValues.lReverb, string("mB"));

  RefreshSlider(hDlg, IDC_REVERBDELAY, IDC_LBL_REVERBDELAY,
    DSFX_I3DL2REVERB_REVERBDELAY_MIN, DSFX_I3DL2REVERB_REVERBDELAY_MAX, 
    g_ReverbValues.flReverbDelay, string("secs"), REVERBDELAY_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_DIFFUSION, IDC_LBL_DIFFUSION,
    DSFX_I3DL2REVERB_DIFFUSION_MIN, DSFX_I3DL2REVERB_DIFFUSION_MAX, 
    g_ReverbValues.flDiffusion, string("percent"), DIFFUSION_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_MODALDENSITY, IDC_LBL_MODALDENSITY,
    DSFX_I3DL2REVERB_DENSITY_MIN, DSFX_I3DL2REVERB_DENSITY_MAX, 
    g_ReverbValues.flDensity, string("percent"), DIFFUSION_TRACKBAR_FACTOR);

  RefreshSlider(hDlg, IDC_REFERENCEHF, IDC_LBL_REFERENCEHF,
    DSFX_I3DL2REVERB_HFREFERENCE_MIN, DSFX_I3DL2REVERB_HFREFERENCE_MAX, 
    g_ReverbValues.flHFReference, string("Hz"), HFREFERENCE_TRACKBAR_FACTOR);
}


void PutSliderValueIntoVariable(HWND hDlg, UINT resid, long &dest)
{
  dest = SendMessage(GetDlgItem(hDlg, resid), TBM_GETPOS, 0, 0);
}

void PutSliderValueIntoVariable(HWND hDlg, UINT resid, float &dest, float factor)
{
  dest = SendMessage(GetDlgItem(hDlg, resid), TBM_GETPOS, 0, 0);
  dest /= factor;
}

void GetValuesFromGUI(HWND hDlg)
{
  PutSliderValueIntoVariable(hDlg, IDC_ROOMATTENUATION, g_ReverbValues.lRoom);
  PutSliderValueIntoVariable(hDlg, IDC_HIGHFREQATTENUATION, g_ReverbValues.lRoomHF);
  PutSliderValueIntoVariable(hDlg, IDC_ROOMROLLOFFFACTOR, g_ReverbValues.flRoomRolloffFactor, ROOMROLLOFFFACTOR_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_DECAYTIME, g_ReverbValues.flDecayTime, DECAYTIME_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_DECAYHFRATIO, g_ReverbValues.flDecayHFRatio, DECAYHFRATIO_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_EARLYREFL, g_ReverbValues.lReflections);
  PutSliderValueIntoVariable(hDlg, IDC_REFLDELAY, g_ReverbValues.flReflectionsDelay, REFLECTIONSDELAY_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_LATEREVERB, g_ReverbValues.lReverb);
  PutSliderValueIntoVariable(hDlg, IDC_REVERBDELAY, g_ReverbValues.flReverbDelay, REVERBDELAY_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_DIFFUSION, g_ReverbValues.flDiffusion, DIFFUSION_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_MODALDENSITY, g_ReverbValues.flDensity, DENSITY_TRACKBAR_FACTOR);
  PutSliderValueIntoVariable(hDlg, IDC_REFERENCEHF, g_ReverbValues.flHFReference, HFREFERENCE_TRACKBAR_FACTOR);
}

void OnLoad(HWND hDlg)
{
  char filename[MAX_PATH] = { 0 };
    
  OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL,
                       "Reverb Files\0*.reverb\0All Files\0*.*\0\0", NULL,
                       0, 1, filename, MAX_PATH, NULL, 0, NULL,
                       "Open Reverb File",
                       OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
                       TEXT(".reverb"), 0, NULL, NULL };

  // Display the OpenFileName dialog. Then, try to load the specified file
  if(GetOpenFileName(&ofn))
  {
    int handle = open(filename, O_RDONLY | O_BINARY);
    if (handle == -1) Throw("Can't open file!");
    read(handle, &g_ReverbValues, sizeof(DSFXI3DL2Reverb));
    close(handle);
    RefreshGUI(hDlg);
  }
}

void OnSave(HWND hDlg)
{
  char filename[MAX_PATH] = { 0 };
    
  OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL,
                       "Reverb Files\0*.reverb\0All Files\0*.*\0\0", NULL,
                       0, 1, filename, MAX_PATH, NULL, 0, NULL,
                       "Save Reverb File",
                       OFN_HIDEREADONLY, 0, 0,
                       TEXT(".reverb"), 0, NULL, NULL };

  // Display the OpenFileName dialog. Then, try to load the specified file
  if(GetOpenFileName(&ofn))
  {
    int handle = open(filename, O_RDWR | O_BINARY | O_CREAT | O_TRUNC);
    if (handle == -1) Throw("Can't save file!");
    write(handle, &g_ReverbValues, sizeof(DSFXI3DL2Reverb));
    close(handle);
  }
}

INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
  try {
    switch( msg ) 
    {
      case WM_INITDIALOG:
        // init audio engine
        g_AudioMgr.Init(hDlg);
  
        OnLoadSound(hDlg, "test.wav"); // by default, load test.wav

        // set up default reverb values
        g_ReverbValues.lRoom = DSFX_I3DL2REVERB_ROOM_DEFAULT;
        g_ReverbValues.lRoomHF = DSFX_I3DL2REVERB_ROOMHF_DEFAULT;
        g_ReverbValues.flRoomRolloffFactor = DSFX_I3DL2REVERB_ROOMROLLOFFFACTOR_DEFAULT;
        g_ReverbValues.flDecayTime = DSFX_I3DL2REVERB_DECAYTIME_DEFAULT;
        g_ReverbValues.flDecayHFRatio = DSFX_I3DL2REVERB_DECAYHFRATIO_DEFAULT;
        g_ReverbValues.lReflections = DSFX_I3DL2REVERB_REFLECTIONS_DEFAULT;
        g_ReverbValues.flReflectionsDelay = DSFX_I3DL2REVERB_REFLECTIONSDELAY_DEFAULT;
        g_ReverbValues.lReverb = DSFX_I3DL2REVERB_REVERB_DEFAULT;
        g_ReverbValues.flReverbDelay = DSFX_I3DL2REVERB_REVERBDELAY_DEFAULT;
        g_ReverbValues.flDiffusion = DSFX_I3DL2REVERB_DIFFUSION_DEFAULT;
        g_ReverbValues.flDensity = DSFX_I3DL2REVERB_DENSITY_DEFAULT; 
        g_ReverbValues.flHFReference = DSFX_I3DL2REVERB_HFREFERENCE_DEFAULT;

        RefreshGUI(hDlg);
        GetValuesFromGUI(hDlg);
        RefreshGUI(hDlg); // to eliminate rounding errors
        break;

      case WM_HSCROLL:
        // a trackbar has changed position.
        GetValuesFromGUI(hDlg);
        RefreshGUI(hDlg);
        break;

      case WM_COMMAND:
        switch(HIWORD(wParam)) {
          case CBN_SELCHANGE:
          break;

          case BN_CLICKED:
          {
            // a button was clicked... which one?
            switch(LOWORD(wParam)) {
             
              case IDC_BROWSE:
                OnBrowse(hDlg);
                RefreshGUI(hDlg);
                break;

              case IDC_SAVE:
                OnSave(hDlg);
                break;

              case IDC_LOAD:
                OnLoad(hDlg);
                break;

              case IDC_PLAYSOUND:
                OnPlay();
                break;

            } // switch LOWORD(wParam)
          }
          break;

        } // notification code
        break;

      case WM_CLOSE:
        DestroyWindow(hDlg);
        PostQuitMessage(0);
        break; 

      default:
        return FALSE; // Didn't handle message
    }
  } 
  catch(char *err) {
    MessageBox(hDlg, err, "Ch15p2_I3DL2EnvEditor Error", MB_OK);
    return(FALSE);

  }
  return TRUE; // Handled message
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	HWND    hDlg = NULL;
  MSG     msg;


  // we need to init common controls for our trackbars
  InitCommonControls();

  
  // Display the main editor dialog
  hDlg = CreateDialog( hInstance, MAKEINTRESOURCE(IDD_EDITOR), 
                       NULL, MainDlgProc );
  
  ShowWindow(hDlg, SW_SHOW);

  
  while(1) 
  { 
    // Windows messages are available
    if(GetMessage(&msg, NULL, 0, 0)) 
    { 
      if(!IsDialogMessage(hDlg, &msg))  
      {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
      }
    }
    else {
      DestroyWindow(hDlg);
      g_AudioMgr.UnInit();
      return(msg.wParam);
    }
  }
	return 0;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -