- Revision
- 119302
- Author
- [email protected]
- Date
- 2012-06-01 17:09:04 -0700 (Fri, 01 Jun 2012)
Log Message
Remove RefInfo class
https://bugs.webkit.org/show_bug.cgi?id=87904
Patch by Raymond Toy <[email protected]> on 2012-06-01
Reviewed by Chris Rogers.
No new tests; covered by existing tests.
* Modules/webaudio/AudioBufferSourceNode.cpp:
(WebCore::AudioBufferSourceNode::~AudioBufferSourceNode): Clear
panner node.
(WebCore::AudioBufferSourceNode::totalPitchRate):
(WebCore::AudioBufferSourceNode::setPannerNode): Use
RefTypeConnection counting for panner node.
(WebCore):
(WebCore::AudioBufferSourceNode::clearPannerNode): New function to
clear panner node in AudioBufferSourceNode.
(WebCore::AudioBufferSourceNode::finish): Clear panner node when done.
* Modules/webaudio/AudioBufferSourceNode.h:
(AudioBufferSourceNode): Add virtual finish(), m_pannerNode is not
a RefPtr anymore.
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::addDeferredFinishDeref): Remove unneeded RefTyp.
(WebCore::AudioContext::handleDeferredFinishDerefs): Remove
unneeded RefType.
* Modules/webaudio/AudioContext.h:
(AudioContext): Update addDeferredFinishDeref signature.
* Modules/webaudio/AudioNode.cpp:
(WebCore::AudioNode::deref): Update call to addDeferredFinishDeref.
* Modules/webaudio/AudioScheduledSourceNode.h:
(AudioScheduledSourceNode): Make finish() virtual.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (119301 => 119302)
--- trunk/Source/WebCore/ChangeLog 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/ChangeLog 2012-06-02 00:09:04 UTC (rev 119302)
@@ -1,3 +1,36 @@
+2012-06-01 Raymond Toy <[email protected]>
+
+ Remove RefInfo class
+ https://bugs.webkit.org/show_bug.cgi?id=87904
+
+ Reviewed by Chris Rogers.
+
+ No new tests; covered by existing tests.
+
+ * Modules/webaudio/AudioBufferSourceNode.cpp:
+ (WebCore::AudioBufferSourceNode::~AudioBufferSourceNode): Clear
+ panner node.
+ (WebCore::AudioBufferSourceNode::totalPitchRate):
+ (WebCore::AudioBufferSourceNode::setPannerNode): Use
+ RefTypeConnection counting for panner node.
+ (WebCore):
+ (WebCore::AudioBufferSourceNode::clearPannerNode): New function to
+ clear panner node in AudioBufferSourceNode.
+ (WebCore::AudioBufferSourceNode::finish): Clear panner node when done.
+ * Modules/webaudio/AudioBufferSourceNode.h:
+ (AudioBufferSourceNode): Add virtual finish(), m_pannerNode is not
+ a RefPtr anymore.
+ * Modules/webaudio/AudioContext.cpp:
+ (WebCore::AudioContext::addDeferredFinishDeref): Remove unneeded RefTyp.
+ (WebCore::AudioContext::handleDeferredFinishDerefs): Remove
+ unneeded RefType.
+ * Modules/webaudio/AudioContext.h:
+ (AudioContext): Update addDeferredFinishDeref signature.
+ * Modules/webaudio/AudioNode.cpp:
+ (WebCore::AudioNode::deref): Update call to addDeferredFinishDeref.
+ * Modules/webaudio/AudioScheduledSourceNode.h:
+ (AudioScheduledSourceNode): Make finish() virtual.
+
2012-06-01 Tony Chang <[email protected]>
rename -webkit-flex-pack and -webkit-flex-line-pack to -webkit-justify-content and -webkit-align-content
Modified: trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp (119301 => 119302)
--- trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp 2012-06-02 00:09:04 UTC (rev 119302)
@@ -78,6 +78,7 @@
AudioBufferSourceNode::~AudioBufferSourceNode()
{
+ clearPannerNode();
uninitialize();
}
@@ -385,7 +386,7 @@
double AudioBufferSourceNode::totalPitchRate()
{
double dopplerRate = 1.0;
- if (m_pannerNode.get())
+ if (m_pannerNode)
dopplerRate = m_pannerNode->dopplerRate();
// Incorporate buffer's sample-rate versus AudioContext's sample-rate.
@@ -439,6 +440,33 @@
return !isPlayingOrScheduled() || hasFinished() || !m_buffer;
}
+void AudioBufferSourceNode::setPannerNode(AudioPannerNode* pannerNode)
+{
+ if (m_pannerNode != pannerNode && !hasFinished()) {
+ if (pannerNode)
+ pannerNode->ref(AudioNode::RefTypeConnection);
+ if (m_pannerNode)
+ m_pannerNode->deref(AudioNode::RefTypeConnection);
+
+ m_pannerNode = pannerNode;
+ }
+}
+
+void AudioBufferSourceNode::clearPannerNode()
+{
+ if (m_pannerNode) {
+ m_pannerNode->deref(AudioNode::RefTypeConnection);
+ m_pannerNode = 0;
+ }
+}
+
+void AudioBufferSourceNode::finish()
+{
+ clearPannerNode();
+ ASSERT(!m_pannerNode);
+ AudioScheduledSourceNode::finish();
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.h (119301 => 119302)
--- trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.h 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.h 2012-06-02 00:09:04 UTC (rev 119302)
@@ -79,11 +79,15 @@
AudioParam* playbackRate() { return m_playbackRate.get(); }
// If a panner node is set, then we can incorporate doppler shift into the playback pitch rate.
- void setPannerNode(PassRefPtr<AudioPannerNode> pannerNode) { m_pannerNode = pannerNode; }
+ void setPannerNode(AudioPannerNode*);
+ void clearPannerNode();
// If we are no longer playing, propogate silence ahead to downstream nodes.
virtual bool propagatesSilence() const;
+ // AudioScheduledSourceNode
+ virtual void finish() OVERRIDE;
+
private:
AudioBufferSourceNode(AudioContext*, float sampleRate);
@@ -123,8 +127,9 @@
// m_lastGain provides continuity when we dynamically adjust the gain.
float m_lastGain;
- // We optionally keep track of a panner node which has a doppler shift that is incorporated into the pitch rate.
- RefPtr<AudioPannerNode> m_pannerNode;
+ // We optionally keep track of a panner node which has a doppler shift that is incorporated into
+ // the pitch rate. We manually manage ref-counting because we want to use RefTypeConnection.
+ AudioPannerNode* m_pannerNode;
// This synchronizes process() with setBuffer() which can cause dynamic channel count changes.
mutable Mutex m_processLock;
Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp (119301 => 119302)
--- trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp 2012-06-02 00:09:04 UTC (rev 119302)
@@ -659,10 +659,10 @@
return currentThread() == m_graphOwnerThread;
}
-void AudioContext::addDeferredFinishDeref(AudioNode* node, AudioNode::RefType refType)
+void AudioContext::addDeferredFinishDeref(AudioNode* node)
{
ASSERT(isAudioThread());
- m_deferredFinishDerefList.append(AudioContext::RefInfo(node, refType));
+ m_deferredFinishDerefList.append(node);
}
void AudioContext::handlePreRenderTasks()
@@ -718,9 +718,8 @@
{
ASSERT(isAudioThread() && isGraphOwner());
for (unsigned i = 0; i < m_deferredFinishDerefList.size(); ++i) {
- AudioNode* node = m_deferredFinishDerefList[i].m_node;
- AudioNode::RefType refType = m_deferredFinishDerefList[i].m_refType;
- node->finishDeref(refType);
+ AudioNode* node = m_deferredFinishDerefList[i];
+ node->finishDeref(AudioNode::RefTypeConnection);
}
m_deferredFinishDerefList.clear();
Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.h (119301 => 119302)
--- trunk/Source/WebCore/Modules/webaudio/AudioContext.h 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.h 2012-06-02 00:09:04 UTC (rev 119302)
@@ -213,7 +213,7 @@
};
// In AudioNode::deref() a tryLock() is used for calling finishDeref(), but if it fails keep track here.
- void addDeferredFinishDeref(AudioNode*, AudioNode::RefType);
+ void addDeferredFinishDeref(AudioNode*);
// In the audio thread at the start of each render cycle, we'll call handleDeferredFinishDerefs().
void handleDeferredFinishDerefs();
@@ -308,19 +308,8 @@
volatile ThreadIdentifier m_audioThread;
volatile ThreadIdentifier m_graphOwnerThread; // if the lock is held then this is the thread which owns it, otherwise == UndefinedThreadIdentifier
- // Deferred de-referencing.
- struct RefInfo {
- RefInfo(AudioNode* node, AudioNode::RefType refType)
- : m_node(node)
- , m_refType(refType)
- {
- }
- AudioNode* m_node;
- AudioNode::RefType m_refType;
- };
-
// Only accessed in the audio thread.
- Vector<RefInfo> m_deferredFinishDerefList;
+ Vector<AudioNode*> m_deferredFinishDerefList;
// HRTF Database loader
RefPtr<HRTFDatabaseLoader> m_hrtfDatabaseLoader;
Modified: trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp (119301 => 119302)
--- trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp 2012-06-02 00:09:04 UTC (rev 119302)
@@ -350,7 +350,8 @@
} else {
// We were unable to get the lock, so put this in a list to finish up later.
ASSERT(context()->isAudioThread());
- context()->addDeferredFinishDeref(this, refType);
+ ASSERT(refType == RefTypeConnection);
+ context()->addDeferredFinishDeref(this);
}
// Once AudioContext::uninitialize() is called there's no more chances for deleteMarkedNodes() to get called, so we call here.
Modified: trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h (119301 => 119302)
--- trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h 2012-06-01 23:54:36 UTC (rev 119301)
+++ trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.h 2012-06-02 00:09:04 UTC (rev 119302)
@@ -78,7 +78,7 @@
size_t& nonSilentFramesToProcess);
// Called when we have no more sound to play or the noteOff() time has been reached.
- void finish();
+ virtual void finish();
PlaybackState m_playbackState;