Skip to content

Commit f0a55a8

Browse files
committed
Stub interface for DirectSoundPrivate
1 parent c1fedb5 commit f0a55a8

File tree

5 files changed

+173
-0
lines changed

5 files changed

+173
-0
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ add_library(dsound SHARED
7979
src/logging.h
8080
src/primarybuffer.cpp
8181
src/primarybuffer.h
82+
src/propset.cpp
83+
src/propset.h
8284
src/vmanager.h
8385
version.rc
8486
${DEF_FILE}

src/factory.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "dsoundoal.h"
55
#include "guidprinter.h"
66
#include "logging.h"
7+
#include "propset.h"
78

89

910
namespace {
@@ -33,11 +34,18 @@ HRESULT CreateDSCapture(REFIID riid, void **ppvObject)
3334
return dsobj->QueryInterface(riid, ppvObject);
3435
}
3536

37+
HRESULT CreateDSPrivatePropSet(REFIID riid, void **ppvObject)
38+
{
39+
auto dsobj = DSPrivatePropertySet::Create();
40+
return dsobj->QueryInterface(riid, ppvObject);
41+
}
42+
3643
Factory sFactories[]{
3744
{CLSID_DirectSound8, CreateDS8},
3845
{CLSID_DirectSound, CreateDS},
3946
{CLSID_DirectSoundCapture8, CreateDSCapture8},
4047
{CLSID_DirectSoundCapture, CreateDSCapture},
48+
{CLSID_DirectSoundPrivate, CreateDSPrivatePropSet},
4149
};
4250

4351
} // namespace

src/guidprinter.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <objbase.h>
1111

1212
#include "eax.h"
13+
#include "propset.h"
1314
#include "vmanager.h"
1415

1516

@@ -73,6 +74,7 @@ class GuidPrinter {
7374
CHECKID(EAXPROPERTYID_EAX40_FXSlot3)
7475
CHECKID(EAXPROPERTYID_EAX40_Source)
7576
CHECKID(DSPROPSETID_VoiceManager)
77+
CHECKID(DSPROPSETID_DirectSoundDevice)
7678
if(mIdStr) return;
7779

7880
std::snprintf(mMsg, std::size(mMsg), "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
@@ -119,6 +121,7 @@ class GuidPrinter {
119121
CHECKID(CLSID_DirectSoundCapture)
120122
CHECKID(CLSID_DirectSoundCapture8)
121123
CHECKID(CLSID_DirectSoundFullDuplex)
124+
CHECKID(CLSID_DirectSoundPrivate)
122125
if(mIdStr) return;
123126

124127
std::snprintf(mMsg, std::size(mMsg), "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",

src/propset.cpp

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#include "propset.h"
2+
3+
#include <vfwmsgs.h>
4+
5+
#include "guidprinter.h"
6+
#include "logging.h"
7+
8+
9+
namespace {
10+
11+
using voidp = void*;
12+
13+
} // namespace
14+
15+
16+
#define CLASS_PREFIX "DSPrivatePropertySet::"
17+
DSPrivatePropertySet::DSPrivatePropertySet() = default;
18+
DSPrivatePropertySet::~DSPrivatePropertySet() = default;
19+
20+
ComPtr<DSPrivatePropertySet> DSPrivatePropertySet::Create()
21+
{
22+
return ComPtr<DSPrivatePropertySet>{new DSPrivatePropertySet{}};
23+
}
24+
25+
26+
#define PREFIX CLASS_PREFIX "QueryInterface "
27+
HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::QueryInterface(REFIID riid, void **ppvObject) noexcept
28+
{
29+
DEBUG(PREFIX "(%p)->(%s, %p)\n", voidp{this}, IidPrinter{riid}.c_str(), voidp{ppvObject});
30+
31+
*ppvObject = nullptr;
32+
if(riid == IID_IUnknown)
33+
{
34+
AddRef();
35+
*ppvObject = as<IUnknown*>();
36+
return S_OK;
37+
}
38+
if(riid == IID_IKsPropertySet)
39+
{
40+
AddRef();
41+
*ppvObject = as<IKsPropertySet*>();
42+
return S_OK;
43+
}
44+
45+
FIXME(PREFIX "Unhandled GUID: %s\n", IidPrinter{riid}.c_str());
46+
return E_NOINTERFACE;
47+
}
48+
#undef PREFIX
49+
50+
ULONG STDMETHODCALLTYPE DSPrivatePropertySet::AddRef() noexcept
51+
{
52+
const auto ret = mRef.fetch_add(1u, std::memory_order_relaxed) + 1;
53+
DEBUG(CLASS_PREFIX "AddRef (%p) ref %lu\n", voidp{this}, ret);
54+
return ret;
55+
}
56+
57+
ULONG STDMETHODCALLTYPE DSPrivatePropertySet::Release() noexcept
58+
{
59+
const auto ret = mRef.fetch_sub(1u, std::memory_order_relaxed) - 1;
60+
DEBUG(CLASS_PREFIX "Release (%p) ref %lu\n", voidp{this}, ret);
61+
if(ret == 0) UNLIKELY delete this;
62+
return ret;
63+
}
64+
65+
66+
#define PREFIX CLASS_PREFIX "Get "
67+
HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::Get(REFGUID guidPropSet, ULONG dwPropID,
68+
void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData,
69+
ULONG *pcbReturned) noexcept
70+
{
71+
DEBUG(PREFIX "(%p)->(%s, 0x%lx, %p, %lu, %p, %lu, %p)\n", voidp{this},
72+
PropidPrinter{guidPropSet}.c_str(), dwPropID, pInstanceData, cbInstanceData, pPropData,
73+
cbPropData, voidp{pcbReturned});
74+
75+
if(!pcbReturned)
76+
return E_POINTER;
77+
*pcbReturned = 0;
78+
79+
if(cbPropData > 0 && !pPropData)
80+
{
81+
WARN(PREFIX "pPropData is null with cbPropData > 0\n");
82+
return E_POINTER;
83+
}
84+
85+
FIXME(PREFIX "Unhandled propset: %s (propid: %lu)\n", PropidPrinter{guidPropSet}.c_str(),
86+
dwPropID);
87+
return E_PROP_ID_UNSUPPORTED;
88+
}
89+
#undef PREFIX
90+
91+
#define PREFIX CLASS_PREFIX "Set "
92+
HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::Set(REFGUID guidPropSet, ULONG dwPropID,
93+
void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData) noexcept
94+
{
95+
DEBUG(PREFIX "(%p)->(%s, 0x%lx, %p, %lu, %p, %lu)\n", voidp{this},
96+
PropidPrinter{guidPropSet}.c_str(), dwPropID, pInstanceData, cbInstanceData, pPropData,
97+
cbPropData);
98+
return E_PROP_ID_UNSUPPORTED;
99+
}
100+
#undef PREFIX
101+
102+
#define PREFIX CLASS_PREFIX "QuerySupport "
103+
HRESULT STDMETHODCALLTYPE DSPrivatePropertySet::QuerySupport(REFGUID guidPropSet, ULONG dwPropID,
104+
ULONG *pTypeSupport) noexcept
105+
{
106+
FIXME(PREFIX "(%p)->(%s, 0x%lx, %p)\n", voidp{this}, PropidPrinter{guidPropSet}.c_str(),
107+
dwPropID, voidp{pTypeSupport});
108+
109+
if(!pTypeSupport)
110+
return E_POINTER;
111+
*pTypeSupport = 0;
112+
113+
return E_PROP_ID_UNSUPPORTED;
114+
}
115+
#undef PREFIX
116+
#undef CLASS_PREFIX

src/propset.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#ifndef PROPSET_H
2+
#define PROPSET_H
3+
4+
#include <atomic>
5+
6+
#include <dsound.h>
7+
8+
#include "comptr.h"
9+
10+
11+
inline constexpr GUID CLSID_DirectSoundPrivate{
12+
0x11ab3ec0,
13+
0x25ec,0x11d1,
14+
{0xa4,0xd8,0x00,0xc0,0x4f,0xc2,0x8a,0xca}
15+
};
16+
17+
inline constexpr GUID DSPROPSETID_DirectSoundDevice{
18+
0x84624f82,
19+
0x25ec,0x11d1,
20+
{0xa4,0xd8,0x00,0xc0,0x4f,0xc2,0x8a,0xca}
21+
};
22+
23+
24+
class DSPrivatePropertySet final : IKsPropertySet {
25+
std::atomic<ULONG> mRef{1u};
26+
27+
public:
28+
DSPrivatePropertySet();
29+
~DSPrivatePropertySet();
30+
31+
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) noexcept override;
32+
ULONG STDMETHODCALLTYPE AddRef() noexcept override;
33+
ULONG STDMETHODCALLTYPE Release() noexcept override;
34+
HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData, ULONG *pcbReturned) noexcept override;
35+
HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData) noexcept override;
36+
HRESULT STDMETHODCALLTYPE QuerySupport(REFGUID guidPropSet, ULONG dwPropID, ULONG *pTypeSupport) noexcept override;
37+
38+
template<typename T>
39+
T as() noexcept { return static_cast<T>(this); }
40+
41+
static ComPtr<DSPrivatePropertySet> Create();
42+
};
43+
44+
#endif // PROPSET_H

0 commit comments

Comments
 (0)