Commit 16cb2a41 authored by zerny@chromium.org's avatar zerny@chromium.org

Oilpan: Use transition types for HTMLMediaElement and make AudioSourceProviderClient a GC mixin.

BUG=357163
R=haraken@chromium.org

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

git-svn-id: svn://svn.chromium.org/blink/trunk@176013 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 8757cc4f
......@@ -284,7 +284,7 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document& docum
, m_textTracks(nullptr)
, m_ignoreTrackDisplayUpdate(0)
#if ENABLE(WEB_AUDIO)
, m_audioSourceNode(0)
, m_audioSourceNode(nullptr)
#endif
{
ASSERT(RuntimeEnabledFeatures::mediaEnabled());
......@@ -372,7 +372,13 @@ HTMLMediaElement::~HTMLMediaElement()
// crbug.com/378229
m_isFinalizing = true;
#endif
clearMediaPlayerAndAudioSourceProviderClient();
// The m_audioSourceNode is either dead already or it is dying together with
// this HTMLMediaElement which it strongly keeps alive.
#if !ENABLE(OILPAN)
ASSERT(!m_audioSourceNode);
#endif
clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
#if !ENABLE(OILPAN)
document().decrementLoadEventDelayCount();
......@@ -3119,22 +3125,13 @@ void HTMLMediaElement::userCancelledLoad()
updateActiveTextTrackCues(0);
}
void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClient()
void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLocking()
{
#if ENABLE(WEB_AUDIO)
if (m_audioSourceNode)
m_audioSourceNode->lock();
if (audioSourceProvider())
audioSourceProvider()->setClient(0);
#endif
m_player.clear();
#if ENABLE(WEB_AUDIO)
if (m_audioSourceNode)
m_audioSourceNode->unlock();
#endif
}
void HTMLMediaElement::clearMediaPlayer(int flags)
......@@ -3145,7 +3142,17 @@ void HTMLMediaElement::clearMediaPlayer(int flags)
m_delayingLoadForPreloadNone = false;
clearMediaPlayerAndAudioSourceProviderClient();
#if ENABLE(WEB_AUDIO)
if (m_audioSourceNode)
m_audioSourceNode->lock();
#endif
clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
#if ENABLE(WEB_AUDIO)
if (m_audioSourceNode)
m_audioSourceNode->unlock();
#endif
stopPeriodicTimers();
m_loadTimer.stop();
......@@ -3657,8 +3664,19 @@ void HTMLMediaElement::trace(Visitor* visitor)
visitor->trace(m_textTracks);
visitor->trace(m_textTracksWhenResourceSelectionBegan);
visitor->trace(m_mediaController);
#if ENABLE(WEB_AUDIO)
visitor->registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::clearWeakMembers>(this);
#endif
WillBeHeapSupplementable<HTMLMediaElement>::trace(visitor);
HTMLElement::trace(visitor);
}
#if ENABLE(WEB_AUDIO)
void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
{
if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider())
audioSourceProvider()->setClient(0);
}
#endif
}
......@@ -80,6 +80,9 @@ public:
static bool isMediaStreamURL(const String& url);
virtual void trace(Visitor*) OVERRIDE;
#if ENABLE(WEB_AUDIO)
void clearWeakMembers(Visitor*);
#endif
// Do not use player().
// FIXME: Replace all uses with webMediaPlayer() and remove this API.
......@@ -367,7 +370,7 @@ private:
void loadNextSourceChild();
void userCancelledLoad();
void clearMediaPlayer(int flags);
void clearMediaPlayerAndAudioSourceProviderClient();
void clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
bool havePotentialSourceChild();
void noneSupported();
void mediaEngineError(PassRefPtrWillBeRawPtr<MediaError>);
......@@ -520,7 +523,8 @@ private:
#if ENABLE(WEB_AUDIO)
// This is a weak reference, since m_audioSourceNode holds a reference to us.
AudioSourceProviderClient* m_audioSourceNode;
// FIXME: Oilpan: Consider making this a strongly traced pointer with oilpan where strong cycles are not a problem.
RawPtrWillBeWeakMember<AudioSourceProviderClient> m_audioSourceNode;
#endif
friend class MediaController;
......
......@@ -63,7 +63,9 @@ MediaElementAudioSourceNode::MediaElementAudioSourceNode(AudioContext* context,
MediaElementAudioSourceNode::~MediaElementAudioSourceNode()
{
#if !ENABLE(OILPAN)
m_mediaElement->setAudioSourceNode(0);
#endif
uninitialize();
}
......@@ -148,6 +150,13 @@ void MediaElementAudioSourceNode::unlock()
deref();
}
void MediaElementAudioSourceNode::trace(Visitor* visitor)
{
visitor->trace(m_mediaElement);
AudioSourceNode::trace(visitor);
AudioSourceProviderClient::trace(visitor);
}
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
......@@ -40,6 +40,7 @@ class AudioContext;
class HTMLMediaElement;
class MediaElementAudioSourceNode FINAL : public AudioSourceNode, public AudioSourceProviderClient {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MediaElementAudioSourceNode);
public:
static PassRefPtrWillBeRawPtr<MediaElementAudioSourceNode> create(AudioContext*, HTMLMediaElement*);
......@@ -56,13 +57,15 @@ public:
virtual void lock() OVERRIDE;
virtual void unlock() OVERRIDE;
virtual void trace(Visitor*) OVERRIDE;
private:
MediaElementAudioSourceNode(AudioContext*, HTMLMediaElement*);
// As an audio source, we will never propagate silence.
virtual bool propagatesSilence() const OVERRIDE { return false; }
RefPtr<HTMLMediaElement> m_mediaElement;
RefPtrWillBeMember<HTMLMediaElement> m_mediaElement;
Mutex m_processLock;
unsigned m_sourceNumberOfChannels;
......
......@@ -113,6 +113,14 @@ void MediaStreamAudioSourceNode::process(size_t numberOfFrames)
}
}
void MediaStreamAudioSourceNode::trace(Visitor* visitor)
{
visitor->trace(m_mediaStream);
visitor->trace(m_audioTrack);
AudioSourceNode::trace(visitor);
AudioSourceProviderClient::trace(visitor);
}
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
......@@ -40,6 +40,7 @@ namespace WebCore {
class AudioContext;
class MediaStreamAudioSourceNode FINAL : public AudioSourceNode, public AudioSourceProviderClient {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MediaStreamAudioSourceNode);
public:
static PassRefPtrWillBeRawPtr<MediaStreamAudioSourceNode> create(AudioContext*, MediaStream*, MediaStreamTrack*, PassOwnPtr<AudioSourceProvider>);
......@@ -55,14 +56,16 @@ public:
AudioSourceProvider* audioSourceProvider() const { return m_audioSourceProvider.get(); }
virtual void trace(Visitor*) OVERRIDE;
private:
MediaStreamAudioSourceNode(AudioContext*, MediaStream*, MediaStreamTrack*, PassOwnPtr<AudioSourceProvider>);
// As an audio source, we will never propagate silence.
virtual bool propagatesSilence() const OVERRIDE { return false; }
RefPtr<MediaStream> m_mediaStream;
RefPtr<MediaStreamTrack> m_audioTrack;
RefPtrWillBeMember<MediaStream> m_mediaStream;
RefPtrWillBeMember<MediaStreamTrack> m_audioTrack;
OwnPtr<AudioSourceProvider> m_audioSourceProvider;
Mutex m_processLock;
......
......@@ -25,13 +25,16 @@
#ifndef AudioSourceProviderClient_h
#define AudioSourceProviderClient_h
#include "platform/heap/Handle.h"
namespace WebCore {
class AudioSourceProviderClient {
class AudioSourceProviderClient : public WillBeGarbageCollectedMixin {
public:
virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0;
virtual void lock() { }
virtual void unlock() { }
virtual void trace(Visitor*) { }
protected:
virtual ~AudioSourceProviderClient() { }
};
......
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