mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Bug 967817 - Finish memory reporters for Web Audio. r=roc, njn
This commit is contained in:
parent
c29fbe4df6
commit
314e9711f0
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user