pyebur128/tests/test_max_true_peak.py

63 lines
2 KiB
Python
Raw Permalink Normal View History

2021-03-21 23:37:47 +00:00
from math import log10
import pytest
from pyebur128 import (
ChannelType, MeasurementMode, R128State, get_true_peak
)
import soundfile as sf
def get_max_true_peak(filename):
'''Open the WAV file and get the maximum true loudness peak.'''
with sf.SoundFile(filename) as wav:
state = R128State(wav.channels,
wav.samplerate,
MeasurementMode.MODE_TRUE_PEAK)
2021-03-21 23:37:47 +00:00
if wav.channels == 5:
state.set_channel(0, ChannelType.LEFT)
state.set_channel(1, ChannelType.RIGHT)
state.set_channel(2, ChannelType.CENTER)
state.set_channel(3, ChannelType.LEFT_SURROUND)
state.set_channel(4, ChannelType.RIGHT_SURROUND)
2021-03-21 23:37:47 +00:00
for sample in wav.read():
state.add_frames(sample, 1)
max_true_peak = float('-inf')
for channel in range(state.channels):
true_peak = get_true_peak(state, channel)
max_true_peak = max(true_peak, max_true_peak)
del state
return 20 * log10(max_true_peak)
def test_max_true_peak(r128_test_data):
'''Test for the maximum true loudness peak value of a single file.'''
expected = [
('seq-3341-15-24bit.wav.wav', -6.0),
('seq-3341-16-24bit.wav.wav', -6.0),
('seq-3341-17-24bit.wav.wav', -6.0),
('seq-3341-18-24bit.wav.wav', -6.0),
('seq-3341-19-24bit.wav.wav', 3.0),
('seq-3341-20-24bit.wav.wav', 0.0),
('seq-3341-21-24bit.wav.wav', 0.0),
('seq-3341-22-24bit.wav.wav', 0.0),
('seq-3341-23-24bit.wav.wav', 0.0),
]
tolerance = 0.4
status_msg = '==== \'{}\': want {} \u00b1 {} ---> '
print('\n')
for test in expected:
print(status_msg.format(test[0], test[1], tolerance), end='')
result = get_max_true_peak(r128_test_data / test[0])
print('got {} '.format(round(result, 1)), end='')
assert (round(result, 1) <= test[1] + tolerance and
round(result, 1) >= test[1] - tolerance)
print('---> PASSED!')