#ifndef MediaStream_h
#define MediaStream_h
#if ENABLE(MEDIA_STREAM)
#include "ContextDestructionObserver.h"
#include "EventTarget.h"
#include "ExceptionBase.h"
#include "MediaProducer.h"
#include "MediaStreamPrivate.h"
#include "MediaStreamTrack.h"
#include "ScriptWrappable.h"
#include "Timer.h"
#include "URLRegistry.h"
#include <wtf/HashMap.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class Document;
class MediaStream final : public URLRegistrable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, private MediaProducer, public RefCounted<MediaStream> {
public:
class Observer {
public:
virtual ~Observer() { }
virtual void didAddOrRemoveTrack() = 0;
};
static Ref<MediaStream> create(ScriptExecutionContext&);
static Ref<MediaStream> create(ScriptExecutionContext&, MediaStream&);
static Ref<MediaStream> create(ScriptExecutionContext&, const MediaStreamTrackVector&);
static Ref<MediaStream> create(ScriptExecutionContext&, RefPtr<MediaStreamPrivate>&&);
virtual ~MediaStream();
String id() const { return m_private->id(); }
void addTrack(MediaStreamTrack&);
void removeTrack(MediaStreamTrack&);
MediaStreamTrack* getTrackById(String);
MediaStreamTrackVector getAudioTracks() const;
MediaStreamTrackVector getVideoTracks() const;
MediaStreamTrackVector getTracks() const;
RefPtr<MediaStream> clone();
bool active() const { return m_isActive; }
bool muted() const { return m_isMuted; }
MediaStreamPrivate* privateStream() const { return m_private.get(); }
EventTargetInterface eventTargetInterface() const final { return MediaStreamEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const final { return ContextDestructionObserver::scriptExecutionContext(); }
using RefCounted<MediaStream>::ref;
using RefCounted<MediaStream>::deref;
URLRegistry& registry() const override;
void addObserver(Observer*);
void removeObserver(Observer*);
protected:
MediaStream(ScriptExecutionContext&, const MediaStreamTrackVector&);
MediaStream(ScriptExecutionContext&, RefPtr<MediaStreamPrivate>&&);
void contextDestroyed() final;
private:
enum class StreamModifier { DomAPI, Platform };
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
void trackDidEnd() final;
void activeStatusChanged() final;
void didAddTrack(MediaStreamTrackPrivate&) final;
void didRemoveTrack(MediaStreamTrackPrivate&) final;
void characteristicsChanged() final;
void pageMutedStateDidChange() final;
MediaProducer::MediaStateFlags mediaState() const final;
bool internalAddTrack(Ref<MediaStreamTrack>&&, StreamModifier);
bool internalRemoveTrack(const String&, StreamModifier);
void scheduleActiveStateChange();
void activityEventTimerFired();
void setIsActive(bool);
void statusDidChange();
Document* document() const;
MediaStreamTrackVector trackVectorForType(RealtimeMediaSource::Type) const;
RefPtr<MediaStreamPrivate> m_private;
HashMap<String, RefPtr<MediaStreamTrack>> m_trackSet;
Timer m_activityEventTimer;
Vector<Ref<Event>> m_scheduledActivityEvents;
Vector<Observer*> m_observers;
bool m_isActive { false };
bool m_isMuted { true };
bool m_externallyMuted { false };
};
}
#endif // ENABLE(MEDIA_STREAM)
#endif // MediaStream_h