📄 soundfx.cpp
字号:
#define STRICT
#include <windows.h>
#include "basetsd.h"
#include <mmsystem.h>
#include <mmreg.h>
#include <dxerr9.h>
#include <dsound.h>
#include <cguid.h>
#include <commctrl.h>
#include <commdlg.h>
#include <stdio.h>
#include "DSUtil.h"
#include "resource.h"
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam );
VOID OnInitDialog( HWND hDlg );
VOID OnTimer( HWND hDlg );
VOID OnOpenSoundFile( HWND hDlg );
HRESULT OnPlaySound( HWND hDlg );
VOID OnEffectChanged( HWND hDlg );
HRESULT ValidateWaveFile( HWND hDlg, TCHAR* strFileName );
HRESULT CreateAndFillBuffer( HWND hDlg, DWORD dwCreationFlags );
VOID SetBufferOptions( LONG lFrequency, LONG lPakn, LONG lVolume );
VOID EnablePlayUI( HWND hDlg, BOOL bEnable );
VOID LoadParameterUI ( HWND hDlg, DWORD dwFXType );
VOID ResetParameterUI ( HWND hDlg );
enum ESFXType
{
eSFX_chorus = 0,
eSFX_compressor,
eSFX_distortion,
eSFX_echo,
eSFX_flanger,
eSFX_gargle,
eSFX_parameq,
eSFX_reverb,
eNUM_SFX
};
class CSoundFXManager
{
public:
CSoundFXManager( );
~CSoundFXManager( );
public:
HRESULT Initialize ( LPDIRECTSOUNDBUFFER lpDSB, BOOL bLoadDefaultParamValues );
HRESULT UnInitialize ( );
HRESULT SetFXEnable( DWORD esfxType );
HRESULT ActivateFX( );
HRESULT DisableAllFX( );
HRESULT LoadCurrentFXParameters( );
public:
LPDIRECTSOUNDFXCHORUS8 m_lpChorus;
LPDIRECTSOUNDFXCOMPRESSOR8 m_lpCompressor;
LPDIRECTSOUNDFXDISTORTION8 m_lpDistortion;
LPDIRECTSOUNDFXECHO8 m_lpEcho;
LPDIRECTSOUNDFXFLANGER8 m_lpFlanger;
LPDIRECTSOUNDFXGARGLE8 m_lpGargle;
LPDIRECTSOUNDFXPARAMEQ8 m_lpParamEq;
LPDIRECTSOUNDFXWAVESREVERB8 m_lpReverb;
DSFXChorus m_paramsChorus;
DSFXCompressor m_paramsCompressor;
DSFXDistortion m_paramsDistortion;
DSFXEcho m_paramsEcho;
DSFXFlanger m_paramsFlanger;
DSFXGargle m_paramsGargle;
DSFXParamEq m_paramsParamEq;
DSFXWavesReverb m_paramsReverb;
LPDIRECTSOUNDBUFFER8 m_lpDSB8;
protected:
DSEFFECTDESC m_rgFxDesc[eNUM_SFX];
const GUID * m_rgRefGuids[eNUM_SFX];
LPVOID * m_rgPtrs[eNUM_SFX];
BOOL m_rgLoaded[eNUM_SFX];
DWORD m_dwNumFX;
HRESULT EnableGenericFX( GUID guidSFXClass, REFGUID rguidInterface, LPVOID * ppObj );
HRESULT LoadDefaultParamValues( );
};
#define DEFAULT_SLIDER_MIN 1
#define DEFAULT_SLIDER_MAX 0x7FFFFF
#define DEFAULT_SLIDER_INC DEFAULT_SLIDER_MAX >> 11
CSoundManager * g_lpSoundManager = NULL;
CSound * g_lpSound = NULL;
CSoundFXManager * g_lpFXManager = NULL;
HINSTANCE g_hInst = NULL;
TCHAR g_tszFilename[MAX_PATH];
DWORD g_dwCurrentFXType = eSFX_chorus;
const TCHAR * g_tszFXNames[] = { "Chorus", "Compressor", "Distortion", "Echo",
"Flanger", "Gargle", "Param Eq", "Reverb" };
INT APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, INT nCmdShow )
{
g_hInst = hInst;
CoInitialize( NULL );
InitCommonControls();
DialogBox( hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc );
CoUninitialize();
return TRUE;
}
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
HRESULT hr;
switch( msg )
{
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDOK:
case IDCANCEL:
EndDialog( hDlg, IDOK );
break;
case IDC_BUTTON_OPEN:
OnOpenSoundFile( hDlg );
break;
case IDC_BUTTON_PLAY:
if( FAILED( hr = OnPlaySound( hDlg ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("OnPlaySound"), hr );
MessageBox( hDlg, "Error playing DirectSound buffer."
"Sample will now exit.", "DirectSound Sample",
MB_OK | MB_ICONERROR );
EndDialog( hDlg, IDABORT );
}
break;
case IDC_BUTTON_STOP:
if( g_lpSound )
{
g_lpSound->Stop();
g_lpSound->Reset();
}
g_lpFXManager->DisableAllFX( );
EnablePlayUI( hDlg, TRUE );
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound stopped.") );
break;
case IDC_RADIO_TRIANGLE:
case IDC_RADIO_SQUARE:
case IDC_RADIO_SINE:
case IDC_RADIO_NEG_180:
case IDC_RADIO_NEG_90:
case IDC_RADIO_ZERO:
case IDC_RADIO_90:
case IDC_RADIO_180:
OnEffectChanged( hDlg );
break;
default:
if( LOWORD( wParam ) >= IDC_RADIO_CHORUS &&
LOWORD( wParam ) <= IDC_RADIO_REVERB )
{
g_dwCurrentFXType = LOWORD( wParam ) - IDC_RADIO_CHORUS;
LoadParameterUI( hDlg, g_dwCurrentFXType );
}
else
return FALSE;
}
break;
case WM_TIMER:
OnTimer( hDlg );
break;
case WM_INITDIALOG:
OnInitDialog( hDlg );
break;
case WM_NOTIFY:
{
OnEffectChanged( hDlg );
break;
}
case WM_DESTROY:
KillTimer( hDlg, 1 );
SAFE_DELETE( g_lpFXManager );
SAFE_DELETE( g_lpSound );
SAFE_DELETE( g_lpSoundManager );
break;
default:
return FALSE;
}
return TRUE;
}
VOID OnInitDialog( HWND hDlg )
{
HRESULT hr;
HICON hIcon = LoadIcon( g_hInst, MAKEINTRESOURCE( IDI_ICON ) );
PostMessage( hDlg, WM_SETICON, ICON_BIG, ( LPARAM ) hIcon );
PostMessage( hDlg, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon );
g_lpSoundManager = new CSoundManager();
g_lpFXManager = new CSoundFXManager();
if( NULL == g_lpSoundManager ||
NULL == g_lpFXManager )
{
DXTRACE_ERR_MSGBOX( TEXT("Initialize"), E_OUTOFMEMORY );
EndDialog( hDlg, IDABORT );
return;
}
if( FAILED( hr = g_lpSoundManager->Initialize( hDlg, DSSCL_PRIORITY ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("Initialize"), hr );
MessageBox( hDlg, "Error initializing DirectSound. Sample will now exit.",
"DirectSound Sample", MB_OK | MB_ICONERROR );
EndDialog( hDlg, IDABORT );
return;
}
if( FAILED( hr = g_lpSoundManager->SetPrimaryBufferFormat( 2, 22050, 16 ) ) )
{
DXTRACE_ERR_MSGBOX( TEXT("SetPrimaryBufferFormat"), hr );
MessageBox( hDlg, "Error initializing DirectSound. Sample will now exit.",
"DirectSound Sample", MB_OK | MB_ICONERROR );
EndDialog( hDlg, IDABORT );
return;
}
SetTimer( hDlg, 0, 250, NULL );
TCHAR strFile[MAX_PATH];
if( GetWindowsDirectory( strFile, MAX_PATH ) == 0 )
return;
lstrcat( strFile, "\\media\\ding.wav" );
if( FAILED( hr = ValidateWaveFile( hDlg, strFile ) ) )
{
SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("No file loaded.") );
EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
return;
}
if( SUCCEEDED( hr = g_lpSoundManager->Create( &g_lpSound, g_tszFilename,
DSBCAPS_CTRLFX, GUID_NULL ) ) )
{
g_lpFXManager->Initialize( g_lpSound->GetBuffer( 0 ), TRUE );
g_lpFXManager->UnInitialize( );
SAFE_DELETE( g_lpSound );
}
CheckDlgButton( hDlg, IDC_CHECK_LOOP, BST_CHECKED );
CheckRadioButton( hDlg, IDC_RADIO_CHORUS, IDC_RADIO_REVERB, IDC_RADIO_CHORUS );
LoadParameterUI( hDlg, g_dwCurrentFXType );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -