After filing a DTS, found out the problem.
The AudioSettings property is not enough to convert the output to the
necessary format.  Though I needed to add "[NSNumber
numberWithBool:NO],                                     
AVLinearPCMIsNonInterleaved," to the dictionary.
Upon receiving a sample, there is still further PCM format conversion that
is required.  This can be done using the "AudioConverterConvertBuffer"
function.
This function requires a source and destination
"AudioStreamBasicDescription".
The source can be obtained using
"CMAudioFormatDescriptionGetStreamBasicDescription" and
"CMSampleBufferGetFormatDescription".
The destination is setup by the user, mine is set as follow:

        _destinationDescription.mFormatID                       = 
kAudioFormatLinearPCM;
        _destinationDescription.mSampleRate                     = 
AV::kSampleRate;
        _destinationDescription.mBitsPerChannel         = 16;
        _destinationDescription.mBytesPerFrame          = (2 * 16) / 8;
        _destinationDescription.mBytesPerPacket         = (2 * 16) / 8;
        _destinationDescription.mChannelsPerFrame       = 2;
        _destinationDescription.mFormatFlags            =       
kLinearPCMFormatFlagIsPacked |
                                                kAudioFormatFlagsNativeEndian |
                                                kAudioFormatFlagIsSignedInteger;

        _destinationDescription.mFramesPerPacket        = 1;
        _destinationDescription.mReserved                       = 0;


Once the conversion was done, the audio sounded perfectly!
Hope anyone who comes across this problem finds this useful in the future.

-San Saeteurn

On 5/30/13 3:22 PM, "San Saeteurn" <s...@telestream.net> wrote:

>Hello
>
>I am trying to write an external plugin that simply reads audio from the
>built in microphone, obtains the raw audio data, and passes it to an SDK
>API.
>My setup is very simple, I have a single session, with a single input
>device (built in microphone) and a single output
>(AVCaptureAudioDataOutput)
>I Initialize the Session, Input, and Output as follow:
>
>            // Obtain the device and retain it
>
>            _pAudioCaptureInput = [pAVInputDevice retain];
>
>
>            // Initialize Capture Session
>
>            _dispatchQueue = dispatch_get_main_queue();
>
>            _pCaptureSession = [[AVCaptureSession alloc] init];
>
>            _pCaptureSession.sessionPreset = AVCaptureSessionPresetHigh;
>
>
>
>            // Put the Device inside an Input
>
>            pInputDevice = [[AVCaptureDeviceInput alloc]
>initWithDevice:_pAudioCaptureInput error:&pError];
>
>            [_pCaptureSession addInput:pInputDevice]; // Add Audio Input
>to Session
>
>            [pInputDevice release];
>
>            pInputDevice = nil;
>
>
>            // Setup the Output Configurations
>
>            NSDictionary *pAudioSettings = [NSDictionary
>dictionaryWithObjectsAndKeys:
>
>                                                   [NSNumber
>numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,
>
>                                                   [NSNumber
>numberWithInt:44100], AVSampleRateKey,
>
>                                                   [NSNumber
>numberWithInt:2], AVNumberOfChannelsKey,
>
>                                                   [NSNumber
>numberWithInt:16], AVLinearPCMBitDepthKey,
>
>                                                   [NSNumber
>numberWithBool:NO], AVLinearPCMIsFloatKey,
>
>                                                   [NSNumber
>numberWithBool:NO], AVLinearPCMIsBigEndianKey,
>
>                                                   nil];
>
>
>
>
>            // Create the Output
>
>            _pAudioCaptureOutput = [[AVCaptureAudioDataOutput alloc]
>init];
>
>            [_pAudioCaptureOutput setAudioSettings:pAudioSettings]; //
>Apply Output Settings
>
>            [_pCaptureSession addOutput:_pAudioCaptureOutput]; // Add
>Output to Session
>
>
>            // Create the Output Delegate that will receive the
>SampleBuffer callbacks
>
>            _pAudioCaptureDelegate = [[ACaptureDelegate alloc] init];
>
>            [_pAudioCaptureOutput
>setSampleBufferDelegate:_pAudioCaptureDelegate
>
>                                                    queue:_dispatchQueue];
>
>
>
>            // Remember the Device Name
>
>            _deviceName = [_pAudioCaptureInput.localizedName UTF8String];
>
>I start the session running by calling startRunning on the session.  My
>callback delegate is notified with Audio Samples.  The follow is the
>callback implementation:
>
>
>- (void)captureOutput:(AVCaptureOutput *)captureOutput
>didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
>fromConnection:(AVCaptureConnection *)connection
>
>{
>
>// Save the Timescale
>
>    CMTime timestamp =
>CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
>
>    if(_timescale == -1) {
>
>        _timescale = timestamp.timescale;
>
>    }
>
>    CMItemCount numSamples = CMSampleBufferGetNumSamples(sampleBuffer);
>
>
>    // Get Audio Data
>
>    CMBlockBufferRef dataBuffer =
>CMSampleBufferGetDataBuffer(sampleBuffer);
>
>    zuint32 dataLength = CMBlockBufferGetDataLength(dataBuffer);
>
>
>
>    AVCaptureAudioDataOutput *pOutput =
>static_cast<AVCaptureAudioDataOutput *>(captureOutput);
>
>    NSDictionary *pAudioSettings = pOutput.audioSettings;
>
>
>
>    // Retrieve Audio Settings Information from AVOutputDevice
>
>    NSNumber *audioSettingValue = nil;
>
>    zint32 sampleRate = 44100;
>
>    audioSettingValue = [pAudioSettings objectForKey:AVSampleRateKey];
>
>    if(audioSettingValue) {
>
>        sampleRate = [audioSettingValue intValue];
>
>    }
>
>
>    zint32 bitDepth = 16;
>
>    audioSettingValue = [pAudioSettings
>objectForKey:AVLinearPCMBitDepthKey];
>
>    if(audioSettingValue) {
>
>        bitDepth = [audioSettingValue intValue];
>
>    }
>
>
>
>    zint32 channels = 2;
>
>    audioSettingValue = [pAudioSettings
>objectForKey:AVNumberOfChannelsKey];
>
>    if(audioSettingValue) {
>
>        channels = [audioSettingValue intValue];
>
>    }
>
>
>
>
>    zuint8 *pAudioData = new zuint8[dataLength];
>
>    OSStatus err = CMBlockBufferCopyDataBytes(dataBuffer, 0, dataLength,
>pAudioData);
>
>    if(err == noErr) {
>
>// Populate SDK Audio structure
>
>        _audioBuffer.format = kFormatPCM;
>
>        _audioBuffer.dataLength = dataLength;
>
>        _audioBuffer.timeStamp = 0;
>
>        _audioBuffer.flags = kBufferFlagTimeValid;
>
>        _audioBuffer.sampleRate = sampleRate;
>
>        _audioBuffer.bitsPerSample = bitDepth;
>
>        _audioBuffer.channels = channels;
>
>        _audioBuffer.data = pAudioData; // The Raw Audio Data
>
>
>
>// Send Audio Data to SDK API
>
>        _pAudioDataArriveCallback(_pAudioDataArriveContext,
>&_audioBuffer);
>
>
>
>        delete [] pAudioData;
>
>        pAudioData = NULL;
>
>    }
>
>}
>
>The Problem is, the audio is playing back with a higher pitch.  Like
>someone is fast forwarding.  If I adjust the SampleRate in the Output
>Audio Settings, it affects the play out.
>Higher I set it, the less squeaky it becomes, but never correct.  Is
>there any initialization step I am missing?
>
>I have not been able to play the raw audio data back myself without the
>main app as I am new to AVFoundation and CoreAudio.
>If someone has sample code of getting this up, I would much appreciate it.
>
>Thanks,
>-San Saeteurn
>
>_______________________________________________
>
>Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>
>Please do not post admin requests or moderator comments to the list.
>Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
>Help/Unsubscribe/Update your Subscription:
>https://lists.apple.com/mailman/options/cocoa-dev/sans%40telestream.net
>
>This email sent to s...@telestream.net


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to