256 lines
3.9 KiB
C++
Executable file
256 lines
3.9 KiB
C++
Executable file
#include "fmod_settings.h"
|
|
|
|
#ifdef FMOD_SUPPORT_DSOUND
|
|
|
|
#include "fmod.h"
|
|
#include "fmod_output_dsound.h"
|
|
#include "fmod_sample_dsound.h"
|
|
#include "fmod_systemi.h"
|
|
|
|
namespace FMOD
|
|
{
|
|
|
|
|
|
/*
|
|
[
|
|
[DESCRIPTION]
|
|
|
|
[PARAMETERS]
|
|
|
|
[RETURN_VALUE]
|
|
FMOD_OK
|
|
|
|
[REMARKS]
|
|
|
|
[PLATFORMS]
|
|
Win32, Win64
|
|
|
|
[SEE_ALSO]
|
|
]
|
|
*/
|
|
SampleDSound::SampleDSound()
|
|
{
|
|
mBuffer = 0;
|
|
mBuffer3D = 0;
|
|
}
|
|
|
|
|
|
/*
|
|
[
|
|
[DESCRIPTION]
|
|
|
|
[PARAMETERS]
|
|
|
|
[RETURN_VALUE]
|
|
FMOD_OK
|
|
|
|
[REMARKS]
|
|
|
|
[PLATFORMS]
|
|
Win32, Win64
|
|
|
|
[SEE_ALSO]
|
|
]
|
|
*/
|
|
FMOD_RESULT SampleDSound::release(bool freethis)
|
|
{
|
|
FMOD_RESULT result;
|
|
|
|
if (!mSystem)
|
|
{
|
|
return FMOD_ERR_UNINITIALIZED;
|
|
}
|
|
|
|
if (mFlags & FMOD_SOUND_FLAG_PRELOADEDFSB)
|
|
{
|
|
return FMOD_ERR_PRELOADED;
|
|
}
|
|
|
|
if (mFlags & FMOD_SOUND_FLAG_PROGRAMMERSOUND)
|
|
{
|
|
return FMOD_ERR_PROGRAMMERSOUND;
|
|
}
|
|
|
|
while (mOpenState != FMOD_OPENSTATE_READY && mOpenState != FMOD_OPENSTATE_ERROR)
|
|
{
|
|
FMOD_OS_Time_Sleep(2);
|
|
}
|
|
|
|
result = mSystem->stopSound(this);
|
|
if (result != FMOD_OK)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
/*
|
|
Free sample's secondary buffer
|
|
*/
|
|
if (mBuffer)
|
|
{
|
|
if (mOutput)
|
|
{
|
|
mOutput->mBufferMemoryCurrent -= mLengthBytes;
|
|
}
|
|
|
|
mBuffer->Release();
|
|
mBuffer = 0;
|
|
}
|
|
|
|
if(mBuffer3D)
|
|
{
|
|
mBuffer3D->Release();
|
|
mBuffer3D = 0;
|
|
}
|
|
|
|
return Sample::release(freethis);
|
|
}
|
|
|
|
|
|
/*
|
|
[
|
|
[DESCRIPTION]
|
|
|
|
[PARAMETERS]
|
|
|
|
[RETURN_VALUE]
|
|
FMOD_OK
|
|
|
|
[REMARKS]
|
|
|
|
[PLATFORMS]
|
|
Win32, Win64
|
|
|
|
[SEE_ALSO]
|
|
]
|
|
*/
|
|
FMOD_RESULT SampleDSound::lockInternal(unsigned int offset, unsigned int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (!mBuffer)
|
|
{
|
|
return FMOD_ERR_INVALID_PARAM;
|
|
}
|
|
|
|
hr = mBuffer->Lock(offset, length, ptr1, (DWORD *)len1, ptr2, (DWORD *)len2, 0); /* not DSBLOCK_FROMWRITECURSOR OR DSBLOCK_ENTIREBUFFER */
|
|
if (hr == E_INVALIDARG)
|
|
{
|
|
return FMOD_ERR_INVALID_PARAM;
|
|
}
|
|
else if (hr == DSBSTATUS_BUFFERLOST)
|
|
{
|
|
DWORD locflags = 0;
|
|
|
|
if (!(mMode & FMOD_UNIQUE))
|
|
{
|
|
if (mLOCSoftware)
|
|
{
|
|
locflags |= DSBPLAY_LOCSOFTWARE;
|
|
}
|
|
else
|
|
{
|
|
locflags |= DSBPLAY_LOCHARDWARE;
|
|
}
|
|
}
|
|
mBuffer->Restore();
|
|
mBuffer->Play(0, 0, locflags | DSBPLAY_LOOPING);
|
|
}
|
|
else if (hr != DS_OK)
|
|
{
|
|
return FMOD_ERR_OUTPUT_DRIVERCALL;
|
|
|
|
}
|
|
return FMOD_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
[
|
|
[DESCRIPTION]
|
|
|
|
[PARAMETERS]
|
|
|
|
[RETURN_VALUE]
|
|
FMOD_OK
|
|
|
|
[REMARKS]
|
|
|
|
[PLATFORMS]
|
|
Win32, Win64
|
|
|
|
[SEE_ALSO]
|
|
]
|
|
*/
|
|
FMOD_RESULT SampleDSound::unlockInternal(void *ptr1, void *ptr2, unsigned int len1, unsigned int len2)
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (!mBuffer)
|
|
{
|
|
return FMOD_ERR_INVALID_PARAM;
|
|
}
|
|
|
|
if (mFormat == FMOD_SOUND_FORMAT_PCM8)
|
|
{
|
|
if (ptr1 && len1)
|
|
{
|
|
unsigned int count;
|
|
unsigned char *destptr = (unsigned char *)ptr1;
|
|
|
|
for (count = 0; count < len1; count++)
|
|
{
|
|
*destptr++ ^= 128;
|
|
}
|
|
}
|
|
if (ptr2 && len2)
|
|
{
|
|
unsigned int count;
|
|
unsigned char *destptr = (unsigned char *)ptr2;
|
|
|
|
for (count = 0; count < len2; count++)
|
|
{
|
|
*destptr++ ^= 128;
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = mBuffer->Unlock(ptr1, len1, ptr2, len2);
|
|
if (hr != DS_OK)
|
|
{
|
|
return FMOD_ERR_OUTPUT_DRIVERCALL;
|
|
}
|
|
|
|
return FMOD_OK;
|
|
}
|
|
|
|
|
|
/*
|
|
[
|
|
[DESCRIPTION]
|
|
|
|
[PARAMETERS]
|
|
|
|
[RETURN_VALUE]
|
|
|
|
[REMARKS]
|
|
|
|
[PLATFORMS]
|
|
|
|
[SEE_ALSO]
|
|
]
|
|
*/
|
|
|
|
#ifdef FMOD_SUPPORT_MEMORYTRACKER
|
|
|
|
FMOD_RESULT SampleDSound::getMemoryUsedImpl(MemoryTracker *tracker)
|
|
{
|
|
tracker->add(false, FMOD_MEMBITS_SOUND, sizeof(SampleDSound) - sizeof(Sample)); // only the SampleDSound members...
|
|
|
|
return Sample::getMemoryUsedImpl(tracker); // all the base class members
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
#endif /* FMOD_SUPPORT_DSOUND */
|