18#include <CoreAudio/AudioServerPlugIn.h>
26#include <unordered_map>
37 std::string
Name =
"libASPL Device";
104 kAudioDeviceClockAlgorithmSimpleIIR;
171 explicit Device(std::shared_ptr<const Context> context,
552 AudioObjectPropertyScope scope = kAudioObjectPropertyScopeGlobal)
const;
563 AudioObjectPropertyScope scope = kAudioObjectPropertyScopeGlobal)
const;
766 const AudioServerPlugInClientInfo* rawClientInfo);
771 const AudioServerPlugInClientInfo* rawClientInfo);
794 virtual OSStatus
StartIO(AudioObjectID objectID, UInt32 clientID);
808 virtual OSStatus
StopIO(AudioObjectID objectID, UInt32 clientID);
850 Float64* outSampleTime,
866 Boolean* outWillDoInPlace);
878 UInt32 ioBufferFrameSize,
879 const AudioServerPlugInIOCycleInfo* ioCycleInfo);
890 AudioObjectID streamID,
893 UInt32 ioBufferFrameSize,
894 const AudioServerPlugInIOCycleInfo* ioCycleInfo,
896 void* ioSecondaryBuffer);
908 UInt32 ioBufferFrameSize,
909 const AudioServerPlugInIOCycleInfo* ioCycleInfo);
985 const AudioObjectPropertyAddress* address)
const override;
990 const AudioObjectPropertyAddress* address,
991 Boolean* outIsSettable)
const override;
996 const AudioObjectPropertyAddress* address,
997 UInt32 qualifierDataSize,
998 const void* qualifierData,
999 UInt32* outDataSize)
const override;
1004 const AudioObjectPropertyAddress* address,
1005 UInt32 qualifierDataSize,
1006 const void* qualifierData,
1008 UInt32* outDataSize,
1009 void* outData)
const override;
1014 const AudioObjectPropertyAddress* address,
1015 UInt32 qualifierDataSize,
1016 const void* qualifierData,
1018 const void* inData)
override;
1074 std::vector<AudioChannelDescription> channels);
1158 Float64* outSampleTime,
1159 UInt64* outHostTime,
1170 Boolean* outWillDoInPlace);
1178 UInt32 ioBufferFrameSize,
1179 const AudioServerPlugInIOCycleInfo* ioCycleInfo);
1189 UInt32 ioBufferFrameSize,
1190 const AudioServerPlugInIOCycleInfo* ioCycleInfo,
1192 void* ioSecondaryBuffer);
1200 UInt32 ioBufferFrameSize,
1201 const AudioServerPlugInIOCycleInfo* ioCycleInfo);
1207 OSStatus CheckNominalSampleRate(Float64 rate)
const;
1211 const std::string deviceUID_;
1214 std::atomic<UInt32> numInputStreams_ = 0;
1215 std::atomic<UInt32> numOutputStreams_ = 0;
1217 std::atomic<bool> isAlive_ =
true;
1218 std::atomic<bool> isHidden_ =
false;
1220 std::atomic<bool> canBeDefaultDevice_;
1221 std::atomic<bool> canBeDefaultSystemDevice_;
1223 std::atomic<UInt32> latency_;
1224 std::atomic<UInt32> safetyOffset_;
1225 std::atomic<UInt32> zeroTimeStampPeriod_;
1226 std::atomic<Float64> nominalSampleRate_;
1228 std::atomic<SInt32> startCount_ = 0;
1231 mutable std::recursive_mutex writeMutex_;
1244 DoubleBuffer<std::unordered_map<AudioObjectPropertyScope,
1245 std::vector<std::shared_ptr<VolumeControl>>>>
1251 DoubleBuffer<std::unordered_map<AudioObjectPropertyScope,
1252 std::vector<std::shared_ptr<MuteControl>>>>
1266 std::map<UInt64, std::function<void()>> pendingConfigurationRequests_;
1267 UInt64 lastConfigurationRequestID_ = 0;
1268 UInt64 insideConfigurationHandler_ = 0;
1271 mutable std::recursive_mutex ioMutex_;
1275 Float64 hostTicksPerFrame_ = 0;
1276 Float64 lastSampleRate_ = 0;
1279 UInt64 anchorHostTime_ = 0;
1280 UInt64 periodCounter_ = 0;
1283 Float64 currentPeriodTimestamp_ = 0;
1284 UInt64 currentPeriodHostTime_ = 0;
Handler for control requests to device.
Handler for I/O requests to device.
Handler for control requests to device.
OSStatus SetAvailableSampleRatesAsync(std::vector< AudioValueRange > rates)
Asynchronously set list of supported nominal sample rates. See comments for GetAvailableSampleRates()...
std::shared_ptr< VolumeControl > GetVolumeControlByID(AudioObjectID controlID) const
Get volume control with given object ID. Returns nullptr if there is no such control.
virtual OSStatus StartIO(AudioObjectID objectID, UInt32 clientID)
Tell the device to start I/O. Invokes ControlRequestHandler::OnStartIO() and updates GetIsRunning()....
virtual std::string GetFirmwareVersion() const
Get firmware version. Human readable firmware version of the device. This is pure informational value...
virtual OSStatus StopIOImpl(UInt32 clientID, UInt32 startCount)
Prepare device to finish I/O. Invoked by StopIO().
UInt32 GetClientCount() const
Get number of clients.
virtual bool GetClockIsStable() const
Check whether the device clock should be considered stable. By default returns DeviceParameters::Cloc...
AudioClassID GetClass() const override
Get class ID.
virtual std::string GetConfigurationApplicationBundleID() const
Get bundle ID of configuration application. The returned app should provides a GUI for configuring th...
Device(std::shared_ptr< const Context > context, const DeviceParameters ¶ms={})
Construct device.
std::shared_ptr< Stream > GetStreamByIndex(Direction dir, UInt32 idx) const
Get stream with given direction and zero-based index. Returns nullptr if there are less than idx+1 st...
virtual void RequestOwnershipChange(Object *owner, bool shouldHaveOwnership)
Request device to change its owner.
virtual OSStatus SetPreferredChannelsImpl(std::vector< AudioChannelDescription > channels)
Invoked by SetPreferredChannelsAsync() to actually change the value. Default implementation changes t...
OSStatus SetIsIdentifying(bool)
Start or stop device identification. Invokes SetIsIdentifyingImpl() and NotifyPropertyChanged().
std::shared_ptr< MuteControl > AddMuteControlAsync(const MuteControlParameters ¶ms)
Add mute control to device. Same as AddMuteControlAsync(Direction), but allows to provide custom para...
virtual OSStatus StartIOImpl(UInt32 clientID, UInt32 startCount)
Prepare device to start I/O. Invoked by StartIO().
OSStatus SetSafetyOffsetAsync(UInt32 offset)
Asynchronously set safety offset. Requests HAL to asynchronously invoke SetSafetyOffsetImpl().
virtual Float64 GetNominalSampleRate() const
Get nominal sample rate. By default returns the last value set by SetNominalSampleRateAsync()....
AudioClassID GetBaseClass() const override
Get base class ID.
OSStatus SetPreferredChannelLayoutAsync(std::vector< UInt8 > channelLayout)
Asynchronously set preferred channel layout. See comments for GetPreferredChannelLayout()....
std::shared_ptr< Stream > AddStreamWithControlsAsync(const StreamParameters ¶ms)
Add stream + volume control + mute control. Same as AddStreamWithControlsAsync(Direction),...
virtual void RequestConfigurationChange(std::function< void()> func={})
Request HAL to perform configuration update.
virtual OSStatus StopIO(AudioObjectID objectID, UInt32 clientID)
Tell the device to stop I/O. Invokes ControlRequestHandler::OnStopIO() and updates GetIsRunning()....
virtual OSStatus SetPreferredChannelLayoutImpl(std::vector< UInt8 > channelLayout)
Invoked by SetPreferredChannelLayoutAsync() to actually change the value. Default implementation chan...
void AddVolumeControlAsync(std::shared_ptr< VolumeControl > control)
Add volume control to device. Same as AddVolumeControlAsync(Direction), but allows to construct contr...
OSStatus SetLatencyAsync(UInt32 latency)
Asynchronously set presentation latency. Requests HAL to asynchronously invoke SetLatencyImpl().
virtual OSStatus EndIOOperationImpl(UInt32 clientID, UInt32 operationID, UInt32 ioBufferFrameSize, const AudioServerPlugInIOCycleInfo *ioCycleInfo)
Called after performing I/O operation. Invoked by EndIOOperation().
void SetIOHandler(IORequestHandler *handler)
Set handler for I/O requests (raw pointer overload). This overload uses raw pointer instead of shared...
std::shared_ptr< Stream > AddStreamAsync(const StreamParameters ¶ms)
Add stream to device. Same as AddStreamAsync(Direction), but allows to provide custom parameters.
virtual OSStatus SetIsIdentifyingImpl(bool isIdentifying)
Start or stop device identification. This can be requested by UI, but probably makes little sense to ...
OSStatus GetPropertyDataSize(AudioObjectID objectID, pid_t clientPID, const AudioObjectPropertyAddress *address, UInt32 qualifierDataSize, const void *qualifierData, UInt32 *outDataSize) const override
Get size of property value in bytes.
virtual OSStatus GetZeroTimeStampImpl(UInt32 clientID, Float64 *outSampleTime, UInt64 *outHostTime, UInt64 *outSeed)
Get the current zero timestamp for the device. Invoked by GetZeroTimeStamp().
virtual OSStatus BeginIOOperation(AudioObjectID objectID, UInt32 clientID, UInt32 operationID, UInt32 ioBufferFrameSize, const AudioServerPlugInIOCycleInfo *ioCycleInfo)
Called before performing I/O operation. By default does nothing.
virtual OSStatus AddClient(AudioObjectID objectID, const AudioServerPlugInClientInfo *rawClientInfo)
Called before new client start I/O with the device. Updates client map and invokes OnAddClient().
virtual OSStatus SetPreferredChannelsForStereoImpl(std::array< UInt32, 2 > channels)
Set channels for stereo. Invoked by SetPreferredChannelsForStereoAsync() to actually change the value...
virtual std::vector< UInt8 > GetPreferredChannelLayout() const
Get preferred AudioChannelLayout to use for the device.
UInt32 GetStreamCount(Direction dir) const
Get number of streams for given direction.
Boolean HasProperty(AudioObjectID objectID, pid_t clientPID, const AudioObjectPropertyAddress *address) const override
Check whether given property is present.
virtual std::vector< AudioObjectID > GetStreamIDs(AudioObjectPropertyScope scope=kAudioObjectPropertyScopeGlobal) const
Get device streams. Returns the list of owned streams. Scope defines whether to return input streams,...
virtual UInt32 GetLatency() const
Get presentation latency of the device. Measured in number of frames. By default returns the last val...
virtual OSStatus SetPreferredChannelCountImpl(UInt32 channelCount)
Set preferred channel count. Invoked by SetPreferredChannelCountAsync() to actually change the value....
OSStatus SetPropertyData(AudioObjectID objectID, pid_t clientPID, const AudioObjectPropertyAddress *address, UInt32 qualifierDataSize, const void *qualifierData, UInt32 inDataSize, const void *inData) override
Change property value.
virtual std::vector< AudioObjectID > GetControlIDs(AudioObjectPropertyScope scope=kAudioObjectPropertyScopeGlobal) const
Get device controls. Returns the list of owned controls. Scope defines whether to return input contro...
virtual OSStatus SetLatencyImpl(UInt32 latency)
Set presentation latency. Invoked by SetLatencyAsync() to actually change latency....
OSStatus SetCanBeDefaultSystemDevice(bool value)
Set whether the device can be the default device for system sounds. Invokes SetCanBeDefaultSystemDevi...
virtual std::string GetManufacturer() const
Get device manufacturer. Human readable name of the maker of the plug-in. Can be localized....
void RemoveMuteControlAsync(std::shared_ptr< MuteControl > control)
Remove mute control from device.
virtual std::string GetSerialNumber() const
Get serial number. Human readable serial number of the device. This is pure informational value which...
std::shared_ptr< VolumeControl > GetVolumeControlByIndex(AudioObjectPropertyScope scope, UInt32 idx) const
Get volume control with given scope and zero-based index. Returns nullptr if there are less than idx+...
virtual std::string GetName() const
Get device name. Human readable name of the device. Can be localized. By default returns DeviceParame...
std::shared_ptr< Stream > GetStreamByID(AudioObjectID streamID) const
Get stream with given object ID. Returns nullptr if there is no such stream.
UInt32 GetMuteControlCount(AudioObjectPropertyScope scope) const
Get number of mute controls for given scope.
virtual OSStatus SetSafetyOffsetImpl(UInt32 offset)
Set safety offset. Invoked by SetSafetyOffsetAsync() to actually change offset. Default implementatio...
virtual bool GetIsRunning() const
Check whether the device is doing I/O. By default, returns true if I/O was activated using StartIO().
virtual std::vector< AudioObjectID > GetRelatedDeviceIDs() const
Get related devices. By default returns a single-element list with own ID.
virtual std::string GetModelUID() const
Get model UID. Persistent token that can identify audio devices of the same kind. Two instances of th...
virtual UInt32 GetClockDomain() const
Get clock domain. By default returns DeviceParameters::ClockDomain.
OSStatus SetPreferredChannelsForStereoAsync(std::array< UInt32, 2 > channels)
Asynchronously set channels for stereo. Channel numbers are 1-based. Requests HAL to asynchronously i...
virtual std::string GetIconURL() const
Get device icon URL. Returns URL that points to the device icon, e.g in plugin resource bundle....
std::shared_ptr< Stream > AddStreamWithControlsAsync(Direction dir)
Add stream + volume control + mute control.
virtual bool GetCanBeDefaultSystemDevice() const
Check whether the device can be the default device for system sounds. By default, returns the last va...
virtual OSStatus SetAvailableSampleRatesImpl(std::vector< AudioValueRange > rates)
Set list of supported nominal sample rates. Invoked by SetAvailableSampleRatesAsync() to actually cha...
virtual bool GetIsAlive() const
Check whether the device is alive. By default returns the last value set by SetIsAlive()....
virtual std::vector< AudioValueRange > GetAvailableSampleRates() const
Get list of supported nominal sample rates. By default returns the list set by SetAvailableSampleRate...
std::shared_ptr< Client > GetClientByID(UInt32 clientID) const
Find client by client ID.
void RemoveStreamAsync(std::shared_ptr< Stream > stream)
Remove stream from device.
virtual OSStatus PerformConfigurationChange(AudioObjectID objectID, UInt64 changeAction, void *changeInfo)
Called by the Host to allow the device to perform a configuration change that had been previously req...
virtual UInt32 GetPreferredChannelCount() const
Get preferred number of channels.
void AddMuteControlAsync(std::shared_ptr< MuteControl > control)
Add mute control to device. Same as AddMuteControlAsync(Direction), but allows to construct control m...
virtual OSStatus SetNominalSampleRateImpl(Float64 rate)
Set nominal sample rate. Invoked by SetNominalSampleRateAsync() to actually change the rate....
virtual AudioDeviceClockAlgorithmSelector GetClockAlgorithm() const
Get clock algorithm. By default returns DeviceParameters::ClockAlgorithm.
OSStatus SetCanBeDefaultDevice(bool value)
Set whether the device can be the default device for content. Invokes SetCanBeDefaultDeviceImpl() and...
UInt32 GetVolumeControlCount(AudioObjectPropertyScope scope) const
Get number of volume controls for given scope.
virtual OSStatus SetIsHiddenImpl(bool isHidden)
Mark or unmark device as hidden. By default just changes the value returned by GetIsHidden()....
virtual std::array< UInt32, 2 > GetPreferredChannelsForStereo() const
Return which two channels to use as left/right for stereo data by default. By default returns the las...
void SetControlHandler(ControlRequestHandler *handler)
Set handler for control requests (raw pointer overload). This overload uses raw pointer instead of sh...
OSStatus SetPreferredChannelCountAsync(UInt32 channelCount)
Asynchronously set preferred channel count. See comments for GetPreferredChannelCount()....
virtual std::vector< AudioChannelDescription > GetPreferredChannels() const
Get preferred channels for device.
virtual OSStatus DoIOOperation(AudioObjectID objectID, AudioObjectID streamID, UInt32 clientID, UInt32 operationID, UInt32 ioBufferFrameSize, const AudioServerPlugInIOCycleInfo *ioCycleInfo, void *ioMainBuffer, void *ioSecondaryBuffer)
Perform an IO operation for a particular stream. In default implementation, invokes corresponding met...
void AddStreamAsync(std::shared_ptr< Stream > stream)
Add stream to device. Same as AddStreamAsync(Direction), but allows to construct stream manually.
virtual UInt32 GetTransportType() const
Get device transport type. Represents how the device is attached to the system. Common values are def...
virtual OSStatus SetIsAliveImpl(bool isAlive)
Mark device as alive or dead. By default just changes the value returned by GetIsAlive()....
OSStatus SetZeroTimeStampPeriodAsync(UInt32 period)
Asynchronously set zero timestamp period. Requests HAL to asynchronously invoke SetZeroTimeStampPerio...
virtual OSStatus EndIOOperation(AudioObjectID objectID, UInt32 clientID, UInt32 operationID, UInt32 ioBufferFrameSize, const AudioServerPlugInIOCycleInfo *ioCycleInfo)
Called after performing I/O operation. By default does nothing.
virtual bool GetCanBeDefaultDevice() const
Check whether the device can be the default device for content. By default, returns the last value se...
virtual OSStatus BeginIOOperationImpl(UInt32 clientID, UInt32 operationID, UInt32 ioBufferFrameSize, const AudioServerPlugInIOCycleInfo *ioCycleInfo)
Called before performing I/O operation. Invoked by BeginIOOperation().
void RemoveVolumeControlAsync(std::shared_ptr< VolumeControl > control)
Remove volume control from device.
virtual OSStatus GetZeroTimeStamp(AudioObjectID objectID, UInt32 clientID, Float64 *outSampleTime, UInt64 *outHostTime, UInt64 *outSeed)
Get the current zero time stamp for the device. In default implementation, the zero time stamp and ho...
virtual bool GetIsHidden() const
Check whether the device is hidden from clients. By default returns the last value set by SetIsHidden...
std::shared_ptr< VolumeControl > AddVolumeControlAsync(const VolumeControlParameters ¶ms)
Add volume control to device. Same as AddVolumeControlAsync(Direction), but allows to provide custom ...
virtual OSStatus AbortConfigurationChange(AudioObjectID objectID, UInt64 changeAction, void *changeInfo)
Called by the Host to tell the device not to perform a configuration change that had been requested v...
virtual OSStatus DoIOOperationImpl(AudioObjectID streamID, UInt32 clientID, UInt32 operationID, UInt32 ioBufferFrameSize, const AudioServerPlugInIOCycleInfo *ioCycleInfo, void *ioMainBuffer, void *ioSecondaryBuffer)
Perform an IO operation for a particular stream. Invoked by DoIOOperation().
OSStatus SetIsHidden(bool isHidden)
Mark or unmark device as hidden. Invokes SetIsHiddenImpl() and NotifyPropertyChanged().
OSStatus GetPropertyData(AudioObjectID objectID, pid_t clientPID, const AudioObjectPropertyAddress *address, UInt32 qualifierDataSize, const void *qualifierData, UInt32 inDataSize, UInt32 *outDataSize, void *outData) const override
Get property value.
OSStatus SetNominalSampleRateAsync(Float64 rate)
Asynchronously set nominal sample rate. Requests HAL to asynchronously invoke SetNominalSampleRateImp...
OSStatus IsPropertySettable(AudioObjectID objectID, pid_t clientPID, const AudioObjectPropertyAddress *address, Boolean *outIsSettable) const override
Check whether given property can be changed.
virtual OSStatus WillDoIOOperationImpl(UInt32 clientID, UInt32 operationID, Boolean *outWillDo, Boolean *outWillDoInPlace)
Asks device whether it want to perform the given phase of the IO cycle. Invoked by WillDoIOOperation(...
virtual OSStatus SetCanBeDefaultDeviceImpl(bool value)
Set whether the device can be the default device for content. By default just changes the value retur...
virtual OSStatus RemoveClient(AudioObjectID objectID, const AudioServerPlugInClientInfo *rawClientInfo)
Called after a client finishes I/O with the device. Updates client map and invokes OnRemoveClient().
virtual UInt32 GetZeroTimeStampPeriod() const
Difference between successive timestamps returned from GetZeroTimeStamp(). Measured in number of fram...
virtual OSStatus WillDoIOOperation(AudioObjectID objectID, UInt32 clientID, UInt32 operationID, Boolean *outWillDo, Boolean *outWillDoInPlace)
Asks device whether it want to perform the given phase of the IO cycle. In default implementation,...
virtual std::string GetDeviceUID() const
Get device UID. Persistent token that can identify the same audio device across boot sessions....
void SetIOHandler(std::shared_ptr< IORequestHandler > handler)
Set handler for I/O requests. Its methods will be invoked when an I/O operation is performed....
std::shared_ptr< MuteControl > GetMuteControlByID(AudioObjectID controlID) const
Get mute control with given object ID. Returns nullptr if there is no such control.
virtual OSStatus SetZeroTimeStampPeriodImpl(UInt32 period)
Set zero timestamp period. Invoked by SetZeroTimeStampPeriodAsync() to actually change period....
std::shared_ptr< MuteControl > GetMuteControlByIndex(AudioObjectPropertyScope scope, UInt32 idx) const
Get mute control with given scope and zero-based index. Returns nullptr if there are less than idx+1 ...
ControlRequestHandler * GetControlHandler() const
Get pointer to configured control handler. Never returns null, if there is no handler,...
bool IsInstance(AudioClassID classID) const override
Check if this object is instance of given base class.
void SetControlHandler(std::shared_ptr< ControlRequestHandler > handler)
Set handler for control requests. This is optional. You may provide a custom handler if you want to d...
std::shared_ptr< Stream > AddStreamAsync(Direction dir)
Add stream to device.
OSStatus SetIsAlive(bool isAlive)
Mark device as alive or dead. Invokes SetIsAliveImpl() and NotifyPropertyChanged().
OSStatus SetPreferredChannelsAsync(std::vector< AudioChannelDescription > channels)
Asynchronously set preferred channels array. See comments for GetPreferredChannels()....
std::shared_ptr< MuteControl > AddMuteControlAsync(AudioObjectPropertyScope scope)
Add mute control to device.
virtual OSStatus SetCanBeDefaultSystemDeviceImpl(bool value)
Set whether the device can be the default device for system sounds. By default just changes the value...
IORequestHandler * GetIOHandler() const
Get pointer to configured I/O handler. Never returns null, if there is no handler,...
std::shared_ptr< VolumeControl > AddVolumeControlAsync(AudioObjectPropertyScope scope)
Add volume control to device.
std::vector< std::shared_ptr< Client > > GetClients() const
Get all clients.
virtual UInt32 GetSafetyOffset() const
How close to now it is allowed to read and write. Measured in number of frames. By default returns th...
virtual bool GetIsIdentifying() const
Check whether device identification is in progress. A true value indicates that the device hardware i...
Doubly-buffered value with non-blocking read and blocking write.
Handler for I/O requests to device.
Base class for audio objects.
std::string Manufacturer
Human readable name of the maker of the plug-in. Used by default implementation of Device::GetManufac...
std::string DeviceUID
Persistent token that can identify the same audio device across boot sessions. Used by default implem...
std::string Name
Human-readable name of the device. Used by default implementation of Device::GetName().
std::string SerialNumber
Human readable serial number of the device. Used by default implementation of Device::GetSerialNumber...
bool EnableMixing
Whether IORequestHandler will handle mixed output from all clients, or handle individual clients and ...
bool EnableRealtimeTracing
If true, realtime calls are logged to tracer. This is not suitable for production use because tracer ...
UInt32 SafetyOffset
How close to now it is allowed to read and write, number of frames. Used by default implementation of...
UInt32 ClockDomain
Clock domain. Used by default implementation of Device::GetClockDomain().
std::string FirmwareVersion
Human readable firmware version of the device. Used by default implementation of Device::GetFirmwareV...
std::string ConfigurationApplicationBundleID
Bundle ID for an application that provides a GUI for configuring the device. Used by default implemen...
AudioDeviceClockAlgorithmSelector ClockAlgorithm
Clock algorithm. Used by default implementation of Device::GetClockAlgorithm().
UInt32 SampleRate
Device sample rate. Used by default implementation of Device::GetNominalSampleRate().
UInt32 ZeroTimeStampPeriod
How many frames to expect between successive timestamps returned from Device::GetZeroTimeStamp() Used...
std::string ModelUID
Persistent token that can identify audio devices of the same kind. Used by default implementation of ...
bool CanBeDefaultForSystemSounds
Whether the device can be the default device for system sounds. Used by default implementation of Dev...
UInt32 ChannelCount
Preferred number of channels. Used by default implementations of Device::GetPreferredChannelCount().
bool ClockIsStable
Whether the device clock should be considered stable. Used by default implementation of Device::GetCl...
std::string IconURL
URL that points to the device icon, e.g. in plugin resource bundle. Used by default implementation of...
bool CanBeDefault
Whether the device can be the default device for content. Used by default implementation of Device::G...
UInt32 Latency
The presentation latency of the device, number of frames. Used by default implementation of Device::G...
Volume control parameters.