From 2e39e54bf40f0feb33e1348500a8d009a9d2a14c Mon Sep 17 00:00:00 2001 From: Nicola Melloni Date: Wed, 5 Feb 2025 22:42:46 +0100 Subject: [PATCH 1/5] added saveToMemory method --- AudioFile.h | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/AudioFile.h b/AudioFile.h index 3c53243..8defd98 100644 --- a/AudioFile.h +++ b/AudioFile.h @@ -109,7 +109,11 @@ class AudioFile //============================================================= /** Loads an audio file from data in memory */ bool loadFromMemory (const std::vector& fileData); - + + //============================================================= + /** Saves an audio file to data in memory */ + bool saveToMemory (std::vector& fileData, AudioFileFormat format = AudioFileFormat::Wave); + //============================================================= /** @Returns the sample rate */ uint32_t getSampleRate() const; @@ -190,10 +194,10 @@ class AudioFile //============================================================= bool decodeWaveFile (const std::vector& fileData); bool decodeAiffFile (const std::vector& fileData); - + //============================================================= - bool saveToWaveFile (const std::string& filePath); - bool saveToAiffFile (const std::string& filePath); + bool encodeWaveFile (std::vector& fileData); + bool encodeAiffFile (std::vector& fileData); //============================================================= void clearAudioBuffer(); @@ -889,14 +893,22 @@ void AudioFile::addSampleRateToAiffData (std::vector& fileData, uint //============================================================= template bool AudioFile::save (const std::string& filePath, AudioFileFormat format) +{ + std::vector fileData; + return saveToMemory(fileData, format) && writeDataToFile(fileData, filePath); +} + +//============================================================= +template +inline bool AudioFile::saveToMemory(std::vector &fileData, AudioFileFormat format) { if (format == AudioFileFormat::Wave) { - return saveToWaveFile (filePath); + return encodeWaveFile (fileData); } else if (format == AudioFileFormat::Aiff) { - return saveToAiffFile (filePath); + return encodeAiffFile (fileData); } return false; @@ -904,10 +916,8 @@ bool AudioFile::save (const std::string& filePath, AudioFileFormat format) //============================================================= template -bool AudioFile::saveToWaveFile (const std::string& filePath) -{ - std::vector fileData; - +bool AudioFile::encodeWaveFile (std::vector& fileData) +{ int32_t dataChunkSize = getNumSamplesPerChannel() * (getNumChannels() * bitDepth / 8); int16_t audioFormat = bitDepth == 32 && std::is_floating_point_v ? WavAudioFormat::IEEEFloat : WavAudioFormat::PCM; int32_t formatChunkSize = audioFormat == WavAudioFormat::PCM ? 16 : 18; @@ -1011,20 +1021,18 @@ bool AudioFile::saveToWaveFile (const std::string& filePath) // check that the various sizes we put in the metadata are correct if (fileSizeInBytes != static_cast (fileData.size() - 8) || dataChunkSize != (getNumSamplesPerChannel() * getNumChannels() * (bitDepth / 8))) { - reportError ("ERROR: couldn't save file to " + filePath); + reportError ("ERROR: Incorrect file or data chunk size."); return false; } // try to write the file - return writeDataToFile (fileData, filePath); + return true; } //============================================================= template -bool AudioFile::saveToAiffFile (const std::string& filePath) -{ - std::vector fileData; - +bool AudioFile::encodeAiffFile (std::vector& fileData) +{ int32_t numBytesPerSample = bitDepth / 8; int32_t numBytesPerFrame = numBytesPerSample * getNumChannels(); int32_t totalNumAudioSampleBytes = getNumSamplesPerChannel() * numBytesPerFrame; @@ -1116,12 +1124,12 @@ bool AudioFile::saveToAiffFile (const std::string& filePath) // check that the various sizes we put in the metadata are correct if (fileSizeInBytes != static_cast (fileData.size() - 8) || soundDataChunkSize != getNumSamplesPerChannel() * numBytesPerFrame + 8) { - reportError ("ERROR: couldn't save file to " + filePath); + reportError ("ERROR: Incorrect file or data chunk size."); return false; } // try to write the file - return writeDataToFile (fileData, filePath); + return true; } //============================================================= From 5de3b99feec0dffb76fd9e3d7e0e1d5eddf8ec6f Mon Sep 17 00:00:00 2001 From: nicmell <39554602+nicmell@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:09:33 +0100 Subject: [PATCH 2/5] removed inline keyword --- AudioFile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AudioFile.h b/AudioFile.h index 8defd98..a2ab787 100644 --- a/AudioFile.h +++ b/AudioFile.h @@ -900,7 +900,7 @@ bool AudioFile::save (const std::string& filePath, AudioFileFormat format) //============================================================= template -inline bool AudioFile::saveToMemory(std::vector &fileData, AudioFileFormat format) +bool AudioFile::saveToMemory(std::vector &fileData, AudioFileFormat format) { if (format == AudioFileFormat::Wave) { From 115876bfc383b38e3d602853c24b0b7e65e47bcc Mon Sep 17 00:00:00 2001 From: Adam Stark Date: Thu, 6 Feb 2025 12:58:31 +0100 Subject: [PATCH 3/5] style: small code style tweaks and removal of redundant comments --- AudioFile.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/AudioFile.h b/AudioFile.h index a2ab787..c1f21ec 100644 --- a/AudioFile.h +++ b/AudioFile.h @@ -895,12 +895,12 @@ template bool AudioFile::save (const std::string& filePath, AudioFileFormat format) { std::vector fileData; - return saveToMemory(fileData, format) && writeDataToFile(fileData, filePath); + return saveToMemory (fileData, format) && writeDataToFile (fileData, filePath); } //============================================================= template -bool AudioFile::saveToMemory(std::vector &fileData, AudioFileFormat format) +bool AudioFile::saveToMemory (std::vector &fileData, AudioFileFormat format) { if (format == AudioFileFormat::Wave) { @@ -1025,7 +1025,6 @@ bool AudioFile::encodeWaveFile (std::vector& fileData) return false; } - // try to write the file return true; } @@ -1128,7 +1127,6 @@ bool AudioFile::encodeAiffFile (std::vector& fileData) return false; } - // try to write the file return true; } From 3051c82b506f049aab4d865a72d6d20168dc0a09 Mon Sep 17 00:00:00 2001 From: Adam Stark Date: Thu, 6 Feb 2025 13:03:43 +0100 Subject: [PATCH 4/5] Update README for new saveToMemory() functions --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 6ba20da..98b65e2 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,17 @@ AudioFile is written and maintained by Adam Stark. // Aiff file audioFile.save ("path/to/desired/audioFile.aif", AudioFileFormat::Aiff); +### Save the audio file to memory + +Write the audio file data directly to a vector of bytes (without writing to a file on disk): + + std::vector fileData; + saveToMemory (fileData, AudioFileFormat::Wave); + + or + + saveToMemory (fileData, AudioFileFormat::Aiff); + ## Examples Please see the `examples` folder for some examples on library usage. @@ -256,6 +267,7 @@ Many thanks to the following people for their contributions to this library: - [Metalsofa](https://github.com/Metalsofa) - [mrpossoms](https://github.com/mrpossoms) - [mynameisjohn](https://github.com/mynameisjohn) +- [nicmell](https://github.com/nicmell) - [Sidelobe](https://github.com/Sidelobe) - [sschaetz](https://github.com/sschaetz) - [Yhcrown](https://github.com/Yhcrown) From f715d0fe8490ea89c6404f4715fc98eb5b340fa2 Mon Sep 17 00:00:00 2001 From: Adam Stark Date: Thu, 6 Feb 2025 13:04:57 +0100 Subject: [PATCH 5/5] style: another small code style tweak --- AudioFile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AudioFile.h b/AudioFile.h index c1f21ec..bc71da8 100644 --- a/AudioFile.h +++ b/AudioFile.h @@ -900,7 +900,7 @@ bool AudioFile::save (const std::string& filePath, AudioFileFormat format) //============================================================= template -bool AudioFile::saveToMemory (std::vector &fileData, AudioFileFormat format) +bool AudioFile::saveToMemory (std::vector& fileData, AudioFileFormat format) { if (format == AudioFileFormat::Wave) {