gecko/content/media/webaudio/AudioBuffer.h
Karl Tomlinson 765941c8f9 b=991533 limit AudioBuffers from decodeAudioData to the same sample rates as createBuffer r=ehsan
The numberOfChannels array on AudioBuffer is now an infallible array, as this
is considerably smaller than infallible channel data array allocations in
AllocateAudioBlock and similar to channel data pointer array allocations in
AudioChunk.

--HG--
extra : transplant_source : C%29_%13%9C%9C%A1%E1%A3%E8%C9_%93%11%85lM%FC%7E%BC
2014-05-16 09:23:27 +12:00

123 lines
3.4 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef AudioBuffer_h_
#define AudioBuffer_h_
#include "nsWrapperCache.h"
#include "nsCycleCollectionParticipant.h"
#include "mozilla/Attributes.h"
#include "nsAutoPtr.h"
#include "nsTArray.h"
#include "AudioContext.h"
#include "js/TypeDecls.h"
#include "mozilla/MemoryReporting.h"
namespace mozilla {
class ErrorResult;
class ThreadSharedFloatArrayBufferList;
namespace dom {
class AudioContext;
/**
* An AudioBuffer keeps its data either in the mJSChannels objects, which
* are Float32Arrays, or in mSharedChannels if the mJSChannels objects have
* been neutered.
*/
class AudioBuffer MOZ_FINAL : public nsWrapperCache
{
public:
static already_AddRefed<AudioBuffer>
Create(AudioContext* aContext, uint32_t aNumberOfChannels,
uint32_t aLength, float aSampleRate,
JSContext* aJSContext, ErrorResult& aRv);
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AudioBuffer)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioBuffer)
AudioContext* GetParentObject() const
{
return mContext;
}
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
float SampleRate() const
{
return mSampleRate;
}
int32_t Length() const
{
return mLength;
}
double Duration() const
{
return mLength / static_cast<double> (mSampleRate);
}
uint32_t NumberOfChannels() const
{
return mJSChannels.Length();
}
/**
* If mSharedChannels is non-null, copies its contents to
* new Float32Arrays in mJSChannels. Returns a Float32Array.
*/
JSObject* GetChannelData(JSContext* aJSContext, uint32_t aChannel,
ErrorResult& aRv);
void CopyFromChannel(const Float32Array& aDestination, uint32_t aChannelNumber,
uint32_t aStartInChannel, ErrorResult& aRv);
void CopyToChannel(JSContext* aJSContext, const Float32Array& aSource,
uint32_t aChannelNumber, uint32_t aStartInChannel,
ErrorResult& aRv);
/**
* Returns a ThreadSharedFloatArrayBufferList containing the sample data.
* Can return null if there is no data.
*/
ThreadSharedFloatArrayBufferList* GetThreadSharedChannelsForRate(JSContext* aContext);
// This replaces the contents of the JS array for the given channel.
// This function needs to be called on an AudioBuffer which has not been
// handed off to the content yet, and right after the object has been
// initialized.
void SetRawChannelContents(uint32_t aChannel, float* aContents);
protected:
AudioBuffer(AudioContext* aContext, uint32_t aNumberOfChannels,
uint32_t aLength, float aSampleRate);
~AudioBuffer();
bool RestoreJSChannelData(JSContext* aJSContext);
void ClearJSChannels();
nsRefPtr<AudioContext> mContext;
// Float32Arrays
nsAutoTArray<JS::Heap<JSObject*>, 2> mJSChannels;
// mSharedChannels aggregates the data from mJSChannels. This is non-null
// if and only if the mJSChannels are neutered.
nsRefPtr<ThreadSharedFloatArrayBufferList> mSharedChannels;
uint32_t mLength;
float mSampleRate;
};
}
}
#endif