OSDN Git Service

android-x86/external-alsa-lib.git
3 years agodlsym: add support for ALSA_PLUGIN_DIR environment variable
Jaroslav Kysela [Tue, 13 Oct 2020 08:43:44 +0000 (10:43 +0200)]
dlsym: add support for ALSA_PLUGIN_DIR environment variable

In some cases, it may be useful to specify the plugin directory
using the environment variable.

BugLink: https://github.com/alsa-project/alsa-lib/issues/82
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agopcm: fix the snd_pcm_plugin_status() avail and delay fields
Jaroslav Kysela [Fri, 9 Oct 2020 17:57:57 +0000 (19:57 +0200)]
pcm: fix the snd_pcm_plugin_status() avail and delay fields

The avail and delay fields in the returned status structure does not
reflect the actual hw_ptr/appl_ptr. This change correct this.

TODO: Unfortunately, the delay might contain also information about
extra hardware / buffering delay which is hidden with this change.

Link: https://lore.kernel.org/alsa-devel/d9c1f37e-5c8d-f289-270e-c6cda7a56ce3@axis.com/
Reported-by: Jonas Holmberg <jonashg@axis.com>
Tested-by: Jonas Holmberg <jonashg@axis.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agoucm: rename once_list to boot_list
Jaroslav Kysela [Tue, 6 Oct 2020 08:47:11 +0000 (10:47 +0200)]
ucm: rename once_list to boot_list

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agoucm: substitute the comment string also in the main configuration file
Jaroslav Kysela [Tue, 6 Oct 2020 08:43:38 +0000 (10:43 +0200)]
ucm: substitute the comment string also in the main configuration file

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agoucm: add a check for the empty configuration
Jaroslav Kysela [Tue, 6 Oct 2020 08:40:40 +0000 (10:40 +0200)]
ucm: add a check for the empty configuration

Return an error if the UCM configuration is empty (no verbs
or no boot sequence).

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agoucm: Handle 'Error' keyword in the master file
Jaroslav Kysela [Tue, 6 Oct 2020 08:23:25 +0000 (10:23 +0200)]
ucm: Handle 'Error' keyword in the master file

With the conditional blocks, it may be useful to terminate
the hardware detection from the configuration. Introduce
'Error' keyword for the master UCM configuration file.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agocontrol: Add documentation for snd_ctl_elem_value_*.
Tanjeff-N. Moos [Wed, 2 Sep 2020 09:27:27 +0000 (11:27 +0200)]
control: Add documentation for snd_ctl_elem_value_*.

Signed-off-by: Tanjeff-N. Moos <tanjeff@cccmz.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
3 years agocontrol: Improve general control interface documentation.
Tanjeff-N. Moos [Wed, 2 Sep 2020 09:27:26 +0000 (11:27 +0200)]
control: Improve general control interface documentation.

Signed-off-by: Tanjeff-N. Moos <tanjeff@cccmz.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
3 years agotopology: improve the printf buffer management
Jaroslav Kysela [Mon, 31 Aug 2020 17:44:46 +0000 (19:44 +0200)]
topology: improve the printf buffer management

The commit d04e72c9a593015952e4858b92ab3f9d821560d9 introduced
the dynamic printf buffer allocation for each tplg_save_printf()
call.

Introduce 'struct tplg_buf' which carries extra information about
the temporary printf buffer and the destination buffer to save allocation
requests.

The printf buffer is also allocated using 1024 bytes chunks.

A comparison between 'alloc everyting' and 'cache+chunk alloc' for the
random picked topology file:

  1: 18,620 allocs, 18,620 frees, 7,239,688 bytes allocated
  2: 12,490 allocs, 12,490 frees, 962,568 bytes allocated

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: fix the unaligned access
Jaroslav Kysela [Mon, 31 Aug 2020 12:27:26 +0000 (14:27 +0200)]
topology: fix the unaligned access

Introduce unaligned_get32/put32 helpers to deal with the
packed structures.

Use the gcc __BYTE_ORDER__ defines for the endian checks.
It may be improved to support other compilation environment.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: fix sort_config()
Jaroslav Kysela [Mon, 31 Aug 2020 12:25:56 +0000 (14:25 +0200)]
topology: fix sort_config()

The temporary config array must be initialized for all compound types.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: fix some gcc10 warnings (labs, signess)
Jaroslav Kysela [Mon, 31 Aug 2020 11:25:01 +0000 (13:25 +0200)]
topology: fix some gcc10 warnings (labs, signess)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: return correct value in tplg_save_printf()
Jaroslav Kysela [Mon, 31 Aug 2020 11:21:26 +0000 (13:21 +0200)]
topology: return correct value in tplg_save_printf()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: Make buffer for saving dynamic size
Piotr Maziarz [Mon, 31 Aug 2020 09:09:03 +0000 (11:09 +0200)]
topology: Make buffer for saving dynamic size

Some fields can exceed size limit, e.g. private data has no size
restriction. Therefore it needs to be dynamically increased.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Add DAI name printing
Piotr Maziarz [Mon, 31 Aug 2020 09:09:02 +0000 (11:09 +0200)]
topology: decode: Add DAI name printing

DAI name is a part of topology binary. Not printing makes data loss while
converting from binary to standard ALSA configuration file.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Print sig_bits field in PCM capabilities section
Piotr Maziarz [Mon, 31 Aug 2020 09:09:01 +0000 (11:09 +0200)]
topology: decode: Print sig_bits field in PCM capabilities section

Not printing this field makes data loss while converting from binary
to standard ALSA configuration file.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Fix decoding PCM formats and rates
Piotr Maziarz [Mon, 31 Aug 2020 09:09:00 +0000 (11:09 +0200)]
topology: decode: Fix decoding PCM formats and rates

Not checking _LAST format and rate, which are valid indexes in arrays,
makes data loss while converting binary to standard ALSA configuration
file.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Change declaration of enum decoding function
Piotr Maziarz [Mon, 31 Aug 2020 09:08:59 +0000 (11:08 +0200)]
topology: decode: Change declaration of enum decoding function

Size constraints are always checked before invoking
tplg_decode_control_enum1. There is no need to validate it twice.
Alos moved debug print about size to invoking function, since now it's it
responsibility to check size.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Fix printing texts section
Piotr Maziarz [Mon, 31 Aug 2020 09:08:58 +0000 (11:08 +0200)]
topology: decode: Fix printing texts section

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Add enum control texts as separate element
Piotr Maziarz [Mon, 31 Aug 2020 09:08:57 +0000 (11:08 +0200)]
topology: decode: Add enum control texts as separate element

Texts are separate sections that should referenced by enum control.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Remove decoding values for enum control
Piotr Maziarz [Mon, 31 Aug 2020 09:08:56 +0000 (11:08 +0200)]
topology: decode: Remove decoding values for enum control

Values have no representation in standard ALSA configuration files,
therefore there is no need to populate them. Also memory for values
wasn't allocated which was causing undefined behaviour.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Fix infinite loop in decoding enum control
Piotr Maziarz [Mon, 31 Aug 2020 09:08:55 +0000 (11:08 +0200)]
topology: decode: Fix infinite loop in decoding enum control

Accessing memory outside of allocated boundaries caused segmentation fault.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agotopology: decode: Fix channel map memory allocation
Piotr Maziarz [Mon, 31 Aug 2020 09:08:54 +0000 (11:08 +0200)]
topology: decode: Fix channel map memory allocation

Memory allocated on the stack was referenced outside of the function scope
caused undefined behaviour.

Signed-off-by: Piotr Maziarz <piotrx.maziarz@linux.intel.com>
Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agoconf: quote also strings with '*' and '#' characters in string_print()
Jaroslav Kysela [Tue, 18 Aug 2020 14:53:23 +0000 (16:53 +0200)]
conf: quote also strings with '*' and '#' characters in string_print()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
3 years agocontrol: Add documentation for snd_ctl_elem_list_*.
Tanjeff-N. Moos [Fri, 14 Aug 2020 06:40:28 +0000 (08:40 +0200)]
control: Add documentation for snd_ctl_elem_list_*.

Signed-off-by: Tanjeff-N. Moos <tanjeff@cccmz.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
3 years agoREADME: add patch submission instructions
Tanu Kaskinen [Sat, 15 Aug 2020 17:35:55 +0000 (20:35 +0300)]
README: add patch submission instructions

Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
3 years agopcm: dmix: fix access to sum-buffer in non-interleaved mixing mode
Vijay Palaniswamy [Thu, 23 Jul 2020 06:19:10 +0000 (11:49 +0530)]
pcm: dmix: fix access to sum-buffer in non-interleaved mixing mode

When dmix uses non-interleaved mixing mode the offset and step width
to sum_buffer was calculated by using the dmix channels instead of
the slave channels. This leads to audio distortions due to frame
corruption.

example:
- With below configuratio, Do aplay on both device in parallel for
audio distortion

pcm.dmix_2_channels {
        type dmix
        ipc_key 5678293
        ipc_perm 0660
        ipc_gid audio
        bindings [0 1]

        slave {
                pcm "hardware"
                channels 2
                periods  4
                period_time 40000
        }
}

pcm.dmix_1_channels {
        type dmix
        ipc_key 5678293
        ipc_perm 0660
        ipc_gid audio
        bindings [0]

        slave {
                pcm "hardware"
                channels 1
                periods  4
                period_time 40000
        }
}

pcm.hardware {
        type hw
        card 0
        channels 2
        rate 48000
        format S16_LE
}

Signed-off-by: Vijay Palaniswamy <vijay.palaniswamy@in.bosch.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
3 years agoconf: USB-Audio: Disable IEC958 on Lenovo ThinkStation P620
Kai-Heng Feng [Mon, 3 Aug 2020 15:57:45 +0000 (23:57 +0800)]
conf: USB-Audio: Disable IEC958 on Lenovo ThinkStation P620

Both USB audio cards on Lenovo ThinkStation P620 don't support IEC958,
so disable IEC958 accordingly.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
3 years agocontrol: ctlparse - fix enum values in '' or ""
Jaroslav Kysela [Mon, 27 Jul 2020 11:18:20 +0000 (13:18 +0200)]
control: ctlparse - fix enum values in '' or ""

This comit fixes the enum value string parser
(fixes aaf3a081bff1cc85635f7a3c3d4287c4addbbd84).

BugLink: https://github.com/alsa-project/alsa-ucm-conf/pull/40
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: pcm - USB - Added S/PDIF fix for Asus Xonar SE
omar [Mon, 20 Jul 2020 15:46:46 +0000 (11:46 -0400)]
conf: pcm - USB - Added S/PDIF fix for Asus Xonar SE

Resolves #70
From: omar <odzinic@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: iec958: set channel status bits according to rate and format
Matthias Reichl [Mon, 13 Jul 2020 21:17:04 +0000 (23:17 +0200)]
pcm: iec958: set channel status bits according to rate and format

This mimics snd_pcm_create_iec958_consumer in the kernel.

The rate and wordlength bits will only be modified if they are
set to "not indicated", which is now the default if no status
option is used.

This allows applications to override parameters determined from
the stream or implement channel status bits extensions without
needing to change pcm_iec958 code.

Signed-off-by: Matthias Reichl <hias@horus.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agopcm: iec958: implement HDMI HBR audio formatting
Matthias Reichl [Mon, 13 Jul 2020 21:17:03 +0000 (23:17 +0200)]
pcm: iec958: implement HDMI HBR audio formatting

High bitrate compressed audio data like DTS HD or MAT is usually
packed into 8-channel data. The HDMI specs state this has to be
formatted as a single IEC958 stream, compared to normal multi-
channel PCM data which has to be formatted as parallel IEC958 streams.

As this single-stream formatting mode may break existing setups that
expect non-PCM multichannel data to be formatted as parallel IEC958
streams it needs to be explicitly selected by setting the hdmi_mode
option to true.

The single-stream formatting implementation is prepared to cope with
arbitrary channel counts but only limited testing was done for channel
counts other than 8.

Signed-off-by: Matthias Reichl <hias@horus.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agopcm: dmix: Fix semaphore usage with lockless operation
Takashi Iwai [Fri, 19 Jun 2020 16:40:46 +0000 (18:40 +0200)]
pcm: dmix: Fix semaphore usage with lockless operation

As Maarten Baert recently reported, the current dmix code applies the
semaphore unnecessarily around mixing streams even when the lockless
mix operation is used on x86.  This was rather introduced mistakenly
at the commit 267d7c728196 ("Add support of little-endian on
i386/x86_64 dmix") where the generic dmix code was included on x86,
too.

For achieving the original performance back, this patch changes the
semaphore handling to be checked at run time instead of statically at
compile time.

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agopcm: dmix: make lockless operation optional
Takashi Iwai [Fri, 19 Jun 2020 16:57:05 +0000 (18:57 +0200)]
pcm: dmix: make lockless operation optional

The recently reported (but a long-standing) bug about the
unconditional semaphore usage in the dmix implies that basically we've
had no problem with the locking in the practical usages over years.
Although the lockless operation has a clear merit, it's a much higher
CPU usage (especially on some uncached pages), and it might lead to a
potential deadlock in theory (which is hard to reproduce at will,
though).

This patch introduces a new configure option "--enable-lockless-dmix"
or "--disable-lockless-dmix" to let user choose the default dmix
operation mode.  The usage of the lockless mixing has been already
conditionally enabled via asoundrc and card config
"direct_memory_access", so we just need to set the default value based
on it.

In this patch, the default is set off to the lockless mixing, i.e. the
generic mixing is chosen.  It makes more sense from the performance
POV.  For any users who still require the lockless operation, it can
be enabled either via configure option or the asoundrc.

The magic number used in the shmem is also changed depending on the
operation mode.  It's just for safety, not to conflict both operation
modes with each other.

Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agoctl: improve documentation for identifier of control element
Takashi Sakamoto [Fri, 3 Jul 2020 00:37:51 +0000 (09:37 +0900)]
ctl: improve documentation for identifier of control element

In documentation, there're two ways relevant to the identifier of control
element. However, the case of combination has the lack of parameters.

This commit improves documentation in this point.

Fixes: f3c24de8c0df ("ctl: add an overview for design of ALSA control interface")
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute the merged tree completely
Jaroslav Kysela [Mon, 6 Jul 2020 14:34:33 +0000 (16:34 +0200)]
ucm: substitute the merged tree completely

We need to define the common shared configuration like for multiple
HDMI devices or so. Substitute the whole merged configuration tree
including identifiers.

Fixes: https://github.com/alsa-project/alsa-lib/issues/67
Fixes: https://github.com/alsa-project/alsa-ucm-conf/commit/dcef48f13d4f5db79b006755074940b94730a883
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: fix parse_get_safe_name() - safe name must be checked after substitution
Jaroslav Kysela [Fri, 3 Jul 2020 12:48:18 +0000 (14:48 +0200)]
ucm: fix parse_get_safe_name() - safe name must be checked after substitution

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitution - remove duplicate allow_empty assignment
Jaroslav Kysela [Tue, 30 Jun 2020 07:22:12 +0000 (09:22 +0200)]
ucm: substitution - remove duplicate allow_empty assignment

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoRelease v1.2.3.2
Jaroslav Kysela [Mon, 29 Jun 2020 10:51:08 +0000 (12:51 +0200)]
Release v1.2.3.2

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: Allow empty strings in "${var:...}" substitutions
Hans de Goede [Sat, 27 Jun 2020 18:30:52 +0000 (20:30 +0200)]
ucm: Allow empty strings in "${var:...}" substitutions

Recent ucm-conf changes introduce checks like this one in various places:

If.mspk {
        Condition {
                Type String
                Empty "${var:MonoSpeaker}"
        }
        True ...
        False ...
}

The 'Empty "${var:MonoSpeaker}"' part can only every succeed if we do:

Define.MonoSpeaker ""

But so far that would result in an error like this one:

ALSA lib ucm_subs.c:367:(uc_mgr_get_substituted_value) variable '${var:MonoSpeaker}' is not defined in this context!
ALSA lib main.c:983:(snd_use_case_mgr_open) error: failed to import cht-bsw-rt5672 use case configuration -22
alsaucm: error failed to open sound card cht-bsw-rt5672: Invalid argument

This commit fixes this by allowing empty values for "${var:...}"
substitutions.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoalsa.conf: load /etc/asound.conf or /usr/etc/asound.conf not both
Jaroslav Kysela [Wed, 24 Jun 2020 17:28:35 +0000 (19:28 +0200)]
alsa.conf: load /etc/asound.conf or /usr/etc/asound.conf not both

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: implement AlwaysTrue Condition.Type
Jaroslav Kysela [Wed, 24 Jun 2020 17:17:49 +0000 (19:17 +0200)]
ucm: implement AlwaysTrue Condition.Type

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: Annotate the _avail functions
Mark Hills [Mon, 22 Jun 2020 13:15:15 +0000 (14:15 +0100)]
pcm: Annotate the _avail functions

I took time to understand these functions in the context of the
rest of the code, which would have been a lot quicker with a comment
like this.

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agodsnoop: Make use of the (previously unused) function
Mark Hills [Mon, 22 Jun 2020 13:15:14 +0000 (14:15 +0100)]
dsnoop: Make use of the (previously unused) function

Match the equivalent funciton for playback. This is on the assumption
that values should be capped at zero, which is what _rewindable()
implements.

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agodsnoop: Another bug where the empty, not full, part of the ringbuffer was observed
Mark Hills [Mon, 22 Jun 2020 13:15:13 +0000 (14:15 +0100)]
dsnoop: Another bug where the empty, not full, part of the ringbuffer was observed

This looks like a simple mistake dating back to 2003 (commit 7470a5b9)
where code originated from dmix.

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agodsnoop: The stop threshold was not implemented correctly
Mark Hills [Mon, 22 Jun 2020 13:15:12 +0000 (14:15 +0100)]
dsnoop: The stop threshold was not implemented correctly

The previous implementation would mean that stop_threshold behaved
erratically. The intent is to detect that the buffer is too full,
and stop.

In practice, I don't think this was a bug in practice for applications
which don't adjust the stop_threshold. The line above catches those cases.

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agopcm: Annotate the _delay functions based on findings from the previous bug
Mark Hills [Mon, 22 Jun 2020 13:15:11 +0000 (14:15 +0100)]
pcm: Annotate the _delay functions based on findings from the previous bug

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agodsnoop: The delay presented to snd_pcm_status_delay() was incorrect
Mark Hills [Mon, 22 Jun 2020 13:15:10 +0000 (14:15 +0100)]
dsnoop: The delay presented to snd_pcm_status_delay() was incorrect

This was the original bug that caused me to start looking at the
ring buffer functions.

In the API this is documented as:

  "Delay is distance between current application frame position and
   sound frame position. It's positive and less than buffer size in
   normal situation, negative on playback underrun and greater than
   buffer size on capture overrun. "

Because dsnoop was returning the buffer space available to the hardware
the return value was always quite large, and moved in the wrong
direction.

With this patch, dsnoop now gives results which are comparable to using
the "hw" device directly. My test case was with snd-echo3g (Layla3G).

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agocontrol: Fix a bug that prevented namehint behaviour
Mark Hills [Mon, 22 Jun 2020 13:15:08 +0000 (14:15 +0100)]
control: Fix a bug that prevented namehint behaviour

Looks like the documented behaviour was broken in commit 1ba513f9 in
2006, with the introduction of multiple fields.

I've chosen to match the described behaviour. Prior to this patch,
using namehint could be made to work by exploiting the lack of escaping
of the "name", populating the other fields:

  "plug:front|DESCDo all conversions for front speakers"

rather than that which is documented and presumed to be the intention
for asoundrc files:

  "plug:front|Do all conversions for front speakers"

Everything seems to strongly suggest nobody is using this feature; I can
find no working examples through a web search and probably someone
would have hit this bug. It's not documented in configuration, only in
the snd_device_name_hint() call. So it would probably clutter things to
provide compatibility for the old behaviour.

I have found it to be very useful since working in Chromium, where it is
the only way to expose chosen ALSA devices to web applications.

A temporary buffer is required to null-terminate the string.  I see no
use of alloca() in the code, presumably to avoid unbounded stack size.
So memory is allocated on the heap.

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agocontrol: Fix typos in the namehint example
Mark Hills [Mon, 22 Jun 2020 13:15:07 +0000 (14:15 +0100)]
control: Fix typos in the namehint example

Ths "namehint" is a list, and there doesn't seem to have been any
history where the separator would be a colon.

Signed-off-by: Mark Hills <mark@xwax.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agoconf: Add /usr/etc to the default search paths
Takashi Iwai [Fri, 19 Jun 2020 11:46:42 +0000 (13:46 +0200)]
conf: Add /usr/etc to the default search paths

There's been some recent action to move the distribution-default setup
from /etc to /usr/etc, and we should follow that, too.

This patch adds /usr/etc/alsa.conf.d and /usr/etc/alsa.conf to the
default search paths.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
4 years agoucm: simplify get_by_card() in parser.c
Jaroslav Kysela [Mon, 22 Jun 2020 07:05:24 +0000 (09:05 +0200)]
ucm: simplify get_by_card() in parser.c

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: fix the possible buffer overflow (substitution)
Jaroslav Kysela [Mon, 22 Jun 2020 07:02:11 +0000 (09:02 +0200)]
ucm: fix the possible buffer overflow (substitution)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoRelease v1.2.3.1
Jaroslav Kysela [Thu, 18 Jun 2020 17:24:32 +0000 (19:24 +0200)]
Release v1.2.3.1

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: copy extplug timestamp type from the slave pcm
Jaroslav Kysela [Thu, 18 Jun 2020 17:15:45 +0000 (19:15 +0200)]
pcm: copy extplug timestamp type from the slave pcm

The extplug sets incorrectly the timestamping type to
gettimeofday. Copy the timestamp type from the slave pcm
as other plugins do.

The problem is visible when the
  "pcm: dmix: fix sw_params handling of timestamp types in direct plugins"
patch was applied for the direct plugins.

BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1847508
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: make some strings more compact in alsa.conf
Jaroslav Kysela [Thu, 18 Jun 2020 14:40:38 +0000 (16:40 +0200)]
conf: make some strings more compact in alsa.conf

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: implement CardNumberByName substitution
Jaroslav Kysela [Thu, 18 Jun 2020 14:20:21 +0000 (16:20 +0200)]
ucm: implement CardNumberByName substitution

The syntax is ${CardNumberByName:CARDNAME[#INDEX]}.

The CARDNAME is the ALSA's soundcard name (short form).
The INDEX is the instance (0 = first, 1 = second etc.).

Example: ${CardNumberByName:HDA Intel PCH}
(which is identical to ${CardNumberByName:HDA Intel PCH#0})

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: allow to use the defined variables in the substitution argument
Jaroslav Kysela [Thu, 18 Jun 2020 13:53:19 +0000 (15:53 +0200)]
ucm: allow to use the defined variables in the substitution argument

Example (set variable 'Module' to the kernel module name for the given card):

  Define.SysfsPath "class/sound/card${CardNumber}/device/driver"
  Define.Module "${sys:$SysfsPath}"

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: allow to ignore errors for the value substitution
Jaroslav Kysela [Thu, 18 Jun 2020 13:09:23 +0000 (15:09 +0200)]
ucm: allow to ignore errors for the value substitution

It may be useful to ignore the errors where the environment
or sysfs values are not defined for the specific hardware.

Enhance substitution for 'syntax 3' so $${} substitution
means ignore the errors (return an empty string).

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agodlsym: fix the race when snd_libdir_origin is freed
Jaroslav Kysela [Thu, 18 Jun 2020 06:41:02 +0000 (08:41 +0200)]
dlsym: fix the race when snd_libdir_origin is freed

snd_dlobj_cache_cleanup() function frees snd_libdir_origin, but
the pointer may be used again in snd_dlpath().

BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1847508
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: dmic: assembly: add x32 support.
Harald van Dijk [Tue, 16 Jun 2020 17:53:57 +0000 (18:53 +0100)]
pcm: dmic: assembly: add x32 support.

x32 is the x86_64 ABI that uses 32-bit pointers, so requires loading
addresses into edi/esi/ebx rather than rdi/rsi/rbx.

Note that instructions such as movl %eax, (%rdi) do not require
updating, as loading an address into %edi zeroes the high bits, causing
the full %rdi register to hold a valid address.

Signed-off-by: Harald van Dijk <harald@gigawatt.nl>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: direct: correctly apply existing interval settings
Andreas Pape [Wed, 17 Jun 2020 11:42:35 +0000 (13:42 +0200)]
pcm: direct: correctly apply existing interval settings

Feature 'variable periodsize' allows to extend user period size up to
buffer_size/2 independent of slave period. On enlargement of the settings
for period_time.max and period_size.max the setting for openmax
was not updated.

This lead to the effect, that if the slave period itself had openmax
set it was still set on the extended size. Configuration of a period
matching half buffer size was thus rejected.

Example for failure: period size of 384 (half buffer size) is requested
which is rejected and rounded down to 352:

PERIOD_SIZE: [32 352]
BUFFER_SIZE: [64 768]

When correctly applying the openmax setting:

PERIOD_SIZE: [32 384]
BUFFER_SIZE: [64 768]

Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agocontrol: ctlparse - use type-specific bound on element count
John Keeping [Tue, 16 Jun 2020 18:29:30 +0000 (19:29 +0100)]
control: ctlparse - use type-specific bound on element count

Using a fixed bound of 128 means that too many values may be set for an
INTEGER64 type and that any elements past 128 are out of reach for BYTE
type controls.

Derive the maximum number of elements from the type so that the full
range is parsed for all types.

Signed-off-by: John Keeping <john@metanate.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: include - fix compound_merge for arrays
Jaroslav Kysela [Mon, 15 Jun 2020 17:49:25 +0000 (19:49 +0200)]
ucm: include - fix compound_merge for arrays

There is a case where the original array has already new indexes
(the merged array is placed before the original nodes).

Set the temporary index string identifiers to unique strings.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agodlmisc.c: fix uclibc build
Bernd Kuhls [Sat, 13 Jun 2020 15:44:45 +0000 (17:44 +0200)]
dlmisc.c: fix uclibc build

RTLD_DL_LINKMAP & RTLD_DI_ORIGIN, are unsupported on uClibc:
https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/include/dlfcn.h#n106

This patch adds detection for uClibc because uClibc also defines
__GLIBC__:
https://lists.gnu.org/archive/html/bug-gnulib/2010-11/msg00280.html

BugLink: https://github.com/alsa-project/alsa-lib/pull/58
From: Bernd Kuhls <bernd.kuhls@t-online.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: fix use-after-free in parse_component_seq()
Jaroslav Kysela [Mon, 8 Jun 2020 16:17:16 +0000 (18:17 +0200)]
ucm: fix use-after-free in parse_component_seq()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoRelease v1.2.3
Jaroslav Kysela [Mon, 8 Jun 2020 11:42:38 +0000 (13:42 +0200)]
Release v1.2.3

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agodlsym: fix the snd_dlopen(), incorrect variable use
Jaroslav Kysela [Mon, 8 Jun 2020 11:41:58 +0000 (13:41 +0200)]
dlsym: fix the snd_dlopen(), incorrect variable use

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: USB-Audio: Add HP Thunderbolt Dock in the IEC958 blacklist
Kai-Heng Feng [Mon, 8 Jun 2020 07:09:23 +0000 (15:09 +0800)]
conf: USB-Audio: Add HP Thunderbolt Dock in the IEC958 blacklist

Both headset and speaker on HP Thunderbolt Dock don't support IEC958
interface.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agodlsym: fix again snd_dlpath()
Jaroslav Kysela [Mon, 8 Jun 2020 10:02:53 +0000 (12:02 +0200)]
dlsym: fix again snd_dlpath()

There is double lock in 8d866e4cd886991f605399af6bd6cf4ac6eea3e2 .

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: Fix memory leak at snd_pcm_new when THREAD_SAVE_API is defined
chunxu.li [Mon, 27 Apr 2020 13:27:42 +0000 (21:27 +0800)]
pcm: Fix memory leak at snd_pcm_new when THREAD_SAVE_API is defined

The pthread_mutexattr_t object should be destroyed by calling
pthread_mutexattr_destroy(), otherwise it may cause a potential
memory leak due to the different implement of pthread_mutexattr_init()

Signed-off-by: chunxu.li <chunxuxiao@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: fix the wrong return value in uc_mgr_open_ctl()
Jaroslav Kysela [Mon, 8 Jun 2020 07:57:27 +0000 (09:57 +0200)]
ucm: fix the wrong return value in uc_mgr_open_ctl()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: remove strict: in ${OpenName} substitution
Jaroslav Kysela [Mon, 8 Jun 2020 07:17:57 +0000 (09:17 +0200)]
ucm: remove strict: in ${OpenName} substitution

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: fix the error path in parse_toplevel_path()
Jaroslav Kysela [Mon, 8 Jun 2020 07:09:22 +0000 (09:09 +0200)]
ucm: fix the error path in parse_toplevel_path()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: fix the wrong uc_mgr_open_ctl() call in if_eval_control_exists()
Jaroslav Kysela [Mon, 8 Jun 2020 07:03:56 +0000 (09:03 +0200)]
ucm: fix the wrong uc_mgr_open_ctl() call in if_eval_control_exists()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agodlsym: fix the reference to the origin lib directory
Jaroslav Kysela [Mon, 8 Jun 2020 06:59:47 +0000 (08:59 +0200)]
dlsym: fix the reference to the origin lib directory

There is reference to the variable on heap in
commit 33089f30a316060094dfa95a2949fd479299c7 .

Cache the origin directory better.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agouse-case.h: define Linked variable
Jaroslav Kysela [Sun, 7 Jun 2020 15:40:54 +0000 (17:40 +0200)]
use-case.h: define Linked variable

We have a requirement to "hide" some hardware drivers, because
other (main) UCM configuration will refer them.

BugLink: https://github.com/alsa-project/alsa-ucm-conf/issues/30
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agotlv: implement nearest rounding in snd_tlv_convert_from_dB() for xdir == 0
Jaroslav Kysela [Fri, 5 Jun 2020 15:46:39 +0000 (17:46 +0200)]
tlv: implement nearest rounding in snd_tlv_convert_from_dB() for xdir == 0

We should round-up values to nearest to get more precise results.

BugLink: https://github.com/alsa-project/alsa-utils/issues/35
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agocontrol: use more precise rounding in snd_ctl_ascii_value_parse()
Jaroslav Kysela [Fri, 5 Jun 2020 11:38:53 +0000 (13:38 +0200)]
control: use more precise rounding in snd_ctl_ascii_value_parse()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: remove debug printf() in snd_config_hook_load()
Jaroslav Kysela [Fri, 5 Jun 2020 11:12:15 +0000 (13:12 +0200)]
conf: remove debug printf() in snd_config_hook_load()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: clarify -ENODATA description (recovery, event)
Jaroslav Kysela [Fri, 5 Jun 2020 09:54:34 +0000 (11:54 +0200)]
pcm: clarify -ENODATA description (recovery, event)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: fix spelling in documentation for -EBADFD
Kai Vehmanen [Fri, 29 May 2020 12:28:17 +0000 (15:28 +0300)]
pcm: fix spelling in documentation for -EBADFD

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
4 years agopcm: add documentation for -ENODATA error code
Kai Vehmanen [Fri, 29 May 2020 12:28:16 +0000 (15:28 +0300)]
pcm: add documentation for -ENODATA error code

This error code can be used e.g. with echo reference PCM devices
(the SND_USE_CASE_MOD_ECHO_REF UCM token).

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
4 years agosnd_dlopen: implement the relocatable version for glibc
Jaroslav Kysela [Thu, 4 Jun 2020 17:06:08 +0000 (19:06 +0200)]
snd_dlopen: implement the relocatable version for glibc

BugLink: https://github.com/alsa-project/alsa-lib/issues/34
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agosnd_dlopen: do not use absolute plugin path for snd_dlopen() calls
Jaroslav Kysela [Thu, 4 Jun 2020 16:22:59 +0000 (18:22 +0200)]
snd_dlopen: do not use absolute plugin path for snd_dlopen() calls

In commit b906db19ef9f4fb7886003072e550391cc1ac651, the snd_dlopen()
implements the automatic lookup to the ALSA_PLUGIN_DIR directory.
It is not necessary to add the absolute paths in callers now.

The plugin names are also searched in ld.so.conf paths as the fallback now,
but it should not be a big problem.

BugLink: https://github.com/alsa-project/alsa-lib/issues/34
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: add support for XDG_CONFIG_HOME search path
Jaroslav Kysela [Thu, 4 Jun 2020 15:31:32 +0000 (17:31 +0200)]
conf: add support for XDG_CONFIG_HOME search path

Include $XDG_CONFIG_HOME/alsa/asoundrc _or_ ~/.config/alsa/asoundrc as
the last user-defined configuration.

BugLink: https://github.com/alsa-project/alsa-lib/issues/49
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: load function (hook) - add OR support
Jaroslav Kysela [Thu, 4 Jun 2020 15:28:25 +0000 (17:28 +0200)]
conf: load function (hook) - add OR support

While I was trying to work on XDG_CONFIG_HOME support, I though
that it may be nice to support OR for the file specification.

But then I found that we can already do this via the refer hook.

I commit this change anyway, because the snd_config_hook_load()
function is more clean now.

The OR is implemented with three | characters like:

  "~/.asoundrc|||~/.asoundrc2|||/opt/some/other/path"

(first file found wins)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoconf: USB-Audio.conf - add another card name for Asus Xonar 5
Jaroslav Kysela [Thu, 4 Jun 2020 09:42:35 +0000 (11:42 +0200)]
conf: USB-Audio.conf - add another card name for Asus Xonar 5

BugLink: https://github.com/alsa-project/alsa-lib/issues/48
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: return immediately when the state is SETUP in snd_pcm_drain()
Jaroslav Kysela [Wed, 3 Jun 2020 16:42:29 +0000 (18:42 +0200)]
pcm: return immediately when the state is SETUP in snd_pcm_drain()

We are already in the target state. Do not call the plugin callback.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agopcm: fix snd_pcm_drain() excluding SETUP state from valid states
sylvain.bertrand@gmail.com [Sat, 2 May 2020 19:33:11 +0000 (19:33 +0000)]
pcm: fix snd_pcm_drain() excluding SETUP state from valid states

once draining is done, the pcm enters the SETUP state, which ought to
be valid for snd_pcm_drain()

signed-off-by: Sylvain BERTRAND <sylvain.bertrand@legeek.net>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: implement CardIdByName substitution
Jaroslav Kysela [Wed, 3 Jun 2020 15:12:19 +0000 (17:12 +0200)]
ucm: implement CardIdByName substitution

The syntax is ${CardIdByName:CARDNAME[#INDEX]}.

The CARDNAME is the ALSA's soundcard name (short form).
The INDEX is the instance (0 = first, 1 = second etc.).

Example: ${CardIdByName:HDA Intel PCH}
(which is identical to ${CardIdByName:HDA Intel PCH#0})

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: shuffle code in compound_merge()
Jaroslav Kysela [Tue, 2 Jun 2020 17:11:22 +0000 (19:11 +0200)]
ucm: shuffle code in compound_merge()

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agogithub actions: ubuntu - fix the non-interactive build
Jaroslav Kysela [Tue, 2 Jun 2020 11:16:55 +0000 (13:16 +0200)]
github actions: ubuntu - fix the non-interactive build

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute arguments in sequences only for syntax 3+
Jaroslav Kysela [Wed, 27 May 2020 13:20:03 +0000 (15:20 +0200)]
ucm: substitute arguments in sequences only for syntax 3+

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute RenameDevice and DeleteDevice lists
Jaroslav Kysela [Wed, 27 May 2020 13:13:55 +0000 (15:13 +0200)]
ucm: substitute RenameDevice and DeleteDevice lists

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute Comment in Transition and Device
Jaroslav Kysela [Wed, 27 May 2020 13:04:31 +0000 (15:04 +0200)]
ucm: substitute Comment in Transition and Device

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute verb name and file field
Jaroslav Kysela [Wed, 27 May 2020 12:47:08 +0000 (14:47 +0200)]
ucm: substitute verb name and file field

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute component sequence string
Jaroslav Kysela [Wed, 27 May 2020 12:12:12 +0000 (14:12 +0200)]
ucm: substitute component sequence string

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute device strings in the device lists
Jaroslav Kysela [Wed, 27 May 2020 12:04:13 +0000 (14:04 +0200)]
ucm: substitute device strings in the device lists

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4 years agoucm: substitute device / modifier names, too
Jaroslav Kysela [Wed, 27 May 2020 11:53:10 +0000 (13:53 +0200)]
ucm: substitute device / modifier names, too

Signed-off-by: Jaroslav Kysela <perex@perex.cz>