blob: 476ffd56b988902a3681cb2b7e3dd2ad505bea67 [file] [log] [blame]
#!/usr/bin/python
#
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# convert audio.conf from the audio tuning UI to dsp.ini which can be
# accepted by cras eq/drc plugin.
import json
import sys
import fnmatch
biquad_type_name = [
"none",
"lowpass",
"highpass",
"bandpass",
"lowshelf",
"highshelf",
"peaking",
"notch",
"allpass"
]
header = """\
[output_source]
library=builtin
label=source
purpose=playback
disable=(not (equal? dsp_name "speaker_eq"))
output_0={src:0}
output_1={src:1}
[output_sink]
library=builtin
label=sink
purpose=playback
input_0={dst:0}
input_1={dst:1}"""
drc_header = """\
[drc]
library=builtin
label=drc
input_0={%s:0}
input_1={%s:1}
output_2={%s:0}
output_3={%s:1}
input_4=%-7d ; emphasis_disabled"""
drc_param = """\
input_%d=%-7g ; f
input_%d=%-7g ; enable
input_%d=%-7g ; threshold
input_%d=%-7g ; knee
input_%d=%-7g ; ratio
input_%d=%-7g ; attack
input_%d=%-7g ; release
input_%d=%-7g ; boost"""
eq_header = """\
[eq2]
library=builtin
label=eq2
input_0={%s:0}
input_1={%s:1}
output_2={%s:0}
output_3={%s:1}"""
eq_param = """\
input_%d=%-7d ; %s
input_%d=%-7g ; freq
input_%d=%-7g ; Q
input_%d=%-7g ; gain"""
def is_true(d, pattern):
for k in d:
if fnmatch.fnmatch(k, pattern) and d[k]:
return True
return False
def intermediate_name(index):
return 'intermediate' + ('' if index == 1 else str(index))
def main():
f = open(sys.argv[1])
d = json.loads(f.read())
print header
has_drc = is_true(d, 'global.enable_drc') and is_true(d, 'drc.*.enable')
has_eq = is_true(d, 'global.enable_eq') and is_true(d, 'eq.*.*.enable')
stages = []
if has_drc:
stages.append(print_drc)
if has_eq:
stages.append(print_eq)
if is_true(d, 'global.enable_swap') and len(stages) >= 2:
stages[0], stages[1] = stages[1], stages[0]
for i in range(len(stages)):
print
src = 'src' if i == 0 else intermediate_name(i)
dst = 'dst' if i == len(stages) - 1 else intermediate_name(i + 1)
stages[i](d, src, dst)
def print_drc(d, src, dst):
print drc_header % (src, src, dst, dst, int(d['drc.emphasis_disabled']))
n = 5
for i in range(3):
prefix = 'drc.%d.' % i
f = d[prefix + 'f']
enable = int(d[prefix + 'enable'])
threshold = d[prefix + 'threshold']
knee = d[prefix + 'knee']
ratio = d[prefix + 'ratio']
attack = d[prefix + 'attack']
release = d[prefix + 'release']
boost = d[prefix + 'boost']
print drc_param % (n, f,
n+1, enable,
n+2, threshold,
n+3, knee,
n+4, ratio,
n+5, attack,
n+6, release,
n+7, boost)
n += 8
# Returns two sorted lists, each one contains the enabled eq index for a channel
def enabled_eq(d):
eeq = [[], []]
for k in d:
s = k.split('.')
if s[0] == 'eq' and s[3] == 'enable' and d[k]:
ch_index = int(s[1])
eq_num = int(s[2])
eeq[ch_index].append(eq_num)
return sorted(eeq[0]), sorted(eeq[1])
def print_eq(d, src, dst):
print eq_header % (src, src, dst, dst)
eeq = enabled_eq(d)
eeqn = max(len(eeq[0]), len(eeq[1]))
n = 4 # the first input index
for i in range(0, eeqn):
for ch in (0, 1):
if i < len(eeq[ch]):
prefix = 'eq.%d.%d.' % (ch, eeq[ch][i])
type_name = d[prefix + 'type']
type_index = biquad_type_name.index(type_name)
f = d[prefix + 'freq']
q = d[prefix + 'q']
g = d[prefix + 'gain']
else:
type_name = 'none';
type_index = 0;
f = q = g = 0
print eq_param % (n, type_index, type_name,
n+1, f, n+2, q, n+3, g)
n += 4
main()