kodi
AESinkFactoryWin.h
1 /*
2  * Copyright (C) 2010-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "cores/AudioEngine/Utils/AEDeviceInfo.h"
12 #include "cores/AudioEngine/Utils/AEUtil.h"
13 #include "utils/log.h"
14 
15 #include <audioclient.h>
16 
17 #define WASAPI_SPEAKER_COUNT 21
18 
19 #ifdef TARGET_WINDOWS_STORE
20 #ifndef _WAVEFORMATEXTENSIBLE_IEC61937_
21 #define _WAVEFORMATEXTENSIBLE_IEC61937_
22 typedef struct _WAVEFORMATEXTENSIBLE_IEC61937
23 {
24  WAVEFORMATEXTENSIBLE FormatExt;
25  uint32_t dwEncodedSamplesPerSec;
26  uint32_t dwEncodedChannelCount;
27  uint32_t dwAverageBytesPerSec;
28 } WAVEFORMATEXTENSIBLE_IEC61937, *PWAVEFORMATEXTENSIBLE_IEC61937;
29 #endif /* _WAVEFORMATEXTENSIBLE_IEC61937_ */
30 
31 #define STATIC_KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL_PLUS \
32  0x0000000aL, 0x0cea, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
33 DEFINE_GUIDSTRUCT("0000000a-0cea-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL_PLUS);
34 #define KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL_PLUS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL_PLUS)
35 
36 #define STATIC_KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL\
37  DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
38 DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL);
39 #define KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL)
40 
41 #define STATIC_KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP \
42  0x0000000cL, 0x0cea, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
43 DEFINE_GUIDSTRUCT("0000000c-0cea-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP);
44 #define KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP)
45 
46 #define STATIC_KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD \
47  0x0000000bL, 0x0cea, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
48 DEFINE_GUIDSTRUCT("0000000b-0cea-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD);
49 #define KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD)
50 
51 #define STATIC_KSDATAFORMAT_SUBTYPE_IEC61937_DTS\
52  DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DTS)
53 DEFINE_GUIDSTRUCT("00000008-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEC61937_DTS);
54 #define KSDATAFORMAT_SUBTYPE_IEC61937_DTS DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEC61937_DTS)
55 
56 
57 #define KSAUDIO_SPEAKER_STEREO (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
58 #define KSAUDIO_SPEAKER_7POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
59  SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \
60  SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | \
61  SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
62 #define KSAUDIO_SPEAKER_5POINT1 (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
63  SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \
64  SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
65 #endif
66 
67 static const unsigned int WASAPISampleRateCount = 10;
68 static const unsigned int WASAPISampleRates[] = { 384000, 192000, 176400, 96000, 88200, 48000, 44100, 32000, 22050, 11025 };
69 
70 static const enum AEChannel layoutsList[][16] =
71 {
72  /* Most common configurations */
73  {AE_CH_FC, AE_CH_NULL}, // Mono
74  {AE_CH_FL, AE_CH_FR, AE_CH_NULL}, // Stereo
75  {AE_CH_FL, AE_CH_FR, AE_CH_LFE, AE_CH_NULL}, // 2.1
76  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_NULL}, // 3 front speakers
77  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_NULL}, // 3 front speakers + LFE
78  {AE_CH_FL, AE_CH_FR, AE_CH_BL, AE_CH_BR, AE_CH_NULL}, // Quad
79  {AE_CH_FL, AE_CH_FR, AE_CH_BL, AE_CH_BR, AE_CH_LFE, AE_CH_NULL}, // Quad + LFE
80  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BC, AE_CH_NULL}, // Surround
81  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BC, AE_CH_LFE, AE_CH_NULL}, // Surround + LFE
82  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_NULL}, // Standard 5.1
83  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_BL, AE_CH_BR, AE_CH_NULL}, // 5.1 wide (obsolete)
84  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_NULL}, // Standard 7.1
85  /* Less common configurations */
86  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_BL, AE_CH_BR, AE_CH_FLOC,AE_CH_FROC,AE_CH_NULL}, // 7.1 wide (obsolete)
87  /* Exotic configurations */
88  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_SL, AE_CH_SR, AE_CH_NULL}, // Standard 5.1 w/o LFE
89  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_NULL}, // 5.1 wide w/o LFE
90  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_SL, AE_CH_SR, AE_CH_BC, AE_CH_NULL}, // Standard 5.1 w/o LFE + Back Center
91  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BC, AE_CH_BR, AE_CH_NULL}, // 5.1 wide w/o LFE + Back Center
92  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_BL, AE_CH_BR, AE_CH_TC, AE_CH_NULL}, // DVD speakers
93  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_BC, AE_CH_LFE, AE_CH_NULL}, // 5.1 wide + Back Center
94  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_NULL}, // Standard 7.1 w/o LFE
95  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_FLOC,AE_CH_FROC,AE_CH_NULL}, // 7.1 wide w/o LFE
96  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BC, AE_CH_BR, AE_CH_NULL}, // Standard 7.1 + Back Center
97  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_FLOC,AE_CH_FROC,AE_CH_NULL}, // Standard 7.1 + front wide
98  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_TFL, AE_CH_TFR, AE_CH_NULL}, // Standard 7.1 + 2 front top
99  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_TFL, AE_CH_TFR, AE_CH_TFC, AE_CH_NULL}, // Standard 7.1 + 3 front top
100  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_TFL, AE_CH_TFR, AE_CH_TBL, AE_CH_TBR, AE_CH_NULL}, // Standard 7.1 + 2 front top + 2 back top
101  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_TFL, AE_CH_TFR, AE_CH_TFC, AE_CH_TBL, AE_CH_TBR, AE_CH_NULL}, // Standard 7.1 + 3 front top + 2 back top
102  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_TFL, AE_CH_TFR, AE_CH_TFC, AE_CH_TBL, AE_CH_TBR, AE_CH_TBC, AE_CH_NULL}, // Standard 7.1 + 3 front top + 3 back top
103  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_BL, AE_CH_BR, AE_CH_TFL, AE_CH_TFR, AE_CH_TFC, AE_CH_TBL, AE_CH_TBR, AE_CH_TBC, AE_CH_TC, AE_CH_NULL} // Standard 7.1 + 3 front top + 3 back top + Top Center
104 };
105 
106 static enum AEChannel layoutsByChCount[9][9] = {
107  {AE_CH_NULL},
108  {AE_CH_FC, AE_CH_NULL},
109  {AE_CH_FL, AE_CH_FR, AE_CH_NULL},
110  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_NULL},
111  {AE_CH_FL, AE_CH_FR, AE_CH_BL, AE_CH_BR, AE_CH_NULL},
112  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_NULL},
113  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_LFE, AE_CH_NULL},
114  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_BC, AE_CH_LFE, AE_CH_NULL},
115  {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_SL, AE_CH_SR, AE_CH_LFE, AE_CH_NULL}};
116 
117 static const unsigned int WASAPIChannelOrder[] = {AE_CH_RAW,
118  SPEAKER_FRONT_LEFT, SPEAKER_FRONT_RIGHT, SPEAKER_FRONT_CENTER,
119  SPEAKER_LOW_FREQUENCY, SPEAKER_BACK_LEFT, SPEAKER_BACK_RIGHT,
120  SPEAKER_FRONT_LEFT_OF_CENTER, SPEAKER_FRONT_RIGHT_OF_CENTER,
121  SPEAKER_BACK_CENTER, SPEAKER_SIDE_LEFT, SPEAKER_SIDE_RIGHT,
122  SPEAKER_TOP_FRONT_LEFT, SPEAKER_TOP_FRONT_RIGHT, SPEAKER_TOP_FRONT_CENTER,
123  SPEAKER_TOP_CENTER, SPEAKER_TOP_BACK_LEFT, SPEAKER_TOP_BACK_RIGHT,
124  SPEAKER_TOP_BACK_CENTER, SPEAKER_RESERVED, SPEAKER_RESERVED};
125 
126 static const enum AEChannel AEChannelNames[] = {AE_CH_RAW,
127  AE_CH_FL, AE_CH_FR, AE_CH_FC,
128  AE_CH_LFE, AE_CH_BL, AE_CH_BR,
129  AE_CH_FLOC, AE_CH_FROC,
130  AE_CH_BC, AE_CH_SL, AE_CH_SR,
131  AE_CH_TFL, AE_CH_TFR, AE_CH_TFC ,
132  AE_CH_TC , AE_CH_TBL, AE_CH_TBR,
133  AE_CH_TBC, AE_CH_BLOC, AE_CH_BROC};
134 
136 {
137  std::string winEndpointType;
138  AEDeviceType aeDeviceType;
139 };
140 
141 const winEndpointsToAEDeviceType winEndpoints[] =
142 {
143  { "Network Device - ", AE_DEVTYPE_PCM },
144  { "Speakers - ", AE_DEVTYPE_PCM },
145  { "LineLevel - ", AE_DEVTYPE_PCM },
146  { "Headphones - ", AE_DEVTYPE_PCM },
147  { "Microphone - ", AE_DEVTYPE_PCM },
148  { "Headset - ", AE_DEVTYPE_PCM },
149  { "Handset - ", AE_DEVTYPE_PCM },
150  { "Digital Passthrough - ", AE_DEVTYPE_IEC958 },
151  { "SPDIF - ", AE_DEVTYPE_IEC958 },
152  { "HDMI - ", AE_DEVTYPE_HDMI },
153  { "Unknown - ", AE_DEVTYPE_PCM },
154 };
155 
157 {
158  GUID subFormat;
159  unsigned int bitsPerSample;
160  unsigned int validBitsPerSample;
161  AEDataFormat subFormatType;
162 };
163 
170 static const sampleFormat testFormats[] = { {KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 32, 32, AE_FMT_FLOAT},
171  {KSDATAFORMAT_SUBTYPE_PCM, 32, 24, AE_FMT_S24NE4MSB},
172  {KSDATAFORMAT_SUBTYPE_PCM, 32, 32, AE_FMT_S32NE},
173  {KSDATAFORMAT_SUBTYPE_PCM, 24, 24, AE_FMT_S24NE3},
174  {KSDATAFORMAT_SUBTYPE_PCM, 16, 16, AE_FMT_S16NE} };
175 
177 {
178  std::string strDeviceId;
179  std::string strDescription;
180  std::string strWinDevType;
181  AEDeviceType eDeviceType;
182  unsigned int nChannels;
183  unsigned int uiChannelMask;
184  bool bDefault;
185 };
186 
188 {
189  std::string deviceId;
190  virtual int Release() = 0;
191  virtual HRESULT Activate(IAudioClient** ppAudioClient) = 0;
192  virtual bool IsUSBDevice() = 0;
193 };
194 
196 {
197 public:
198  /*
199  Gets list of audio renderers available on platform
200  */
201  static std::vector<RendererDetail> GetRendererDetails();
202  /*
203  Gets default device id
204  */
205  static std::string GetDefaultDeviceId();
206  /*
207  Initialize IAEWASAPIDevice
208  */
209  static HRESULT ActivateWASAPIDevice(std::string &device, IAEWASAPIDevice** ppDevice);
210 
211  static void AEChannelsFromSpeakerMask(CAEChannelInfo& channelLayout, DWORD speakers);
212 
213  static DWORD SpeakerMaskFromAEChannels(const CAEChannelInfo &channels);
214 
215  static DWORD ChLayoutToChMask(const enum AEChannel * layout, unsigned int * numberOfChannels = NULL);
216 
217  static void BuildWaveFormatExtensible(AEAudioFormat &format, WAVEFORMATEXTENSIBLE &wfxex);
218 };
Definition: AESinkFactoryWin.h:156
Definition: AESinkFactoryWin.h:187
Definition: AESinkFactoryWin.h:135
The audio format structure that fully defines a stream&#39;s audio information.
Definition: AEAudioFormat.h:19
Definition: AESinkFactoryWin.h:176
Definition: AEChannelInfo.h:19
Definition: AESinkFactoryWin.h:195