Bug 967817 - Finish memory reporters for Web Audio. r=roc, njn

This commit is contained in:
Eric Rahm 2014-04-13 11:08:10 -07:00
Родитель c29fbe4df6
Коммит 314e9711f0
83 изменённых файлов: 1466 добавлений и 11 удалений

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

@ -44,6 +44,12 @@ public:
mSampleData = nullptr;
}
~Storage() { free(mDataToFree); }
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
// NB: mSampleData might not be owned, if it is it just points to
// mDataToFree.
return aMallocSizeOf(mDataToFree);
}
void* mDataToFree;
const float* mSampleData;
};
@ -74,9 +80,15 @@ public:
*/
void Clear() { mContents.Clear(); }
size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return mContents.SizeOfExcludingThis(aMallocSizeOf);
size_t amount = ThreadSharedObject::SizeOfExcludingThis(aMallocSizeOf);
amount += mContents.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mContents.Length(); i++) {
amount += mContents[i].SizeOfExcludingThis(aMallocSizeOf);
}
return amount;
}
private:
@ -328,6 +340,25 @@ public:
uint16_t InputCount() const { return mInputCount; }
uint16_t OutputCount() const { return mOutputCount; }
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
// NB: |mNode| is tracked separately so it is excluded here.
return 0;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
void SizeOfIncludingThis(MallocSizeOf aMallocSizeOf,
AudioNodeSizes& aUsage) const
{
aUsage.mEngine = SizeOfIncludingThis(aMallocSizeOf);
aUsage.mDomNode = mNode->SizeOfIncludingThis(aMallocSizeOf);
aUsage.mNodeType = mNode->NodeType();
}
private:
dom::AudioNode* mNode;
Mutex mNodeMutex;

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

@ -30,6 +30,44 @@ AudioNodeStream::~AudioNodeStream()
MOZ_COUNT_DTOR(AudioNodeStream);
}
size_t
AudioNodeStream::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
// Not reported:
// - mEngine
amount += ProcessedMediaStream::SizeOfExcludingThis(aMallocSizeOf);
amount += mLastChunks.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mLastChunks.Length(); i++) {
// NB: This is currently unshared only as there are instances of
// double reporting in DMD otherwise.
amount += mLastChunks[i].SizeOfExcludingThisIfUnshared(aMallocSizeOf);
}
return amount;
}
size_t
AudioNodeStream::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
void
AudioNodeStream::SizeOfAudioNodesIncludingThis(MallocSizeOf aMallocSizeOf,
AudioNodeSizes& aUsage) const
{
// Explicitly separate out the stream memory.
aUsage.mStream = SizeOfIncludingThis(aMallocSizeOf);
if (mEngine) {
// This will fill out the rest of |aUsage|.
mEngine->SizeOfIncludingThis(aMallocSizeOf, aUsage);
}
}
void
AudioNodeStream::SetStreamTimeParameter(uint32_t aIndex, AudioContext* aContext,
double aStreamTime)

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

@ -155,6 +155,12 @@ public:
double DestinationTimeFromTicks(AudioNodeStream* aDestination,
TrackTicks aPosition);
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
void SizeOfAudioNodesIncludingThis(MallocSizeOf aMallocSizeOf,
AudioNodeSizes& aUsage) const;
protected:
void AdvanceOutputSegment();
void FinishOutput();

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

@ -19,11 +19,28 @@ namespace mozilla {
template<typename T>
class SharedChannelArrayBuffer : public ThreadSharedObject {
public:
SharedChannelArrayBuffer(nsTArray<nsTArray<T>>* aBuffers)
SharedChannelArrayBuffer(nsTArray<nsTArray<T> >* aBuffers)
{
mBuffers.SwapElements(*aBuffers);
}
nsTArray<nsTArray<T>> mBuffers;
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = 0;
amount += mBuffers.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mBuffers.Length(); i++) {
amount += mBuffers[i].SizeOfExcludingThis(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
nsTArray<nsTArray<T> > mBuffers;
};
class AudioStream;
@ -114,6 +131,27 @@ struct AudioChunk {
}
int ChannelCount() const { return mChannelData.Length(); }
size_t SizeOfExcludingThisIfUnshared(MallocSizeOf aMallocSizeOf) const
{
return SizeOfExcludingThis(aMallocSizeOf, true);
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf, bool aUnshared) const
{
size_t amount = 0;
// Possibly owned:
// - mBuffer - Can hold data that is also in the decoded audio queue. If it
// is not shared, or unshared == false it gets counted.
if (mBuffer && (!aUnshared || !mBuffer->IsShared())) {
amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
}
// Memory in the array is owned by mBuffer.
amount += mChannelData.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
TrackTicks mDuration; // in frames within the buffer
nsRefPtr<ThreadSharedObject> mBuffer; // the buffer object whose lifetime is managed; null means data is all zeroes
nsTArray<const void*> mChannelData; // one pointer per channel; empty if and only if mBuffer is null
@ -231,6 +269,11 @@ public:
}
static Type StaticType() { return AUDIO; }
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
};
}

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

@ -172,6 +172,22 @@ AudioStream::~AudioStream()
}
}
size_t
AudioStream::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
// Possibly add in the future:
// - mTimeStretcher
// - mLatencyLog
// - mCubebStream
amount += mInserts.SizeOfExcludingThis(aMallocSizeOf);
amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
/*static*/ void AudioStream::InitLibrary()
{
#ifdef PR_LOGGING

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

@ -169,6 +169,13 @@ public:
return mCount;
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
private:
nsAutoArrayPtr<uint8_t> mBuffer;
uint32_t mCapacity;
@ -280,6 +287,8 @@ public:
// Switch between resampling (if false) and time stretching (if true, default).
nsresult SetPreservesPitch(bool aPreservesPitch);
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
private:
friend class AudioInitTask;

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

@ -1770,6 +1770,8 @@ MediaMemoryTracker::CollectReports(nsIHandleReportCallback* aHandleReport,
"Memory used by media resources including streaming buffers, caches, "
"etc.");
#undef REPORT
return NS_OK;
}

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

@ -118,6 +118,16 @@ public:
*/
virtual void Clear() = 0;
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
return 0;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
protected:
MediaSegment(Type aType) : mDuration(0), mType(aType)
{
@ -245,6 +255,20 @@ public:
}
#endif
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = mChunks.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mChunks.Length(); i++) {
amount += mChunks[i].SizeOfExcludingThisIfUnshared(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
protected:
MediaSegmentBase(Type aType) : MediaSegment(aType) {}

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

@ -13,8 +13,10 @@
#include "nsContentUtils.h"
#include "nsIAppShell.h"
#include "nsIObserver.h"
#include "nsPrintfCString.h"
#include "nsServiceManagerUtils.h"
#include "nsWidgetsCID.h"
#include "prerror.h"
#include "prlog.h"
#include "mozilla/Attributes.h"
#include "TrackUnionStream.h"
@ -1238,6 +1240,25 @@ MediaStreamGraphImpl::RunThread()
AutoProfilerUnregisterThread autoUnregister;
for (;;) {
// Check if a memory report has been requested.
{
MonitorAutoLock lock(mMemoryReportMonitor);
if (mNeedsMemoryReport) {
mNeedsMemoryReport = false;
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
AudioNodeStream* stream = mStreams[i]->AsAudioNodeStream();
if (stream) {
AudioNodeSizes usage;
stream->SizeOfAudioNodesIncludingThis(MallocSizeOf, usage);
mAudioStreamSizes.AppendElement(usage);
}
}
lock.Notify();
}
}
// Update mCurrentTime to the min of the playing audio times, or using the
// wall-clock time change if no audio is playing.
UpdateCurrentTime();
@ -1519,7 +1540,7 @@ public:
// mGraph's thread is not running so it's OK to do whatever here
if (mGraph->IsEmpty()) {
// mGraph is no longer needed, so delete it.
delete mGraph;
mGraph->Destroy();
} else {
// The graph is not empty. We must be in a forced shutdown, or a
// non-realtime graph that has finished processing. Some later
@ -1749,7 +1770,7 @@ MediaStreamGraphImpl::AppendMessage(ControlMessage* aMessage)
if (gGraph == this) {
gGraph = nullptr;
}
delete this;
Destroy();
}
return;
}
@ -1782,6 +1803,45 @@ MediaStream::MediaStream(DOMMediaStream* aWrapper)
"Wrapper already has another media stream hooked up to it!");
}
size_t
MediaStream::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
// Not owned:
// - mGraph - Not reported here
// - mConsumers - elements
// Future:
// - mWrapper
// - mVideoOutputs - elements
// - mLastPlayedVideoFrame
// - mListeners - elements
// - mAudioOutputStreams - elements
amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
amount += mAudioOutputs.SizeOfExcludingThis(aMallocSizeOf);
amount += mVideoOutputs.SizeOfExcludingThis(aMallocSizeOf);
amount += mExplicitBlockerCount.SizeOfExcludingThis(aMallocSizeOf);
amount += mListeners.SizeOfExcludingThis(aMallocSizeOf);
amount += mMainThreadListeners.SizeOfExcludingThis(aMallocSizeOf);
amount += mDisabledTrackIDs.SizeOfExcludingThis(aMallocSizeOf);
amount += mBlocked.SizeOfExcludingThis(aMallocSizeOf);
amount += mGraphUpdateIndices.SizeOfExcludingThis(aMallocSizeOf);
amount += mConsumers.SizeOfExcludingThis(aMallocSizeOf);
amount += mAudioOutputStreams.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mAudioOutputStreams.Length(); i++) {
amount += mAudioOutputStreams[i].SizeOfExcludingThis(aMallocSizeOf);
}
return amount;
}
size_t
MediaStream::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
void
MediaStream::Init()
{
@ -2594,6 +2654,10 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(bool aRealtime)
, mStreamOrderDirty(false)
, mLatencyLog(AsyncLatencyLogger::Get())
, mMixer(nullptr)
, mMemoryReportMonitor("MSGIMemory")
, mSelfRef(MOZ_THIS_IN_INITIALIZER_LIST())
, mAudioStreamSizes()
, mNeedsMemoryReport(false)
{
#ifdef PR_LOGGING
if (!gMediaStreamGraphLog) {
@ -2602,6 +2666,18 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(bool aRealtime)
#endif
mCurrentTimeStamp = mInitialTimeStamp = mLastMainThreadUpdate = TimeStamp::Now();
RegisterWeakMemoryReporter(this);
}
void
MediaStreamGraphImpl::Destroy()
{
// First unregister from memory reporting.
UnregisterWeakMemoryReporter(this);
// Clear the self reference which will destroy this instance.
mSelfRef = nullptr;
}
NS_IMPL_ISUPPORTS1(MediaStreamGraphShutdownObserver, nsIObserver)
@ -2635,6 +2711,7 @@ MediaStreamGraph::GetInstance()
}
gGraph = new MediaStreamGraphImpl(true);
STREAM_LOG(PR_LOG_DEBUG, ("Starting up MediaStreamGraph %p", gGraph));
AudioStream::InitPreferredSampleRate();
@ -2649,6 +2726,7 @@ MediaStreamGraph::CreateNonRealtimeInstance()
NS_ASSERTION(NS_IsMainThread(), "Main thread only");
MediaStreamGraphImpl* graph = new MediaStreamGraphImpl(false);
return graph;
}
@ -2669,6 +2747,76 @@ MediaStreamGraph::DestroyNonRealtimeInstance(MediaStreamGraph* aGraph)
graph->ForceShutDown();
}
NS_IMPL_ISUPPORTS1(MediaStreamGraphImpl, nsIMemoryReporter)
struct ArrayClearer
{
ArrayClearer(nsTArray<AudioNodeSizes>& aArray) : mArray(aArray) {}
~ArrayClearer() { mArray.Clear(); }
nsTArray<AudioNodeSizes>& mArray;
};
NS_IMETHODIMP
MediaStreamGraphImpl::CollectReports(nsIHandleReportCallback* aHandleReport,
nsISupports* aData)
{
// Clears out the report array after we're done with it.
ArrayClearer reportCleanup(mAudioStreamSizes);
{
MonitorAutoLock memoryReportLock(mMemoryReportMonitor);
mNeedsMemoryReport = true;
{
// Wake up the MSG thread.
MonitorAutoLock monitorLock(mMonitor);
EnsureImmediateWakeUpLocked(monitorLock);
}
// Wait for the report to complete.
nsresult rv;
while ((rv = memoryReportLock.Wait()) != NS_OK) {
if (PR_GetError() != PR_PENDING_INTERRUPT_ERROR) {
return rv;
}
}
}
#define REPORT(_path, _amount, _desc) \
do { \
nsresult rv; \
rv = aHandleReport->Callback(EmptyCString(), _path, \
KIND_HEAP, UNITS_BYTES, _amount, \
NS_LITERAL_CSTRING(_desc), aData); \
NS_ENSURE_SUCCESS(rv, rv); \
} while (0)
for (size_t i = 0; i < mAudioStreamSizes.Length(); i++) {
const AudioNodeSizes& usage = mAudioStreamSizes[i];
const char* const nodeType = usage.mNodeType.get();
nsPrintfCString domNodePath("explicit/webaudio/audio-node/%s/dom-nodes",
nodeType);
REPORT(domNodePath, usage.mDomNode,
"Memory used by AudioNode DOM objects (Web Audio).");
nsPrintfCString enginePath("explicit/webaudio/audio-node/%s/engine-objects",
nodeType);
REPORT(enginePath, usage.mEngine,
"Memory used by AudioNode engine objects (Web Audio).");
nsPrintfCString streamPath("explicit/webaudio/audio-node/%s/stream-objects",
nodeType);
REPORT(streamPath, usage.mStream,
"Memory used by AudioNode stream objects (Web Audio).");
}
#undef REPORT
return NS_OK;
}
SourceMediaStream*
MediaStreamGraph::CreateSourceStream(DOMMediaStream* aWrapper)
{

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

@ -226,6 +226,17 @@ public:
virtual void NotifyMainThreadStateChanged() = 0;
};
/**
* Helper struct used to keep track of memory usage by AudioNodes.
*/
struct AudioNodeSizes
{
size_t mDomNode;
size_t mStream;
size_t mEngine;
nsCString mNodeType;
};
class MediaStreamGraphImpl;
class SourceMediaStream;
class ProcessedMediaStream;
@ -510,6 +521,9 @@ public:
return true;
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
protected:
virtual void AdvanceTimeVaryingValuesToCurrentTime(GraphTime aCurrentTime, GraphTime aBlockedTime)
{
@ -577,6 +591,13 @@ protected:
TrackTicks mLastTickWritten;
RefPtr<AudioStream> mStream;
TrackID mTrackID;
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += mStream->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
};
nsTArray<AudioOutputStream> mAudioOutputStreams;
@ -920,6 +941,22 @@ public:
*/
void SetGraphImpl(MediaStreamGraphImpl* aGraph);
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
// Not owned:
// - mSource
// - mDest
// - mGraph
return amount;
}
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
friend class MediaStreamGraphImpl;
friend class MediaStream;
@ -1016,6 +1053,19 @@ public:
bool InCycle() const { return mInCycle; }
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = MediaStream::SizeOfExcludingThis(aMallocSizeOf);
// Not owned:
// - mInputs elements
amount += mInputs.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
protected:
// This state is all accessed only on the media graph thread.

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

@ -10,6 +10,7 @@
#include "mozilla/Monitor.h"
#include "mozilla/TimeStamp.h"
#include "nsIMemoryReporter.h"
#include "nsIThread.h"
#include "nsIRunnable.h"
#include "Latency.h"
@ -106,8 +107,12 @@ protected:
* Currently we have one global instance per process, and one per each
* OfflineAudioContext object.
*/
class MediaStreamGraphImpl : public MediaStreamGraph {
class MediaStreamGraphImpl : public MediaStreamGraph,
public nsIMemoryReporter {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIMEMORYREPORTER
/**
* Set aRealtime to true in order to create a MediaStreamGraph which provides
* support for real-time audio and video. Set it to false in order to create
@ -116,7 +121,12 @@ public:
* implement OfflineAudioContext. They do not support MediaStream inputs.
*/
explicit MediaStreamGraphImpl(bool aRealtime);
virtual ~MediaStreamGraphImpl();
/**
* Unregisters memory reporting and deletes this instance. This should be
* called instead of calling the destructor directly.
*/
void Destroy();
// Main thread only.
/**
@ -578,6 +588,32 @@ public:
* If this is not null, all the audio output for the MSG will be mixed down.
*/
nsAutoPtr<AudioMixer> mMixer;
private:
virtual ~MediaStreamGraphImpl();
MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf)
/**
* Used to signal that a memory report has been requested.
*/
Monitor mMemoryReportMonitor;
/**
* This class uses manual memory management, and all pointers to it are raw
* pointers. However, in order for it to implement nsIMemoryReporter, it needs
* to implement nsISupports and so be ref-counted. So it maintains a single
* nsRefPtr to itself, giving it a ref-count of 1 during its entire lifetime,
* and Destroy() nulls this self-reference in order to trigger self-deletion.
*/
nsRefPtr<MediaStreamGraphImpl> mSelfRef;
/**
* Used to pass memory report information across threads.
*/
nsTArray<AudioNodeSizes> mAudioStreamSizes;
/**
* Indicates that the MSG thread should gather data for a memory report.
*/
bool mNeedsMemoryReport;
};
}

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

@ -21,6 +21,17 @@ class ThreadSharedObject {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ThreadSharedObject)
bool IsShared() { return mRefCnt.get() > 1; }
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
return 0;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
protected:
// Protected destructor, to discourage deletion outside of Release():
virtual ~ThreadSharedObject() {}
@ -52,8 +63,9 @@ public:
return p.forget();
}
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const {
return aMallocSizeOf(this);
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:

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

@ -163,6 +163,15 @@ public:
mSegment->ForgetUpTo(aTime);
}
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
if (mSegment) {
amount += mSegment->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
protected:
friend class StreamBuffer;
@ -198,6 +207,16 @@ public:
MOZ_COUNT_DTOR(StreamBuffer);
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += mTracks.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mTracks.Length(); i++) {
amount += mTracks[i]->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
/**
* Takes ownership of aSegment. Don't do this while iterating, or while
* holding a Track reference.

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

@ -215,6 +215,11 @@ public:
}
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
return mChanges.SizeOfExcludingThis(aMallocSizeOf);
}
private:
struct Entry {
Entry(Time aTime, const T& aValue) : mTime(aTime), mValue(aValue) {}

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

@ -76,6 +76,13 @@ struct VideoChunk {
}
void SetForceBlack(bool aForceBlack) { mFrame.SetForceBlack(aForceBlack); }
size_t SizeOfExcludingThisIfUnshared(MallocSizeOf aMallocSizeOf) const
{
// Future:
// - mFrame
return 0;
}
TrackTicks mDuration;
VideoFrame mFrame;
mozilla::TimeStamp mTimeStamp;
@ -121,6 +128,11 @@ public:
// Segment-generic methods not in MediaSegmentBase
static Type StaticType() { return VIDEO; }
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
};
}

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

@ -72,6 +72,11 @@ public:
NS_DispatchToMainThread(transfer);
}
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
};
AnalyserNode::AnalyserNode(AudioContext* aContext)
@ -90,6 +95,22 @@ AnalyserNode::AnalyserNode(AudioContext* aContext)
AllocateBuffer();
}
size_t
AnalyserNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mAnalysisBlock.SizeOfExcludingThis(aMallocSizeOf);
amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
amount += mOutputBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
size_t
AnalyserNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
AnalyserNode::WrapObject(JSContext* aCx)
{

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

@ -53,6 +53,14 @@ public:
}
void SetSmoothingTimeConstant(double aValue, ErrorResult& aRv);
virtual const char* NodeType() const
{
return "AnalyserNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
friend class AnalyserNodeEngine;
void AppendChunk(const AudioChunk& aChunk);

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

@ -482,6 +482,31 @@ public:
}
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
// Not owned:
// - mBuffer - shared w/ AudioNode
// - mPlaybackRateTimeline - shared w/ AudioNode
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
// NB: We need to modify speex if we want the full memory picture, internal
// fields that need measuring noted below.
// - mResampler->mem
// - mResampler->sinc_table
// - mResampler->last_sample
// - mResampler->magic_samples
// - mResampler->samp_frac_num
amount += aMallocSizeOf(mResampler);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
double mStart; // including the fractional position between ticks
// Low pass filter effects from the resampler mean that samples before the
// start time are influenced by resampling the buffer. mBeginProcessing
@ -534,6 +559,24 @@ AudioBufferSourceNode::~AudioBufferSourceNode()
}
}
size_t
AudioBufferSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
if (mBuffer) {
amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
}
amount += mPlaybackRate->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
AudioBufferSourceNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
AudioBufferSourceNode::WrapObject(JSContext* aCx)
{

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

@ -108,6 +108,14 @@ public:
virtual void NotifyMainThreadStateChanged() MOZ_OVERRIDE;
virtual const char* NodeType() const
{
return "AudioBufferSourceNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
friend class AudioBufferSourceNodeEngine;
// START is sent during Start().

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

@ -147,6 +147,18 @@ public:
context->DispatchTrustedEvent(event);
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
amount += mInputChannels.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
// The input to the destination node is recorded in the mInputChannels buffer.
// When this buffer fills up with mLength frames, the buffered input is sent
@ -188,6 +200,11 @@ public:
VOLUME,
};
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
float mVolume;
};
@ -256,6 +273,21 @@ AudioDestinationNode::AudioDestinationNode(AudioContext* aContext,
}
}
size_t
AudioDestinationNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
// Might be useful in the future:
// - mAudioChannelAgent
return amount;
}
size_t
AudioDestinationNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
void
AudioDestinationNode::DestroyMediaStream()
{

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

@ -74,6 +74,14 @@ public:
// When aIsOnlyNode is true, this is the only node for the AudioContext.
void SetIsOnlyNodeForContext(bool aIsOnlyNode);
virtual const char* NodeType() const
{
return "AudioDestinationNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
bool CheckAudioChannelPermissions(AudioChannel aValue);
void CreateAudioChannelAgent();

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

@ -77,6 +77,37 @@ AudioNode::~AudioNode()
}
}
size_t
AudioNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
// Not owned:
// - mContext
// - mStream
size_t amount = 0;
amount += mInputNodes.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mInputNodes.Length(); i++) {
amount += mInputNodes[i].SizeOfExcludingThis(aMallocSizeOf);
}
// Just measure the array. The entire audio node graph is measured via the
// MediaStreamGraph's streams, so we don't want to double-count the elements.
amount += mOutputNodes.SizeOfExcludingThis(aMallocSizeOf);
amount += mOutputParams.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mOutputParams.Length(); i++) {
amount += mOutputParams[i]->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
size_t
AudioNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
template <class InputNode>
static uint32_t
FindIndexOfNode(const nsTArray<InputNode>& aInputNodes, const AudioNode* aNode)

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

@ -15,6 +15,7 @@
#include "AudioContext.h"
#include "MediaStreamGraph.h"
#include "WebAudioUtils.h"
#include "mozilla/MemoryReporting.h"
namespace mozilla {
@ -170,6 +171,16 @@ public:
}
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
if (mStreamPort) {
amount += mStreamPort->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
// Weak reference.
AudioNode* mInputNode;
nsRefPtr<MediaInputPort> mStreamPort;
@ -208,6 +219,11 @@ public:
// MarkInactive() may delete |this|.
void MarkInactive() { Context()->UnregisterActiveNode(this); }
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const;
virtual const char* NodeType() const = 0;
private:
friend class AudioBufferSourceNode;
// This could possibly delete 'this'.

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

@ -153,6 +153,27 @@ public:
// May create the stream if it doesn't exist
MediaStream* Stream();
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioParamTimeline::SizeOfExcludingThis(aMallocSizeOf);
// Not owned:
// - mNode
// Just count the array, actual nodes are counted in mNode.
amount += mInputNodes.SizeOfExcludingThis(aMallocSizeOf);
if (mNodeStreamPort) {
amount += mNodeStreamPort->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
protected:
nsCycleCollectingAutoRefCnt mRefCnt;
NS_DECL_OWNINGTHREAD

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

@ -52,6 +52,17 @@ public:
template<class TimeType>
float GetValueAtTime(TimeType aTime, size_t aCounter = 0);
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
return mStream ? mStream->SizeOfIncludingThis(aMallocSizeOf) : 0;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
float AudioNodeInputValue(size_t aCounter) const;

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

@ -211,6 +211,22 @@ public:
}
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
// Not owned:
// - mSource - probably not owned
// - mDestination - probably not owned
// - AudioParamTimelines - counted in the AudioNode
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
amount += mBiquads.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
AudioNodeStream* mSource;
AudioNodeStream* mDestination;
@ -242,6 +258,37 @@ BiquadFilterNode::BiquadFilterNode(AudioContext* aContext)
engine->SetSourceStream(static_cast<AudioNodeStream*> (mStream.get()));
}
size_t
BiquadFilterNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
if (mFrequency) {
amount += mFrequency->SizeOfIncludingThis(aMallocSizeOf);
}
if (mDetune) {
amount += mDetune->SizeOfIncludingThis(aMallocSizeOf);
}
if (mQ) {
amount += mQ->SizeOfIncludingThis(aMallocSizeOf);
}
if (mGain) {
amount += mGain->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
size_t
BiquadFilterNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
BiquadFilterNode::WrapObject(JSContext* aCx)
{

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

@ -56,6 +56,14 @@ public:
const Float32Array& aMagResponse,
const Float32Array& aPhaseResponse);
virtual const char* NodeType() const
{
return "BiquadFilterNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
static void SendFrequencyToStream(AudioNode* aNode);
static void SendDetuneToStream(AudioNode* aNode);

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

@ -53,6 +53,11 @@ public:
}
}
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
};
ChannelMergerNode::ChannelMergerNode(AudioContext* aContext,

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

@ -26,6 +26,16 @@ public:
virtual uint16_t NumberOfInputs() const MOZ_OVERRIDE { return mInputCount; }
virtual const char* NodeType() const
{
return "ChannelMergerNode";
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
const uint16_t mInputCount;
};

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

@ -45,6 +45,11 @@ public:
}
}
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
};
ChannelSplitterNode::ChannelSplitterNode(AudioContext* aContext,

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

@ -26,6 +26,16 @@ public:
virtual uint16_t NumberOfOutputs() const MOZ_OVERRIDE { return mOutputCount; }
virtual const char* NodeType() const
{
return "ChannelSplitterNode";
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
const uint16_t mOutputCount;
};

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

@ -154,6 +154,25 @@ public:
mReverb->process(&input, aOutput, WEBAUDIO_BLOCK_SIZE);
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
if (mBuffer && !mBuffer->IsShared()) {
amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
}
if (mReverb) {
amount += mReverb->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
nsRefPtr<ThreadSharedFloatArrayBufferList> mBuffer;
nsAutoPtr<WebCore::Reverb> mReverb;
@ -175,6 +194,24 @@ ConvolverNode::ConvolverNode(AudioContext* aContext)
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
}
size_t
ConvolverNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
if (mBuffer) {
// NB: mBuffer might be shared with the associated engine, by convention
// the AudioNode will report.
amount += mBuffer->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
size_t
ConvolverNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
ConvolverNode::WrapObject(JSContext* aCx)
{

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

@ -54,6 +54,14 @@ public:
AudioNode::SetChannelCountModeValue(aMode, aRv);
}
virtual const char* NodeType() const
{
return "ConvolverNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
nsRefPtr<AudioBuffer> mBuffer;
bool mNormalize;

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

@ -12,6 +12,19 @@
namespace mozilla {
size_t
DelayBuffer::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += mChunks.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mChunks.Length(); i++) {
amount += mChunks[i].SizeOfExcludingThis(aMallocSizeOf, false);
}
amount += mUpmixChannels.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
void
DelayBuffer::Write(const AudioChunk& aInputChunk)
{

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

@ -75,6 +75,8 @@ public:
int MaxDelayTicks() const { return mMaxDelayTicks; }
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const;
private:
void ReadChannels(const double aPerFrameDelays[WEBAUDIO_BLOCK_SIZE],
const AudioChunk* aOutputChunk,

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

@ -159,6 +159,22 @@ public:
}
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
// Not owned:
// - mSource - probably not owned
// - mDestination - probably not owned
// - mDelay - shares ref with AudioNode, don't count
amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
AudioNodeStream* mSource;
AudioNodeStream* mDestination;
AudioParamTimeline mDelay;
@ -185,6 +201,20 @@ DelayNode::DelayNode(AudioContext* aContext, double aMaxDelay)
engine->SetSourceStream(static_cast<AudioNodeStream*> (mStream.get()));
}
size_t
DelayNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mDelay->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
DelayNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
DelayNode::WrapObject(JSContext* aCx)
{

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

@ -35,6 +35,14 @@ public:
return this;
}
virtual const char* NodeType() const
{
return "DelayNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
static void SendDelayToStream(AudioNode* aNode);
friend class DelayNodeEngine;

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

@ -130,6 +130,23 @@ public:
mCompressor->parameterValue(DynamicsCompressor::ParamReduction));
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
// Not owned:
// - mSource (probably)
// - mDestination (probably)
// - Don't count the AudioParamTimelines, their inner refs are owned by the
// AudioNode.
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
amount += mCompressor->sizeOfIncludingThis(aMallocSizeOf);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
void SendReductionParamToMainThread(AudioNodeStream* aStream, float aReduction)
{
@ -205,6 +222,24 @@ DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* aContext)
engine->SetSourceStream(static_cast<AudioNodeStream*> (mStream.get()));
}
size_t
DynamicsCompressorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mThreshold->SizeOfIncludingThis(aMallocSizeOf);
amount += mKnee->SizeOfIncludingThis(aMallocSizeOf);
amount += mRatio->SizeOfIncludingThis(aMallocSizeOf);
amount += mAttack->SizeOfIncludingThis(aMallocSizeOf);
amount += mRelease->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
DynamicsCompressorNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
DynamicsCompressorNode::WrapObject(JSContext* aCx)
{

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

@ -56,6 +56,14 @@ public:
return mRelease;
}
virtual const char* NodeType() const
{
return "DynamicsCompressorNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
static void SendThresholdToStream(AudioNode* aNode);
static void SendKneeToStream(AudioNode* aNode);

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

@ -128,6 +128,20 @@ public:
return mOutputBuffer[aIndex].i;
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += aMallocSizeOf(mFFT);
amount += aMallocSizeOf(mIFFT);
amount += mOutputBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
FFTBlock(const FFTBlock& other) MOZ_DELETE;
void operator=(const FFTBlock& other) MOZ_DELETE;

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

@ -101,6 +101,20 @@ public:
}
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
// Not owned:
// - mSource (probably)
// - mDestination (probably)
// - mGain - Internal ref owned by AudioNode
return AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
AudioNodeStream* mSource;
AudioNodeStream* mDestination;
AudioParamTimeline mGain;
@ -119,6 +133,20 @@ GainNode::GainNode(AudioContext* aContext)
engine->SetSourceStream(static_cast<AudioNodeStream*> (mStream.get()));
}
size_t
GainNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mGain->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
GainNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
GainNode::WrapObject(JSContext* aCx)
{

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

@ -30,6 +30,14 @@ public:
return mGain;
}
virtual const char* NodeType() const
{
return "GainNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
static void SendGainToStream(AudioNode* aNode);

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

@ -19,6 +19,16 @@ public:
DOMMediaStream* aStream);
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
virtual const char* NodeType() const
{
return "MediaElementAudioSourceNode";
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
};
}

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

@ -48,6 +48,11 @@ public:
segment->AppendAndConsumeChunk(aOutput);
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
ProcessedMediaStream* mOutputStream;
};
@ -81,6 +86,22 @@ MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* a
}
}
size_t
MediaStreamAudioDestinationNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
// Future:
// - mDOMStream
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mPort->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
MediaStreamAudioDestinationNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
void
MediaStreamAudioDestinationNode::DestroyMediaStream()
{

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

@ -34,6 +34,14 @@ public:
return mDOMStream;
}
virtual const char* NodeType() const
{
return "MediaStreamAudioDestinationNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
nsRefPtr<DOMMediaStream> mDOMStream;
nsRefPtr<MediaInputPort> mPort;

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

@ -49,6 +49,22 @@ MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode()
{
}
size_t
MediaStreamAudioSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
// Future:
// - mInputStream
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mInputPort->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
MediaStreamAudioSourceNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
void
MediaStreamAudioSourceNode::DestroyMediaStream()
{

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

@ -31,6 +31,14 @@ public:
virtual uint16_t NumberOfInputs() const MOZ_OVERRIDE { return 0; }
virtual const char* NodeType() const
{
return "MediaStreamAudioSourceNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
nsRefPtr<MediaInputPort> mInputPort;
nsRefPtr<DOMMediaStream> mInputStream;

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

@ -463,6 +463,32 @@ public:
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
// Not owned:
// - mSource
// - mDestination
// - mFrequency (internal ref owned by node)
// - mDetune (internal ref owned by node)
if (mCustom) {
amount += mCustom->SizeOfIncludingThis(aMallocSizeOf);
}
if (mPeriodicWave) {
amount += mPeriodicWave->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
DCBlocker mDCBlocker;
AudioNodeStream* mSource;
AudioNodeStream* mDestination;
@ -510,6 +536,24 @@ OscillatorNode::~OscillatorNode()
{
}
size_t
OscillatorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
// For now only report if we know for sure that it's not shared.
amount += mPeriodicWave->SizeOfExcludingThisIfNotShared(aMallocSizeOf);
amount += mFrequency->SizeOfIncludingThis(aMallocSizeOf);
amount += mDetune->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
OscillatorNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
OscillatorNode::WrapObject(JSContext* aCx)
{

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

@ -117,6 +117,14 @@ public:
virtual void NotifyMainThreadStateChanged() MOZ_OVERRIDE;
virtual const char* NodeType() const
{
return "OscillatorNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
static void SendFrequencyToStream(AudioNode* aNode);
static void SendDetuneToStream(AudioNode* aNode);

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

@ -188,6 +188,21 @@ public:
float InverseGainFunction(float aDistance);
float ExponentialGainFunction(float aDistance);
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
if (mHRTFPanner) {
amount += mHRTFPanner->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
nsAutoPtr<HRTFPanner> mHRTFPanner;
typedef void (PannerNodeEngine::*PanningModelFunction)(const AudioChunk& aInput, AudioChunk* aOutput);
PanningModelFunction mPanningModelFunction;
@ -242,6 +257,20 @@ PannerNode::~PannerNode()
}
}
size_t
PannerNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mSources.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
size_t
PannerNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
PannerNode::WrapObject(JSContext* aCx)
{

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

@ -245,6 +245,14 @@ public:
void FindConnectedSources();
void FindConnectedSources(AudioNode* aNode, nsTArray<AudioBufferSourceNode*>& aSources, std::set<AudioNode*>& aSeenNodes);
virtual const char* NodeType() const
{
return "PannerNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
friend class AudioListener;
friend class PannerNodeEngine;

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

@ -44,6 +44,19 @@ PeriodicWave::PeriodicWave(AudioContext* aContext,
mCoefficients->SetData(1, nullptr, buffer+aLength);
}
size_t
PeriodicWave::SizeOfExcludingThisIfNotShared(MallocSizeOf aMallocSizeOf) const
{
// Not owned:
// - mContext
size_t amount = 0;
if (!mCoefficients->IsShared()) {
amount += mCoefficients->SizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
JSObject*
PeriodicWave::WrapObject(JSContext* aCx)
{

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

@ -47,6 +47,8 @@ public:
return mCoefficients;
}
size_t SizeOfExcludingThisIfNotShared(MallocSizeOf aMallocSizeOf) const;
private:
nsRefPtr<AudioContext> mContext;
nsRefPtr<ThreadSharedFloatArrayBufferList> mCoefficients;

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

@ -38,7 +38,19 @@ private:
: mMutex(aName)
{}
Mutex& Lock() { return mMutex; }
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
mMutex.AssertCurrentThreadOwns();
size_t amount = 0;
for (size_t i = 0; i < mBufferList.size(); i++) {
amount += mBufferList[i].SizeOfExcludingThis(aMallocSizeOf, false);
}
return amount;
}
Mutex& Lock() const { return const_cast<OutputQueue*>(this)->mMutex; }
size_t ReadyToConsume() const
{
@ -95,6 +107,18 @@ public:
{
}
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
{
MutexAutoLock lock(mOutputQueue.Lock());
amount += mOutputQueue.SizeOfExcludingThis(aMallocSizeOf);
}
return amount;
}
// main thread
void FinishProducingOutputBuffer(ThreadSharedFloatArrayBufferList* aBuffer,
uint32_t aBufferSize)
@ -293,6 +317,26 @@ public:
}
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
// Not owned:
// - mSharedBuffers
// - mSource (probably)
// - mDestination (probably)
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
amount += mInputChannels.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < mInputChannels.Length(); i++) {
amount += mInputChannels[i].SizeOfExcludingThis(aMallocSizeOf);
}
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
void AllocateInputBlock()
{
@ -450,6 +494,20 @@ ScriptProcessorNode::~ScriptProcessorNode()
{
}
size_t
ScriptProcessorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
amount += mSharedBuffers->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
size_t
ScriptProcessorNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
JSObject*
ScriptProcessorNode::WrapObject(JSContext* aCx)
{

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

@ -89,6 +89,14 @@ public:
using DOMEventTargetHelper::DispatchTrustedEvent;
virtual const char* NodeType() const
{
return "ScriptProcessorNode";
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
private:
nsAutoPtr<SharedBuffers> mSharedBuffers;
const uint32_t mBufferSize;

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

@ -130,6 +130,16 @@ public:
MOZ_ASSERT(inSamples == WEBAUDIO_BLOCK_SIZE*aBlocks && outSamples == WEBAUDIO_BLOCK_SIZE);
}
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
// Future: properly measure speex memory
amount += aMallocSizeOf(mUpSampler);
amount += aMallocSizeOf(mDownSampler);
amount += mBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
private:
void Destroy()
{
@ -244,6 +254,19 @@ public:
}
}
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf);
amount += mCurve.SizeOfExcludingThis(aMallocSizeOf);
amount += mResampler.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
nsTArray<float> mCurve;
OverSampleType mType;

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

@ -39,6 +39,23 @@ public:
}
void SetOversample(OverSampleType aType);
virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
// Possibly track in the future:
// - mCurve
return AudioNode::SizeOfExcludingThis(aMallocSizeOf);
}
virtual const char* NodeType() const
{
return "WaveShaperNode";
}
virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE
{
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}
private:
void ClearCurve();

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

@ -30,6 +30,7 @@
#define DirectConvolver_h
#include "nsTArray.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -41,6 +42,14 @@ public:
void reset();
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_buffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
private:
size_t m_inputBlockSize;

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

@ -52,6 +52,29 @@ DynamicsCompressor::DynamicsCompressor(float sampleRate, unsigned numberOfChanne
initializeParameters();
}
size_t DynamicsCompressor::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_preFilterPacks.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_preFilterPacks.Length(); i++) {
if (m_preFilterPacks[i]) {
amount += m_preFilterPacks[i]->sizeOfIncludingThis(aMallocSizeOf);
}
}
amount += m_postFilterPacks.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_postFilterPacks.Length(); i++) {
if (m_postFilterPacks[i]) {
amount += m_postFilterPacks[i]->sizeOfIncludingThis(aMallocSizeOf);
}
}
amount += m_sourceChannels.SizeOfExcludingThis(aMallocSizeOf);
amount += m_destinationChannels.SizeOfExcludingThis(aMallocSizeOf);
amount += m_compressor.sizeOfExcludingThis(aMallocSizeOf);
return amount;
}
void DynamicsCompressor::setParameterValue(unsigned parameterID, float value)
{
MOZ_ASSERT(parameterID < ParamLast);

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

@ -34,6 +34,7 @@
#include "nsTArray.h"
#include "nsAutoPtr.h"
#include "mozilla/MemoryReporting.h"
namespace mozilla {
struct AudioChunk;
@ -86,6 +87,8 @@ public:
double tailTime() const { return 0; }
double latencyTime() const { return m_compressor.latencyFrames() / static_cast<double>(sampleRate()); }
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
protected:
unsigned m_numberOfChannels;
@ -102,6 +105,10 @@ protected:
typedef struct {
ZeroPole filters[4];
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this);
}
} ZeroPoleFilterPack4;
// Per-channel emphasis filters.

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

@ -73,6 +73,17 @@ DynamicsCompressorKernel::DynamicsCompressorKernel(float sampleRate, unsigned nu
static_cast<float>(WebAudioUtils::DiscreteTimeConstantForSampleRate(meteringReleaseTimeConstant, sampleRate));
}
size_t DynamicsCompressorKernel::sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += m_preDelayBuffers.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_preDelayBuffers.Length(); i++) {
amount += m_preDelayBuffers[i].SizeOfExcludingThis(aMallocSizeOf);
}
return amount;
}
void DynamicsCompressorKernel::setNumberOfChannels(unsigned numberOfChannels)
{
if (m_preDelayBuffers.Length() == numberOfChannels)

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

@ -31,6 +31,7 @@
#include "nsTArray.h"
#include "nsAutoPtr.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -69,6 +70,8 @@ public:
float meteringGain() const { return m_meteringGain; }
size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
protected:
float m_sampleRate;

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

@ -45,6 +45,21 @@ FFTConvolver::FFTConvolver(size_t fftSize)
PodZero(m_lastOverlapBuffer.Elements(), fftSize / 2);
}
size_t FFTConvolver::sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
amount += m_frame.SizeOfExcludingThis(aMallocSizeOf);
amount += m_inputBuffer.SizeOfExcludingThis(aMallocSizeOf);
amount += m_outputBuffer.SizeOfExcludingThis(aMallocSizeOf);
amount += m_lastOverlapBuffer.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
size_t FFTConvolver::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this) + sizeOfExcludingThis(aMallocSizeOf);
}
void FFTConvolver::process(FFTBlock* fftKernel, const float* sourceP, float* destP, size_t framesToProcess)
{
size_t halfSize = fftSize() / 2;

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

@ -31,6 +31,7 @@
#include "nsTArray.h"
#include "mozilla/FFTBlock.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -57,6 +58,9 @@ public:
size_t fftSize() const { return m_frame.FFTSize(); }
size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
FFTBlock m_frame;

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

@ -79,6 +79,17 @@ HRTFDatabase::HRTFDatabase(float sampleRate)
}
}
size_t HRTFDatabase::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_elevations.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_elevations.Length(); i++) {
amount += m_elevations[i]->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
void HRTFDatabase::getKernelsFromAzimuthElevation(double azimuthBlend, unsigned azimuthIndex, double elevationAngle, HRTFKernel* &kernelL, HRTFKernel* &kernelR,
double& frameDelayL, double& frameDelayR)
{

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

@ -32,6 +32,7 @@
#include "HRTFElevation.h"
#include "nsAutoRef.h"
#include "nsTArray.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -55,6 +56,8 @@ public:
// Number of elevations loaded from resource.
static const unsigned NumberOfRawElevations;
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
HRTFDatabase(const HRTFDatabase& other) MOZ_DELETE;
void operator=(const HRTFDatabase& other) MOZ_DELETE;

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

@ -88,6 +88,20 @@ HRTFDatabaseLoader::~HRTFDatabaseLoader()
}
}
size_t HRTFDatabaseLoader::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
// NB: Need to make sure we're not competing with the loader thread.
const_cast<HRTFDatabaseLoader*>(this)->waitForLoaderThreadCompletion();
if (m_hrtfDatabase) {
amount += m_hrtfDatabase->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
class HRTFDatabaseLoader::ProxyReleaseEvent MOZ_FINAL : public nsRunnable {
public:
explicit ProxyReleaseEvent(HRTFDatabaseLoader* loader) : mLoader(loader) {}

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

@ -31,6 +31,7 @@
#include "nsHashKeys.h"
#include "mozilla/RefPtr.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Mutex.h"
#include "HRTFDatabase.h"
@ -93,6 +94,8 @@ public:
// Called in asynchronous loading thread.
void load();
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
// Both constructor and destructor must be called from the main thread.
explicit HRTFDatabaseLoader(float sampleRate);

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

@ -50,6 +50,18 @@ const int rawSampleRate = irc_composite_c_r0195_sample_rate;
// Number of frames in an individual impulse response.
const size_t ResponseFrameSize = 256;
size_t HRTFElevation::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_kernelListL.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_kernelListL.Length(); i++) {
amount += m_kernelListL[i]->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
size_t HRTFElevation::fftSizeForSampleRate(float sampleRate)
{
// The IRCAM HRTF impulse responses were 512 sample-frames @44.1KHz,

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

@ -31,6 +31,7 @@
#include "HRTFKernel.h"
#include "nsAutoRef.h"
#include "mozilla/MemoryReporting.h"
struct SpeexResamplerState_;
typedef struct SpeexResamplerState_ SpeexResamplerState;
@ -63,6 +64,8 @@ public:
static size_t fftSizeForSampleRate(float sampleRate);
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
HRTFElevation(const HRTFElevation& other) MOZ_DELETE;
void operator=(const HRTFElevation& other) MOZ_DELETE;

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

@ -33,6 +33,7 @@
#include "nsAutoRef.h"
#include "nsTArray.h"
#include "mozilla/FFTBlock.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -64,6 +65,13 @@ public:
float sampleRate() const { return m_sampleRate; }
double nyquist() const { return 0.5 * sampleRate(); }
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_fftFrame->SizeOfIncludingThis(aMallocSizeOf);
return amount;
}
private:
HRTFKernel(const HRTFKernel& other) MOZ_DELETE;
void operator=(const HRTFKernel& other) MOZ_DELETE;

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

@ -70,6 +70,27 @@ HRTFPanner::~HRTFPanner()
MOZ_COUNT_DTOR(HRTFPanner);
}
size_t HRTFPanner::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
if (m_databaseLoader) {
m_databaseLoader->sizeOfIncludingThis(aMallocSizeOf);
}
amount += m_convolverL1.sizeOfExcludingThis(aMallocSizeOf);
amount += m_convolverR1.sizeOfExcludingThis(aMallocSizeOf);
amount += m_convolverL2.sizeOfExcludingThis(aMallocSizeOf);
amount += m_convolverR2.sizeOfExcludingThis(aMallocSizeOf);
amount += m_delayLine.SizeOfExcludingThis(aMallocSizeOf);
amount += m_tempL1.SizeOfExcludingThis(aMallocSizeOf);
amount += m_tempL2.SizeOfExcludingThis(aMallocSizeOf);
amount += m_tempR1.SizeOfExcludingThis(aMallocSizeOf);
amount += m_tempR2.SizeOfExcludingThis(aMallocSizeOf);
return amount;
}
void HRTFPanner::reset()
{
m_azimuthIndex1 = UninitializedAzimuth;

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

@ -27,6 +27,7 @@
#include "FFTConvolver.h"
#include "DelayBuffer.h"
#include "mozilla/MemoryReporting.h"
namespace mozilla {
struct AudioChunk;
@ -53,6 +54,8 @@ public:
int maxTailFrames() const;
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
// Given an azimuth angle in the range -180 -> +180, returns the corresponding azimuth index for the database,
// and azimuthBlend which is an interpolation value from 0 -> 1.

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

@ -95,6 +95,20 @@ PeriodicWave::PeriodicWave(float sampleRate)
m_rateScale = m_periodicWaveSize / m_sampleRate;
}
size_t PeriodicWave::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_bandLimitedTables.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_bandLimitedTables.Length(); i++) {
if (m_bandLimitedTables[i]) {
amount += m_bandLimitedTables[i]->SizeOfIncludingThis(aMallocSizeOf);
}
}
return amount;
}
void PeriodicWave::waveDataForFundamentalFrequency(float fundamentalFrequency, float* &lowerWaveData, float* &higherWaveData, float& tableInterpolationFactor)
{
// Negative frequencies are allowed, in which case we alias

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

@ -32,6 +32,7 @@
#include "mozilla/dom/OscillatorNodeBinding.h"
#include <nsAutoPtr.h>
#include <nsTArray.h>
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -68,6 +69,8 @@ public:
unsigned periodicWaveSize() const { return m_periodicWaveSize; }
float sampleRate() const { return m_sampleRate; }
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
explicit PeriodicWave(float sampleRate);

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

@ -105,6 +105,21 @@ Reverb::Reverb(ThreadSharedFloatArrayBufferList* impulseResponse, size_t impulse
maxFFTSize, numberOfChannels, useBackgroundThreads);
}
size_t Reverb::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_convolvers.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_convolvers.Length(); i++) {
if (m_convolvers[i]) {
amount += m_convolvers[i]->sizeOfIncludingThis(aMallocSizeOf);
}
}
amount += m_tempBuffer.SizeOfExcludingThis(aMallocSizeOf, false);
return amount;
}
void Reverb::initialize(const nsTArray<const float*>& impulseResponseBuffer,
size_t impulseResponseBufferLength, size_t renderSliceSize,
size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads)

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

@ -33,6 +33,7 @@
#include "nsAutoPtr.h"
#include "nsTArray.h"
#include "AudioSegment.h"
#include "mozilla/MemoryReporting.h"
namespace mozilla {
class ThreadSharedFloatArrayBufferList;
@ -58,6 +59,8 @@ public:
size_t impulseResponseLength() const { return m_impulseResponseLength; }
size_t latencyFrames() const;
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
void initialize(const nsTArray<const float*>& impulseResponseBuffer, size_t impulseResponseBufferLength, size_t renderSliceSize, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads);

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

@ -30,6 +30,7 @@
#define ReverbAccumulationBuffer_h
#include "nsTArray.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -58,6 +59,11 @@ public:
void reset();
size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
return m_buffer.SizeOfExcludingThis(aMallocSizeOf);
}
private:
AudioFloatArray m_buffer;
size_t m_readIndex;

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

@ -151,6 +151,35 @@ ReverbConvolver::~ReverbConvolver()
}
}
size_t ReverbConvolver::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
amount += m_stages.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_stages.Length(); i++) {
if (m_stages[i]) {
amount += m_stages[i]->sizeOfIncludingThis(aMallocSizeOf);
}
}
amount += m_backgroundStages.SizeOfExcludingThis(aMallocSizeOf);
for (size_t i = 0; i < m_backgroundStages.Length(); i++) {
if (m_backgroundStages[i]) {
amount += m_backgroundStages[i]->sizeOfIncludingThis(aMallocSizeOf);
}
}
// NB: The buffer sizes are static, so even though they might be accessed
// in another thread it's safe to measure them.
amount += m_accumulationBuffer.sizeOfExcludingThis(aMallocSizeOf);
amount += m_inputBuffer.sizeOfExcludingThis(aMallocSizeOf);
// Possible future measurements:
// - m_backgroundThread
// - m_backgroundThreadLock
// - m_backgroundThreadCondition
return amount;
}
void ReverbConvolver::backgroundThreadEntry()
{
while (!m_wantsToExit) {

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

@ -32,6 +32,7 @@
#include "ReverbAccumulationBuffer.h"
#include "ReverbInputBuffer.h"
#include "nsAutoPtr.h"
#include "mozilla/MemoryReporting.h"
#ifdef LOG
#undef LOG
#endif
@ -65,6 +66,8 @@ public:
void backgroundThreadEntry();
size_t latencyFrames() const;
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
nsTArray<nsAutoPtr<ReverbConvolverStage> > m_stages;
nsTArray<nsAutoPtr<ReverbConvolverStage> > m_backgroundStages;

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

@ -87,6 +87,29 @@ ReverbConvolverStage::ReverbConvolverStage(const float* impulseResponse, size_t,
PodZero(m_preDelayBuffer.Elements(), m_preDelayBuffer.Length());
}
size_t ReverbConvolverStage::sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
size_t amount = aMallocSizeOf(this);
if (m_fftKernel) {
amount += m_fftKernel->SizeOfIncludingThis(aMallocSizeOf);
}
if (m_fftConvolver) {
amount += m_fftConvolver->sizeOfIncludingThis(aMallocSizeOf);
}
amount += m_preDelayBuffer.SizeOfExcludingThis(aMallocSizeOf);
amount += m_temporaryBuffer.SizeOfExcludingThis(aMallocSizeOf);
amount += m_directKernel.SizeOfExcludingThis(aMallocSizeOf);
if (m_directConvolver) {
amount += m_directConvolver->sizeOfIncludingThis(aMallocSizeOf);
}
return amount;
}
void ReverbConvolverStage::processInBackground(ReverbConvolver* convolver, size_t framesToProcess)
{
ReverbInputBuffer* inputBuffer = convolver->inputBuffer();

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

@ -34,6 +34,7 @@
#include "nsTArray.h"
#include "mozilla/FFTBlock.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -60,6 +61,8 @@ public:
// Useful for background processing
int inputReadIndex() const { return m_inputReadIndex; }
size_t sizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
private:
nsAutoPtr<FFTBlock> m_fftKernel;
nsAutoPtr<FFTConvolver> m_fftConvolver;

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

@ -30,6 +30,7 @@
#define ReverbInputBuffer_h
#include "nsTArray.h"
#include "mozilla/MemoryReporting.h"
namespace WebCore {
@ -54,6 +55,12 @@ public:
void reset();
size_t sizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
{
return m_buffer.SizeOfExcludingThis(aMallocSizeOf);
}
private:
nsTArray<float> m_buffer;
size_t m_writeIndex;