MockAudioDestinationCocoa.cpp [plain text]
#include "config.h"
#include "MockAudioDestinationCocoa.h"
#if ENABLE(WEB_AUDIO)
#include "CAAudioStreamDescription.h"
#include "WebAudioBufferList.h"
#include <wtf/threads/BinarySemaphore.h>
namespace WebCore {
const int kRenderBufferSize = 128;
MockAudioDestinationCocoa::MockAudioDestinationCocoa(AudioIOCallback& callback, float sampleRate)
: AudioDestinationCocoa(callback, 2, sampleRate)
, m_workQueue(WorkQueue::create("MockAudioDestinationCocoa Render Queue"))
, m_timer(RunLoop::current(), this, &MockAudioDestinationCocoa::tick)
{
}
MockAudioDestinationCocoa::~MockAudioDestinationCocoa() = default;
void MockAudioDestinationCocoa::startRendering(CompletionHandler<void(bool)>&& completionHandler)
{
m_timer.startRepeating(Seconds { m_numberOfFramesToProcess / sampleRate() });
setIsPlaying(true);
callOnMainThread([completionHandler = WTFMove(completionHandler)]() mutable {
completionHandler(true);
});
}
void MockAudioDestinationCocoa::stopRendering(CompletionHandler<void(bool)>&& completionHandler)
{
m_timer.stop();
setIsPlaying(false);
callOnMainThread([completionHandler = WTFMove(completionHandler)]() mutable {
completionHandler(true);
});
}
void MockAudioDestinationCocoa::tick()
{
m_workQueue->dispatch([this, protectedThis = makeRef(*this), sampleRate = sampleRate(), numberOfFramesToProcess = m_numberOfFramesToProcess] {
AudioStreamBasicDescription streamFormat;
getAudioStreamBasicDescription(streamFormat);
WebAudioBufferList webAudioBufferList { streamFormat, numberOfFramesToProcess };
render(0., 0, numberOfFramesToProcess, webAudioBufferList.list());
});
}
}
#endif // ENABLE(WEB_AUDIO)