home *** CD-ROM | disk | FTP | other *** search
/ Windows Game Programming for Dummies (2nd Edition) / WinGamProgFD.iso / pc / DirectX SDK / DXSDK / samples / Multimedia / DirectSound / SoundFX / soundfx.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-10-31  |  55.7 KB  |  1,395 lines

  1. //-----------------------------------------------------------------------------
  2. // File: SoundFX.cpp
  3. //
  4. // Desc: Sample to demonstrate soundFX and parameters in directX
  5. //
  6. //
  7. // Copyright ( c ) 1998-2001 Microsoft Corporation. All rights reserved.
  8. //-----------------------------------------------------------------------------
  9. #define STRICT
  10. #include <windows.h>
  11. #include <basetsd.h>
  12. #include <mmsystem.h>
  13. #include <mmreg.h>
  14. #include <dxerr8.h>
  15. #include <dsound.h>
  16. #include <cguid.h>
  17. #include <commctrl.h>
  18. #include <commdlg.h>
  19. #include <dsound.h>
  20. #include <stdio.h>
  21.  
  22. #include "DSUtil.h"
  23. #include "DXUtil.h"
  24. #include "resource.h"
  25.  
  26.  
  27.  
  28.  
  29.  
  30. //-----------------------------------------------------------------------------
  31. // Function-prototypes
  32. //-----------------------------------------------------------------------------
  33. INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg,  WPARAM wParam, LPARAM lParam );
  34. VOID    OnInitDialog( HWND hDlg );
  35. VOID    OnTimer( HWND hDlg );
  36. VOID    OnOpenSoundFile( HWND hDlg );
  37. HRESULT OnPlaySound( HWND hDlg );
  38. VOID    OnEffectChanged( HWND hDlg );
  39. HRESULT ValidateWaveFile( HWND hDlg, TCHAR* strFileName );
  40. HRESULT CreateAndFillBuffer( HWND hDlg, DWORD dwCreationFlags );
  41. VOID    SetBufferOptions( LONG lFrequency, LONG lPakn, LONG lVolume );
  42. VOID    EnablePlayUI( HWND hDlg, BOOL bEnable );
  43.  
  44. VOID    LoadParameterUI ( HWND hDlg, DWORD dwFXType );
  45. VOID    ResetParameterUI ( HWND hDlg );
  46.  
  47.  
  48.  
  49.  
  50. //-----------------------------------------------------------------------------
  51. // Name: enum ESFXType
  52. // Desc: each is a unique identifier mapped to a DirectSoundFX
  53. //-----------------------------------------------------------------------------
  54. enum ESFXType
  55. {
  56.     eSFX_chorus = 0,
  57.     eSFX_compressor,
  58.     eSFX_distortion,
  59.     eSFX_echo,
  60.     eSFX_flanger,
  61.     eSFX_gargle,
  62.     eSFX_parameq,
  63.     eSFX_reverb,
  64.  
  65.     // number of enumerated effects
  66.     eNUM_SFX
  67. };
  68.  
  69.  
  70.  
  71.  
  72. //-----------------------------------------------------------------------------
  73. // Name: class CSoundFXManager
  74. // Desc: Takes care of effects for one DirectSoundBuffer
  75. //-----------------------------------------------------------------------------
  76. class CSoundFXManager
  77. {
  78. public:
  79.     CSoundFXManager( );
  80.     ~CSoundFXManager( );
  81.  
  82. public: // interface
  83.     HRESULT Initialize ( LPDIRECTSOUNDBUFFER lpDSB, BOOL bLoadDefaultParamValues );
  84.     HRESULT UnInitialize ( );
  85.  
  86.     HRESULT SetFXEnable( DWORD esfxType );
  87.     HRESULT ActivateFX( );
  88.     HRESULT DisableAllFX( );
  89.     HRESULT LoadCurrentFXParameters( );
  90.  
  91. public: // members
  92.     LPDIRECTSOUNDFXCHORUS8      m_lpChorus;
  93.     LPDIRECTSOUNDFXCOMPRESSOR8  m_lpCompressor;
  94.     LPDIRECTSOUNDFXDISTORTION8  m_lpDistortion;
  95.     LPDIRECTSOUNDFXECHO8        m_lpEcho;
  96.     LPDIRECTSOUNDFXFLANGER8     m_lpFlanger;
  97.     LPDIRECTSOUNDFXGARGLE8      m_lpGargle;
  98.     LPDIRECTSOUNDFXPARAMEQ8     m_lpParamEq;
  99.     LPDIRECTSOUNDFXWAVESREVERB8 m_lpReverb;
  100.  
  101.     DSFXChorus                  m_paramsChorus;
  102.     DSFXCompressor              m_paramsCompressor;
  103.     DSFXDistortion              m_paramsDistortion;
  104.     DSFXEcho                    m_paramsEcho;
  105.     DSFXFlanger                 m_paramsFlanger;
  106.     DSFXGargle                  m_paramsGargle;
  107.     DSFXParamEq                 m_paramsParamEq;
  108.     DSFXWavesReverb             m_paramsReverb;
  109.  
  110.     LPDIRECTSOUNDBUFFER8        m_lpDSB8;
  111.  
  112. protected:
  113.     DSEFFECTDESC                m_rgFxDesc[eNUM_SFX];
  114.     const GUID *                m_rgRefGuids[eNUM_SFX];
  115.     LPVOID *                    m_rgPtrs[eNUM_SFX];
  116.     BOOL                        m_rgLoaded[eNUM_SFX];
  117.     DWORD                       m_dwNumFX;
  118.  
  119.     HRESULT EnableGenericFX( GUID guidSFXClass, REFGUID rguidInterface, LPVOID * ppObj );
  120.     HRESULT LoadDefaultParamValues( );
  121. };
  122.  
  123.  
  124.  
  125.  
  126. //-----------------------------------------------------------------------------
  127. // defines and global variables
  128. //-----------------------------------------------------------------------------
  129. #define             DEFAULT_SLIDER_MIN          1
  130. #define             DEFAULT_SLIDER_MAX          0x7FFFFF
  131. #define             DEFAULT_SLIDER_INC          DEFAULT_SLIDER_MAX >> 11
  132.  
  133. CSoundManager *     g_lpSoundManager = NULL;
  134. CSound *            g_lpSound = NULL;
  135. CSoundFXManager *   g_lpFXManager = NULL;
  136. HINSTANCE           g_hInst = NULL;
  137. TCHAR               g_tszFilename[MAX_PATH];
  138. DWORD               g_dwCurrentFXType           = eSFX_chorus;
  139.  
  140. const TCHAR *       g_tszFXNames[] = { "Chorus", "Compressor", "Distortion", "Echo", 
  141.                                        "Flanger", "Gargle", "Param Eq", "Reverb" };
  142.  
  143.  
  144.  
  145.  
  146. //-----------------------------------------------------------------------------
  147. // Name: WinMain()
  148. // Desc: Entry point for the application.  Since we use a simple dialog for 
  149. //       user interaction we don't need to pump messages.
  150. //-----------------------------------------------------------------------------
  151. INT APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, INT nCmdShow )
  152. {
  153.     g_hInst = hInst;
  154.  
  155.     CoInitialize( NULL );
  156.  
  157.     // Init the common control dll 
  158.     InitCommonControls();
  159.  
  160.     // Display the main dialog box.
  161.     DialogBox( hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc );
  162.  
  163.     CoUninitialize();
  164.  
  165.     return TRUE;
  166. }
  167.  
  168.  
  169.  
  170.  
  171. //-----------------------------------------------------------------------------
  172. // Name: MainDlgProc()
  173. // Desc: Handles dialog messages
  174. //-----------------------------------------------------------------------------
  175. INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
  176. {
  177.     HRESULT hr;
  178.  
  179.     switch( msg ) 
  180.     {
  181.         case WM_COMMAND:
  182.             switch( LOWORD(wParam) )
  183.             {
  184.                 case IDOK:
  185.                 case IDCANCEL:
  186.                     EndDialog( hDlg, IDOK );
  187.                     break;
  188.  
  189.                 case IDC_BUTTON_OPEN:
  190.                     OnOpenSoundFile( hDlg );
  191.                     break;
  192.  
  193.                 case IDC_BUTTON_PLAY:
  194.                     if( FAILED( hr = OnPlaySound( hDlg ) ) )
  195.                     {
  196.                         DXTRACE_ERR( TEXT("OnPlaySound"), hr );
  197.                         MessageBox( hDlg, "Error playing DirectSound buffer."
  198.                                     "Sample will now exit.", "DirectSound Sample", 
  199.                                     MB_OK | MB_ICONERROR );
  200.                         EndDialog( hDlg, IDABORT );
  201.                     }
  202.                     break;
  203.  
  204.                 case IDC_BUTTON_STOP:
  205.                     if( g_lpSound )
  206.                     {
  207.                         g_lpSound->Stop();
  208.                         g_lpSound->Reset();
  209.                     }
  210.                     g_lpFXManager->DisableAllFX( );
  211.                     EnablePlayUI( hDlg, TRUE );
  212.                     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound stopped.") );
  213.                     break;
  214.  
  215.                 case IDC_RADIO_TRIANGLE:
  216.                 case IDC_RADIO_SQUARE:
  217.                 case IDC_RADIO_SINE:
  218.                 case IDC_RADIO_NEG_180:
  219.                 case IDC_RADIO_NEG_90:
  220.                 case IDC_RADIO_ZERO:
  221.                 case IDC_RADIO_90:
  222.                 case IDC_RADIO_180:
  223.                     OnEffectChanged( hDlg );
  224.                     break;
  225.  
  226.                 default:
  227.                     if( LOWORD( wParam ) >= IDC_RADIO_CHORUS &&
  228.                         LOWORD( wParam ) <= IDC_RADIO_REVERB )
  229.                     {
  230.                         g_dwCurrentFXType = LOWORD( wParam ) - IDC_RADIO_CHORUS;
  231.                         LoadParameterUI( hDlg, g_dwCurrentFXType );
  232.                     }
  233.                     else
  234.                         return FALSE; // Didn't handle message
  235.             }
  236.             break;
  237.  
  238.         case WM_TIMER:
  239.             OnTimer( hDlg );
  240.             break;
  241.  
  242.         case WM_INITDIALOG:
  243.             OnInitDialog( hDlg );
  244.             break;
  245.  
  246.         case WM_NOTIFY:
  247.         {
  248.             //LPNMHDR pnmh = ( LPNMHDR ) lParam;
  249.             //if( pnmh->code >= IDC_SLIDER1 && pnmh->code <= IDC_SLIDER6 )
  250.             //{
  251.                 OnEffectChanged( hDlg );
  252.             //}
  253.             break;
  254.         }
  255.         case WM_DESTROY:
  256.             // Cleanup everything
  257.             KillTimer( hDlg, 1 );
  258.             SAFE_DELETE( g_lpFXManager );
  259.             SAFE_DELETE( g_lpSound );
  260.             SAFE_DELETE( g_lpSoundManager );
  261.             break; 
  262.  
  263.         default:
  264.             return FALSE; // Didn't handle message
  265.     }
  266.  
  267.     return TRUE; // Handled message
  268. }
  269.  
  270.  
  271.  
  272.  
  273. //-----------------------------------------------------------------------------
  274. // Name: OnInitDialog()
  275. // Desc: Initializes the dialogs (sets up UI controls, etc.)
  276. //-----------------------------------------------------------------------------
  277. VOID OnInitDialog( HWND hDlg )
  278. {
  279.     HRESULT hr;
  280.  
  281.     // Load the icon - will be set during WM_INITDIALOG
  282.     HICON hIcon = LoadIcon( g_hInst, MAKEINTRESOURCE( IDI_ICON ) );
  283.     PostMessage( hDlg, WM_SETICON, ICON_BIG, ( LPARAM ) hIcon );
  284.     PostMessage( hDlg, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon );
  285.  
  286.     // Create a static IDirectSound in the CSound class.  
  287.     // Set coop level to DSSCL_PRIORITY, and set primary buffer 
  288.     // format to stereo, 22kHz and 16-bit output.
  289.     g_lpSoundManager = new CSoundManager();
  290.     g_lpFXManager = new CSoundFXManager();
  291.  
  292.     if( FAILED( hr = g_lpSoundManager->Initialize( hDlg, DSSCL_PRIORITY, 2, 22050, 16 ) ) )
  293.     {
  294.         DXTRACE_ERR( TEXT("Initialize"), hr );
  295.         MessageBox( hDlg, "Error initializing DirectSound.  Sample will now exit.", 
  296.                     "DirectSound Sample", MB_OK | MB_ICONERROR );
  297.         EndDialog( hDlg, IDABORT );
  298.         return;
  299.     }
  300.  
  301.     // Create a timer, so we can check for when the soundbuffer is stopped
  302.     SetTimer( hDlg, 0, 250, NULL );
  303.  
  304.     // Load default wave file
  305.     TCHAR strFile[MAX_PATH];
  306.     GetWindowsDirectory( strFile, MAX_PATH );
  307.     lstrcat( strFile, "\\media\\ding.wav" );
  308.     
  309.     if( FAILED( hr = ValidateWaveFile( hDlg, strFile ) ) )
  310.     {
  311.         // Set the UI controls
  312.         SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  313.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("No file loaded.") );
  314.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
  315.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  316.         return;
  317.     }
  318.  
  319.     if( SUCCEEDED( hr = g_lpSoundManager->Create( &g_lpSound, g_tszFilename, 
  320.                                                   DSBCAPS_CTRLFX, GUID_NULL ) ) )
  321.     {
  322.         g_lpFXManager->Initialize( g_lpSound->GetBuffer( 0 ), TRUE );
  323.  
  324.         // un-attach the sound buffer
  325.         g_lpFXManager->UnInitialize( );
  326.  
  327.         SAFE_DELETE( g_lpSound );
  328.     }
  329.  
  330.     // set UI defaults
  331.     CheckDlgButton( hDlg, IDC_CHECK_LOOP, BST_CHECKED );
  332.     CheckRadioButton( hDlg, IDC_RADIO_CHORUS, IDC_RADIO_REVERB, IDC_RADIO_CHORUS );
  333.     LoadParameterUI( hDlg, g_dwCurrentFXType );
  334.     EnablePlayUI( hDlg, TRUE );
  335. }
  336.  
  337.  
  338.  
  339.  
  340. //-----------------------------------------------------------------------------
  341. // Name: OnPlaySound()
  342. // Desc: User hit the "Play" button
  343. //-----------------------------------------------------------------------------
  344. HRESULT OnPlaySound( HWND hDlg )
  345. {
  346.     HRESULT hr;
  347.     DWORD   dwCreationFlags;
  348.     DWORD   dwLooped;
  349.     DWORD   i;
  350.  
  351.     LPDIRECTSOUNDBUFFER  pDSB = NULL;
  352.     LPDIRECTSOUNDBUFFER8 pDSB8 = NULL;
  353.  
  354.     BOOL bLooped        = ( IsDlgButtonChecked( hDlg, IDC_CHECK_LOOP ) == BST_CHECKED );
  355.  
  356.     // We would only use CTRLFX control on dsound buffer
  357.     dwCreationFlags = DSBCAPS_CTRLFX;
  358.  
  359.     // Free any previous sound and FXs
  360.     g_lpFXManager->DisableAllFX( );
  361.     SAFE_DELETE( g_lpSound );
  362.  
  363.     // Since the user can change the focus before the sound is played, 
  364.     // we need to create the sound buffer every time the play button is pressed 
  365.  
  366.     // Load the wave file into a DirectSound buffer
  367.     if( FAILED( hr = g_lpSoundManager->Create( &g_lpSound, g_tszFilename, 
  368.                                                dwCreationFlags, GUID_NULL ) ) )
  369.     {
  370.         // Not a critical failure, so just update the status
  371.         DXTRACE_ERR_NOMSGBOX( TEXT("Create"), hr );
  372.         
  373.         if( hr == DSERR_BUFFERTOOSMALL )
  374.         {
  375.             // DSERR_BUFFERTOOSMALL will be returned if the buffer is
  376.             // less than DSBSIZE_FX_MIN (150ms) and the buffer is created
  377.             // with DSBCAPS_CTRLFX.                           
  378.             SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Wave file is too short (less than 150ms) for effect processing.") );
  379.         }
  380.         else
  381.         {
  382.             SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Could not create sound buffer.") );
  383.         }
  384.         
  385.         return S_FALSE; 
  386.     }
  387.  
  388.     g_lpFXManager->Initialize( g_lpSound->GetBuffer( 0 ), FALSE );
  389.     for( i = IDC_CHECK_CHORUS; i <= IDC_CHECK_REVERB; i++ )
  390.     {
  391.         if( IsDlgButtonChecked( hDlg, i ) == BST_CHECKED )
  392.             g_lpFXManager->SetFXEnable( i - IDC_CHECK_CHORUS );
  393.     }
  394.  
  395.  
  396.     if( FAILED( hr = g_lpFXManager->ActivateFX( ) ) )
  397.         goto LFail;
  398.     if( FAILED( hr = g_lpFXManager->LoadCurrentFXParameters( ) ) )
  399.         goto LFail;
  400.  
  401.     // Call SetCurrentPosition() to pre-roll any effects parameter changes 
  402.     // that occurred since the last call to an API that does pre-rolling
  403.     // such as Stop(),Play(),Unlock(),or SetCurrentPosition().
  404.     g_lpSound->Reset();
  405.  
  406.    // Play the sound
  407.     dwLooped = bLooped ? DSBPLAY_LOOPING : 0L;
  408.     if( FAILED( hr = g_lpSound->Play( 0, dwLooped ) ) )
  409.         return DXTRACE_ERR( TEXT("Play"), hr );
  410.  
  411.     // Update the UI controls to show the sound as playing
  412.     EnablePlayUI( hDlg, FALSE );
  413.     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound playing.") );
  414.  
  415.     return S_OK;
  416.  
  417. LFail:
  418.     // Update the UI controls to show the sound effects could not be loaded
  419.     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Effects creation failed.  Some effect may not support 8-bit wave files.") );
  420.  
  421.     return S_OK;
  422. }
  423.  
  424.  
  425.  
  426.  
  427. //-----------------------------------------------------------------------------
  428. // Name: OnOpenSoundFile()
  429. // Desc: Called when the user requests to open a sound file
  430. //-----------------------------------------------------------------------------
  431. VOID OnOpenSoundFile( HWND hDlg ) 
  432. {
  433.     static TCHAR strFileName[MAX_PATH] = TEXT("");
  434.     static TCHAR strPath[MAX_PATH] = TEXT("");
  435.  
  436.     // Setup the OPENFILENAME structure
  437.     OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL,
  438.                          TEXT("Wave Files\0*.wav\0All Files\0*.*\0\0"), NULL,
  439.                          0, 1, strFileName, MAX_PATH, NULL, 0, strPath,
  440.                          TEXT("Open Sound File"),
  441.                          OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
  442.                          TEXT(".wav"), 0, NULL, NULL };
  443.  
  444.     // Get the default media path (something like C:\WINDOWS\MEDIA)
  445.     if( '\0' == strPath[0] )
  446.     {
  447.         GetWindowsDirectory( strPath, MAX_PATH );
  448.         if( strcmp( &strPath[strlen(strPath)], TEXT("\\") ) )
  449.             strcat( strPath, TEXT("\\") );
  450.         strcat( strPath, TEXT("MEDIA") );
  451.     }
  452.  
  453.     // Update the UI controls to show the sound as loading a file
  454.     EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
  455.     EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  456.     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Loading file...") );
  457.     
  458.     // Stop playing the current sound and disable the effects
  459.     g_lpFXManager->DisableAllFX( );
  460.  
  461.     // Display the OpenFileName dialog. Then, try to load the specified file
  462.     if( TRUE != GetOpenFileName( &ofn ) )
  463.     {
  464.         // Set the UI controls
  465.         SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  466.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("No file loaded.") );
  467.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
  468.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  469.         return;
  470.     }
  471.  
  472.     SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  473.  
  474.     // Make sure wave file is a valid wav file
  475.     if( FAILED( ValidateWaveFile( hDlg, strFileName ) ) )
  476.     {
  477.         // Set the UI controls
  478.         SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  479.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
  480.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  481.         return;
  482.     }
  483.  
  484.     EnablePlayUI( hDlg, TRUE );
  485.  
  486.     // Remember the path for next time
  487.     strcpy( strPath, strFileName );
  488.     char* strLastSlash = strrchr( strPath, '\\' );
  489.     strLastSlash[0] = '\0';
  490. }
  491.  
  492.  
  493.  
  494.  
  495. //-----------------------------------------------------------------------------
  496. // Name: OnTimer()
  497. // Desc: When we think the sound is playing this periodically checks to see if 
  498. //       the sound has stopped.  If it has then updates the dialog.
  499. //-----------------------------------------------------------------------------
  500. VOID OnTimer( HWND hDlg ) 
  501. {
  502.     if( IsWindowEnabled( GetDlgItem( hDlg, IDC_BUTTON_STOP ) ) )
  503.     {
  504.         // We think the sound is playing, so see if it has stopped yet.
  505.         if( g_lpSound && !g_lpSound->IsSoundPlaying() ) 
  506.         {
  507.             // Update the UI controls to show the sound as stopped
  508.             EnablePlayUI( hDlg, TRUE );
  509.             SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound stopped.") );
  510.         }
  511.     }
  512. }
  513.  
  514.  
  515.  
  516.  
  517. //-----------------------------------------------------------------------------
  518. // Name: EnablePlayUI()
  519. // Desc: Enables or disables the Play UI controls 
  520. //-----------------------------------------------------------------------------
  521. VOID EnablePlayUI( HWND hDlg, BOOL bEnable )
  522. {
  523.     if( bEnable )
  524.     {
  525.         EnableWindow( GetDlgItem( hDlg, IDC_CHECK_LOOP      ), TRUE );
  526.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY     ), TRUE );
  527.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP     ), FALSE );
  528.         SetFocus(     GetDlgItem( hDlg, IDC_BUTTON_PLAY )   );
  529.     }
  530.     else
  531.     {
  532.         EnableWindow( GetDlgItem( hDlg, IDC_CHECK_LOOP      ), FALSE );
  533.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY     ), FALSE );
  534.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP     ), TRUE );
  535.         SetFocus(     GetDlgItem( hDlg, IDC_BUTTON_STOP )   );
  536.     }
  537.  
  538.     for( DWORD i = IDC_CHECK_CHORUS; i <= IDC_CHECK_REVERB; i++ )
  539.         EnableWindow( GetDlgItem( hDlg, i ), bEnable );
  540. }
  541.  
  542.  
  543.  
  544.  
  545. //-----------------------------------------------------------------------------
  546. // Name: ResetParameterUI( )
  547. // Desc: Blanks the paramter UI
  548. //-----------------------------------------------------------------------------
  549. VOID ResetParameterUI( HWND hwndDlg )
  550. {
  551.     HWND hwndItem;
  552.     DWORD i;
  553.  
  554.     for ( i = IDC_PARAM_NAME1; i <= IDC_PARAM_MAX6; i++ )
  555.     {
  556.         hwndItem = GetDlgItem( hwndDlg, i );
  557.         SendMessage( hwndItem, WM_SETTEXT, 0, ( LPARAM ) TEXT( "- - -" ) );
  558.         EnableWindow( hwndItem, FALSE );
  559.     }
  560.  
  561.     for ( i = IDC_SLIDER1; i <= IDC_SLIDER6; i += 5 )
  562.     {
  563.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETRANGEMIN, FALSE, DEFAULT_SLIDER_MIN );
  564.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETRANGEMAX, FALSE, DEFAULT_SLIDER_MAX );
  565.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETLINESIZE, FALSE, DEFAULT_SLIDER_INC );
  566.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETPOS, TRUE, 0 );
  567.     }
  568.  
  569.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_TRIANGLE ), FALSE );
  570.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SQUARE ), FALSE );
  571.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SINE ), FALSE );
  572.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_WAVEFORM ), FALSE );
  573.  
  574.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_NEG_180 ), FALSE );
  575.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_NEG_90 ), FALSE );
  576.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_ZERO ), FALSE );
  577.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_90 ), FALSE );
  578.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_180 ), FALSE );
  579.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_PHASE ), FALSE );
  580. }
  581.  
  582.  
  583.  
  584.  
  585. //-----------------------------------------------------------------------------
  586. // Name: EnableSingleParameter
  587. // Desc: 
  588. //-----------------------------------------------------------------------------
  589. VOID EnableSingleParameter( HWND hwndDlg, DWORD resID )
  590. {
  591.     for ( DWORD i = resID; i < resID + 5; i++ )
  592.         EnableWindow( GetDlgItem( hwndDlg, i ), TRUE );      
  593. }
  594.  
  595.  
  596.  
  597.  
  598. //-----------------------------------------------------------------------------
  599. // Name: PosSlider
  600. // Desc: 
  601. //-----------------------------------------------------------------------------
  602. VOID PosSlider( HWND hwndDlg, DWORD dwSlider, FLOAT val, FLOAT min, FLOAT max, 
  603.                 FLOAT fSliderInc )
  604. {
  605.     HWND hwndSlider = GetDlgItem( hwndDlg, dwSlider );
  606.  
  607.     LONG lSliderInc = (LONG) ( (fSliderInc / (max - min)) * DEFAULT_SLIDER_MAX );
  608.     PostMessage( hwndSlider, TBM_SETLINESIZE, FALSE, lSliderInc );
  609.  
  610.     FLOAT res = ( val - min ) / ( max - min );
  611.     if( res < 0.0f )
  612.         res = 0.0f;
  613.     else if( res > 1.0f )
  614.         res = 1.0f;
  615.  
  616.     LONG pos = (LONG) ( res * DEFAULT_SLIDER_MAX );
  617.     PostMessage( hwndSlider, TBM_SETPOS, TRUE, pos );
  618. }
  619.  
  620.  
  621.  
  622.  
  623. //-----------------------------------------------------------------------------
  624. // Name: LoadSingleParameter
  625. // Desc: 
  626. //-----------------------------------------------------------------------------
  627. VOID LoadSingleParameter( HWND hwndDlg, DWORD id, const TCHAR * tszName, FLOAT val, 
  628.                           FLOAT min, FLOAT max, FLOAT fSliderInc = 0.1f,
  629.                           DWORD dwPrecision = 1 )
  630. {
  631.     TCHAR tszstr[MAX_PATH];
  632.  
  633.     // wet dry mix
  634.     EnableSingleParameter( hwndDlg, id );
  635.     SendMessage( GetDlgItem( hwndDlg, id ), WM_SETTEXT, 0, ( LPARAM ) tszName );
  636.  
  637.     switch( dwPrecision )
  638.     {
  639.         case 0:
  640.             sprintf( tszstr, "%.0f", val );
  641.             SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  642.             sprintf( tszstr, "%.0f", min );
  643.             SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  644.             sprintf( tszstr, "%.0f", max );
  645.             SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  646.             break;
  647.         case 1:
  648.             sprintf( tszstr, "%.1f", val );
  649.             SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  650.             sprintf( tszstr, "%.1f", min );
  651.             SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  652.             sprintf( tszstr, "%.1f", max );
  653.             SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  654.             break;
  655.         default:
  656.         case 2:
  657.             sprintf( tszstr, "%.2f", val );
  658.             SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  659.             sprintf( tszstr, "%.2f", min );
  660.             SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  661.             sprintf( tszstr, "%.2f", max );
  662.             SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  663.             break;
  664.     }
  665.  
  666.     PosSlider( hwndDlg, id + 2, val, min, max, fSliderInc );
  667. }
  668.  
  669.  
  670.  
  671.  
  672. //-----------------------------------------------------------------------------
  673. // Name: SaveSingleParameter
  674. // Desc: 
  675. //-----------------------------------------------------------------------------
  676. VOID SaveSingleParameter( HWND hwndDlg, DWORD id, FLOAT * val, FLOAT min, FLOAT max, DWORD dwPrecision = 1 )
  677. {
  678.     TCHAR tszstr[MAX_PATH];
  679.  
  680.     DWORD pos = ( DWORD ) SendMessage( GetDlgItem( hwndDlg, id + 2), TBM_GETPOS, 0, 0 );
  681.  
  682.     FLOAT percent = ( FLOAT ) ( pos - DEFAULT_SLIDER_MIN ) / ( FLOAT ) ( DEFAULT_SLIDER_MAX - DEFAULT_SLIDER_MIN );
  683.     *val = percent * ( max - min ) + min;
  684.  
  685.     switch( dwPrecision )
  686.     {
  687.         case 0:
  688.             sprintf( tszstr, "%.0f", *val );
  689.             break;
  690.         case 1:
  691.             sprintf( tszstr, "%.1f", *val );
  692.             break;
  693.         case 2:
  694.         default:
  695.             sprintf( tszstr, "%.2f", *val );
  696.             break;
  697.     }
  698.  
  699.     SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) tszstr );
  700. }
  701.  
  702.  
  703.  
  704.  
  705. //-----------------------------------------------------------------------------
  706. // Name: LoadWaveformRadio
  707. // Desc: 
  708. //-----------------------------------------------------------------------------
  709. VOID LoadWaveformRadio( HWND hwndDlg, LONG waveform, LONG triangle, LONG square, LONG sine )
  710. {
  711.     if( waveform == triangle )
  712.         CheckRadioButton( hwndDlg, IDC_RADIO_TRIANGLE, IDC_RADIO_SINE, IDC_RADIO_TRIANGLE );
  713.     else if( waveform == square )
  714.         CheckRadioButton( hwndDlg, IDC_RADIO_TRIANGLE, IDC_RADIO_SINE, IDC_RADIO_SQUARE );
  715.     else if( waveform == sine )
  716.         CheckRadioButton( hwndDlg, IDC_RADIO_TRIANGLE, IDC_RADIO_SINE, IDC_RADIO_SINE );
  717.  
  718.     if( triangle >= 0 )
  719.         EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_TRIANGLE ), TRUE );
  720.     if( square >= 0 )
  721.         EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SQUARE ), TRUE );
  722.     if( sine >= 0 )
  723.         EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SINE ), TRUE );
  724.  
  725.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_WAVEFORM ), ( triangle + square + sine != -3 ) );
  726. }
  727.  
  728.  
  729.  
  730.  
  731. //-----------------------------------------------------------------------------
  732. // Name: LoadPhaseRadio
  733. // Desc: 
  734. //-----------------------------------------------------------------------------
  735. VOID LoadPhaseRadio( HWND hwndDlg, LONG phase, LONG neg180, LONG neg90, LONG zero, LONG pos90, LONG pos180 )
  736. {
  737.     for( int i = IDC_RADIO_NEG_180; i <= IDC_RADIO_180; i++ )
  738.         EnableWindow( GetDlgItem( hwndDlg, i ), TRUE );
  739.  
  740.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_PHASE), TRUE );
  741.  
  742.     if( phase == neg180 )
  743.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_NEG_180 );
  744.     else if( phase == neg90 )
  745.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_NEG_90 );
  746.     else if( phase == zero )
  747.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_ZERO );
  748.     else if( phase == pos90 )
  749.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_90 );
  750.     else if( phase == pos180 )
  751.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_180 );
  752. }
  753.  
  754.  
  755.  
  756.  
  757. //-----------------------------------------------------------------------------
  758. // Name: LoadParameterUI( )
  759. // Desc: loads the paramter ui for particular effect
  760. //-----------------------------------------------------------------------------
  761. VOID LoadParameterUI( HWND hwndDlg, DWORD dwFXType )
  762. {
  763.     TCHAR tszstr[MAX_PATH];
  764.  
  765.     // reset the parameter ui
  766.     ResetParameterUI( hwndDlg );
  767.  
  768.     sprintf( tszstr, "Parameters for [ %s ]", g_tszFXNames[dwFXType] );
  769.     SetDlgItemText( hwndDlg, IDC_FRAME, tszstr );
  770.  
  771.     switch( dwFXType)
  772.     {
  773.         case eSFX_chorus:
  774.         {            
  775.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Wet/Dry Mix (%)" ), g_lpFXManager->m_paramsChorus.fWetDryMix, DSFXCHORUS_WETDRYMIX_MIN, DSFXCHORUS_WETDRYMIX_MAX );
  776.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Depth (%)" ), g_lpFXManager->m_paramsChorus.fDepth, DSFXCHORUS_DEPTH_MIN, DSFXCHORUS_DEPTH_MAX );
  777.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Feedback (%)" ), g_lpFXManager->m_paramsChorus.fFeedback, DSFXCHORUS_FEEDBACK_MIN, DSFXCHORUS_FEEDBACK_MAX );
  778.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Frequency (Hz)" ), g_lpFXManager->m_paramsChorus.fFrequency, DSFXCHORUS_FREQUENCY_MIN, DSFXCHORUS_FREQUENCY_MAX );
  779.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "Delay (ms)" ), g_lpFXManager->m_paramsChorus.fDelay, DSFXCHORUS_DELAY_MIN, DSFXCHORUS_DELAY_MAX );
  780.             LoadWaveformRadio( hwndDlg, g_lpFXManager->m_paramsChorus.lWaveform, DSFXCHORUS_WAVE_TRIANGLE, -1, DSFXCHORUS_WAVE_SIN );
  781.             LoadPhaseRadio( hwndDlg, g_lpFXManager->m_paramsChorus.lPhase, DSFXCHORUS_PHASE_NEG_180, DSFXCHORUS_PHASE_NEG_90, DSFXCHORUS_PHASE_ZERO, DSFXCHORUS_PHASE_90, DSFXCHORUS_PHASE_180 );
  782.             break;
  783.         }
  784.  
  785.         case eSFX_compressor:
  786.         {            
  787.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Gain (dB)" ), g_lpFXManager->m_paramsCompressor.fGain, DSFXCOMPRESSOR_GAIN_MIN, DSFXCOMPRESSOR_GAIN_MAX );
  788.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Attack (ms)" ), g_lpFXManager->m_paramsCompressor.fAttack, DSFXCOMPRESSOR_ATTACK_MIN, DSFXCOMPRESSOR_ATTACK_MAX );
  789.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Release (ms)" ), g_lpFXManager->m_paramsCompressor.fRelease, DSFXCOMPRESSOR_RELEASE_MIN, DSFXCOMPRESSOR_RELEASE_MAX );
  790.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Threshold (dB)" ), g_lpFXManager->m_paramsCompressor.fThreshold, DSFXCOMPRESSOR_THRESHOLD_MIN, DSFXCOMPRESSOR_THRESHOLD_MAX );
  791.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "Ratio (x:1)" ), g_lpFXManager->m_paramsCompressor.fRatio, DSFXCOMPRESSOR_RATIO_MIN, DSFXCOMPRESSOR_RATIO_MAX );
  792.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME6, TEXT( "Predelay (ms)" ), g_lpFXManager->m_paramsCompressor.fPredelay, DSFXCOMPRESSOR_PREDELAY_MIN, DSFXCOMPRESSOR_PREDELAY_MAX, 0.05f, 2 );
  793.             break;
  794.         }
  795.  
  796.         case eSFX_distortion:
  797.         {            
  798.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Gain (dB)" ), g_lpFXManager->m_paramsDistortion.fGain, DSFXDISTORTION_GAIN_MIN, DSFXDISTORTION_GAIN_MAX );
  799.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Edge (%)" ), g_lpFXManager->m_paramsDistortion.fEdge, DSFXDISTORTION_EDGE_MIN, DSFXDISTORTION_EDGE_MAX );
  800.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "PostEQ Center Freq (Hz)" ), g_lpFXManager->m_paramsDistortion.fPostEQCenterFrequency, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX, 1.0f, 0 );
  801.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "PostEQ Bandwidth (Hz)" ), g_lpFXManager->m_paramsDistortion.fPostEQBandwidth, DSFXDISTORTION_POSTEQBANDWIDTH_MIN, DSFXDISTORTION_POSTEQBANDWIDTH_MAX, 1.0f, 0 );
  802.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "PreLowpass Cutoff (Hz)" ), g_lpFXManager->m_paramsDistortion.fPreLowpassCutoff, DSFXDISTORTION_PRELOWPASSCUTOFF_MIN, DSFXDISTORTION_PRELOWPASSCUTOFF_MAX, 1.0f, 0 );
  803.             break;
  804.         }
  805.  
  806.         case eSFX_echo:
  807.         {            
  808.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Wet/Dry Mix (%)" ), g_lpFXManager->m_paramsEcho.fWetDryMix, DSFXECHO_WETDRYMIX_MIN, DSFXECHO_WETDRYMIX_MAX );
  809.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Feedback (%)" ), g_lpFXManager->m_paramsEcho.fFeedback, DSFXECHO_FEEDBACK_MIN, DSFXECHO_FEEDBACK_MAX );
  810.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Left Delay (ms)" ), g_lpFXManager->m_paramsEcho.fLeftDelay, DSFXECHO_LEFTDELAY_MIN, DSFXECHO_LEFTDELAY_MAX );
  811.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Right Delay (ms)" ), g_lpFXManager->m_paramsEcho.fRightDelay, DSFXECHO_RIGHTDELAY_MIN, DSFXECHO_RIGHTDELAY_MAX );
  812.             break;
  813.         }
  814.  
  815.         case eSFX_flanger:
  816.         {            
  817.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Wet/Dry Mix (%)" ), g_lpFXManager->m_paramsFlanger.fWetDryMix, DSFXFLANGER_WETDRYMIX_MIN, DSFXFLANGER_WETDRYMIX_MAX );
  818.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Depth (%)" ), g_lpFXManager->m_paramsFlanger.fDepth, DSFXFLANGER_DEPTH_MIN, DSFXFLANGER_DEPTH_MAX );
  819.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Feedback (%)" ), g_lpFXManager->m_paramsFlanger.fFeedback, DSFXFLANGER_FEEDBACK_MIN, DSFXFLANGER_FEEDBACK_MAX );
  820.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Frequency (Hz)" ), g_lpFXManager->m_paramsFlanger.fFrequency, DSFXFLANGER_FREQUENCY_MIN, DSFXFLANGER_FREQUENCY_MAX, 0.01f, 2 );
  821.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "Delay (ms)" ), g_lpFXManager->m_paramsFlanger.fDelay, DSFXFLANGER_DELAY_MIN, DSFXFLANGER_DELAY_MAX, 0.01f, 2 );
  822.             LoadWaveformRadio( hwndDlg, g_lpFXManager->m_paramsFlanger.lWaveform, DSFXFLANGER_WAVE_TRIANGLE, -1, DSFXFLANGER_WAVE_SIN );
  823.             LoadPhaseRadio( hwndDlg, g_lpFXManager->m_paramsFlanger.lPhase, DSFXFLANGER_PHASE_NEG_180, DSFXFLANGER_PHASE_NEG_90, DSFXFLANGER_PHASE_ZERO, DSFXFLANGER_PHASE_90, DSFXFLANGER_PHASE_180 );
  824.             break;
  825.         }
  826.  
  827.         case eSFX_gargle:
  828.         {            
  829.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Rate (Hz)" ), ( FLOAT ) g_lpFXManager->m_paramsGargle.dwRateHz, ( FLOAT ) DSFXGARGLE_RATEHZ_MIN, ( FLOAT ) DSFXGARGLE_RATEHZ_MAX );
  830.             LoadWaveformRadio( hwndDlg, g_lpFXManager->m_paramsGargle.dwWaveShape, DSFXGARGLE_WAVE_TRIANGLE, DSFXGARGLE_WAVE_SQUARE, -1 );
  831.             break;
  832.         }
  833.  
  834.         case eSFX_parameq:
  835.         {            
  836.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Center Freq (Hz)" ), g_lpFXManager->m_paramsParamEq.fCenter, DSFXPARAMEQ_CENTER_MIN, DSFXPARAMEQ_CENTER_MAX );
  837.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Bandwidth (Hz)" ), g_lpFXManager->m_paramsParamEq.fBandwidth, DSFXPARAMEQ_BANDWIDTH_MIN, DSFXPARAMEQ_BANDWIDTH_MAX );
  838.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Gain (dB)" ), g_lpFXManager->m_paramsParamEq.fGain, DSFXPARAMEQ_GAIN_MIN, DSFXPARAMEQ_GAIN_MAX );
  839.             break;
  840.         }
  841.  
  842.         case eSFX_reverb:
  843.         {            
  844.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "In Gain (dB)" ), g_lpFXManager->m_paramsReverb.fInGain, DSFX_WAVESREVERB_INGAIN_MIN, DSFX_WAVESREVERB_INGAIN_MAX );
  845.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Reverb Mix (dB)" ), g_lpFXManager->m_paramsReverb.fReverbMix, DSFX_WAVESREVERB_REVERBMIX_MIN, DSFX_WAVESREVERB_REVERBMIX_MAX );
  846.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Reverb Time (ms)" ), g_lpFXManager->m_paramsReverb.fReverbTime, DSFX_WAVESREVERB_REVERBTIME_MIN, DSFX_WAVESREVERB_REVERBTIME_MAX );
  847.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "HighFreq RT Ratio (x:1)" ), g_lpFXManager->m_paramsReverb.fHighFreqRTRatio, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX, 0.01f, 2 );
  848.             break;
  849.         }
  850.     }
  851. }
  852.  
  853.  
  854.  
  855.  
  856. //-----------------------------------------------------------------------------
  857. // Name: OnEffectChanged()  
  858. // Desc: Called when the UI prompted an effect change
  859. //-----------------------------------------------------------------------------
  860. VOID OnEffectChanged( HWND hwndDlg )
  861. {
  862.     switch( g_dwCurrentFXType )
  863.     {
  864.         case eSFX_chorus:
  865.         {
  866.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsChorus.fWetDryMix, DSFXCHORUS_WETDRYMIX_MIN, DSFXCHORUS_WETDRYMIX_MAX );
  867.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsChorus.fDepth, DSFXCHORUS_DEPTH_MIN, DSFXCHORUS_DEPTH_MAX );
  868.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsChorus.fFeedback, DSFXCHORUS_FEEDBACK_MIN, DSFXCHORUS_FEEDBACK_MAX );
  869.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsChorus.fFrequency, DSFXCHORUS_FREQUENCY_MIN, DSFXCHORUS_FREQUENCY_MAX );
  870.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsChorus.fDelay, DSFXCHORUS_DELAY_MIN, DSFXCHORUS_DELAY_MAX );
  871.  
  872.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_TRIANGLE ) == BST_CHECKED )
  873.                 g_lpFXManager->m_paramsChorus.lWaveform = DSFXCHORUS_WAVE_TRIANGLE;
  874.             else
  875.                 g_lpFXManager->m_paramsChorus.lWaveform = DSFXCHORUS_WAVE_SIN;
  876.  
  877.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_180 ) == BST_CHECKED )
  878.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_NEG_180;
  879.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_90 ) == BST_CHECKED )
  880.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_NEG_90;
  881.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_ZERO ) == BST_CHECKED )
  882.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_ZERO;
  883.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_90 ) == BST_CHECKED )
  884.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_90;
  885.             else
  886.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_180;
  887.  
  888.             if( g_lpFXManager->m_lpChorus )
  889.                 g_lpFXManager->m_lpChorus->SetAllParameters( &g_lpFXManager->m_paramsChorus );
  890.  
  891.             break;
  892.         }
  893.  
  894.         case eSFX_compressor:
  895.         {
  896.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsCompressor.fGain, DSFXCOMPRESSOR_GAIN_MIN, DSFXCOMPRESSOR_GAIN_MAX );
  897.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsCompressor.fAttack, DSFXCOMPRESSOR_ATTACK_MIN, DSFXCOMPRESSOR_ATTACK_MAX );
  898.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsCompressor.fRelease, DSFXCOMPRESSOR_RELEASE_MIN, DSFXCOMPRESSOR_RELEASE_MAX );
  899.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsCompressor.fThreshold, DSFXCOMPRESSOR_THRESHOLD_MIN, DSFXCOMPRESSOR_THRESHOLD_MAX );
  900.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsCompressor.fRatio, DSFXCOMPRESSOR_RATIO_MIN, DSFXCOMPRESSOR_RATIO_MAX );
  901.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME6, &g_lpFXManager->m_paramsCompressor.fPredelay, DSFXCOMPRESSOR_PREDELAY_MIN, DSFXCOMPRESSOR_PREDELAY_MAX, 2 );
  902.  
  903.             if( g_lpFXManager->m_lpCompressor )
  904.                 g_lpFXManager->m_lpCompressor->SetAllParameters( &g_lpFXManager->m_paramsCompressor );
  905.             break;
  906.         }
  907.  
  908.         case eSFX_distortion:
  909.         {
  910.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsDistortion.fGain, DSFXDISTORTION_GAIN_MIN, DSFXDISTORTION_GAIN_MAX );
  911.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsDistortion.fEdge, DSFXDISTORTION_EDGE_MIN, DSFXDISTORTION_EDGE_MAX );
  912.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsDistortion.fPostEQCenterFrequency, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX, 0 );
  913.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsDistortion.fPostEQBandwidth, DSFXDISTORTION_POSTEQBANDWIDTH_MIN, DSFXDISTORTION_POSTEQBANDWIDTH_MAX, 0 );
  914.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsDistortion.fPreLowpassCutoff, DSFXDISTORTION_PRELOWPASSCUTOFF_MIN, DSFXDISTORTION_PRELOWPASSCUTOFF_MAX, 0 );
  915.  
  916.             if( g_lpFXManager->m_lpDistortion )
  917.                 g_lpFXManager->m_lpDistortion->SetAllParameters( &g_lpFXManager->m_paramsDistortion );
  918.             break;
  919.         }
  920.  
  921.         case eSFX_echo:
  922.         {
  923.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsEcho.fWetDryMix, DSFXECHO_WETDRYMIX_MIN, DSFXECHO_WETDRYMIX_MAX );
  924.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsEcho.fFeedback, DSFXECHO_FEEDBACK_MIN, DSFXECHO_FEEDBACK_MAX );
  925.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsEcho.fLeftDelay, DSFXECHO_LEFTDELAY_MIN, DSFXECHO_LEFTDELAY_MAX );
  926.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsEcho.fRightDelay, DSFXECHO_RIGHTDELAY_MIN, DSFXECHO_RIGHTDELAY_MAX );
  927.  
  928.             if( g_lpFXManager->m_lpEcho )
  929.                 g_lpFXManager->m_lpEcho->SetAllParameters( &g_lpFXManager->m_paramsEcho );
  930.             break;
  931.         }
  932.  
  933.         case eSFX_flanger:
  934.         {
  935.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsFlanger.fWetDryMix, DSFXFLANGER_WETDRYMIX_MIN, DSFXFLANGER_WETDRYMIX_MAX );
  936.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsFlanger.fDepth, DSFXFLANGER_DEPTH_MIN, DSFXFLANGER_DEPTH_MAX );
  937.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsFlanger.fFeedback, DSFXFLANGER_FEEDBACK_MIN, DSFXFLANGER_FEEDBACK_MAX );
  938.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsFlanger.fFrequency, DSFXFLANGER_FREQUENCY_MIN, DSFXFLANGER_FREQUENCY_MAX, 2 );
  939.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsFlanger.fDelay, DSFXFLANGER_DELAY_MIN, DSFXFLANGER_DELAY_MAX, 2 );
  940.  
  941.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_TRIANGLE ) == BST_CHECKED )
  942.                 g_lpFXManager->m_paramsFlanger.lWaveform = DSFXFLANGER_WAVE_TRIANGLE;
  943.             else
  944.                 g_lpFXManager->m_paramsFlanger.lWaveform = DSFXFLANGER_WAVE_SIN;
  945.  
  946.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_180 ) == BST_CHECKED )
  947.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_NEG_180;
  948.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_90 ) == BST_CHECKED )
  949.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_NEG_90;
  950.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_ZERO ) == BST_CHECKED )
  951.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_ZERO;
  952.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_90 ) == BST_CHECKED )
  953.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_90;
  954.             else
  955.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_180;
  956.  
  957.             if( g_lpFXManager->m_lpFlanger )
  958.                 g_lpFXManager->m_lpFlanger->SetAllParameters( &g_lpFXManager->m_paramsFlanger );
  959.             break;
  960.         }
  961.  
  962.         case eSFX_gargle:
  963.         {
  964.             FLOAT fRateHz;
  965.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &fRateHz, DSFXGARGLE_RATEHZ_MIN, DSFXGARGLE_RATEHZ_MAX );
  966.             g_lpFXManager->m_paramsGargle.dwRateHz = (DWORD) fRateHz;
  967.  
  968.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_TRIANGLE ) == BST_CHECKED )
  969.                 g_lpFXManager->m_paramsGargle.dwWaveShape = DSFXGARGLE_WAVE_TRIANGLE;
  970.             else
  971.                 g_lpFXManager->m_paramsGargle.dwWaveShape = DSFXGARGLE_WAVE_SQUARE;
  972.  
  973.             if( g_lpFXManager->m_lpGargle )
  974.                 g_lpFXManager->m_lpGargle->SetAllParameters( &g_lpFXManager->m_paramsGargle );
  975.             break;
  976.         }
  977.  
  978.         case eSFX_parameq:
  979.         {
  980.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsParamEq.fCenter, DSFXPARAMEQ_CENTER_MIN, DSFXPARAMEQ_CENTER_MAX );
  981.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsParamEq.fBandwidth, DSFXPARAMEQ_BANDWIDTH_MIN, DSFXPARAMEQ_BANDWIDTH_MAX );
  982.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsParamEq.fGain, DSFXPARAMEQ_GAIN_MIN, DSFXPARAMEQ_GAIN_MAX );
  983.  
  984.             if( g_lpFXManager->m_lpParamEq )
  985.                 g_lpFXManager->m_lpParamEq->SetAllParameters( &g_lpFXManager->m_paramsParamEq );
  986.             break;
  987.         }
  988.  
  989.         case eSFX_reverb:
  990.         {
  991.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsReverb.fInGain, DSFX_WAVESREVERB_INGAIN_MIN, DSFX_WAVESREVERB_INGAIN_MAX );
  992.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsReverb.fReverbMix, DSFX_WAVESREVERB_REVERBMIX_MIN, DSFX_WAVESREVERB_REVERBMIX_MAX );
  993.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsReverb.fReverbTime, DSFX_WAVESREVERB_REVERBTIME_MIN, DSFX_WAVESREVERB_REVERBTIME_MAX );
  994.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsReverb.fHighFreqRTRatio, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX, 2 );
  995.  
  996.             if( g_lpFXManager->m_lpReverb )
  997.                 g_lpFXManager->m_lpReverb->SetAllParameters( &g_lpFXManager->m_paramsReverb );
  998.             break;
  999.         }
  1000.     }
  1001. }
  1002.  
  1003.  
  1004.  
  1005.  
  1006. //-----------------------------------------------------------------------------
  1007. // Name: ValidateWaveFile()
  1008. // Desc: Open the wave file with the helper 
  1009. //       class CWaveFile to make sure it is valid
  1010. //-----------------------------------------------------------------------------
  1011. HRESULT ValidateWaveFile( HWND hDlg, TCHAR* strFileName )
  1012. {
  1013.     HRESULT hr;
  1014.     CWaveFile waveFile;
  1015.  
  1016.     if( -1 == GetFileAttributes(strFileName) )
  1017.         return E_FAIL;
  1018.     
  1019.     // Load the wave file
  1020.     if( FAILED( hr = waveFile.Open( strFileName, NULL, WAVEFILE_READ ) ) )
  1021.     {
  1022.         waveFile.Close();
  1023.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Bad wave file.") );
  1024.         return DXTRACE_ERR( TEXT("Open"), hr );
  1025.     }
  1026.     else // The load call succeeded
  1027.     {
  1028.         WAVEFORMATEX* pwfx = waveFile.GetFormat();
  1029.         if( pwfx->wFormatTag != WAVE_FORMAT_PCM )
  1030.         {
  1031.             // Sound must be PCM when using DSBCAPS_CTRLFX
  1032.             SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Wave file must be PCM for effects control.") );
  1033.             SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  1034.             return E_FAIL;
  1035.         }
  1036.   
  1037.         // Update the UI controls to show the sound as the file is loaded
  1038.         waveFile.Close();
  1039.  
  1040.         //EnablePlayUI( hDlg, TRUE );
  1041.         SetDlgItemText( hDlg, IDC_TEXT_FILENAME, strFileName );
  1042.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("File loaded.") );
  1043.         strcpy( g_tszFilename, strFileName );
  1044.  
  1045.         // Get the samples per sec from the wave file
  1046.         DWORD dwSamplesPerSec = waveFile.m_pwfx->nSamplesPerSec;
  1047.         return S_OK;
  1048.     }
  1049. }
  1050.  
  1051.  
  1052.  
  1053.  
  1054. //-----------------------------------------------------------------------------
  1055. // Name: CSoundFXManager( )
  1056. // Desc: constructor
  1057. //-----------------------------------------------------------------------------
  1058. CSoundFXManager::CSoundFXManager( )
  1059. {
  1060.     m_lpChorus = NULL;
  1061.     m_lpCompressor = NULL;
  1062.     m_lpDistortion = NULL;
  1063.     m_lpEcho = NULL;
  1064.     m_lpFlanger = NULL;
  1065.     m_lpGargle = NULL;
  1066.     m_lpParamEq = NULL;
  1067.     m_lpReverb = NULL;
  1068.  
  1069.     ZeroMemory( &m_paramsChorus, sizeof( DSFXChorus ) );
  1070.     ZeroMemory( &m_paramsCompressor, sizeof( DSFXCompressor ) );
  1071.     ZeroMemory( &m_paramsDistortion, sizeof( DSFXDistortion ) );
  1072.     ZeroMemory( &m_paramsFlanger, sizeof( DSFXFlanger ) );
  1073.     ZeroMemory( &m_paramsEcho, sizeof( DSFXEcho ) );
  1074.     ZeroMemory( &m_paramsGargle, sizeof( DSFXGargle ) );
  1075.     ZeroMemory( &m_paramsParamEq, sizeof( DSFXParamEq ) );
  1076.     ZeroMemory( &m_paramsReverb, sizeof( DSFXWavesReverb ) );
  1077.  
  1078.     m_dwNumFX = 0;
  1079.     ZeroMemory( m_rgFxDesc, sizeof( DSEFFECTDESC ) * eNUM_SFX );
  1080.     ZeroMemory( m_rgRefGuids, sizeof( GUID * ) * eNUM_SFX );
  1081.     ZeroMemory( m_rgPtrs, sizeof(LPVOID*) * eNUM_SFX );
  1082.     ZeroMemory( m_rgLoaded, sizeof( BOOL ) * eNUM_SFX );
  1083.  
  1084.     m_lpDSB8 = NULL;
  1085. }
  1086.  
  1087.  
  1088.  
  1089.  
  1090. //-----------------------------------------------------------------------------
  1091. // Name: ~CSoundFXManager( )
  1092. // Desc: destructor
  1093. //-----------------------------------------------------------------------------
  1094. CSoundFXManager::~CSoundFXManager( )
  1095. {
  1096.     // free any effects
  1097.     DisableAllFX( );
  1098.  
  1099.     // release the DirectSoundBuffer
  1100.     SAFE_RELEASE( m_lpDSB8 );
  1101. }
  1102.  
  1103.  
  1104.  
  1105.  
  1106. //-----------------------------------------------------------------------------
  1107. // Name: Initialize( )
  1108. // Desc: associates a DirectSoundBuffer with the manager, any effects
  1109. //       enabled in the old DirectSoundBuffer will be disabled, 
  1110. //       and the effect objects released
  1111. //-----------------------------------------------------------------------------
  1112. HRESULT CSoundFXManager::Initialize( LPDIRECTSOUNDBUFFER lpDSB, BOOL bLoadDefaultParamValues )
  1113. {
  1114.     HRESULT hr;
  1115.  
  1116.     if( m_lpDSB8 )
  1117.     {
  1118.         // release the effect for the previously associated sound buffers
  1119.         DisableAllFX( );
  1120.         SAFE_RELEASE( m_lpDSB8 );
  1121.     }
  1122.  
  1123.     if( NULL == lpDSB )
  1124.         return S_OK;
  1125.     
  1126.     // get the interface
  1127.     if( FAILED( hr = lpDSB->QueryInterface( IID_IDirectSoundBuffer8, (LPVOID*) &m_lpDSB8 ) ) )
  1128.         return hr;
  1129.  
  1130.     if( bLoadDefaultParamValues )
  1131.         LoadDefaultParamValues( );
  1132.  
  1133.     return S_OK;
  1134. }
  1135.  
  1136.  
  1137.  
  1138.  
  1139. //-----------------------------------------------------------------------------
  1140. // Name: UnInitialize( )
  1141. // Desc: the manager goes back to default state, the effects params, however
  1142. //       will not be reset
  1143. //-----------------------------------------------------------------------------
  1144. HRESULT CSoundFXManager::UnInitialize( )
  1145. {
  1146.     Initialize( NULL, FALSE );
  1147.  
  1148.     return S_OK;
  1149. }
  1150.  
  1151.  
  1152.  
  1153.  
  1154. //-----------------------------------------------------------------------------
  1155. // Name: LoadDefaultParamValues( )
  1156. // Desc: loads the default param value for each effect
  1157. //-----------------------------------------------------------------------------
  1158. HRESULT CSoundFXManager::LoadDefaultParamValues( )
  1159. {
  1160.     DWORD i;
  1161.  
  1162.     if( NULL == m_lpDSB8 )
  1163.         return E_FAIL;
  1164.  
  1165.     for( i = eSFX_chorus; i < eNUM_SFX; i++ )
  1166.         SetFXEnable( i );
  1167.     
  1168.     ActivateFX( );
  1169.  
  1170.     if( m_lpChorus )
  1171.         m_lpChorus->GetAllParameters( &m_paramsChorus );
  1172.  
  1173.     if( m_lpCompressor )
  1174.         m_lpCompressor->GetAllParameters( &m_paramsCompressor );
  1175.     
  1176.     if( m_lpDistortion )
  1177.         m_lpDistortion->GetAllParameters( &m_paramsDistortion );
  1178.  
  1179.     if( m_lpEcho )
  1180.         m_lpEcho->GetAllParameters( &m_paramsEcho );
  1181.  
  1182.     if( m_lpFlanger )
  1183.         m_lpFlanger->GetAllParameters( &m_paramsFlanger );
  1184.  
  1185.     if( m_lpGargle )
  1186.         m_lpGargle->GetAllParameters( &m_paramsGargle );
  1187.  
  1188.     if( m_lpParamEq )
  1189.         m_lpParamEq->GetAllParameters( &m_paramsParamEq );
  1190.  
  1191.     if( m_lpReverb )
  1192.         m_lpReverb->GetAllParameters( &m_paramsReverb );
  1193.  
  1194.     DisableAllFX( );
  1195.  
  1196.     return S_OK;
  1197. }
  1198.  
  1199.  
  1200.  
  1201.  
  1202. //-----------------------------------------------------------------------------
  1203. // Name: LoadCurrentFXParameters
  1204. // Desc: loads the default param value for each effect
  1205. //-----------------------------------------------------------------------------
  1206. HRESULT CSoundFXManager::LoadCurrentFXParameters( )
  1207. {
  1208.     if( m_lpChorus )
  1209.         m_lpChorus->SetAllParameters( &m_paramsChorus );
  1210.  
  1211.     if( m_lpCompressor )
  1212.         m_lpCompressor->SetAllParameters( &m_paramsCompressor );
  1213.     
  1214.     if( m_lpDistortion )
  1215.         m_lpDistortion->SetAllParameters( &m_paramsDistortion );
  1216.  
  1217.     if( m_lpEcho )
  1218.         m_lpEcho->SetAllParameters( &m_paramsEcho );
  1219.  
  1220.     if( m_lpFlanger )
  1221.         m_lpFlanger->SetAllParameters( &m_paramsFlanger );
  1222.  
  1223.     if( m_lpGargle )
  1224.         m_lpGargle->SetAllParameters( &m_paramsGargle );
  1225.  
  1226.     if( m_lpParamEq )
  1227.         m_lpParamEq->SetAllParameters( &m_paramsParamEq );
  1228.  
  1229.     if( m_lpReverb )
  1230.         m_lpReverb->SetAllParameters( &m_paramsReverb );
  1231.  
  1232.     return S_OK;
  1233. }
  1234.  
  1235.  
  1236.  
  1237.  
  1238. //-----------------------------------------------------------------------------
  1239. // Name: SetFXEnable( )
  1240. // Desc: enables a sound effect for the sound buffer associated with this
  1241. //-----------------------------------------------------------------------------
  1242. HRESULT CSoundFXManager::SetFXEnable( DWORD esfxType )
  1243. {
  1244.     HRESULT hr;
  1245.  
  1246.     if( esfxType >= eNUM_SFX )
  1247.         return E_FAIL;
  1248.  
  1249.     if( m_rgLoaded[esfxType] )
  1250.         return S_FALSE;
  1251.     else
  1252.         m_rgLoaded[esfxType] = TRUE;
  1253.  
  1254.     switch ( esfxType )
  1255.     {
  1256.     case eSFX_chorus:
  1257.         hr = EnableGenericFX( GUID_DSFX_STANDARD_CHORUS,     IID_IDirectSoundFXChorus8,      
  1258.                               (LPVOID*) &m_lpChorus );
  1259.         break;
  1260.     case eSFX_compressor:
  1261.         hr = EnableGenericFX( GUID_DSFX_STANDARD_COMPRESSOR, IID_IDirectSoundFXCompressor8,  
  1262.                               (LPVOID*) &m_lpCompressor );
  1263.         break;
  1264.     case eSFX_distortion:
  1265.         hr = EnableGenericFX( GUID_DSFX_STANDARD_DISTORTION, IID_IDirectSoundFXDistortion8,  
  1266.                               (LPVOID*) &m_lpDistortion );
  1267.         break;
  1268.     case eSFX_echo:
  1269.         hr = EnableGenericFX( GUID_DSFX_STANDARD_ECHO,       IID_IDirectSoundFXEcho8,        
  1270.                               (LPVOID*) &m_lpEcho );
  1271.         break;
  1272.     case eSFX_flanger:
  1273.         hr = EnableGenericFX( GUID_DSFX_STANDARD_FLANGER,    IID_IDirectSoundFXFlanger8,     
  1274.                               (LPVOID*) &m_lpFlanger );
  1275.         break;
  1276.     case eSFX_gargle:
  1277.         hr = EnableGenericFX( GUID_DSFX_STANDARD_GARGLE,     IID_IDirectSoundFXGargle8,      
  1278.                               (LPVOID*) &m_lpGargle );
  1279.         break;
  1280.     case eSFX_parameq:
  1281.         hr = EnableGenericFX( GUID_DSFX_STANDARD_PARAMEQ,    IID_IDirectSoundFXParamEq8,     
  1282.                               (LPVOID*) &m_lpParamEq );
  1283.         break;
  1284.     case eSFX_reverb:
  1285.         hr = EnableGenericFX( GUID_DSFX_WAVES_REVERB,        IID_IDirectSoundFXWavesReverb8, 
  1286.                               (LPVOID*) &m_lpReverb );
  1287.         break;
  1288.     default:
  1289.         hr = E_FAIL;
  1290.         break;
  1291.     }
  1292.  
  1293.     return hr;
  1294. }
  1295.  
  1296.  
  1297.  
  1298.  
  1299. //-----------------------------------------------------------------------------
  1300. // Name: DisableAllFX( )
  1301. // Desc: disables all effect in the DirectSoundBuffer, and releases all effect
  1302. //       object.
  1303. //-----------------------------------------------------------------------------
  1304. HRESULT CSoundFXManager::DisableAllFX( )
  1305. {
  1306.     // release all effect interfaces created with this manager so far
  1307.     SAFE_RELEASE( m_lpChorus );
  1308.     SAFE_RELEASE( m_lpCompressor );
  1309.     SAFE_RELEASE( m_lpDistortion );
  1310.     SAFE_RELEASE( m_lpEcho );
  1311.     SAFE_RELEASE( m_lpFlanger );
  1312.     SAFE_RELEASE( m_lpGargle );
  1313.     SAFE_RELEASE( m_lpParamEq );
  1314.     SAFE_RELEASE( m_lpReverb );
  1315.     
  1316.     m_dwNumFX = 0;
  1317.     ZeroMemory( m_rgFxDesc, sizeof( DSEFFECTDESC ) * eNUM_SFX );
  1318.     ZeroMemory( m_rgRefGuids, sizeof( GUID * ) * eNUM_SFX );
  1319.     ZeroMemory( m_rgPtrs, sizeof(LPVOID*) * eNUM_SFX );
  1320.     ZeroMemory( m_rgLoaded, sizeof( BOOL ) * eNUM_SFX );
  1321.  
  1322.     if( NULL == m_lpDSB8 )
  1323.         return E_FAIL;
  1324.  
  1325.     // Buffer must be stopped before calling SetFx
  1326.     if( m_lpDSB8 )
  1327.         m_lpDSB8->Stop();
  1328.         
  1329.     // this removes all fx from the buffer
  1330.     m_lpDSB8->SetFX( 0, NULL, NULL );
  1331.     
  1332.     return S_OK;
  1333. }
  1334.  
  1335.  
  1336.  
  1337.  
  1338. //-----------------------------------------------------------------------------
  1339. // Name: ActivateFX( )
  1340. // Desc: activate the effects enabled from EnableFX( )
  1341. //-----------------------------------------------------------------------------
  1342. HRESULT CSoundFXManager::ActivateFX( )
  1343. {
  1344.     DWORD dwResults[eNUM_SFX];
  1345.     HRESULT hr;
  1346.     DWORD i;
  1347.  
  1348.     if( NULL == m_lpDSB8 )
  1349.         return E_FAIL;
  1350.  
  1351.     if( m_dwNumFX == 0 )
  1352.         return S_FALSE;
  1353.  
  1354.     if( FAILED( hr = m_lpDSB8->SetFX( m_dwNumFX, m_rgFxDesc, dwResults ) ) )
  1355.         return hr;
  1356.  
  1357.     // get reference to the effect object
  1358.     for( i = 0; i < m_dwNumFX; i++ )
  1359.         if( FAILED( hr = m_lpDSB8->GetObjectInPath( m_rgFxDesc[i].guidDSFXClass, 0, *m_rgRefGuids[i], m_rgPtrs[i] ) ) )
  1360.             return DXTRACE_ERR( TEXT("GetObjectInPath"), hr );
  1361.  
  1362.     return S_OK;
  1363. }
  1364.  
  1365.  
  1366.  
  1367.  
  1368. //-----------------------------------------------------------------------------
  1369. // Name: EnableGenericFX( )
  1370. // Desc: given information, tries to enabled an effect in a DirectSoundBuffer8,
  1371. //       and tries obtain reference to effect interface
  1372. //-----------------------------------------------------------------------------
  1373. HRESULT CSoundFXManager::EnableGenericFX( GUID guidSFXClass, REFGUID rguidInterface, LPVOID * ppObj )
  1374. {
  1375.     // if an effect already allocated
  1376.     if( *ppObj )
  1377.         return S_FALSE;
  1378.  
  1379.     if( m_dwNumFX >= eNUM_SFX )
  1380.         return E_FAIL;
  1381.  
  1382.     // set the effect to be enabled
  1383.     ZeroMemory( &m_rgFxDesc[m_dwNumFX], sizeof(DSEFFECTDESC) );
  1384.     m_rgFxDesc[m_dwNumFX].dwSize         = sizeof(DSEFFECTDESC);
  1385.     m_rgFxDesc[m_dwNumFX].dwFlags        = 0;
  1386.     CopyMemory( &m_rgFxDesc[m_dwNumFX].guidDSFXClass, &guidSFXClass, sizeof(GUID) );
  1387.  
  1388.     m_rgRefGuids[m_dwNumFX] = &rguidInterface;
  1389.     m_rgPtrs[m_dwNumFX] = ppObj;
  1390.  
  1391.     m_dwNumFX++;
  1392.  
  1393.     return S_OK;
  1394. }
  1395.