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, sampleRate)
, m_workQueue(WorkQueue::create("MockAudioDestinationCocoa Render Queue"))
, m_timer(RunLoop::current(), this, &MockAudioDestinationCocoa::tick)
{
}
MockAudioDestinationCocoa::~MockAudioDestinationCocoa() = default;
void MockAudioDestinationCocoa::start()
{
m_timer.startRepeating(Seconds { m_numberOfFramesToProcess / sampleRate() });
setIsPlaying(true);
}
void MockAudioDestinationCocoa::stop()
{
m_timer.stop();
setIsPlaying(false);
BinarySemaphore semaphore;
m_workQueue->dispatch([&semaphore] {
semaphore.signal();
});
semaphore.wait();
}
void MockAudioDestinationCocoa::tick()
{
m_workQueue->dispatch([this, sampleRate = sampleRate(), numberOfFramesToProcess = m_numberOfFramesToProcess] {
AudioStreamBasicDescription streamFormat;
setAudioStreamBasicDescription(streamFormat, sampleRate);
WebAudioBufferList webAudioBufferList { streamFormat, numberOfFramesToProcess };
AudioDestinationCocoa::inputProc(this, 0, 0, 0, numberOfFramesToProcess, webAudioBufferList.list());
});
}
}
#endif // ENABLE(WEB_AUDIO)