Bug 858211 - Use more webidl features for HTMLAudioElement; r=bz

This commit is contained in:
Ms2ger 2013-04-13 08:59:30 +02:00
Родитель 0e3a1e4ca5
Коммит c4090d9585
4 изменённых файлов: 23 добавлений и 80 удалений

Просмотреть файл

@ -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();
};