home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / audio_sdk / src / AudioLib / AudioScript.cpp < prev    next >
C/C++ Source or Header  |  2002-07-02  |  5KB  |  182 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. #include "AudioScript.h"
  12. #include "AudioCommon.h"
  13. #include "AudioMgr.h"
  14.  
  15. using namespace std;
  16. using namespace Audio;
  17.  
  18. IMPLEMENT_POOL(AudioScript);
  19.  
  20.  
  21. //------------------------------------------------------------------------//
  22. AudioScript::AudioScript()
  23. {
  24.     Clear();
  25. }
  26.  
  27. //------------------------------------------------------------------------//
  28. AudioScript::~AudioScript()
  29. {
  30.     Term();
  31. }
  32.  
  33. //------------------------------------------------------------------------//
  34. void AudioScript::Clear()
  35. {
  36.     m_bInitialized = false;
  37.     m_Init.Clear();
  38.     m_pScript = 0;
  39.     m_bQueuePlayback = false;
  40.     m_bLoading = false;
  41.     m_bLoaded = false;
  42. }
  43.  
  44.  
  45. //------------------------------------------------------------------------//
  46. void AudioScript::Term()
  47. {
  48.     Unload();
  49.     Clear();
  50. }
  51.  
  52.  
  53. //------------------------------------------------------------------------//
  54. bool AudioScript::Init(const AudioScriptInit& init)
  55. {
  56.     m_Init = init;
  57.     m_bInitialized = true;
  58.     return true;
  59. }
  60.  
  61.  
  62. //------------------------------------------------------------------------//
  63. void AudioScript::Destroy()
  64. {
  65.     Term();
  66.     AudioScript::DestroyObject(this);
  67. }
  68.  
  69.  
  70. //------------------------------------------------------------------------//
  71. bool AudioScript::Load()
  72. {
  73.     IAudioStream* pStream;
  74.     CreateAudioStream cas(pStream);
  75.     if(!pStream)
  76.         return false;
  77.     
  78.     HRESULT hr = pStream->Open(m_Init.m_sFileName);
  79.     if(FAILED(hr))
  80.         return Error::Handle("Failed to open segment file %s.", m_Init.m_sFileName.c_str());
  81.     
  82.     DMUS_OBJECTDESC      ObjDesc;
  83.     ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
  84.     ObjDesc.guidClass = CLSID_DirectMusicScript;
  85.     ObjDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_STREAM;
  86.     ObjDesc.pStream = pStream;
  87.  
  88.     // Load the data and retrieve the segment interface
  89.     hr = DXAudioMgr()->Loader()->GetObject(
  90.             &ObjDesc, 
  91.             IID_IDirectMusicScript8, 
  92.             (void**) &m_pScript );
  93.     if(FAILED(hr))
  94.     {    
  95.         Unload();
  96.         return Error::Handle("Could not load audio script %s. Error = %s.", 
  97.             m_Init.m_sFileName.c_str(), DXGetErrorString(hr));
  98.     }
  99.  
  100.     hr = m_pScript->Init(DXAudioMgr()->Performance(m_Init.m_bMusic), NULL);
  101.     if(FAILED(hr))
  102.     {
  103.         Unload();
  104.         return Error::Handle("Could not initialize audio script %s.  Error = %s",
  105.             m_Init.m_sFileName.c_str(), DXGetErrorString(hr));
  106.     }
  107.  
  108.     return true;
  109. }
  110.  
  111. //------------------------------------------------------------------------//
  112. bool AudioScript::Unload()
  113. {
  114.     if(m_pScript)
  115.     {
  116.         // Since we're loading and unloading segments dynamically, it is 
  117.         // important to release the loader's internal reference to it.
  118.         HRESULT hr = DXAudioMgr()->Loader()->ReleaseObjectByUnknown(m_pScript);
  119.         if(FAILED(hr))
  120.         {  Error::Handle("Error unloading sound segment from loader.");  }
  121.  
  122.         // Instruct the loader to clear out unused memory.
  123.         DXAudioMgr()->Loader()->CollectGarbage();
  124.  
  125.         // Now release the actual segment
  126.         SAFE_RELEASE(m_pScript);
  127.     }
  128.     return true;
  129. }
  130.  
  131.  
  132.  
  133. //------------------------------------------------------------------------//
  134. bool AudioScript::SetVariable(string sVarName, int32 iVal)
  135. {
  136.     if(!m_pScript)
  137.         return false;
  138.  
  139.     WCHAR wsBuffer[_MAX_PATH];
  140.     ConvertAnsiStringToWide(wsBuffer, sVarName.c_str());
  141.     HRESULT hr = m_pScript->SetVariableNumber(wsBuffer, iVal, NULL);
  142.     if(FAILED(hr))
  143.         return false;
  144.  
  145.     return true;
  146. }
  147.  
  148.  
  149. //------------------------------------------------------------------------//
  150. bool AudioScript::GetVariable(string sVarName, int32& iVal)
  151. {
  152.     if(!m_pScript)
  153.         return false;
  154.  
  155.     WCHAR wsBuffer[_MAX_PATH];
  156.     ConvertAnsiStringToWide(wsBuffer, sVarName.c_str());
  157.     HRESULT hr = m_pScript->GetVariableNumber(wsBuffer, &iVal, NULL);
  158.     if(FAILED(hr))
  159.         return false;
  160.  
  161.     return true;
  162. }
  163.  
  164.  
  165.  
  166. //------------------------------------------------------------------------//
  167. bool AudioScript::CallRoutine(string sRoutineName)
  168. {
  169.     if(!m_pScript)
  170.         return false;
  171.  
  172.     WCHAR wsBuffer[_MAX_PATH];
  173.     ConvertAnsiStringToWide(wsBuffer, sRoutineName.c_str());
  174.     HRESULT hr = m_pScript->CallRoutine(wsBuffer, NULL);
  175.     if(FAILED(hr))
  176.         return false;
  177.  
  178.     return true;
  179. }
  180.  
  181.  
  182.