Index: Source/platform/mediastream/MediaStreamSource.cpp |
diff --git a/Source/platform/mediastream/MediaStreamSource.cpp b/Source/platform/mediastream/MediaStreamSource.cpp |
index 6f69127bc64d616f444bbabfb7a2495a657f13a7..2e0ad012478d085ba1dce28e668c58502d4e8a21 100644 |
--- a/Source/platform/mediastream/MediaStreamSource.cpp |
+++ b/Source/platform/mediastream/MediaStreamSource.cpp |
@@ -34,9 +34,31 @@ |
namespace blink { |
-PassRefPtr<MediaStreamSource> MediaStreamSource::create(const String& id, Type type, const String& name, ReadyState readyState, bool requiresConsumer) |
+// FIXME: Oilpan: This disposer pattern is duplicated in a lot of places. |
+// We should create a good abstraction class for this and remove the code duplication. |
+class MediaStreamSourceDisposer { |
+public: |
+ explicit MediaStreamSourceDisposer(MediaStreamSource& source) : m_source(source) { } |
+ ~MediaStreamSourceDisposer() |
+ { |
+ m_source.dispose(); |
+ } |
+ |
+private: |
+ MediaStreamSource& m_source; |
+}; |
+ |
+typedef HeapHashMap<WeakMember<MediaStreamSource>, OwnPtr<MediaStreamSourceDisposer> > SourceDisposers; |
+ |
+static SourceDisposers& sourceDisposers() |
{ |
- return adoptRef(new MediaStreamSource(id, type, name, readyState, requiresConsumer)); |
+ DEFINE_STATIC_LOCAL(Persistent<SourceDisposers>, disposers, (new SourceDisposers)); |
+ return *disposers; |
+} |
+ |
+MediaStreamSource* MediaStreamSource::create(const String& id, Type type, const String& name, ReadyState readyState, bool requiresConsumer) |
+{ |
+ return new MediaStreamSource(id, type, name, readyState, requiresConsumer); |
} |
MediaStreamSource::MediaStreamSource(const String& id, Type type, const String& name, ReadyState readyState, bool requiresConsumer) |
@@ -46,27 +68,27 @@ MediaStreamSource::MediaStreamSource(const String& id, Type type, const String& |
, m_readyState(readyState) |
, m_requiresConsumer(requiresConsumer) |
{ |
+ sourceDisposers().add(this, adoptPtr(new MediaStreamSourceDisposer(*this))); |
+} |
+ |
+void MediaStreamSource::dispose() |
+{ |
+ m_extraData = nullptr; |
} |
void MediaStreamSource::setReadyState(ReadyState readyState) |
{ |
if (m_readyState != ReadyStateEnded && m_readyState != readyState) { |
m_readyState = readyState; |
- for (Vector<Observer*>::iterator i = m_observers.begin(); i != m_observers.end(); ++i) |
+ for (HeapHashSet<WeakMember<Observer> >::iterator i = m_observers.begin(); i != m_observers.end(); ++i) |
(*i)->sourceChangedState(); |
} |
} |
void MediaStreamSource::addObserver(MediaStreamSource::Observer* observer) |
{ |
- m_observers.append(observer); |
-} |
- |
-void MediaStreamSource::removeObserver(MediaStreamSource::Observer* observer) |
-{ |
- size_t pos = m_observers.find(observer); |
- if (pos != kNotFound) |
- m_observers.remove(pos); |
+ ASSERT(!m_observers.contains(observer)); |
+ m_observers.add(observer); |
} |
void MediaStreamSource::addAudioConsumer(AudioDestinationConsumer* consumer) |
@@ -103,4 +125,11 @@ void MediaStreamSource::consumeAudio(AudioBus* bus, size_t numberOfFrames) |
(*it)->consumeAudio(bus, numberOfFrames); |
} |
+void MediaStreamSource::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_observers); |
+ visitor->trace(m_audioConsumers); |
+} |
+ |
} // namespace blink |
+ |