session-ios/Signal/src/audio/incall_audio/processing/AudioProcessor.m

66 lines
2.4 KiB
Objective-C

#import "AudioProcessor.h"
@implementation AudioProcessor
@synthesize codec;
+ (AudioProcessor *)audioProcessor {
JitterQueue *jitterQueue = [JitterQueue jitterQueue];
AudioProcessor *newAudioProcessorInstance = [AudioProcessor new];
newAudioProcessorInstance->codec = [SpeexCodec speexCodec];
newAudioProcessorInstance->stretchFactorController =
[StretchFactorController stretchFactorControllerForJitterQueue:jitterQueue];
newAudioProcessorInstance->audioStretcher = [AudioStretcher audioStretcher];
newAudioProcessorInstance->jitterQueue = jitterQueue;
newAudioProcessorInstance->audioPacker = [AudioPacker audioPacker];
return newAudioProcessorInstance;
}
- (void)receivedPacket:(EncodedAudioPacket *)packet {
[jitterQueue tryEnqueue:packet];
}
- (NSArray *)encodeAudioPacketsFromBuffer:(CyclicalBuffer *)buffer {
ows_require(buffer != nil);
NSMutableArray *encodedFrames = [NSMutableArray array];
NSUInteger decodedFrameSize = [codec decodedFrameSizeInBytes];
while ([buffer enqueuedLength] >= decodedFrameSize) {
NSData *rawFrame = [buffer dequeueDataWithLength:decodedFrameSize];
requireState(rawFrame != nil);
NSData *encodedFrameData = [codec encode:rawFrame];
[encodedFrames addObject:[EncodedAudioFrame encodedAudioFrameWithData:encodedFrameData]];
}
NSMutableArray *encodedPackets = [NSMutableArray array];
for (EncodedAudioFrame *frame in encodedFrames) {
[audioPacker packFrame:frame];
EncodedAudioPacket *packet = [audioPacker tryGetFinishedAudioPacket];
if (packet != nil)
[encodedPackets addObject:packet];
}
return encodedPackets;
}
- (EncodedAudioFrame *)pullFrame {
EncodedAudioFrame *frame = [audioPacker tryGetReceivedFrame];
if (frame != nil)
return frame;
EncodedAudioPacket *potentiallyMissingPacket = [jitterQueue tryDequeue];
[audioPacker unpackPotentiallyMissingAudioPacket:potentiallyMissingPacket];
return [audioPacker tryGetReceivedFrame];
}
- (NSData *)tryDecodeOrInferFrame {
EncodedAudioFrame *frame = [self pullFrame];
haveReceivedDataYet |= !frame.isMissingAudioData;
if (!haveReceivedDataYet)
return nil;
NSData *raw = [codec decode:frame.tryGetAudioData];
double stretch = [stretchFactorController getAndUpdateDesiredStretchFactor];
return [audioStretcher stretchAudioData:raw stretchFactor:stretch];
}
@end