AudioDestinationChromium.cpp [plain text]
#include "config.h"
#if ENABLE(WEB_AUDIO)
#include "AudioDestinationChromium.h"
#include "AudioSourceProvider.h"
#include "WebKit.h"
#include "WebKitClient.h"
using namespace WebKit;
namespace WebCore {
#if OS(DARWIN)
const unsigned callbackBufferSize = 128;
#else
const unsigned callbackBufferSize = 2048;
#endif
const unsigned renderBufferSize = 128;
const unsigned renderCountPerCallback = callbackBufferSize / renderBufferSize;
const unsigned numberOfChannels = 2;
PassOwnPtr<AudioDestination> AudioDestination::create(AudioSourceProvider& provider, double sampleRate)
{
return adoptPtr(new AudioDestinationChromium(provider, sampleRate));
}
AudioDestinationChromium::AudioDestinationChromium(AudioSourceProvider& provider, double sampleRate)
: m_provider(provider)
, m_renderBus(numberOfChannels, renderBufferSize, false)
, m_sampleRate(sampleRate)
, m_isPlaying(false)
{
m_audioDevice = adoptPtr(webKitClient()->createAudioDevice(callbackBufferSize, numberOfChannels, sampleRate, this));
ASSERT(m_audioDevice.get());
}
AudioDestinationChromium::~AudioDestinationChromium()
{
stop();
}
void AudioDestinationChromium::start()
{
if (!m_isPlaying && m_audioDevice.get()) {
m_audioDevice->start();
m_isPlaying = true;
}
}
void AudioDestinationChromium::stop()
{
if (m_isPlaying && m_audioDevice.get()) {
m_audioDevice->stop();
m_isPlaying = false;
}
}
double AudioDestination::hardwareSampleRate()
{
return webKitClient()->audioHardwareSampleRate();
}
void AudioDestinationChromium::render(const WebVector<float*>& audioData, size_t numberOfFrames)
{
bool isNumberOfChannelsGood = audioData.size() == numberOfChannels;
if (!isNumberOfChannelsGood) {
ASSERT_NOT_REACHED();
return;
}
bool isBufferSizeGood = numberOfFrames == callbackBufferSize;
if (!isBufferSizeGood) {
ASSERT_NOT_REACHED();
return;
}
for (unsigned i = 0; i < renderCountPerCallback; ++i) {
m_renderBus.setChannelMemory(0, audioData[0] + i * renderBufferSize, renderBufferSize);
m_renderBus.setChannelMemory(1, audioData[1] + i * renderBufferSize, renderBufferSize);
m_provider.provideInput(&m_renderBus, renderBufferSize);
}
}
}
#endif // ENABLE(WEB_AUDIO)