Bug 1322883 - AudioNode constructors - part 15 - AudioBuffer, r=padenot

This commit is contained in:
Andrea Marchesini 2016-12-15 19:24:42 +01:00
parent a5807e46ae
commit be2438d32b
5 changed files with 53 additions and 9 deletions

View File

@ -180,6 +180,24 @@ AudioBuffer::~AudioBuffer()
mozilla::DropJSObjects(this);
}
/* static */ already_AddRefed<AudioBuffer>
AudioBuffer::Constructor(const GlobalObject& aGlobal,
AudioContext& aAudioContext,
const AudioBufferOptions& aOptions,
ErrorResult& aRv)
{
if (!aOptions.mNumberOfChannels) {
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return nullptr;
}
float sampleRate = aOptions.mSampleRate.WasPassed()
? aOptions.mSampleRate.Value()
: aAudioContext.SampleRate();
return Create(&aAudioContext, aOptions.mNumberOfChannels, aOptions.mLength,
sampleRate, aRv);
}
void
AudioBuffer::ClearJSChannels()
{

View File

@ -24,6 +24,7 @@ class ThreadSharedFloatArrayBufferList;
namespace dom {
struct AudioBufferOptions;
class AudioContext;
/**
@ -56,6 +57,10 @@ public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AudioBuffer)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioBuffer)
static already_AddRefed<AudioBuffer>
Constructor(const GlobalObject& aGlobal, AudioContext& aAudioContext,
const AudioBufferOptions& aOptions, ErrorResult& aRv);
nsPIDOMWindowInner* GetParentObject() const
{
nsCOMPtr<nsPIDOMWindowInner> parentObject = do_QueryReferent(mOwnerWindow);
@ -134,4 +139,3 @@ protected:
} // namespace mozilla
#endif

View File

@ -70,8 +70,11 @@ function sine(t) {
// A couple mono and stereo buffers: the StereoPannerNode equation is different
// if the input is mono or stereo
var stereoBuffer = context.createBuffer(2, BUF_SIZE, context.sampleRate);
var monoBuffer = context.createBuffer(1, BUF_SIZE, context.sampleRate);
var stereoBuffer = new AudioBuffer(context, { numberOfChannels: 2,
length: BUF_SIZE });
var monoBuffer = new AudioBuffer(context, { numberOfChannels: 1,
length: BUF_SIZE,
sampleRate: context.sampleRate });
for (var i = 0; i < BUF_SIZE; ++i) {
monoBuffer.getChannelData(0)[i] =
stereoBuffer.getChannelData(0)[i] =
@ -81,7 +84,9 @@ for (var i = 0; i < BUF_SIZE; ++i) {
// Expected test vectors
function expectedBufferNoop(gain) {
gain = gain || 1.0;
var expectedBuffer = context.createBuffer(2, BUF_SIZE, SR);
var expectedBuffer = new AudioBuffer(context, { numberOfChannels: 2,
length: BUF_SIZE,
sampleRate: SR });
for (var i = 0; i < BUF_SIZE; i++) {
expectedBuffer.getChannelData(0)[i] = gain * sine(i);
expectedBuffer.getChannelData(1)[i] = gain * sine(i);
@ -91,7 +96,9 @@ function expectedBufferNoop(gain) {
function expectedBufferForStereo(gain) {
gain = gain || 1.0;
var expectedBuffer = context.createBuffer(2, BUF_SIZE, SR);
var expectedBuffer = new AudioBuffer(context, { numberOfChannels: 2,
length: BUF_SIZE,
sampleRate: SR });
var gainPanning = gainForPanningStereoToStereo(PANNING);
gainPanning[0] *= gain;
gainPanning[1] *= gain;
@ -106,7 +113,9 @@ function expectedBufferForStereo(gain) {
function expectedBufferForMono(gain) {
gain = gain || 1.0;
var expectedBuffer = context.createBuffer(2, BUF_SIZE, SR);
var expectedBuffer = new AudioBuffer(context, { numberOfChannels: 2,
length: BUF_SIZE,
sampleRate: SR });
var gainPanning = gainForPanningMonoToStereo(PANNING);
gainPanning[0] *= gain;
gainPanning[1] *= gain;

View File

@ -10,7 +10,14 @@
* liability, trademark and document use rules apply.
*/
[Pref="dom.webaudio.enabled"]
dictionary AudioBufferOptions {
unsigned long numberOfChannels = 1;
required unsigned long length;
float sampleRate;
};
[Pref="dom.webaudio.enabled",
Constructor(AudioContext context, AudioBufferOptions options)]
interface AudioBuffer {
readonly attribute float sampleRate;
@ -29,4 +36,3 @@ interface AudioBuffer {
[Throws]
void copyToChannel(Float32Array source, long channelNumber, optional unsigned long startInChannel = 0);
};

View File

@ -73,7 +73,14 @@ interface AudioContext : EventTarget {
};</pre>
<pre id="audio-buffer-idl">interface AudioBuffer {
<pre id="audio-buffer-idl">dictionary AudioBufferOptions {
unsigned long numberOfChannels = 1;
required unsigned long length;
float sampleRate;
};
[Constructor(AudioContext context, AudioBufferOptions options)]
interface AudioBuffer {
readonly attribute float sampleRate;
readonly attribute long length;