зеркало из https://github.com/mozilla/gecko-dev.git
Bug 858211 - Use more webidl features for HTMLAudioElement; r=bz
This commit is contained in:
Родитель
0e3a1e4ca5
Коммит
c4090d9585
|
@ -7,8 +7,8 @@
|
|||
#define mozilla_dom_HTMLAudioElement_h
|
||||
|
||||
#include "nsIDOMHTMLAudioElement.h"
|
||||
#include "nsIJSNativeInitializer.h"
|
||||
#include "mozilla/dom/HTMLMediaElement.h"
|
||||
#include "mozilla/dom/TypedArray.h"
|
||||
|
||||
typedef uint16_t nsMediaNetworkState;
|
||||
typedef uint16_t nsMediaReadyState;
|
||||
|
@ -39,9 +39,6 @@ public:
|
|||
using HTMLMediaElement::GetPaused;
|
||||
NS_FORWARD_NSIDOMHTMLMEDIAELEMENT(HTMLMediaElement::)
|
||||
|
||||
// nsIDOMHTMLAudioElement
|
||||
NS_DECL_NSIDOMHTMLAUDIOELEMENT
|
||||
|
||||
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
|
||||
virtual nsresult SetAcceptHeader(nsIHttpChannel* aChannel);
|
||||
|
||||
|
@ -57,7 +54,16 @@ public:
|
|||
|
||||
void MozSetup(uint32_t aChannels, uint32_t aRate, ErrorResult& aRv);
|
||||
|
||||
uint32_t MozWriteAudio(JSContext* aCx, JS::Value aData, ErrorResult& aRv);
|
||||
uint32_t MozWriteAudio(const Float32Array& aData, ErrorResult& aRv)
|
||||
{
|
||||
return MozWriteAudio(aData.Data(), aData.Length(), aRv);
|
||||
}
|
||||
uint32_t MozWriteAudio(const Sequence<float>& aData, ErrorResult& aRv)
|
||||
{
|
||||
return MozWriteAudio(aData.Elements(), aData.Length(), aRv);
|
||||
}
|
||||
uint32_t MozWriteAudio(const float* aData, uint32_t aLength,
|
||||
ErrorResult& aRv);
|
||||
|
||||
uint64_t MozCurrentSampleOffset(ErrorResult& aRv);
|
||||
|
||||
|
|
|
@ -130,16 +130,9 @@ HTMLAudioElement::MozSetup(uint32_t aChannels, uint32_t aRate, ErrorResult& aRv)
|
|||
mAudioStream->SetVolume(mVolume);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLAudioElement::MozSetup(uint32_t aChannels, uint32_t aRate)
|
||||
{
|
||||
ErrorResult rv;
|
||||
MozSetup(aChannels, aRate, rv);
|
||||
return rv.ErrorCode();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
HTMLAudioElement::MozWriteAudio(JSContext* aCx, JS::Value aData, ErrorResult& aRv)
|
||||
HTMLAudioElement::MozWriteAudio(const float* aData, uint32_t aLength,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
if (!IsAudioAPIEnabled()) {
|
||||
aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
|
||||
|
@ -151,50 +144,22 @@ HTMLAudioElement::MozWriteAudio(JSContext* aCx, JS::Value aData, ErrorResult& aR
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!aData.isObject()) {
|
||||
aRv.Throw(NS_ERROR_DOM_TYPE_MISMATCH_ERR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
JSObject* darray = &aData.toObject();
|
||||
JS::AutoObjectRooter tvr(aCx);
|
||||
JSObject* tsrc = nullptr;
|
||||
|
||||
// Allow either Float32Array or plain JS Array
|
||||
if (JS_IsFloat32Array(darray)) {
|
||||
tsrc = darray;
|
||||
} else if (JS_IsArrayObject(aCx, darray)) {
|
||||
JSObject* nobj = JS_NewFloat32ArrayFromArray(aCx, darray);
|
||||
if (!nobj) {
|
||||
aRv.Throw(NS_ERROR_DOM_TYPE_MISMATCH_ERR);
|
||||
return 0;
|
||||
}
|
||||
tsrc = nobj;
|
||||
} else {
|
||||
aRv.Throw(NS_ERROR_DOM_TYPE_MISMATCH_ERR);
|
||||
return 0;
|
||||
}
|
||||
tvr.setObject(tsrc);
|
||||
|
||||
uint32_t dataLength = JS_GetTypedArrayLength(tsrc);
|
||||
|
||||
// Make sure that we are going to write the correct amount of data based
|
||||
// on number of channels.
|
||||
if (dataLength % mChannels != 0) {
|
||||
if (aLength % mChannels != 0) {
|
||||
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Don't write more than can be written without blocking.
|
||||
uint32_t writeLen = std::min(mAudioStream->Available(), dataLength / mChannels);
|
||||
uint32_t writeLen = std::min(mAudioStream->Available(), aLength / mChannels);
|
||||
|
||||
float* frames = JS_GetFloat32ArrayData(tsrc);
|
||||
// Convert the samples back to integers as we are using fixed point audio in
|
||||
// the AudioStream.
|
||||
// This could be optimized to avoid allocation and memcpy when
|
||||
// AudioDataValue is 'float', but it's not worth it for this deprecated API.
|
||||
nsAutoArrayPtr<AudioDataValue> audioData(new AudioDataValue[writeLen * mChannels]);
|
||||
ConvertAudioSamples(frames, audioData.get(), writeLen * mChannels);
|
||||
ConvertAudioSamples(aData, audioData.get(), writeLen * mChannels);
|
||||
aRv = mAudioStream->Write(audioData.get(), writeLen);
|
||||
if (aRv.Failed()) {
|
||||
return 0;
|
||||
|
@ -205,14 +170,6 @@ HTMLAudioElement::MozWriteAudio(JSContext* aCx, JS::Value aData, ErrorResult& aR
|
|||
return writeLen * mChannels;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLAudioElement::MozWriteAudio(const JS::Value& aData, JSContext* aCx, uint32_t* aRetVal)
|
||||
{
|
||||
ErrorResult rv;
|
||||
*aRetVal = MozWriteAudio(aCx, aData, rv);
|
||||
return rv.ErrorCode();
|
||||
}
|
||||
|
||||
uint64_t
|
||||
HTMLAudioElement::MozCurrentSampleOffset(ErrorResult& aRv)
|
||||
{
|
||||
|
@ -234,14 +191,6 @@ HTMLAudioElement::MozCurrentSampleOffset(ErrorResult& aRv)
|
|||
return position * mChannels;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
HTMLAudioElement::MozCurrentSampleOffset(uint64_t *aRetVal)
|
||||
{
|
||||
ErrorResult rv;
|
||||
*aRetVal = MozCurrentSampleOffset(rv);
|
||||
return rv.ErrorCode();
|
||||
}
|
||||
|
||||
nsresult HTMLAudioElement::SetAcceptHeader(nsIHttpChannel* aChannel)
|
||||
{
|
||||
nsAutoCString value(
|
||||
|
|
|
@ -6,10 +6,6 @@
|
|||
|
||||
#include "nsIDOMHTMLMediaElement.idl"
|
||||
|
||||
%{C++
|
||||
#include "jsapi.h"
|
||||
%}
|
||||
|
||||
/**
|
||||
* The nsIDOMHTMLAudioElement interface is the interface to a HTML
|
||||
* <audio> element.
|
||||
|
@ -20,17 +16,7 @@
|
|||
* @status UNDER_DEVELOPMENT
|
||||
*/
|
||||
|
||||
[scriptable, uuid(8e3fb6a1-490d-4772-90fd-3e3763958b74)]
|
||||
[scriptable, uuid(873848fe-d756-4c1b-8cf0-697f08082d85)]
|
||||
interface nsIDOMHTMLAudioElement : nsIDOMHTMLMediaElement
|
||||
{
|
||||
// Setup the audio stream for writing
|
||||
void mozSetup(in uint32_t channels, in uint32_t rate);
|
||||
|
||||
// Write audio to the audio stream
|
||||
[implicit_jscontext]
|
||||
unsigned long mozWriteAudio(in jsval data);
|
||||
|
||||
// Get the current offset (measured in samples since the start) of the audio
|
||||
// stream created using mozWriteAudio().
|
||||
unsigned long long mozCurrentSampleOffset();
|
||||
};
|
||||
|
|
|
@ -18,15 +18,17 @@ interface HTMLAudioElement : HTMLMediaElement {};
|
|||
partial interface HTMLAudioElement
|
||||
{
|
||||
// Setup the audio stream for writing
|
||||
[Throws]
|
||||
[Pref="media.audio_data.enabled", Throws]
|
||||
void mozSetup(unsigned long channels, unsigned long rate);
|
||||
|
||||
// Write audio to the audio stream
|
||||
[Throws]
|
||||
unsigned long mozWriteAudio(any data);
|
||||
[Pref="media.audio_data.enabled", Throws]
|
||||
unsigned long mozWriteAudio(Float32Array data);
|
||||
[Pref="media.audio_data.enabled", Throws]
|
||||
unsigned long mozWriteAudio(sequence<unrestricted float> data);
|
||||
|
||||
// Get the current offset (measured in samples since the start) of the audio
|
||||
// stream created using mozWriteAudio().
|
||||
[Throws]
|
||||
[Pref="media.audio_data.enabled", Throws]
|
||||
unsigned long long mozCurrentSampleOffset();
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче