diff --git a/pedalboard/juce_overrides/juce_PatchedMP3AudioFormat.cpp b/pedalboard/juce_overrides/juce_PatchedMP3AudioFormat.cpp index add0ef6d..b9f2fc46 100644 --- a/pedalboard/juce_overrides/juce_PatchedMP3AudioFormat.cpp +++ b/pedalboard/juce_overrides/juce_PatchedMP3AudioFormat.cpp @@ -3323,6 +3323,10 @@ class PatchedMP3Reader : public AudioFormatReaderWithPosition { return false; } + if (numDestChannels == 0) { + return true; + } + if (currentPosition != startSampleInFile) { if (!stream.seek((int)(startSampleInFile / samplesPerFrame - 1))) { currentPosition = -1; diff --git a/tests/audio/correct/zero_channels.mp3 b/tests/audio/correct/zero_channels.mp3 new file mode 100644 index 00000000..ebc6b3b6 Binary files /dev/null and b/tests/audio/correct/zero_channels.mp3 differ diff --git a/tests/test_io.py b/tests/test_io.py index 9ef69d04..fdf4dce7 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -1271,6 +1271,13 @@ def test_real_mp3_parsing_with_no_header(): assert f.read(f.frames).shape[1] == f.frames +def test_real_mp3_parsing_with_no_channels(): + filename = os.path.join(os.path.dirname(__file__), "audio", "correct", "zero_channels.mp3") + with pedalboard.io.AudioFile(filename) as f: + assert f.num_channels == 0 + assert f.read(f.frames).shape == (0, 0) + + @pytest.mark.parametrize("samplerate", [44100, 32000]) @pytest.mark.parametrize("chunk_size", [1, 2, 16]) @pytest.mark.parametrize("target_samplerate", [44100, 32000, 22050, 1234.56])