62 lines
2.4 KiB
Objective-C
62 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 {
|
|
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
|