11 #include "cores/AudioEngine/Utils/AEDeviceInfo.h" 12 #include "cores/AudioEngine/Utils/AEUtil.h" 13 #include "utils/log.h" 15 #include <audioclient.h> 17 #define WASAPI_SPEAKER_COUNT 21 19 #ifdef TARGET_WINDOWS_STORE 20 #ifndef _WAVEFORMATEXTENSIBLE_IEC61937_ 21 #define _WAVEFORMATEXTENSIBLE_IEC61937_ 22 typedef struct _WAVEFORMATEXTENSIBLE_IEC61937
24 WAVEFORMATEXTENSIBLE FormatExt;
25 uint32_t dwEncodedSamplesPerSec;
26 uint32_t dwEncodedChannelCount;
27 uint32_t dwAverageBytesPerSec;
28 } WAVEFORMATEXTENSIBLE_IEC61937, *PWAVEFORMATEXTENSIBLE_IEC61937;
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) 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) 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) 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) 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) 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) 67 static const unsigned int WASAPISampleRateCount = 10;
68 static const unsigned int WASAPISampleRates[] = { 384000, 192000, 176400, 96000, 88200, 48000, 44100, 32000, 22050, 11025 };
70 static const enum AEChannel layoutsList[][16] =
73 {AE_CH_FC, AE_CH_NULL},
74 {AE_CH_FL, AE_CH_FR, AE_CH_NULL},
75 {AE_CH_FL, AE_CH_FR, AE_CH_LFE, AE_CH_NULL},
76 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_NULL},
77 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_NULL},
78 {AE_CH_FL, AE_CH_FR, AE_CH_BL, AE_CH_BR, AE_CH_NULL},
79 {AE_CH_FL, AE_CH_FR, AE_CH_BL, AE_CH_BR, AE_CH_LFE, AE_CH_NULL},
80 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BC, AE_CH_NULL},
81 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BC, AE_CH_LFE, AE_CH_NULL},
82 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_SL, AE_CH_SR, AE_CH_NULL},
83 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_LFE, AE_CH_BL, AE_CH_BR, AE_CH_NULL},
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},
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},
88 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_SL, AE_CH_SR, AE_CH_NULL},
89 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BR, AE_CH_NULL},
90 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_SL, AE_CH_SR, AE_CH_BC, AE_CH_NULL},
91 {AE_CH_FL, AE_CH_FR, AE_CH_FC, AE_CH_BL, AE_CH_BC, AE_CH_BR, AE_CH_NULL},
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},
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},
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},
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},
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},
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},
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},
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},
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},
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},
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},
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}
106 static enum AEChannel layoutsByChCount[9][9] = {
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}};
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};
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};
137 std::string winEndpointType;
138 AEDeviceType aeDeviceType;
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 },
159 unsigned int bitsPerSample;
160 unsigned int validBitsPerSample;
161 AEDataFormat subFormatType;
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} };
178 std::string strDeviceId;
179 std::string strDescription;
180 std::string strWinDevType;
181 AEDeviceType eDeviceType;
182 unsigned int nChannels;
183 unsigned int uiChannelMask;
189 std::string deviceId;
190 virtual int Release() = 0;
191 virtual HRESULT Activate(IAudioClient** ppAudioClient) = 0;
192 virtual bool IsUSBDevice() = 0;
201 static std::vector<RendererDetail> GetRendererDetails();
205 static std::string GetDefaultDeviceId();
209 static HRESULT ActivateWASAPIDevice(std::string &device,
IAEWASAPIDevice** ppDevice);
211 static void AEChannelsFromSpeakerMask(
CAEChannelInfo& channelLayout, DWORD speakers);
213 static DWORD SpeakerMaskFromAEChannels(
const CAEChannelInfo &channels);
215 static DWORD ChLayoutToChMask(
const enum AEChannel * layout,
unsigned int * numberOfChannels = NULL);
217 static void BuildWaveFormatExtensible(
AEAudioFormat &format, WAVEFORMATEXTENSIBLE &wfxex);
Definition: AESinkFactoryWin.h:187
Definition: AESinkFactoryWin.h:135
Definition: AESinkFactoryWin.h:176
Definition: AEChannelInfo.h:19
Definition: AESinkFactoryWin.h:195