home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / AudioTest / Segment.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-07-15  |  5.7 KB  |  246 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 "Segment.h"
  15. #include "SegmentOpen.h"
  16. #include "Audio.h"
  17.  
  18. #include "AudioTestDlg.h"
  19. #include "System.h"
  20. #include "Sound2D.h"
  21. #include "Sound3D.h"
  22.  
  23. using namespace Audio;
  24.  
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30.  
  31. #define GET_CURRENT_SEGMENT() \
  32.     int iIndex = m_Segments.GetCurSel();\
  33.     if(iIndex == LB_ERR) return;\
  34.     ISegment* pSegment = static_cast<ISegment*>(m_Segments.GetItemDataPtr(iIndex));\
  35.     if(!pSegment) return;
  36.  
  37.  
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CMusic property page
  40.  
  41. IMPLEMENT_DYNCREATE(CSegment, CPropertyPage)
  42.  
  43. CSegment::CSegment() : CPropertyPage(CSegment::IDD)
  44. {
  45.     //{{AFX_DATA_INIT(CMusic)
  46.         // NOTE: the ClassWizard will add member initialization here
  47.     //}}AFX_DATA_INIT
  48.     m_bInit = false;
  49. }
  50.  
  51. CSegment::~CSegment()
  52. {
  53. }
  54.  
  55. void CSegment::DoDataExchange(CDataExchange* pDX)
  56. {
  57.     CPropertyPage::DoDataExchange(pDX);
  58.     //{{AFX_DATA_MAP(CSegment)
  59.     DDX_Control(pDX, IDC_STOP_SEGMENT, m_Stop);
  60.     DDX_Control(pDX, IDC_PAUSE_SEGMENT, m_Pause);
  61.     DDX_Control(pDX, IDC_PLAY_SEGMENT, m_Play);
  62.     DDX_Control(pDX, IDC_LIST_SEGMENTS, m_Segments);
  63.     //}}AFX_DATA_MAP
  64. }
  65.  
  66.  
  67. BEGIN_MESSAGE_MAP(CSegment, CPropertyPage)
  68.     //{{AFX_MSG_MAP(CSegment)
  69.     ON_WM_DESTROY()
  70.     ON_BN_CLICKED(IDC_SEG_INITIALIZE, OnSegInitialize)
  71.     ON_BN_CLICKED(IDC_SEG_DELETE, OnSegDelete)
  72.     ON_BN_CLICKED(IDC_LOAD_SEGMENT, OnLoadSegment)
  73.     ON_BN_CLICKED(IDC_UNLOAD_SEGMENT, OnUnloadSegment)
  74.     ON_BN_CLICKED(IDC_PLAY_SEGMENT, OnPlaySegment)
  75.     ON_BN_CLICKED(IDC_PAUSE_SEGMENT, OnPauseSegment)
  76.     ON_BN_CLICKED(IDC_STOP_SEGMENT, OnStopSegment)
  77.     ON_WM_HSCROLL()
  78.     ON_LBN_SELCHANGE(IDC_LIST_SEGMENTS, OnSelChangeListSegments)
  79.     ON_LBN_DBLCLK(IDC_LIST_SEGMENTS, OnDblclkListSegments)
  80.     //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82.  
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CMusic message handlers
  85.  
  86. BOOL CSegment::OnInitDialog() 
  87. {
  88.     CPropertyPage::OnInitDialog();
  89.     
  90.     // Load the play button icons
  91.     m_hPlayIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_PLAY));
  92.     m_hPauseIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_PAUSE));
  93.     m_hStopIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_STOP));
  94.  
  95.     // Set the master play control buttons
  96.     m_Play.SetIcon(m_hPlayIcon);
  97.     m_Pause.SetIcon(m_hPauseIcon);
  98.     m_Stop.SetIcon(m_hStopIcon);
  99.  
  100.     m_bInit = true;
  101.  
  102.     return TRUE;  // return TRUE unless you set the focus to a control
  103.                   // EXCEPTION: OCX Property Pages should return FALSE
  104. }
  105.  
  106. void CSegment::ClearList()
  107. {
  108.     if(m_bInit)
  109.     {
  110.         ISegment* pSegment;
  111.         int iSize = m_Segments.GetCount();
  112.         for(int i = 0; i < iSize; i++)
  113.         {
  114.             pSegment = static_cast<ISegment*>(m_Segments.GetItemDataPtr(0));
  115.             pSegment->Destroy();
  116.             m_Segments.DeleteString(0);
  117.         }
  118.         m_Segments.ResetContent();
  119.     }
  120. }
  121.  
  122. void CSegment::OnDestroy() 
  123. {
  124.     CPropertyPage::OnDestroy();
  125.     ClearList();
  126. }
  127.  
  128. void CSegment::OnSegInitialize() 
  129. {
  130.     CSegmentOpen dlg(TRUE);
  131.     if(dlg.DoModal() != IDOK)
  132.         return;
  133.  
  134.     char drive[_MAX_DRIVE];
  135.     char dir[_MAX_DIR];
  136.     char fname[_MAX_FNAME];
  137.     char ext[_MAX_EXT];
  138.  
  139.     POSITION pos = dlg.GetStartPosition();
  140.     CString sPathName;
  141.     while(pos)
  142.     {
  143.         sPathName = dlg.GetNextPathName(pos);
  144.         _splitpath(sPathName, drive, dir, fname, ext);
  145.         SegmentInit init;
  146.  
  147.         init.m_bLooping = dlg.m_bLooping;
  148.         init.m_bMusic = !dlg.m_bSoundFX;
  149.         init.m_sFileName = sPathName;
  150.  
  151.         ISegment* pSegment;
  152.         if(!AudioMgr()->CreateSegment(pSegment))
  153.             return;
  154.         if(!pSegment->Init(init))
  155.         {
  156.             AfxMessageBox("Error initializing segment file");
  157.             return;
  158.         }
  159.         int iIndex = m_Segments.AddString(CString(fname) + CString(ext));
  160.         if(iIndex != LB_ERR)
  161.             m_Segments.SetItemDataPtr(iIndex, pSegment);
  162.     }
  163. }
  164.  
  165. void CSegment::OnSegDelete() 
  166. {
  167.     GET_CURRENT_SEGMENT();
  168.     pSegment->Destroy();
  169.     int iSize = m_Segments.DeleteString(iIndex);
  170.     if(!iSize)
  171.         return;
  172.     if(iIndex > (iSize - 1))
  173.         iIndex = iSize - 1;
  174.     m_Segments.SetCurSel(iIndex);
  175. }
  176.  
  177. void CSegment::OnLoadSegment() 
  178. {
  179.     GET_CURRENT_SEGMENT();
  180.     pSegment->Load();
  181.     m_pTestDlg->m_pSystem->UpdateStats();
  182.     UpdateControls();
  183. }
  184.  
  185. void CSegment::OnUnloadSegment() 
  186. {
  187.     GET_CURRENT_SEGMENT();
  188.     pSegment->Unload();
  189.     m_pTestDlg->m_pSystem->UpdateStats();
  190.     UpdateControls();
  191. }
  192.  
  193. void CSegment::OnPlaySegment() 
  194. {
  195.     GET_CURRENT_SEGMENT();
  196.     pSegment->Play();
  197.     m_pTestDlg->m_pSystem->UpdateStats();
  198.     UpdateControls();
  199. }
  200.  
  201. void CSegment::OnPauseSegment() 
  202. {
  203.     GET_CURRENT_SEGMENT();
  204.     pSegment->Pause();
  205.     m_pTestDlg->m_pSystem->UpdateStats();
  206.     UpdateControls();
  207. }
  208.  
  209. void CSegment::OnStopSegment() 
  210. {
  211.     GET_CURRENT_SEGMENT();
  212.     pSegment->Stop();
  213.     m_pTestDlg->m_pSystem->UpdateStats();
  214.     UpdateControls();
  215. }
  216.  
  217. void CSegment::UpdateControls()
  218. {
  219.     GET_CURRENT_SEGMENT();
  220. }
  221.  
  222. void CSegment::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  223. {
  224.  
  225.     if(pScrollBar->IsKindOf(RUNTIME_CLASS(CSliderCtrl)))
  226.     {
  227.         CSliderCtrl* pSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar);
  228.         if(!pSlider)
  229.             return;
  230.         GET_CURRENT_SEGMENT();
  231.     }
  232.     CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  233. }
  234.  
  235.  
  236. void CSegment::OnSelChangeListSegments() 
  237. {
  238.     UpdateControls();
  239. }
  240.  
  241. void CSegment::OnDblclkListSegments() 
  242. {
  243.     OnPlaySegment();
  244. }
  245.  
  246.