Commit ef9a150a authored by Andrew MacPherson's avatar Andrew MacPherson Committed by Commit Bot

Fix MediaStreamAudioSourceNode custom sampleRate

Now that the AudioContext supports the optional sampleRate parameter
MediaStreamTrack data needs to be resampled to this rate and not the
hardware rate.

Bug: 945305
Change-Id: If34b72f0aee864148aa44531e87e3816ae05a799
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1541078Reviewed-by: default avatarRaymond Toy <rtoy@chromium.org>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Andrew MacPherson <andrew.macpherson@soundtrap.com>
Cr-Commit-Position: refs/heads/master@{#646090}
parent 73c82814
......@@ -180,7 +180,8 @@ void MediaStreamCenter::DidDisableMediaStreamTrack(
blink::WebAudioSourceProvider*
MediaStreamCenter::CreateWebAudioSourceFromMediaStreamTrack(
const blink::WebMediaStreamTrack& track) {
const blink::WebMediaStreamTrack& track,
int context_sample_rate) {
DVLOG(1) << "MediaStreamCenter::createWebAudioSourceFromMediaStreamTrack";
blink::WebPlatformMediaStreamTrack* media_stream_track =
track.GetPlatformTrack();
......@@ -195,7 +196,7 @@ MediaStreamCenter::CreateWebAudioSourceFromMediaStreamTrack(
// TODO(tommi): Rename WebRtcLocalAudioSourceProvider to
// WebAudioMediaStreamSink since it's not specific to any particular source.
// https://crbug.com/577874
return new WebRtcLocalAudioSourceProvider(track);
return new WebRtcLocalAudioSourceProvider(track, context_sample_rate);
}
void MediaStreamCenter::DidStopMediaStreamSource(
......
......@@ -40,7 +40,8 @@ class CONTENT_EXPORT MediaStreamCenter : public blink::WebMediaStreamCenter {
const blink::WebMediaStreamTrack& track) override;
blink::WebAudioSourceProvider* CreateWebAudioSourceFromMediaStreamTrack(
const blink::WebMediaStreamTrack& track) override;
const blink::WebMediaStreamTrack& track,
int context_sample_rate) override;
void DidStopMediaStreamSource(
const blink::WebMediaStreamSource& web_source) override;
......
......@@ -28,10 +28,9 @@ namespace content {
const size_t WebRtcLocalAudioSourceProvider::kWebAudioRenderBufferSize = 128;
WebRtcLocalAudioSourceProvider::WebRtcLocalAudioSourceProvider(
const blink::WebMediaStreamTrack& track)
: is_enabled_(false),
track_(track),
track_stopped_(false) {
const blink::WebMediaStreamTrack& track,
int context_sample_rate)
: is_enabled_(false), track_(track), track_stopped_(false) {
// Get the native audio output hardware sample-rate for the sink.
// We need to check if there is a valid frame since the unittests
// do not have one and they will inject their own |sink_params_| for testing.
......@@ -39,13 +38,8 @@ WebRtcLocalAudioSourceProvider::WebRtcLocalAudioSourceProvider(
blink::WebLocalFrame::FrameForCurrentContext();
RenderFrame* const render_frame = RenderFrame::FromWebFrame(web_frame);
if (render_frame) {
int sample_rate =
AudioDeviceFactory::GetOutputDeviceInfo(render_frame->GetRoutingID(),
media::AudioSinkParameters())
.output_params()
.sample_rate();
sink_params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
media::CHANNEL_LAYOUT_STEREO, sample_rate,
media::CHANNEL_LAYOUT_STEREO, context_sample_rate,
kWebAudioRenderBufferSize);
}
// Connect the source provider to the track as a sink.
......
......@@ -57,7 +57,8 @@ class CONTENT_EXPORT WebRtcLocalAudioSourceProvider
static const size_t kWebAudioRenderBufferSize;
explicit WebRtcLocalAudioSourceProvider(
const blink::WebMediaStreamTrack& track);
const blink::WebMediaStreamTrack& track,
int context_sample_rate);
~WebRtcLocalAudioSourceProvider() override;
// blink::WebMediaStreamAudioSink implementation.
......
......@@ -21,9 +21,10 @@ class WebRtcLocalAudioSourceProviderTest : public testing::Test {
void SetUp() override {
source_params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
media::CHANNEL_LAYOUT_MONO, 48000, 480);
const int context_sample_rate = 44100;
sink_params_.Reset(
media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
media::CHANNEL_LAYOUT_STEREO, 44100,
media::CHANNEL_LAYOUT_STEREO, context_sample_rate,
WebRtcLocalAudioSourceProvider::kWebAudioRenderBufferSize);
sink_bus_ = media::AudioBus::Create(sink_params_);
blink::WebMediaStreamSource audio_source;
......@@ -35,7 +36,8 @@ class WebRtcLocalAudioSourceProviderTest : public testing::Test {
audio_source);
blink_track_.SetPlatformTrack(
std::make_unique<blink::MediaStreamAudioTrack>(true));
source_provider_.reset(new WebRtcLocalAudioSourceProvider(blink_track_));
source_provider_.reset(
new WebRtcLocalAudioSourceProvider(blink_track_, context_sample_rate));
source_provider_->SetSinkParamsForTesting(sink_params_);
source_provider_->OnSetFormat(source_params_);
}
......
......@@ -59,7 +59,8 @@ class WebMediaStreamCenter {
// Caller must take the ownership of the returned |WebAudioSourceProvider|
// object.
virtual WebAudioSourceProvider* CreateWebAudioSourceFromMediaStreamTrack(
const WebMediaStreamTrack&) {
const WebMediaStreamTrack&,
int context_sample_rate) {
return nullptr;
}
};
......
......@@ -696,9 +696,10 @@ bool MediaStreamTrack::HasPendingActivity() const {
return !Ended() && HasEventListeners(event_type_names::kEnded);
}
std::unique_ptr<AudioSourceProvider> MediaStreamTrack::CreateWebAudioSource() {
std::unique_ptr<AudioSourceProvider> MediaStreamTrack::CreateWebAudioSource(
int context_sample_rate) {
return MediaStreamCenter::Instance().CreateWebAudioSourceFromMediaStreamTrack(
Component());
Component(), context_sample_rate);
}
void MediaStreamTrack::RegisterMediaStream(MediaStream* media_stream) {
......
......@@ -111,7 +111,8 @@ class MODULES_EXPORT MediaStreamTrack
// ContextLifecycleObserver
void ContextDestroyed(ExecutionContext*) override;
std::unique_ptr<AudioSourceProvider> CreateWebAudioSource();
std::unique_ptr<AudioSourceProvider> CreateWebAudioSource(
int context_sample_rate);
void Trace(blink::Visitor*) override;
......
......@@ -146,7 +146,7 @@ MediaStreamAudioSourceNode* MediaStreamAudioSourceNode::Create(
// Use the first audio track in the media stream.
MediaStreamTrack* audio_track = audio_tracks[0];
std::unique_ptr<AudioSourceProvider> provider =
audio_track->CreateWebAudioSource();
audio_track->CreateWebAudioSource(context.sampleRate());
MediaStreamAudioSourceNode* node =
MakeGarbageCollected<MediaStreamAudioSourceNode>(
......
......@@ -97,11 +97,13 @@ void MediaStreamCenter::DidSetContentHint(MediaStreamComponent* track) {
std::unique_ptr<AudioSourceProvider>
MediaStreamCenter::CreateWebAudioSourceFromMediaStreamTrack(
MediaStreamComponent* track) {
MediaStreamComponent* track,
int context_sample_rate) {
DCHECK(track);
if (private_) {
return std::make_unique<MediaStreamWebAudioSource>(base::WrapUnique(
private_->CreateWebAudioSourceFromMediaStreamTrack(track)));
return std::make_unique<MediaStreamWebAudioSource>(
base::WrapUnique(private_->CreateWebAudioSourceFromMediaStreamTrack(
track, context_sample_rate)));
}
return nullptr;
......
......@@ -63,7 +63,8 @@ class PLATFORM_EXPORT MediaStreamCenter {
void DidSetMediaStreamTrackEnabled(MediaStreamComponent*);
void DidSetContentHint(MediaStreamComponent*);
std::unique_ptr<AudioSourceProvider> CreateWebAudioSourceFromMediaStreamTrack(
MediaStreamComponent*);
MediaStreamComponent*,
int context_sample_rate);
void DidCreateMediaStreamAndTracks(MediaStreamDescriptor*);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment