1/* 2 * Copyright (C) 2010, Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24 25#include "config.h" 26#include "public/platform/WebAudioBus.h" 27 28#if ENABLE(WEB_AUDIO) 29#include "platform/audio/AudioBus.h" 30#else 31#include "wtf/ThreadSafeRefCounted.h" 32 33namespace blink { 34class AudioBus : public ThreadSafeRefCounted<AudioBus> { 35}; 36} // namespace blink 37#endif 38 39#include "wtf/PassRefPtr.h" 40#include "wtf/RefPtr.h" 41 42namespace blink { 43 44class WebAudioBusPrivate : public AudioBus { 45}; 46 47void WebAudioBus::initialize(unsigned numberOfChannels, size_t length, double sampleRate) 48{ 49#if ENABLE(WEB_AUDIO) 50 RefPtr<AudioBus> audioBus = AudioBus::create(numberOfChannels, length); 51 audioBus->setSampleRate(sampleRate); 52 53 if (m_private) 54 (static_cast<AudioBus*>(m_private))->deref(); 55 56 audioBus->ref(); 57 m_private = static_cast<WebAudioBusPrivate*>(audioBus.get()); 58#else 59 ASSERT_NOT_REACHED(); 60#endif 61} 62 63void WebAudioBus::resizeSmaller(size_t newLength) 64{ 65#if ENABLE(WEB_AUDIO) 66 ASSERT(m_private); 67 if (m_private) { 68 ASSERT(newLength <= length()); 69 m_private->resizeSmaller(newLength); 70 } 71#else 72 ASSERT_NOT_REACHED(); 73#endif 74} 75 76void WebAudioBus::reset() 77{ 78#if ENABLE(WEB_AUDIO) 79 if (m_private) { 80 (static_cast<AudioBus*>(m_private))->deref(); 81 m_private = 0; 82 } 83#else 84 ASSERT_NOT_REACHED(); 85#endif 86} 87 88unsigned WebAudioBus::numberOfChannels() const 89{ 90#if ENABLE(WEB_AUDIO) 91 if (!m_private) 92 return 0; 93 return m_private->numberOfChannels(); 94#else 95 ASSERT_NOT_REACHED(); 96 return 0; 97#endif 98} 99 100size_t WebAudioBus::length() const 101{ 102#if ENABLE(WEB_AUDIO) 103 if (!m_private) 104 return 0; 105 return m_private->length(); 106#else 107 ASSERT_NOT_REACHED(); 108 return 0; 109#endif 110} 111 112double WebAudioBus::sampleRate() const 113{ 114#if ENABLE(WEB_AUDIO) 115 if (!m_private) 116 return 0; 117 return m_private->sampleRate(); 118#else 119 ASSERT_NOT_REACHED(); 120 return 0; 121#endif 122} 123 124float* WebAudioBus::channelData(unsigned channelIndex) 125{ 126#if ENABLE(WEB_AUDIO) 127 if (!m_private) 128 return 0; 129 ASSERT(channelIndex < numberOfChannels()); 130 return m_private->channel(channelIndex)->mutableData(); 131#else 132 ASSERT_NOT_REACHED(); 133 return 0; 134#endif 135} 136 137PassRefPtr<AudioBus> WebAudioBus::release() 138{ 139#if ENABLE(WEB_AUDIO) 140 RefPtr<AudioBus> audioBus(adoptRef(static_cast<AudioBus*>(m_private))); 141 m_private = 0; 142 return audioBus; 143#else 144 ASSERT_NOT_REACHED(); 145 return nullptr; 146#endif 147} 148 149} // namespace blink 150