From 2932ff1dd20c28c5edf01ae2575ff5faeb4689b4 Mon Sep 17 00:00:00 2001 From: Dimitri Diakopoulos Date: Sun, 17 May 2015 17:35:31 -0700 Subject: [PATCH] adding in some sanity checks --- examples/src/Main.cpp | 2 +- include/libnyquist/WavEncoder.h | 14 ++++++++++++-- src/WavEncoder.cpp | 23 ++++++++++++++++++++--- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/examples/src/Main.cpp b/examples/src/Main.cpp index 40c8aff..8de96ae 100644 --- a/examples/src/Main.cpp +++ b/examples/src/Main.cpp @@ -97,7 +97,7 @@ int main() myDevice.Play(fileData->samples); } - // Test wav file encoder + // Test wav file encoder encoder.WriteFile({2, 44100, 32, PCM_FLT}, fileData->samples, "encoded.wav"); return 0; diff --git a/include/libnyquist/WavEncoder.h b/include/libnyquist/WavEncoder.h index fd8b0c9..3353659 100644 --- a/include/libnyquist/WavEncoder.h +++ b/include/libnyquist/WavEncoder.h @@ -27,17 +27,27 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define WAVE_ENCODER_H #include "Common.h" -#include "WavDecoder.h" // For reference structs +#include "WavDecoder.h" #include "RiffUtils.h" namespace nqr { + // A simplistic encoder that takes a blob of data, conforms it to the user's // EncoderParams preference, and writes to disk. Be warned, does not support resampling! // @todo support dithering, samplerate conversion, etc. class WavEncoder { + enum EncoderError + { + NoError, + InsufficientSampleData, + FileIOError, + UnsupportedSamplerate, + UnsupportedChannelConfiguration, + BufferTooBig, + }; public: @@ -45,7 +55,7 @@ public: ~WavEncoder(); // Assume data adheres to EncoderParams, except for bit depth and fmt - void WriteFile(const EncoderParams p, const std::vector & data, const std::string & path); + int WriteFile(const EncoderParams p, const AudioData * d, const std::string & path); }; diff --git a/src/WavEncoder.cpp b/src/WavEncoder.cpp index c0be1aa..06234dc 100644 --- a/src/WavEncoder.cpp +++ b/src/WavEncoder.cpp @@ -28,7 +28,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace nqr; -// Big-endian convert inline void toBytes(int value, char * arr) { arr[0] = (value) & 0xFF; @@ -47,10 +46,28 @@ WavEncoder::~WavEncoder() } -//@todo check for max file length, sanity checks, etc. -void WavEncoder::WriteFile(const EncoderParams p, const std::vector & data, const std::string & path) +int WavEncoder::WriteFile(const EncoderParams p, const AudioData * d, const std::string & path) { + if (d->samples.size() <= 32) + { + return EncoderError::InsufficientSampleData; + } + + if (d->channelCount < 1 || d->channelCount > 8) + { + return EncoderError::UnsupportedChannelConfiguration; + } + + auto maxFileSizeInBytes = std::numeric_limits::max(); + auto samplesSizeInBytes = d->samples.size() * sizeof(float); + + // 64 arbitrary + if ((samplesSizeInBytes - 64) >= maxFileSizeInBytes) + { + return EncoderError::BufferTooBig; + } + std::ofstream fout(path.c_str(), std::ios::out | std::ios::binary); if (!fout.is_open())