📄 ch15p2_i3dl2enveditor.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 + -