AudioOutputUnitAdaptorMac.cpp [plain text]
#include "config.h"
#include "AudioOutputUnitAdaptor.h"
#if ENABLE(WEB_AUDIO) && PLATFORM(MAC)
#include "AudioBus.h"
#include <CoreAudio/AudioHardware.h>
namespace WebCore {
void AudioOutputUnitAdaptor::configure(float hardwareSampleRate, unsigned numberOfOutputChannels)
{
AudioComponent comp;
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_DefaultOutput;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
comp = AudioComponentFindNext(0, &desc);
ASSERT(comp);
OSStatus result = AudioComponentInstanceNew(comp, &m_outputUnit);
ASSERT(!result);
result = AudioUnitInitialize(m_outputUnit);
ASSERT(!result);
AURenderCallbackStruct input;
input.inputProc = inputProc;
input.inputProcRefCon = this;
result = AudioUnitSetProperty(m_outputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &input, sizeof(input));
ASSERT(!result);
constexpr int bytesPerFloat = sizeof(Float32);
constexpr int bitsPerByte = 8;
AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = hardwareSampleRate;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved;
streamFormat.mBytesPerPacket = bytesPerFloat;
streamFormat.mFramesPerPacket = 1;
streamFormat.mBytesPerFrame = bytesPerFloat;
streamFormat.mChannelsPerFrame = numberOfOutputChannels;
streamFormat.mBitsPerChannel = bitsPerByte * bytesPerFloat;
result = AudioUnitSetProperty(m_outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, (void*)&streamFormat, sizeof(AudioStreamBasicDescription));
ASSERT(!result);
}
}
#endif // ENABLE(WEB_AUDIO) && PLATFORM(MAC)