BaseAudioSharedUnit.h [plain text]
#pragma once
#if ENABLE(MEDIA_STREAM)
#include "RealtimeMediaSourceCapabilities.h"
#include <pal/cf/CoreMediaSoftLink.h>
#include <wtf/Function.h>
#include <wtf/HashSet.h>
#include <wtf/MediaTime.h>
#include <wtf/RecursiveLockAdapter.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class AudioStreamDescription;
class CoreAudioCaptureSource;
class PlatformAudioData;
class BaseAudioSharedUnit {
public:
BaseAudioSharedUnit();
virtual ~BaseAudioSharedUnit() = default;
void startProducingData();
void stopProducingData();
void reconfigure();
virtual bool isProducingData() const = 0;
virtual void delaySamples(Seconds) { }
void prepareForNewCapture();
OSStatus resume();
OSStatus suspend();
bool isSuspended() const { return m_suspended; }
double volume() const { return m_volume; }
int sampleRate() const { return m_sampleRate; }
bool enableEchoCancellation() const { return m_enableEchoCancellation; }
void setVolume(double volume) { m_volume = volume; }
void setSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
void setEnableEchoCancellation(bool enableEchoCancellation) { m_enableEchoCancellation = enableEchoCancellation; }
void addClient(CoreAudioCaptureSource&);
void removeClient(CoreAudioCaptureSource&);
void clearClients();
virtual bool hasAudioUnit() const = 0;
virtual void setCaptureDevice(String&&, uint32_t) = 0;
virtual CapabilityValueOrRange sampleRateCapacities() const = 0;
protected:
void forEachClient(const Function<void(CoreAudioCaptureSource&)>&) const;
bool hasClients() const { return !m_clients.isEmpty(); }
void captureFailed();
virtual void cleanupAudioUnit() = 0;
virtual OSStatus startInternal() = 0;
virtual void stopInternal() = 0;
virtual OSStatus reconfigureAudioUnit() = 0;
virtual void resetSampleRate();
void setSuspended(bool value) { m_suspended = value; }
void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t );
private:
OSStatus startUnit();
bool m_enableEchoCancellation { true };
double m_volume { 1 };
int m_sampleRate;
bool m_suspended { false };
bool m_needsReconfiguration { false };
int32_t m_producingCount { 0 };
HashSet<CoreAudioCaptureSource*> m_clients;
mutable RecursiveLock m_clientsLock;
};
}
#endif // ENABLE(MEDIA_STREAM)