diff --git a/Audio/Chain/Converter.h b/Audio/Chain/Converter.h index 7e8fd8b87..a551683b6 100644 --- a/Audio/Chain/Converter.h +++ b/Audio/Chain/Converter.h @@ -15,19 +15,28 @@ { AudioConverterRef converter; - void *buffer; void *inputBuffer; + void *outputBuffer; + + //Temporary for callback use int inputBufferSize; + //end + + int outputSize; + int maxInputSize; AudioStreamBasicDescription inputFormat; AudioStreamBasicDescription outputFormat; } -- (void *)buffer; +- (void *)outputBuffer; +- (void *)inputBuffer; - (void)setupWithInputFormat:(AudioStreamBasicDescription)inputFormat outputFormat:(AudioStreamBasicDescription)outputFormat; - (void)cleanUp; -- (int)convert:(void *)dest amount:(int)amount; +- (int)convert:(int)amount; + +- (int)maxInputSize; @end diff --git a/Audio/Chain/Converter.m b/Audio/Chain/Converter.m index e1f12bd9b..9accba3eb 100644 --- a/Audio/Chain/Converter.m +++ b/Audio/Chain/Converter.m @@ -7,6 +7,7 @@ // #import "Converter.h" +#import "Node.h" void PrintStreamDesc (AudioStreamBasicDescription *inDesc) { @@ -42,37 +43,25 @@ static OSStatus ACInputProc(AudioConverterRef inAudioConverter, UInt32* ioNumber return err; } -- (int)convert:(void *)input amount:(int)inputSize +- (int)convert:(int)inputSize { AudioBufferList ioData; UInt32 ioNumberFrames; - int outputSize; + OSStatus err; - outputSize = inputSize; - UInt32 dataSize = sizeof(outputSize); - err = AudioConverterGetProperty(converter, - kAudioConverterPropertyCalculateOutputBufferSize, - &dataSize, - (void*)&outputSize); - - if (buffer != NULL) - free(buffer); - buffer = malloc(outputSize); - ioNumberFrames = outputSize/outputFormat.mBytesPerFrame; - ioData.mBuffers[0].mData = buffer; + ioData.mBuffers[0].mData = outputBuffer; ioData.mBuffers[0].mDataByteSize = outputSize; ioData.mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame; ioData.mNumberBuffers = 1; - inputBuffer = input; - inputBufferSize = inputSize; + inputBufferSize = inputSize; err = AudioConverterFillComplexBuffer(converter, ACInputProc, self, &ioNumberFrames, &ioData, NULL); if (err == kAudioConverterErr_InvalidInputSize) //It returns insz at EOS at times...so run it again to make sure all data is converted { - return [self convert:input amount:inputSize]; + return [self convert:inputSize]; } return ioData.mBuffers[0].mDataByteSize; @@ -104,19 +93,50 @@ static OSStatus ACInputProc(AudioConverterRef inAudioConverter, UInt32* ioNumber } } + outputSize = CHUNK_SIZE; + maxInputSize = outputSize; + UInt32 dataSize = sizeof(maxInputSize); + AudioConverterGetProperty(converter, + kAudioConverterPropertyCalculateInputBufferSize, + &dataSize, + (void*)&maxInputSize); + + if (outputBuffer) + free(outputBuffer); + outputBuffer = malloc(outputSize); + + if (inputBuffer) + free(inputBuffer); + inputBuffer = malloc(maxInputSize); + NSLog(@"Converter setup!"); PrintStreamDesc(&inf); PrintStreamDesc(&outf); } -- (void *)buffer +- (int)maxInputSize { - return buffer; + return maxInputSize; +} + +- (void *)outputBuffer +{ + return outputBuffer; +} + +- (void *)inputBuffer +{ + return inputBuffer; } - (void)cleanUp { + if (inputBuffer) + free(inputBuffer); + if (outputBuffer) + free(outputBuffer); + AudioConverterDispose(converter); } diff --git a/Audio/Chain/InputNode.m b/Audio/Chain/InputNode.m index 8b597bb74..4c576075d 100644 --- a/Audio/Chain/InputNode.m +++ b/Audio/Chain/InputNode.m @@ -80,12 +80,9 @@ - (void)process { - const int chunk_size = CHUNK_SIZE; - char *buf; int amountRead, amountConverted; NSLog(@"Playing file: %i", self); - buf = malloc(chunk_size); while ([self shouldContinue] == YES && [self endOfStream] == NO) { @@ -96,9 +93,9 @@ shouldSeek = NO; } - amountRead = [decoder fillBuffer:buf ofSize:chunk_size]; + amountRead = [decoder fillBuffer:[converter inputBuffer] ofSize:[converter maxInputSize]]; - amountConverted = [converter convert:buf amount:amountRead]; //Convert fills in converter buffer, til the next call + amountConverted = [converter convert:amountRead]; //Convert fills in converter buffer, til the next call if (amountConverted <= 0) { endOfStream = YES; @@ -107,10 +104,9 @@ break; //eof } - [self writeData:[converter buffer] amount:amountConverted]; + [self writeData:[converter outputBuffer] amount:amountConverted]; } - free(buf); [decoder close]; [converter cleanUp];