Move more logic from AudioDestinationNode to its subclasses
[WebKit-https.git] / Source / WebCore / Modules / webaudio / DefaultAudioDestinationNode.h
index 94cbaf9ade80039ec6c9828315272b0792921285..e5e47858a01602ba682241241821d7c852cefa5f 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011, Google Inc. All rights reserved.
+ * Copyright (C) 2020-2021, Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #pragma once
 
 #include "AudioDestinationNode.h"
+#include "AudioIOCallback.h"
 
 namespace WebCore {
 
 class AudioContext;
 class AudioDestination;
     
-class DefaultAudioDestinationNode final : public AudioDestinationNode {
+class DefaultAudioDestinationNode final : public AudioDestinationNode, public AudioIOCallback {
     WTF_MAKE_ISO_ALLOCATED(DefaultAudioDestinationNode);
 public:
-    explicit DefaultAudioDestinationNode(AudioContext&, Optional<float> = WTF::nullopt);
+    explicit DefaultAudioDestinationNode(AudioContext&, Optional<float> sampleRate = WTF::nullopt);
+    ~DefaultAudioDestinationNode();
 
     AudioContext& context();
     const AudioContext& context() const;
-    
-    virtual ~DefaultAudioDestinationNode();
 
     unsigned framesPerBuffer() const;
     
     void startRendering(CompletionHandler<void(Optional<Exception>&&)>&&) final;
-    void resume(CompletionHandler<void(Optional<Exception>&&)>&&) final;
-    void suspend(CompletionHandler<void(Optional<Exception>&&)>&&) final;
-    void close(CompletionHandler<void()>&&) final;
+    void resume(CompletionHandler<void(Optional<Exception>&&)>&&);
+    void suspend(CompletionHandler<void(Optional<Exception>&&)>&&);
+    void close(CompletionHandler<void()>&&);
+
+    void setMuted(bool muted) { m_muted = muted; }
+    bool isPlayingAudio() const { return m_isEffectivelyPlayingAudio; }
 
 private:
     void createDestination();
     void clearDestination();
     void recreateDestination();
 
+    // AudioIOCallback
+    // The audio hardware calls render() to get the next render quantum of audio into destinationBus.
+    // It will optionally give us local/live audio input in sourceBus (if it's not 0).
+    void render(AudioBus* sourceBus, AudioBus* destinationBus, size_t numberOfFrames, const AudioIOPosition& outputPosition) final;
+    void isPlayingDidChange() final;
+
+    void setIsSilent(bool);
+    void updateIsEffectivelyPlayingAudio();
+
     Function<void(Function<void()>&&)> dispatchToRenderThreadFunction();
 
     void initialize() final;
@@ -64,12 +77,14 @@ private:
     void enableInput(const String& inputDeviceId) final;
     void restartRendering() final;
     unsigned maxChannelCount() const final;
-    bool isPlaying() final;
 
     RefPtr<AudioDestination> m_destination;
-    bool m_wasDestinationStarted { false };
     String m_inputDeviceId;
     unsigned m_numberOfInputChannels { 0 };
+    bool m_wasDestinationStarted { false };
+    bool m_isEffectivelyPlayingAudio { false };
+    bool m_isSilent { true };
+    bool m_muted { false };
 };
 
 } // namespace WebCore