Index: Source/core/html/HTMLMediaElement.cpp |
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp |
index 2e7f9801e54e65cc38afbcd0fde33499f681174c..1fcbdeb2d7a646e6ce582aa9f051204e132a488a 100644 |
--- a/Source/core/html/HTMLMediaElement.cpp |
+++ b/Source/core/html/HTMLMediaElement.cpp |
@@ -168,6 +168,30 @@ private: |
RawPtrWillBeMember<HTMLMediaElement> m_mediaElement; |
}; |
+class AudioSourceProviderClientLockScope { |
+ STACK_ALLOCATED(); |
+public: |
+#if ENABLE(WEB_AUDIO) |
+ AudioSourceProviderClientLockScope(HTMLMediaElement& element) |
+ : m_client(element.audioSourceNode()) |
+ { |
+ if (m_client) |
+ m_client->lock(); |
+ } |
+ ~AudioSourceProviderClientLockScope() |
+ { |
+ if (m_client) |
+ m_client->unlock(); |
+ } |
+ |
+private: |
+ RawPtrWillBeMember<AudioSourceProviderClient> m_client; |
+#else |
+ explicit AudioSourceProviderClientLockScope(HTMLMediaElement&) { } |
+ ~AudioSourceProviderClientLockScope() { } |
+#endif |
+}; |
+ |
static const AtomicString& AudioKindToString(WebMediaPlayerClient::AudioTrackKind kind) |
{ |
switch (kind) { |
@@ -3393,17 +3417,10 @@ void HTMLMediaElement::clearMediaPlayer(int flags) |
cancelDeferredLoad(); |
-#if ENABLE(WEB_AUDIO) |
- if (m_audioSourceNode) |
- m_audioSourceNode->lock(); |
-#endif |
- |
- clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
- |
-#if ENABLE(WEB_AUDIO) |
- if (m_audioSourceNode) |
- m_audioSourceNode->unlock(); |
-#endif |
+ { |
+ AudioSourceProviderClientLockScope scope(*this); |
+ clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
+ } |
stopPeriodicTimers(); |
m_loadTimer.stop(); |
@@ -3688,22 +3705,16 @@ void* HTMLMediaElement::preDispatchEventHandler(Event* event) |
void HTMLMediaElement::createMediaPlayer() |
{ |
-#if ENABLE(WEB_AUDIO) |
- if (m_audioSourceNode) |
- m_audioSourceNode->lock(); |
-#endif |
+ AudioSourceProviderClientLockScope scope(*this); |
closeMediaSource(); |
m_player = MediaPlayer::create(this); |
#if ENABLE(WEB_AUDIO) |
- if (m_audioSourceNode) { |
+ if (m_audioSourceNode && audioSourceProvider()) { |
// When creating the player, make sure its AudioSourceProvider knows about the client. |
- if (audioSourceProvider()) |
- audioSourceProvider()->setClient(m_audioSourceNode); |
- |
- m_audioSourceNode->unlock(); |
+ audioSourceProvider()->setClient(m_audioSourceNode); |
} |
#endif |
} |
@@ -3713,14 +3724,9 @@ void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) |
{ |
m_audioSourceNode = sourceNode; |
- if (m_audioSourceNode) |
- m_audioSourceNode->lock(); |
- |
+ AudioSourceProviderClientLockScope scope(*this); |
if (audioSourceProvider()) |
audioSourceProvider()->setClient(m_audioSourceNode); |
- |
- if (m_audioSourceNode) |
- m_audioSourceNode->unlock(); |
} |
AudioSourceProvider* HTMLMediaElement::audioSourceProvider() |