Audaspace 1.5.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
30
31#include <thread>
32
33#include <windows.h>
34#include <audioclient.h>
35#include <mmdeviceapi.h>
36#include <mmreg.h>
37
39
43class AUD_PLUGIN_API WASAPIDevice : IMMNotificationClient, public ThreadedDevice
44{
45private:
46 int m_buffersize;
47 IMMDeviceEnumerator* m_imm_device_enumerator;
48 IMMDevice* m_imm_device;
49 IAudioClient* m_audio_client;
50 WAVEFORMATEXTENSIBLE m_wave_format_extensible;
51 bool m_default_device_changed;
52 LONG m_reference_count;
53
54 AUD_LOCAL HRESULT setupRenderClient(IAudioRenderClient*& render_client, UINT32& buffer_size);
55
59 AUD_LOCAL void runMixingThread();
60
61 AUD_LOCAL bool setupDevice(DeviceSpecs& specs);
62
63 // IUnknown implementation
64 ULONG STDMETHODCALLTYPE AddRef();
65 ULONG STDMETHODCALLTYPE Release();
66 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
67 // IMMNotificationClient implementation
68 HRESULT STDMETHODCALLTYPE OnDeviceStateChanged(LPCWSTR pwstrDeviceId, DWORD dwNewState);
69 HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId);
70 HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId);
71 HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR pwstrDeviceId);
72 HRESULT STDMETHODCALLTYPE OnPropertyValueChanged(LPCWSTR pwstrDeviceId, const PROPERTYKEY key);
73
74 // delete copy constructor and operator=
75 WASAPIDevice(const WASAPIDevice&) = delete;
76 WASAPIDevice& operator=(const WASAPIDevice&) = delete;
77
78public:
87
91 virtual ~WASAPIDevice();
92
96 static void registerPlugin();
97};
98
#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.
This device extends the SoftwareDevice with code for running mixing in a separate thread.
Definition ThreadedDevice.h:35
This device plays back through WASAPI, the Windows audio API.
Definition WASAPIDevice.h:44
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