HulaLoop
Simple cross-platform audio loopback and recording.
WindowsAudio.h
1 #ifndef WIN_AUDIO
2 #define WIN_AUDIO
3 
4 // System
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <iostream>
8 #include <string>
9 #include <vector>
10 #include <thread>
11 
12 // Windows Audio
13 #include <windows.h>
14 #include <mmdeviceapi.h>
15 #include <endpointvolume.h>
16 #include <Audioclient.h>
17 #include <functiondiscoverykeys_devpkey.h>
18 #include <comdef.h>
19 
20 #include "OSAudio.h"
21 #include "Device.h"
22 
23 using namespace std;
24 
25 using byte = uint8_t;
26 
27 #define REFTIMES_PER_SEC 10000000
28 #define REFTIMES_PER_MILLISEC 10000
29 
30 // Error handling
31 #define HANDLE_ERROR(hres) \
32  if (FAILED(hres)) { goto Exit; }
33 #define SAFE_RELEASE(punk) \
34  if ((punk) != NULL) \
35  { (punk)->Release(); (punk) = NULL; }
36 
40 class WindowsAudio : public OSAudio
41 {
42  private:
43  const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
44  const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
45  const IID IID_IAudioClient = __uuidof(IAudioClient);
46  const IID IID_IAudioCaptureClient = __uuidof(IAudioCaptureClient);
47 
48  // System necessary variables
49  HRESULT status;
50  REFERENCE_TIME requestDuration = REFTIMES_PER_SEC;
51  REFERENCE_TIME bufferDuration;
52 
53  IMMDeviceEnumerator* pEnumerator = NULL;
54  IMMDeviceCollection* deviceCollection = NULL;
55 
56  // Audio data
57  byte* pData;
58 
59  public:
60  WindowsAudio();
61  ~WindowsAudio();
62 
63  vector<Device*> getInputDevices();
64  vector<Device*> getOutputDevices();
65 
66  static void test_capture(WindowsAudio* param);
67  void capture();
68 
69  void setActiveOutputDevice(Device* device);
70 };
71 
72 #endif
A audio class that captures system wide audio on Windows.
Definition: WindowsAudio.h:40
Defines a system audio device.
Definition: Device.h:20
An abstract class that defines the components of the particular OS specfic classes.
Definition: OSAudio.h:21