AsyncAudioDecoder.cpp [plain text]
#include "config.h"
#if ENABLE(WEB_AUDIO)
#include "AsyncAudioDecoder.h"
#include "AudioBuffer.h"
#include "AudioBufferCallback.h"
#include <runtime/ArrayBuffer.h>
#include <wtf/MainThread.h>
namespace WebCore {
AsyncAudioDecoder::AsyncAudioDecoder()
{
LockHolder lock(m_threadCreationMutex);
m_thread = Thread::create("Audio Decoder", [this] {
runLoop();
});
}
AsyncAudioDecoder::~AsyncAudioDecoder()
{
m_queue.kill();
m_thread->waitForCompletion();
m_thread = nullptr;
}
void AsyncAudioDecoder::decodeAsync(Ref<ArrayBuffer>&& audioData, float sampleRate, RefPtr<AudioBufferCallback>&& successCallback, RefPtr<AudioBufferCallback>&& errorCallback)
{
ASSERT(isMainThread());
auto decodingTask = std::make_unique<DecodingTask>(WTFMove(audioData), sampleRate, WTFMove(successCallback), WTFMove(errorCallback));
m_queue.append(WTFMove(decodingTask)); }
void AsyncAudioDecoder::runLoop()
{
ASSERT(!isMainThread());
{
LockHolder lock(m_threadCreationMutex);
}
while (auto decodingTask = m_queue.waitForMessage()) {
decodingTask.release()->decode();
}
}
AsyncAudioDecoder::DecodingTask::DecodingTask(Ref<ArrayBuffer>&& audioData, float sampleRate, RefPtr<AudioBufferCallback>&& successCallback, RefPtr<AudioBufferCallback>&& errorCallback)
: m_audioData(WTFMove(audioData))
, m_sampleRate(sampleRate)
, m_successCallback(WTFMove(successCallback))
, m_errorCallback(WTFMove(errorCallback))
{
}
void AsyncAudioDecoder::DecodingTask::decode()
{
m_audioBuffer = AudioBuffer::createFromAudioFileData(m_audioData->data(), m_audioData->byteLength(), false, sampleRate());
callOnMainThread([this] {
notifyComplete();
});
}
void AsyncAudioDecoder::DecodingTask::notifyComplete()
{
if (audioBuffer() && successCallback())
successCallback()->handleEvent(audioBuffer());
else if (errorCallback())
errorCallback()->handleEvent(audioBuffer());
delete this;
}
}
#endif // ENABLE(WEB_AUDIO)