cog/Audio/Chain/InputNode.m

150 lines
3.2 KiB
Matlab
Raw Normal View History

2006-01-20 15:34:02 +00:00
//
// InputNode.m
2006-01-20 15:34:02 +00:00
// Cog
//
// Created by Vincent Spader on 8/2/05.
// Copyright 2005 Vincent Spader. All rights reserved.
2006-01-20 15:34:02 +00:00
//
#import "InputNode.h"
#import "BufferChain.h"
#import "Plugin.h"
#import "CoreAudioUtils.h"
2006-01-20 15:34:02 +00:00
@implementation InputNode
- (BOOL)openURL:(NSURL *)url withSource:(id<CogSource>)source outputFormat:(AudioStreamBasicDescription)of
2006-01-20 15:34:02 +00:00
{
outputFormat = of;
NSLog(@"Opening: %@", url);
decoder = [AudioDecoder audioDecoderForURL:url];
[decoder retain];
converter = [[Converter alloc] init];
if (converter == nil)
return NO;
[self registerObservers];
NSLog(@"Got decoder...%@", decoder);
if (decoder == nil)
2006-04-13 02:51:22 +00:00
return NO;
if (![decoder open:source])
{
NSLog(@"Couldn't open decoder...");
return NO;
}
shouldContinue = YES;
2006-04-02 20:03:12 +00:00
shouldSeek = NO;
2006-04-13 02:51:22 +00:00
NSLog(@"OPENED");
2006-04-13 02:51:22 +00:00
return YES;
2006-01-20 15:34:02 +00:00
}
- (void)registerObservers
{
[decoder addObserver:self
forKeyPath:@"properties"
options:(NSKeyValueObservingOptionNew)
context:NULL];
NSLog(@"ADDED OBSERVER!!!");
[decoder addObserver:self
forKeyPath:@"metadata"
options:(NSKeyValueObservingOptionNew)
context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqual:@"properties"]) {
NSLog(@"Properties changed!");
//Setup converter!
[converter cleanUp];
NSLog(@"CLEANED UP");
[converter setupWithInputFormat:propertiesToASBD([decoder properties]) outputFormat:outputFormat];
NSLog(@"CREATED CONVERTED");
//Inform something of properties change
}
else if ([keyPath isEqual:@"metadata"]) {
//Inform something of metadata change
}
}
2006-01-20 15:34:02 +00:00
- (void)process
{
int amountRead = 0, amountConverted = 0, amountInBuffer = 0;
2007-03-03 21:13:25 +00:00
void *inputBuffer = malloc(CHUNK_SIZE);
2006-05-07 13:19:23 +00:00
NSLog(@"Playing file: %i", self);
2006-01-20 15:34:02 +00:00
while ([self shouldContinue] == YES && [self endOfStream] == NO)
2006-01-20 15:34:02 +00:00
{
2006-04-02 20:03:12 +00:00
if (shouldSeek == YES)
{
2006-04-13 14:47:28 +00:00
NSLog(@"Actually seeking");
[decoder seekToTime:seekTime];
2006-04-02 20:03:12 +00:00
shouldSeek = NO;
}
if (amountInBuffer < CHUNK_SIZE) {
amountRead = [decoder fillBuffer:((char *)inputBuffer) + amountInBuffer ofSize:CHUNK_SIZE - amountInBuffer];
amountInBuffer += amountRead;
}
2006-04-02 20:03:12 +00:00
amountConverted = [converter convert:inputBuffer amount:amountInBuffer]; //Convert fills in converter buffer, til the next call
if (amountInBuffer - amountConverted > 0) {
memmove(inputBuffer,((char *)inputBuffer) + amountConverted, amountInBuffer - amountConverted);
}
amountInBuffer -= amountConverted;
if ([converter outputBufferSize] <= 0)
2006-01-20 15:34:02 +00:00
{
NSLog(@"END OF FILE?!");
endOfStream = YES;
2006-01-20 15:34:02 +00:00
[controller endOfInputReached];
2006-04-02 20:03:12 +00:00
break; //eof
2006-01-20 15:34:02 +00:00
}
[self writeData:[converter outputBuffer] amount:[converter outputBufferSize]];
2006-01-20 15:34:02 +00:00
}
[decoder close];
[converter cleanUp];
2006-05-07 13:19:23 +00:00
2007-03-03 21:13:25 +00:00
free(inputBuffer);
2006-05-07 13:19:23 +00:00
NSLog(@"CLOSED: %i", self);
2006-01-20 15:34:02 +00:00
}
2006-04-02 20:03:12 +00:00
- (void)seek:(double)time
{
2006-04-13 14:47:28 +00:00
NSLog(@"SEEKING WEEE");
2006-04-02 20:03:12 +00:00
seekTime = time;
shouldSeek = YES;
}
- (void)dealloc
{
[decoder removeObserver:self forKeyPath:@"properties"];
[decoder removeObserver:self forKeyPath:@"metadata"];
[decoder release];
[super dealloc];
}
- (NSDictionary *) properties
2006-01-20 15:34:02 +00:00
{
return [decoder properties];
2006-01-20 15:34:02 +00:00
}
@end