kodi
AEDeviceEnumerationOSX.h
1 /*
2  * Copyright (C) 2014-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/Sinks/osx/CoreAudioDevice.h"
12 #include "cores/AudioEngine/Utils/AEAudioFormat.h"
13 #include "cores/AudioEngine/Utils/AEDeviceInfo.h"
14 
15 #include <string>
16 #include <utility>
17 #include <vector>
18 
20 {
21  AudioDeviceID audioDeviceId;
22  unsigned int streamIndex;
23  unsigned int sourceId;
24 };
25 typedef std::vector< std::pair<struct CADeviceInstance, CAEDeviceInfo> > CADeviceList;
26 
27 //Hierarchy:
28 // Device
29 // - 1..n streams
30 // 1..n formats
31 // - 0..n sources
32 //on non planar devices we have numstreams * numsources devices for our list
33 //on planar devices we have 1 * numsources devices for our list
35 {
36 public:
41  AEDeviceEnumerationOSX(AudioDeviceID deviceID);
42  // d'tor
43  ~AEDeviceEnumerationOSX() = default;
44 
51  CADeviceList GetDeviceInfoList() const;
52 
60  bool Enumerate();
61 
66  unsigned int GetNumPlanes() const;
67 
72  bool IsPlanar() const { return m_isPlanar; }
73 
85  bool FindSuitableFormatForStream(UInt32 &streamIdx, const AEAudioFormat &format, bool virt,
86  AudioStreamBasicDescription &outputFormat,
87  AudioStreamID &outputStream) const;
88 
93  std::string GetMasterDeviceName() const { return m_deviceName; }
94 
103  void GetAEChannelMap(CAEChannelInfo &channelMap, unsigned int channelsPerFrame) const;
104 
117  // public because its used in unit tests ...
118  float ScoreFormat(const AudioStreamBasicDescription &formatDesc, const AEAudioFormat &format) const;
119 
120 private:
121 
126  bool isDigitalDevice() const;
127 
135  void hasPassthroughOrDigitalFormats(const StreamFormatList &formatList,
136  bool &hasPassthroughFormats,
137  bool &hasDigitalFormat) const;
138 
147  enum AEDeviceType getDeviceType(bool hasPassthroughFormats, bool isDigital,
148  UInt32 numChannels, UInt32 transportType) const;
149 
153  void fillStreamList();
154 
164  float scoreSampleRate(Float64 destinationRate, unsigned int sourceRate) const;
165 
166  bool hasSampleRate(const AESampleRateList &list, const unsigned int samplerate) const;
167  bool hasDataFormat(const AEDataFormatList &list, const enum AEDataFormat format) const;
168  bool hasDataType(const AEDataTypeList &list, CAEStreamInfo::DataType type) const;
169 
179  AEDataFormatList caFormatToAE(const AudioStreamBasicDescription &formatDesc, bool isDigital) const;
180  AEDataTypeList caFormatToAEType(const AudioStreamBasicDescription &formatDesc, bool isDigital) const;
181 
182 
188  enum AEChannel caChannelToAEChannel(const AudioChannelLabel &CAChannelLabel) const;
189 
190  // for filling out the AEDeviceInfo object based on
191  // the data gathered on the last call to Enumerate()
197  AEDataFormatList getFormatListForStream(UInt32 streamIdx) const;
198 
199  AEDataTypeList getTypeListForStream(UInt32 streamIdx) const;
200 
206  CAEChannelInfo getChannelInfoForStream(UInt32 streamIdx) const;
207 
213  AESampleRateList getSampleRateListForStream(UInt32 streamIdx) const;
214 
220  std::string getDeviceNameForStream(UInt32 streamIdx) const;
221 
228  std::string getExtraDisplayNameForStream(UInt32 streamIdx) const;
229 
230  AudioDeviceID m_deviceID;
231  bool m_isPlanar = false;
232  std::string m_deviceName;
233 
234  typedef struct
235  {
236  AudioStreamID streamID;
237  StreamFormatList formatList;
238  StreamFormatList formatListVirt;
239  UInt32 numChannels;
240  bool isDigital;
241  bool hasPassthroughFormats;
242  enum AEDeviceType deviceType;
243  } caStreamInfo;
244  std::vector<caStreamInfo> m_caStreamInfos;
245  CCoreAudioDevice m_caDevice;
246 };
bool IsPlanar() const
Checks if the m_deviceID belongs to a planar or non-planar device.
Definition: AEDeviceEnumerationOSX.h:72
std::string GetMasterDeviceName() const
Returns the device name which belongs to m_deviceID without any stream/source suffixes.
Definition: AEDeviceEnumerationOSX.h:93
Definition: CoreAudioDevice.h:25
The audio format structure that fully defines a stream&#39;s audio information.
Definition: AEAudioFormat.h:19
Definition: AEDeviceEnumerationOSX.h:19
Definition: AEChannelInfo.h:19
Definition: AEDeviceEnumerationOSX.h:34