| #!/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() |