blob: a39673ed50b315e23ac67bb716179098329ee073 (
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
|
#pragma once
typedef struct {
CString strRadioInstanceID;
bool fExisting;
CComPtr<ISampleRadioInstanceInternal> spRadioInstance;
} INSTANCE_LIST_OBJ;
EXTERN_C const IID IID_IMediaRadioManagerNotifySink;
class ATL_NO_VTABLE CSampleRadioManager :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CSampleRadioManager, &CLSID_SampleRadioManager>,
public IConnectionPointContainerImpl<CSampleRadioManager>,
public IConnectionPointImpl<CSampleRadioManager, &IID_IMediaRadioManagerNotifySink>,
public IMediaRadioManager,
public ISampleRadioManagerInternal
{
public:
DECLARE_CLASSFACTORY()
DECLARE_NOT_AGGREGATABLE(CSampleRadioManager)
DECLARE_NO_REGISTRY()
BEGIN_COM_MAP(CSampleRadioManager)
COM_INTERFACE_ENTRY(IMediaRadioManager)
COM_INTERFACE_ENTRY(ISampleRadioManagerInternal)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CSampleRadioManager)
CONNECTION_POINT_ENTRY(IID_IMediaRadioManagerNotifySink)
END_CONNECTION_POINT_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
CSampleRadioManager();
HRESULT FinalConstruct();
void FinalRelease();
// IMediaRadioManager interface
IFACEMETHOD(GetRadioInstances)(_Out_ IRadioInstanceCollection **ppCollection);
IFACEMETHOD(OnSystemRadioStateChange)(_In_ SYSTEM_RADIO_STATE sysRadioState, _In_ UINT32 uTimeoutSec);
// ISampleRadioManagerInternal interface
IFACEMETHOD(OnInstanceRadioChange)(_In_ BSTR bstrRadioInstanceID, _In_ DEVICE_RADIO_STATE radioState);
private:
HRESULT _FireEventOnInstanceAdd(_In_ IRadioInstance *pRadioInstance);
HRESULT _FireEventOnInstanceRemove(_In_ BSTR bstrRadioInstanceID);
HRESULT _FireEventOnInstanceRadioChange(_In_ BSTR bstrRadioInstanceID, _In_ DEVICE_RADIO_STATE radioState);
void _Cleanup();
HRESULT _AddInstance(_In_ PCWSTR pszKeyName, _Out_opt_ IRadioInstance **ppRadioInstance);
void _OnInstanceAddRemove();
HRESULT _SetSysRadioState(_In_ SYSTEM_RADIO_STATE sysRadioState);
static DWORD WINAPI s_ThreadRegChange(LPVOID pThis);
static DWORD WINAPI s_ThreadSetSysRadio(LPVOID pThis);
CComAutoCriticalSection _criticalSection;
CAtlList<INSTANCE_LIST_OBJ *> _listRadioInstances;
CRegKey _hKeyRoot;
CHandle _hRegChangeEvent;
CHandle _hEventThread;
bool _fClosing; // object is closing
static PCWSTR s_pszRootKey;
};
typedef struct _SET_SYS_RADIO_JOB{
HRESULT hr;
CHandle hEvent;
CSampleRadioManager *pSampleRM;
SYSTEM_RADIO_STATE srsTarget;
} SET_SYS_RADIO_JOB;
|