diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
| commit | 41386e9cb918eed93b3f13648cbef387e371e451 (patch) | |
| tree | a97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp | |
| parent | e15dd966d523731101f70ccf768bba12435a0208 (diff) | |
| download | WebKitGtk-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.cpp | 65 |
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 |
