Codebase list hinawa-utils / HEAD hinawa-tascam-fw-rack-cli
HEAD

Tree @HEAD (Download .tar.gz)

hinawa-tascam-fw-rack-cli @HEADraw · history · blame

#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2018 Takashi Sakamoto

from hinawa_utils.misc.cli_kit import CliKit
from hinawa_utils.tscm.tscm_rack_unit import TscmRackUnit


def handle_clock_source(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            if unit.get_property('streaming'):
                print('Packet streaming started.')
                return False
            source = args[1]
            unit.set_clock_source(source)
        else:
            print(unit.get_clock_source())
        return True
    print('Arguments for clock-source command:')
    print('  clock-source OP [SRC]')
    print('    OP:     [{0}]'.format('|'.join(ops)))
    print('    SRC:    [{0}]'.format('|'.join(unit.supported_clock_sources)))
    return False


def handle_sampling_rate(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            rate = int(args[1])
            unit.set_sampling_rate(rate)
        else:
            print(unit.get_sampling_rate())
        return True
    print('Arguments for sampling-rate command:')
    print('  sampling-rate OP [RATE]')
    print('    OP:     [{0}]'.format('|'.join(ops)))
    rates = [str(r) for r in unit.supported_sampling_rates]
    print('    RATE:   [{0}]'.format('|'.join(rates)))
    return False


def handle_firmware_versions(unit, args):
    info = unit.get_firmware_versions()
    for name, value in info.items():
        print('{0}: {1}'.format(name, value))
    return True


def handle_routing(unit, args, cmd, labels, set_func, get_func):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2 and args[1] in labels:
            src = args[1]
            set_func(src)
            return True
        elif op == 'get':
            print(get_func())
            return True
    print('Arguments for {0} command:'.format(cmd))
    print('  {0} OP [SRC]'.format(cmd))
    print('    OP:     [{0}]'.format('|'.join(ops)))
    print('    SRC:    [{0}]'.format('|'.join(labels)))
    return False


def handle_coax_out_src(unit, args):
    return handle_routing(unit, args, 'coaxial-out-source',
                          unit.get_coax_out_src_labels(),
                          unit.set_coax_out_src,
                          unit.get_coax_out_src)


def handle_opt_out_src(unit, args):
    return handle_routing(unit, args, 'optical-out-source',
                          unit.get_opt_out_src_labels(),
                          unit.set_opt_out_src,
                          unit.get_opt_out_src)


def handle_stream_spdif_in_src(unit, args):
    return handle_routing(unit, args, 'stream-spdif-in-source',
                          unit.get_stream_spdif_in_src_labels(),
                          unit.set_stream_spdif_in_src,
                          unit.get_stream_spdif_in_src)


def handle_input_threshold(unit, args):
    ops = ('set', 'get')

    if len(args) >= 1 and args[0] in ops:
        op = args[0]
        if op == 'set' and len(args) >= 2:
            level = float(args[1])
            unit.set_input_threshold(level)
            return True
        elif op == 'get':
            level = unit.get_input_threshold()
            print('{:.3f}'.format(level))
            return True
    print('Arguments for input-threshold command:')
    print('  input-threshold OP [LEVEL]')
    print('    OP:     [{0}]'.format('|'.join(ops)))
    print('    LEVEL:  [-inf, -90..0]')
    return True


def handle_monitor_input(unit, args):
    ops = ('set', 'get')
    items = {
        'gain':     (unit.set_gain,     unit.get_gain),
        'mute':     (unit.set_mute,     unit.get_mute),
        'balance':  (unit.set_balance,  unit.get_balance),
    }
    labels = unit.get_channel_labels()

    if len(args) >= 1 and args[0] in labels:
        ch = args[0]
        if len(args) >= 2 and args[1] in items:
            item = args[1]
            set_func, get_func = items[item]
            if len(args) >= 3 and args[2] in ops:
                op = args[2]
                if len(args) >= 4 and op == 'set':
                    val = None
                    if item == 'gain':
                        val = float(args[3])
                    elif item == 'mute':
                        val = bool(int(args[3]))
                    elif item == 'balance':
                        val = int(args[3])
                    if val != None:
                        set_func(ch, val)
                        return True
                elif op == 'get':
                    print(get_func(ch))
                    return True
    print('Arguments for monitor-input command:')
    print('  monitor-input CH ITEM OP [dB|MUTE|BALANCE]')
    print('    CH:     [{0}]'.format('|'.join(labels)))
    print('    ITEM:   [{0}]'.format('|'.join(items)))
    print('    OP:     [{0}]'.format('|'.join(ops)))
    print('    dB:     [0-99] (percentage) if OP=set')
    print('    MUTE:   [0|1] if OP=set')
    print('    BALANCE:[0-99] (left-to-right, percentage) if OP=set')
    return False


cmds = {
    'clock-source':         handle_clock_source,
    'sampling-rate':        handle_sampling_rate,
    'firmware-versions':    handle_firmware_versions,
    'coaxial-out-source':   handle_coax_out_src,
    'optical-out-source':   handle_opt_out_src,
    'stream-spdif-in-source': handle_stream_spdif_in_src,
    'input-threshold':      handle_input_threshold,

    'monitor-input':        handle_monitor_input,
}

fullpath = CliKit.seek_snd_unit_path()
if fullpath:
    with TscmRackUnit(fullpath) as unit:
        CliKit.dispatch_command(unit, cmds)