[alsa-devel] [PATCH] ALSA: ctl: allow TLV read operation for callback type of element in locked case
Takashi Sakamoto
o-takashi at sakamocchi.jp
Mon Dec 23 10:42:34 CET 2019
On Mon, Dec 23, 2019 at 06:33:47PM +0900, Takashi Sakamoto wrote:
> At present, when an element has callback function for TLV information,
> TLV read operation returns EPERM if the element is locked. On the
> other hand, the read operation is success when an element has allocated
> array for TLV information. In both cases, read operation is success for
> element value expectedly.
You can regenerate the issue by executing below Python 3 scripts:
(Installation of alsa-gobject[1], PyGObject[2] and amixer(1) in
alsa-utils is required.)
After element is locked, amixer reports EPERM for any read operation of
TLV information.
```
#########after locked#########
numid=28,iface=PCM,name='Playback Channel Map'
; type=INTEGER,access=r---lR--,values=6,min=0,max=36,step=0
: values=0,0,0,0,0,0
amixer: Control hw:1 element TLV read error: Operation not permitted
```
======== 8< --------
#!/usr/bin/env python3
from sys import argv,exit
import subprocess
import gi
gi.require_version('ALSACtl', '0.0')
from gi.repository import ALSACtl
def lock_elems(card, targets, locked):
for target in targets:
card.lock_elem(target, locked)
def run_amixer(label, targets):
print('{:#^30}'.format(label))
args = ['amixer', '-c', str(card_id), 'cget', '(placeholder)']
for target in targets:
args[4] = "iface=PCM,name='{}'".format(target.get_name())
subprocess.run(args)
if len(argv) < 2:
print('One argument is required for the numerical ID of soundcard.')
exit(1)
card_id = int(argv[1])
card = ALSACtl.Card.new()
card.open(card_id)
targets = list(filter(lambda e: e.get_name().find("Channel Map") >= 0,
card.get_elem_id_list()))
run_amixer('before locked', targets)
lock_elems(card, targets, True)
run_amixer('after locked', targets)
lock_elems(card, targets, False)
run_amixer('after released', targets)
# The lock is surely released automatically when control character device is
# released. Thus it's safe to terminate the above codes in its middle.
======== 8< --------
[1] https://github.com/alsa-project/alsa-gobject/
[2] https://pygobject.readthedocs.io/en/latest/
More information about the Alsa-devel
mailing list