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