1/*
2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2011 Ericsson AB. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1.  Redistributions of source code must retain the above copyright
9 *     notice, this list of conditions and the following disclaimer.
10 * 2.  Redistributions in binary form must reproduce the above copyright
11 *     notice, this list of conditions and the following disclaimer in the
12 *     documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "MediaStreamTrack.h"
28
29#if ENABLE(MEDIA_STREAM)
30
31#include "Event.h"
32#include "MediaStreamCenter.h"
33#include "MediaStreamComponent.h"
34
35namespace WebCore {
36
37PassRefPtr<MediaStreamTrack> MediaStreamTrack::create(ScriptExecutionContext* context, MediaStreamComponent* component)
38{
39    RefPtr<MediaStreamTrack> track = adoptRef(new MediaStreamTrack(context, component));
40    track->suspendIfNeeded();
41    return track.release();
42}
43
44MediaStreamTrack::MediaStreamTrack(ScriptExecutionContext* context, MediaStreamComponent* component)
45    : ActiveDOMObject(context)
46    , m_stopped(false)
47    , m_component(component)
48{
49    m_component->source()->addObserver(this);
50}
51
52MediaStreamTrack::~MediaStreamTrack()
53{
54    m_component->source()->removeObserver(this);
55}
56
57String MediaStreamTrack::kind() const
58{
59    DEFINE_STATIC_LOCAL(String, audioKind, (ASCIILiteral("audio")));
60    DEFINE_STATIC_LOCAL(String, videoKind, (ASCIILiteral("video")));
61
62    switch (m_component->source()->type()) {
63    case MediaStreamSource::TypeAudio:
64        return audioKind;
65    case MediaStreamSource::TypeVideo:
66        return videoKind;
67    }
68
69    ASSERT_NOT_REACHED();
70    return audioKind;
71}
72
73String MediaStreamTrack::id() const
74{
75    return m_component->id();
76}
77
78String MediaStreamTrack::label() const
79{
80    return m_component->source()->name();
81}
82
83bool MediaStreamTrack::enabled() const
84{
85    return m_component->enabled();
86}
87
88void MediaStreamTrack::setEnabled(bool enabled)
89{
90    if (m_stopped || enabled == m_component->enabled())
91        return;
92
93    m_component->setEnabled(enabled);
94
95    if (m_component->stream()->ended())
96        return;
97
98    MediaStreamCenter::instance().didSetMediaStreamTrackEnabled(m_component->stream(), m_component.get());
99}
100
101String MediaStreamTrack::readyState() const
102{
103    if (m_stopped)
104        return ASCIILiteral("ended");
105
106    switch (m_component->source()->readyState()) {
107    case MediaStreamSource::ReadyStateLive:
108        return ASCIILiteral("live");
109    case MediaStreamSource::ReadyStateMuted:
110        return ASCIILiteral("muted");
111    case MediaStreamSource::ReadyStateEnded:
112        return ASCIILiteral("ended");
113    }
114
115    ASSERT_NOT_REACHED();
116    return String();
117}
118
119bool MediaStreamTrack::ended() const
120{
121    return m_stopped || (m_component->source()->readyState() == MediaStreamSource::ReadyStateEnded);
122}
123
124void MediaStreamTrack::sourceChangedState()
125{
126    if (m_stopped)
127        return;
128
129    switch (m_component->source()->readyState()) {
130    case MediaStreamSource::ReadyStateLive:
131        dispatchEvent(Event::create(eventNames().unmuteEvent, false, false));
132        break;
133    case MediaStreamSource::ReadyStateMuted:
134        dispatchEvent(Event::create(eventNames().muteEvent, false, false));
135        break;
136    case MediaStreamSource::ReadyStateEnded:
137        dispatchEvent(Event::create(eventNames().endedEvent, false, false));
138        break;
139    }
140}
141
142MediaStreamComponent* MediaStreamTrack::component()
143{
144    return m_component.get();
145}
146
147void MediaStreamTrack::stop()
148{
149    m_stopped = true;
150}
151
152const AtomicString& MediaStreamTrack::interfaceName() const
153{
154    return eventNames().interfaceForMediaStreamTrack;
155}
156
157ScriptExecutionContext* MediaStreamTrack::scriptExecutionContext() const
158{
159    return ActiveDOMObject::scriptExecutionContext();
160}
161
162EventTargetData* MediaStreamTrack::eventTargetData()
163{
164    return &m_eventTargetData;
165}
166
167EventTargetData* MediaStreamTrack::ensureEventTargetData()
168{
169    return &m_eventTargetData;
170}
171
172} // namespace WebCore
173
174#endif // ENABLE(MEDIA_STREAM)
175