Tone Generation
publish / publish (push) Failing after 10m56s

This commit is contained in:
khodowany
2026-09-18 01:17:18 -05:00
parent 59b96ddf95
commit 95f6f6aaad
9 changed files with 465 additions and 1 deletions
+4
View File
@@ -8,6 +8,7 @@
#include <modulus.hpp>
#include <sonus/config.hpp>
#include <sonus/sequence.hpp>
namespace sonus {
@@ -33,6 +34,9 @@ public:
auto play_file(std::filesystem::path const &path, sonus::playback_options options = {}) -> std::expected<std::uint64_t, modulus::error>;
auto stop(std::uint64_t handle) -> std::expected<void, modulus::error>;
auto stop_all() -> void;
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 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;
+79
View File
@@ -0,0 +1,79 @@
#pragma once
#include <atomic>
#include <cstdint>
#include <expected>
#include <filesystem>
#include <memory>
#include <vector>
#include <modulus.hpp>
namespace sonus {
namespace detail {
struct sequence_state;
class sequence_player;
}
enum class playback_status : std::uint8_t {
PLAYING,
COMPLETED,
STOPPED,
FAILED,
};
struct sample_buffer {
std::uint32_t sample_rate{};
std::vector<std::float32_t> frames{};
std::uint64_t loop_start{};
std::uint64_t loop_end{};
};
struct sample_event {
std::uint32_t sample{};
std::uint64_t start_frame{};
std::uint64_t duration_frames{};
std::float32_t gain{1.0F};
};
struct sample_sequence {
std::vector<sonus::sample_buffer> samples{};
std::vector<sonus::sample_event> events{};
std::vector<std::float32_t> release_envelope{};
std::uint64_t duration_frames{};
std::uint32_t max_voices{64};
std::float32_t gain{0.25F};
};
class prepared_sequence {
public:
static auto create(sonus::sample_sequence sequence, std::uint32_t sample_rate) -> std::expected<sonus::prepared_sequence, modulus::error>;
prepared_sequence(prepared_sequence const &) = delete;
auto operator=(prepared_sequence const &) -> prepared_sequence & = delete;
prepared_sequence(prepared_sequence &&) noexcept;
auto operator=(prepared_sequence &&) noexcept -> prepared_sequence &;
~prepared_sequence();
private:
friend class sonus::detail::sequence_player;
explicit prepared_sequence(std::unique_ptr<sonus::detail::sequence_state> state);
std::unique_ptr<sonus::detail::sequence_state> state_;
};
class playback_session {
public:
playback_session() = default;
explicit playback_session(std::shared_ptr<std::atomic<sonus::playback_status>> status);
auto status() const -> sonus::playback_status;
auto stop() const -> void;
private:
std::shared_ptr<std::atomic<sonus::playback_status>> status_{};
};
auto load_sample(std::filesystem::path const &path, std::uint32_t sample_rate) -> std::expected<sonus::sample_buffer, modulus::error>;
}