From 122b6d6a6defdebb51c8f10f335ae09225abfd15 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Tue, 3 Oct 2023 04:48:57 -0700 Subject: [PATCH] Improve audio buffering situation Buffer up to 20 seconds per stage, and buffer only up to 2 seconds before starting the next stage. Signed-off-by: Christopher Snowhill --- Audio/Chain/Node.h | 2 ++ Audio/Chain/Node.m | 42 +++++++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Audio/Chain/Node.h b/Audio/Chain/Node.h index a5fe9dfac..adcec5cde 100644 --- a/Audio/Chain/Node.h +++ b/Audio/Chain/Node.h @@ -33,6 +33,8 @@ AudioStreamBasicDescription nodeFormat; uint32_t nodeChannelConfig; BOOL nodeLossless; + + double durationPrebuffer; } - (id _Nullable)initWithController:(id _Nonnull)c previous:(id _Nullable)p; diff --git a/Audio/Chain/Node.m b/Audio/Chain/Node.m index 8a1979cd6..ead30e7c2 100644 --- a/Audio/Chain/Node.m +++ b/Audio/Chain/Node.m @@ -22,7 +22,7 @@ - (id)initWithController:(id)c previous:(id)p { self = [super init]; if(self) { - buffer = [[ChunkList alloc] initWithMaximumDuration:1.0]; + buffer = [[ChunkList alloc] initWithMaximumDuration:20.0]; semaphore = [[Semaphore alloc] init]; accessLock = [[NSLock alloc] init]; @@ -36,6 +36,8 @@ nodeChannelConfig = 0; nodeLossless = NO; + durationPrebuffer = 2.0; + [self setPreviousNode:p]; } @@ -66,17 +68,18 @@ [chunk assignSamples:ptr frameCount:amount / nodeFormat.mBytesPerPacket]; const double chunkDuration = [chunk duration]; - double durationLeft = [buffer maxDuration] - [buffer listDuration]; + double durationList = [buffer listDuration]; + double durationLeft = [buffer maxDuration] - durationList; + + if(shouldContinue == YES && durationList > durationPrebuffer) { + if(initialBufferFilled == NO) { + initialBufferFilled = YES; + if([controller respondsToSelector:@selector(initialBufferFilled:)]) + [controller performSelector:@selector(initialBufferFilled:) withObject:self]; + } + } while(shouldContinue == YES && chunkDuration > durationLeft) { - if(durationLeft < chunkDuration) { - if(initialBufferFilled == NO) { - initialBufferFilled = YES; - if([controller respondsToSelector:@selector(initialBufferFilled:)]) - [controller performSelector:@selector(initialBufferFilled:) withObject:self]; - } - } - if(durationLeft < chunkDuration || shouldReset) { [accessLock unlock]; [semaphore wait]; @@ -95,17 +98,18 @@ [accessLock lock]; const double chunkDuration = [chunk duration]; - double durationLeft = [buffer maxDuration] - [buffer listDuration]; + double durationList = [buffer listDuration]; + double durationLeft = [buffer maxDuration] - durationList; + + if(shouldContinue == YES && durationList > durationPrebuffer) { + if(initialBufferFilled == NO) { + initialBufferFilled = YES; + if([controller respondsToSelector:@selector(initialBufferFilled:)]) + [controller performSelector:@selector(initialBufferFilled:) withObject:self]; + } + } while(shouldContinue == YES && chunkDuration > durationLeft) { - if(durationLeft < chunkDuration) { - if(initialBufferFilled == NO) { - initialBufferFilled = YES; - if([controller respondsToSelector:@selector(initialBufferFilled:)]) - [controller performSelector:@selector(initialBufferFilled:) withObject:self]; - } - } - if(durationLeft < chunkDuration || shouldReset) { [accessLock unlock]; [semaphore wait];