Playback
publish / publish (push) Successful in 13m11s

This commit is contained in:
khodowany
2026-10-06 00:04:22 -05:00
parent 8bedccaa02
commit 3aa3a67e5d
9 changed files with 419 additions and 0 deletions
+2
View File
@@ -9,6 +9,7 @@
#include <modulus.hpp>
#include <sonus/config.hpp>
#include <sonus/sequence.hpp>
#include <sonus/transport.hpp>
namespace sonus {
@@ -37,6 +38,7 @@ public:
auto play_sequence(sonus::sample_sequence sequence) -> std::expected<sonus::playback_session, modulus::error>;
auto play_sequence(sonus::prepared_sequence sequence) -> std::expected<sonus::playback_session, modulus::error>;
auto stop_sequence() -> void;
auto play_transport(sonus::prepared_transport transport) -> std::expected<sonus::transport_session, modulus::error>;
auto is_playing(std::uint64_t handle) -> std::expected<std::bool_t, modulus::error>;
auto collect_finished() -> std::uint64_t;
auto active_sound_count() -> std::uint64_t;
+66
View File
@@ -0,0 +1,66 @@
#pragma once
#include <atomic>
#include <cstdint>
#include <expected>
#include <filesystem>
#include <memory>
#include <vector>
#include <sonus/sequence.hpp>
namespace sonus {
namespace detail {
struct transport_state;
class transport_player;
}
struct click_event {
std::uint64_t frame{};
bool downbeat{};
};
struct transport_config {
std::filesystem::path backing{};
std::filesystem::path beat1{};
std::filesystem::path beat2{};
std::vector<sonus::click_event> clicks{};
std::uint64_t duration_frames{};
std::float32_t click_volume{0.45F};
};
struct transport_progress {
std::atomic<sonus::playback_status> status{sonus::playback_status::PLAYING};
std::atomic<std::uint64_t> frames{};
};
class transport_session {
public:
transport_session() = default;
explicit transport_session(std::shared_ptr<sonus::transport_progress> progress);
auto status() const -> sonus::playback_status;
auto frames() const -> std::uint64_t;
auto stop() const -> void;
private:
std::shared_ptr<sonus::transport_progress> progress_{};
};
class prepared_transport {
public:
static auto create(sonus::transport_config config, std::uint32_t sample_rate, std::uint32_t channels) -> std::expected<sonus::prepared_transport, modulus::error>;
prepared_transport(prepared_transport const &) = delete;
auto operator=(prepared_transport const &) -> prepared_transport & = delete;
prepared_transport(prepared_transport &&) noexcept;
auto operator=(prepared_transport &&) noexcept -> prepared_transport &;
~prepared_transport();
private:
friend class sonus::detail::transport_player;
explicit prepared_transport(std::unique_ptr<sonus::detail::transport_state> state);
std::unique_ptr<sonus::detail::transport_state> state_{};
};
}