Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion IPython/lib/display.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ def _validate_and_normalize_without_numpy(data, normalize):
def _get_normalization_factor(max_abs_value, normalize):
if not normalize and max_abs_value > 1:
raise ValueError('Audio data must be between -1 and 1 when normalize=False.')
return max_abs_value if normalize else 1
return max_abs_value if normalize and max_abs_value != 0 else 1

def _data_and_metadata(self):
"""shortcut for returning metadata with url information, if defined"""
Expand Down
28 changes: 28 additions & 0 deletions tests/test_display.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import pathlib
from unittest import mock
import struct
import sys
import wave
from io import BytesIO

Expand Down Expand Up @@ -260,6 +261,33 @@ def test_audio_data_without_normalization():
assert actual_max_value == expected_max_value


@pytest.mark.filterwarnings("error::RuntimeWarning")
@pytest.mark.parametrize("normalize", [True, False])
@pytest.mark.parametrize("channels", [1, 2])
@skipif_not_numpy
def test_audio_silence(channels, normalize):
samples = 16
data = numpy.zeros(samples if channels == 1 else (channels, samples))
audio = display.Audio(data, rate=8000, normalize=normalize)
with wave.open(BytesIO(audio.data)) as wave_file:
assert wave_file.getnchannels() == channels
assert wave_file.getnframes() == samples
assert wave_file.getframerate() == 8000
assert wave_file.readframes(samples) == bytes(samples * channels * 2)


@pytest.mark.parametrize("normalize", [True, False])
def test_audio_silence_no_numpy(monkeypatch, normalize):
monkeypatch.setitem(sys.modules, "numpy", None)
samples = 16
audio = display.Audio([0.0] * samples, rate=8000, normalize=normalize)
with wave.open(BytesIO(audio.data)) as wave_file:
assert wave_file.getnchannels() == 1
assert wave_file.getnframes() == samples
assert wave_file.getframerate() == 8000
assert wave_file.readframes(samples) == bytes(samples * 2)


def test_audio_data_without_normalization_raises_for_invalid_data():
pytest.raises(ValueError, display.Audio, [1.001], rate=44100, normalize=False)
pytest.raises(ValueError, display.Audio, [-1.001], rate=44100, normalize=False)
Expand Down
Loading