Fixed up converter/inputnode relationship.
parent
1aead1bf0d
commit
1e16835c8c
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
Loading…
Reference in New Issue