summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/webaudio/AudioBuffer.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/Modules/webaudio/AudioBuffer.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/Modules/webaudio/AudioBuffer.cpp')
-rw-r--r--Source/WebCore/Modules/webaudio/AudioBuffer.cpp93
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;
}