home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / AudioTest / EAXListener.cpp < prev    next >
C/C++ Source or Header  |  2002-06-25  |  15KB  |  464 lines

  1. // EAXListener.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "audiotest.h"
  6. #include "AudioTestDlg.h"
  7. #include "EAXListener.h"
  8.  
  9. #include "Audio.h"
  10.  
  11. using namespace Audio;
  12.  
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18.  
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CEAXListener dialog
  21.  
  22.  
  23. CEAXListener::CEAXListener(CWnd* pParent /*=NULL*/)
  24.     : CDialog(CEAXListener::IDD, pParent)
  25. {
  26.     //{{AFX_DATA_INIT(CEAXListener)
  27.         // NOTE: the ClassWizard will add member initialization here
  28.     //}}AFX_DATA_INIT
  29.     m_pTestDlg = 0;
  30. }
  31.  
  32.  
  33. void CEAXListener::DoDataExchange(CDataExchange* pDX)
  34. {
  35.     CDialog::DoDataExchange(pDX);
  36.     //{{AFX_DATA_MAP(CEAXListener)
  37.     DDX_Control(pDX, IDC_SLIDER_ROOM_VOLUMEHF, m_SliderRoomVolumeHF);
  38.     DDX_Control(pDX, IDC_SLIDER_ROOM_VOLUME, m_SliderRoomVolume);
  39.     DDX_Control(pDX, IDC_SLIDER_ROOM_ROLLOFF_FACTOR, m_SliderRoomRolloffFactor);
  40.     DDX_Control(pDX, IDC_SLIDER_REVERB_VOLUME, m_SliderReverbVolume);
  41.     DDX_Control(pDX, IDC_SLIDER_REVERB_DELAY, m_SliderReverbDelay);
  42.     DDX_Control(pDX, IDC_SLIDER_REFLECTIONS_VOLUME, m_SliderReflectionsVolume);
  43.     DDX_Control(pDX, IDC_SLIDER_REFLECTIONS_DELAY, m_SliderReflectionsDelay);
  44.     DDX_Control(pDX, IDC_SLIDER_ENVIRONMENT_SIZE, m_SliderEnvironmentSize);
  45.     DDX_Control(pDX, IDC_SLIDER_DIFFUSION, m_SliderDiffusion);
  46.     DDX_Control(pDX, IDC_SLIDER_DECAY_TIME, m_SliderDecayTime);
  47.     DDX_Control(pDX, IDC_SLIDER_DECAY_HF_RATIO, m_SliderDecayHFRatio);
  48.     DDX_Control(pDX, IDC_SLIDER_AIR_ABSORPTION_HF, m_SliderAirAbsorptionHF);
  49.     DDX_Control(pDX, IDC_EDIT_ROOM_VOLUMEHF, m_EditRoomVolumeHF);
  50.     DDX_Control(pDX, IDC_EDIT_ROOM_VOLUME, m_EditRoomVolume);
  51.     DDX_Control(pDX, IDC_EDIT_ROOM_ROLLOFF_FACTOR, m_EditRoomRolloffFactor);
  52.     DDX_Control(pDX, IDC_EDIT_REVERB_VOLUME, m_EditReverbVolume);
  53.     DDX_Control(pDX, IDC_EDIT_REVERB_DELAY, m_EditReverbDelay);
  54.     DDX_Control(pDX, IDC_EDIT_REFLECTIONS_VOLUME, m_EditReflectionsVolume);
  55.     DDX_Control(pDX, IDC_EDIT_REFLECTIONS_DELAY, m_EditReflectionsDelay);
  56.     DDX_Control(pDX, IDC_EDIT_ENVIRONMENT_SIZE, m_EditEnvironmentSize);
  57.     DDX_Control(pDX, IDC_EDIT_DIFFUSION, m_EditDiffusion);
  58.     DDX_Control(pDX, IDC_EDIT_DECAY_TIME, m_EditDecayTime);
  59.     DDX_Control(pDX, IDC_EDIT_DECAY_HF_RATIO, m_EditDecayHFRatio);
  60.     DDX_Control(pDX, IDC_EDIT_AIR_ABSORPTION_HF, m_EditAirAbsorptionHF);
  61.     DDX_Control(pDX, IDC_CHECK_SCALE_REVERB_VOLUME, m_CheckScaleReverbVolume);
  62.     DDX_Control(pDX, IDC_CHECK_SCALE_REVERB_DELAY, m_CheckScaleReverbDelay);
  63.     DDX_Control(pDX, IDC_CHECK_SCALE_REFLECTIONS_VOLUME, m_CheckScaleReflectionsVolume);
  64.     DDX_Control(pDX, IDC_CHECK_SCALE_REFLECTIONS_DELAY, m_CheckScaleReflectionsDelay);
  65.     DDX_Control(pDX, IDC_CHECK_SCALE_DECAY_TIME, m_CheckScaleDecayTime);
  66.     DDX_Control(pDX, IDC_CHECK_DECAY_HF_LIMIT, m_CheckDecayHFLimit);
  67.     DDX_Control(pDX, IDC_COMBO_ENVIRONMENT_PRESET, m_ComboEnvironmentPreset);
  68.     //}}AFX_DATA_MAP
  69. }
  70.  
  71.  
  72. BEGIN_MESSAGE_MAP(CEAXListener, CDialog)
  73.     //{{AFX_MSG_MAP(CEAXListener)
  74.     ON_WM_HSCROLL()
  75.     ON_BN_CLICKED(IDC_CHECK_SCALE_DECAY_TIME, OnCheckScaleDecayTime)
  76.     ON_BN_CLICKED(IDC_CHECK_SCALE_REFLECTIONS_VOLUME, OnCheckScaleReflectionsVolume)
  77.     ON_BN_CLICKED(IDC_CHECK_SCALE_REFLECTIONS_DELAY, OnCheckScaleReflectionsDelay)
  78.     ON_BN_CLICKED(IDC_CHECK_SCALE_REVERB_VOLUME, OnCheckScaleReverbVolume)
  79.     ON_BN_CLICKED(IDC_CHECK_SCALE_REVERB_DELAY, OnCheckScaleReverbDelay)
  80.     ON_BN_CLICKED(IDC_CHECK_DECAY_HF_LIMIT, OnCheckDecayHFLimit)
  81.     ON_CBN_SELCHANGE(IDC_COMBO_ENVIRONMENT_PRESET, OnSelchangeComboEnvironmentPreset)
  82.     //}}AFX_MSG_MAP
  83. END_MESSAGE_MAP()
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CEAXListener message handlers
  87.  
  88. BOOL CEAXListener::OnInitDialog() 
  89. {
  90.     CDialog::OnInitDialog();
  91.     
  92.     m_SliderRoomVolumeHF.SetRange(-10000, 0, TRUE);
  93.     m_SliderRoomVolume.SetRange(-10000, 0, TRUE);
  94.     m_SliderRoomRolloffFactor.SetRange(0, 1000, TRUE);        // times 100
  95.     m_SliderReverbVolume.SetRange(-10000, 2000, TRUE);
  96.     m_SliderReverbDelay.SetRange(0, 100, TRUE);                // times 1000
  97.     m_SliderReflectionsVolume.SetRange(-10000, 1000, TRUE);
  98.     m_SliderReflectionsDelay.SetRange(0, 300, TRUE);            // times 1000
  99.     m_SliderEnvironmentSize.SetRange(0, 10000, TRUE);        // times 100
  100.     m_SliderDiffusion.SetRange(0, 100, TRUE);                // times 100
  101.     m_SliderDecayTime.SetRange(10, 2000, TRUE);                // times 100
  102.     m_SliderDecayHFRatio.SetRange(10, 200, TRUE);            // times 100
  103.     m_SliderAirAbsorptionHF.SetRange(-10000, 0, TRUE);        // times 100
  104.  
  105.     m_ComboEnvironmentPreset.AddString("Generic");    
  106.     m_ComboEnvironmentPreset.AddString("Padded Cell");    
  107.     m_ComboEnvironmentPreset.AddString("Room");    
  108.     m_ComboEnvironmentPreset.AddString("Bathroom");    
  109.     m_ComboEnvironmentPreset.AddString("Living Room");    
  110.     m_ComboEnvironmentPreset.AddString("Stone Room");    
  111.     m_ComboEnvironmentPreset.AddString("Auditorium");    
  112.     m_ComboEnvironmentPreset.AddString("Concert Hall");    
  113.     m_ComboEnvironmentPreset.AddString("Cave");    
  114.     m_ComboEnvironmentPreset.AddString("Arena");    
  115.     m_ComboEnvironmentPreset.AddString("Hangar");    
  116.     m_ComboEnvironmentPreset.AddString("Carpeted Hallway");    
  117.     m_ComboEnvironmentPreset.AddString("Hallway");    
  118.     m_ComboEnvironmentPreset.AddString("Stone Corridor");    
  119.     m_ComboEnvironmentPreset.AddString("Alley");    
  120.     m_ComboEnvironmentPreset.AddString("Forest");    
  121.     m_ComboEnvironmentPreset.AddString("City");    
  122.     m_ComboEnvironmentPreset.AddString("Mountains");    
  123.     m_ComboEnvironmentPreset.AddString("Quarry");    
  124.     m_ComboEnvironmentPreset.AddString("Plain");    
  125.     m_ComboEnvironmentPreset.AddString("Parking Lot");    
  126.     m_ComboEnvironmentPreset.AddString("Sewer Pipe");    
  127.     m_ComboEnvironmentPreset.AddString("Underwater");    
  128.     m_ComboEnvironmentPreset.AddString("Drugged");    
  129.     m_ComboEnvironmentPreset.AddString("Dizzy");    
  130.     m_ComboEnvironmentPreset.AddString("Psychotic");    
  131.  
  132.     UpdateControls();
  133.     
  134.     return TRUE;  // return TRUE unless you set the focus to a control
  135.                   // EXCEPTION: OCX Property Pages should return FALSE
  136. }
  137.  
  138. void CEAXListener::PostNcDestroy() 
  139. {
  140.     CDialog::PostNcDestroy();
  141.     if(m_pTestDlg)
  142.         m_pTestDlg->m_pEAXListener = 0;
  143.     delete this;
  144. }
  145.  
  146. void CEAXListener::OnOK() 
  147. {
  148.     CDialog::DestroyWindow();
  149. }
  150.  
  151. void CEAXListener::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  152. {
  153.     if(pScrollBar->IsKindOf(RUNTIME_CLASS(CSliderCtrl)))
  154.     {
  155.         CSliderCtrl* pSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar);
  156.         if(!pSlider)
  157.             return;
  158.         IListener* pListener = 0;
  159.         AudioMgr()->GetListener(pListener);
  160.         if(pSlider == &m_SliderRoomVolumeHF)
  161.         {
  162.             if(pListener)
  163.                 pListener->EAX()->SetRoomHF(pSlider->GetPos());
  164.             else
  165.                 m_Props.lRoomHF = pSlider->GetPos();
  166.         }
  167.         else if(pSlider == &m_SliderRoomVolume)
  168.         {
  169.             if(pListener)
  170.                 pListener->EAX()->SetRoom(pSlider->GetPos());
  171.             else
  172.                 m_Props.lRoom = pSlider->GetPos();
  173.         }
  174.         else if(pSlider == &m_SliderRoomRolloffFactor)
  175.         {
  176.             if(pListener)
  177.                 pListener->EAX()->SetRoomRolloffFactor(float(pSlider->GetPos()) / 100.0f);
  178.             else
  179.                 m_Props.flRoomRolloffFactor = float(pSlider->GetPos()) / 100.0f;
  180.         }
  181.         else if(pSlider == &m_SliderReverbVolume)
  182.         {
  183.             if(pListener)
  184.                 pListener->EAX()->SetReverb(pSlider->GetPos());
  185.             else
  186.                 m_Props.lReverb = pSlider->GetPos();
  187.         }
  188.         else if(pSlider == &m_SliderReverbDelay)
  189.         {
  190.             if(pListener)
  191.                 pListener->EAX()->SetReverbDelay(float(pSlider->GetPos()) / 1000.0f);
  192.             else
  193.                 m_Props.flReverbDelay = float(pSlider->GetPos()) / 1000.0f;
  194.         }
  195.         else if(pSlider == &m_SliderReflectionsVolume)
  196.         {
  197.             if(pListener)
  198.                 pListener->EAX()->SetReflections(pSlider->GetPos());
  199.             else
  200.                 m_Props.lReflections = pSlider->GetPos();
  201.         }
  202.         else if(pSlider == &m_SliderReflectionsDelay)
  203.         {
  204.             if(pListener)
  205.                 pListener->EAX()->SetReflectionsDelay(float(pSlider->GetPos()) / 1000.0f);
  206.             else
  207.                 m_Props.flReflectionsDelay = float(pSlider->GetPos()) / 1000.0f;
  208.         }
  209.         else if(pSlider == &m_SliderEnvironmentSize)
  210.         {
  211.             if(pListener)
  212.                 pListener->EAX()->SetEnvironmentSize(float(pSlider->GetPos()) / 100.0f);
  213.             else
  214.                 m_Props.flEnvironmentSize = float(pSlider->GetPos()) / 100.0f;
  215.         }
  216.         else if(pSlider == &m_SliderDiffusion)
  217.         {
  218.             if(pListener)
  219.                 pListener->EAX()->SetEnvironmentDiffusion(float(pSlider->GetPos()) / 100.0f);
  220.             else
  221.                 m_Props.flEnvironmentDiffusion = float(pSlider->GetPos()) / 100.0f;
  222.         }
  223.         else if(pSlider == &m_SliderDecayTime)
  224.         {
  225.             if(pListener)
  226.                 pListener->EAX()->SetDecayTime(float(pSlider->GetPos()) / 100.0f);
  227.             else
  228.                 m_Props.flDecayTime = float(pSlider->GetPos()) / 100.0f;
  229.         }
  230.         else if(pSlider == &m_SliderDecayHFRatio)
  231.         {
  232.             if(pListener)
  233.                 pListener->EAX()->SetDecayHFRatio(float(pSlider->GetPos()) / 100.0f);
  234.             else
  235.                 m_Props.flDecayHFRatio = float(pSlider->GetPos()) / 100.0f;
  236.         }
  237.         else if(pSlider == &m_SliderAirAbsorptionHF)
  238.         {
  239.             if(pListener)
  240.                 pListener->EAX()->SetAirAbsorptionHF(float(pSlider->GetPos()) / 100.0f);
  241.             else
  242.                 m_Props.flAirAbsorptionHF = float(pSlider->GetPos()) / 100.0f;
  243.         }
  244.  
  245.         UpdateControls();
  246.     }
  247.     
  248.     CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
  249. }
  250.  
  251. void CEAXListener::UpdateControls()
  252. {
  253.     IListener* pListener = 0;
  254.     AudioMgr()->GetListener(pListener);
  255.  
  256.     if(pListener)
  257.         pListener->EAX()->GetProperties(m_Props);
  258.  
  259.     m_ComboEnvironmentPreset.SetCurSel(m_Props.dwEnvironment);
  260.  
  261.     CString sVal;
  262.  
  263.     m_SliderRoomVolumeHF.SetPos(m_Props.lRoomHF);
  264.     sVal.Format("%d", m_Props.lRoomHF);
  265.     m_EditRoomVolumeHF.SetWindowText(sVal);
  266.  
  267.     m_SliderRoomVolume.SetPos(m_Props.lRoom);
  268.     sVal.Format("%d", m_Props.lRoom);
  269.     m_EditRoomVolume.SetWindowText(sVal);
  270.  
  271.     m_SliderRoomRolloffFactor.SetPos(m_Props.flRoomRolloffFactor * 100);
  272.     sVal.Format("%.2f", m_Props.flRoomRolloffFactor);
  273.     m_EditRoomRolloffFactor.SetWindowText(sVal);
  274.  
  275.     m_SliderReverbVolume.SetPos(m_Props.lReverb);
  276.     sVal.Format("%d", m_Props.lReverb);
  277.     m_EditReverbVolume.SetWindowText(sVal);
  278.  
  279.     m_SliderReverbDelay.SetPos(m_Props.flReverbDelay * 1000);
  280.     sVal.Format("%.3f", m_Props.flReverbDelay);
  281.     m_EditReverbDelay.SetWindowText(sVal);
  282.  
  283.     m_SliderReflectionsVolume.SetPos(m_Props.lReflections);
  284.     sVal.Format("%d", m_Props.lReflections);
  285.     m_EditReflectionsVolume.SetWindowText(sVal);
  286.  
  287.     m_SliderReflectionsDelay.SetPos(m_Props.flReflectionsDelay * 1000);
  288.     sVal.Format("%.3f", m_Props.flReflectionsDelay);
  289.     m_EditReflectionsDelay.SetWindowText(sVal);
  290.  
  291.     m_SliderEnvironmentSize.SetPos(m_Props.flEnvironmentSize * 100);
  292.     sVal.Format("%.2f", m_Props.flEnvironmentSize);
  293.     m_EditEnvironmentSize.SetWindowText(sVal);
  294.  
  295.     m_SliderDiffusion.SetPos(m_Props.flEnvironmentDiffusion * 100);
  296.     sVal.Format("%.2f", m_Props.flEnvironmentDiffusion);
  297.     m_EditDiffusion.SetWindowText(sVal);
  298.  
  299.     m_SliderDecayTime.SetPos(m_Props.flDecayTime * 100);
  300.     sVal.Format("%.2f", m_Props.flDecayTime);
  301.     m_EditDecayTime.SetWindowText(sVal);
  302.  
  303.     m_SliderDecayHFRatio.SetPos(m_Props.flDecayHFRatio * 100);
  304.     sVal.Format("%.2f", m_Props.flDecayHFRatio);
  305.     m_EditDecayHFRatio.SetWindowText(sVal);
  306.  
  307.     m_SliderAirAbsorptionHF.SetPos(m_Props.flAirAbsorptionHF * 100);
  308.     sVal.Format("%.2f", m_Props.flAirAbsorptionHF);
  309.     m_EditAirAbsorptionHF.SetWindowText(sVal);
  310.  
  311.     if((m_Props.dwFlags & EAXLISTENERFLAGS_DECAYTIMESCALE) == EAXLISTENERFLAGS_DECAYTIMESCALE)
  312.         m_CheckScaleDecayTime.SetCheck(1);
  313.     else
  314.         m_CheckScaleDecayTime.SetCheck(0);
  315.  
  316.     if((m_Props.dwFlags & EAXLISTENERFLAGS_REFLECTIONSSCALE) == EAXLISTENERFLAGS_REFLECTIONSSCALE)
  317.         m_CheckScaleReflectionsVolume.SetCheck(1);
  318.     else
  319.         m_CheckScaleReflectionsVolume.SetCheck(0);
  320.  
  321.     if((m_Props.dwFlags & EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE) == EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE)
  322.         m_CheckScaleReflectionsDelay.SetCheck(1);
  323.     else
  324.         m_CheckScaleReflectionsDelay.SetCheck(0);
  325.  
  326.     if((m_Props.dwFlags & EAXLISTENERFLAGS_REVERBSCALE) == EAXLISTENERFLAGS_REVERBSCALE)
  327.         m_CheckScaleReverbVolume.SetCheck(1);
  328.     else
  329.         m_CheckScaleReverbVolume.SetCheck(0);
  330.  
  331.     if((m_Props.dwFlags & EAXLISTENERFLAGS_REVERBDELAYSCALE) == EAXLISTENERFLAGS_REVERBDELAYSCALE)
  332.         m_CheckScaleReverbDelay.SetCheck(1);
  333.     else
  334.         m_CheckScaleReverbDelay.SetCheck(0);
  335.  
  336.     if((m_Props.dwFlags & EAXLISTENERFLAGS_DECAYHFLIMIT) == EAXLISTENERFLAGS_DECAYHFLIMIT)
  337.         m_CheckDecayHFLimit.SetCheck(1);
  338.     else
  339.         m_CheckDecayHFLimit.SetCheck(0);
  340.  
  341.  
  342.  
  343. }
  344.  
  345.  
  346. void CEAXListener::OnCheckScaleDecayTime() 
  347. {
  348.     IListener* pListener = 0;
  349.     AudioMgr()->GetListener(pListener);
  350.  
  351.     if(pListener)
  352.         pListener->EAX()->GetProperties(m_Props);
  353.  
  354.     if(m_CheckScaleDecayTime.GetCheck())
  355.         m_Props.dwFlags |= EAXLISTENERFLAGS_DECAYTIMESCALE;
  356.     else
  357.         m_Props.dwFlags &= ~EAXLISTENERFLAGS_DECAYTIMESCALE;
  358.  
  359.     if(pListener)
  360.         pListener->EAX()->SetFlags(m_Props.dwFlags);
  361. }
  362.  
  363. void CEAXListener::OnCheckScaleReflectionsVolume() 
  364. {
  365.     IListener* pListener = 0;
  366.     AudioMgr()->GetListener(pListener);
  367.  
  368.     if(pListener)
  369.         pListener->EAX()->GetProperties(m_Props);
  370.  
  371.     if(m_CheckScaleReflectionsVolume.GetCheck())
  372.         m_Props.dwFlags |= EAXLISTENERFLAGS_REFLECTIONSSCALE;
  373.     else
  374.         m_Props.dwFlags &= ~EAXLISTENERFLAGS_REFLECTIONSSCALE;
  375.  
  376.     if(pListener)
  377.         pListener->EAX()->SetFlags(m_Props.dwFlags);
  378. }
  379.  
  380. void CEAXListener::OnCheckScaleReflectionsDelay() 
  381. {
  382.     IListener* pListener = 0;
  383.     AudioMgr()->GetListener(pListener);
  384.  
  385.     if(pListener)
  386.         pListener->EAX()->GetProperties(m_Props);
  387.  
  388.     if(m_CheckScaleReflectionsDelay.GetCheck())
  389.         m_Props.dwFlags |= EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE;
  390.     else
  391.         m_Props.dwFlags &= ~EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE;
  392.  
  393.     if(pListener)
  394.         pListener->EAX()->SetFlags(m_Props.dwFlags);
  395. }
  396.  
  397. void CEAXListener::OnCheckScaleReverbVolume() 
  398. {
  399.     IListener* pListener = 0;
  400.     AudioMgr()->GetListener(pListener);
  401.  
  402.     if(pListener)
  403.         pListener->EAX()->GetProperties(m_Props);
  404.  
  405.     if(m_CheckScaleReverbVolume.GetCheck())
  406.         m_Props.dwFlags |= EAXLISTENERFLAGS_REVERBSCALE;
  407.     else
  408.         m_Props.dwFlags &= ~EAXLISTENERFLAGS_REVERBSCALE;
  409.  
  410.     if(pListener)
  411.         pListener->EAX()->SetFlags(m_Props.dwFlags);
  412. }
  413.  
  414. void CEAXListener::OnCheckScaleReverbDelay() 
  415. {
  416.     IListener* pListener = 0;
  417.     AudioMgr()->GetListener(pListener);
  418.  
  419.     if(pListener)
  420.         pListener->EAX()->GetProperties(m_Props);
  421.  
  422.     if(m_CheckScaleReverbDelay.GetCheck())
  423.         m_Props.dwFlags |= EAXLISTENERFLAGS_REVERBDELAYSCALE;
  424.     else
  425.         m_Props.dwFlags &= ~EAXLISTENERFLAGS_REVERBDELAYSCALE;
  426.  
  427.     if(pListener)
  428.         pListener->EAX()->SetFlags(m_Props.dwFlags);
  429. }
  430.  
  431. void CEAXListener::OnCheckDecayHFLimit() 
  432. {
  433.     IListener* pListener = 0;
  434.     AudioMgr()->GetListener(pListener);
  435.  
  436.     if(pListener)
  437.         pListener->EAX()->GetProperties(m_Props);
  438.  
  439.     if(m_CheckDecayHFLimit.GetCheck())
  440.         m_Props.dwFlags |= EAXLISTENERFLAGS_DECAYHFLIMIT;
  441.     else
  442.         m_Props.dwFlags &= ~EAXLISTENERFLAGS_DECAYHFLIMIT;
  443.  
  444.     if(pListener)
  445.         pListener->EAX()->SetFlags(m_Props.dwFlags);
  446. }
  447.  
  448.  
  449. void CEAXListener::OnSelchangeComboEnvironmentPreset() 
  450. {
  451.     IListener* pListener = 0;
  452.     AudioMgr()->GetListener(pListener);
  453.  
  454.     if(pListener)
  455.         pListener->EAX()->GetProperties(m_Props);
  456.  
  457.     m_Props.dwEnvironment = m_ComboEnvironmentPreset.GetCurSel();    
  458.     if(pListener)
  459.         pListener->EAX()->SetEnvironment(m_ComboEnvironmentPreset.GetCurSel());
  460.  
  461.     UpdateControls();
  462.     
  463. }
  464.