From 1ce35453db40d61fc090a1ba9e765a95671031fb Mon Sep 17 00:00:00 2001 From: attila Date: Wed, 11 Jun 2025 18:06:21 +0200 Subject: [PATCH] Deprecate the old AudioFormat::createWriterFor functions --- BREAKING_CHANGES.md | 33 +++++++++++++++++++ .../codecs/juce_AiffAudioFormat.cpp | 14 -------- .../codecs/juce_AiffAudioFormat.h | 7 ---- .../codecs/juce_CoreAudioFormat.cpp | 11 ------- .../codecs/juce_CoreAudioFormat.h | 7 ---- .../codecs/juce_FlacAudioFormat.cpp | 18 ---------- .../codecs/juce_FlacAudioFormat.h | 7 ---- .../codecs/juce_LAMEEncoderAudioFormat.cpp | 24 -------------- .../codecs/juce_LAMEEncoderAudioFormat.h | 4 --- .../codecs/juce_MP3AudioFormat.cpp | 8 ----- .../codecs/juce_MP3AudioFormat.h | 4 --- .../codecs/juce_OggVorbisAudioFormat.cpp | 17 ---------- .../codecs/juce_OggVorbisAudioFormat.h | 7 ---- .../codecs/juce_WavAudioFormat.cpp | 23 ------------- .../codecs/juce_WavAudioFormat.h | 14 -------- .../codecs/juce_WindowsMediaAudioFormat.cpp | 8 ----- .../codecs/juce_WindowsMediaAudioFormat.h | 4 --- .../format/juce_AudioFormat.h | 26 ++++++++------- 18 files changed, 47 insertions(+), 189 deletions(-) diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md index 240501dc49..bc3f80ceef 100644 --- a/BREAKING_CHANGES.md +++ b/BREAKING_CHANGES.md @@ -1,5 +1,38 @@ # JUCE breaking changes +# develop + +## Change + +The AudioFormat class now only has one virtual createWriterFor member function: +`createWriterFor (std::unique_ptr&, const AudioFormatWriterOptions&)`. + +The older createWriterFor overloads are now non-virtual and deprecated. + +**Possible Issues** + +Classes overriding the old AudioFormat::createWriterFor functions will fail to +compile. + +Additionally, code calling the old functions will emit a deprecation warning. + +**Workaround** + +Classes inheriting from AudioFormat should override the new createWriterFor +function that takes an AudioFormatWriterOptions parameter. + +**Rationale** + +Adding support for writing wav files in 32-bit PCM format required the addition +of another parameter to the AudioFormat::createWriterFor interface. This +function already had many parameters, some of them already superfluous for some +of the formats that share this interface. The introduction of a new options type +makes it easier to extend this interface now and in the future. The old +functions are marked deprecated, as allowing to override them would have made +the implementation more complicated. The new signature better communicates +resource ownership, helping to avoid bugs due to misuse. + + ## Change Some functions and types have been moved from the VST3ClientExtentions class diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp index 1b5b9ece0b..c3d91799f6 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -1017,20 +1017,6 @@ MemoryMappedAudioFormatReader* AiffAudioFormat::createMemoryMappedReader (FileIn return nullptr; } -AudioFormatWriter* AiffAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int /*qualityOptionIndex*/) -{ - if (out != nullptr && getPossibleBitDepths().contains (bitsPerSample)) - return new AiffAudioFormatWriter (out, sampleRate, numberOfChannels, - (unsigned int) bitsPerSample, metadataValues); - - return nullptr; -} - std::unique_ptr AiffAudioFormat::createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) { diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h index 0830638581..12119e85c1 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h @@ -88,13 +88,6 @@ public: MemoryMappedAudioFormatReader* createMemoryMappedReader (const File&) override; MemoryMappedAudioFormatReader* createMemoryMappedReader (FileInputStream*) override; - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - std::unique_ptr createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) override; diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp index 8c0e429968..0b3d755117 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -654,17 +654,6 @@ AudioFormatReader* CoreAudioFormat::createReaderFor (InputStream* sourceStream, return nullptr; } -AudioFormatWriter* CoreAudioFormat::createWriterFor (OutputStream*, - double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, - int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, - int /*qualityOptionIndex*/) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - std::unique_ptr CoreAudioFormat::createWriterFor (std::unique_ptr&, const AudioFormatWriterOptions&) { diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h index 16c284a078..74693399f2 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h @@ -106,13 +106,6 @@ public: AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; - AudioFormatWriter* createWriterFor (OutputStream*, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - std::unique_ptr createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) override; diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp index 2a886a1d53..4703e3431a 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -600,24 +600,6 @@ AudioFormatReader* FlacAudioFormat::createReaderFor (InputStream* in, const bool return nullptr; } -AudioFormatWriter* FlacAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& /*metadataValues*/, - int qualityOptionIndex) -{ - if (out != nullptr && getPossibleBitDepths().contains (bitsPerSample)) - { - std::unique_ptr w (new FlacWriter (out, sampleRate, numberOfChannels, - (uint32) bitsPerSample, qualityOptionIndex)); - if (w->ok) - return w.release(); - } - - return nullptr; -} - std::unique_ptr FlacAudioFormat::createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) { diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h index 99f88d7118..63e3263858 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h @@ -69,13 +69,6 @@ public: AudioFormatReader* createReaderFor (InputStream* sourceStream, bool deleteStreamIfOpeningFails) override; - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - using AudioFormat::createWriterFor; private: diff --git a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp index 0983ae0149..cb764f8eea 100644 --- a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp @@ -234,30 +234,6 @@ std::unique_ptr LAMEEncoderAudioFormat::createWriterFor (std: options.getMetadataValues()); } -AudioFormatWriter* LAMEEncoderAudioFormat::createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) -{ - if (streamToWriteTo == nullptr) - return nullptr; - - int vbr = 4; - int cbr = 0; - - const String qual (getQualityOptions() [qualityOptionIndex]); - - if (qual.contains ("VBR")) - vbr = qual.retainCharacters ("0123456789").getIntValue(); - else - cbr = qual.getIntValue(); - - return new Writer (streamToWriteTo, getFormatName(), lameApp, vbr, cbr, - sampleRateToUse, numberOfChannels, bitsPerSample, metadataValues); -} - #endif } // namespace juce diff --git a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h index 50161131f1..45615d0a67 100644 --- a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h @@ -74,10 +74,6 @@ public: AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex); - using AudioFormat::createWriterFor; private: diff --git a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp index dd91fe632c..79644b061c 100644 --- a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp @@ -3180,14 +3180,6 @@ std::unique_ptr MP3AudioFormat::createWriterFor (std::unique_ return nullptr; } -AudioFormatWriter* MP3AudioFormat::createWriterFor (OutputStream*, double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - #endif } // namespace juce diff --git a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h index e3e1c67d01..172b94446d 100644 --- a/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h @@ -71,10 +71,6 @@ public: //============================================================================== AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex) override; - std::unique_ptr createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) override; diff --git a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp index 4c5b0c99ff..e0f4d0ebe5 100644 --- a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp @@ -485,23 +485,6 @@ std::unique_ptr OggVorbisAudioFormat::createWriterFor (std::u return w; } -AudioFormatWriter* OggVorbisAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - unsigned int numChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) -{ - if (out == nullptr) - return nullptr; - - std::unique_ptr w (new OggWriter (out, sampleRate, numChannels, - (unsigned int) bitsPerSample, - qualityOptionIndex, metadataValues)); - - return w->ok ? w.release() : nullptr; -} - StringArray OggVorbisAudioFormat::getQualityOptions() { return { "64 kbps", "80 kbps", "96 kbps", "112 kbps", "128 kbps", "160 kbps", diff --git a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h index 6b404823bb..1f6180e5bc 100644 --- a/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h @@ -96,13 +96,6 @@ public: std::unique_ptr createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) override; - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - using AudioFormat::createWriterFor; private: diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index 11a420fd5c..c4d34f043c 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -2042,29 +2042,6 @@ std::unique_ptr WavAudioFormat::createWriterFor (std::unique_ options.getSampleFormat()); } -AudioFormatWriter* WavAudioFormat::createWriterFor (OutputStream* out, double sampleRate, - unsigned int numChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex) -{ - return createWriterFor (out, sampleRate, WavFileHelpers::canonicalWavChannelSet (static_cast (numChannels)), - bitsPerSample, metadataValues, qualityOptionIndex); -} - -AudioFormatWriter* WavAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - const AudioChannelSet& channelLayout, - int bitsPerSample, - const StringPairArray& metadataValues, - int /*qualityOptionIndex*/) -{ - if (out != nullptr && getPossibleBitDepths().contains (bitsPerSample) && isChannelLayoutSupported (channelLayout)) - return new WavAudioFormatWriter (out, sampleRate, channelLayout, - (unsigned int) bitsPerSample, toMap (metadataValues), - AudioFormatWriterOptions::SampleFormat::automatic); - - return nullptr; -} - namespace WavFileHelpers { static bool slowCopyWavFileWithNewMetadata (const File& file, const StringMap& metadata) diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h index 9c9164bee6..30306bc844 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h @@ -300,20 +300,6 @@ public: std::unique_ptr createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) override; - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - const AudioChannelSet& channelLayout, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - using AudioFormat::createWriterFor; //============================================================================== diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp index 1db0977d42..8a1c162d53 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -357,14 +357,6 @@ AudioFormatReader* WindowsMediaAudioFormat::createReaderFor (InputStream* source return nullptr; } -AudioFormatWriter* WindowsMediaAudioFormat::createWriterFor (OutputStream* /*streamToWriteTo*/, double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - std::unique_ptr WindowsMediaAudioFormat::createWriterFor (std::unique_ptr&, const AudioFormatWriterOptions&) { diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h index 7205eb82f5..dca4f6f863 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h @@ -63,10 +63,6 @@ public: std::unique_ptr createWriterFor (std::unique_ptr& streamToWriteTo, const AudioFormatWriterOptions& options) override; - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex) override; - using AudioFormat::createWriterFor; }; diff --git a/modules/juce_audio_formats/format/juce_AudioFormat.h b/modules/juce_audio_formats/format/juce_AudioFormat.h index d04f01d3b8..022a4e892c 100644 --- a/modules/juce_audio_formats/format/juce_AudioFormat.h +++ b/modules/juce_audio_formats/format/juce_AudioFormat.h @@ -175,12 +175,13 @@ public: ignored @see AudioFormatWriter */ - virtual AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) = 0; + [[deprecated ("Use the function taking an AudioFormatWriterOptions instead.")]] + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex); /** Tries to create an object that can write to a stream with this audio format. @@ -213,12 +214,13 @@ public: ignored @see AudioFormatWriter */ - virtual AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - const AudioChannelSet& channelLayout, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex); + [[deprecated ("Use the function taking an AudioFormatWriterOptions instead.")]] + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + const AudioChannelSet& channelLayout, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex); protected: /** Creates an AudioFormat object.