// // 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) { 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; } - (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