189 lines
5.6 KiB
Python
189 lines
5.6 KiB
Python
|
|
# Copyright 2025 XMOS LIMITED.
|
||
|
|
# This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||
|
|
"""Test limiter pipeline creation."""
|
||
|
|
|
||
|
|
from audio_dsp.design.parse_json import DspJson, make_pipeline, pipeline_to_dspjson
|
||
|
|
|
||
|
|
|
||
|
|
def test_rms_limiter_pipeline():
|
||
|
|
"""Test creating an RMS limiter pipeline."""
|
||
|
|
print("Creating RMS limiter pipeline...")
|
||
|
|
|
||
|
|
# Create an RMS limiter pipeline JSON
|
||
|
|
pipeline_json = {
|
||
|
|
"ir_version": 1,
|
||
|
|
"producer_name": "test_limiter",
|
||
|
|
"producer_version": "0.1",
|
||
|
|
"graph": {
|
||
|
|
"name": "RMS Limiter",
|
||
|
|
"fs": 48000,
|
||
|
|
"nodes": [
|
||
|
|
{
|
||
|
|
"op_type": "LimiterRMS",
|
||
|
|
"parameters": {
|
||
|
|
"threshold_db": -6.0,
|
||
|
|
"attack_t": 0.01,
|
||
|
|
"release_t": 0.1
|
||
|
|
},
|
||
|
|
"placement": {
|
||
|
|
"input": [["inputs", 0], ["inputs", 1]],
|
||
|
|
"name": "StereoRMSLimiter",
|
||
|
|
"thread": 0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"inputs": [
|
||
|
|
{
|
||
|
|
"name": "inputs",
|
||
|
|
"channels": 2
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "outputs",
|
||
|
|
"input": [["StereoRMSLimiter", 0], ["StereoRMSLimiter", 1]]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
dsp_json = DspJson(**pipeline_json)
|
||
|
|
pipeline = make_pipeline(dsp_json)
|
||
|
|
|
||
|
|
# Find our limiter stage
|
||
|
|
limiter_stage = None
|
||
|
|
for stage in pipeline.stages:
|
||
|
|
if stage.name == "limiter_rms":
|
||
|
|
limiter_stage = stage
|
||
|
|
break
|
||
|
|
|
||
|
|
assert limiter_stage is not None, "Could not find RMS Limiter stage in pipeline"
|
||
|
|
|
||
|
|
new_json = pipeline_to_dspjson(pipeline)
|
||
|
|
assert dsp_json.graph == new_json.graph, "Pipeline JSON does not match original"
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
def test_peak_limiter_pipeline():
|
||
|
|
"""Test creating a peak limiter pipeline."""
|
||
|
|
print("Creating peak limiter pipeline...")
|
||
|
|
|
||
|
|
# Create a peak limiter pipeline JSON
|
||
|
|
pipeline_json = {
|
||
|
|
"ir_version": 1,
|
||
|
|
"producer_name": "test_limiter",
|
||
|
|
"producer_version": "0.1",
|
||
|
|
"graph": {
|
||
|
|
"name": "Peak Limiter",
|
||
|
|
"fs": 48000,
|
||
|
|
"nodes": [
|
||
|
|
{
|
||
|
|
"op_type": "LimiterPeak",
|
||
|
|
"parameters": {
|
||
|
|
"threshold_db": -3.0,
|
||
|
|
"attack_t": 0.005,
|
||
|
|
"release_t": 0.05
|
||
|
|
},
|
||
|
|
"placement": {
|
||
|
|
"input": [["inputs", 0], ["inputs", 1]],
|
||
|
|
"name": "StereoPeakLimiter",
|
||
|
|
"thread": 0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"inputs": [
|
||
|
|
{
|
||
|
|
"name": "inputs",
|
||
|
|
"channels": 2
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "outputs",
|
||
|
|
"input": [["StereoPeakLimiter", 0], ["StereoPeakLimiter", 1]]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
dsp_json = DspJson(**pipeline_json)
|
||
|
|
pipeline = make_pipeline(dsp_json)
|
||
|
|
|
||
|
|
# Find our limiter stage
|
||
|
|
limiter_stage = None
|
||
|
|
for stage in pipeline.stages:
|
||
|
|
if stage.name == "limiter_peak":
|
||
|
|
limiter_stage = stage
|
||
|
|
break
|
||
|
|
|
||
|
|
assert limiter_stage is not None, "Could not find Peak Limiter stage in pipeline"
|
||
|
|
|
||
|
|
new_json = pipeline_to_dspjson(pipeline)
|
||
|
|
assert dsp_json.graph == new_json.graph, "Pipeline JSON does not match original"
|
||
|
|
|
||
|
|
|
||
|
|
def test_hard_peak_limiter_pipeline():
|
||
|
|
"""Test creating a hard peak limiter pipeline."""
|
||
|
|
print("Creating hard peak limiter pipeline...")
|
||
|
|
|
||
|
|
# Create a hard peak limiter pipeline JSON
|
||
|
|
pipeline_json = {
|
||
|
|
"ir_version": 1,
|
||
|
|
"producer_name": "test_limiter",
|
||
|
|
"producer_version": "0.1",
|
||
|
|
"graph": {
|
||
|
|
"name": "Hard Peak Limiter",
|
||
|
|
"fs": 48000,
|
||
|
|
"nodes": [
|
||
|
|
{
|
||
|
|
"op_type": "HardLimiterPeak",
|
||
|
|
"parameters": {
|
||
|
|
"threshold_db": -1.0,
|
||
|
|
"attack_t": 0.001,
|
||
|
|
"release_t": 0.02
|
||
|
|
},
|
||
|
|
"placement": {
|
||
|
|
"input": [["inputs", 0], ["inputs", 1]],
|
||
|
|
"name": "StereoHardPeakLimiter",
|
||
|
|
"thread": 0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"inputs": [
|
||
|
|
{
|
||
|
|
"name": "inputs",
|
||
|
|
"channels": 2
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "outputs",
|
||
|
|
"input": [["StereoHardPeakLimiter", 0], ["StereoHardPeakLimiter", 1]]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
dsp_json = DspJson(**pipeline_json)
|
||
|
|
pipeline = make_pipeline(dsp_json)
|
||
|
|
|
||
|
|
# Find our limiter stage
|
||
|
|
limiter_stage = None
|
||
|
|
for stage in pipeline.stages:
|
||
|
|
if stage.name == "hard_limiter_peak":
|
||
|
|
limiter_stage = stage
|
||
|
|
break
|
||
|
|
|
||
|
|
assert limiter_stage is not None, "Could not find Hard Peak Limiter stage in pipeline"
|
||
|
|
|
||
|
|
new_json = pipeline_to_dspjson(pipeline)
|
||
|
|
assert dsp_json.graph == new_json.graph, "Pipeline JSON does not match original"
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
test_rms_limiter_pipeline()
|
||
|
|
print("\n" + "="*50 + "\n")
|
||
|
|
test_peak_limiter_pipeline()
|
||
|
|
print("\n" + "="*50 + "\n")
|
||
|
|
test_hard_peak_limiter_pipeline()
|