47class RecordingCoordinator :
public QObject
52 static constexpr auto kDrainInterval = std::chrono::milliseconds (100);
54 explicit RecordingCoordinator (QObject * parent =
nullptr);
55 ~RecordingCoordinator ()
override;
57 Q_DISABLE_COPY_MOVE (RecordingCoordinator)
59 enum class SessionType : std::uint8_t
66 std::variant<std::monostate, AudioRecordingSession *, MidiRecordingSession *>;
75 structure::tracks::TrackUuid track_id,
76 units::sample_u32_t max_block_length,
77 SessionType type) [[clang::blocking]];
84 void disarm_track (structure::tracks::TrackUuid track_id) [[clang::blocking]];
91 [[nodiscard]]
bool has_session (structure::tracks::TrackUuid track_id)
const;
123 [[nodiscard]] SessionHandle
125 [[clang::nonblocking]];
146 structure::tracks::TrackUuid track_id,
147 std::vector<RecordingAudioPacket> packets);
156 structure::tracks::TrackUuid track_id,
157 std::vector<RecordingMidiPacket> packets);
173 std::unordered_map<structure::tracks::TrackUuid, AudioRecordingSession *>
175 std::unordered_map<structure::tracks::TrackUuid, MidiRecordingSession *> midi;
178 using AudioDrainResult = std::vector<
179 std::pair<structure::tracks::TrackUuid, std::vector<RecordingAudioPacket>>>;
181 using MidiDrainResult = std::vector<
182 std::pair<structure::tracks::TrackUuid, std::vector<RecordingMidiPacket>>>;
184 void publish_snapshot ();
186 bool drain_pending_deletion (
187 AudioDrainResult &audio_ready,
188 MidiDrainResult &midi_ready);
199 std::atomic<RtSnapshot *> rt_snapshot_{
nullptr };
209 std::vector<std::unique_ptr<RtSnapshot>> pending_snapshot_deletion_;
210 std::vector<std::unique_ptr<RtSnapshot>> old_snapshots_;
213 std::unique_ptr<Impl> impl_;