1/*
2 * Copyright (C) 2011 Google Inc.  All rights reserved.
3 * Copyright (C) 2011, 2012, 2013 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
34#if ENABLE(VIDEO_TRACK)
35
36#include "AudioTrack.h"
37
38#include "AudioTrackList.h"
39#include "Event.h"
40#include "HTMLMediaElement.h"
41
42namespace WebCore {
43
44const AtomicString& AudioTrack::alternativeKeyword()
45{
46    DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, alternative, ("alternative", AtomicString::ConstructFromLiteral));
47    return alternative;
48}
49
50const AtomicString& AudioTrack::descriptionKeyword()
51{
52    DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, description, ("description", AtomicString::ConstructFromLiteral));
53    return description;
54}
55
56const AtomicString& AudioTrack::mainKeyword()
57{
58    DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, main, ("main", AtomicString::ConstructFromLiteral));
59    return main;
60}
61
62const AtomicString& AudioTrack::mainDescKeyword()
63{
64    DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, mainDesc, ("main-desc", AtomicString::ConstructFromLiteral));
65    return mainDesc;
66}
67
68const AtomicString& AudioTrack::translationKeyword()
69{
70    DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, translation, ("translation", AtomicString::ConstructFromLiteral));
71    return translation;
72}
73
74const AtomicString& AudioTrack::commentaryKeyword()
75{
76    DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, commentary, ("commentary", AtomicString::ConstructFromLiteral));
77    return commentary;
78}
79
80AudioTrack::AudioTrack(AudioTrackClient* client, PassRefPtr<AudioTrackPrivate> trackPrivate)
81    : TrackBase(TrackBase::AudioTrack, trackPrivate->id(), trackPrivate->label(), trackPrivate->language())
82    , m_enabled(trackPrivate->enabled())
83    , m_client(client)
84    , m_private(trackPrivate)
85{
86    m_private->setClient(this);
87    updateKindFromPrivate();
88}
89
90AudioTrack::~AudioTrack()
91{
92    m_private->setClient(0);
93}
94
95void AudioTrack::setPrivate(PassRefPtr<AudioTrackPrivate> trackPrivate)
96{
97    ASSERT(m_private);
98    ASSERT(trackPrivate);
99
100    if (m_private == trackPrivate)
101        return;
102
103    m_private->setClient(0);
104    m_private = trackPrivate;
105    m_private->setClient(this);
106
107    m_private->setEnabled(m_enabled);
108    updateKindFromPrivate();
109}
110
111bool AudioTrack::isValidKind(const AtomicString& value) const
112{
113    if (value == alternativeKeyword())
114        return true;
115    if (value == descriptionKeyword())
116        return true;
117    if (value == mainKeyword())
118        return true;
119    if (value == mainDescKeyword())
120        return true;
121    if (value == translationKeyword())
122        return true;
123    if (value == commentaryKeyword())
124        return true;
125
126    return false;
127}
128
129void AudioTrack::setEnabled(const bool enabled)
130{
131    if (m_enabled == enabled)
132        return;
133
134    m_enabled = enabled;
135    m_private->setEnabled(enabled);
136
137    if (m_client)
138        m_client->audioTrackEnabledChanged(this);
139}
140
141size_t AudioTrack::inbandTrackIndex()
142{
143    ASSERT(m_private);
144    return m_private->trackIndex();
145}
146
147void AudioTrack::enabledChanged(AudioTrackPrivate* trackPrivate, bool enabled)
148{
149    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
150    setEnabled(enabled);
151}
152
153void AudioTrack::idChanged(TrackPrivateBase* trackPrivate, const AtomicString& id)
154{
155    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
156    setId(id);
157}
158
159void AudioTrack::labelChanged(TrackPrivateBase* trackPrivate, const AtomicString& label)
160{
161    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
162    setLabel(label);
163}
164
165void AudioTrack::languageChanged(TrackPrivateBase* trackPrivate, const AtomicString& language)
166{
167    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
168    setLanguage(language);
169}
170
171void AudioTrack::willRemove(TrackPrivateBase* trackPrivate)
172{
173    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
174    mediaElement()->removeAudioTrack(this);
175}
176
177void AudioTrack::updateKindFromPrivate()
178{
179    switch (m_private->kind()) {
180    case AudioTrackPrivate::Alternative:
181        setKind(AudioTrack::alternativeKeyword());
182        break;
183    case AudioTrackPrivate::Description:
184        setKind(AudioTrack::descriptionKeyword());
185        break;
186    case AudioTrackPrivate::Main:
187        setKind(AudioTrack::mainKeyword());
188        break;
189    case AudioTrackPrivate::MainDesc:
190        setKind(AudioTrack::mainDescKeyword());
191        break;
192    case AudioTrackPrivate::Translation:
193        setKind(AudioTrack::translationKeyword());
194        break;
195    case AudioTrackPrivate::Commentary:
196        setKind(AudioTrack::commentaryKeyword());
197        break;
198    case AudioTrackPrivate::None:
199        setKind(emptyString());
200        break;
201    default:
202        ASSERT_NOT_REACHED();
203        break;
204    }
205}
206
207} // namespace WebCore
208
209#endif
210