LibWebRTCAudioModule.cpp [plain text]
#include "config.h"
#include "LibWebRTCAudioModule.h"
#if USE(LIBWEBRTC)
#include "LibWebRTCAudioFormat.h"
#include "Logging.h"
namespace WebCore {
LibWebRTCAudioModule::LibWebRTCAudioModule()
: m_queue(WorkQueue::create("WebKitWebRTCAudioModule", WorkQueue::Type::Serial, WorkQueue::QOS::UserInteractive))
{
}
int32_t LibWebRTCAudioModule::RegisterAudioCallback(webrtc::AudioTransport* audioTransport)
{
m_audioTransport = audioTransport;
return 0;
}
int32_t LibWebRTCAudioModule::StartPlayout()
{
if (m_isPlaying)
return 0;
m_isPlaying = true;
m_queue->dispatch([this] {
m_pollingTime = MonotonicTime::now();
pollAudioData();
});
return 0;
}
int32_t LibWebRTCAudioModule::StopPlayout()
{
if (m_isPlaying)
m_isPlaying = false;
return 0;
}
const unsigned frameLengthMs = 1000 * LibWebRTCAudioFormat::chunkSampleCount / LibWebRTCAudioFormat::sampleRate;
const unsigned pollSamples = 5;
const unsigned pollInterval = 5 * frameLengthMs;
const unsigned channels = 2;
void LibWebRTCAudioModule::pollAudioData()
{
if (!m_isPlaying)
return;
pollFromSource();
auto now = MonotonicTime::now();
auto delayUntilNextPolling = m_pollingTime + Seconds::fromMilliseconds(pollInterval) - now;
if (delayUntilNextPolling.milliseconds() < 0) {
callOnMainThread([timeSpent = (now - m_pollingTime).milliseconds()] {
RELEASE_LOG(WebRTC, "LibWebRTCAudioModule::pollAudioData, polling took too much time: %d ms", (int)timeSpent);
});
delayUntilNextPolling = 0_s;
}
m_pollingTime = now + delayUntilNextPolling;
m_queue->dispatchAfter(delayUntilNextPolling, [this] {
pollAudioData();
});
}
void LibWebRTCAudioModule::pollFromSource()
{
if (!m_audioTransport)
return;
for (unsigned i = 0; i < pollSamples; i++) {
int64_t elapsedTime = -1;
int64_t ntpTime = -1;
char data[LibWebRTCAudioFormat::sampleByteSize * channels * LibWebRTCAudioFormat::chunkSampleCount];
m_audioTransport->PullRenderData(LibWebRTCAudioFormat::sampleByteSize * 8, LibWebRTCAudioFormat::sampleRate, channels, LibWebRTCAudioFormat::chunkSampleCount, data, &elapsedTime, &ntpTime);
}
}
}
#endif // USE(LIBWEBRTC)