CoreAudio/PublicUtility/CAHALAudioDevice.h

/*
     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