summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
commit41386e9cb918eed93b3f13648cbef387e371e451 (patch)
treea97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp
parente15dd966d523731101f70ccf768bba12435a0208 (diff)
downloadWebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp')
-rw-r--r--Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp65
1 files changed, 22 insertions, 43 deletions
diff --git a/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp b/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp
index 723b988d9..0dc2a829a 100644
--- a/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp
+++ b/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp
@@ -137,49 +137,31 @@ void AudioScheduledSourceNode::updateSchedulingInfo(size_t quantumFrameSize,
return;
}
-void AudioScheduledSourceNode::start(ExceptionCode& ec)
-{
- start(0, ec);
-}
-
void AudioScheduledSourceNode::start(double when, ExceptionCode& ec)
{
ASSERT(isMainThread());
- context()->nodeWillBeginPlayback();
+ if (ScriptController::processingUserGesture())
+ context()->removeBehaviorRestriction(AudioContext::RequireUserGestureForAudioStartRestriction);
if (m_playbackState != UNSCHEDULED_STATE) {
ec = INVALID_STATE_ERR;
return;
}
- if (!std::isfinite(when) || (when < 0)) {
- ec = INVALID_STATE_ERR;
- return;
- }
-
m_startTime = when;
m_playbackState = SCHEDULED_STATE;
}
-void AudioScheduledSourceNode::stop(ExceptionCode& ec)
-{
- stop(0, ec);
-}
-
void AudioScheduledSourceNode::stop(double when, ExceptionCode& ec)
{
ASSERT(isMainThread());
- if ((m_playbackState == UNSCHEDULED_STATE) || (m_endTime != UnknownTime)) {
- ec = INVALID_STATE_ERR;
- return;
- }
-
- if (!std::isfinite(when) || (when < 0)) {
+ if (!(m_playbackState == SCHEDULED_STATE || m_playbackState == PLAYING_STATE) || (m_endTime != UnknownTime)) {
ec = INVALID_STATE_ERR;
return;
}
-
+
+ when = std::max<double>(0, when);
m_endTime = when;
}
@@ -195,6 +177,12 @@ void AudioScheduledSourceNode::noteOff(double when, ExceptionCode& ec)
}
#endif
+void AudioScheduledSourceNode::setOnended(PassRefPtr<EventListener> listener)
+{
+ m_hasEndedListener = listener;
+ setAttributeEventListener(eventNames().endedEvent, listener);
+}
+
void AudioScheduledSourceNode::finish()
{
if (m_playbackState != FINISHED_STATE) {
@@ -204,33 +192,24 @@ void AudioScheduledSourceNode::finish()
context()->decrementActiveSourceCount();
}
- if (m_hasEndedListener) {
- callOnMainThread([this] {
- dispatchEvent(Event::create(eventNames().endedEvent, false, false));
- });
- }
+ if (m_hasEndedListener)
+ callOnMainThread(&AudioScheduledSourceNode::notifyEndedDispatch, this);
}
-bool AudioScheduledSourceNode::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
+void AudioScheduledSourceNode::notifyEndedDispatch(void* userData)
{
- bool success = AudioNode::addEventListener(eventType, listener, useCapture);
- if (success && eventType == eventNames().endedEvent)
- m_hasEndedListener = hasEventListeners(eventNames().endedEvent);
- return success;
+ static_cast<AudioScheduledSourceNode*>(userData)->notifyEnded();
}
-bool AudioScheduledSourceNode::removeEventListener(const AtomicString& eventType, EventListener* listener, bool useCapture)
+void AudioScheduledSourceNode::notifyEnded()
{
- bool success = AudioNode::removeEventListener(eventType, listener, useCapture);
- if (success && eventType == eventNames().endedEvent)
- m_hasEndedListener = hasEventListeners(eventNames().endedEvent);
- return success;
-}
+ EventListener* listener = onended();
+ if (!listener)
+ return;
-void AudioScheduledSourceNode::removeAllEventListeners()
-{
- m_hasEndedListener = false;
- AudioNode::removeAllEventListeners();
+ RefPtr<Event> event = Event::create(eventNames().endedEvent, FALSE, FALSE);
+ event->setTarget(this);
+ listener->handleEvent(context()->scriptExecutionContext(), event.get());
}
} // namespace WebCore