void AudioBuffer::CopyToChannel(JSContext* aJSContext, const Float32Array& aSource, uint32_t aChannelNumber, uint32_t aStartInChannel, ErrorResult& aRv) { uint32_t length = aSource.Length(); if (aChannelNumber >= NumberOfChannels() || aStartInChannel + length >= mLength) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } if (!mSharedChannels && JS_GetTypedArrayLength(mJSChannels[aChannelNumber]) != mLength) { // The array was probably neutered aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } if (!RestoreJSChannelData(aJSContext)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } PodCopy(JS_GetFloat32ArrayData(mJSChannels[aChannelNumber]) + aStartInChannel, aSource.Data(), length); }
void AudioBuffer::CopyToChannel(JSContext* aJSContext, const Float32Array& aSource, uint32_t aChannelNumber, uint32_t aStartInChannel, ErrorResult& aRv) { aSource.ComputeLengthAndData(); uint32_t length = aSource.Length(); CheckedInt<uint32_t> end = aStartInChannel; end += length; if (aChannelNumber >= NumberOfChannels() || !end.isValid() || end.value() > mLength) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } if (!mSharedChannels && JS_GetTypedArrayLength(mJSChannels[aChannelNumber]) != mLength) { // The array was probably neutered aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } if (!RestoreJSChannelData(aJSContext)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } PodMove(JS_GetFloat32ArrayData(mJSChannels[aChannelNumber]) + aStartInChannel, aSource.Data(), length); }
JSObject* AudioBuffer::GetChannelData(JSContext* aJSContext, uint32_t aChannel, ErrorResult& aRv) { if (aChannel >= NumberOfChannels()) { aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); return nullptr; } if (!RestoreJSChannelData(aJSContext)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } return mJSChannels[aChannel]; }
void AudioBuffer::GetChannelData(JSContext* aJSContext, uint32_t aChannel, JS::MutableHandle<JSObject*> aRetval, ErrorResult& aRv) { if (aChannel >= NumberOfChannels()) { aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); return; } if (!RestoreJSChannelData(aJSContext)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } aRetval.set(mJSChannels[aChannel]); }
bool AudioBuffer::SetChannelDataFromArrayBufferContents(JSContext* aJSContext, uint32_t aChannel, void* aContents) { if (!RestoreJSChannelData(aJSContext)) { return false; } MOZ_ASSERT(aChannel < NumberOfChannels()); JS::RootedObject arrayBuffer(aJSContext, JS_NewArrayBufferWithContents(aJSContext, aContents)); if (!arrayBuffer) { return false; } mJSChannels[aChannel] = JS_NewFloat32ArrayWithBuffer(aJSContext, arrayBuffer, 0, -1); if (!mJSChannels[aChannel]) { return false; } MOZ_ASSERT(mLength == JS_GetTypedArrayLength(mJSChannels[aChannel])); return true; }
void AudioBuffer::CopyToChannel(JSContext* aJSContext, const Float32Array& aSource, uint32_t aChannelNumber, uint32_t aStartInChannel, ErrorResult& aRv) { aSource.ComputeLengthAndData(); uint32_t length = aSource.Length(); CheckedInt<uint32_t> end = aStartInChannel; end += length; if (aChannelNumber >= NumberOfChannels() || !end.isValid() || end.value() > mLength) { aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } if (!RestoreJSChannelData(aJSContext)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } JS::AutoCheckCannotGC nogc; JSObject* channelArray = mJSChannels[aChannelNumber]; if (JS_GetTypedArrayLength(channelArray) != mLength) { // The array's buffer was detached. aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return; } bool isShared = false; float* channelData = JS_GetFloat32ArrayData(channelArray, &isShared, nogc); // The channelData arrays should all have originated in // RestoreJSChannelData, where they are created unshared. MOZ_ASSERT(!isShared); PodMove(channelData + aStartInChannel, aSource.Data(), length); }