Commit 67d6e72b authored by tkent@chromium.org's avatar tkent@chromium.org

Introduce AudioSourceProviderClientLockScope.

It makes lock/unlock of AudioSourceProviderClient easier.
This class holds a strong reference to AudioSourceProviderClient. So we
don't need MediaElementAudioSourceNode::m_keepAliveWhileLocking.

BUG=395940

Review URL: https://codereview.chromium.org/416333002

git-svn-id: svn://svn.chromium.org/blink/trunk@178999 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 2973128e
......@@ -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()
......
......@@ -147,14 +147,18 @@ void MediaElementAudioSourceNode::process(size_t numberOfFrames)
void MediaElementAudioSourceNode::lock()
{
m_keepAliveWhileLocking = this;
#if !ENABLE(OILPAN)
ref();
#endif
m_processLock.lock();
}
void MediaElementAudioSourceNode::unlock()
{
m_processLock.unlock();
m_keepAliveWhileLocking.clear();
#if !ENABLE(OILPAN)
deref();
#endif
}
void MediaElementAudioSourceNode::trace(Visitor* visitor)
......
......@@ -73,9 +73,6 @@ private:
double m_sourceSampleRate;
OwnPtr<MultiChannelResampler> m_multiChannelResampler;
// Oilpan: This object must be alive between lock() and unlock().
GC_PLUGIN_IGNORE("http://crbug.com/395940")
RefPtrWillBePersistent<MediaElementAudioSourceNode> m_keepAliveWhileLocking;
};
} // namespace blink
......
......@@ -32,6 +32,7 @@ namespace blink {
class AudioSourceProviderClient : public WillBeGarbageCollectedMixin {
public:
virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0;
// Oilpan: Callers should keep this object alive during lock() and unlock().
virtual void lock() { }
virtual void unlock() { }
virtual void trace(Visitor*) { }
......
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