36 if (info.numSamples > 0) {
37 info.clearActiveBufferRegion();
38 const uint64_t generation = seek_generation.load();
41 const int64_t position = requested_frame.load();
42 if (seek_generation.load() != generation)
44 if (applied_generation != generation) {
45 frame_position = position;
47 applied_generation = generation;
49 const uint64_t speed_epoch = speed_generation.load();
52 int64_t next_frame = frame_position;
53 int64_t next_sample = sample_position;
54 std::shared_ptr<Frame> decoded_frame;
55 int remaining_samples = info.numSamples;
56 int remaining_position = info.startSample;
59 if (speed != 1 || (videoCache && !videoCache->
isReady())) {
63 while (remaining_samples > 0) {
64 const int previous_remaining = remaining_samples;
65 decoded_frame.reset();
78 decoded_frame = reader->
GetFrame(next_frame);
87 if (seek_generation.load() != generation || speed_generation.load() != speed_epoch || speed.load() != 1)
91 if (reader && decoded_frame) {
92 const int frame_samples = decoded_frame->GetAudioSamplesCount();
93 const int frame_channels = decoded_frame->GetAudioChannelsCount();
97 if (frame_samples <= 0 || frame_channels <= 0) {
98 info.buffer->clear(remaining_position, remaining_samples);
102 if (next_sample + remaining_samples <= decoded_frame->GetAudioSamplesCount()) {
104 for (
int channel = 0; channel < frame_channels; channel++) {
105 if (channel < info.buffer->getNumChannels()) {
106 info.buffer->copyFrom(channel, remaining_position, *decoded_frame->GetAudioSampleBuffer(),
107 channel, next_sample, remaining_samples);
110 next_sample += remaining_samples;
111 remaining_position += remaining_samples;
112 remaining_samples = 0;
114 }
else if (next_sample + remaining_samples > decoded_frame->GetAudioSamplesCount()) {
116 int amount_to_copy = decoded_frame->GetAudioSamplesCount() - next_sample;
117 if (amount_to_copy <= 0) {
118 info.buffer->clear(remaining_position, remaining_samples);
122 for (
int channel = 0; channel < frame_channels; channel++) {
123 if (channel < info.buffer->getNumChannels()) {
124 info.buffer->copyFrom(channel, remaining_position, *decoded_frame->GetAudioSampleBuffer(), channel,
125 next_sample, amount_to_copy);
128 next_sample += amount_to_copy;
129 remaining_position += amount_to_copy;
130 remaining_samples -= amount_to_copy;
134 if (next_sample == decoded_frame->GetAudioSamplesCount()) {
139 info.buffer->clear(remaining_position, remaining_samples);
143 if (remaining_samples == previous_remaining) {
144 info.buffer->clear(remaining_position, remaining_samples);
148 if (seek_generation.load() != generation || speed_generation.load() != speed_epoch || speed.load() != 1) {
149 info.clearActiveBufferRegion();
152 frame_position = next_frame;
153 sample_position = next_sample;
154 std::atomic_store(&frame, decoded_frame);
155 published_generation.store(generation);