Sunshine0.0.5917
Sunshine 0.0.5917
Self-hosted game stream host for Moonlight.
Loading...
Searching...
No Matches
Go to the documentation of this file.
1
12#pragma once
13
14// platform includes
15#import <AudioToolbox/AudioToolbox.h>
16#import <AVFoundation/AVFoundation.h>
17#import <CoreAudio/AudioHardwareTapping.h>
18#import <CoreAudio/CoreAudio.h>
19
20// standard includes
21#include <functional>
22
23// lib includes
24#include "third-party/TPCircularBuffer/TPCircularBuffer.h"
25
26NS_ASSUME_NONNULL_BEGIN
27
28// Forward declarations
29@class AVAudio;
30@class CATapDescription;
31
32namespace platf {
33 using microphone_permission_callback_t = std::function<void(bool)>;
35
43 bool request_microphone_permission(AVAuthorizationStatus authorization_status, const microphone_permission_request_t &request_access);
44
53
64 OSStatus audioConverterComplexInputProc(AudioConverterRef _Nullable inAudioConverter, UInt32 *_Nonnull ioNumberDataPackets, AudioBufferList *_Nonnull ioData, AudioStreamPacketDescription *_Nullable *_Nullable outDataPacketDescription, void *_Nonnull inUserData);
77 OSStatus systemAudioIOProc(AudioObjectID inDevice, const AudioTimeStamp *_Nullable inNow, const AudioBufferList *_Nullable inInputData, const AudioTimeStamp *_Nullable inInputTime, AudioBufferList *_Nullable outOutputData, const AudioTimeStamp *_Nullable inOutputTime, void *_Nullable inClientData);
78} // namespace platf
79
91
107
113@interface AVAudio: NSObject <AVCaptureAudioDataOutputSampleBufferDelegate> {
114@public
115 TPCircularBuffer audioSampleBuffer;
116 dispatch_semaphore_t audioSemaphore;
117@private
118 // System-wide audio tap components (Core Audio)
119 AudioObjectID tapObjectID;
120 AudioObjectID aggregateDeviceID;
121 AudioDeviceIOProcID ioProcID;
122 AVAudioIOProcData *_Nullable ioProcData;
123}
124
125// AVFoundation microphone capture properties
126@property (nonatomic, assign, nullable) AVCaptureSession *audioCaptureSession;
127@property (nonatomic, assign, nullable) AVCaptureConnection *audioConnection;
128@property (nonatomic, assign) BOOL hostAudioEnabled;
129
134+ (NSArray<AVCaptureDevice *> *)microphones;
135
140+ (NSArray<NSString *> *)microphoneNames;
141
147+ (nullable AVCaptureDevice *)findMicrophone:(nullable NSString *)name;
148
157- (int)setupMicrophone:(nullable AVCaptureDevice *)device sampleRate:(UInt32)sampleRate frameSize:(UInt32)frameSize channels:(UInt8)channels;
158
167- (int)setupSystemTap:(UInt32)sampleRate frameSize:(UInt32)frameSize channels:(UInt8)channels;
168
169// Buffer management methods for testing and internal use
174- (void)initializeAudioBuffer:(UInt8)channels;
175
179- (void)cleanupAudioBuffer;
180
185- (void)cleanupSystemTapContext:(nullable id)tapDescription;
186
194- (int)initializeSystemTapContext:(UInt32)sampleRate frameSize:(UInt32)frameSize channels:(UInt8)channels;
195
201- (nullable CATapDescription *)createSystemTapDescriptionForChannels:(UInt8)channels;
202
210- (OSStatus)createAggregateDeviceWithTapDescription:(CATapDescription *)tapDescription sampleRate:(UInt32)sampleRate frameSize:(UInt32)frameSize;
211
212@end
213
214NS_ASSUME_NONNULL_END
OSStatus systemAudioIOProc(AudioObjectID inDevice, const AudioTimeStamp *_Nullable inNow, const AudioBufferList *_Nullable inInputData, const AudioTimeStamp *_Nullable inInputTime, AudioBufferList *_Nullable outOutputData, const AudioTimeStamp *_Nullable inOutputTime, void *_Nullable inClientData)
Receive system-audio tap samples from Core Audio.
OSStatus audioConverterComplexInputProc(AudioConverterRef _Nullable inAudioConverter, UInt32 *_Nonnull ioNumberDataPackets, AudioBufferList *_Nonnull ioData, AudioStreamPacketDescription *_Nullable *_Nullable outDataPacketDescription, void *_Nonnull inUserData)
Provide captured PCM frames to AudioConverter.
std::function< void(bool)> microphone_permission_callback_t
Completion callback for a microphone permission request.
Definition av_audio.h:33
bool request_microphone_permission(AVAuthorizationStatus authorization_status, const microphone_permission_request_t &request_access)
Resolve microphone access from an AVFoundation authorization state.
Definition av_audio.mm:30
std::function< void(microphone_permission_callback_t)> microphone_permission_request_t
Function that starts a microphone permission request.
Definition av_audio.h:34
Core Audio capture class for macOS audio input and system-wide audio tapping. Provides functionality ...
Definition av_audio.h:113
BOOL hostAudioEnabled
Whether host audio playback should be enabled (affects tap mute behavior).
Definition av_audio.h:128
AVCaptureConnection * audioConnection
Audio connection within the capture session.
Definition av_audio.h:127
NSArray< NSString * > * microphoneNames()
Get names of all available microphone devices.
Definition av_audio.mm:260
AVCaptureSession * audioCaptureSession
AVFoundation capture session for microphone input.
Definition av_audio.h:126
TPCircularBuffer audioSampleBuffer
Shared circular buffer for both audio capture paths.
Definition av_audio.h:115
void cleanupAudioBuffer()
Cleans up and deallocates the audio buffer resources.
Definition av_audio.mm:550
dispatch_semaphore_t audioSemaphore
Real-time safe semaphore for signaling audio sample availability.
Definition av_audio.h:116
NSArray< AVCaptureDevice * > * microphones()
Get all available microphone devices on the system.
Definition av_audio.mm:225
IOProc client data structure for Core Audio system taps. Contains configuration and conversion data f...
Definition av_audio.h:96
UInt32 conversionBufferSize
Size of the conversion buffer in bytes.
Definition av_audio.h:105
UInt32 aggregateDeviceSampleRate
Sample rate of the aggregate device.
Definition av_audio.h:101
UInt32 clientRequestedFrameSize
Frame size requested by client.
Definition av_audio.h:100
UInt32 aggregateDeviceChannels
Number of channels in aggregate device.
Definition av_audio.h:102
UInt32 clientRequestedSampleRate
Sample rate requested by client.
Definition av_audio.h:99
UInt32 clientRequestedChannels
Number of channels requested by client.
Definition av_audio.h:98
AVAudio * avAudio
Reference to AVAudio instance.
Definition av_audio.h:97
float *_Nullable conversionBuffer
Pre-allocated buffer for audio conversion.
Definition av_audio.h:104
AudioConverterRef _Nullable audioConverter
Audio converter for format conversion.
Definition av_audio.h:103
Data structure for AudioConverter input callback. Contains audio data and metadata needed for format ...
Definition av_audio.h:84
UInt32 inputFrames
Total number of input frames available.
Definition av_audio.h:86
UInt32 deviceChannels
Number of channels in the device audio.
Definition av_audio.h:88
AVAudio * avAudio
Reference to the AVAudio instance.
Definition av_audio.h:89
UInt32 framesProvided
Number of frames already provided to converter.
Definition av_audio.h:87
float * inputData
Pointer to input audio data.
Definition av_audio.h:85