/*** Oak - Non-Linear Video Editor Copyright (C) 2026 Oak Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "audiosynchronizer.h" namespace olive { AudioSynchronizer::Placement AudioSynchronizer::place_by_source_time( const SourceClip &reference, const SourceClip &candidate, const core::Rational &reference_timeline_in) { Placement placement; if (!reference.has_source_start_time || !candidate.has_source_start_time || reference.source_start_time.isNaN() || candidate.source_start_time.isNaN()) { return placement; } const core::Rational reference_head_source = reference.source_start_time + reference.media_in; const core::Rational candidate_head_source = candidate.source_start_time + candidate.media_in; placement.timeline_in = reference_timeline_in + candidate_head_source - reference_head_source; placement.valid = !placement.timeline_in.isNaN(); return placement; } AudioSynchronizer::Placement AudioSynchronizer::place_by_waveform_offset( const core::Rational &reference_timeline_in, int64_t candidate_offset_samples, int sample_rate) { Placement placement; if (sample_rate <= 0) { return placement; } placement.timeline_in = reference_timeline_in + core::Rational::from_double( static_cast(candidate_offset_samples) / static_cast(sample_rate)); placement.valid = !placement.timeline_in.isNaN(); return placement; } }