Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Entry.cpp « sanear-dll « src « dll - github.com/mpc-hc/sanear.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9cabd03b08f955cb514de9319a6adfda131dde59 (plain)
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);
}