1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * are met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     documentation and/or other materials provided with the distribution.
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "config.h"
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebMediaStreamTrack.h"
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/mediastream/MediaStreamComponent.h"
3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/mediastream/MediaStreamSource.h"
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "public/platform/WebAudioSourceProvider.h"
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebMediaStream.h"
335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebMediaStreamSource.h"
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h"
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)namespace {
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class ExtraDataContainer : public MediaStreamComponent::ExtraData {
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)public:
421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    explicit ExtraDataContainer(PassOwnPtr<WebMediaStreamTrack::ExtraData> extraData) : m_extraData(extraData) { }
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    WebMediaStreamTrack::ExtraData* extraData() { return m_extraData.get(); }
451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)private:
471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    OwnPtr<WebMediaStreamTrack::ExtraData> m_extraData;
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)};
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} // namespace
511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebMediaStreamTrack WebMediaStreamTrack::ExtraData::owner()
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(m_owner);
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return WebMediaStreamTrack(m_owner);
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
58e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebMediaStreamTrack::ExtraData::setOwner(MediaStreamComponent* owner)
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(!m_owner);
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_owner = owner;
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
64e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebMediaStreamTrack::WebMediaStreamTrack(PassRefPtr<MediaStreamComponent> mediaStreamComponent)
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_private(mediaStreamComponent)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
69e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebMediaStreamTrack::WebMediaStreamTrack(MediaStreamComponent* mediaStreamComponent)
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_private(mediaStreamComponent)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
74e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebMediaStreamTrack& WebMediaStreamTrack::operator=(MediaStreamComponent* mediaStreamComponent)
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_private = mediaStreamComponent;
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return *this;
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebMediaStreamTrack::initialize(const WebMediaStreamSource& source)
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_private = MediaStreamComponent::create(source);
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebMediaStreamTrack::initialize(const WebString& id, const WebMediaStreamSource& source)
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_private = MediaStreamComponent::create(id, source);
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebMediaStreamTrack::reset()
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_private.reset();
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebMediaStreamTrack::operator PassRefPtr<MediaStreamComponent>() const
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_private.get();
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebMediaStreamTrack::operator MediaStreamComponent*() const
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_private.get();
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebMediaStreamTrack::isEnabled() const
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_private.isNull());
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_private->enabled();
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebString WebMediaStreamTrack::id() const
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_private.isNull());
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_private->id();
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebMediaStreamSource WebMediaStreamTrack::source() const
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_private.isNull());
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return WebMediaStreamSource(m_private->source());
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)WebMediaStreamTrack::ExtraData* WebMediaStreamTrack::extraData() const
1241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    MediaStreamComponent::ExtraData* data = m_private->extraData();
1261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!data)
1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return 0;
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return static_cast<ExtraDataContainer*>(data)->extraData();
1291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebMediaStreamTrack::setExtraData(ExtraData* extraData)
1321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(!m_private.isNull());
13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (extraData)
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        extraData->setOwner(m_private.get());
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_private->setExtraData(adoptPtr(new ExtraDataContainer(adoptPtr(extraData))));
1391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void WebMediaStreamTrack::setSourceProvider(WebAudioSourceProvider* provider)
1429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#if ENABLE(WEB_AUDIO)
1449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(!m_private.isNull());
1459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_private->setSourceProvider(provider);
1469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif // ENABLE(WEB_AUDIO)
1479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebMediaStreamTrack::assign(const WebMediaStreamTrack& other)
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_private = other.m_private;
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
155