239 lines
14 KiB
C
239 lines
14 KiB
C
|
/*
|
||
|
File: CAHALAudioDevice.h
|
||
|
Abstract: Part of CoreAudio Utility Classes
|
||
|
Version: 1.1
|
||
|
|
||
|
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
|
||
|
Inc. ("Apple") in consideration of your agreement to the following
|
||
|
terms, and your use, installation, modification or redistribution of
|
||
|
this Apple software constitutes acceptance of these terms. If you do
|
||
|
not agree with these terms, please do not use, install, modify or
|
||
|
redistribute this Apple software.
|
||
|
|
||
|
In consideration of your agreement to abide by the following terms, and
|
||
|
subject to these terms, Apple grants you a personal, non-exclusive
|
||
|
license, under Apple's copyrights in this original Apple software (the
|
||
|
"Apple Software"), to use, reproduce, modify and redistribute the Apple
|
||
|
Software, with or without modifications, in source and/or binary forms;
|
||
|
provided that if you redistribute the Apple Software in its entirety and
|
||
|
without modifications, you must retain this notice and the following
|
||
|
text and disclaimers in all such redistributions of the Apple Software.
|
||
|
Neither the name, trademarks, service marks or logos of Apple Inc. may
|
||
|
be used to endorse or promote products derived from the Apple Software
|
||
|
without specific prior written permission from Apple. Except as
|
||
|
expressly stated in this notice, no other rights or licenses, express or
|
||
|
implied, are granted by Apple herein, including but not limited to any
|
||
|
patent rights that may be infringed by your derivative works or by other
|
||
|
works in which the Apple Software may be incorporated.
|
||
|
|
||
|
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
|
||
|
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
|
||
|
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
|
||
|
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
|
||
|
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
|
||
|
|
||
|
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
|
||
|
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
|
||
|
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
|
||
|
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
|
||
|
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
|
||
|
POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
||
|
Copyright (C) 2014 Apple Inc. All Rights Reserved.
|
||
|
|
||
|
*/
|
||
|
#if !defined(__CAHALAudioDevice_h__)
|
||
|
#define __CAHALAudioDevice_h__
|
||
|
|
||
|
//==================================================================================================
|
||
|
// Includes
|
||
|
//==================================================================================================
|
||
|
|
||
|
// Super Class Includes
|
||
|
#include "CAHALAudioObject.h"
|
||
|
|
||
|
// PublicUtility Includes
|
||
|
#include "CADebugMacros.h"
|
||
|
#include "CAException.h"
|
||
|
|
||
|
//==================================================================================================
|
||
|
// CAHALAudioDevice
|
||
|
//==================================================================================================
|
||
|
|
||
|
class CAHALAudioDevice
|
||
|
:
|
||
|
public CAHALAudioObject
|
||
|
{
|
||
|
|
||
|
// Construction/Destruction
|
||
|
public:
|
||
|
CAHALAudioDevice(AudioObjectID inAudioDevice);
|
||
|
CAHALAudioDevice(CFStringRef inUID);
|
||
|
virtual ~CAHALAudioDevice();
|
||
|
|
||
|
// General Stuff
|
||
|
public:
|
||
|
CFStringRef CopyDeviceUID() const;
|
||
|
bool HasModelUID() const;
|
||
|
CFStringRef CopyModelUID() const;
|
||
|
CFStringRef CopyConfigurationApplicationBundleID() const;
|
||
|
CFURLRef CopyIconLocation() const;
|
||
|
UInt32 GetTransportType() const;
|
||
|
bool CanBeDefaultDevice(bool inIsInput, bool inIsSystem) const;
|
||
|
bool HasDevicePlugInStatus() const;
|
||
|
OSStatus GetDevicePlugInStatus() const;
|
||
|
bool IsAlive() const;
|
||
|
bool IsHidden() const;
|
||
|
pid_t GetHogModeOwner() const;
|
||
|
bool IsHogModeSettable() const;
|
||
|
bool TakeHogMode();
|
||
|
void ReleaseHogMode();
|
||
|
bool HasPreferredStereoChannels(bool inIsInput) const;
|
||
|
void GetPreferredStereoChannels(bool inIsInput, UInt32& outLeft, UInt32& outRight) const;
|
||
|
void SetPreferredStereoChannels(bool inIsInput, UInt32 inLeft, UInt32 inRight);
|
||
|
bool HasPreferredChannelLayout(bool inIsInput) const;
|
||
|
void GetPreferredChannelLayout(bool inIsInput, AudioChannelLayout& outChannelLayout) const;
|
||
|
void SetPreferredStereoChannels(bool inIsInput, AudioChannelLayout& inChannelLayout);
|
||
|
UInt32 GetNumberRelatedAudioDevices() const;
|
||
|
void GetRelatedAudioDevices(UInt32& ioNumberRelatedDevices, AudioObjectID* outRelatedDevices) const;
|
||
|
AudioObjectID GetRelatedAudioDeviceByIndex(UInt32 inIndex) const;
|
||
|
|
||
|
// Stream Stuff
|
||
|
public:
|
||
|
UInt32 GetNumberStreams(bool inIsInput) const;
|
||
|
void GetStreams(bool inIsInput, UInt32& ioNumberStreams, AudioObjectID* outStreamList) const;
|
||
|
AudioObjectID GetStreamByIndex(bool inIsInput, UInt32 inIndex) const;
|
||
|
UInt32 GetTotalNumberChannels(bool inIsInput) const;
|
||
|
void GetCurrentVirtualFormats(bool inIsInput, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
|
||
|
void GetCurrentPhysicalFormats(bool inIsInput, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
|
||
|
|
||
|
// IO Stuff
|
||
|
public:
|
||
|
bool IsRunning() const;
|
||
|
bool IsRunningSomewhere() const;
|
||
|
UInt32 GetLatency(bool inIsInput) const;
|
||
|
UInt32 GetSafetyOffset(bool inIsInput) const;
|
||
|
bool HasClockDomain() const;
|
||
|
UInt32 GetClockDomain() const;
|
||
|
Float64 GetActualSampleRate() const;
|
||
|
Float64 GetNominalSampleRate() const;
|
||
|
void SetNominalSampleRate(Float64 inSampleRate);
|
||
|
UInt32 GetNumberAvailableNominalSampleRateRanges() const;
|
||
|
void GetAvailableNominalSampleRateRanges(UInt32& ioNumberRanges, AudioValueRange* outRanges) const;
|
||
|
void GetAvailableNominalSampleRateRangeByIndex(UInt32 inIndex, Float64& outMinimum, Float64& outMaximum) const;
|
||
|
bool IsValidNominalSampleRate(Float64 inSampleRate) const;
|
||
|
bool IsIOBufferSizeSettable() const;
|
||
|
UInt32 GetIOBufferSize() const;
|
||
|
void SetIOBufferSize(UInt32 inBufferSize);
|
||
|
bool UsesVariableIOBufferSizes() const;
|
||
|
UInt32 GetMaximumVariableIOBufferSize() const;
|
||
|
bool HasIOBufferSizeRange() const;
|
||
|
void GetIOBufferSizeRange(UInt32& outMinimum, UInt32& outMaximum) const;
|
||
|
AudioDeviceIOProcID CreateIOProcID(AudioDeviceIOProc inIOProc, void* inClientData);
|
||
|
AudioDeviceIOProcID CreateIOProcIDWithBlock(dispatch_queue_t inDispatchQueue, AudioDeviceIOBlock inIOBlock);
|
||
|
void DestroyIOProcID(AudioDeviceIOProcID inIOProcID);
|
||
|
void StartIOProc(AudioDeviceIOProcID inIOProcID);
|
||
|
void StartIOProcAtTime(AudioDeviceIOProcID inIOProcID, AudioTimeStamp& ioStartTime, bool inIsInput, bool inIgnoreHardware);
|
||
|
void StopIOProc(AudioDeviceIOProcID inIOProcID);
|
||
|
void GetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool inIsInput, bool* outStreamUsage) const;
|
||
|
void SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool inIsInput, const bool* inStreamUsage);
|
||
|
Float32 GetIOCycleUsage() const;
|
||
|
void SetIOCycleUsage(Float32 inValue);
|
||
|
|
||
|
// Time Operations
|
||
|
public:
|
||
|
void GetCurrentTime(AudioTimeStamp& outTime);
|
||
|
void TranslateTime(const AudioTimeStamp& inTime, AudioTimeStamp& outTime);
|
||
|
void GetNearestStartTime(AudioTimeStamp& ioTime, bool inIsInput, bool inIgnoreHardware);
|
||
|
|
||
|
// Controls
|
||
|
public:
|
||
|
bool HasVolumeControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool VolumeControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
Float32 GetVolumeControlScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
Float32 GetVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetVolumeControlScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
|
||
|
void SetVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
|
||
|
Float32 GetVolumeControlScalarForDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
|
||
|
Float32 GetVolumeControlDecibelForScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
|
||
|
|
||
|
bool HasSubVolumeControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool SubVolumeControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
Float32 GetSubVolumeControlScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
Float32 GetSubVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetSubVolumeControlScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
|
||
|
void SetSubVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
|
||
|
Float32 GetSubVolumeControlScalarForDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
|
||
|
Float32 GetSubVolumeControlDecibelForScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
|
||
|
|
||
|
bool HasMuteControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool MuteControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool GetMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
|
||
|
|
||
|
bool HasSoloControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool SoloControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool GetSoloControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetSoloControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
|
||
|
|
||
|
bool HasStereoPanControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool StereoPanControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
Float32 GetStereoPanControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetStereoPanControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
|
||
|
void GetStereoPanControlChannels(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32& outLeftChannel, UInt32& outRightChannel) const;
|
||
|
|
||
|
bool HasJackControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool GetJackControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
|
||
|
bool HasSubMuteControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool SubMuteControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool GetSubMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetSubMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
|
||
|
|
||
|
bool HasiSubOwnerControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool iSubOwnerControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool GetiSubOwnerControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetiSubOwnerControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
|
||
|
|
||
|
bool HasDataSourceControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool DataSourceControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
UInt32 GetCurrentDataSourceID(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetCurrentDataSourceByID(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32 inID);
|
||
|
UInt32 GetNumberAvailableDataSources(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void GetAvailableDataSources(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32& ioNumberSources, UInt32* outSources) const;
|
||
|
UInt32 GetAvailableDataSourceByIndex(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32 inIndex) const;
|
||
|
CFStringRef CopyDataSourceNameForID(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32 inID) const;
|
||
|
|
||
|
bool HasDataDestinationControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
bool DataDestinationControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
UInt32 GetCurrentDataDestinationID(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void SetCurrentDataDestinationByID(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32 inID);
|
||
|
UInt32 GetNumberAvailableDataDestinations(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
|
||
|
void GetAvailableDataDestinations(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32& ioNumberDestinations, UInt32* outDestinations) const;
|
||
|
UInt32 GetAvailableDataDestinationByIndex(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32 inIndex) const;
|
||
|
CFStringRef CopyDataDestinationNameForID(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32 inID) const;
|
||
|
|
||
|
bool HasClockSourceControl() const;
|
||
|
bool ClockSourceControlIsSettable() const;
|
||
|
UInt32 GetCurrentClockSourceID() const;
|
||
|
void SetCurrentClockSourceByID(UInt32 inID);
|
||
|
UInt32 GetNumberAvailableClockSources() const;
|
||
|
void GetAvailableClockSources(UInt32& ioNumberSources, UInt32* outSources) const;
|
||
|
UInt32 GetAvailableClockSourceByIndex(UInt32 inIndex) const;
|
||
|
CFStringRef CopyClockSourceNameForID(UInt32 inID) const;
|
||
|
UInt32 GetClockSourceKindForID(UInt32 inID) const;
|
||
|
|
||
|
};
|
||
|
|
||
|
inline AudioDeviceIOProcID CAHALAudioDevice::CreateIOProcIDWithBlock(dispatch_queue_t inDispatchQueue, AudioDeviceIOBlock inIOBlock)
|
||
|
{
|
||
|
AudioDeviceIOProcID theAnswer = NULL;
|
||
|
OSStatus theError = AudioDeviceCreateIOProcIDWithBlock(&theAnswer, mObjectID, inDispatchQueue, inIOBlock);
|
||
|
ThrowIfError(theError, CAException(theError), "CAHALAudioDevice::CreateIOProcIDWithBlock: got an error creating the IOProc ID");
|
||
|
return theAnswer;
|
||
|
}
|
||
|
|
||
|
#endif
|