From 8cbac8a54a600f6fe4fe59cdcab3f3d5f859ff2e Mon Sep 17 00:00:00 2001 From: Zakk Date: Sun, 23 Feb 2020 23:18:40 -0500 Subject: [PATCH] Layoutrecorders now add audio tracks to their map dynamically as they are created. This fixes the main layout recorder not seeing new tracks since it is active from program start now. --- CocoaSplit/CAMultiAudio/CAMultiAudioEngine.h | 1 + CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m | 43 +++++++----- CocoaSplit/CAMultiAudio/CAMultiAudioGraph.h | 1 - CocoaSplit/CAMultiAudio/CAMultiAudioInput.h | 2 +- CocoaSplit/CAMultiAudio/CAMultiAudioInput.m | 10 +-- CocoaSplit/CSLayoutRecorder.m | 67 ++++++++++++++----- .../CAMultiAudioMatrixMixerWindowController.m | 4 +- .../Audio/CSAdvancedAudioWindowController.xib | 36 +++++----- 8 files changed, 108 insertions(+), 56 deletions(-) diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.h b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.h index f6d552ca..6adb4a35 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.h +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.h @@ -86,5 +86,6 @@ -(instancetype)initWithDefaultTrackUUID:(NSString *)outputUUID; -(CAMultiAudioInput *)findInputForSystemUUID:(NSString *)uuid; -(CAMultiAudioInput *)createInputForSystemUUID:(NSString *)uuid; +-(void)startEncoder:(NSString *)trackUID; @end diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m index b0a4ac3c..32aca53a 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioEngine.m @@ -442,18 +442,24 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc } --(bool)removeInput:(CAMultiAudioInput *)input fromTrack:(CAMultiAudioOutputTrack *)outputTrack +-(bool)removeInput:(CAMultiAudioInput *)input fromTrack:(NSString *)outputTrackUUID { - if (!outputTrack) + if (!outputTrackUUID) { return NO; } - NSNumber *trackOutBus = outputTrack.outputBus; - CAMultiAudioConnection *inputConn = [self.graph findOutputConnection:input.headNode forNode:self.encodeMixer onBus:0]; + + CAMultiAudioOutputTrackConnection *trackConn = input.outputTracks[outputTrackUUID]; + if (!trackConn) + { + return NO; + } + + NSNumber *trackOutBus = trackConn.outputTrack.outputBus; - [self.encodeMixer disconnectInputBus:inputConn.bus fromOutputBus:trackOutBus.unsignedIntValue]; - [input.outputTracks removeObjectForKey:outputTrack.uuid]; + [self.encodeMixer disconnectInputBus:trackConn.bus fromOutputBus:trackOutBus.unsignedIntValue]; + [input.outputTracks removeObjectForKey:outputTrackUUID]; return YES; } @@ -577,6 +583,7 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc [self attachOutputTrack:outputTrack]; [self willChangeValueForKey:@"outputTracks"]; + [self.outputTracks setObject:outputTrack forKey:outputTrack.uuid]; [self didChangeValueForKey:@"outputTracks"]; [[CaptureController sharedCaptureController] postNotification:CSNotificationAudioTrackCreated forObject:withName]; @@ -620,9 +627,10 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc for (CAMultiAudioInput *input in self.audioInputs) { + if ([input.outputTracks valueForKey:withUUID]) { - [input removeFromOutputTrack:trackInfo]; + [input removeFromOutputTrack:withUUID]; } } @@ -993,21 +1001,29 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc } [self.encodeMixer restoreDataFromDict:encodeEffectChain]; - [self.graph graphUpdate]; [self.graph startGraph]; } +-(void)startEncoder:(NSString *)trackUID +{ + CAMultiAudioOutputTrack *outputTrack = self.outputTracks[trackUID]; + if (outputTrack) + { + NSLog(@"STARTING ENCODER FOR %@", trackUID); + CAMultiAudioNode *renderNode = outputTrack.encoderNode; + CSAacEncoder *encoder = outputTrack.encoder; + AudioUnitAddRenderNotify(renderNode.audioUnit, encoderRenderCallback, [encoder inputBufferPtr]); + } + +} -(void)startEncoders { for(NSString *trackName in self.outputTracks) { - CAMultiAudioOutputTrack *outputTrack = self.outputTracks[trackName]; - CAMultiAudioNode *renderNode = outputTrack.encoderNode; - CSAacEncoder *encoder = outputTrack.encoder; - AudioUnitAddRenderNotify(renderNode.audioUnit, encoderRenderCallback, [encoder inputBufferPtr]); + [self startEncoder:trackName]; } } @@ -1215,7 +1231,6 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc disconnectNode.headNode = nil; disconnectNode.graph = nil; - [self.graph graphUpdate]; [CaptureController.sharedCaptureController postNotification:CSNotificationAudioRemoved forObject:self]; return YES; } @@ -1346,10 +1361,8 @@ OSStatus encoderRenderCallback( void *inRefCon, AudioUnitRenderActionFlags *ioAc TPCircularBuffer *encodeBuffer = (TPCircularBuffer *)inRefCon; - if (encodeBuffer && ((*ioActionFlags) & kAudioUnitRenderAction_PostRender)) { - TPCircularBufferCopyAudioBufferList(encodeBuffer, ioData, inTimeStamp, kTPCircularBufferCopyAll, NULL); /* diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioGraph.h b/CocoaSplit/CAMultiAudio/CAMultiAudioGraph.h index ff3a5be1..84b8e63e 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioGraph.h +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioGraph.h @@ -53,7 +53,6 @@ -(bool)startGraph; -(bool)stopGraph; --(bool)graphUpdate; -(bool)removeNode:(CAMultiAudioNode *)node; @end diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioInput.h b/CocoaSplit/CAMultiAudio/CAMultiAudioInput.h index d085a63d..2bff3e6f 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioInput.h +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioInput.h @@ -61,6 +61,6 @@ -(void)updatePowerlevel; -(void)removeFromEngine; -(void)addToOutputTrack:(CAMultiAudioOutputTrack *)trackName; --(void)removeFromOutputTrack:(CAMultiAudioOutputTrack *)trackName; +-(void)removeFromOutputTrack:(NSString *)trackUUID; @end diff --git a/CocoaSplit/CAMultiAudio/CAMultiAudioInput.m b/CocoaSplit/CAMultiAudio/CAMultiAudioInput.m index 374e9c7f..6a829aa2 100644 --- a/CocoaSplit/CAMultiAudio/CAMultiAudioInput.m +++ b/CocoaSplit/CAMultiAudio/CAMultiAudioInput.m @@ -104,10 +104,12 @@ } --(void)removeFromOutputTrack:(CAMultiAudioOutputTrack *)outputTrack +-(void)removeFromOutputTrack:(NSString *)trackUUID { + + [self willChangeValueForKey:@"outputTracks"]; - [self.engine removeInput:self fromTrack:outputTrack]; + [self.engine removeInput:self fromTrack:trackUUID]; [self didChangeValueForKey:@"outputTracks"]; [[CaptureController sharedCaptureController] postNotification:CSNotificationAudioTrackInputDeleted forObject:self]; } @@ -248,7 +250,7 @@ saveDict[@"downMixerData"] = [self.downMixer saveData]; } saveDict[@"isGlobal"] = [NSNumber numberWithBool:self.isGlobal]; - saveDict[@"outputTracks"] = self.outputTracks.copy; + saveDict[@"outputTracksUUIDs"] = self.outputTracks.allKeys; } @@ -269,7 +271,7 @@ self.isGlobal = [restoreDict[@"isGlobal"] boolValue]; } - NSDictionary *outputTracks = restoreDict[@"outputTracks"]; + NSArray *outputTracks = restoreDict[@"outputTracksUUIDs"]; if (outputTracks) { for(NSString *trackUUID in outputTracks) diff --git a/CocoaSplit/CSLayoutRecorder.m b/CocoaSplit/CSLayoutRecorder.m index f4af8e7d..f37282c7 100644 --- a/CocoaSplit/CSLayoutRecorder.m +++ b/CocoaSplit/CSLayoutRecorder.m @@ -33,6 +33,7 @@ @implementation CSLayoutRecorder +@synthesize audioEngine = _audioEngine; -(instancetype) init { @@ -194,6 +195,13 @@ } } +-(void)attachToEncoder:(NSString *)trackUID +{ + CAMultiAudioOutputTrack *outputTrack = self.audioEngine.outputTracks[trackUID]; + CSAacEncoder *enc = outputTrack.encoder; + enc.encodedReceiver = self; + [self.audioEngine startEncoder:trackUID]; +} -(void)startRecordingCommon { @@ -259,11 +267,8 @@ for(NSString *trackName in self.audioEngine.outputTracks) { - CAMultiAudioOutputTrack *outputTrack = self.audioEngine.outputTracks[trackName]; - CSAacEncoder *enc = outputTrack.encoder; - enc.encodedReceiver = self; + [self attachToEncoder:trackName]; } - [self.audioEngine startEncoders]; if (!self.renderer) { self.renderer = [[LayoutRenderer alloc] init]; @@ -292,7 +297,7 @@ self.recordingActive = YES; self.layout.isActive = YES; - + [self.audioEngine addObserver:self forKeyPath:@"outputTracks.@allKeys" options:NSKeyValueObservingOptionNew context:nil]; dispatch_async(_frame_queue, ^{ [self newFrameTimed]; @@ -302,8 +307,37 @@ } +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if (!self.audioEngine) + { + return; + } + NSArray *trackKeys = change[NSKeyValueChangeNewKey]; + for (NSString *trackUID in trackKeys) + { + CAMultiAudioOutputTrack *outTrack = self.audioEngine.outputTracks[trackUID]; + if (!outTrack.encoder.encodedReceiver) + { + [self attachToEncoder:trackUID]; + } + } +} +-(CAMultiAudioEngine *)audioEngine +{ + return _audioEngine; +} +-(void)setAudioEngine:(CAMultiAudioEngine *)audioEngine +{ + if (self.audioEngine) + { + [self.audioEngine removeObserver:self forKeyPath:@"outputTracks.@allKeys"]; + } + + _audioEngine = audioEngine; +} -(NSObject *)compressorByName:(NSString *)name @@ -735,15 +769,15 @@ - if (CMTIME_COMPARE_INLINE(pcmBuffer.firstAudioTime, ==, kCMTimeZero)) + if (CMTIME_COMPARE_INLINE(_firstPcmAudioTime, ==, kCMTimeZero)) { - pcmBuffer.firstAudioTime = orig_pts; + _firstPcmAudioTime = orig_pts; return; } - CMTime pts = CMTimeSubtract(orig_pts, pcmBuffer.firstAudioTime); + CMTime pts = CMTimeSubtract(orig_pts, _firstPcmAudioTime); //CMTime adjust_pts = CMTimeMakeWithSeconds(self.audio_adjust, orig_pts.timescale); //CMTime pts = CMTimeAdd(real_pts, adjust_pts); @@ -782,23 +816,20 @@ - if (CMTIME_COMPARE_INLINE(audioBuffer.firstAudioTime, ==, kCMTimeZero)) + if (CMTIME_COMPARE_INLINE(_firstAudioTime, ==, kCMTimeZero)) { - audioBuffer.firstAudioTime = orig_pts; + _firstAudioTime = orig_pts; return; } - CMTime pts = CMTimeSubtract(orig_pts, audioBuffer.firstAudioTime); + CMTime pts = CMTimeSubtract(orig_pts, _firstAudioTime); //CMTime adjust_pts = CMTimeMakeWithSeconds(self.audio_adjust, orig_pts.timescale); //CMTime pts = CMTimeAdd(real_pts, adjust_pts); - - CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, pts); - if (CMTIME_COMPARE_INLINE(pts, >, audioBuffer.previousAudioTime)) { if (sampleBuffer) @@ -809,5 +840,11 @@ } } - +-(void)dealloc +{ + if (self.audioEngine) + { + [self.audioEngine removeObserver:self forKeyPath:@"outputTracks.@allKeys"]; + } +} @end diff --git a/CocoaSplit/Interface/Audio/CAMultiAudioMatrixMixerWindowController.m b/CocoaSplit/Interface/Audio/CAMultiAudioMatrixMixerWindowController.m index 3dbc84c8..822269d7 100644 --- a/CocoaSplit/Interface/Audio/CAMultiAudioMatrixMixerWindowController.m +++ b/CocoaSplit/Interface/Audio/CAMultiAudioMatrixMixerWindowController.m @@ -88,8 +88,8 @@ NSArray *selectedTracks = self.audioTracksDictionaryController.selectedObjects; for (NSDictionaryControllerKeyValuePair *trackInfo in selectedTracks) { - CAMultiAudioOutputTrack *track = [trackInfo value]; - [self.audioNode removeFromOutputTrack:track]; + CAMultiAudioOutputTrackConnection *trackConn = [trackInfo value]; + [self.audioNode removeFromOutputTrack:trackConn.outputTrack.uuid]; } } diff --git a/CocoaSplit/Interface/Audio/CSAdvancedAudioWindowController.xib b/CocoaSplit/Interface/Audio/CSAdvancedAudioWindowController.xib index 6773a46f..34142315 100644 --- a/CocoaSplit/Interface/Audio/CSAdvancedAudioWindowController.xib +++ b/CocoaSplit/Interface/Audio/CSAdvancedAudioWindowController.xib @@ -26,7 +26,7 @@ - + @@ -34,7 +34,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -54,7 +54,7 @@ - + @@ -74,7 +74,7 @@ - + @@ -82,7 +82,7 @@ - + @@ -90,7 +90,7 @@ - + @@ -101,7 +101,7 @@ - + @@ -112,7 +112,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -148,7 +148,7 @@ - + @@ -160,7 +160,7 @@ - + @@ -199,7 +199,7 @@ - + @@ -226,7 +226,7 @@ - + @@ -247,7 +247,7 @@ - + @@ -301,7 +301,7 @@ - + @@ -314,7 +314,7 @@ - + @@ -328,7 +328,7 @@ - +