Skip to content

Commit

Permalink
Partially implement the VoiceManager property set
Browse files Browse the repository at this point in the history
  • Loading branch information
kcat committed Apr 18, 2023
1 parent c9af505 commit 5408ce8
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ add_library(dsound SHARED
src/logging.h
src/primarybuffer.cpp
src/primarybuffer.h
src/vmanager.h
version.rc
${DEF_FILE}
)
Expand Down
97 changes: 97 additions & 0 deletions src/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "guidprinter.h"
#include "logging.h"
#include "primarybuffer.h"
#include "vmanager.h"


namespace {
Expand Down Expand Up @@ -1630,6 +1631,52 @@ HRESULT STDMETHODCALLTYPE Buffer::Prop::Get(REFGUID guidPropSet, ULONG dwPropID,
return DS_OK;
}
}
else if(guidPropSet == DSPROPSETID_VoiceManager)
{
switch(dwPropID)
{
case DSPROPERTY_VMANAGER_MODE:
if(cbPropData >= sizeof(DWORD))
{
*static_cast<DWORD*>(pPropData) = self->mBuffer->mVoiceMode;
*pcbReturned = sizeof(DWORD);
return DS_OK;
}
return DSERR_INVALIDPARAM;

case DSPROPERTY_VMANAGER_PRIORITY:
if(cbPropData >= sizeof(DWORD))
{
*static_cast<DWORD*>(pPropData) = self->mVmPriority;
*pcbReturned = sizeof(DWORD);
return DS_OK;
}
return DSERR_INVALIDPARAM;

case DSPROPERTY_VMANAGER_STATE:
if(cbPropData >= sizeof(DWORD))
{
ALint state{};
if(self->mSource != 0)
{
ALSection alsection{self->mContext};
alGetSourcei(self->mSource, AL_SOURCE_STATE, &state);
}

/* FIXME: Probably not accurate. */
if(state == AL_PLAYING)
*static_cast<DWORD*>(pPropData) = DSPROPERTY_VMANAGER_STATE_PLAYING3DHW;
else
*static_cast<DWORD*>(pPropData) = DSPROPERTY_VMANAGER_STATE_SILENT;
*pcbReturned = sizeof(DWORD);
return DS_OK;
}
return DSERR_INVALIDPARAM;
}

FIXME(PREFIX "Get Unhandled VoiceManager propid: 0x%08lx\n", dwPropID);
return E_PROP_ID_UNSUPPORTED;
}

return E_PROP_ID_UNSUPPORTED;
}
Expand Down Expand Up @@ -1685,6 +1732,36 @@ HRESULT STDMETHODCALLTYPE Buffer::Prop::Set(REFGUID guidPropSet, ULONG dwPropID,
return DS_OK;
}
}
else if(guidPropSet == DSPROPSETID_VoiceManager)
{
switch(dwPropID)
{
case DSPROPERTY_VMANAGER_MODE:
if(cbPropData >= sizeof(DWORD))
{
if(const DWORD mode{*static_cast<DWORD*>(pPropData)}; mode < VMANAGER_MODE_MAX)
{
TRACE(PREFIX "Set DSPROPERTY_VMANAGER_MODE: %lu\n", mode);
self->mBuffer->mVoiceMode = static_cast<VmMode>(mode);
return DS_OK;
}
}
return DSERR_INVALIDPARAM;

case DSPROPERTY_VMANAGER_PRIORITY:
if(cbPropData >= sizeof(DWORD))
{
const DWORD prio{*static_cast<DWORD*>(pPropData)};
TRACE(PREFIX "Set DSPROPERTY_VMANAGER_PRIORITY: %lu\n", prio);
self->mVmPriority = prio;
return DS_OK;
}
return DSERR_INVALIDPARAM;
}

FIXME(PREFIX "Set Unhandled VoiceManager propid: 0x%08lx\n", dwPropID);
return E_PROP_ID_UNSUPPORTED;
}

return E_PROP_ID_UNSUPPORTED;
}
Expand Down Expand Up @@ -1737,6 +1814,26 @@ HRESULT STDMETHODCALLTYPE Buffer::Prop::QuerySupport(REFGUID guidPropSet, ULONG
return DS_OK;
}
}
if(guidPropSet == DSPROPSETID_VoiceManager)
{
switch(dwPropID)
{
case DSPROPERTY_VMANAGER_MODE:
*pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
return DS_OK;

case DSPROPERTY_VMANAGER_PRIORITY:
*pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
return DS_OK;

case DSPROPERTY_VMANAGER_STATE:
*pTypeSupport = KSPROPERTY_SUPPORT_GET;
return DS_OK;
}

FIXME(PREFIX "QuerySupport Unhandled VoiceManager propid: 0x%08lx\n", dwPropID);
return E_PROP_ID_UNSUPPORTED;
}

FIXME(PREFIX "QuerySupport Unhandled propset: %s (propid: %lu)\n",
GuidPrinter{guidPropSet}.c_str(), dwPropID);
Expand Down
3 changes: 3 additions & 0 deletions src/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "comptr.h"
#include "dsoal.h"
#include "expected.h"
#include "vmanager.h"


class DSound8OAL;
Expand Down Expand Up @@ -44,6 +45,7 @@ class SharedBuffer {
WAVEFORMATEXTENSIBLE mWfxFormat{};
ALenum mAlFormat{AL_NONE};
ALuint mAlBuffer{0};
VmMode mVoiceMode{DSPROPERTY_VMANAGER_MODE_DEFAULT};

static auto Create(const DSBUFFERDESC &bufferDesc) noexcept
-> ds::expected<ComPtr<SharedBuffer>,HRESULT>;
Expand Down Expand Up @@ -149,6 +151,7 @@ class Buffer final : IDirectSoundBuffer8 {
ComPtr<SharedBuffer> mBuffer;
ALuint mSource{};
DWORD mLastPos{0};
DWORD mVmPriority{0};
std::atomic<bool> mLocked{false};
bool mBufferLost{false};

Expand Down
38 changes: 38 additions & 0 deletions src/vmanager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#ifndef VMANAGER_H
#define VMANAGER_H

#include <windows.h>


inline constexpr GUID DSPROPSETID_VoiceManager{
0x62a69bae,
0xdf9d,0x11d1,
{0x99,0xa6,0x00,0xc0,0x4f,0xc9,0x9d,0x46}
};


enum DSPROPERTY_VMANAGER {
DSPROPERTY_VMANAGER_MODE = 0,
DSPROPERTY_VMANAGER_PRIORITY,
DSPROPERTY_VMANAGER_STATE
};


enum VmMode {
DSPROPERTY_VMANAGER_MODE_DEFAULT = 0,
DSPROPERTY_VMANAGER_MODE_AUTO,
DSPROPERTY_VMANAGER_MODE_REPORT,
DSPROPERTY_VMANAGER_MODE_USER,
VMANAGER_MODE_MAX
};


enum VmState {
DSPROPERTY_VMANAGER_STATE_PLAYING3DHW = 0,
DSPROPERTY_VMANAGER_STATE_SILENT,
DSPROPERTY_VMANAGER_STATE_BUMPED,
DSPROPERTY_VMANAGER_STATE_PLAYFAILED,
VMANAGER_STATE_MAX
};

#endif // VMANAGER_H

0 comments on commit 5408ce8

Please sign in to comment.