Use channel class for main audio output
This commit is contained in:
parent
26b44a9fa3
commit
9b3afc9865
4 changed files with 13 additions and 7 deletions
|
|
@ -68,7 +68,7 @@ struct audio_app
|
||||||
left_volume_ = audio::volume(dup1, 0.5f, 0.1f);
|
left_volume_ = audio::volume(dup1, 0.5f, 0.1f);
|
||||||
right_volume_ = audio::volume(dup2, 0.5f, 0.1f);
|
right_volume_ = audio::volume(dup2, 0.5f, 0.1f);
|
||||||
auto result = audio::stereo(left_volume_, right_volume_);
|
auto result = audio::stereo(left_volume_, right_volume_);
|
||||||
engine_.output(result);
|
engine_.output()->stream(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_key_down(SDL_Keycode key) override
|
void on_key_down(SDL_Keycode key) override
|
||||||
|
|
@ -90,7 +90,8 @@ struct audio_app
|
||||||
if (channels_.contains(key))
|
if (channels_.contains(key))
|
||||||
{
|
{
|
||||||
auto & ch = channels_[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);
|
channels_.erase(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ namespace psemek::audio
|
||||||
|
|
||||||
struct channel
|
struct channel
|
||||||
{
|
{
|
||||||
|
channel() = default;
|
||||||
|
|
||||||
channel(stream_ptr stream)
|
channel(stream_ptr stream)
|
||||||
: stream_(std::move(stream))
|
: stream_(std::move(stream))
|
||||||
{}
|
{}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <psemek/audio/stream.hpp>
|
#include <psemek/audio/stream.hpp>
|
||||||
#include <psemek/audio/track.hpp>
|
#include <psemek/audio/track.hpp>
|
||||||
|
#include <psemek/audio/channel.hpp>
|
||||||
|
|
||||||
#include <psemek/util/pimpl.hpp>
|
#include <psemek/util/pimpl.hpp>
|
||||||
#include <psemek/util/span.hpp>
|
#include <psemek/util/span.hpp>
|
||||||
|
|
@ -21,7 +22,7 @@ namespace psemek::audio
|
||||||
track_ptr load(float const * data, std::size_t sample_count, bool copy = true);
|
track_ptr load(float const * data, std::size_t sample_count, bool copy = true);
|
||||||
track_ptr load(util::span<float> data, bool copy = true);
|
track_ptr load(util::span<float> data, bool copy = true);
|
||||||
|
|
||||||
stream_ptr output(stream_ptr stream);
|
channel_ptr output();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
psemek_declare_pimpl
|
psemek_declare_pimpl
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ namespace psemek::audio
|
||||||
std::vector<float> buffer;
|
std::vector<float> buffer;
|
||||||
bool thread_registered = false;
|
bool thread_registered = false;
|
||||||
|
|
||||||
stream_ptr output;
|
channel_ptr output;
|
||||||
|
|
||||||
impl();
|
impl();
|
||||||
~impl();
|
~impl();
|
||||||
|
|
@ -49,6 +49,8 @@ namespace psemek::audio
|
||||||
SDL_PauseAudioDevice(device, 0);
|
SDL_PauseAudioDevice(device, 0);
|
||||||
|
|
||||||
log::info() << "Initialized audio: " << static_cast<int>(obtained.channels) << " channels, " << obtained.freq << " Hz, " << obtained.samples << " samples";
|
log::info() << "Initialized audio: " << static_cast<int>(obtained.channels) << " channels, " << obtained.freq << " Hz, " << obtained.samples << " samples";
|
||||||
|
|
||||||
|
output = std::make_shared<channel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
engine::impl::~impl()
|
engine::impl::~impl()
|
||||||
|
|
@ -59,7 +61,7 @@ namespace psemek::audio
|
||||||
void engine::impl::callback(void * userdata, std::uint8_t * dst_u8, int len)
|
void engine::impl::callback(void * userdata, std::uint8_t * dst_u8, int len)
|
||||||
{
|
{
|
||||||
auto self = static_cast<impl *>(userdata);
|
auto self = static_cast<impl *>(userdata);
|
||||||
stream_ptr output = std::atomic_load(&(self->output));
|
stream_ptr output = self->output->stream();
|
||||||
std::int16_t * dst = reinterpret_cast<std::int16_t *>(dst_u8);
|
std::int16_t * dst = reinterpret_cast<std::int16_t *>(dst_u8);
|
||||||
|
|
||||||
if (!self->thread_registered)
|
if (!self->thread_registered)
|
||||||
|
|
@ -101,9 +103,9 @@ namespace psemek::audio
|
||||||
return load(data.data(), data.size(), copy);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue