Diff
Modified: trunk/LayoutTests/ChangeLog (260379 => 260380)
--- trunk/LayoutTests/ChangeLog 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/LayoutTests/ChangeLog 2020-04-20 18:16:57 UTC (rev 260380)
@@ -1,3 +1,13 @@
+2020-04-20 Youenn Fablet <[email protected]>
+
+ MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
+ https://bugs.webkit.org/show_bug.cgi?id=210740
+
+ Reviewed by Eric Carlson.
+
+ * fast/mediastream/play-newly-added-audio-track-expected.txt: Added.
+ * fast/mediastream/play-newly-added-audio-track.html: Added.
+
2020-04-20 Zalan Bujtas <[email protected]>
fast/layoutformattingcontext/simple-absolute-positioned-replaced-inline-element-with-percentage-height.html is flaky
Added: trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track-expected.txt (0 => 260380)
--- trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track-expected.txt 2020-04-20 18:16:57 UTC (rev 260380)
@@ -0,0 +1,5 @@
+
+
+PASS Add an audio track while playing video
+PASS Add an audio track while playing audio
+
Added: trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track.html (0 => 260380)
--- trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track.html 2020-04-20 18:16:57 UTC (rev 260380)
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <video id="video" autoplay controls></video>
+ <script src=""
+ <script src=""
+ <script>
+promise_test(async () => {
+ let stream = await navigator.mediaDevices.getUserMedia({ video : true });
+ video.srcObject = stream;
+
+ await video.play();
+
+ let stream2 = await navigator.mediaDevices.getUserMedia({ audio : true });
+ video.srcObject.addTrack(stream2.getAudioTracks()[0]);
+
+ if (window.internals)
+ assert_true(internals.shouldAudioTrackPlay(video.audioTracks[0]));
+}, "Add an audio track while playing video");
+
+promise_test(async () => {
+ let stream = await navigator.mediaDevices.getUserMedia({ audio : true });
+ video.srcObject = stream.clone();
+
+ await video.play();
+
+ video.srcObject.addTrack(stream.getAudioTracks()[0]);
+ await new Promise(resolve => setTimeout(resolve, 50));
+ if (window.internals)
+ assert_true(internals.shouldAudioTrackPlay(video.audioTracks[1]));
+}, "Add an audio track while playing audio");
+ </script>
+ </head>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (260379 => 260380)
--- trunk/Source/WebCore/ChangeLog 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/ChangeLog 2020-04-20 18:16:57 UTC (rev 260380)
@@ -1,5 +1,35 @@
2020-04-20 Youenn Fablet <[email protected]>
+ MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
+ https://bugs.webkit.org/show_bug.cgi?id=210740
+
+ Reviewed by Eric Carlson.
+
+ Before the patch, MediaPlayerPrivateMediaStreamAVFObjC was not calling play on the audio renderer when the audio renderer
+ was added after the MediaPlayerPrivateMediaStreamAVFObjC was asked to play.
+ This patch makes it so that, on configuration of an audio track, it will be asked to play if its MediaPlayerPrivateMediaStreamAVFObjC is playing.
+ Add internals API to be able to write a test.
+
+ Test: fast/mediastream/play-newly-added-audio-track.html
+
+ * html/track/AudioTrack.h:
+ * html/track/AudioTrack.idl:
+ * platform/graphics/AudioTrackPrivate.h:
+ (WebCore::AudioTrackPrivate::isBackedByMediaStreamTrack const):
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+ (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):
+ * platform/mediastream/AudioTrackPrivateMediaStream.cpp:
+ (WebCore::AudioTrackPrivateMediaStream::play):
+ * platform/mediastream/AudioTrackPrivateMediaStream.h:
+ (isType):
+ * testing/Internals.cpp:
+ (WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
+ (WebCore::Internals::shouldAudioTrackPlay):
+ * testing/Internals.h:
+ * testing/Internals.idl:
+
+2020-04-20 Youenn Fablet <[email protected]>
+
Use a WeakHashSet to store MediaStreamPrivate observers
https://bugs.webkit.org/show_bug.cgi?id=210494
Modified: trunk/Source/WebCore/html/track/AudioTrack.h (260379 => 260380)
--- trunk/Source/WebCore/html/track/AudioTrack.h 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/html/track/AudioTrack.h 2020-04-20 18:16:57 UTC (rev 260380)
@@ -64,7 +64,9 @@
size_t inbandTrackIndex() const;
+ const AudioTrackPrivate& privateTrack() const { return m_private; }
void setPrivate(AudioTrackPrivate&);
+
void setMediaElement(WeakPtr<HTMLMediaElement>) override;
#if !RELEASE_LOG_DISABLED
void setLogger(const Logger&, const void*) final;
Modified: trunk/Source/WebCore/html/track/AudioTrack.idl (260379 => 260380)
--- trunk/Source/WebCore/html/track/AudioTrack.idl 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/html/track/AudioTrack.idl 2020-04-20 18:16:57 UTC (rev 260380)
@@ -25,6 +25,7 @@
[
Conditional=VIDEO_TRACK,
+ ExportMacro=WEBCORE_EXPORT,
GenerateIsReachable=ImplElementRoot,
JSCustomMarkFunction
] interface AudioTrack {
Modified: trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h (260379 => 260380)
--- trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h 2020-04-20 18:16:57 UTC (rev 260380)
@@ -62,6 +62,8 @@
enum Kind { Alternative, Description, Main, MainDesc, Translation, Commentary, None };
virtual Kind kind() const { return None; }
+ virtual bool isBackedByMediaStreamTrack() const { return false; }
+
#if !RELEASE_LOG_DISABLED
const char* logClassName() const override { return "AudioTrackPrivate"; }
#endif
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (260379 => 260380)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm 2020-04-20 18:16:57 UTC (rev 260380)
@@ -895,8 +895,11 @@
break;
case TrackState::Configure:
track.setTrackIndex(index);
- bool enabled = track.streamTrack().enabled() && !track.streamTrack().muted();
- track.setEnabled(enabled);
+ track.setVolume(m_volume);
+ track.setMuted(m_muted);
+ track.setEnabled(track.streamTrack().enabled() && !track.streamTrack().muted());
+ if (playing())
+ track.play();
break;
}
};
Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (260379 => 260380)
--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp 2020-04-20 18:16:57 UTC (rev 260380)
@@ -72,6 +72,9 @@
void AudioTrackPrivateMediaStream::play()
{
+ if (m_shouldPlay)
+ return;
+
m_shouldPlay = true;
updateRenderer();
}
Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h (260379 => 260380)
--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h 2020-04-20 18:16:57 UTC (rev 260380)
@@ -54,7 +54,8 @@
void play();
void pause();
- bool isPlaying() { return m_isPlaying; }
+ bool isPlaying() const { return m_isPlaying; }
+ bool shouldPlay() const { return m_shouldPlay; }
void setVolume(float);
float volume() const;
@@ -75,6 +76,7 @@
AtomString id() const final { return m_id; }
AtomString label() const final { return m_label; }
int trackIndex() const final { return m_index; }
+ bool isBackedByMediaStreamTrack() const final { return true; }
// MediaStreamTrackPrivate::Observer
void trackEnded(MediaStreamTrackPrivate&) final;
@@ -107,4 +109,8 @@
}
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AudioTrackPrivateMediaStream)
+ static bool isType(const WebCore::AudioTrackPrivate& track) { return track.isBackedByMediaStreamTrack(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/testing/Internals.cpp (260379 => 260380)
--- trunk/Source/WebCore/testing/Internals.cpp 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/testing/Internals.cpp 2020-04-20 18:16:57 UTC (rev 260380)
@@ -32,6 +32,7 @@
#include "AnimationTimeline.h"
#include "ApplicationCacheStorage.h"
#include "AudioSession.h"
+#include "AudioTrackPrivateMediaStream.h"
#include "Autofill.h"
#include "BackForwardCache.h"
#include "BackForwardController.h"
@@ -5076,6 +5077,13 @@
{
return MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled();
}
+
+bool Internals::shouldAudioTrackPlay(const AudioTrack& track)
+{
+ if (!is<AudioTrackPrivateMediaStream>(track.privateTrack()))
+ return false;
+ return downcast<AudioTrackPrivateMediaStream>(track.privateTrack()).shouldPlay();
+}
#endif
bool Internals::supportsAudioSession() const
Modified: trunk/Source/WebCore/testing/Internals.h (260379 => 260380)
--- trunk/Source/WebCore/testing/Internals.h 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/testing/Internals.h 2020-04-20 18:16:57 UTC (rev 260380)
@@ -52,6 +52,7 @@
class AnimationTimeline;
class AudioContext;
+class AudioTrack;
class CacheStorageConnection;
class DOMRect;
class DOMRectList;
@@ -764,6 +765,7 @@
void setMediaStreamTrackIdentifier(MediaStreamTrack&, String&& id);
void setMediaStreamSourceInterrupted(MediaStreamTrack&, bool);
bool isMockRealtimeMediaSourceCenterEnabled();
+ bool shouldAudioTrackPlay(const AudioTrack&);
#endif
bool supportsAudioSession() const;
Modified: trunk/Source/WebCore/testing/Internals.idl (260379 => 260380)
--- trunk/Source/WebCore/testing/Internals.idl 2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/testing/Internals.idl 2020-04-20 18:16:57 UTC (rev 260380)
@@ -777,6 +777,7 @@
[Conditional=MEDIA_STREAM] void setMediaStreamTrackIdentifier(MediaStreamTrack track, DOMString identifier);
[Conditional=MEDIA_STREAM] void setMediaStreamSourceInterrupted(MediaStreamTrack track, boolean interrupted);
[Conditional=MEDIA_STREAM] boolean isMockRealtimeMediaSourceCenterEnabled();
+ [Conditional=MEDIA_STREAM] boolean shouldAudioTrackPlay(AudioTrack track);
unsigned long long documentIdentifier(Document document);
boolean isDocumentAlive(unsigned long long documentIdentifier);