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

📄 soundfx.cpp

📁 <VC视频音频开发>本程序在Windows 2000、Visual C++ 6.0、DirectX 9.0 环境下编译通过。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#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 + -