AudioDestinationChromium.cpp [plain text]
#include "config.h"
#if ENABLE(WEB_AUDIO)
#include "AudioDestinationChromium.h"
#include "AudioPullFIFO.h"
#include "WebKit.h"
#include "platform/WebKitPlatformSupport.h"
#include <public/Platform.h>
using namespace WebKit;
namespace WebCore {
const unsigned renderBufferSize = 128;
const size_t fifoSize = 8192;
const unsigned numberOfChannels = 2;
PassOwnPtr<AudioDestination> AudioDestination::create(AudioSourceProvider& provider, float sampleRate)
{
return adoptPtr(new AudioDestinationChromium(provider, sampleRate));
}
AudioDestinationChromium::AudioDestinationChromium(AudioSourceProvider& provider, float sampleRate)
: m_provider(provider)
, m_renderBus(numberOfChannels, renderBufferSize, false)
, m_sampleRate(sampleRate)
, m_isPlaying(false)
{
m_callbackBufferSize = WebKit::Platform::current()->audioHardwareBufferSize();
ASSERT(m_callbackBufferSize + renderBufferSize <= fifoSize);
if (m_callbackBufferSize + renderBufferSize > fifoSize)
return;
m_audioDevice = adoptPtr(WebKit::Platform::current()->createAudioDevice(m_callbackBufferSize, numberOfChannels, sampleRate, this));
ASSERT(m_audioDevice);
m_fifo = adoptPtr(new AudioPullFIFO(provider, numberOfChannels, fifoSize, renderBufferSize));
}
AudioDestinationChromium::~AudioDestinationChromium()
{
stop();
}
void AudioDestinationChromium::start()
{
if (!m_isPlaying && m_audioDevice) {
m_audioDevice->start();
m_isPlaying = true;
}
}
void AudioDestinationChromium::stop()
{
if (m_isPlaying && m_audioDevice) {
m_audioDevice->stop();
m_isPlaying = false;
}
}
float AudioDestination::hardwareSampleRate()
{
return static_cast<float>(WebKit::Platform::current()->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 == m_callbackBufferSize;
if (!isBufferSizeGood) {
ASSERT_NOT_REACHED();
return;
}
m_renderBus.setChannelMemory(0, audioData[0], numberOfFrames);
m_renderBus.setChannelMemory(1, audioData[1], numberOfFrames);
m_fifo->consume(&m_renderBus, numberOfFrames);
}
}
#endif // ENABLE(WEB_AUDIO)