From: Takashi Sakamoto Date: Sun, 14 Jun 2020 12:35:43 +0000 (+0900) Subject: samples: add Python 3 sample script for ALSACtl X-Git-Tag: v0.1.0~43 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=eacb5fa40967727dbac17c916e12d2c87b35f78f;p=alsa-gobject.git samples: add Python 3 sample script for ALSACtl Signed-off-by: Takashi Sakamoto --- diff --git a/samples/ctl b/samples/ctl new file mode 100755 index 0000000..2976cbb --- /dev/null +++ b/samples/ctl @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +import gi +gi.require_version('GLib', '2.0') +gi.require_version('ALSACtl', '0.0') +from gi.repository import GLib, ALSACtl + +from signal import SIGINT + +# Retrieve the list of available sound cards. +card_id_list = ALSACtl.get_card_id_list() + +# Open ALSA control character device. +card = ALSACtl.Card.new() +card.open(card_id_list[0], 0) + +# Get the information of card and dump. +info = card.get_info() +print('Sound card:') +for prop in ('card-id', 'id', 'driver', 'name', 'long-name', 'mixer-name', + 'components'): + print(' {}: {}'.format(prop, info.get_property(prop))) + +# Enumerate available elements for the card. +print('Elements:') +for elem_id in card.get_elem_id_list(): + info = card.get_elem_info(elem_id) + print(' name:', elem_id.get_name()) + print(' type', info.get_property('type').value_nick) + print(' access', info.get_property('access').value_nicks) + print(' value-count', info.get_property('value-count')) + +# Dispatch event. +def handle_elem_event(card, elem_id, events): + print('Event:') + print(' ', elem_id.get_name(), events.value_nicks) + info = card.get_elem_info(elem_id) + value_count = info.get_property('value-count') + elem_value = ALSACtl.ElemValue.new() + elem_value = card.read_elem_value(elem_id, elem_value) + value = [0] * value_count + if info.get_property('type') == ALSACtl.ElemType.BOOLEAN: + value = elem_value.get_bool(value) + elif info.get_property('type') == ALSACtl.ElemType.INTEGER: + value = elem_value.get_int(value) + elif info.get_property('type') == ALSACtl.ElemType.ENUMERATED: + value = elem_value.get_enum(value) + elif info.get_property('type') == ALSACtl.ElemType.BYTES: + value = elem_value.get_bytes(value) + elif info.get_property('type') == ALSACtl.ElemType.IEC60958: + channel_status = elem_value.get_channel_status() + user_data = elem_value.get_user_data() + elif info.get_property('type') == ALSACtl.ElemType.INTEGER64: + value = elem_value.get_int64(value) + else: + return + print(value) +card.connect('handle-elem-event', handle_elem_event) + +# Register my elements. +elem_id = ALSACtl.ElemId.new_by_name(ALSACtl.ElemIfaceType.CARD, 10, 20, "my-elements", 0) +elem_info = ALSACtl.ElemInfo.new(ALSACtl.ElemType.INTEGER) +flags = (ALSACtl.ElemAccessFlag.READ | + ALSACtl.ElemAccessFlag.WRITE) +elem_info.set_property('access', flags) +elem_info.set_property('value-count', 32) +elem_info.set_int_data((-123, 456, 21)) +elem_id_list = card.add_elems(elem_id, 10, elem_info) + +# Create event dispatcher. +dispatcher = GLib.MainLoop.new(None, False) +src = card.create_source() +src.attach(dispatcher.get_context()) + +# Register UNIX signal handler. +def handle_unix_signal(dispatcher): + dispatcher.quit() +GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, SIGINT, + handle_unix_signal, dispatcher) + +# Start to dispatch events. +dispatcher.run() + +# Remove my elems. +card.remove_elems(elem_id_list[0])