Centralize legacy recording bridge

This commit is contained in:
2026-06-04 12:58:27 +02:00
parent 65e9fdf1b9
commit a9ed201adf
9 changed files with 351 additions and 40 deletions

View File

@@ -1,7 +1,10 @@
#pragma once
#include "foundation/result.h"
#include <cstddef>
#include <limits>
#include <string_view>
namespace pp::app {
@@ -26,6 +29,20 @@ struct RecordingExportPlan {
int progress_total = 0;
};
class RecordingServices {
public:
virtual ~RecordingServices() = default;
virtual void start_thread() = 0;
virtual void stop_thread() = 0;
virtual void delete_recorded_files() = 0;
virtual void set_frame_count(int frame_count) = 0;
virtual void update_frame_label() = 0;
virtual void begin_export(int progress_total) = 0;
virtual void write_mp4(std::string_view path) = 0;
virtual void end_export() = 0;
};
[[nodiscard]] constexpr RecordingStartAction plan_recording_start(bool is_running) noexcept
{
return is_running
@@ -60,4 +77,60 @@ struct RecordingExportPlan {
};
}
[[nodiscard]] inline pp::foundation::Status execute_recording_start_action(
RecordingStartAction action,
RecordingServices& services)
{
switch (action) {
case RecordingStartAction::start_thread:
services.start_thread();
return pp::foundation::Status::success();
case RecordingStartAction::no_op_already_running:
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown recording start action");
}
[[nodiscard]] inline pp::foundation::Status execute_recording_stop_action(
RecordingStopAction action,
RecordingServices& services)
{
switch (action) {
case RecordingStopAction::stop_thread:
services.stop_thread();
return pp::foundation::Status::success();
case RecordingStopAction::no_op_not_running:
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown recording stop action");
}
[[nodiscard]] inline pp::foundation::Status execute_recording_clear_plan(
const RecordingClearPlan& plan,
RecordingServices& services)
{
if (plan.stop_running_recording) {
services.stop_thread();
}
if (plan.delete_recorded_files) {
services.delete_recorded_files();
}
services.set_frame_count(plan.frame_count_after_clear);
services.update_frame_label();
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Status execute_recording_export_plan(
const RecordingExportPlan& plan,
RecordingServices& services,
std::string_view path)
{
services.begin_export(plan.progress_total);
services.write_mp4(path);
services.end_export();
return pp::foundation::Status::success();
}
}