30 #include <AudioToolbox/AudioToolbox.h>
32 struct AudioStreamBasicDescription;
34 namespace cinder {
namespace audio {
namespace cocoa {
37 void printASBD( const ::AudioStreamBasicDescription &asbd );
42 for(
size_t i = 0; i < bufferList->mNumberBuffers; i++ )
43 free( bufferList->mBuffers[i].mData );
62 ::AudioComponent
findAudioComponent( const ::AudioComponentDescription &componentDescription );
63 void findAndCreateAudioComponent( const ::AudioComponentDescription &componentDescription, ::AudioComponentInstance *componentInstance );
65 ::AudioStreamBasicDescription
createFloatAsbd(
size_t sampleRate,
size_t numChannels,
bool isInterleaved =
false );
66 ::AudioStreamBasicDescription
createInt16Asbd(
size_t sampleRate,
size_t numChannels,
bool isInterleaved =
false );
70 for( UInt32 i = 0; i < bufferList->mNumberBuffers; i++ )
71 memcpy( bufferList->mBuffers[i].mData, buffer->
getChannel( i ), bufferList->mBuffers[i].mDataByteSize );
76 for( UInt32 i = 0; i < bufferList->mNumberBuffers; i++ )
77 memcpy( buffer->
getChannel( i ), bufferList->mBuffers[i].mData, bufferList->mBuffers[i].mDataByteSize );
82 for( UInt32 i = 0; i < bufferList->mNumberBuffers; i++ )
83 memset( bufferList->mBuffers[i].mData, 0, bufferList->mBuffers[i].mDataByteSize );
92 ConverterImplCoreAudio(
size_t sourceSampleRate,
size_t destSampleRate,
size_t sourceNumChannels,
size_t destNumChannels,
size_t sourceMaxFramesPerBlock );
95 virtual std::pair<size_t,size_t>
convert(
const Buffer *sourceBuffer,
Buffer *destBuffer )
override;
96 virtual void clear()
override;
99 std::pair<size_t,size_t> convertComplexImpl(
const Buffer *sourceBuffer,
Buffer *destBuffer );
100 static OSStatus converterCallback( ::AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, ::AudioBufferList *ioData, ::AudioStreamPacketDescription **outDataPacketDescription,
void *inUserData);
103 const Buffer *mSourceBuffer;
104 size_t mNumReadFramesNeeded, mNumSourceBufferFramesUsed;
107 ::AudioConverterRef mAudioConverter;
115 ::AudioStreamBasicDescription
getAudioUnitASBD( ::AudioUnit audioUnit, ::AudioUnitScope scope, ::AudioUnitElement bus );
117 template <
typename PropT>
118 inline void setAudioUnitProperty( ::AudioUnit audioUnit, ::AudioUnitPropertyID propertyId,
const PropT &property, ::AudioUnitScope scope, ::AudioUnitElement bus )
120 OSStatus status = ::AudioUnitSetProperty( audioUnit, propertyId, scope, bus, &property,
sizeof( property ) );
124 template <
typename PropT>
125 inline PropT
getAudioUnitProperty( ::AudioUnit audioUnit, ::AudioUnitPropertyID propertyId, ::AudioUnitScope scope, ::AudioUnitElement bus )
128 UInt32 resultSize =
sizeof( result );
129 OSStatus status = ::AudioUnitGetProperty( audioUnit, propertyId, scope, bus, &result, &resultSize );
134 template <
typename ResultT>
135 inline void getAudioUnitParam( ::AudioUnit audioUnit, ::AudioUnitParameterID paramId, ResultT &result, ::AudioUnitScope scope,
size_t bus )
137 ::AudioUnitParameterValue
param;
138 ::AudioUnitElement busElement =
static_cast<::AudioUnitElement
>( bus );
139 OSStatus status = ::AudioUnitGetParameter( audioUnit, paramId, scope, busElement, ¶m );
141 result =
static_cast<ResultT
>(
param );
144 template <
typename ParamT>
145 inline void setAudioUnitParam( ::AudioUnit audioUnit, ::AudioUnitParameterID paramId,
const ParamT &
param, ::AudioUnitScope scope,
size_t bus )
147 ::AudioUnitParameterValue
value =
static_cast<::AudioUnitParameterValue
>(
param );
148 ::AudioUnitElement busElement =
static_cast<::AudioUnitElement
>( bus );
149 OSStatus status = ::AudioUnitSetParameter( audioUnit, paramId, scope, busElement, value, 0 );
155 std::vector<::AUChannelInfo> result;
157 OSStatus status = ::AudioUnitGetPropertyInfo( audioUnit, kAudioUnitProperty_SupportedNumChannels, kAudioUnitScope_Global, 0, &resultSize, NULL );
158 if( status == kAudioUnitErr_InvalidProperty ) {
164 result.resize( resultSize /
sizeof( ::AUChannelInfo ) );
165 status = ::AudioUnitGetProperty( audioUnit, kAudioUnitProperty_SupportedNumChannels, kAudioUnitScope_Global, 0, result.data(), &resultSize );
Definition: CinderCoreAudio.h:48
T * getChannel(size_t ch)
Returns a pointer offset to the first sample of channel ch.
Definition: Buffer.h:97
AudioBufferListPtr createNonInterleavedBufferList(size_t numFrames, size_t numChannels)
Definition: CinderCoreAudio.cpp:178
void setAudioUnitParam(::AudioUnit audioUnit,::AudioUnitParameterID paramId, const ParamT ¶m,::AudioUnitScope scope, size_t bus)
Definition: CinderCoreAudio.h:145
void operator()(::AudioBufferList *bufferList)
Definition: CinderCoreAudio.h:49
A platform-specific converter that supports samplerate and channel conversion.
Definition: Converter.h:33
::AudioStreamBasicDescription createFloatAsbd(size_t sampleRate, size_t numChannels, bool isInterleaved=false)
Definition: CinderCoreAudio.cpp:220
void getAudioUnitParam(::AudioUnit audioUnit,::AudioUnitParameterID paramId, ResultT &result,::AudioUnitScope scope, size_t bus)
Definition: CinderCoreAudio.h:135
ConverterImplCoreAudio(size_t sourceSampleRate, size_t destSampleRate, size_t sourceNumChannels, size_t destNumChannels, size_t sourceMaxFramesPerBlock)
Definition: CinderCoreAudio.cpp:52
AudioBufferListShallowPtr createNonInterleavedBufferListShallow(size_t numChannels)
Definition: CinderCoreAudio.cpp:192
std::vector<::AUChannelInfo > getAudioUnitChannelInfo(::AudioUnit audioUnit,::AudioUnitElement bus)
Definition: CinderCoreAudio.h:153
virtual void clear() override
Clears the state of the converter, discarding / flushing accumulated samples. Optional for implementa...
Definition: CinderCoreAudio.cpp:151
#define CI_VERIFY(expr)
Definition: CinderAssert.h:80
void copyToBufferList(::AudioBufferList *bufferList, const Buffer *buffer)
Definition: CinderCoreAudio.h:68
void zeroBufferList(const ::AudioBufferList *bufferList)
Definition: CinderCoreAudio.h:80
std::unique_ptr<::AudioBufferList, AudioBufferListShallowDeleter > AudioBufferListShallowPtr
Definition: CinderCoreAudio.h:56
GLuint buffer
Definition: GLee.h:2065
void printASBD(const ::AudioStreamBasicDescription &asbd)
convience function for pretty printing asbd
Definition: CinderCoreAudio.cpp:162
virtual std::pair< size_t, size_t > convert(const Buffer *sourceBuffer, Buffer *destBuffer) override
Definition: CinderCoreAudio.cpp:85
PropT getAudioUnitProperty(::AudioUnit audioUnit,::AudioUnitPropertyID propertyId,::AudioUnitScope scope,::AudioUnitElement bus)
Definition: CinderCoreAudio.h:125
Definition: CinderCoreAudio.h:39
GLsizei const GLfloat * value
Definition: GLee.h:2487
void findAndCreateAudioComponent(const ::AudioComponentDescription &componentDescription,::AudioComponentInstance *componentInstance)
Definition: CinderCoreAudio.cpp:213
std::unique_ptr<::AudioBufferList, AudioBufferListDeleter > AudioBufferListPtr
Definition: CinderCoreAudio.h:55
void copyFromBufferList(Buffer *buffer, const ::AudioBufferList *bufferList)
Definition: CinderCoreAudio.h:74
Definition: CinderCoreAudio.h:90
::AudioStreamBasicDescription createInt16Asbd(size_t sampleRate, size_t numChannels, bool isInterleaved=false)
Definition: CinderCoreAudio.cpp:246
void setAudioUnitProperty(::AudioUnit audioUnit,::AudioUnitPropertyID propertyId, const PropT &property,::AudioUnitScope scope,::AudioUnitElement bus)
Definition: CinderCoreAudio.h:118
::AudioStreamBasicDescription getAudioUnitASBD(::AudioUnit audioUnit,::AudioUnitScope scope,::AudioUnitElement bus)
Definition: CinderCoreAudio.cpp:284
::AudioComponentDescription getOutputAudioUnitDesc()
Definition: CinderCoreAudio.cpp:271
::AudioComponent findAudioComponent(const ::AudioComponentDescription &componentDescription)
Definition: CinderCoreAudio.cpp:206
virtual ~ConverterImplCoreAudio()
Definition: CinderCoreAudio.cpp:77
GLfloat param
Definition: GLee.h:1737
void operator()(::AudioBufferList *bufferList)
Definition: CinderCoreAudio.h:40