diff options
Diffstat (limited to 'Source/WebCore/Modules/webaudio/AudioBuffer.cpp')
-rw-r--r-- | Source/WebCore/Modules/webaudio/AudioBuffer.cpp | 93 |
1 files changed, 51 insertions, 42 deletions
diff --git a/Source/WebCore/Modules/webaudio/AudioBuffer.cpp b/Source/WebCore/Modules/webaudio/AudioBuffer.cpp index 609ab567e..d14e6694c 100644 --- a/Source/WebCore/Modules/webaudio/AudioBuffer.cpp +++ b/Source/WebCore/Modules/webaudio/AudioBuffer.cpp @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * 3. Neither the name of Apple Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * @@ -32,101 +32,110 @@ #include "AudioBuffer.h" -#include "AudioBus.h" #include "AudioContext.h" #include "AudioFileReader.h" -#include "ExceptionCode.h" -#include "ExceptionCodePlaceholder.h" - -#include <runtime/Operations.h> +#include <runtime/JSCInlines.h> #include <runtime/TypedArrayInlines.h> namespace WebCore { -PassRefPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) +RefPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) { if (sampleRate < 22050 || sampleRate > 96000 || numberOfChannels > AudioContext::maxNumberOfChannels() || !numberOfFrames) return nullptr; - - return adoptRef(new AudioBuffer(numberOfChannels, numberOfFrames, sampleRate)); + + auto buffer = adoptRef(*new AudioBuffer(numberOfChannels, numberOfFrames, sampleRate)); + if (!buffer->m_length) + return nullptr; + + return WTFMove(buffer); } -PassRefPtr<AudioBuffer> AudioBuffer::createFromAudioFileData(const void* data, size_t dataSize, bool mixToMono, float sampleRate) +RefPtr<AudioBuffer> AudioBuffer::createFromAudioFileData(const void* data, size_t dataSize, bool mixToMono, float sampleRate) { RefPtr<AudioBus> bus = createBusFromInMemoryAudioFile(data, dataSize, mixToMono, sampleRate); - if (bus.get()) - return adoptRef(new AudioBuffer(bus.get())); - - return nullptr; + if (!bus) + return nullptr; + return adoptRef(*new AudioBuffer(*bus)); } AudioBuffer::AudioBuffer(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) - : m_gain(1.0) - , m_sampleRate(sampleRate) + : m_sampleRate(sampleRate) , m_length(numberOfFrames) { m_channels.reserveCapacity(numberOfChannels); for (unsigned i = 0; i < numberOfChannels; ++i) { - RefPtr<Float32Array> channelDataArray = Float32Array::create(m_length); + auto channelDataArray = Float32Array::create(m_length); + if (!channelDataArray) { + invalidate(); + break; + } + channelDataArray->setNeuterable(false); - m_channels.append(channelDataArray); + m_channels.append(WTFMove(channelDataArray)); } } -AudioBuffer::AudioBuffer(AudioBus* bus) - : m_gain(1.0) - , m_sampleRate(bus->sampleRate()) - , m_length(bus->length()) +AudioBuffer::AudioBuffer(AudioBus& bus) + : m_sampleRate(bus.sampleRate()) + , m_length(bus.length()) { // Copy audio data from the bus to the Float32Arrays we manage. - unsigned numberOfChannels = bus->numberOfChannels(); + unsigned numberOfChannels = bus.numberOfChannels(); m_channels.reserveCapacity(numberOfChannels); for (unsigned i = 0; i < numberOfChannels; ++i) { - RefPtr<Float32Array> channelDataArray = Float32Array::create(m_length); + auto channelDataArray = Float32Array::create(m_length); + if (!channelDataArray) { + invalidate(); + break; + } + channelDataArray->setNeuterable(false); - channelDataArray->setRange(bus->channel(i)->data(), m_length, 0); - m_channels.append(channelDataArray); + channelDataArray->setRange(bus.channel(i)->data(), m_length, 0); + m_channels.append(WTFMove(channelDataArray)); } } +void AudioBuffer::invalidate() +{ + releaseMemory(); + m_length = 0; +} + void AudioBuffer::releaseMemory() { m_channels.clear(); } -PassRefPtr<Float32Array> AudioBuffer::getChannelData(unsigned channelIndex, ExceptionCode& ec) +ExceptionOr<Ref<Float32Array>> AudioBuffer::getChannelData(unsigned channelIndex) { - if (channelIndex >= m_channels.size()) { - ec = SYNTAX_ERR; - return nullptr; - } - - Float32Array* channelData = m_channels[channelIndex].get(); - return Float32Array::create(channelData->buffer(), channelData->byteOffset(), channelData->length()); + if (channelIndex >= m_channels.size()) + return Exception { SYNTAX_ERR }; + auto& channelData = *m_channels[channelIndex]; + auto array = Float32Array::create(channelData.unsharedBuffer(), channelData.byteOffset(), channelData.length()); + RELEASE_ASSERT(array); + return array.releaseNonNull(); } -Float32Array* AudioBuffer::getChannelData(unsigned channelIndex) +Float32Array* AudioBuffer::channelData(unsigned channelIndex) { if (channelIndex >= m_channels.size()) return nullptr; - return m_channels[channelIndex].get(); } void AudioBuffer::zero() { - for (unsigned i = 0; i < m_channels.size(); ++i) { - if (getChannelData(i)) - getChannelData(i)->zeroRange(0, length()); - } + for (auto& channel : m_channels) + channel->zeroRange(0, length()); } size_t AudioBuffer::memoryCost() const { size_t cost = 0; - for (unsigned i = 0; i < m_channels.size() ; ++i) - cost += m_channels[i]->byteLength(); + for (auto& channel : m_channels) + cost += channel->byteLength(); return cost; } |