AudioMediaStreamTrackRendererCocoa.cpp [plain text]
#include "config.h"
#include "AudioMediaStreamTrackRendererCocoa.h"
#if ENABLE(MEDIA_STREAM)
#include "AudioMediaStreamTrackRendererUnit.h"
#include "AudioSampleDataSource.h"
#include "CAAudioStreamDescription.h"
namespace WebCore {
AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() = default;
AudioMediaStreamTrackRendererCocoa::~AudioMediaStreamTrackRendererCocoa() = default;
void AudioMediaStreamTrackRendererCocoa::start()
{
clear();
if (auto* formatDescription = AudioMediaStreamTrackRendererUnit::singleton().formatDescription())
m_outputDescription = makeUnique<CAAudioStreamDescription>(*formatDescription);
}
void AudioMediaStreamTrackRendererCocoa::stop()
{
if (m_dataSource)
AudioMediaStreamTrackRendererUnit::singleton().removeSource(*m_dataSource);
}
void AudioMediaStreamTrackRendererCocoa::clear()
{
stop();
m_dataSource = nullptr;
m_outputDescription = { };
}
void AudioMediaStreamTrackRendererCocoa::setVolume(float volume)
{
AudioMediaStreamTrackRenderer::setVolume(volume);
if (m_dataSource)
m_dataSource->setVolume(volume);
}
void AudioMediaStreamTrackRendererCocoa::pushSamples(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
{
ASSERT(!isMainThread());
ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
if (!m_dataSource || !m_dataSource->inputDescription() || *m_dataSource->inputDescription() != description) {
auto dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, *this);
if (dataSource->setInputFormat(toCAAudioStreamDescription(description))) {
ERROR_LOG(LOGIDENTIFIER, "Unable to set the input format of data source");
return;
}
if (!m_outputDescription || dataSource->setOutputFormat(*m_outputDescription)) {
ERROR_LOG(LOGIDENTIFIER, "Unable to set the output format of data source");
return;
}
callOnMainThread([this, weakThis = makeWeakPtr(this), oldSource = m_dataSource, newSource = dataSource]() mutable {
if (!weakThis)
return;
if (oldSource)
AudioMediaStreamTrackRendererUnit::singleton().removeSource(*oldSource);
newSource->setVolume(volume());
AudioMediaStreamTrackRendererUnit::singleton().addSource(WTFMove(newSource));
});
m_dataSource = WTFMove(dataSource);
}
m_dataSource->pushSamples(sampleTime, audioData, sampleCount);
}
}
#endif // ENABLE(MEDIA_STREAM)