Audaspace 1.6.0
A high level audio library.
Loading...
Searching...
No Matches
WASAPIDevice.h
Go to the documentation of this file.
1/*******************************************************************************
2 * Copyright 2009-2016 Jörg Müller
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************/
16
17#pragma once
18
19#ifdef WASAPI_PLUGIN
20#define AUD_BUILD_PLUGIN
21#endif
22
28
30
31#include <thread>
32
33#include <windows.h>
34#include <audioclient.h>
35#include <mmdeviceapi.h>
36#include <mmreg.h>
37#include <wrl/client.h>
38
40
41using Microsoft::WRL::ComPtr;
42
46class AUD_PLUGIN_API WASAPIDevice : IMMNotificationClient, public ThreadedDevice
47{
48private:
49 int m_buffersize;
50 ComPtr<IMMDeviceEnumerator> m_imm_device_enumerator;
51 ComPtr<IMMDevice> m_imm_device;
52 ComPtr<IAudioClient> m_audio_client;
53 WAVEFORMATEXTENSIBLE m_wave_format_extensible;
54 bool m_default_device_changed;
55 LONG m_reference_count;
56
57 AUD_LOCAL HRESULT setupRenderClient(IAudioRenderClient*& render_client, UINT32& buffer_size);
58
62 AUD_LOCAL void runMixingThread();
63
64 AUD_LOCAL bool setupDevice(DeviceSpecs& specs);
65
66 // IUnknown implementation
67 ULONG STDMETHODCALLTYPE AddRef();
68 ULONG STDMETHODCALLTYPE Release();
69 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
70 // IMMNotificationClient implementation
71 HRESULT STDMETHODCALLTYPE OnDeviceStateChanged(LPCWSTR pwstrDeviceId, DWORD dwNewState);
72 HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId);
73 HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId);
74 HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR pwstrDeviceId);
75 HRESULT STDMETHODCALLTYPE OnPropertyValueChanged(LPCWSTR pwstrDeviceId, const PROPERTYKEY key);
76
77 // delete copy constructor and operator=
78 WASAPIDevice(const WASAPIDevice&) = delete;
79 WASAPIDevice& operator=(const WASAPIDevice&) = delete;
80
81public:
90
94 virtual ~WASAPIDevice();
95
99 static void registerPlugin();
100};
101
#define AUD_DEFAULT_BUFFER_SIZE
The default playback buffer size of a device.
Definition Audaspace.h:103
#define AUD_NAMESPACE_END
Closes the audaspace namespace aud.
Definition Audaspace.h:119
#define AUD_LOCAL
Used for hiding symbols from export in the shared library.
Definition Audaspace.h:80
#define AUD_NAMESPACE_BEGIN
Opens the audaspace namespace aud.
Definition Audaspace.h:116
#define AUD_PLUGIN_API
Used for exporting symbols in the shared library.
Definition Audaspace.h:94
The ThreadedDevice class.
WASAPIDevice(DeviceSpecs specs, int buffersize=AUD_DEFAULT_BUFFER_SIZE)
Opens the WASAPI audio device for playback.
static void registerPlugin()
Registers this plugin.
virtual ~WASAPIDevice()
Closes the WASAPI audio device.
Specification of a sound device.
Definition Specification.h:129