diff --git a/examples/audio.cpp b/examples/audio.cpp index 3a821a1f..8370efc1 100644 --- a/examples/audio.cpp +++ b/examples/audio.cpp @@ -68,7 +68,7 @@ struct audio_app left_volume_ = audio::volume(dup1, 0.5f, 0.1f); right_volume_ = audio::volume(dup2, 0.5f, 0.1f); auto result = audio::stereo(left_volume_, right_volume_); - engine_.output(result); + engine_.output()->stream(result); } void on_key_down(SDL_Keycode key) override @@ -90,7 +90,8 @@ struct audio_app if (channels_.contains(key)) { auto & ch = channels_[key]; - ch->stream(audio::fade_out(ch->stream(), 0.01f)); + if (auto s = ch->stream()) + ch->stream(audio::fade_out(s, 0.01f)); channels_.erase(key); } } diff --git a/libs/audio/include/psemek/audio/channel.hpp b/libs/audio/include/psemek/audio/channel.hpp index 83d43606..3df9cfef 100644 --- a/libs/audio/include/psemek/audio/channel.hpp +++ b/libs/audio/include/psemek/audio/channel.hpp @@ -10,6 +10,8 @@ namespace psemek::audio struct channel { + channel() = default; + channel(stream_ptr stream) : stream_(std::move(stream)) {} diff --git a/libs/audio/include/psemek/audio/engine.hpp b/libs/audio/include/psemek/audio/engine.hpp index ab51e87b..2731262f 100644 --- a/libs/audio/include/psemek/audio/engine.hpp +++ b/libs/audio/include/psemek/audio/engine.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -21,7 +22,7 @@ namespace psemek::audio track_ptr load(float const * data, std::size_t sample_count, bool copy = true); track_ptr load(util::span data, bool copy = true); - stream_ptr output(stream_ptr stream); + channel_ptr output(); private: psemek_declare_pimpl diff --git a/libs/audio/source/engine.cpp b/libs/audio/source/engine.cpp index 8aeba41d..251f62b9 100644 --- a/libs/audio/source/engine.cpp +++ b/libs/audio/source/engine.cpp @@ -23,7 +23,7 @@ namespace psemek::audio std::vector buffer; bool thread_registered = false; - stream_ptr output; + channel_ptr output; impl(); ~impl(); @@ -49,6 +49,8 @@ namespace psemek::audio SDL_PauseAudioDevice(device, 0); log::info() << "Initialized audio: " << static_cast(obtained.channels) << " channels, " << obtained.freq << " Hz, " << obtained.samples << " samples"; + + output = std::make_shared(); } engine::impl::~impl() @@ -59,7 +61,7 @@ namespace psemek::audio void engine::impl::callback(void * userdata, std::uint8_t * dst_u8, int len) { auto self = static_cast(userdata); - stream_ptr output = std::atomic_load(&(self->output)); + stream_ptr output = self->output->stream(); std::int16_t * dst = reinterpret_cast(dst_u8); if (!self->thread_registered) @@ -101,9 +103,9 @@ namespace psemek::audio return load(data.data(), data.size(), copy); } - stream_ptr engine::output(stream_ptr stream) + channel_ptr engine::output() { - return std::atomic_exchange(&(impl().output), std::move(stream)); + return impl().output; } }