1/*
2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2011-2017 Apple Inc. 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 are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "config.h"
33#include "AudioTrack.h"
34
35#if ENABLE(VIDEO_TRACK)
36
37#include "HTMLMediaElement.h"
38#include <wtf/NeverDestroyed.h>
39
40namespace WebCore {
41
42const AtomicString& AudioTrack::alternativeKeyword()
43{
44 static NeverDestroyed<AtomicString> alternative("alternative", AtomicString::ConstructFromLiteral);
45 return alternative;
46}
47
48const AtomicString& AudioTrack::descriptionKeyword()
49{
50 static NeverDestroyed<AtomicString> description("description", AtomicString::ConstructFromLiteral);
51 return description;
52}
53
54const AtomicString& AudioTrack::mainKeyword()
55{
56 static NeverDestroyed<AtomicString> main("main", AtomicString::ConstructFromLiteral);
57 return main;
58}
59
60const AtomicString& AudioTrack::mainDescKeyword()
61{
62 static NeverDestroyed<AtomicString> mainDesc("main-desc", AtomicString::ConstructFromLiteral);
63 return mainDesc;
64}
65
66const AtomicString& AudioTrack::translationKeyword()
67{
68 static NeverDestroyed<AtomicString> translation("translation", AtomicString::ConstructFromLiteral);
69 return translation;
70}
71
72const AtomicString& AudioTrack::commentaryKeyword()
73{
74 static NeverDestroyed<AtomicString> commentary("commentary", AtomicString::ConstructFromLiteral);
75 return commentary;
76}
77
78AudioTrack::AudioTrack(AudioTrackClient& client, AudioTrackPrivate& trackPrivate)
79 : MediaTrackBase(MediaTrackBase::AudioTrack, trackPrivate.id(), trackPrivate.label(), trackPrivate.language())
80 , m_client(&client)
81 , m_private(trackPrivate)
82 , m_enabled(trackPrivate.enabled())
83{
84 m_private->setClient(this);
85#if !RELEASE_LOG_DISABLED
86 m_private->setLogger(logger(), logIdentifier());
87#endif
88 updateKindFromPrivate();
89}
90
91AudioTrack::~AudioTrack()
92{
93 m_private->setClient(nullptr);
94}
95
96void AudioTrack::setPrivate(AudioTrackPrivate& trackPrivate)
97{
98 if (m_private.ptr() == &trackPrivate)
99 return;
100
101 m_private->setClient(nullptr);
102 m_private = trackPrivate;
103 m_private->setEnabled(m_enabled);
104 m_private->setClient(this);
105#if !RELEASE_LOG_DISABLED
106 m_private->setLogger(logger(), logIdentifier());
107#endif
108
109 updateKindFromPrivate();
110}
111
112bool AudioTrack::isValidKind(const AtomicString& value) const
113{
114 return value == alternativeKeyword()
115 || value == commentaryKeyword()
116 || value == descriptionKeyword()
117 || value == mainKeyword()
118 || value == mainDescKeyword()
119 || value == translationKeyword();
120}
121
122void AudioTrack::setEnabled(bool enabled)
123{
124 if (m_enabled == enabled)
125 return;
126
127 m_private->setEnabled(enabled);
128}
129
130size_t AudioTrack::inbandTrackIndex() const
131{
132 return m_private->trackIndex();
133}
134
135void AudioTrack::enabledChanged(bool enabled)
136{
137 if (m_enabled == enabled)
138 return;
139
140 m_enabled = enabled;
141
142 if (m_client)
143 m_client->audioTrackEnabledChanged(*this);
144}
145
146void AudioTrack::idChanged(const AtomicString& id)
147{
148 setId(id);
149}
150
151void AudioTrack::labelChanged(const AtomicString& label)
152{
153 setLabel(label);
154}
155
156void AudioTrack::languageChanged(const AtomicString& language)
157{
158 setLanguage(language);
159}
160
161void AudioTrack::willRemove()
162{
163 auto element = makeRefPtr(mediaElement());
164 if (!element)
165 return;
166 element->removeAudioTrack(*this);
167}
168
169void AudioTrack::updateKindFromPrivate()
170{
171 switch (m_private->kind()) {
172 case AudioTrackPrivate::Alternative:
173 setKind(AudioTrack::alternativeKeyword());
174 break;
175 case AudioTrackPrivate::Description:
176 setKind(AudioTrack::descriptionKeyword());
177 break;
178 case AudioTrackPrivate::Main:
179 setKind(AudioTrack::mainKeyword());
180 break;
181 case AudioTrackPrivate::MainDesc:
182 setKind(AudioTrack::mainDescKeyword());
183 break;
184 case AudioTrackPrivate::Translation:
185 setKind(AudioTrack::translationKeyword());
186 break;
187 case AudioTrackPrivate::Commentary:
188 setKind(AudioTrack::commentaryKeyword());
189 break;
190 case AudioTrackPrivate::None:
191 setKind(emptyString());
192 break;
193 default:
194 ASSERT_NOT_REACHED();
195 break;
196 }
197}
198
199void AudioTrack::setMediaElement(HTMLMediaElement* element)
200{
201 TrackBase::setMediaElement(element);
202#if !RELEASE_LOG_DISABLED
203 m_private->setLogger(logger(), logIdentifier());
204#endif
205}
206
207} // namespace WebCore
208
209#endif
210