Sunshine master
Self-hosted game stream host for Moonlight.
av_audio.h
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// lib includes
21#include "third-party/TPCircularBuffer/TPCircularBuffer.h"
22
23NS_ASSUME_NONNULL_BEGIN
24
25// Forward declarations
26@class AVAudio;
27@class CATapDescription;
28
29namespace platf {
40 OSStatus audioConverterComplexInputProc(AudioConverterRef _Nullable inAudioConverter, UInt32 *_Nonnull ioNumberDataPackets, AudioBufferList *_Nonnull ioData, AudioStreamPacketDescription *_Nullable *_Nullable outDataPacketDescription, void *_Nonnull inUserData);
53 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);
54} // namespace platf
55
67
83
89@interface AVAudio: NSObject <AVCaptureAudioDataOutputSampleBufferDelegate> {
90@public
91 TPCircularBuffer audioSampleBuffer;
92 dispatch_semaphore_t audioSemaphore;
93@private
94 // System-wide audio tap components (Core Audio)
95 AudioObjectID tapObjectID;
96 AudioObjectID aggregateDeviceID;
97 AudioDeviceIOProcID ioProcID;
98 AVAudioIOProcData *_Nullable ioProcData;
99}
100
101// AVFoundation microphone capture properties
102@property (nonatomic, assign, nullable) AVCaptureSession *audioCaptureSession;
103@property (nonatomic, assign, nullable) AVCaptureConnection *audioConnection;
104@property (nonatomic, assign) BOOL hostAudioEnabled;
105
110+ (NSArray<AVCaptureDevice *> *)microphones;
111
116+ (NSArray<NSString *> *)microphoneNames;
117
123+ (nullable AVCaptureDevice *)findMicrophone:(nullable NSString *)name;
124
133- (int)setupMicrophone:(nullable AVCaptureDevice *)device sampleRate:(UInt32)sampleRate frameSize:(UInt32)frameSize channels:(UInt8)channels;
134
143- (int)setupSystemTap:(UInt32)sampleRate frameSize:(UInt32)frameSize channels:(UInt8)channels;
144
145// Buffer management methods for testing and internal use
150- (void)initializeAudioBuffer:(UInt8)channels;
151
155- (void)cleanupAudioBuffer;
156
161- (void)cleanupSystemTapContext:(nullable id)tapDescription;
162
170- (int)initializeSystemTapContext:(UInt32)sampleRate frameSize:(UInt32)frameSize channels:(UInt8)channels;
171
177- (nullable CATapDescription *)createSystemTapDescriptionForChannels:(UInt8)channels;
178
186- (OSStatus)createAggregateDeviceWithTapDescription:(CATapDescription *)tapDescription sampleRate:(UInt32)sampleRate frameSize:(UInt32)frameSize;
187
188@end
189
190NS_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.
Core Audio capture class for macOS audio input and system-wide audio tapping. Provides functionality ...
Definition av_audio.h:89
TPCircularBuffer audioSampleBuffer
Shared circular buffer for both audio capture paths.
Definition av_audio.h:91
dispatch_semaphore_t audioSemaphore
Real-time safe semaphore for signaling audio sample availability.
Definition av_audio.h:92
IOProc client data structure for Core Audio system taps. Contains configuration and conversion data f...
Definition av_audio.h:72
UInt32 conversionBufferSize
Size of the conversion buffer in bytes.
Definition av_audio.h:81
UInt32 aggregateDeviceSampleRate
Sample rate of the aggregate device.
Definition av_audio.h:77
UInt32 clientRequestedFrameSize
Frame size requested by client.
Definition av_audio.h:76
UInt32 aggregateDeviceChannels
Number of channels in aggregate device.
Definition av_audio.h:78
UInt32 clientRequestedSampleRate
Sample rate requested by client.
Definition av_audio.h:75
UInt32 clientRequestedChannels
Number of channels requested by client.
Definition av_audio.h:74
AVAudio * avAudio
Reference to AVAudio instance.
Definition av_audio.h:73
float *_Nullable conversionBuffer
Pre-allocated buffer for audio conversion.
Definition av_audio.h:80
AudioConverterRef _Nullable audioConverter
Audio converter for format conversion.
Definition av_audio.h:79
Data structure for AudioConverter input callback. Contains audio data and metadata needed for format ...
Definition av_audio.h:60
UInt32 inputFrames
Total number of input frames available.
Definition av_audio.h:62
UInt32 deviceChannels
Number of channels in the device audio.
Definition av_audio.h:64
AVAudio * avAudio
Reference to the AVAudio instance.
Definition av_audio.h:65
UInt32 framesProvided
Number of frames already provided to converter.
Definition av_audio.h:63
float * inputData
Pointer to input audio data.
Definition av_audio.h:61