summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp')
-rw-r--r--Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp58
1 files changed, 46 insertions, 12 deletions
diff --git a/Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp b/Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp
index 6b4f9b85a..b2542d326 100644
--- a/Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp
+++ b/Source/WebCore/Modules/webaudio/DefaultAudioDestinationNode.cpp
@@ -28,17 +28,18 @@
#include "DefaultAudioDestinationNode.h"
-#include "ExceptionCode.h"
+#include "AudioContext.h"
+#include "AudioDestination.h"
#include "Logging.h"
+#include "ScriptExecutionContext.h"
#include <wtf/MainThread.h>
const unsigned EnabledInputChannels = 2;
namespace WebCore {
-DefaultAudioDestinationNode::DefaultAudioDestinationNode(AudioContext* context)
+DefaultAudioDestinationNode::DefaultAudioDestinationNode(AudioContext& context)
: AudioDestinationNode(context, AudioDestination::hardwareSampleRate())
- , m_numberOfInputChannels(0)
{
// Node-specific default mixing rules.
m_channelCount = 2;
@@ -104,12 +105,38 @@ void DefaultAudioDestinationNode::startRendering()
m_destination->start();
}
-unsigned long DefaultAudioDestinationNode::maxChannelCount() const
+void DefaultAudioDestinationNode::resume(Function<void ()>&& function)
+{
+ ASSERT(isInitialized());
+ if (isInitialized())
+ m_destination->start();
+ if (auto scriptExecutionContext = context().scriptExecutionContext())
+ scriptExecutionContext->postTask(WTFMove(function));
+}
+
+void DefaultAudioDestinationNode::suspend(Function<void ()>&& function)
+{
+ ASSERT(isInitialized());
+ if (isInitialized())
+ m_destination->stop();
+ if (auto scriptExecutionContext = context().scriptExecutionContext())
+ scriptExecutionContext->postTask(WTFMove(function));
+}
+
+void DefaultAudioDestinationNode::close(Function<void()>&& function)
+{
+ ASSERT(isInitialized());
+ uninitialize();
+ if (auto scriptExecutionContext = context().scriptExecutionContext())
+ scriptExecutionContext->postTask(WTFMove(function));
+}
+
+unsigned DefaultAudioDestinationNode::maxChannelCount() const
{
return AudioDestination::maxChannelCount();
}
-void DefaultAudioDestinationNode::setChannelCount(unsigned long channelCount, ExceptionCode& ec)
+ExceptionOr<void> DefaultAudioDestinationNode::setChannelCount(unsigned channelCount)
{
// The channelCount for the input to this node controls the actual number of channels we
// send to the audio hardware. It can only be set depending on the maximum number of
@@ -117,20 +144,27 @@ void DefaultAudioDestinationNode::setChannelCount(unsigned long channelCount, Ex
ASSERT(isMainThread());
- if (!maxChannelCount() || channelCount > maxChannelCount()) {
- ec = INVALID_STATE_ERR;
- return;
- }
+ if (!maxChannelCount() || channelCount > maxChannelCount())
+ return Exception { INVALID_STATE_ERR };
- unsigned long oldChannelCount = this->channelCount();
- AudioNode::setChannelCount(channelCount, ec);
+ auto oldChannelCount = this->channelCount();
+ auto result = AudioNode::setChannelCount(channelCount);
+ if (result.hasException())
+ return result;
- if (!ec && this->channelCount() != oldChannelCount && isInitialized()) {
+ if (this->channelCount() != oldChannelCount && isInitialized()) {
// Re-create destination.
m_destination->stop();
createDestination();
m_destination->start();
}
+
+ return { };
+}
+
+bool DefaultAudioDestinationNode::isPlaying()
+{
+ return m_destination && m_destination->isPlaying();
}
} // namespace WebCore