15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebMediaStreamSource.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/audio/AudioBus.h" 3651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/mediastream/MediaStreamSource.h" 375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebAudioDestinationConsumer.h" 38521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "public/platform/WebMediaConstraints.h" 395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h" 40521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/MainThread.h" 41521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/PassOwnPtr.h" 42521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/Vector.h" 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace { 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class ExtraDataContainer : public MediaStreamSource::ExtraData { 49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public: 5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ExtraDataContainer(PassOwnPtr<WebMediaStreamSource::ExtraData> extraData) : m_extraData(extraData) { } 51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebMediaStreamSource::ExtraData* extraData() { return m_extraData.get(); } 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) OwnPtr<WebMediaStreamSource::ExtraData> m_extraData; 56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} // namespace 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebMediaStreamSource WebMediaStreamSource::ExtraData::owner() 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(m_owner); 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return WebMediaStreamSource(m_owner); 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 66e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void WebMediaStreamSource::ExtraData::setOwner(MediaStreamSource* owner) 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(!m_owner); 6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_owner = owner; 7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaStreamSource::WebMediaStreamSource(const PassRefPtr<MediaStreamSource>& mediaStreamSource) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_private(mediaStreamSource) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebMediaStreamSource& WebMediaStreamSource::operator=(MediaStreamSource* mediaStreamSource) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_private = mediaStreamSource; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return *this; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaStreamSource::assign(const WebMediaStreamSource& other) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_private = other.m_private; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaStreamSource::reset() 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_private.reset(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaStreamSource::operator PassRefPtr<MediaStreamSource>() const 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_private.get(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaStreamSource::operator MediaStreamSource*() const 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_private.get(); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaStreamSource::initialize(const WebString& id, Type type, const WebString& name) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_private = MediaStreamSource::create(id, static_cast<MediaStreamSource::Type>(type), name); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebMediaStreamSource::id() const 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_private.isNull()); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_private.get()->id(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaStreamSource::Type WebMediaStreamSource::type() const 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_private.isNull()); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<Type>(m_private.get()->type()); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebMediaStreamSource::name() const 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_private.isNull()); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_private.get()->name(); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaStreamSource::setReadyState(ReadyState state) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_private.isNull()); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_private->setReadyState(static_cast<MediaStreamSource::ReadyState>(state)); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaStreamSource::ReadyState WebMediaStreamSource::readyState() const 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_private.isNull()); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<ReadyState>(m_private->readyState()); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebMediaStreamSource::ExtraData* WebMediaStreamSource::extraData() const 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_private.isNull()); 14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) MediaStreamSource::ExtraData* data = m_private->extraData(); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!data) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return static_cast<ExtraDataContainer*>(data)->extraData(); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebMediaStreamSource::setExtraData(ExtraData* extraData) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_private.isNull()); 15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 15153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (extraData) 15253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) extraData->setOwner(m_private.get()); 15353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_private->setExtraData(adoptPtr(new ExtraDataContainer(adoptPtr(extraData)))); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 157521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)WebMediaConstraints WebMediaStreamSource::constraints() 158521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 159521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) ASSERT(!m_private.isNull()); 160521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return m_private->constraints(); 161521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 162521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebMediaStreamSource::requiresAudioConsumer() const 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_private.isNull()); 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_private->requiresAudioConsumer(); 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass ConsumerWrapper FINAL : public AudioDestinationConsumer { 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public: 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci static ConsumerWrapper* create(WebAudioDestinationConsumer* consumer) 172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return new ConsumerWrapper(consumer); 174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void setFormat(size_t numberOfChannels, float sampleRate) OVERRIDE; 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void consumeAudio(AudioBus*, size_t numberOfFrames) OVERRIDE; 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebAudioDestinationConsumer* consumer() { return m_consumer; } 180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit ConsumerWrapper(WebAudioDestinationConsumer* consumer) : m_consumer(consumer) { } 183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // m_consumer is not owned by this class. 185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) WebAudioDestinationConsumer* m_consumer; 186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ConsumerWrapper::setFormat(size_t numberOfChannels, float sampleRate) 189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_consumer->setFormat(numberOfChannels, sampleRate); 191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ConsumerWrapper::consumeAudio(AudioBus* bus, size_t numberOfFrames) 194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!bus) 196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Wrap AudioBus. 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t numberOfChannels = bus->numberOfChannels(); 200e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebVector<const float*> busVector(numberOfChannels); 201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t i = 0; i < numberOfChannels; ++i) 202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) busVector[i] = bus->channel(i)->data(); 203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_consumer->consumeAudio(busVector, numberOfFrames); 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void WebMediaStreamSource::addAudioConsumer(WebAudioDestinationConsumer* consumer) 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isMainThread()); 210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_private.isNull() && consumer); 211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_private->addAudioConsumer(ConsumerWrapper::create(consumer)); 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool WebMediaStreamSource::removeAudioConsumer(WebAudioDestinationConsumer* consumer) 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(isMainThread()); 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_private.isNull() && consumer); 219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const HeapHashSet<Member<AudioDestinationConsumer> >& consumers = m_private->audioConsumers(); 2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (HeapHashSet<Member<AudioDestinationConsumer> >::const_iterator it = consumers.begin(); it != consumers.end(); ++it) { 222d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ConsumerWrapper* wrapper = static_cast<ConsumerWrapper*>(it->get()); 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (wrapper->consumer() == consumer) { 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_private->removeAudioConsumer(wrapper); 225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 232