diff --git a/src/audio/MemoryPCMStream.cpp b/src/audio/MemoryPCMStream.cpp new file mode 100644 index 00000000..7fcf4b0c --- /dev/null +++ b/src/audio/MemoryPCMStream.cpp @@ -0,0 +1,63 @@ +#include "MemoryPCMStream.hpp" + +#include + +using namespace audio; + +MemoryPCMStream::MemoryPCMStream( + uint sampleRate, uint channels, uint bitsPerSample +) + : sampleRate(sampleRate), channels(channels), bitsPerSample(bitsPerSample) { +} + +void MemoryPCMStream::feed(util::span bytes) { + buffer.insert(buffer.end(), bytes.begin(), bytes.end()); +} + +bool MemoryPCMStream::isOpen() const { + return open; +} + +void MemoryPCMStream::close() { + open = false; + buffer = {}; +} + +size_t MemoryPCMStream::read(char* dst, size_t bufferSize) { + if (!open) { + return PCMStream::ERROR; + } + if (buffer.empty()) { + return 0; + } + size_t count = std::min(bufferSize, buffer.size()); + std::memcpy(dst, buffer.data(), count); + buffer.erase(buffer.begin(), buffer.begin() + count); + return count; +} + +size_t MemoryPCMStream::getTotalSamples() const { + return 0; +} + +duration_t MemoryPCMStream::getTotalDuration() const { + return 0.0; +} + +uint MemoryPCMStream::getChannels() const { + return channels; +} + +uint MemoryPCMStream::getSampleRate() const { + return sampleRate; +} + +uint MemoryPCMStream::getBitsPerSample() const { + return bitsPerSample; +} + +bool MemoryPCMStream::isSeekable() const { + return false; +} + +void MemoryPCMStream::seek(size_t position) {} diff --git a/src/audio/MemoryPCMStream.hpp b/src/audio/MemoryPCMStream.hpp new file mode 100644 index 00000000..1f94d27e --- /dev/null +++ b/src/audio/MemoryPCMStream.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include + +#include "audio.hpp" +#include "util/span.hpp" + +namespace audio { + class MemoryPCMStream : public PCMStream { + public: + MemoryPCMStream(uint sampleRate, uint channels, uint bitsPerSample); + + void feed(util::span bytes); + + bool isOpen() const override; + + void close() override; + + size_t read(char* buffer, size_t bufferSize) override; + + size_t getTotalSamples() const override; + + duration_t getTotalDuration() const override; + + uint getChannels() const override; + + uint getSampleRate() const override; + + uint getBitsPerSample() const override; + + bool isSeekable() const override; + + void seek(size_t position) override; + private: + uint sampleRate; + uint channels; + uint bitsPerSample; + bool open = true; + + std::vector buffer; + }; +}