home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Extras / Sensaura / SDK1.0 / data1.cab / Example_Files / ZoomFX / buffer.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-13  |  9.4 KB  |  384 lines

  1. /*
  2.     Company:            Sensaura Ltd
  3.     Copyright:          (C) 1999
  4.  
  5.     File Name:            buffer.cpp
  6.     File Description:    Source file for implementation of Buffer class for a DirectSound buffer 
  7.                         with ZoomFX support
  8.     Author:                Adam Philp
  9.     Last Update:        04-JAN-00
  10.  
  11.     Target Compiler:    Microsoft Visual C++ Version 5.0
  12. */
  13.  
  14. /////////////////////// Included files ////////////////////////////////////////////////////////////
  15.  
  16. #include <windows.h>
  17.  
  18. #include "buffer.h"
  19. #include "directx.h"
  20. #include "debug.h"
  21.  
  22. /////////////////////// Buffer class implementation ///////////////////////////////////////////////
  23.  
  24. Buffer::Buffer()
  25. {
  26.     PTRACE("Buffer::Buffer()");
  27.  
  28.     m_pBuffer = NULL;
  29.     m_p3dBuffer = NULL;
  30.     m_pKsPropertySet = NULL;
  31. }
  32.  
  33. Buffer::~Buffer()
  34. {
  35.     PTRACE("Buffer::~Buffer()");
  36. }
  37.  
  38. /////////////////////// Buffer public member functions ////////////////////////////////////////////
  39.  
  40. /*
  41.     Function:        Create
  42.     Description:    Create a DirectSound3D buffer from the supplied WAVE audio file.  Get a 
  43.                     property set interface from the 3D buffer for ZoomFX API support
  44. */
  45.  
  46. bool Buffer::Create(const char* pFileName, LPDIRECTSOUND pDirectSound)
  47. {
  48.      DSBUFFERDESC    dsbd;                    
  49.     UINT            cbSize;
  50.     LPBYTE            pData;
  51.     LPVOID            pMem1, pMem2;
  52.     DWORD            dwSize1, dwSize2;
  53.  
  54.     ASSERT(m_pBuffer == NULL);            
  55.     ASSERT(m_p3dBuffer == NULL);
  56.     ASSERT(m_pKsPropertySet == NULL);
  57.     if(m_pBuffer != NULL || m_p3dBuffer != NULL || m_pKsPropertySet != NULL)
  58.         return false;                    // Fail if the buffer is already created
  59.  
  60.     if (!m_File.Open(pFileName))        // First, can we open the WAV file?
  61.     {
  62.         TRACEERROR("BufferDlg::Create(): unable to open wave file");
  63.         return false;
  64.     }
  65.     
  66.     cbSize = m_File.GetDataSize();
  67.  
  68.     dsbd.dwSize = sizeof(DSBUFFERDESC);    // We can read the file, so set up the buffer description
  69.     dsbd.dwFlags = DSBCAPS_CTRL3D|DSBCAPS_LOCHARDWARE|DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME;
  70.     dsbd.dwBufferBytes = cbSize;
  71.     dsbd.dwReserved = 0;
  72.     dsbd.lpwfxFormat = m_File.m_pwfmt;                
  73.                                         // Now create the DirectSound buffer
  74.     TRY_DS(pDirectSound->CreateSoundBuffer(&dsbd, &m_pBuffer, NULL))
  75.  
  76.     pData = new BYTE[cbSize];            // Get the WAV audio data from the file
  77.     if(pData == NULL)
  78.         return false;
  79.  
  80.     m_File.Cue();
  81.     m_File.Read(pData, cbSize);
  82.                                         // Copy the audio data to the buffer
  83.     TRY_DS(m_pBuffer->Lock(0, dsbd.dwBufferBytes, &pMem1, &dwSize1, &pMem2, &dwSize2, 0))
  84.     CopyMemory(pMem1, pData, dwSize1);
  85.     if(dwSize2)
  86.         CopyMemory(pMem2, LPVOID(pData+dwSize1), dwSize2);
  87.     
  88.     TRY_DS(m_pBuffer->Unlock(pMem1, dwSize1, pMem2, dwSize2))
  89.  
  90.     delete pData;
  91.                                         // Now get a DirectSound3DBuffer interface
  92.     if(m_pBuffer->QueryInterface(IID_IDirectSound3DBuffer, (void**)&m_p3dBuffer) != S_OK)
  93.         return false;
  94.  
  95.     TRY_DS(m_p3dBuffer->SetMode(DS3DMODE_NORMAL, DS3D_IMMEDIATE))
  96.                                         // Now get the property set interface
  97.     m_pBuffer->QueryInterface(IID_IKsPropertySet, (void**)&m_pKsPropertySet);
  98.     return true;                        // Doesn't matter at this stage if we don't get interface
  99.  
  100. DS_ERROR:
  101.     return false;
  102. }
  103.  
  104. /*
  105.     Function:        Destroy
  106.     Description:    Destroy the DirectSound3D buffer and property set interface
  107. */
  108.  
  109. void Buffer::Destroy()
  110. {
  111.     RELEASE(m_pKsPropertySet)
  112.     RELEASE(m_p3dBuffer)
  113.     RELEASE(m_pBuffer)
  114. }
  115.  
  116. /*
  117.     Function:        IsPlaying
  118.     Description:    Returns true if the buffer is currently playing
  119. */
  120.  
  121. bool Buffer::IsPlaying()
  122. {
  123.     DWORD dwStatus;
  124.  
  125.     if(m_pBuffer == NULL)
  126.         return false;
  127.  
  128.     TRY_DS(m_pBuffer->GetStatus(&dwStatus))
  129.     if(dwStatus & DSBSTATUS_PLAYING)
  130.         return true;
  131.  
  132. DS_ERROR:
  133.     return false;
  134. }
  135.  
  136. /*
  137.     Function:        Play
  138.     Description:    Start playing the buffer
  139. */
  140.  
  141. bool Buffer::Play(bool bLooping)
  142. {
  143.     if(m_pBuffer == NULL)
  144.         return false;
  145.  
  146.     RETURN_DS(m_pBuffer->Play(0, 0, bLooping ? DSBPLAY_LOOPING : 0))
  147. }
  148.  
  149. /*
  150.     Function:        Rewind
  151.     Description:    Set the play cursor to the start of the buffer
  152. */
  153.  
  154. bool Buffer::Rewind()
  155. {
  156.     if(m_pBuffer == NULL)
  157.         return false;
  158.  
  159.     RETURN_DS(m_pBuffer->SetCurrentPosition(0))
  160. }
  161.  
  162.  
  163. bool Buffer::Stop()
  164. {
  165.     if(m_pBuffer == NULL)
  166.         return false;
  167.  
  168.     RETURN_DS(m_pBuffer->Stop())
  169. }
  170.  
  171. /*
  172.     Wrapper functions for IDirectSoundBuffer and IDirectSound3DBuffer methods
  173. */
  174.  
  175. bool Buffer::GetCaps(LPDSBCAPS pCaps)            
  176. {
  177.     if(pCaps == NULL || m_pBuffer == NULL)
  178.         return false;
  179.  
  180.     pCaps->dwSize = sizeof(DSBCAPS);    // Automatically set the size parameters
  181.     RETURN_DS(m_pBuffer->GetCaps(pCaps))
  182. }
  183.  
  184. bool Buffer::GetCurrentPosition(DWORD* pdwPlayCursor, DWORD* pdwWriteCursor)
  185. {
  186.     if(m_pBuffer == NULL)
  187.         return false;
  188.  
  189.     RETURN_DS(m_pBuffer->GetCurrentPosition(pdwPlayCursor, pdwWriteCursor))
  190. }
  191.  
  192. bool Buffer::GetFormat(LPWAVEFORMATEX pwfx)
  193. {
  194.     if(pwfx == NULL ||m_pBuffer == NULL)                
  195.         return false;                    
  196.  
  197.     RETURN_DS(m_pBuffer->GetFormat(pwfx, sizeof(WAVEFORMATEX), NULL))
  198. }
  199.  
  200. bool Buffer::GetFrequency(DWORD* pdwFrequency)
  201. {
  202.     if(pdwFrequency == NULL ||m_pBuffer == NULL)                
  203.         return false;
  204.  
  205.     RETURN_DS(m_pBuffer->GetFrequency(pdwFrequency))
  206. }
  207.  
  208. bool Buffer::GetVolume(long* plVolume)
  209. {
  210.     if(plVolume == NULL || m_pBuffer == NULL)
  211.         return false;
  212.  
  213.     RETURN_DS(m_pBuffer->GetVolume(plVolume))
  214. }
  215.  
  216. bool Buffer::GetAllParameters(LPDS3DBUFFER pParams)
  217. {
  218.     if(m_p3dBuffer == NULL || pParams == NULL)
  219.         return false;
  220.  
  221.     pParams->dwSize = sizeof(DS3DBUFFER);
  222.     RETURN_DS(m_p3dBuffer->GetAllParameters(pParams))
  223. }
  224.  
  225. bool Buffer::SetFrequency(DWORD dwFrequency)
  226. {
  227.     if(m_pBuffer == NULL)
  228.         return false;
  229.  
  230.     RETURN_DS(m_pBuffer->SetFrequency(dwFrequency))
  231. }
  232.  
  233. bool Buffer::SetVolume(LONG lVolume)
  234. {
  235.     if(m_pBuffer == NULL)
  236.         return false;
  237.  
  238.     RETURN_DS(m_pBuffer->SetVolume(lVolume))
  239. }
  240.  
  241. bool Buffer::SetAllParameters(LPCDS3DBUFFER pParams, DWORD dwApply)
  242. {
  243.     if(m_p3dBuffer == NULL || pParams == NULL)
  244.         return false;
  245.  
  246.     RETURN_DS(m_p3dBuffer->SetAllParameters(pParams, dwApply))
  247. }
  248.  
  249. bool Buffer::SetConeAngles(DWORD dwInsideAngle, DWORD dwOutsideAngle, DWORD dwApply)
  250. {
  251.     if(m_p3dBuffer == NULL)
  252.         return false;
  253.  
  254.     RETURN_DS(m_p3dBuffer->SetConeAngles(dwInsideAngle, dwOutsideAngle, dwApply))
  255. }
  256.  
  257. bool Buffer::SetConeOutsideVolume(LONG lVolume, DWORD dwApply)
  258. {
  259.     if(m_p3dBuffer == NULL)
  260.         return false;
  261.  
  262.     RETURN_DS(m_p3dBuffer->SetConeOutsideVolume(lVolume, dwApply))
  263. }
  264.  
  265. bool Buffer::SetMinDistance(D3DVALUE flDistance, DWORD dwApply)
  266. {
  267.     if(m_p3dBuffer == NULL)
  268.         return false;
  269.  
  270.     RETURN_DS(m_p3dBuffer->SetMinDistance(flDistance, dwApply))
  271. }
  272.  
  273. bool Buffer::SetMaxDistance(D3DVALUE flDistance, DWORD dwApply)
  274. {
  275.     if(m_p3dBuffer == NULL)
  276.         return false;
  277.  
  278.     RETURN_DS(m_p3dBuffer->SetMaxDistance(flDistance, dwApply))
  279. }
  280.  
  281. bool Buffer::SetMode(DWORD dwMode, DWORD dwApply)
  282. {
  283.     if(m_p3dBuffer == NULL)
  284.         return false;
  285.  
  286.     RETURN_DS(m_p3dBuffer->SetMode(dwMode, dwApply))
  287. }
  288.  
  289. bool Buffer::SetPosition(D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply)
  290. {
  291.     if(m_p3dBuffer == NULL)                
  292.         return false;
  293.         
  294.     RETURN_DS(m_p3dBuffer->SetPosition(x, y, z, dwApply))
  295. }
  296.  
  297. bool Buffer::SetVelocity(D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply)
  298. {
  299.     if(m_p3dBuffer == NULL)                
  300.         return false;
  301.         
  302.     RETURN_DS(m_p3dBuffer->SetVelocity(x, y, z, dwApply))
  303. }
  304.  
  305. /*
  306.     ZoomFX support functions
  307. */
  308.  
  309. /*
  310.     Function:        CanDoZoomFX
  311.     Description:    Returns true if the buffer supports the ZoomFX API
  312. */
  313.  
  314. bool Buffer::CanDoZoomFX()
  315. {
  316.     unsigned long ulSupport;
  317.  
  318.     if(m_pKsPropertySet == NULL)        // No property set interface
  319.         return false;                    // Can't do ZoomFX
  320.  
  321.     if(m_pKsPropertySet->QuerySupport(DSPROPSETID_ZOOMFX_BufferProperties, 
  322.                                       DSPROPERTY_ZOOMFXBUFFER_ALL, &ulSupport) != S_OK)
  323.     {                                    // Can't query the property set interface
  324.         TRACEERROR("BufferDlg::CanDoZoomFX(): querying property set");
  325.         return false;                    // Can't do ZoomFX
  326.     }
  327.     return ulSupport == (KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET) ? true : false;
  328. }
  329.  
  330. bool Buffer::GetAllZoomFX(ZOOMFX_BUFFERPROPERTIES* pProps)
  331. {
  332.     return GetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ALL, (void*)pProps, sizeof(ZOOMFX_BUFFERPROPERTIES));
  333. }
  334.  
  335. bool Buffer::GetZoomFXExtent(ZOOMFX_BOX* pExtent)
  336. {
  337.     return GetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_BOX, (void*)pExtent, sizeof(ZOOMFX_BOX));
  338. }
  339.  
  340. bool Buffer::GetZoomFXOrientation(ZOOMFX_ORIENTATION* pOrientation)
  341. {
  342.     return GetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ORIENTATION, (void*)pOrientation, sizeof(ZOOMFX_ORIENTATION));
  343. }
  344.  
  345. bool Buffer::SetAllZoomFX(const ZOOMFX_BUFFERPROPERTIES* pProps)
  346. {
  347.     return SetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ALL, (void*)pProps, sizeof(ZOOMFX_BUFFERPROPERTIES));
  348. }
  349.  
  350. bool Buffer::SetZoomFXExtent(const ZOOMFX_BOX* pExtent)
  351. {
  352.     return SetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_BOX, (void*)pExtent, sizeof(ZOOMFX_BOX));
  353. }
  354.  
  355. bool Buffer::SetZoomFXOrientation(const ZOOMFX_ORIENTATION* pOrientation)
  356. {
  357.     return SetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ORIENTATION, (void*)pOrientation, sizeof(ZOOMFX_ORIENTATION));
  358. }
  359.  
  360. /////////////////////// Buffer protected member functions /////////////////////////////////////////
  361.  
  362. bool Buffer::GetZoomFXProperty(ULONG propid, PVOID pData, ULONG cbData)
  363. {
  364.     ULONG cbReturnedData;
  365.  
  366.     if(pData == NULL || m_pKsPropertySet == NULL)
  367.         return false;
  368.  
  369.     if(m_pKsPropertySet->Get(DSPROPSETID_ZOOMFX_BufferProperties, propid, NULL, 0, pData, cbData, &cbReturnedData) != S_OK)
  370.         return false;
  371.     return cbReturnedData == cbData ? true : false;
  372. }
  373.  
  374. bool Buffer::SetZoomFXProperty(ULONG propid, PVOID pData, ULONG cbData)
  375. {
  376.     if(pData == NULL || m_pKsPropertySet == NULL)
  377.         return false;
  378.     if(m_pKsPropertySet->Set(DSPROPSETID_ZOOMFX_BufferProperties, propid, NULL, 0, pData, cbData) != S_OK)
  379.         return false;
  380.     return true;
  381. }
  382.  
  383.  
  384.