From 9d58904a66d76f64068fa79858d0f92328caf981 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 6 Oct 2022 15:17:46 +0300 Subject: [PATCH] Add truncate effect --- .../include/psemek/audio/effect/truncate.hpp | 11 +++++ libs/audio/source/effect/truncate.cpp | 47 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 libs/audio/include/psemek/audio/effect/truncate.hpp create mode 100644 libs/audio/source/effect/truncate.cpp diff --git a/libs/audio/include/psemek/audio/effect/truncate.hpp b/libs/audio/include/psemek/audio/effect/truncate.hpp new file mode 100644 index 00000000..71275f31 --- /dev/null +++ b/libs/audio/include/psemek/audio/effect/truncate.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +namespace psemek::audio +{ + + stream_ptr truncate(stream_ptr stream, duration length); + +} diff --git a/libs/audio/source/effect/truncate.cpp b/libs/audio/source/effect/truncate.cpp new file mode 100644 index 00000000..c9e522b7 --- /dev/null +++ b/libs/audio/source/effect/truncate.cpp @@ -0,0 +1,47 @@ +#include + +namespace psemek::audio +{ + + namespace + { + + struct truncate_impl + : stream + { + truncate_impl(stream_ptr stream, duration length) + : stream_(std::move(stream)) + , length_(length) + {} + + std::optional length() const override + { + return length_.samples(); + } + + std::size_t read(float * data, std::size_t sample_count) override + { + auto played = stream_->played(); + auto result = std::min(length_.samples() - played, sample_count); + result = stream_->read(data, result); + return result; + } + + std::size_t played() const override + { + return stream_->played(); + } + + private: + stream_ptr stream_; + duration length_; + }; + + } + + stream_ptr truncate(stream_ptr stream, duration length) + { + return std::make_shared(std::move(stream), length); + } + +}