Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Cinder.h"
00026 #include "cinder/audio/Io.h"
00027 #include "cinder/audio/PcmBuffer.h"
00028
00029 #include <CoreAudio/CoreAudioTypes.h>
00030 #include <AudioToolbox/AudioConverter.h>
00031
00032 namespace cinder { namespace audio {
00033
00034 class CocoaCaConverter {
00035 public:
00036 typedef void (*LoaderFunction)( Loader * aLoader, uint32_t *ioSampleCount, BufferList *ioData, AudioStreamPacketDescription * packetDescriptions );
00037
00038 CocoaCaConverter( Loader *aLoader, LoaderFunction loaderFn, const AudioStreamBasicDescription& sourceDescription, const AudioStreamBasicDescription& targetDescription, uint32_t maxPacketSize );
00039 ~CocoaCaConverter();
00040
00041 void loadData( BufferList *ioData );
00042 void reset();
00043
00044 private:
00045 static void fillBufferListFromCaBufferList( BufferList * aBufferList, const AudioBufferList * caBufferList, uint32_t aSampleCount = 0 );
00046 static std::shared_ptr<AudioBufferList> createCaBufferList( const BufferList * caBufferList );
00047 static OSStatus dataInputCallback( AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, AudioBufferList *ioData, AudioStreamPacketDescription **outDataPacketDescriptions, void *audioLoader );
00048
00049 void cleanupPacketDescriptions();
00050 void cleanupConverterBuffer();
00051
00052 uint32_t mMaxPacketSize;
00053 Loader * mLoader;
00054 LoaderFunction mLoaderFunction;
00055 AudioConverterRef mConverter;
00056 AudioStreamPacketDescription * mCurrentPacketDescriptions;
00057 BufferList mConverterBuffer;
00058 };
00059
00060 }}