home *** CD-ROM | disk | FTP | other *** search
- /*
- Company: Sensaura Ltd
- Copyright: (C) 1999
-
- File Name: buffer.cpp
- File Description: Source file for implementation of Buffer class for a DirectSound buffer
- with ZoomFX support
- Author: Adam Philp
- Last Update: 04-JAN-00
-
- Target Compiler: Microsoft Visual C++ Version 5.0
- */
-
- /////////////////////// Included files ////////////////////////////////////////////////////////////
-
- #include <windows.h>
-
- #include "buffer.h"
- #include "directx.h"
- #include "debug.h"
-
- /////////////////////// Buffer class implementation ///////////////////////////////////////////////
-
- Buffer::Buffer()
- {
- PTRACE("Buffer::Buffer()");
-
- m_pBuffer = NULL;
- m_p3dBuffer = NULL;
- m_pKsPropertySet = NULL;
- }
-
- Buffer::~Buffer()
- {
- PTRACE("Buffer::~Buffer()");
- }
-
- /////////////////////// Buffer public member functions ////////////////////////////////////////////
-
- /*
- Function: Create
- Description: Create a DirectSound3D buffer from the supplied WAVE audio file. Get a
- property set interface from the 3D buffer for ZoomFX API support
- */
-
- bool Buffer::Create(const char* pFileName, LPDIRECTSOUND pDirectSound)
- {
- DSBUFFERDESC dsbd;
- UINT cbSize;
- LPBYTE pData;
- LPVOID pMem1, pMem2;
- DWORD dwSize1, dwSize2;
-
- ASSERT(m_pBuffer == NULL);
- ASSERT(m_p3dBuffer == NULL);
- ASSERT(m_pKsPropertySet == NULL);
- if(m_pBuffer != NULL || m_p3dBuffer != NULL || m_pKsPropertySet != NULL)
- return false; // Fail if the buffer is already created
-
- if (!m_File.Open(pFileName)) // First, can we open the WAV file?
- {
- TRACEERROR("BufferDlg::Create(): unable to open wave file");
- return false;
- }
-
- cbSize = m_File.GetDataSize();
-
- dsbd.dwSize = sizeof(DSBUFFERDESC); // We can read the file, so set up the buffer description
- dsbd.dwFlags = DSBCAPS_CTRL3D|DSBCAPS_LOCHARDWARE|DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME;
- dsbd.dwBufferBytes = cbSize;
- dsbd.dwReserved = 0;
- dsbd.lpwfxFormat = m_File.m_pwfmt;
- // Now create the DirectSound buffer
- TRY_DS(pDirectSound->CreateSoundBuffer(&dsbd, &m_pBuffer, NULL))
-
- pData = new BYTE[cbSize]; // Get the WAV audio data from the file
- if(pData == NULL)
- return false;
-
- m_File.Cue();
- m_File.Read(pData, cbSize);
- // Copy the audio data to the buffer
- TRY_DS(m_pBuffer->Lock(0, dsbd.dwBufferBytes, &pMem1, &dwSize1, &pMem2, &dwSize2, 0))
- CopyMemory(pMem1, pData, dwSize1);
- if(dwSize2)
- CopyMemory(pMem2, LPVOID(pData+dwSize1), dwSize2);
-
- TRY_DS(m_pBuffer->Unlock(pMem1, dwSize1, pMem2, dwSize2))
-
- delete pData;
- // Now get a DirectSound3DBuffer interface
- if(m_pBuffer->QueryInterface(IID_IDirectSound3DBuffer, (void**)&m_p3dBuffer) != S_OK)
- return false;
-
- TRY_DS(m_p3dBuffer->SetMode(DS3DMODE_NORMAL, DS3D_IMMEDIATE))
- // Now get the property set interface
- m_pBuffer->QueryInterface(IID_IKsPropertySet, (void**)&m_pKsPropertySet);
- return true; // Doesn't matter at this stage if we don't get interface
-
- DS_ERROR:
- return false;
- }
-
- /*
- Function: Destroy
- Description: Destroy the DirectSound3D buffer and property set interface
- */
-
- void Buffer::Destroy()
- {
- RELEASE(m_pKsPropertySet)
- RELEASE(m_p3dBuffer)
- RELEASE(m_pBuffer)
- }
-
- /*
- Function: IsPlaying
- Description: Returns true if the buffer is currently playing
- */
-
- bool Buffer::IsPlaying()
- {
- DWORD dwStatus;
-
- if(m_pBuffer == NULL)
- return false;
-
- TRY_DS(m_pBuffer->GetStatus(&dwStatus))
- if(dwStatus & DSBSTATUS_PLAYING)
- return true;
-
- DS_ERROR:
- return false;
- }
-
- /*
- Function: Play
- Description: Start playing the buffer
- */
-
- bool Buffer::Play(bool bLooping)
- {
- if(m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->Play(0, 0, bLooping ? DSBPLAY_LOOPING : 0))
- }
-
- /*
- Function: Rewind
- Description: Set the play cursor to the start of the buffer
- */
-
- bool Buffer::Rewind()
- {
- if(m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->SetCurrentPosition(0))
- }
-
-
- bool Buffer::Stop()
- {
- if(m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->Stop())
- }
-
- /*
- Wrapper functions for IDirectSoundBuffer and IDirectSound3DBuffer methods
- */
-
- bool Buffer::GetCaps(LPDSBCAPS pCaps)
- {
- if(pCaps == NULL || m_pBuffer == NULL)
- return false;
-
- pCaps->dwSize = sizeof(DSBCAPS); // Automatically set the size parameters
- RETURN_DS(m_pBuffer->GetCaps(pCaps))
- }
-
- bool Buffer::GetCurrentPosition(DWORD* pdwPlayCursor, DWORD* pdwWriteCursor)
- {
- if(m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->GetCurrentPosition(pdwPlayCursor, pdwWriteCursor))
- }
-
- bool Buffer::GetFormat(LPWAVEFORMATEX pwfx)
- {
- if(pwfx == NULL ||m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->GetFormat(pwfx, sizeof(WAVEFORMATEX), NULL))
- }
-
- bool Buffer::GetFrequency(DWORD* pdwFrequency)
- {
- if(pdwFrequency == NULL ||m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->GetFrequency(pdwFrequency))
- }
-
- bool Buffer::GetVolume(long* plVolume)
- {
- if(plVolume == NULL || m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->GetVolume(plVolume))
- }
-
- bool Buffer::GetAllParameters(LPDS3DBUFFER pParams)
- {
- if(m_p3dBuffer == NULL || pParams == NULL)
- return false;
-
- pParams->dwSize = sizeof(DS3DBUFFER);
- RETURN_DS(m_p3dBuffer->GetAllParameters(pParams))
- }
-
- bool Buffer::SetFrequency(DWORD dwFrequency)
- {
- if(m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->SetFrequency(dwFrequency))
- }
-
- bool Buffer::SetVolume(LONG lVolume)
- {
- if(m_pBuffer == NULL)
- return false;
-
- RETURN_DS(m_pBuffer->SetVolume(lVolume))
- }
-
- bool Buffer::SetAllParameters(LPCDS3DBUFFER pParams, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL || pParams == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetAllParameters(pParams, dwApply))
- }
-
- bool Buffer::SetConeAngles(DWORD dwInsideAngle, DWORD dwOutsideAngle, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetConeAngles(dwInsideAngle, dwOutsideAngle, dwApply))
- }
-
- bool Buffer::SetConeOutsideVolume(LONG lVolume, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetConeOutsideVolume(lVolume, dwApply))
- }
-
- bool Buffer::SetMinDistance(D3DVALUE flDistance, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetMinDistance(flDistance, dwApply))
- }
-
- bool Buffer::SetMaxDistance(D3DVALUE flDistance, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetMaxDistance(flDistance, dwApply))
- }
-
- bool Buffer::SetMode(DWORD dwMode, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetMode(dwMode, dwApply))
- }
-
- bool Buffer::SetPosition(D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetPosition(x, y, z, dwApply))
- }
-
- bool Buffer::SetVelocity(D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply)
- {
- if(m_p3dBuffer == NULL)
- return false;
-
- RETURN_DS(m_p3dBuffer->SetVelocity(x, y, z, dwApply))
- }
-
- /*
- ZoomFX support functions
- */
-
- /*
- Function: CanDoZoomFX
- Description: Returns true if the buffer supports the ZoomFX API
- */
-
- bool Buffer::CanDoZoomFX()
- {
- unsigned long ulSupport;
-
- if(m_pKsPropertySet == NULL) // No property set interface
- return false; // Can't do ZoomFX
-
- if(m_pKsPropertySet->QuerySupport(DSPROPSETID_ZOOMFX_BufferProperties,
- DSPROPERTY_ZOOMFXBUFFER_ALL, &ulSupport) != S_OK)
- { // Can't query the property set interface
- TRACEERROR("BufferDlg::CanDoZoomFX(): querying property set");
- return false; // Can't do ZoomFX
- }
- return ulSupport == (KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET) ? true : false;
- }
-
- bool Buffer::GetAllZoomFX(ZOOMFX_BUFFERPROPERTIES* pProps)
- {
- return GetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ALL, (void*)pProps, sizeof(ZOOMFX_BUFFERPROPERTIES));
- }
-
- bool Buffer::GetZoomFXExtent(ZOOMFX_BOX* pExtent)
- {
- return GetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_BOX, (void*)pExtent, sizeof(ZOOMFX_BOX));
- }
-
- bool Buffer::GetZoomFXOrientation(ZOOMFX_ORIENTATION* pOrientation)
- {
- return GetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ORIENTATION, (void*)pOrientation, sizeof(ZOOMFX_ORIENTATION));
- }
-
- bool Buffer::SetAllZoomFX(const ZOOMFX_BUFFERPROPERTIES* pProps)
- {
- return SetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ALL, (void*)pProps, sizeof(ZOOMFX_BUFFERPROPERTIES));
- }
-
- bool Buffer::SetZoomFXExtent(const ZOOMFX_BOX* pExtent)
- {
- return SetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_BOX, (void*)pExtent, sizeof(ZOOMFX_BOX));
- }
-
- bool Buffer::SetZoomFXOrientation(const ZOOMFX_ORIENTATION* pOrientation)
- {
- return SetZoomFXProperty(DSPROPERTY_ZOOMFXBUFFER_ORIENTATION, (void*)pOrientation, sizeof(ZOOMFX_ORIENTATION));
- }
-
- /////////////////////// Buffer protected member functions /////////////////////////////////////////
-
- bool Buffer::GetZoomFXProperty(ULONG propid, PVOID pData, ULONG cbData)
- {
- ULONG cbReturnedData;
-
- if(pData == NULL || m_pKsPropertySet == NULL)
- return false;
-
- if(m_pKsPropertySet->Get(DSPROPSETID_ZOOMFX_BufferProperties, propid, NULL, 0, pData, cbData, &cbReturnedData) != S_OK)
- return false;
- return cbReturnedData == cbData ? true : false;
- }
-
- bool Buffer::SetZoomFXProperty(ULONG propid, PVOID pData, ULONG cbData)
- {
- if(pData == NULL || m_pKsPropertySet == NULL)
- return false;
- if(m_pKsPropertySet->Set(DSPROPSETID_ZOOMFX_BufferProperties, propid, NULL, 0, pData, cbData) != S_OK)
- return false;
- return true;
- }
-
-
-