Spaces:
Running
Running
/* | |
Copyright 2015 Google Inc. All rights reserved. | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software | |
distributed under the License is distributed on an "AS IS" BASIS, | |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
See the License for the specific language governing permissions and | |
limitations under the License. | |
*/ | |
class WaveData : public std::vector<int16_t> { | |
public: | |
WaveData(); | |
~WaveData(); | |
void Set(int number_samples, int sampling_rate, const int16_t *data); | |
int sample_rate(void) const; | |
void set_sample_rate(int sample_rate); | |
bool Equals(const WaveData &wave_data, int threshold = 0) const; | |
private: | |
int sample_rate_; | |
}; | |
class Wave { | |
public: | |
Wave(); | |
explicit Wave(const WaveData *data); | |
~Wave(); | |
// Sets internal WaveData to the new object. It loses ownership. | |
void set_data(const WaveData *data); | |
// Sets values of WaveData to the new data. It takes ownership. | |
void copy_data(const WaveData &data); | |
// Returns the number of samples contained in the wave. | |
int num_samples() const { | |
return data_->size(); | |
} | |
// Returns the sample rate of the wave. | |
int sample_rate() const { | |
return data_->sample_rate(); | |
} | |
// Sets the sample rate for the wave. | |
void set_sample_rate(int sample_rate) { | |
data_->set_sample_rate(sample_rate); | |
} | |
// Returns the value of the data at the given offset within the wave. | |
int16_t get(int f) const { | |
return (*data_)[f]; | |
} | |
// Sets the wave data at the given position with the given value. | |
void set(int f, int16_t v) { | |
(*data_)[f] = v; | |
} | |
// Returns the wave data. | |
const WaveData *data() const { | |
return data_; | |
} | |
// Ensures that this wave 'parents' the wave data, | |
// so deleting it when this instance is deleted. | |
void adopt() { | |
owner_ = true; | |
} | |
const int16_t &operator [] (int f) const { | |
return (*data_)[f]; | |
} | |
int16_t &operator [] (int f) { | |
return (*data_)[f]; | |
} | |
// Resizes | |
void resize(int n, bool clear = false); | |
// Zero fills the wave data. | |
void ZeroFill(); | |
// Applies the given gain to the wave data, limited to int16_t limits. | |
// Returns true if no clipping occurred. | |
// Returns false if the amplification resulted in clipping. | |
// The gain factor is a simple multiplicative factor, NOT a dB value. | |
bool Amplify(float gain_factor); | |
// Applies the given gain to the given buffer location and the given | |
// number of entries in that buffer. | |
// Returns true if no clipping occurred. | |
// Returns false if the amplification resulted in clipping. | |
// The gain factor is a simple multiplicative factor, NOT a dB value. | |
static bool AmplifyBuffer(float gain_factor, | |
int16_t *buffer, uint32_t num_entries); | |
bool Load(const std::string &filename); | |
bool Load(FileResource *fr); | |
protected: | |
// Clears the audio data down and sets the owner. | |
void Clear(); | |
private: | |
static const int16_t kMaxShort; | |
static const int16_t kMinShort; | |
// The wave data. | |
WaveData *data_; | |
// Holds whether this instance is to sole owner of the wave data, allowing | |
// for correct object deletion. | |
bool owner_; | |
}; | |
inline bool Wave::Load(const std::string &filename) { | |
FileResource fr(filename, "rb"); | |
if (!fr.Get()) { | |
fprintf(stderr, "Failed to open \"%s\"", filename.c_str()); | |
return false; | |
} | |
return Load(&fr); | |
} | |