1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#include "pch.h"
#include "OuterFilter.h"
namespace
{
// {DF557071-C9FD-433A-9627-81E0D3640ED9}
const GUID filterGuid = {0xdf557071, 0xc9fd, 0x433a, {0x96, 0x27, 0x81, 0xe0, 0xd3, 0x64, 0xe, 0xd9}};
const WCHAR filterName[] = L"Sanear Audio Renderer";
const AMOVIESETUP_MEDIATYPE pinTypes[] = {
{&MEDIATYPE_Audio, &CLSID_NULL},
};
const AMOVIESETUP_PIN setupPin = {
L"", TRUE, FALSE, FALSE, FALSE, &CLSID_NULL, nullptr, _countof(pinTypes), pinTypes,
};
const AMOVIESETUP_FILTER setupFilter = {
&filterGuid, filterName, MERIT_DO_NOT_USE, 1, &setupPin
};
}
CUnknown* WINAPI CreateFilterInstance(LPUNKNOWN, HRESULT*);
CFactoryTemplate g_Templates[] = {
{filterName, &filterGuid, CreateFilterInstance},
};
int g_cTemplates = _countof(g_Templates);
STDAPI RegisterAllServers(LPCWSTR szFileName, BOOL bRegister);
namespace
{
struct CoFreeUnusedLibrariesHelper
{
~CoFreeUnusedLibrariesHelper() { CoFreeUnusedLibraries(); };
};
HRESULT DllRegisterServer(bool reg)
{
wchar_t filename[MAX_PATH];
if (!GetModuleFileName(g_hInst, filename, MAX_PATH))
return AmGetLastErrorToHResult();
if (reg)
ReturnIfFailed(RegisterAllServers(filename, TRUE));
{
SaneAudioRenderer::CoInitializeHelper coInitializeHelper(COINIT_APARTMENTTHREADED);
CoFreeUnusedLibrariesHelper coFreeUnusedLibrariesHelper;
IFilterMapper2Ptr filterMapper;
ReturnIfFailed(CoCreateInstance(CLSID_FilterMapper2, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&filterMapper)));
{
HRESULT result;
result = filterMapper->UnregisterFilter(nullptr, nullptr, *setupFilter.clsID);
if (FAILED(result))
ReturnIfNotEquals(result, 0x80070002);
result = filterMapper->UnregisterFilter(&CLSID_AudioRendererCategory, nullptr, *setupFilter.clsID);
if (FAILED(result))
ReturnIfNotEquals(result, 0x80070002);
}
if (reg)
{
const REGFILTER2 rf = {
1,
setupFilter.dwMerit,
setupFilter.nPins,
setupFilter.lpPin,
};
ReturnIfFailed(filterMapper->RegisterFilter(*setupFilter.clsID, setupFilter.strName,
nullptr, &CLSID_AudioRendererCategory, nullptr, &rf));
ReturnIfFailed(filterMapper->RegisterFilter(*setupFilter.clsID, setupFilter.strName,
nullptr, nullptr, nullptr, &rf));
}
}
if (!reg)
ReturnIfFailed(RegisterAllServers(filename, FALSE));
return S_OK;
}
}
CUnknown* WINAPI CreateFilterInstance(IUnknown* pUnknown, HRESULT* pResult)
{
CheckPointer(pResult, nullptr);
auto pFilter = new(std::nothrow) SaneAudioRenderer::OuterFilter(pUnknown, filterGuid);
if (!pFilter)
*pResult = E_OUTOFMEMORY;
return pFilter;
}
STDAPI DllRegisterServer()
{
if (!IsWindowsVistaOrGreater())
return E_FAIL;
return DllRegisterServer(true);
}
STDAPI DllUnregisterServer()
{
return DllRegisterServer(false);
}
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL WINAPI DllMain(HINSTANCE hDllHandle, DWORD dwReason, LPVOID pReserved)
{
return DllEntryPoint(hDllHandle, dwReason, pReserved);
}
|