#ifndef MediaStreamTrack_h
#define MediaStreamTrack_h
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/ActiveDOMObject.h"
#include "core/events/EventTarget.h"
#include "modules/mediastream/SourceInfo.h"
#include "platform/mediastream/MediaStreamDescriptor.h"
#include "platform/mediastream/MediaStreamSource.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/RefPtr.h"
#include "wtf/Vector.h"
#include "wtf/text/WTFString.h"
namespace WebCore {
class AudioSourceProvider;
class ExceptionState;
class MediaStreamComponent;
class MediaStreamTrackSourcesCallback;
class MediaStreamTrack FINAL : public RefCounted<MediaStreamTrack>, public ScriptWrappable, public ActiveDOMObject, public EventTargetWithInlineData, public MediaStreamSource::Observer {
REFCOUNTED_EVENT_TARGET(MediaStreamTrack);
public:
class Observer {
public:
virtual ~Observer() { }
virtual void trackEnded() = 0;
};
static PassRefPtr<MediaStreamTrack> create(ExecutionContext*, MediaStreamComponent*);
virtual ~MediaStreamTrack();
String kind() const;
String id() const;
String label() const;
bool enabled() const;
void setEnabled(bool);
String readyState() const;
static void getSources(ExecutionContext*, PassOwnPtr<MediaStreamTrackSourcesCallback>, ExceptionState&);
void stopTrack(ExceptionState&);
PassRefPtr<MediaStreamTrack> clone(ExecutionContext*);
DEFINE_ATTRIBUTE_EVENT_LISTENER(mute);
DEFINE_ATTRIBUTE_EVENT_LISTENER(unmute);
DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
MediaStreamComponent* component();
bool ended() const;
void addObserver(Observer*);
void removeObserver(Observer*);
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ExecutionContext* executionContext() const OVERRIDE;
virtual void stop() OVERRIDE;
PassOwnPtr<AudioSourceProvider> createWebAudioSource();
private:
MediaStreamTrack(ExecutionContext*, MediaStreamComponent*);
MediaStreamSource::ReadyState m_readyState;
virtual void sourceChangedState() OVERRIDE;
void propagateTrackEnded();
Vector<Observer*> m_observers;
bool m_isIteratingObservers;
bool m_stopped;
RefPtr<MediaStreamComponent> m_component;
};
typedef Vector<RefPtr<MediaStreamTrack> > MediaStreamTrackVector;
}
#endif