Skip to content

Commit

Permalink
Ran clang-format on src and includes
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Kessler <[email protected]>
  • Loading branch information
mikepkes committed Jul 22, 2024
1 parent 8306569 commit dfed795
Show file tree
Hide file tree
Showing 88 changed files with 753 additions and 816 deletions.
19 changes: 8 additions & 11 deletions include/xstudio/audio/audio_output.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,14 @@ class AudioOutputControl {
const float volume,
const bool muted,
const bool audio_repitch,
const bool audio_scrubbing)
{
volume_ = volume;
muted_ = muted;
audio_repitch_ = audio_repitch;
audio_scrubbing_ = audio_scrubbing;
const bool audio_scrubbing) {
volume_ = volume;
muted_ = muted;
audio_repitch_ = audio_repitch;
audio_scrubbing_ = audio_scrubbing;
}

private:

media_reader::AudioBufPtr
pick_audio_buffer(const utility::clock::time_point &tp, const bool drop_old_buffers);

Expand All @@ -101,10 +99,9 @@ class AudioOutputControl {

int fade_in_out_ = {NoFade};

bool audio_repitch_ = {false};
bool audio_repitch_ = {false};
bool audio_scrubbing_ = {false};
float volume_ = {100.0f};
bool muted_ = {false};

float volume_ = {100.0f};
bool muted_ = {false};
};
} // namespace xstudio::audio
241 changes: 114 additions & 127 deletions include/xstudio/audio/audio_output_actor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,103 +12,101 @@ template <typename OutputClassType>
class AudioOutputDeviceActor : public caf::event_based_actor {

public:
AudioOutputDeviceActor(caf::actor_config &cfg, caf::actor samples_actor)
: caf::event_based_actor(cfg),
playing_(false),
waiting_for_samples_(false),
audio_samples_actor_(samples_actor) {

// spdlog::info("Created {} {}", "AudioOutputDeviceActor", OutputClassType::name());
// utility::print_on_exit(this, OutputClassType::name());

try {
auto prefs = global_store::GlobalStoreHelper(system());
utility::JsonStore j;
utility::join_broadcast(this, prefs.get_group(j));
open_output_device(j);
} catch (...) {
open_output_device(utility::JsonStore());
}

behavior_.assign(

[=](xstudio::broadcast::broadcast_down_atom, const caf::actor_addr &) {},

[=](json_store::update_atom,
const utility::JsonStore & /*change*/,
const std::string & /*path*/,
const utility::JsonStore &full) {
delegate(actor_cast<caf::actor>(this), json_store::update_atom_v, full);
},
[=](json_store::update_atom, const utility::JsonStore & /*j*/) {
// TODO: restart soundcard connection with new prefs
if (output_device_) {
output_device_->initialize_sound_card();
}
},
[=](utility::event_atom, playhead::play_atom, const bool is_playing) {
if (!is_playing && output_device_) {
// this stops the loop pushing samples to the soundcard
playing_ = false;
output_device_->disconnect_from_soundcard();
} else if (is_playing && !playing_) {
// start loop
playing_ = true;
if (output_device_)
output_device_->connect_to_soundcard();
anon_send(actor_cast<caf::actor>(this), push_samples_atom_v);
}
},
[=](push_samples_atom) {
if (!output_device_)
return;
// The 'waiting_for_samples_' flag allows us to ensure that we
// don't have multiple requests for samples to play in flight -
// since each response to a request then sends another
// 'push_samples_atom' atom (to keep playback running), having multiple
// requests in flight completely messes up the audio playback as
// essentially we have two loops running within the single actor.
if (waiting_for_samples_ || !playing_)
return;
waiting_for_samples_ = true;

const long num_samps_soundcard_wants = (long)output_device_->desired_samples();
auto tt = utility::clock::now();
request(
audio_samples_actor_,
infinite,
get_samples_for_soundcard_atom_v,
num_samps_soundcard_wants,
(long)output_device_->latency_microseconds(),
(int)output_device_->num_channels(),
(int)output_device_->sample_rate())
.then(
[=](const std::vector<int16_t> &samples_to_play) mutable {
waiting_for_samples_ = false;
output_device_->push_samples(
(const void *)samples_to_play.data(), samples_to_play.size());


if (playing_) {
anon_send(actor_cast<caf::actor>(this), push_samples_atom_v);
}
},
[=](caf::error &err) mutable { waiting_for_samples_ = false; });
}

);
}

AudioOutputDeviceActor(
caf::actor_config &cfg,
caf::actor samples_actor)
: caf::event_based_actor(cfg),
playing_(false),
waiting_for_samples_(false),
audio_samples_actor_(samples_actor) {

//spdlog::info("Created {} {}", "AudioOutputDeviceActor", OutputClassType::name());
//utility::print_on_exit(this, OutputClassType::name());

try {
auto prefs = global_store::GlobalStoreHelper(system());
utility::JsonStore j;
utility::join_broadcast(this, prefs.get_group(j));
open_output_device(j);
} catch (...) {
open_output_device(utility::JsonStore());
}

behavior_.assign(

[=](xstudio::broadcast::broadcast_down_atom, const caf::actor_addr &) {},

[=](json_store::update_atom,
const utility::JsonStore & /*change*/,
const std::string & /*path*/,
const utility::JsonStore &full) {
delegate(actor_cast<caf::actor>(this), json_store::update_atom_v, full);
},
[=](json_store::update_atom, const utility::JsonStore & /*j*/) {
// TODO: restart soundcard connection with new prefs
if (output_device_) {
output_device_->initialize_sound_card();
}
},
[=](utility::event_atom, playhead::play_atom, const bool is_playing) {
if (!is_playing && output_device_) {
// this stops the loop pushing samples to the soundcard
playing_ = false;
output_device_->disconnect_from_soundcard();
} else if (is_playing && !playing_) {
// start loop
playing_ = true;
if (output_device_) output_device_->connect_to_soundcard();
anon_send(actor_cast<caf::actor>(this), push_samples_atom_v);
}
},
[=](push_samples_atom) {
if (!output_device_) return;
// The 'waiting_for_samples_' flag allows us to ensure that we
// don't have multiple requests for samples to play in flight -
// since each response to a request then sends another
// 'push_samples_atom' atom (to keep playback running), having multiple
// requests in flight completely messes up the audio playback as
// essentially we have two loops running within the single actor.
if (waiting_for_samples_ || !playing_)
return;
waiting_for_samples_ = true;

const long num_samps_soundcard_wants = (long)output_device_->desired_samples();
auto tt = utility::clock::now();
request(
audio_samples_actor_,
infinite,
get_samples_for_soundcard_atom_v,
num_samps_soundcard_wants,
(long)output_device_->latency_microseconds(),
(int)output_device_->num_channels(),
(int)output_device_->sample_rate())
.then(
[=](const std::vector<int16_t> &samples_to_play) mutable {
waiting_for_samples_ = false;
output_device_->push_samples(
(const void *)samples_to_play.data(), samples_to_play.size());



if (playing_) {
anon_send(actor_cast<caf::actor>(this), push_samples_atom_v);
}
},
[=](caf::error &err) mutable { waiting_for_samples_ = false; });
}

);
}

void open_output_device(const utility::JsonStore &prefs) {
try {
output_device_ = std::make_unique<OutputClassType>(prefs);
} catch (std::exception &e) {
spdlog::error(
"{} Failed to connect to an audio device: {}", __PRETTY_FUNCTION__, e.what());
}
}
void open_output_device(const utility::JsonStore &prefs) {
try {
output_device_ = std::make_unique<OutputClassType>(prefs);
} catch (std::exception &e) {
spdlog::error(
"{} Failed to connect to an audio device: {}", __PRETTY_FUNCTION__, e.what());
}
}

~AudioOutputDeviceActor() override = default;

Expand All @@ -117,11 +115,9 @@ class AudioOutputDeviceActor : public caf::event_based_actor {
const char *name() const override { return name_.c_str(); }

protected:

std::unique_ptr<AudioOutputDevice> output_device_;

private:

caf::behavior behavior_;
std::string name_;
bool playing_;
Expand All @@ -133,18 +129,13 @@ template <typename OutputClassType>
class AudioOutputActor : public caf::event_based_actor, AudioOutputControl {

public:
AudioOutputActor(
caf::actor_config &cfg)
: caf::event_based_actor(cfg) {
init();
}
AudioOutputActor(caf::actor_config &cfg) : caf::event_based_actor(cfg) { init(); }

~AudioOutputActor() override = default;

caf::behavior make_behavior() override { return behavior_; }

private:

caf::actor audio_output_device_;

void init();
Expand All @@ -160,51 +151,52 @@ class AudioOutputActor : public caf::event_based_actor, AudioOutputControl {
utility::Uuid sub_playhead_uuid_;
};

/* Singleton class that receives audio sample buffers from the current
/* Singleton class that receives audio sample buffers from the current
playhead during playback. It re-broadcasts these samples to any AudioOutputActor
that has been instanced. */
class GlobalAudioOutputActor : public caf::event_based_actor, module::Module {

public:
GlobalAudioOutputActor(
caf::actor_config &cfg);
GlobalAudioOutputActor(caf::actor_config &cfg);
~GlobalAudioOutputActor() override = default;

void on_exit() override;

void attribute_changed(const utility::Uuid &attr_uuid, const int role);

caf::behavior make_behavior() override { return behavior_.or_else(module::Module::message_handler()); }
caf::behavior make_behavior() override {
return behavior_.or_else(module::Module::message_handler());
}

private:

caf::actor event_group_;
caf::message_handler behavior_;
module::BooleanAttribute *audio_repitch_;
module::BooleanAttribute *audio_scrubbing_;
module::FloatAttribute *volume_;
module::BooleanAttribute *muted_;

};

template <typename OutputClassType>
void AudioOutputActor<OutputClassType>::init() {
template <typename OutputClassType> void AudioOutputActor<OutputClassType>::init() {

//spdlog::debug("Created AudioOutputControlActor {}", OutputClassType::name());
// spdlog::debug("Created AudioOutputControlActor {}", OutputClassType::name());
utility::print_on_exit(this, "AudioOutputControlActor");

audio_output_device_ = spawn<AudioOutputDeviceActor<OutputClassType>>(caf::actor_cast<caf::actor>(this));
audio_output_device_ =
spawn<AudioOutputDeviceActor<OutputClassType>>(caf::actor_cast<caf::actor>(this));
link_to(audio_output_device_);

auto global_audio_actor = system().registry().template get<caf::actor>(audio_output_registry);
auto global_audio_actor =
system().registry().template get<caf::actor>(audio_output_registry);
utility::join_event_group(this, global_audio_actor);

behavior_.assign(

[=](xstudio::broadcast::broadcast_down_atom, const caf::actor_addr &) {},

[=](utility::event_atom, playhead::play_atom, const bool is_playing) {
send(audio_output_device_, utility::event_atom_v, playhead::play_atom_v, is_playing);
send(
audio_output_device_, utility::event_atom_v, playhead::play_atom_v, is_playing);
},

[=](get_samples_for_soundcard_atom,
Expand All @@ -224,23 +216,19 @@ void AudioOutputActor<OutputClassType>::init() {
}
return samples;
},
[=](
utility::event_atom,
module::change_attribute_event_atom,
const float volume,
const bool muted,
const bool repitch,
const bool scrubbing) {
set_attrs(volume, muted, repitch, scrubbing);
},
[=](utility::event_atom,
module::change_attribute_event_atom,
const float volume,
const bool muted,
const bool repitch,
const bool scrubbing) { set_attrs(volume, muted, repitch, scrubbing); },
[=](utility::event_atom,
playhead::sound_audio_atom,
const std::vector<media_reader::AudioBufPtr> &audio_buffers,
const utility::Uuid &sub_playhead,
const bool playing,
const bool forwards,
const float velocity) {

if (!playing) {
clear_queued_samples();
} else {
Expand All @@ -255,7 +243,6 @@ void AudioOutputActor<OutputClassType>::init() {
}

);

}

} // namespace xstudio::audio
2 changes: 1 addition & 1 deletion include/xstudio/audio/audio_output_device.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class AudioOutputDevice {
* @brief Configure the sound card.
*
* @details Should be called any time the sound card should be set up or changed
*/
*/
virtual void initialize_sound_card() = 0;

/**
Expand Down
1 change: 0 additions & 1 deletion include/xstudio/audio/linux_audio_output_device.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ namespace audio {
static std::string name() { return "LinuxAudioOutputDevice"; }

private:

void initialize_sound_card() override {}

long sample_rate_ = {44100};
Expand Down
Loading

0 comments on commit dfed795

Please sign in to comment.