]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
samples: add Python 3 sample script for ALSACtl
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 14 Jun 2020 12:35:43 +0000 (21:35 +0900)
committer坂本 貴史 <o-takashi@sakamocchi.jp>
Sun, 14 Jun 2020 13:11:06 +0000 (22:11 +0900)
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
samples/ctl [new file with mode: 0755]

diff --git a/samples/ctl b/samples/ctl
new file mode 100755 (executable)
index 0000000..2976cbb
--- /dev/null
@@ -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])