Skip to content

CoreAudio macOS xcode15.1 b2

Alex Soto edited this page Oct 26, 2023 · 1 revision

#CoreAudio.framework

diff -ruN /Applications/Xcode_15.0.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardware.h /Applications/Xcode_15.1.0-beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardware.h
--- /Applications/Xcode_15.0.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardware.h	2023-08-05 09:46:05
+++ /Applications/Xcode_15.1.0-beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardware.h	2023-10-13 13:29:08
@@ -583,6 +583,25 @@
                         property can be set in an application's info.plist using the key,
                         "AudioHardwarePowerHint". The values for this key are the strings that
                         correspond to the values in the Power Hints enum.
+    @constant       kAudioHardwarePropertyProcessObjectList
+                        An array of AudioObjectIDs that represent the Process objects for all client processes
+                        currently connected to the system.
+    @constant       kAudioHardwarePropertyTranslatePIDToProcessObject
+                        This property fetches the AudioObjectID that corresponds to the Process object
+                        that has the given PID. The PID is passed in via the qualifier as a pid_t
+                        while the AudioObjectID for the Process is returned to the caller as the
+                        property's data. Note that an error is not returned if the PID doesn't refer
+                        to any Process. Rather, this property will return kAudioObjectUnknown
+                        as the value of the property.
+    @constant       kAudioHardwarePropertyTapList
+                        An array of AudioObjectIDs that represent the Tap objects on the system.
+    @constant       kAudioHardwarePropertyTranslateUIDToTap
+                        This property fetches the AudioObjectID that corresponds to the AudioTap
+                        that has the given UID. The UID is passed in via the qualifier as a CFString
+                        while the AudioObjectID for the AudioTap is returned to the caller as the 
+                        property's data. Note that an error is not returned if the UID doesn't refer 
+                        to any AudioTap. Rather, this property will return kAudioObjectUnknown as the 
+                        value of the property.
 */
 CF_ENUM(AudioObjectPropertySelector)
 {
@@ -611,6 +630,10 @@
     kAudioHardwarePropertyUserSessionIsActiveOrHeadless         = 'user',
     kAudioHardwarePropertyServiceRestarted                      = 'srst',
     kAudioHardwarePropertyPowerHint                             = 'powh',
+    kAudioHardwarePropertyProcessObjectList                     = 'prs#',
+    kAudioHardwarePropertyTranslatePIDToProcessObject           = 'id2p',
+    kAudioHardwarePropertyTapList                               = 'tps#',
+    kAudioHardwarePropertyTranslateUIDToTap                     = 'uidt',
 };
 
 //==================================================================================================
@@ -1590,6 +1613,28 @@
  */
 #define kAudioAggregateDeviceIsStackedKey       "stacked"
 
+/*!
+    @defined        kAudioAggregateDeviceTapListKey
+    @discussion     The key used in a CFDictionary that describes the Tap composition of an
+                    AudioAggregateDevice.  The value for this key is a CFArray of CFDictionaries
+                    that describe each tap in the AudioAggregateDevice.  The keys for this
+                    CFDictionary are defined in the AudioTap section.
+*/
+#define kAudioAggregateDeviceTapListKey            "taps"
+
+/*!
+    @defined        kAudioAggregateDeviceTapAutoStartKey
+    @discussion     The key used in a CFDictionary that describes the composition of an 
+                    AudioAggregateDevice. The value for this key is a CFNumber where a non-zero  
+                    value indicates that this aggregate device’s start should wait for the first 
+                    tap that receives audio. When this key is used, calling AudioDeviceStart with
+                    the aggregate device will wait until a tapped process begins receiving its  
+                    first audio from any tapped applications. The composition must also include
+                    the private key so that the aggregate is private to the process that created
+                    it.
+*/
+#define kAudioAggregateDeviceTapAutoStartKey      "tapautostart"
+
 //==================================================================================================
 #pragma mark AudioAggregateDevice Properties
 
@@ -1623,6 +1668,12 @@
                         device will control the time base. Setting this property will enable
                         drift correction for all subdevices in the aggregate device. The caller is
                         responsible for releasing the returned CFObject.
+    @constant       kAudioAggregateDevicePropertyTapList
+                        A CFArray of CFStrings that contain the UUIDs of all the tap objects in the
+                        contained in the AudioAggregateDevice.
+    @constant       kAudioAggregateDevicePropertySubTapList
+                        An array of AudioObjectIDs for all the active sub-taps in the aggregate
+                        device.
 */
 CF_ENUM(AudioObjectPropertySelector)
 {
@@ -1631,6 +1682,8 @@
     kAudioAggregateDevicePropertyComposition            = 'acom',
     kAudioAggregateDevicePropertyMainSubDevice          = 'amst',
     kAudioAggregateDevicePropertyClockDevice            = 'apcd',
+    kAudioAggregateDevicePropertyTapList                = 'tap#',
+    kAudioAggregateDevicePropertySubTapList             = 'atap',
 };
 
 //==================================================================================================
@@ -1780,6 +1833,193 @@
     kAudioSubDevicePropertyDriftCompensationQuality = 'drfq'
 };
 
+//==================================================================================================
+#pragma mark -
+#pragma mark AudioSubTap Constants
+
+/*!
+    @enum           AudioSubTap Class Constants
+    @abstract       Various constants related to the AudioSubTap class.
+    @constant       kAudioSubTapClassID
+                        The AudioClassID that identifies the AudioSubTap class.
+*/
+CF_ENUM(AudioClassID)
+{
+    kAudioSubTapClassID     = 'stap'
+};
+
+/*!
+    @defined        kAudioSubTapUIDKey
+    @discussion     The key used in a CFDictionary that describes the state of an AudioSubTap.
+                    The value for this key is a CFString that contains the UID for the
+                    AudioSubTap.
+*/
+#define kAudioSubTapUIDKey   "uid"
+
+/*!
+    @defined        kAudioSubTapExtraInputLatencyKey
+    @discussion     The key used in a CFDictionary that describes the state of an AudioSubTap.
+                    The value for this key is a CFNumber that indicates the total number of frames
+                    of additional latency that will be added to the input side of the
+                    AudioSubTap.
+*/
+#define kAudioSubTapExtraInputLatencyKey         "latency-in"
+
+/*!
+    @defined        kAudioSubTapExtraOutputLatencyKey
+    @discussion     The key used in a CFDictionary that describes the state of an AudioSubTap.
+                    The value for this key is a CFNumber that indicates the total number of frames
+                    of additional latency that will be added to the output side of the
+                    AudioSubTap.
+*/
+#define kAudioSubTapExtraOutputLatencyKey        "latency-out"
+
+/*!
+    @defined        kAudioSubTapDriftCompensationKey
+    @discussion     The key used in a CFDictionary that describes the state of an AudioSubTap.
+                    The value for this key is a CFNumber where a non-zero value indicates that drift
+                    compensation is enabled for the AudioSubTap
+*/
+#define kAudioSubTapDriftCompensationKey         "drift"
+
+/*!
+    @defined        kAudioSubTapDriftCompensationQualityKey
+    @discussion     The key used in a CFDictionary that describes the state of an AudioSubTap.
+                    The value for this key is a CFNumber that indicates the quality of the drift
+                    compensation for the AudioSubTap
+*/
+#define kAudioSubTapDriftCompensationQualityKey  "drift quality"
+
+//==================================================================================================
+#pragma mark AudioSubTap Properties
+
+/*!
+    @enum           AudioSubTap Properties
+    @abstract       AudioObjectPropertySelector values provided by the AudioSubTap class.
+    @discussion     The AudioSubTap class is a subclass of AudioObject class and has the same
+                    scope and element structure. However, AudioSubTap objects do not implement an
+                    IO path of their own and as such do not implement any  AudioDevice properties
+                    associated with the IO path. They also don't have any streams.
+    @constant       kAudioSubTapPropertyExtraLatency
+                        A Float64 indicating the number of sample frames to add to or subtract from
+                        the latency compensation used for this AudioSubTap.
+    @constant       kAudioSubTapPropertyDriftCompensation
+                        A UInt32 where a value of 0 indicates that no drift compensation should be
+                        done for this AudioSubTap and a value of 1 means that it should.
+    @constant       kAudioSubTapPropertyDriftCompensationQuality
+                        A UInt32 that controls the trade-off between quality and CPU load in the
+                        drift compensation. The range of values is from 0 to 128, where the lower
+                        the number, the worse the quality but also the less CPU is used to do the
+                        compensation.
+*/
+CF_ENUM(AudioObjectPropertySelector)
+{
+    kAudioSubTapPropertyExtraLatency             = 'xltc',
+    kAudioSubTapPropertyDriftCompensation        = 'drft',
+    kAudioSubTapPropertyDriftCompensationQuality = 'drfq'
+};
+
+//==================================================================================================
+#pragma mark -
+#pragma mark Process Constants
+
+/*!
+    @enum           Process Class Constants
+    @abstract       Various constants related to the Process class.
+    @discussion     The Process class contains information about a client process connected to the HAL.
+    @constant       kAudioProcessClassID
+                       The AudioClassID that identifies the Process class.
+*/
+CF_ENUM(AudioClassID)
+{
+    kAudioProcessClassID = 'clnt'
+};
+
+//==================================================================================================
+#pragma mark Process Properties
+
+/*!
+    @enum           Process Properties
+    @abstract       Processes AudioObjectPropertySelector values provided by the Process class.
+    @constant       kAudioProcessPropertyPID
+                        A pid_t indicating the process ID associated with the process.
+    @constant       kAudioProcessPropertyBundleID
+                        A CFString that contains the bundle ID of the process. The caller is
+                        responsible for releasing the returned CFObject.
+    @constant       kAudioProcessPropertyDevices
+                        An array of AudioObjectIDs that represent the devices currently used by the
+                        process for output.
+    @constant       kAudioProcessPropertyIsRunning
+                        A UInt32 where a value of 0 indicates that there is not audio IO in progress
+                        in the process, and a value of 1 indicates that there is audio IO in progress
+                        in the process. Note that audio IO may in progress even if no input or output
+                        streams are active.
+    @constant       kAudioProcessPropertyIsRunningInput
+                        A UInt32 where a value of 0 indicates that the process is not running any
+                        IO or there is not any active input streams, and a value of 1 indicates that
+                        the process is running IO and there is at least one active input stream.
+    @constant       kAudioProcessPropertyIsRunningOutput
+                        A UInt32 where a value of 0 indicates that the process is not running any
+                        IO or there is not any active output streams, and a value of 1 indicates that
+                        the process is running IO and there is at least one active output stream.
+    @constant       kAudioProcessPropertyIsMuted
+                        A UInt32 where a value of 0 indicates that the process is playing audio
+                        through its selected audio devices and a value of 1 indicates that a process
+                        is currently muted by an audio tap.
+*/
+CF_ENUM(AudioObjectPropertySelector)
+{
+    kAudioProcessPropertyPID        	 = 'ppid',
+    kAudioProcessPropertyBundleID   	 = 'pbid',
+    kAudioProcessPropertyDevices    	 = 'pdv#',
+    kAudioProcessPropertyIsRunning  	 = 'pir?',
+	kAudioProcessPropertyIsRunningInput  = 'piri',
+	kAudioProcessPropertyIsRunningOutput = 'piro',
+};
+
+//==================================================================================================
+#pragma mark -
+#pragma mark Tap Constants
+
+/*!
+    @enum           Tap Class Constants
+    @abstract       Various constants related to the Tap class.
+    @discussion     The Tap class contains a list of input streams that originate from the output
+                    stream(s) of one or more processes.
+    @constant       kAudioTapClassID
+                        The AudioClassID that identifies the Tap class.
+*/
+CF_ENUM(AudioClassID)
+{
+    kAudioTapClassID = 'tcls'
+};
+
+//==================================================================================================
+#pragma mark Tap Object Properties
+
+/*!
+    @enum           Tap Object Properties
+    @abstract       AudioObjectPropertySelector values provided by the Tap Object class.
+    @discussion     The Tap class is a subclass of the AudioObject class. the class
+                    has just the global scope, kAudioObjectPropertyScopeGlobal, and only a master element.
+    @constant       kAudioTapPropertyUID
+                        A CFString that contains a persistent identifier for the Tap. A Taps UID
+                        persists until the tap is destroyed. The caller is responsible for releasing
+                        the returned CFObject.
+    @constant       kAudioTapPropertyDescription
+                        The CATapDescription used to initially create this tap. This property can be used
+                        to modify and set the description of an existing tap.
+    @constant       kAudioTapPropertyFormat
+                        An AudioStreamBasicDescription that describes the current data format for
+                        the tap. This is the format of that data that will be accessible in any aggregate
+                        device that contains the tap.
+*/
+CF_ENUM(AudioObjectPropertySelector)
+{
+    kAudioTapPropertyUID           = 'tuid',
+    kAudioTapPropertyDescription   = 'tdsc',
+    kAudioTapPropertyFormat        = 'tfmt',
+};
 
 //==================================================================================================
 
diff -ruN /Applications/Xcode_15.0.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardwareTapping.h /Applications/Xcode_15.1.0-beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardwareTapping.h
--- /Applications/Xcode_15.0.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardwareTapping.h	1969-12-31 19:00:00
+++ /Applications/Xcode_15.1.0-beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardwareTapping.h	2023-10-13 13:29:08
@@ -0,0 +1,63 @@
+/*==================================================================================================
+	 File:       CoreAudio/AudioHardwareTapping.h
+
+	 Contains:   API for communicating with audio hardware.
+
+	 Copyright:  (c) 1985-2020 by Apple, Inc., all rights reserved.
+
+	 Bugs?:      For bug reports, consult the following page on
+				 the World Wide Web:
+
+					 http://developer.apple.com/bugreporter/
+
+==================================================================================================*/
+
+#ifdef __OBJC__
+
+#ifndef AudioHardwareTapping_h
+#define AudioHardwareTapping_h
+
+#include <Availability.h>
+#include <CoreAudio/AudioHardware.h>
+
+@class CATapDescription;
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+//==================================================================================================
+#pragma mark Tap Functions
+
+/*!
+    @function       AudioHardwareCreateProcessTap
+    @abstract       This routine creates a new Tap using the provided description.
+    @param          inDescription
+                    The CATapDescription that specifies how to build the Tap.
+    @param          outTapID
+					The AudioObjectID of the newly created Tap.
+    @result         An OSStatus indicating success or failure.
+*/
+extern OSStatus
+AudioHardwareCreateProcessTap(CATapDescription* inDescription,
+							  AudioObjectID*  outTapID)                                     API_AVAILABLE(macos(14.2)) API_UNAVAILABLE(ios, watchos, tvos);
+
+/*!
+    @function       AudioHardwareDestroyProcessTap
+    @abstract       This routine destroys the given Tap.
+    @param          inTapID
+                    The AudioObjectID of the Tap to destroy.
+    @result         An OSStatus indicating success or failure.
+*/
+extern OSStatus
+AudioHardwareDestroyProcessTap(AudioObjectID inTapID)                                       API_AVAILABLE(macos(14.2)) API_UNAVAILABLE(ios, watchos, tvos);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* AudioHardwareTapping_h */
+
+#endif // __OBJC__
+
diff -ruN /Applications/Xcode_15.0.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/CATapDescription.h /Applications/Xcode_15.1.0-beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/CATapDescription.h
--- /Applications/Xcode_15.0.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/CATapDescription.h	1969-12-31 19:00:00
+++ /Applications/Xcode_15.1.0-beta2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreAudio.framework/Headers/CATapDescription.h	2023-10-13 13:29:08
@@ -0,0 +1,167 @@
+/*
+	File:		CATapDescription.h
+	Framework:	CoreAudio
+
+	Copyright (c) 2014-2022 Apple Inc. All Rights Reserved.
+*/
+ 
+#ifdef __OBJC__
+
+#ifndef CATapDescription_h
+#define CATapDescription_h
+
+#import <Foundation/NSString.h>
+#import <Foundation/NSArray.h>
+#import <Foundation/NSUUID.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/*!
+ @enum		CATapMuteBehavior
+ @abstract	CATapMuteBehavior describes the playback behavior of the process being tapped. The default value is CATapUnmuted.
+ @constant	CATapUnmuted
+ 	Audio is captured by the tap and also sent to the audio hardware
+ @constant	CATapMuted
+ 	Audio is captured by the tap but no audio is sent from the process to the audio hardware
+ @constant	CATapMutedWhenTapped
+ 	Audio is captured by the tap and also sent to the audio hardware until the tap is read by another audio client. 
+ 	For the duration of the read activity on the tap no audio is sent to the audio hardware.
+*/
+typedef NS_ENUM(NSInteger, CATapMuteBehavior) {
+	CATapUnmuted = 0,
+	CATapMuted = 1,
+	CATapMutedWhenTapped = 2
+} API_AVAILABLE(macos(13.0), ios(16.0));
+
+//==================================================================================================
+#pragma mark -
+#pragma mark CATapDescription class.
+/*!
+    @class CATapDescription
+
+    This class describes a tap object that contains an input stream.  The input stream is a mix of all of the specified processes output audio.
+*/
+API_AVAILABLE(macos(12.0), ios(15.0))
+@interface CATapDescription : NSObject
+
+- (instancetype)init;
+
+/*! @method initStereoMixdownOfProcesses
+	@abstract
+        Mix all given process audio streams down to stereo.  Mono sources will be duplicated in
+        both right and left channels.
+	@param	processesObjectIDsToIncludeInTap
+         An NSArray of NSNumbers where each NSNumber holds an AudioObjectID of the process object to include in the tap
+*/
+- (instancetype) initStereoMixdownOfProcesses:(NSArray<NSNumber*>*)processesObjectIDsToIncludeInTap NS_REFINED_FOR_SWIFT;
+
+/*! @method initStereoGlobalTapButExcludeProcesses
+	@abstract
+        Mix all processes to a stereo stream except the given processes.  Mono sources will be
+        duplicated in both right and left channels.
+	@param	processesObjectIDsToExcludeFromTap
+         An NSArray of NSNumbers where each NSNumber holds an AudioObjectID of the process object to exclude from the tap.
+         All other processes that output audio will be included in the tap.
+*/
+- (instancetype) initStereoGlobalTapButExcludeProcesses:(NSArray<NSNumber*>*)processesObjectIDsToExcludeFromTap NS_REFINED_FOR_SWIFT;
+
+/*! @method initMonoMixdownOfProcesses
+	@abstract
+        Mix all given process audio streams audio to mono.
+	@param	processesObjectIDsToIncludeInTap
+         An NSArray of NSNumbers where each NSNumber holds an AudioObjectID of the process object to include in the tap
+ */
+- (instancetype) initMonoMixdownOfProcesses:(NSArray<NSNumber*>*)processesObjectIDsToIncludeInTap NS_REFINED_FOR_SWIFT;
+
+/*! @method initMonoGlobalTapButExcludeProcesses
+	@abstract
+        Mix all processes to a mono stream except the given processes
+	@param	processesObjectIDsToExcludeFromTap
+         An NSArray of NSNumbers where each NSNumber holds an AudioObjectID of the process object to exclude from the tap.
+         All other processes that output audio will be included in the tap.
+ */
+- (instancetype) initMonoGlobalTapButExcludeProcesses:(NSArray<NSNumber*>*)processesObjectIDsToExcludeFromTap NS_REFINED_FOR_SWIFT;
+
+/*! @method initWithProcesses:andDeviceUID:withStreams
+	@abstract
+         Mix all given process audio streams destined for the selected device stream
+	@param	processesObjectIDsToIncludeInTap
+         An NSArray of NSNumbers where each NSNumber holds an AudioObjectID of the process object to exclude from the tap.
+         All other processes that output audio will be included in the tap.
+	@param	deviceUID
+         The device UID of the output device who's audio will be captured
+	@param	stream
+         NSInteger that represents the index of the stream on the device who's audio will be captured. The format of the tap
+         will match the format of this stream.
+ */
+- (instancetype) initWithProcesses:(NSArray<NSNumber*>*)processesObjectIDsToIncludeInTap andDeviceUID:(NSString*) deviceUID withStream:(NSInteger) stream NS_REFINED_FOR_SWIFT;
+
+/*!
+ @property name
+ @abstract Human readable name of this tap.
+*/
+@property (atomic, copy) NSString* name;
+
+/*!
+ @property UUID
+ @abstract UID of this tap.
+*/
+@property (atomic, copy) NSUUID* UUID;
+
+/*!	@property processes
+ @abstract
+ An NSArray of NSNumbers where each NSNumber holds the AudioObjectID of the process object to tap or exclude.
+ */
+@property (atomic, copy, readwrite) NSArray<NSNumber*>* processes NS_REFINED_FOR_SWIFT;
+
+/*!	@property mono
+ @abstract
+ True if this description is a mono mixdown of channels.
+ */
+@property (atomic, readwrite, getter=isMono) BOOL mono;
+
+/*!	@property exclusive
+ @abstract
+ True if this description should tap all processes except the process listed in the 'processes' property.
+ */
+@property (atomic, readwrite, getter=isExclusive) BOOL exclusive;
+
+/*!	@property mixdown
+ @abstract
+ True if this description is a mono or stereo mix of the tapped device's channels.
+ */
+@property (atomic, readwrite, getter=isMixdown) BOOL mixdown;
+
+/*!	@property privateTap
+ @abstract
+ True if this tap is only visible to the client process that created the tap.
+ */
+@property (atomic, readwrite, getter=isPrivate, setter=setPrivate:) BOOL privateTap;
+
+/*!	@property muteBehavior
+ @abstract
+ Set the tap's mute behavior. See CATapMuteBehavior above.
+ */
+@property (atomic, readwrite, getter=isMuted) CATapMuteBehavior muteBehavior;
+
+/*!	@property deviceUID
+ @abstract
+ An optional deviceUID that will have a value if this tap only taps a specific hardware device
+ */
+@property (atomic, copy, nullable) NSString* deviceUID;
+
+/*!	@property stream
+ @abstract
+ An optional NSNumber that will have a value if this tap taps a specific device stream.
+ The value represents the index of the hardware stream.
+ */
+@property (atomic, copy, nullable) NSNumber* stream NS_REFINED_FOR_SWIFT;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif /* CATapDescription_h */
+
+#endif // __OBJC__
+
Clone this wiki locally