AudioDestinationNode.h [plain text]
#ifndef AudioDestinationNode_h
#define AudioDestinationNode_h
#include "AudioBuffer.h"
#include "AudioBus.h"
#include "AudioIOCallback.h"
#include "AudioNode.h"
#include "AudioSourceProvider.h"
namespace WebCore {
class AudioBus;
class AudioContext;
class AudioDestinationNode : public AudioNode, public AudioIOCallback {
public:
AudioDestinationNode(AudioContext*, float sampleRate);
virtual ~AudioDestinationNode();
virtual void process(size_t) override { }; virtual void reset() override { m_currentSampleFrame = 0; }
virtual void render(AudioBus* sourceBus, AudioBus* destinationBus, size_t numberOfFrames) override;
size_t currentSampleFrame() const { return m_currentSampleFrame; }
double currentTime() const { return currentSampleFrame() / static_cast<double>(sampleRate()); }
virtual unsigned long maxChannelCount() const { return 0; }
virtual void enableInput(const String& inputDeviceId) = 0;
virtual void startRendering() = 0;
virtual void resume(std::function<void()>) { }
virtual void suspend(std::function<void()>) { }
virtual void close(std::function<void()>) { }
AudioSourceProvider* localAudioInputProvider() { return &m_localAudioInputProvider; }
virtual bool isPlaying() { return false; }
virtual void isPlayingDidChange() override;
bool isPlayingAudio() const { return m_isEffectivelyPlayingAudio; }
void setMuted(bool muted) { m_muted = muted; }
protected:
class LocalAudioInputProvider : public AudioSourceProvider {
public:
LocalAudioInputProvider()
: m_sourceBus(AudioBus::create(2, AudioNode::ProcessingSizeInFrames)) {
}
void set(AudioBus* bus)
{
if (bus)
m_sourceBus->copyFrom(*bus);
}
virtual void provideInput(AudioBus* destinationBus, size_t numberOfFrames) override
{
bool isGood = destinationBus && destinationBus->length() == numberOfFrames && m_sourceBus->length() == numberOfFrames;
ASSERT(isGood);
if (isGood)
destinationBus->copyFrom(*m_sourceBus);
}
private:
RefPtr<AudioBus> m_sourceBus;
};
virtual double tailTime() const override { return 0; }
virtual double latencyTime() const override { return 0; }
void setIsSilent(bool);
void updateIsEffectivelyPlayingAudio();
size_t m_currentSampleFrame;
LocalAudioInputProvider m_localAudioInputProvider;
bool m_isSilent;
bool m_isEffectivelyPlayingAudio;
bool m_muted;
};
}
#endif // AudioDestinationNode_h