Implement Session support for Mixer Scenes

This commit is contained in:
Robin Gareus 2022-05-19 06:00:39 +02:00
parent bdc5711c31
commit 48fdfbab53
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
3 changed files with 111 additions and 0 deletions

View File

@ -153,6 +153,7 @@ class MidiPort;
class MidiRegion;
class MidiSource;
class MidiTrack;
class MixerScene;
class Playlist;
class PluginInsert;
class PluginInfo;
@ -1228,6 +1229,13 @@ public:
boost::shared_ptr<PBD::Controllable> solo_cut_control() const;
boost::shared_ptr<PBD::Controllable> recently_touched_controllable () const;
bool apply_nth_mixer_scene (size_t);
void store_nth_mixer_scene (size_t);
bool nth_mixer_scene_valid (size_t) const;
boost::shared_ptr<MixerScene> nth_mixer_scene (size_t, bool create_if_missing = false);
std::vector<boost::shared_ptr<MixerScene>> mixer_scenes () const;
SessionConfiguration config;
SessionConfiguration* cfg () { return &config; }
@ -1635,6 +1643,9 @@ private:
SerializedRCUManager<IOPlugList> _io_plugins;
std::vector<boost::shared_ptr<MixerScene>> _mixer_scenes;
mutable Glib::Threads::RWLock _mixer_scenes_lock;
Butler* _butler;
TransportFSM* _transport_fsm;

View File

@ -88,6 +88,7 @@
#include "ardour/midi_patch_manager.h"
#include "ardour/midi_track.h"
#include "ardour/midi_ui.h"
#include "ardour/mixer_scene.h"
#include "ardour/operations.h"
#include "ardour/playlist.h"
#include "ardour/playlist_factory.h"
@ -7482,3 +7483,59 @@ Session::had_destructive_tracks() const
return _had_destructive_tracks;
}
bool
Session::nth_mixer_scene_valid (size_t nth) const
{
Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);
if (_mixer_scenes.size () <= nth) {
return false;
}
if (!_mixer_scenes[nth]) {
return false;
}
return !_mixer_scenes[nth]->empty ();
}
bool
Session::apply_nth_mixer_scene (size_t nth)
{
Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);
if (_mixer_scenes.size () <= nth) {
return false;
}
if (!_mixer_scenes[nth]) {
return false;
}
return _mixer_scenes[nth]->apply ();
}
void
Session::store_nth_mixer_scene (size_t nth)
{
nth_mixer_scene (nth, true)->snapshot ();
}
boost::shared_ptr<MixerScene>
Session::nth_mixer_scene (size_t nth, bool create_if_missing)
{
Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);
if (create_if_missing && _mixer_scenes.size () <= nth) {
lm.release ();
Glib::Threads::RWLock::WriterLock lw (_mixer_scenes_lock);
_mixer_scenes.resize (nth + 1);
_mixer_scenes[nth] = boost::shared_ptr<MixerScene> (new MixerScene (*this));
set_dirty ();
return _mixer_scenes[nth];
}
if (_mixer_scenes.size () <= nth) {
return boost::shared_ptr<MixerScene> ();
}
return _mixer_scenes[nth];
}
std::vector<boost::shared_ptr<MixerScene>>
Session::mixer_scenes () const
{
Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);
return _mixer_scenes;
}

View File

@ -112,6 +112,7 @@
#include "ardour/midi_scene_changer.h"
#include "ardour/midi_source.h"
#include "ardour/midi_track.h"
#include "ardour/mixer_scene.h"
#include "ardour/playlist_factory.h"
#include "ardour/playlist_source.h"
#include "ardour/port.h"
@ -1483,6 +1484,34 @@ Session::state (bool save_template, snapshot_t snapshot_type, bool only_used_ass
node->add_child_nocopy (*script_node);
}
{
Glib::Threads::RWLock::ReaderLock lm (_mixer_scenes_lock);
size_t idx = 0;
size_t last = 0;
for (auto const& i : _mixer_scenes) {
++idx;
if (i && !i->empty ()) {
last = idx;
}
}
if (last > 0) {
idx = 0;
XMLNode* ms_node = new XMLNode (X_("MixerScenes"));
ms_node->set_property ("n_scenes", _mixer_scenes.size ());
for (auto const& i : _mixer_scenes) {
if (i && !i->empty ()) {
XMLNode& ms_state (i->get_state ());
ms_state.set_property ("index", idx);
ms_node->add_child_nocopy (ms_state);
}
if (++idx >= last) {
break;
}
}
node->add_child_nocopy (*ms_node);
}
}
{
boost::shared_ptr<IOPlugList> iop (_io_plugins.reader ());
XMLNode* iop_node = new XMLNode (X_("IOPlugins"));
@ -1881,6 +1910,20 @@ Session::set_state (const XMLNode& node, int version)
}
}
if ((child = find_named_node (node, "MixerScenes"))) {
Glib::Threads::RWLock::WriterLock lm (_mixer_scenes_lock);
size_t n_scenes = 0;
child->get_property("n_scenes", n_scenes);
_mixer_scenes.resize (n_scenes);
for (auto const n : child->children () ) {
size_t index = 0;
if (n->get_property("index", index)) {
_mixer_scenes[index] = boost::shared_ptr<MixerScene> (new MixerScene (*this));
_mixer_scenes[index]->set_state (*n, version);
}
}
}
if ((child = find_named_node (node, "IOPlugins"))) {
RCUWriter<IOPlugList> writer (_io_plugins);
boost::shared_ptr<IOPlugList> iopl = writer.get_copy ();