Files
3d_audio/lib_audio_dsp/test/json/test_limiter_pipeline.py

189 lines
5.6 KiB
Python
Raw Normal View History

2025-12-11 09:43:42 +08:00
# 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()