// // OutputNode.m // Cog // // Created by Vincent Spader on 8/2/05. // Copyright 2005 Vincent Spader. All rights reserved. // #import "OutputNode.h" #import "OutputCoreAudio.h" #import "AudioPlayer.h" #import "BufferChain.h" #import "Logging.h" @implementation OutputNode - (void)setup { amountPlayed = 0; paused = YES; output = [[OutputCoreAudio alloc] initWithController:self]; [output setup]; } - (void)seek:(double)time { // [output pause]; amountPlayed = time*format.mBytesPerFrame*(format.mSampleRate); } - (void)process { paused = NO; [output start]; } - (void)pause { paused = YES; [output pause]; } - (void)resume { paused = NO; [output resume]; } - (int)readData:(void *)ptr amount:(int)amount { @autoreleasepool { int n; [self setPreviousNode:[[controller bufferChain] finalNode]]; n = [super readData:ptr amount:amount]; amountPlayed += n; if (endOfStream == YES && !n) { amountPlayed = 0; [controller endOfInputPlayed]; //Updates shouldContinue appropriately? } /* if (n == 0) { DLog(@"Output Buffer dry!"); } */ return n; } } - (double)amountPlayed { return (amountPlayed/format.mBytesPerFrame)/(format.mSampleRate); } - (AudioStreamBasicDescription) format { return format; } - (void)setFormat:(AudioStreamBasicDescription *)f { format = *f; BufferChain *bufferChain = [controller bufferChain]; if (bufferChain) { InputNode *input = [bufferChain inputNode]; ConverterNode *converter = [bufferChain converter]; if (input && converter) { // Need to clear the buffer, as it contains converted output // targeting the previous output format [input resetBuffer]; [converter setOutputFormat:format]; [converter inputFormatDidChange:[bufferChain inputFormat]]; } } } - (void)close { [output stop]; } - (void)setVolume:(double) v { [output setVolume:v]; } - (void)setShouldContinue:(BOOL)s { [super setShouldContinue:s]; // if (s == NO) // [output stop]; } - (BOOL)isPaused { return paused; } @end