OpenShot Library | libopenshot  0.2.7
AudioResampler.cpp
Go to the documentation of this file.
1 /**
2  * @file
3  * @brief Source file for AudioResampler class
4  * @author Jonathan Thomas <jonathan@openshot.org>
5  *
6  * @ref License
7  */
8 
9 /* LICENSE
10  *
11  * Copyright (c) 2008-2019 OpenShot Studios, LLC
12  * <http://www.openshotstudios.com/>. This file is part of
13  * OpenShot Library (libopenshot), an open-source project dedicated to
14  * delivering high quality video editing and animation solutions to the
15  * world. For more information visit <http://www.openshot.org/>.
16  *
17  * OpenShot Library (libopenshot) is free software: you can redistribute it
18  * and/or modify it under the terms of the GNU Lesser General Public License
19  * as published by the Free Software Foundation, either version 3 of the
20  * License, or (at your option) any later version.
21  *
22  * OpenShot Library (libopenshot) is distributed in the hope that it will be
23  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  * GNU Lesser General Public License for more details.
26  *
27  * You should have received a copy of the GNU Lesser General Public License
28  * along with OpenShot Library. If not, see <http://www.gnu.org/licenses/>.
29  */
30 
31 #include "AudioResampler.h"
32 
33 using namespace std;
34 using namespace openshot;
35 
36 // Default constructor, max frames to cache is 20 // resample_source(NULL), buffer_source(NULL), num_of_samples(0), new_num_of_samples(0), dest_ratio(0), source_ratio(0), resampled_buffer(NULL), isPrepared(false)
37 AudioResampler::AudioResampler()
38 {
39  resample_source = NULL;
40  buffer_source = NULL;
41  num_of_samples = 0;
42  new_num_of_samples = 0;
43  dest_ratio = 0;
44  source_ratio = 0;
45  resampled_buffer = NULL;
46  isPrepared = false;
47 
48  // Init buffer source
49  buffer_source = new AudioBufferSource(buffer);
50 
51  // Init resampling source
52  resample_source = new juce::ResamplingAudioSource(buffer_source, false, 2);
53 
54  // Init resampled buffer
55  resampled_buffer = new juce::AudioSampleBuffer(2, 1);
56  resampled_buffer->clear();
57 
58  // Init callback buffer
59  resample_callback_buffer.buffer = resampled_buffer;
60  resample_callback_buffer.numSamples = 1;
61  resample_callback_buffer.startSample = 0;
62 }
63 
64 // Descructor
65 AudioResampler::~AudioResampler()
66 {
67  // Clean up
68  if (buffer_source)
69  delete buffer_source;
70  if (resample_source)
71  delete resample_source;
72  if (resampled_buffer)
73  delete resampled_buffer;
74 }
75 
76 // Sets the audio buffer and updates the key settings
77 void AudioResampler::SetBuffer(juce::AudioSampleBuffer *new_buffer, double sample_rate, double new_sample_rate)
78 {
79  if (sample_rate <= 0)
80  sample_rate = 44100;
81  if (new_sample_rate <= 0)
82  new_sample_rate = 44100;
83 
84  // Set the sample ratio (the ratio of sample rate change)
85  source_ratio = sample_rate / new_sample_rate;
86 
87  // Call SetBuffer with ratio
88  SetBuffer(new_buffer, source_ratio);
89 }
90 
91 // Sets the audio buffer and key settings
92 void AudioResampler::SetBuffer(juce::AudioSampleBuffer *new_buffer, double ratio)
93 {
94  // Update buffer & buffer source
95  buffer = new_buffer;
96  buffer_source->setBuffer(buffer);
97 
98  // Set the sample ratio (the ratio of sample rate change)
99  source_ratio = ratio;
100  dest_ratio = 1.0 / ratio;
101  num_of_samples = buffer->getNumSamples();
102  new_num_of_samples = round(num_of_samples * dest_ratio) - 1;
103 
104  // Set resample ratio
105  resample_source->setResamplingRatio(source_ratio);
106 
107  // Prepare to play resample source
108  if (!isPrepared)
109  {
110  // Prepare to play the audio sources (and set the # of samples per chunk to a little more than expected)
111  resample_source->prepareToPlay(num_of_samples + 10, 0);
112  isPrepared = true;
113  }
114 
115  // Resize buffer for the newly resampled data
116  resampled_buffer->setSize(buffer->getNumChannels(), new_num_of_samples, true, true, true);
117  resample_callback_buffer.numSamples = new_num_of_samples;
118  resample_callback_buffer.startSample = 0;
119  resample_callback_buffer.clearActiveBufferRegion();
120 }
121 
122 // Get the resampled audio buffer
123 juce::AudioSampleBuffer* AudioResampler::GetResampledBuffer()
124 {
125  // Resample the current frame's audio buffer (into the temp callback buffer)
126  resample_source->getNextAudioBlock(resample_callback_buffer);
127 
128  // Return buffer pointer to this newly resampled buffer
129  return resampled_buffer;
130 }
Header file for AudioResampler class.
This class is used to expose an AudioSampleBuffer as an AudioSource in JUCE.
This namespace is the default namespace for all code in the openshot library.
Definition: Compressor.h:47