AudioSampleDataSource.h [plain text]
#pragma once
#if ENABLE(MEDIA_STREAM)
#include "AudioSampleBufferList.h"
#include <CoreAudio/CoreAudioTypes.h>
#include <wtf/MediaTime.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/text/WTFString.h>
typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
namespace WebCore {
class CAAudioStreamDescription;
class CARingBuffer;
class AudioSampleDataSource : public RefCounted<AudioSampleDataSource> {
public:
static Ref<AudioSampleDataSource> create(size_t);
~AudioSampleDataSource();
OSStatus setInputFormat(const CAAudioStreamDescription&);
OSStatus setOutputFormat(const CAAudioStreamDescription&);
void pushSamples(const MediaTime&, const PlatformAudioData&, size_t);
void pushSamples(const AudioStreamBasicDescription&, CMSampleBufferRef);
enum PullMode { Copy, Mix };
bool pullSamples(AudioSampleBufferList&, size_t, uint64_t, double, PullMode);
bool pullSamples(AudioBufferList&, size_t, uint64_t, double, PullMode);
bool pullAvalaibleSamplesAsChunks(AudioBufferList&, size_t frameCount, uint64_t timeStamp, Function<void()>&&);
void setPaused(bool);
void setVolume(float volume) { m_volume = volume; }
float volume() const { return m_volume; }
void setMuted(bool muted) { m_muted = muted; }
bool muted() const { return m_muted; }
protected:
AudioSampleDataSource(size_t);
OSStatus setupConverter();
bool pullSamplesInternal(AudioBufferList&, size_t&, uint64_t, double, PullMode);
void pushSamplesInternal(const AudioBufferList&, const MediaTime&, size_t frameCount);
std::unique_ptr<CAAudioStreamDescription> m_inputDescription;
std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
MediaTime hostTime() const;
uint64_t m_lastPushedSampleCount { 0 };
MediaTime m_expectedNextPushedSampleTime { MediaTime::invalidTime() };
double m_hostTime { -1 };
MediaTime m_inputSampleOffset;
int64_t m_outputSampleOffset { 0 };
AudioConverterRef m_converter;
RefPtr<AudioSampleBufferList> m_scratchBuffer;
std::unique_ptr<CARingBuffer> m_ringBuffer;
size_t m_maximumSampleCount { 0 };
float m_volume { 1.0 };
bool m_muted { false };
bool m_paused { true };
bool m_transitioningFromPaused { true };
};
}
#endif // ENABLE(MEDIA_STREAM)