Hello,

I am trying to convert PCM audio to iLBC audio using 
AudioConverterFillComplexBuffer.

For this I have a sourceFormat and an destinationFormat to create my 
AudioConverterRef:

        AudioStreamBasicDescription sourceFormat = {0};
        sourceFormat.mSampleRate                = 44100;
        sourceFormat.mFormatID                  = kAudioFormatLinearPCM;
        sourceFormat.mFormatFlags               = 
kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
        sourceFormat.mFramesPerPacket   = 1;
        sourceFormat.mChannelsPerFrame  = 1;
        sourceFormat.mBitsPerChannel    = 16;
        sourceFormat.mBytesPerPacket    = 2;
        sourceFormat.mBytesPerFrame             = 2;
        
        
        AudioStreamBasicDescription destinationFormat = {0};
        destinationFormat.mFormatID         = kAudioFormatiLBC;
        destinationFormat.mFormatFlags = 0;
        destinationFormat.mSampleRate = 8000;
        destinationFormat.mChannelsPerFrame = 1;

        //160 frames per packet = 20ms mode
        destinationFormat.mFramesPerPacket = 160;
        destinationFormat.mBytesPerPacket = 38;


OSStatus status = AudioConverterNew(&sourceFormat, & destinationFormat, 
&audioConverter);

CAShow() logs the following:

PCMConverter2 0x13fe73590
    Input:   1 ch,  44100 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed 
integer
    Output:  1 ch,  44100 Hz, 'lpcm' (0x00000009) 32-bit little-endian float
  SampleRateConverter 0x13fe60710
    Input:   1 ch,  44100 Hz, 'lpcm' (0x00000009) 32-bit little-endian float
    Output:  1 ch,   8000 Hz, 'lpcm' (0x00000009) 32-bit little-endian float
    Algorithm 'norm', quality 96, Resampler2Wrapper @ 0x13fe511b0
  PCMConverter2 0x13fe3b4a0
    Input:   1 ch,   8000 Hz, 'lpcm' (0x00000009) 32-bit little-endian float
    Output:  1 ch,   8000 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed 
integer
  CodecConverter 0x13fe33180
    Input:   1 ch,   8000 Hz, 'lpcm' (0x0000000C) 16-bit little-endian signed 
integer
    Output:  1 ch,   8000 Hz, 'ilbc' (0x00000000) 0 bits/channel, 38 
bytes/packet, 160 frames/packet, 0 bytes/frame
    codec: 'aenc'/'ilbc'/'appl'
    Input layout tag: 0x640001
    Output layout tag: 0x640001


Here is my first question: why is the bits per channel and bytes per frame for 
my resulting output both 0?

The OSStatus for creating the AudioConverterRef says noErr, so everything seems 
to be fine.


Now I want to call the AudioConverterFillComplexBuffer. For this I need an 
outOutputData which I create like this:

        AudioBufferList outOutputData;
        outOutputData.mNumberBuffers = 1;
        outOutputData.mBuffers[0].mNumberChannels = 1;
        outOutputData.mBuffers[0].mDataByteSize = 38;
        outOutputData.mBuffers[0].mData = malloc(38);
        
The mDataByteSize is 38, because I assume that this should be the 20ms 38 
bytes/packet from the AudioConverter. Is this correct?
And so is my UInt32 ioOutputDataPacketSize = 38;

My user data is a circular buffer void *userData = &circularbuffer;


This is how my dataProc looks like:

static OSStatus myAudioConverterComplexInputDataProc(  AudioConverterRef        
       inAudioConverter,
                                                     UInt32*                    
     ioNumberDataPackets,
                                                     AudioBufferList*           
     ioData,
                                                     
AudioStreamPacketDescription**  outDataPacketDescription,
                                                     void*                      
     inUserData){
    
    TPCircularBuffer *sendBuffer = (TPCircularBuffer*) inUserData;
        
        int32_t availableBytes;
        
        SInt16 *audiobuffer = TPCircularBufferTail(sendBuffer, &availableBytes);
        
        availableBytes = 1024;  //min(availableBytes, 1024);
        
        ioData->mBuffers[0].mData = malloc(availableBytes);
        
        memcpy(ioData->mBuffers[0].mData, audiobuffer, availableBytes);
        ioData->mBuffers[0].mDataByteSize = availableBytes;
        
        TPCircularBufferConsume(sendBuffer, availableBytes);
    
    return noErr;
}

So how many bytes should we provide? 1024? How is this defined or calculated?


So all in all I call AudioConverterFillComplexBuffer using the given 
parameters. 
OSStatus status = AudioConverterFillComplexBuffer(audioConverter,
                                                 
myAudioConverterComplexInputDataProc,
                                                 userData,
                                                 &ioOutputDataPacketSize,
                                                 &outOutputData,
                                                 NULL);

This results in an Error: Conversion ('insz’), which represents 
kAudioConverterErr_InvalidInputSize.

Do you have any idea where something is wrong with this code?

Thanks a lot and have nice day!
Frederik
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/coreaudio-api/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to