31 #include "../include/AudioReaderSource.h"
37 AudioReaderSource::AudioReaderSource(
ReaderBase *audio_reader, int64_t starting_frame_number,
int buffer_size)
38 : reader(audio_reader), frame_number(starting_frame_number), original_frame_number(starting_frame_number),
39 size(buffer_size), position(0), frame_position(0), estimated_frame(0), speed(1) {
42 buffer =
new juce::AudioSampleBuffer(reader->
info.
channels, size);
57 void AudioReaderSource::GetMoreSamplesFromReader()
60 int amount_needed = position;
61 int amount_remaining = size - amount_needed;
72 estimated_frame = frame_number;
75 juce::AudioSampleBuffer *new_buffer =
new juce::AudioSampleBuffer(reader->
info.
channels, size);
79 if (amount_remaining > 0) {
80 for (
int channel = 0; channel < buffer->getNumChannels(); channel++)
81 new_buffer->addFrom(channel, 0, *buffer, channel, position, amount_remaining);
83 position = amount_remaining;
89 while (amount_needed > 0 && speed == 1 && frame_number >= 1 && frame_number <= reader->info.video_length) {
92 if (frame_position == 0) {
95 frame = reader->
GetFrame(frame_number);
96 frame_number = frame_number + speed;
107 bool frame_completed =
false;
108 int amount_to_copy = 0;
110 amount_to_copy = frame->GetAudioSamplesCount() - frame_position;
111 if (amount_to_copy > amount_needed) {
113 amount_to_copy = amount_needed;
117 amount_needed -= amount_to_copy;
118 frame_completed =
true;
123 for (
int channel = 0; channel < new_buffer->getNumChannels(); channel++)
124 new_buffer->addFrom(channel, position, *frame->GetAudioSampleBuffer(), channel, frame_position, amount_to_copy);
127 position += amount_to_copy;
133 frame_position += amount_to_copy;
146 juce::AudioSampleBuffer* AudioReaderSource::reverse_buffer(juce::AudioSampleBuffer* buffer)
148 int number_of_samples = buffer->getNumSamples();
149 int channels = buffer->getNumChannels();
155 juce::AudioSampleBuffer *reversed =
new juce::AudioSampleBuffer(channels, number_of_samples);
158 for (
int channel = 0; channel < channels; channel++)
161 for (
int s = number_of_samples - 1; s >= 0; s--, n++)
162 reversed->getWritePointer(channel)[n] = buffer->getWritePointer(channel)[s];
168 for (
int channel = 0; channel < channels; channel++)
170 buffer->addFrom(channel, 0, reversed->getReadPointer(channel), number_of_samples, 1.0f);
182 int buffer_samples = buffer->getNumSamples();
183 int buffer_channels = buffer->getNumChannels();
185 if (info.numSamples > 0) {
186 int number_to_copy = 0;
191 if ((reader && reader->
IsOpen() && !frame) or
192 (reader && reader->
IsOpen() && buffer_samples - position < info.numSamples))
194 GetMoreSamplesFromReader();
197 info.buffer->clear();
202 if (position + info.numSamples <= buffer_samples)
205 number_to_copy = info.numSamples;
207 else if (position > buffer_samples)
212 else if (buffer_samples - position > 0)
215 number_to_copy = buffer_samples - position;
225 if (number_to_copy > 0)
228 ZmqLogger::Instance()->
AppendDebugMethod(
"AudioReaderSource::getNextAudioBlock",
"number_to_copy", number_to_copy,
"buffer_samples", buffer_samples,
"buffer_channels", buffer_channels,
"info.numSamples", info.numSamples,
"speed", speed,
"position", position);
231 for (
int channel = 0; channel < buffer_channels; channel++)
232 info.buffer->copyFrom(channel, info.startSample, *buffer, channel, position, number_to_copy);
235 position += number_to_copy;
240 estimated_frame += double(info.numSamples) / double(estimated_samples_per_frame);
254 if (newPosition >= 0 && newPosition < buffer->getNumSamples())
255 position = newPosition;
292 buffer = audio_buffer;