21AudioReaderSource::AudioReaderSource(
ReaderBase *audio_reader, int64_t starting_frame_number)
22 : reader(audio_reader), frame_position(starting_frame_number), videoCache(NULL), frame(NULL),
23 sample_position(0), speed(1), stream_position(0) {
34 if (info.numSamples > 0) {
35 int remaining_samples = info.numSamples;
36 int remaining_position = info.startSample;
39 if (speed != 1 || !videoCache->
isReady()) {
44 while (remaining_samples > 0) {
48 frame = reader->
GetFrame(frame_position);
55 if (reader && frame) {
56 if (sample_position + remaining_samples <= frame->GetAudioSamplesCount()) {
58 for (
int channel = 0; channel < frame->GetAudioChannelsCount(); channel++) {
59 if (channel < info.buffer->getNumChannels()) {
60 info.buffer->addFrom(channel, remaining_position, *frame->GetAudioSampleBuffer(),
61 channel, sample_position, remaining_samples);
64 sample_position += remaining_samples;
65 remaining_position += remaining_samples;
66 remaining_samples = 0;
68 }
else if (sample_position + remaining_samples > frame->GetAudioSamplesCount()) {
70 int amount_to_copy = frame->GetAudioSamplesCount() - sample_position;
71 for (
int channel = 0; channel < frame->GetAudioChannelsCount(); channel++) {
72 if (channel < info.buffer->getNumChannels()) {
73 info.buffer->addFrom(channel, remaining_position, *frame->GetAudioSampleBuffer(), channel,
74 sample_position, amount_to_copy);
77 sample_position += amount_to_copy;
78 remaining_position += amount_to_copy;
79 remaining_samples -= amount_to_copy;
83 if (sample_position == frame->GetAudioSamplesCount()) {
84 frame_position += speed;
Header file for AudioReaderSource class.
Header file for all Exception classes.
Header file for Frame class.
void releaseResources()
Release all resources.
juce::int64 getTotalLength() const
Get the total length (in samples) of this audio source.
void prepareToPlay(int, double)
Prepare to play this audio source.
void getNextAudioBlock(const juce::AudioSourceChannelInfo &info)
Get the next block of audio samples.
~AudioReaderSource()
Destructor.
Exception for frames that are out of bounds.
This abstract class is the base class, used by all readers in libopenshot.
openshot::ReaderInfo info
Information about the current media file.
virtual std::shared_ptr< openshot::Frame > GetFrame(int64_t number)=0
Exception when a reader is closed, and a frame is requested.
bool isReady()
Is cache ready for video/audio playback.
This namespace is the default namespace for all code in the openshot library.
float duration
Length of time (in seconds)
int sample_rate
The number of audio samples per second (44100 is a common sample rate)