194 lines
4.5 KiB
C++
194 lines
4.5 KiB
C++
|
|
#include "fmod_settings.h"
|
||
|
|
|
||
|
|
#ifdef FMOD_SUPPORT_EAX
|
||
|
|
|
||
|
|
#include "fmod_output_dsound.h"
|
||
|
|
#include "fmod_channel_dsound_eax2.h"
|
||
|
|
#include "fmod_eax2.h"
|
||
|
|
|
||
|
|
|
||
|
|
namespace FMOD
|
||
|
|
{
|
||
|
|
|
||
|
|
/*
|
||
|
|
[
|
||
|
|
[DESCRIPTION]
|
||
|
|
|
||
|
|
[PARAMETERS]
|
||
|
|
|
||
|
|
[RETURN_VALUE]
|
||
|
|
FMOD_OK
|
||
|
|
|
||
|
|
[REMARKS]
|
||
|
|
|
||
|
|
[PLATFORMS]
|
||
|
|
Win32, Win64
|
||
|
|
|
||
|
|
[SEE_ALSO]
|
||
|
|
]
|
||
|
|
*/
|
||
|
|
FMOD_RESULT ChannelDSoundEAX2::setReverbProperties(const FMOD_REVERB_CHANNELPROPERTIES *prop)
|
||
|
|
{
|
||
|
|
HRESULT hr;
|
||
|
|
EAXBUFFERPROPERTIES dsprops;
|
||
|
|
GUID guid;
|
||
|
|
|
||
|
|
if (!mOutputDSound)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNINITIALIZED;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!prop)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_INVALID_PARAM;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!mBuffer3D)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNSUPPORTED;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
OBTAIN REVERB INTERFACE
|
||
|
|
*/
|
||
|
|
if (!mBufferReverb)
|
||
|
|
{
|
||
|
|
if (mFlags & CHANNELREAL_FLAG_PAUSED && mOutputDSound->mDirectXVersion >= 8)
|
||
|
|
{
|
||
|
|
mBuffer->AcquireResources(DSBPLAY_LOCHARDWARE, 0, NULL);
|
||
|
|
}
|
||
|
|
|
||
|
|
FMOD_memcpy(&guid, &FMOD_IID_IKsPropertySet, sizeof(GUID));
|
||
|
|
|
||
|
|
hr = mBuffer3D->QueryInterface(guid, (void **)&mBufferReverb);
|
||
|
|
if (hr != DS_OK)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNSUPPORTED;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
NOW SET CHANNEL PROPERTIES
|
||
|
|
*/
|
||
|
|
dsprops.lDirect = prop->Direct;
|
||
|
|
dsprops.lDirectHF = prop->DirectHF;
|
||
|
|
dsprops.lRoom = prop->Room;
|
||
|
|
dsprops.lRoomHF = prop->RoomHF;
|
||
|
|
dsprops.lObstruction = prop->Obstruction;
|
||
|
|
dsprops.flObstructionLFRatio = prop->ObstructionLFRatio;
|
||
|
|
dsprops.lOcclusion = prop->Occlusion;
|
||
|
|
dsprops.flOcclusionLFRatio = prop->OcclusionLFRatio;
|
||
|
|
dsprops.flOcclusionRoomRatio = prop->OcclusionRoomRatio;
|
||
|
|
dsprops.lOutsideVolumeHF = prop->OutsideVolumeHF;
|
||
|
|
dsprops.flRoomRolloffFactor = prop->RoomRolloffFactor;
|
||
|
|
dsprops.flAirAbsorptionFactor = prop->AirAbsorptionFactor;
|
||
|
|
dsprops.dwFlags = prop->Flags;
|
||
|
|
|
||
|
|
FMOD_memcpy(&guid, &FMOD_DSPROPSETID_EAX20_BufferProperties, sizeof(GUID));
|
||
|
|
|
||
|
|
hr = mBufferReverb->Set(guid, DSPROPERTY_EAXBUFFER_ALLPARAMETERS, NULL, 0, &dsprops, sizeof(EAXBUFFERPROPERTIES));
|
||
|
|
if (FAILED(hr))
|
||
|
|
{
|
||
|
|
return FMOD_ERR_INVALID_PARAM;
|
||
|
|
}
|
||
|
|
|
||
|
|
return FMOD_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
[
|
||
|
|
[DESCRIPTION]
|
||
|
|
|
||
|
|
[PARAMETERS]
|
||
|
|
|
||
|
|
[RETURN_VALUE]
|
||
|
|
FMOD_OK
|
||
|
|
|
||
|
|
[REMARKS]
|
||
|
|
|
||
|
|
[PLATFORMS]
|
||
|
|
Win32, Win64
|
||
|
|
|
||
|
|
[SEE_ALSO]
|
||
|
|
]
|
||
|
|
*/
|
||
|
|
FMOD_RESULT ChannelDSoundEAX2::getReverbProperties(FMOD_REVERB_CHANNELPROPERTIES *prop)
|
||
|
|
{
|
||
|
|
HRESULT hr;
|
||
|
|
EAXBUFFERPROPERTIES dsprops;
|
||
|
|
GUID guid;
|
||
|
|
ULONG ulReceived;
|
||
|
|
|
||
|
|
if (!mOutputDSound)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNINITIALIZED;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!prop)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_INVALID_PARAM;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!mBuffer3D)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNSUPPORTED;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
OBTAIN REVERB INTERFACE
|
||
|
|
*/
|
||
|
|
if (!mBufferReverb)
|
||
|
|
{
|
||
|
|
if (mFlags & CHANNELREAL_FLAG_PAUSED && mOutputDSound->mDirectXVersion >= 8)
|
||
|
|
{
|
||
|
|
mBuffer->AcquireResources(DSBPLAY_LOCHARDWARE, 0, NULL);
|
||
|
|
}
|
||
|
|
|
||
|
|
FMOD_memcpy(&guid, &FMOD_IID_IKsPropertySet, sizeof(GUID));
|
||
|
|
|
||
|
|
hr = mBuffer3D->QueryInterface(guid, (void **)&mBufferReverb);
|
||
|
|
if (hr != DS_OK)
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNSUPPORTED;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
Get reverb properties
|
||
|
|
*/
|
||
|
|
FMOD_memcpy(&guid, &FMOD_DSPROPSETID_EAX20_BufferProperties, sizeof(GUID));
|
||
|
|
|
||
|
|
hr = mBufferReverb->Get(guid, DSPROPERTY_EAXBUFFER_ALLPARAMETERS, NULL, 0, &dsprops, sizeof(EAXBUFFERPROPERTIES), &ulReceived);
|
||
|
|
if (FAILED(hr))
|
||
|
|
{
|
||
|
|
return FMOD_ERR_UNSUPPORTED;
|
||
|
|
}
|
||
|
|
|
||
|
|
prop->Direct = dsprops.lDirect;
|
||
|
|
prop->DirectHF = dsprops.lDirectHF;
|
||
|
|
prop->Room = dsprops.lRoom;
|
||
|
|
prop->RoomHF = dsprops.lRoomHF;
|
||
|
|
prop->Obstruction = dsprops.lObstruction;
|
||
|
|
prop->ObstructionLFRatio = dsprops.flObstructionLFRatio;
|
||
|
|
prop->Occlusion = dsprops.lOcclusion;
|
||
|
|
prop->OcclusionLFRatio = dsprops.flOcclusionLFRatio;
|
||
|
|
prop->OcclusionRoomRatio = dsprops.flOcclusionRoomRatio;
|
||
|
|
prop->OcclusionDirectRatio = 0;
|
||
|
|
prop->Exclusion = 0;
|
||
|
|
prop->ExclusionLFRatio = 0;
|
||
|
|
prop->OutsideVolumeHF = dsprops.lOutsideVolumeHF;
|
||
|
|
prop->DopplerFactor = 0;
|
||
|
|
prop->RolloffFactor = 0;
|
||
|
|
prop->RoomRolloffFactor = dsprops.flRoomRolloffFactor;
|
||
|
|
prop->AirAbsorptionFactor = dsprops.flAirAbsorptionFactor;
|
||
|
|
prop->Flags = dsprops.dwFlags;
|
||
|
|
|
||
|
|
return FMOD_OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|