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 @@ - +