#pragma once #include "buffer.h" #include "randomaccessaudioreadable.h" #include #include #include #include struct FfmpegState; struct FfmpegDataSource { virtual ~FfmpegDataSource() = default; virtual size_t size() = 0; virtual size_t read(size_t offset, size_t count, uint8_t *out) = 0; virtual bool isCompleted() const = 0; }; EMSCRIPTEN_DECLARE_VAL_TYPE(FfmpegAudioBufferPromise); EMSCRIPTEN_DECLARE_VAL_TYPE(FfmpegByteArrayType); EMSCRIPTEN_DECLARE_VAL_TYPE(FfmpegReadCallbackType); EMSCRIPTEN_DECLARE_VAL_TYPE(FfmpegCloseCallbackType); class FfmpegAudioBuffer final : public RandomAccessAudioReadable { int token; int nextFrameOffset; float streamReadOffset; bool createdOnMainThread; std::shared_ptr data; std::unique_ptr ffmpegState; emscripten::val completedBlankPromise; void reset(); friend class FfmpegLibrary; public: FfmpegAudioBuffer(int token, float streamReadOffset = 0.0f); virtual ~FfmpegAudioBuffer(); static std::shared_ptr createFromUrl(const std::string &url, const std::optional &uuid = std::nullopt); static std::shared_ptr createFromUrlStreaming(const std::string &url, const std::optional &uuid = std::nullopt, std::optional streamReadOffset = std::nullopt); static std::shared_ptr createFromUuid(const std::string &uuid); static std::shared_ptr createFromByteArray(const FfmpegByteArrayType &source, const std::optional &uuid = std::nullopt); static std::shared_ptr createFromByteVector(const std::vector &source); static std::shared_ptr createFromReadCallback(size_t size, FfmpegReadCallbackType readCallback, FfmpegCloseCallbackType closeCallback); static bool addUuidAlias(const std::string &existingUuid, const std::string &newUuid); void setData(const std::shared_ptr &data); void resolvePromise(const std::shared_ptr &buffer); FfmpegAudioBufferPromise getCompletedPromise() const; virtual void read(int frameOffset, std::shared_ptr output) override { auto outputAsSlice = output->slice(0, output->getFrameCount()); read(frameOffset, outputAsSlice); } virtual void read(int frameOffset, BufferF32 output) override; virtual int getSampleRate() const override; virtual int getChannelCount() const override; virtual int getFrameCount() const override; int getNextFrameOffset() const { return nextFrameOffset; } bool isCompleted() const; float getAvailableDuration() const; std::shared_ptr clone() const override { return createClone(); } std::shared_ptr createClone() const; };