home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / AudioTest / Sound3D.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-07-15  |  9.5 KB  |  391 lines

  1. /***********************************************************\
  2. Copyright (C) James Boer, 2002. 
  3. All rights reserved worldwide.
  4.  
  5. This software is provided "as is" without express or implied
  6. warranties. You may freely copy and compile this source into
  7. applications you distribute provided that the copyright text
  8. below is included in the resulting source code, for example:
  9. "Portions Copyright (C) James Boer, 2002"
  10. \***********************************************************/
  11.  
  12. #include "stdafx.h"
  13. #include "AudioTest.h"
  14. #include "Sound3D.h"
  15. #include "SoundOpen.h"
  16. #include "Audio.h"
  17. #include "EAXBuffer.h"
  18. #include "ZoomFX.h"
  19.  
  20. #include "AudioTestDlg.h"
  21. #include "System.h"
  22. #include "Sound2D.h"
  23. #include "Segment.h"
  24.  
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30.  
  31. using namespace Audio;
  32.  
  33. const int CURSOR_TIMER = 6;
  34.  
  35. #define GET_CURRENT_SOUND() \
  36.     int iIndex = m_3DSounds.GetCurSel();\
  37.     if(iIndex == LB_ERR) return;\
  38.     ISound3D* pSound = static_cast<ISound3D*>(m_3DSounds.GetItemDataPtr(iIndex));\
  39.     if(!pSound) return;
  40.  
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CSound3D property page
  43.  
  44. IMPLEMENT_DYNCREATE(CSound3D, CPropertyPage)
  45.  
  46. CSound3D::CSound3D() : CPropertyPage(CSound3D::IDD)
  47. {
  48.     //{{AFX_DATA_INIT(CSound3D)
  49.         // NOTE: the ClassWizard will add member initialization here
  50.     //}}AFX_DATA_INIT
  51.     m_nCursorTimer = 0;
  52.     m_bInit = false;
  53. }
  54.  
  55. CSound3D::~CSound3D()
  56. {
  57. }
  58.  
  59. void CSound3D::DoDataExchange(CDataExchange* pDX)
  60. {
  61.     CPropertyPage::DoDataExchange(pDX);
  62.     //{{AFX_DATA_MAP(CSound3D)
  63.     DDX_Control(pDX, IDC_SLIDER_SOUND3DPOSZ, m_ZPos);
  64.     DDX_Control(pDX, IDC_SLIDER_SOUND3DPOSY, m_YPos);
  65.     DDX_Control(pDX, IDC_SLIDER_SOUND3DPOSX, m_XPos);
  66.     DDX_Control(pDX, IDC_STOP3D, m_Stop);
  67.     DDX_Control(pDX, IDC_PAUSE3D, m_Pause);
  68.     DDX_Control(pDX, IDC_PLAY3D, m_Play);
  69.     DDX_Control(pDX, IDC_LIST_3DSOUNDS, m_3DSounds);
  70.     DDX_Control(pDX, IDC_SLIDER_SOUND3DCURSOR, m_Cursor);
  71.     DDX_Control(pDX, IDC_SLIDER_SOUND3DPITCH, m_Pitch);
  72.     DDX_Control(pDX, IDC_SLIDER_SOUND3DVOLUME, m_Volume);
  73.     //}}AFX_DATA_MAP
  74. }
  75.  
  76.  
  77. BEGIN_MESSAGE_MAP(CSound3D, CPropertyPage)
  78.     //{{AFX_MSG_MAP(CSound3D)
  79.     ON_BN_CLICKED(IDC_3D_INITIALIZE, On3dInitialize)
  80.     ON_BN_CLICKED(IDC_3D_DELETE, On3dDelete)
  81.     ON_BN_CLICKED(IDC_LOAD3D, OnLoad3d)
  82.     ON_BN_CLICKED(IDC_UNLOAD3D, OnUnload3d)
  83.     ON_BN_CLICKED(IDC_PLAY3D, OnPlay3d)
  84.     ON_BN_CLICKED(IDC_PAUSE3D, OnPause3d)
  85.     ON_BN_CLICKED(IDC_STOP3D, OnStop3d)
  86.     ON_WM_HSCROLL()
  87.     ON_WM_TIMER()
  88.     ON_LBN_SELCHANGE(IDC_LIST_3DSOUNDS, OnSelChangeList3dSounds)
  89.     ON_WM_DESTROY()
  90.     ON_BN_CLICKED(IDC_BUFFER_EAX, OnBufferEAX)
  91.     ON_BN_CLICKED(IDC_ZOOM_FX, OnZoomFx)
  92.     ON_LBN_DBLCLK(IDC_LIST_3DSOUNDS, OnDblclkList3dsounds)
  93.     //}}AFX_MSG_MAP
  94. END_MESSAGE_MAP()
  95.  
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CSound3D message handlers
  98.  
  99. BOOL CSound3D::OnInitDialog() 
  100. {
  101.     CPropertyPage::OnInitDialog();
  102.     
  103.     // Load the play button icons
  104.     m_hPlayIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_PLAY));
  105.     m_hPauseIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_PAUSE));
  106.     m_hStopIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_STOP));
  107.     
  108.     // Set the master play control buttons
  109.     m_Play.SetIcon(m_hPlayIcon);
  110.     m_Pause.SetIcon(m_hPauseIcon);
  111.     m_Stop.SetIcon(m_hStopIcon);
  112.  
  113.     // Set up the volume sliders
  114.     m_Volume.SetRange(0, 10000);
  115.     m_Volume.SetPos(10000);
  116.     m_Volume.Invalidate();
  117.     m_Pitch.SetRange(0, 10000);
  118.     m_Pitch.SetPos(5000);
  119.     m_Pitch.Invalidate();
  120.  
  121.     m_XPos.SetRange(0, 10000, TRUE);
  122.     m_YPos.SetRange(0, 10000, TRUE);
  123.     m_ZPos.SetRange(0, 10000, TRUE);
  124.     m_XPos.SetPos(5000);
  125.     m_YPos.SetPos(5000);
  126.     m_ZPos.SetPos(5000);
  127.  
  128.     m_nCursorTimer = SetTimer(CURSOR_TIMER, 100, NULL);
  129.  
  130.     m_bInit = true;
  131.  
  132.     return TRUE;  // return TRUE unless you set the focus to a control
  133.                   // EXCEPTION: OCX Property Pages should return FALSE
  134. }
  135.  
  136. void CSound3D::ClearList()
  137. {    
  138.     if(m_bInit)
  139.     {
  140.         ISound3D* pSound;
  141.         int iSize = m_3DSounds.GetCount();
  142.         for(int i = 0; i < iSize; i++)
  143.         {
  144.             pSound = static_cast<ISound3D*>(m_3DSounds.GetItemDataPtr(0));
  145.             pSound->Destroy();
  146.             m_3DSounds.DeleteString(0);
  147.         }
  148.         m_3DSounds.ResetContent();
  149.     }
  150. }
  151.  
  152. void CSound3D::On3dInitialize() 
  153. {
  154.     CSoundOpen dlg(TRUE);
  155.     if(dlg.DoModal() != IDOK)
  156.         return;
  157.  
  158.     char drive[_MAX_DRIVE];
  159.     char dir[_MAX_DIR];
  160.     char fname[_MAX_FNAME];
  161.     char ext[_MAX_EXT];
  162.  
  163.     POSITION pos = dlg.GetStartPosition();
  164.     CString sPathName;
  165.     while(pos)
  166.     {
  167.         sPathName = dlg.GetNextPathName(pos);
  168.         _splitpath(sPathName, drive, dir, fname, ext);
  169.         Sound3DInit init;
  170.         init.m_bLooping = dlg.m_bLooping;
  171.         init.m_bStreaming = dlg.m_bStreaming;
  172.         init.m_bMusic = dlg.m_bMusic;
  173.         init.m_sFileName = sPathName;
  174.  
  175.         ISound3D* pSound;
  176.         if(!AudioMgr()->CreateSound3D(pSound))
  177.             return;
  178.         if(!pSound->Init(init))
  179.         {
  180.             AfxMessageBox("Error initializing audio file");
  181.             return;
  182.         }
  183.         int iIndex = m_3DSounds.AddString(CString(fname) + CString(ext));
  184.         if(iIndex != LB_ERR)
  185.             m_3DSounds.SetItemDataPtr(iIndex, pSound);
  186.     }
  187. }
  188.  
  189. void CSound3D::On3dDelete() 
  190. {
  191.     GET_CURRENT_SOUND();
  192.     pSound->Destroy();
  193.     int iSize = m_3DSounds.DeleteString(iIndex);
  194.     if(!iSize)
  195.         return;
  196.     if(iIndex > (iSize - 1))
  197.         iIndex = iSize - 1;
  198.     m_3DSounds.SetCurSel(iIndex);
  199. }
  200.  
  201. void CSound3D::OnLoad3d() 
  202. {
  203.     GET_CURRENT_SOUND();
  204.     if(!pSound->Load())
  205.         AfxMessageBox("Unable to load sound");
  206.  
  207.     m_pTestDlg->m_pSystem->UpdateStats();
  208.     UpdateControls();
  209. }
  210.  
  211. void CSound3D::OnUnload3d() 
  212. {
  213.     GET_CURRENT_SOUND();
  214.     pSound->Unload();
  215.     m_pTestDlg->m_pSystem->UpdateStats();
  216.     UpdateControls();
  217. }
  218.  
  219. void CSound3D::OnPlay3d() 
  220. {
  221.     GET_CURRENT_SOUND();
  222.     if(!pSound->Play())
  223.         AfxMessageBox("Unable to play sound");
  224.     m_pTestDlg->m_pSystem->UpdateStats();
  225.     UpdateControls();
  226. }
  227.  
  228. void CSound3D::OnPause3d() 
  229. {
  230.     GET_CURRENT_SOUND();
  231.     pSound->Pause();
  232. }
  233.  
  234. void CSound3D::OnStop3d() 
  235. {
  236.     GET_CURRENT_SOUND();
  237.     pSound->Stop();
  238. }
  239.  
  240. void CSound3D::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  241. {
  242.     if(pScrollBar->IsKindOf(RUNTIME_CLASS(CSliderCtrl)))
  243.     {
  244.         CSliderCtrl* pSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar);
  245.         if(!pSlider)
  246.             return;
  247.         GET_CURRENT_SOUND();
  248.         if(pSlider == &m_Volume)
  249.         {
  250.             pSound->SetVolume(static_cast<float>(pSlider->GetPos()) / 10000.0f);
  251.         }
  252.         else if(pSlider == &m_Pitch)
  253.         {
  254.             pSound->SetPitch((float(pSlider->GetPos() + 5000.0f) / 10000.0f) );
  255.         }
  256.         else if(pSlider == &m_Cursor)
  257.         {
  258.             pSound->SetReadCursor(nPos);
  259.         }
  260.         else if(pSlider == &m_XPos)
  261.         {
  262.             AUDIOVECTOR pos;
  263.             pSound->GetPosition(pos);
  264.             pos.x = ((float(pSlider->GetPos()) - 5000.0f) / 10000.0f) * 20.0f;
  265.             pSound->SetPosition(pos);
  266.         }
  267.         else if(pSlider == &m_YPos)
  268.         {
  269.             AUDIOVECTOR pos;
  270.             pSound->GetPosition(pos);
  271.             pos.y = ((float(pSlider->GetPos()) - 5000.0f) / 10000.0f) * 20.0f;
  272.             pSound->SetPosition(pos);
  273.         }
  274.         else if(pSlider == &m_ZPos)
  275.         {
  276.             AUDIOVECTOR pos;
  277.             pSound->GetPosition(pos);
  278.             pos.z = ((float(pSlider->GetPos()) - 5000.0f) / 10000.0f) * 20.0f;
  279.             pSound->SetPosition(pos);
  280.         }
  281.     }
  282.     CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  283. }
  284.  
  285. void CSound3D::OnTimer(UINT nIDEvent) 
  286. {
  287.     if(nIDEvent == CURSOR_TIMER)
  288.     {
  289.         GET_CURRENT_SOUND();
  290.  
  291.         unsigned long nVal;
  292.         if(pSound->IsPlaying())
  293.         {
  294.             pSound->GetReadCursor(nVal);
  295.             m_Cursor.SetPos(nVal);
  296.             m_Cursor.Invalidate();
  297.         }
  298.         else
  299.         {
  300.             pSound->GetReadCursor(nVal);
  301.             if(m_Cursor.GetPos() != nVal)
  302.             {
  303.                 m_Cursor.SetPos(nVal);
  304.                 m_Cursor.Invalidate();
  305.             }
  306.         }
  307.     }
  308.  
  309.     CPropertyPage::OnTimer(nIDEvent);
  310. }
  311.  
  312. void CSound3D::UpdateControls()
  313. {
  314.     int iIndex = m_3DSounds.GetCurSel();
  315.     if(iIndex == LB_ERR)
  316.         return;
  317.     ISound3D* pSound = static_cast<ISound3D*>(m_3DSounds.GetItemDataPtr(iIndex));
  318.     if(!pSound) return;
  319.  
  320.     float fVal;
  321.     unsigned long nVal;
  322.     pSound->GetVolume(fVal);
  323.     m_Volume.SetPos(static_cast<int>(fVal * 10000.0f));
  324.     pSound->GetPitch(fVal);
  325.     m_Pitch.SetPos(static_cast<int>((fVal * 10000.0f) - 5000.0f));
  326.     pSound->GetSourceSize(nVal);
  327.     m_Cursor.SetRange(0, nVal);
  328.     AUDIOVECTOR pos;
  329.     pSound->GetPosition(pos);
  330.     m_XPos.SetPos(static_cast<int>(((pos.x / 20.0f) * 10000.0f) + 5000.0f));
  331.     m_YPos.SetPos(static_cast<int>(((pos.y / 20.0f) * 10000.0f) + 5000.0f));
  332.     m_ZPos.SetPos(static_cast<int>(((pos.z / 20.0f) * 10000.0f) + 5000.0f));
  333. }
  334.  
  335. void CSound3D::OnSelChangeList3dSounds() 
  336. {
  337.     UpdateControls();
  338.     
  339.     if(m_pTestDlg->m_pEAXBuffer)
  340.         m_pTestDlg->m_pEAXBuffer->UpdateControls();
  341.     if(m_pTestDlg->m_pZoomFX)
  342.         m_pTestDlg->m_pZoomFX->UpdateControls();
  343.  
  344. }
  345.  
  346. void CSound3D::OnDestroy() 
  347. {
  348.     CPropertyPage::OnDestroy();
  349.     
  350.     if(m_nCursorTimer)
  351.         KillTimer(m_nCursorTimer);
  352.     ClearList();
  353. }
  354.  
  355. void CSound3D::OnBufferEAX() 
  356. {
  357.     if(!m_pTestDlg->m_pEAXBuffer)
  358.     {
  359.         m_pTestDlg->m_pEAXBuffer = new CEAXBuffer;
  360.         m_pTestDlg->m_pEAXBuffer->m_pTestDlg = m_pTestDlg;
  361.         m_pTestDlg->m_pEAXBuffer->Create(IDD_EAX_BUFFER, this);
  362.         m_pTestDlg->m_pEAXBuffer->ShowWindow(SW_SHOW);
  363.     }
  364. }
  365.  
  366. void CSound3D::OnZoomFx() 
  367. {
  368.     if(!m_pTestDlg->m_pZoomFX)
  369.     {
  370.         m_pTestDlg->m_pZoomFX = new CZoomFX;
  371.         m_pTestDlg->m_pZoomFX->m_pTestDlg = m_pTestDlg;
  372.         m_pTestDlg->m_pZoomFX->Create(IDD_ZOOMFX, this);
  373.         m_pTestDlg->m_pZoomFX->ShowWindow(SW_SHOW);
  374.     }
  375. }
  376.  
  377. ISound3D* CSound3D::GetCurrentSound()
  378. {
  379.     int iIndex = m_3DSounds.GetCurSel();
  380.     if(iIndex == LB_ERR) 
  381.         return NULL;
  382.     ISound3D* pSound = static_cast<ISound3D*>(m_3DSounds.GetItemDataPtr(iIndex));
  383.     return pSound;
  384. }
  385.  
  386.  
  387. void CSound3D::OnDblclkList3dsounds() 
  388. {
  389.     OnPlay3d();    
  390. }
  391.