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