session-ios/Signal/src/audio/incall_audio/CallAudioManager.m
Craig Gidney ced4fc8947 Initial work to depend on external futures library instead of internal implementation
Still need to:
- Fix indentation
- Check for any FutureSource being returned instead of FutureSource.future
- Check for then: vs thenTry: mixups
- Check for main thread related issues
- Check for other exception catching issues
- Adjust directory layout
- Manual end-to-end testing
2014-08-20 08:08:32 -04:00

71 lines
2.7 KiB
Objective-C

#import "AnonymousTerminator.h"
#import "CallAudioManager.h"
#import "PreferencesUtil.h"
#import "ThreadManager.h"
#import "Util.h"
#define SAFETY_FACTOR_FOR_COMPUTE_DELAY 3.0
@implementation CallAudioManager
+(CallAudioManager*) callAudioManagerStartedWithAudioSocket:(AudioSocket*)audioSocket
andErrorHandler:(ErrorHandlerBlock)errorHandler
untilCancelled:(TOCCancelToken*)untilCancelledToken {
require(audioSocket != nil);
AudioProcessor* processor = [AudioProcessor audioProcessor];
CallAudioManager* newCallAudioManagerInstance = [CallAudioManager new];
newCallAudioManagerInstance->audioProcessor = processor;
newCallAudioManagerInstance->audioSocket = audioSocket;
[newCallAudioManagerInstance startWithErrorHandler:errorHandler untilCancelled:untilCancelledToken];
return newCallAudioManagerInstance;
}
-(void) startWithErrorHandler:(ErrorHandlerBlock)errorHandler untilCancelled:(TOCCancelToken*)untilCancelledToken {
require(errorHandler != nil);
require(untilCancelledToken != nil);
@synchronized(self) {
requireState(!started);
started = true;
if (untilCancelledToken.isAlreadyCancelled) return;
audioInterface = [RemoteIOAudio remoteIOInterfaceStartedWithDelegate:self untilCancelled:untilCancelledToken];
PacketHandlerBlock handler = ^(EncodedAudioPacket* packet) {
[audioProcessor receivedPacket:packet];
};
[audioSocket startWithHandler:[PacketHandler packetHandler:handler
withErrorHandler:errorHandler]
untilCancelled:untilCancelledToken];
}
}
-(void) handlePlaybackOccurredWithBytesRequested:(NSUInteger)requested andBytesRemaining:(NSUInteger)bytesRemaining {
if (bytesInPlaybackBuffer >= requested) {
bytesInPlaybackBuffer -= requested;
}
NSUInteger bytesAddedIfPullMore = [audioProcessor.codec decodedFrameSizeInBytes];
double minSafeBufferSize = MAX(requested, bytesAddedIfPullMore)*SAFETY_FACTOR_FOR_COMPUTE_DELAY;
while (bytesInPlaybackBuffer < minSafeBufferSize) {
NSData* decodedAudioData = [audioProcessor tryDecodeOrInferFrame];
if (decodedAudioData == nil) break;
[audioInterface populatePlaybackQueueWithData:decodedAudioData];
bytesInPlaybackBuffer += decodedAudioData.length;
}
}
-(void) handleNewDataRecorded:(CyclicalBuffer*)recordingQueue {
NSArray* encodedPackets = [audioProcessor encodeAudioPacketsFromBuffer:recordingQueue];
for (EncodedAudioPacket* packet in encodedPackets) {
[audioSocket send:packet];
}
}
-(BOOL) toggleMute {
return [audioInterface toggleMute];
}
@end