98class Project final :
public QObject
103 QString title READ getTitle WRITE setTitle NOTIFY titleChanged FINAL)
105 QString directory READ getDirectory WRITE setDirectory NOTIFY
106 directoryChanged FINAL)
115 clipPlaybackService CONSTANT FINAL)
118 trackSelectionManager CONSTANT)
130 Q_PROPERTY (
ClipEditor * clipEditor READ getClipEditor CONSTANT FINAL)
134 arrangerObjectCreator CONSTANT FINAL)
146 tempoObjectManager CONSTANT FINAL)
155 using TrackUuid = structure::tracks::TrackUuid;
156 using PluginPtrVariant = plugins::PluginPtrVariant;
157 using PluginRegistry = plugins::PluginRegistry;
159 static constexpr auto PROJECT_FILE =
"project.zpj"sv;
160 static constexpr auto PROJECT_BACKUPS_DIR =
"backups"sv;
161 static constexpr auto PROJECT_PLUGINS_DIR =
"plugins"sv;
162 static constexpr auto PROJECT_PLUGIN_STATES_DIR =
"states"sv;
163 static constexpr auto PROJECT_PLUGIN_EXT_COPIES_DIR =
"ext_file_copies"sv;
164 static constexpr auto PROJECT_PLUGIN_EXT_LINKS_DIR =
"ext_file_links"sv;
165 static constexpr auto PROJECT_EXPORTS_DIR =
"exports"sv;
166 static constexpr auto PROJECT_STEMS_DIR =
"stems"sv;
167 static constexpr auto PROJECT_POOL_DIR =
"pool"sv;
168 static constexpr auto PROJECT_FINISHED_FILE =
"FINISHED"sv;
172 std::shared_ptr<juce::AudioDeviceManager> device_manager,
173 QObject * parent =
nullptr);
174 ~Project ()
override;
175 Z_DISABLE_COPY_MOVE (Project)
210 PROJECT_COMPRESS_FILE = 0,
211 PROJECT_DECOMPRESS_FILE = 0,
212 PROJECT_COMPRESS_DATA = 1,
213 PROJECT_DECOMPRESS_DATA = 1,
220 QString getTitle ()
const;
221 void setTitle (
const QString &title);
222 QString getDirectory ()
const;
223 void setDirectory (
const QString &directory);
224 structure::tracks::Tracklist * tracklist ()
const;
225 structure::scenes::ClipLauncher * clipLauncher ()
const;
226 structure::scenes::ClipPlaybackService * clipPlaybackService ()
const;
227 gui::backend::TrackSelectionManager * trackSelectionManager ()
const;
228 gui::backend::PluginSelectionManager * pluginSelectionManager ()
const;
229 structure::arrangement::Timeline * getTimeline ()
const;
230 dsp::Metronome * metronome ()
const;
231 dsp::Transport * getTransport ()
const;
232 engine::session::ControlRoom * controlRoom ()
const;
233 dsp::AudioEngine * engine ()
const;
234 gui::backend::Tool * getTool ()
const;
246 Q_SIGNAL
void titleChanged (
const QString &title);
247 Q_SIGNAL
void directoryChanged (
const QString &directory);
248 Q_SIGNAL
void aboutToBeDeleted ();
251 createArrangerObjectSelectionOperator (
252 QItemSelectionModel * selectionModel)
const;
264 static Project * get_active_instance ();
267 auto * getArrangerObjectFactory ()
const
269 return arranger_object_factory_.get ();
284 save (
const fs::path &_dir,
bool is_backup,
bool show_notification,
bool async);
319 const QByteArray &src);
321 static void compress (
325 const QByteArray &src)
330 static void decompress (
334 const QByteArray &src)
349 bool has_unsaved_changes ()
const;
351 friend void init_from (
353 const Project &other,
365 Q_INVOKABLE Project *
clone (
bool for_backup)
const;
390 get_final_track_dependencies ()
const;
392 auto &get_file_audio_source_registry ()
const
394 return *file_audio_source_registry_;
396 auto &get_track_registry ()
const {
return *track_registry_; }
397 auto &get_plugin_registry ()
const {
return *plugin_registry_; }
398 auto &get_port_registry ()
const {
return *port_registry_; }
399 auto &get_param_registry ()
const {
return *param_registry_; }
400 auto &get_arranger_object_registry ()
const
402 return *arranger_object_registry_;
412 std::optional<dsp::PortPtrVariant>
418 dsp::ProcessorParameter *
419 find_param_by_id (
const dsp::ProcessorParameter::Uuid &
id)
const
421 const auto opt_var = get_param_registry ().find_by_id (
id);
422 if (opt_var.has_value ())
424 return std::get<dsp::ProcessorParameter *> (opt_var.value ());
429 std::optional<plugins::PluginPtrVariant>
430 find_plugin_by_id (plugins::Plugin::Uuid
id)
const
432 return get_plugin_registry ().find_by_id (
id);
435 std::optional<zrythm::structure::tracks::TrackPtrVariant>
436 find_track_by_id (structure::tracks::Track::Uuid
id)
const
438 return get_track_registry ().find_by_id (
id);
441 std::optional<zrythm::structure::arrangement::ArrangerObjectPtrVariant>
442 find_arranger_object_by_id (
443 structure::arrangement::ArrangerObject::Uuid
id)
const
445 return get_arranger_object_registry ().find_by_id (
id);
448 const auto &get_tempo_map ()
const {
return tempo_map_; }
457 void set_and_create_next_available_backup_dir ();
467 void cleanup_plugin_state_dirs (Project &main_project,
bool is_backup);
480 Project * main_project_;
483 fs::path project_file_path_;
485 bool is_backup_ =
false;
488 std::atomic_bool finished_ =
false;
490 bool show_notification_ =
false;
493 bool has_error_ =
false;
495 ProgressInfo progress_info_;
501 class SerializeProjectThread final :
public juce::Thread
504 SerializeProjectThread (SaveContext &ctx);
505 ~SerializeProjectThread ()
override;
506 void run ()
override;
518 static bool idle_saved_callback (SaveContext * ctx);
521 static constexpr auto kTempoMapKey =
"tempoMap"sv;
522 static constexpr auto kFileAudioSourceRegistryKey =
523 "fileAudioSourceRegistry"sv;
524 static constexpr auto kPortRegistryKey =
"portRegistry"sv;
525 static constexpr auto kParameterRegistryKey =
"paramRegistry"sv;
526 static constexpr auto kPluginRegistryKey =
"pluginRegistry"sv;
527 static constexpr auto kArrangerObjectRegistryKey =
"arrangerObjectRegistry"sv;
528 static constexpr auto kTrackRegistryKey =
"trackRegistry"sv;
529 static constexpr auto kTitleKey =
"title"sv;
530 static constexpr auto kDatetimeKey =
"datetime"sv;
531 static constexpr auto kVersionKey =
"version"sv;
532 static constexpr auto kClipEditorKey =
"clipEditor"sv;
533 static constexpr auto kTimelineKey =
"timeline"sv;
534 static constexpr auto kSnapGridTimelineKey =
"snapGridTimeline"sv;
535 static constexpr auto kSnapGridEditorKey =
"snapGridEditor"sv;
536 static constexpr auto kQuantizeOptsTimelineKey =
"quantizeOptsTimeline"sv;
537 static constexpr auto kQuantizeOptsEditorKey =
"quantizeOptsEditor"sv;
538 static constexpr auto kTransportKey =
"transport"sv;
539 static constexpr auto kAudioPoolKey =
"audioPool"sv;
540 static constexpr auto kTracklistKey =
"tracklist"sv;
541 static constexpr auto kRegionLinkGroupManagerKey =
"regionLinkGroupManager"sv;
542 static constexpr auto kPortConnectionsManagerKey =
"portConnectionsManager"sv;
543 static constexpr auto kMidiMappingsKey =
"midiMappings"sv;
544 static constexpr auto kUndoManagerKey =
"undoManager"sv;
545 static constexpr auto kUndoStackKey =
"undoStack"sv;
546 static constexpr auto kLastSelectionKey =
"lastSelection"sv;
547 static constexpr auto kTempoObjectManagerKey =
"tempoObjectManager"sv;
548 static constexpr auto DOCUMENT_TYPE =
"ZrythmProject"sv;
549 static constexpr auto FORMAT_MAJOR_VER = 2;
550 static constexpr auto FORMAT_MINOR_VER = 1;
551 friend void to_json (nlohmann::json &j,
const Project &project);
552 friend void from_json (
const nlohmann::json &j, Project &project);
555 dsp::TempoMap tempo_map_;
558 dsp::FileAudioSourceRegistry * file_audio_source_registry_{};
559 dsp::PortRegistry * port_registry_{};
560 dsp::ProcessorParameterRegistry * param_registry_{};
561 PluginRegistry * plugin_registry_{};
562 structure::arrangement::ArrangerObjectRegistry * arranger_object_registry_{};
563 structure::tracks::TrackRegistry * track_registry_{};
614 std::shared_ptr<juce::AudioDeviceManager> device_manager_;
650 std::unique_ptr<dsp::AudioPool>
pool_;
680 boost::unordered_flat_map<
681 structure::tracks::TrackUuid,
682 structure::tracks::TrackPtrVariant>
687 clip_playback_service_;
691 std::unique_ptr<structure::arrangement::ArrangerObjectFactory>
692 arranger_object_factory_;
694 std::unique_ptr<structure::tracks::TrackFactory> track_factory_;
697 arranger_object_creator_;
703 track_selection_manager_;
705 plugin_selection_manager_;
708 tempo_object_manager_;
720 int format_minor_ = 0;