aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/recorder/recording_clock.c
diff options
context:
space:
mode:
authorMaria Lisina <sekoohaka.sarisan@gmail.com>2026-08-10 10:38:14 +0500
committerMaria Lisina <sekoohaka.sarisan@gmail.com>2026-08-10 10:38:14 +0500
commit6dc1149d078fc3b04a19696bfb7d5d6940372175 (patch)
tree169f7f71e6a292a4ab61a0493000e1add4430f8e /src/recorder/recording_clock.c
parent6836426ae183b9a7d0ec99c1e147e8ad6edabd92 (diff)
parent80517840f4ae64469721598e8373d81f2e4493dd (diff)
Merge tag '6.0.0' of https://repo.dec05eba.com/gpu-screen-recorder into debian
Diffstat (limited to 'src/recorder/recording_clock.c')
-rw-r--r--src/recorder/recording_clock.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/recorder/recording_clock.c b/src/recorder/recording_clock.c
new file mode 100644
index 0000000..5c9aabb
--- /dev/null
+++ b/src/recorder/recording_clock.c
@@ -0,0 +1,60 @@
+#include "../../include/recorder/recording_clock.h"
+#include "../../include/utils.h"
+#include "../../include/log.h"
+
+#include <stdlib.h>
+#include <stdatomic.h>
+
+struct gsr_recording_clock {
+ double record_start_time;
+ _Atomic double paused_time_offset;
+ double paused_time_start;
+ atomic_bool paused;
+};
+
+gsr_recording_clock* gsr_recording_clock_create(void) {
+ gsr_recording_clock *self = calloc(1, sizeof(gsr_recording_clock));
+ if(!self) {
+ gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_recording_clock_create: failed to allocate recording clock");
+ return NULL;
+ }
+
+ atomic_init(&self->paused_time_offset, 0.0);
+ atomic_init(&self->paused, false);
+ self->record_start_time = clock_get_monotonic_seconds();
+ return self;
+}
+
+void gsr_recording_clock_destroy(gsr_recording_clock *self) {
+ if(self)
+ free(self);
+}
+
+void gsr_recording_clock_start(gsr_recording_clock *self) {
+ self->record_start_time = clock_get_monotonic_seconds();
+}
+
+double gsr_recording_clock_get_start_time(const gsr_recording_clock *self) {
+ return self->record_start_time;
+}
+
+double gsr_recording_clock_get_time(const gsr_recording_clock *self) {
+ return clock_get_monotonic_seconds() - atomic_load(&self->paused_time_offset);
+}
+
+void gsr_recording_clock_set_paused(gsr_recording_clock *self, bool paused) {
+ if(paused == atomic_load(&self->paused))
+ return;
+
+ if(paused) {
+ self->paused_time_start = clock_get_monotonic_seconds();
+ } else {
+ atomic_store(&self->paused_time_offset, atomic_load(&self->paused_time_offset) + (clock_get_monotonic_seconds() - self->paused_time_start));
+ }
+
+ atomic_store(&self->paused, paused);
+}
+
+bool gsr_recording_clock_is_paused(const gsr_recording_clock *self) {
+ return atomic_load(&self->paused);
+}