Jaroslav Kysela [Mon, 14 Jun 2021 10:22:08 +0000 (12:22 +0200)]
arecord: Inform users when 8-bit sampling is used on tty
When we reverted 0c5948e ("aplay: try to use 16-bit format to
increase capture quality"), we should also handle the original
problem somehow. This code shows a warning with a hint to
the right parameter.
Fixes: https://github.com/alsa-project/alsa-utils/issues/96 Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Andrea Piras [Fri, 29 Nov 2019 02:13:21 +0000 (03:13 +0100)]
added an option to aseqnet to optionally set the midi process name
This option allows to run multiple instances of aseqnet without having
to double check the assigned port number, since each one can get spawned
with a unique name.
Fixes: https://github.com/alsa-project/alsa-utils/pull/95 Signed-off-by: Andrea Piras <andrea.piras.85@gmail.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Andreas Müller [Thu, 3 Jun 2021 14:07:10 +0000 (16:07 +0200)]
utils.c: Include limits.h explicitly to fix build on musl
Fixes:
| ../../alsa-utils-1.2.5/alsactl/utils.c: In function 'snd_card_clean_cfgdir':
| ../../alsa-utils-1.2.5/alsactl/utils.c:309:19: error: 'PATH_MAX' undeclared (first use in this function)
| 309 | char path[PATH_MAX];
| | ^~~~~~~~
| ../../alsa-utils-1.2.5/alsactl/utils.c:309:19: note: each undeclared identifier is reported only once for each function it appears in
Fixes: https://github.com/alsa-project/alsa-utils/pull/92 Signed-off-by: Andreas Müller <schnitzeltony@gmail.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Sören Tempel [Sun, 6 Jun 2021 01:14:19 +0000 (03:14 +0200)]
alsactl: load_state: Only delete config if one was loaded
If load_configuration fails with open_failed == true, load_state will
jump to the out label without config being initialized and pass this
uninitialized config value to snd_config_delete. This commit fixes this
issue by initializing config with NULL and checking if it is non-null
before invoking snd_config_delete.
Fixes: https://github.com/alsa-project/alsa-utils/pull/94 Fixes: f138117 ("alsactl: load_state() - initialize config variable for the open_failed case") BugLink: https://github.com/alsa-project/alsa-utils/issues/93 Signed-off-by: Sören Tempel <soeren+git@soeren-tempel.net> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Chao Song [Mon, 31 May 2021 02:29:57 +0000 (10:29 +0800)]
topology: fix potential null pointer from strchr
This patch adds check to the return pointer from strchr,
because it may be null and cause segment fault, if component
is not properly constructed.
Fixes: https://github.com/alsa-project/alsa-utils/pull/91 Signed-off-by: Chao Song <chao.song@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-object: add support for prepocessing child objects
Add support for processing object instances embedded
within objects and classes. For example:
Object.Control.mixer."0" {
#Channel register and shift for Front Left/Right
Object.Base.channel."fl" {
shift 0
}
Object.Base.channel."fr" {
}
Object.Base.ops."ctl" {
info "volsw"
#256 binds the mixer control to volume get/put handlers
get 256
put 256
}
}
and pga class embeds the mixer objects as follows:
Class.Widget."pga" {
...
Object.Control {
mixer."0" {...}
mixer."1" {...}
}
The pre-processor starts with the top-pevel PGA widget object
and processes the mixer objects in the class definition.
This will recursively pre-processes its child objects to add the channels,
tlv and ops.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-dai: add support for PCM and BE DAI objects
Add support for pre-processing PCM and BE DAI objects:
Object.PCM.pcm."0" {
name "Port0"
direction "duplex"
}
will be converted to:
SectionPCM.'Port0' {}
The capabilities and dai configs will be added those objects are pre-processed.
An ex of DAI object would be:
Object.Dai.SSP."0" {
direction "duplex"
stream_name "NoCodec-0"
id 0
default_hw_conf_id 0
format "s24le"
quirks "lbm_mode"
sample_bits 24
}
converted to:
SectionBE {
'SSP.0.duplex' {
id 0
stream_name NoCodec-0
default_hw_conf_id 0
data [
'SSP.0.duplex.sof_tkn_intel_ssp.word'
'SSP.0.duplex.sof_tkn_dai.word'
'SSP.0.duplex.sof_tkn_dai.string'
'SSP.0.duplex.sof_tkn_intel_ssp.short'
]
}
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
If the source/sink names are references to objects within a parent pipeline
object, the index attribute value can be skipped and it will be
populated when the object is pre-processed
The reference pga..0 will need to be resolved to
get the widget name pga.1.0 and buffer..0 will
be resolved to buffer.1.0 before creating the SectionGraph as follows:
Object.Base.ops."ctl" {
info "volsw"
#256 binds the mixer control to volume get/put handlers
get 256
put 256
}
access [
read_write
tlv_read
]
}
}
Would be converted to:
SectionControlMixer.'2 Master Playback Volume' {
index 2
max 32
channel {
fl {
reg 1
}
fr {
reg 1
shift 1
}
}
tlv "vtlv_m64s2"
ops.0 {
info volsw
get 256
put 256
}
access [
read_write
tlv_read
]
}
and the SectionWidget for pga.2.0 would be updated to add the mixer references as follows:
SectionWidget.'pga.2.0' {
...
mixer [
"2 Master Playback Volume"
]
}
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-base: add support for VendorToken objects
Add support for pre-processing VendorToken objects.
For ex:
Object.Base.VendorToken."sof_tkn_dai" {
dmac_config 153
dai_type 154
index 155
direction 156
}
would be converted to:
SectionVendorTokens."sof_tkn_dai" {
dmac_config 153
dai_type 154
index 155
direction 156
}
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-object: Add support for data objects
Pre-process data objects, create the SectionData and update
the parent object with the reference to the object.
For example, the following object instance:
topology: pre-process-obejct: add helper function to get the section config
Add a helper function to retrieve the config node
pointing to the section name for a given object.
For ex: for the object, Object.Widget.pga.1{},
the function returns the config with id, "SectionWidget"
in the output config.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-object: add data section for attributes with token reference
Objects that have attributes with token_ref need
to have separate SectionData and SectionVendorTuples
for each unique token_ref based on the attribute_sets
in the object's attribute_set_list.
Add the tplg_pp_add_object_data()
function to add the data[] refs in the object and also
the respective SectionData and SectionVendorTuples.
The following sections will be added:
SectionWidget.'pga.2.0' {
index 2
type pga
no_pm 1
mixer [
"2 Master Playback Volume"
]
bytes [
]
data [
"pga.2.0.sof_tkn_comp.word"
"pga.2.0.sof_tkn_comp.string"
"pga.2.0.sof_tkn_comp.uuid"
"pga.2.0.sof_tkn_volume.word"
]
}
topology: pre-process-object: Add support for processing Manifest object
The pre-processor converts the Topology2.0 objects into
the relevant sections by looking for attributes defined
in the template config for the section and reading the
attribute values from the object instance config.
The structure struct build_function_map contains the
mapping of the build function to use for each object
based on the type and name for the class that the object
belongs to. The manifest object is the simplest with
no attributes. So, the build function simply creates
a new Section called SectionManifest which will be
populated with the data section in the following patches.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-object: construct object name from its constructor attributes
An object's name is derived from its constructor attribute
values separated by '.'. For example, the name for the
host widget objects is derived from its index and direction
attribute values as follows:
Object.Widget.host."playback" {
index 2
}
The name for the host widget object would be host.2.playback.
Alternatively, if the object has a name attribute, the class
definition may skip the constructor attributes and the name attribute
value will be used instead.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Attributes can have constraints set for valid values, min
or max values. If the attribute value is set in an object,
the value must be validated against the set constraints.
An example for attribute constraint would be:
DefineAttribute."direction" {
constraints {
valid_values [
"playback"
"capture"
]
tuple_values [
0
1
]
}
}
where the tuple_values array would translate the valid_values of
playback as 0 and capture as 1.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology/pre-process-object: update object config with attributes
Object attributes can be set in multiple places. Search for
the attribute value in the following order:
1. Value set in object instance
2. Default value set in the object's class definition
3. Inherited value from the parent object
4. Value set in the object instance embedded in the parent object
5. Value set in the object instance embedded in the parent class definition
Mandatory attributes must be found in one of the above, resulting
in an error if not found.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-object: Add support for pre-processing Objects
Add support for pre-processing object instances in the input
config. An object's attributes can be set in multiple places
such as, within the object instance, default values in the class
defnition, inherited from a parent object or explicitly set
in a parent object. Before converting the object config into
the relevant section in the existing syntax, all the attribute
values must be consolidated into one place so that it is easy
to verify if all mandatory attributes are set.
Also, the name of the object will be constructed from the
attributes defined in the attributes.constructor[] config
in the class definition and the unique attribute's value
must be set from the value passed in the object instance.
This patch create a temporary config for each object instance
and populates its unique attribute value. The rest of the steps
will be added in the following patches.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-class: function to get attribute type
Add a helper function to get attribute type from the
attribute definition and convert them to SND_CONFIG_TYPE_*
values. When no type if provided for an attribute, type
defaults to integer.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-class: add funcion to get the name of the unique attribute in a class
Every class must have a unique attribute that will be used
to instantiate the object. The value provided for this
attribute must be unique within the same alsaconf node for
objects of the same class. Add a helper function to get the
name of the attribute that must have a unique value in the
object instance.
For example, when instantiating 2 buffer widgets within a pipeline,
they must be given unique instance attribute values as:
Object.Widget.buffer.0{} and Object.Widget.buffer.1{}.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-class: Add functions to check attribute constraints
Add helper functions to check if an attribute is
mandatory, immutable or unique in the class definition.
ex: for a host widget component, these are defined
as follows:
attributes {
#
# host objects instantiated within the same alsaconf node must have unique
# direction attribute
#
unique "direction"
mandatory [
"type"
"stream_name"
]
immutable [
"uuid"
]
}
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-process-class: Add helper function to look up class definition
Add a helper function to look up the class definition for
an object. ex: for an object instance, Object.Widget.pga.0{}, the
function returns the config pointing to Class.Widget.pga{} in
the input conf.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: pre-processor: Add a helper function to concat strings
The pre-processor needs to concatinate strings separated
by '.' for building object names from constructor attribute
values and searching for configs with ID's containing strings
separate by '.'. Add a helper function to concat strings in
the specified input format.
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
topology: Add support for pre-processing Topology2.0 syntax
This patch adds support for pre-processing the Topology2.0.
The '-p' switch add pre-processing support during compilation
and the '-P' switch is for converting the Topology2.0
configuration file into the existing syntax.
Topology2.0 is a high level keyword extension on top of the existing ALSA
conf topology format designed to:
1) Simplify the ALSA conf topology definitions by providing high level
"classes" so topology designers need to write less config for common
object definitions.
2) Allow simple reuse of objects. Define once and reuse (like M4) with
the ability to alter objects configuration attributes from defaults.
3) Allow data type and value verification. This is not done today and
frequently crops up in FW bug reports.
Common Topology Classes
-----------------------
Topology today has some common classes that are often reused throughout
with slightly altered configurations. i.e. widgets (components),
pipelines, dais and controls.
Topology2.0 introduces the high level concept of reusable "class" like
definition for that can be used to create topology objects.
Common Topology Attributes
--------------------------
Topology defines a lot of attributes per object with different types
and constraints. Today there is no easy way to validate type or
constraints and this can lead to many hard to find problems in FW at
runtime.
A new keyword "DefineAttribute" has been added to define attribute
constraints such as min value, max value, enum_values etc. This
then allows alsatplg to validate each topology object attribute.
Topology Classes define the list of attributes that they use and
whether the attribute is mandatory, can be overridden by parent users
or is immutable. This also helps alsatplg emit the appropriate errors
for attribute misuse.
Class constructor attributes
----------------------------
Some attributes in the class definition are declared as constructor
attributes and these will be used to construct the name of the object.
For ex: for the host widget, the index and direction are constructor
attributes and the name for the widget is derived as follows:
host.1.playback or host.2.capture etc.
Attribute Inheritance:
----------------------
One of the key features of Topology2.0 is how the attribute values are
propagated from a parent object to a child object. For ex: a pipeline
object can pass down the pipeline_id attribute to all its widgets.
Inheritance is implicit when an object and its embedded child objects
have matching names for a attribute/argument. Attribute values
set explicitly in an object instance always has precedence over
the values inherited from the parent object.
Takashi Sakamoto [Thu, 13 May 2021 13:48:28 +0000 (22:48 +0900)]
axfer: fix regression of timeout in timer-based scheduling model
In timer-based scheduling model, event waiting is just to measure time
elapse since no event is expected to occur. However, as a result to
applying commit e5e6a7838b06, -ETIMEDOUT returns in the case and
the caller handles it as error. This results in disorder of the
scheduling model.
This commit fixes the regression so that the -ETIMEDOUT case is expected.
Reported-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> Link: https://lore.kernel.org/alsa-devel/687f9871-7484-1370-04d1-9c968e86f72b@linux.intel.com/ Fixes: e5e6a7838b06 ("axfer: return ETIMEDOUT when no event occurs after waiter expiration") Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Jaroslav Kysela [Thu, 15 Apr 2021 09:27:25 +0000 (11:27 +0200)]
alsamixer: increase control device name buffer (sysdefault)
card_select.c:129:28: warning: ‘%d’ directive writing between 1 and 10 bytes into a region of size 5 [-Wformat-overflow=]
129 | sprintf(buf, "sysdefault:%d", number);
Andreas Pape [Fri, 19 Mar 2021 10:57:13 +0000 (11:57 +0100)]
aplay: avoid any further PCM writing if in abort
Terminating stream with CTRL-C will set in_aborting flag which is used to leave any
write/read loop on the ALSA device.
After ending the read/write loop aplay tries to drain the stream which is not required and can also lead to malfunctions:
-If user interrupts a blocked/non responsive PCM (e.g. usb uac2 gadget which does not consume data
due to stream stopped by host) it will successfully terminate the write loop but will hang again in drain call.
This would require to hit CTRL-C again to unblock which should be avoided.
Aplay currently anyhow allows signal handler to get invoked only once.
Signed-off-by: Andreas Pape <apape@de.adit-jv.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:45 +0000 (14:21 +0900)]
axfer: test: reduce test case for maximum number of samples per frame
This commit reduces test case for maximum number of samples per frame so
that overall time is shortened. The count of total iteration is also
reduced by one quarter.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:42 +0000 (14:21 +0900)]
axfer: test: use memfd_create() for mapper-test
The mapper test program writes audio data frame to files, and read
them from the files, then validate them. For the operations, usage of
any in-memory file is good to shorten time of overall operations.
This commit uses shm by memfd_create().
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:41 +0000 (14:21 +0900)]
axfer: test: minor code arrangement to use the same file descriptor for mappter-test
In mapper test program, two set of file descriptors open to the same files
for container builder and parser contexts, however the same file descriptor
is available for the case.
This commit arranges to use the same file descriptor for the contexts.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:40 +0000 (14:21 +0900)]
axfer: test: use memfd_create() for container-test
The container test program writes audio data frame to file, and read
them from the file, then validate them. For the operations, usage of
any in-memory file is good to shorten time of overall operations.
This commit uses shm via memfd_create(). As a result, overall time to
run is shorten one half of before, depending on machine environment.
I note that we can achieve the same result by using O_TMPFILE flag in
open(2) system call, however the implementation of O_TMPFILE is to add
i-node without name on underling file system, thus it has overhead
depending on implementation in each file system. On the other hand,
memfd_create() is directly relevant to shm and expected to be less
overhead.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:39 +0000 (14:21 +0900)]
axfer: test: minor code arrangement to use the same file descriptor for container-test
In container test program, two file descriptors open to the same file
for builder and parser contexts, however the same file descriptor is
available for the case.
This commit arranges to use the same file descriptor for the contexts.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:38 +0000 (14:21 +0900)]
autotools: preparation to use memfd_create(2)
This is a preparation to use memfd_create(2) system call for test programs
of axfer. The system call was introduced at Linux kernel v3.17 and
relatively new.
For safe, this commit adds detection of memfd_create() in autotools side
so that application can handle the case not to detect.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:36 +0000 (14:21 +0900)]
axfer: open file descriptor outside of container module
Internal container module operates file descriptor to media file. For
this purpose, the structure has fd member and any file operation is done
internally. However, the case to use special file descriptor such as
memfd requires to maintain file descriptor externally.
This commit opens file descriptor outside of container module. The
internal APIs to initialize container get an argument for the file
descriptor instead of file path.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Takashi Sakamoto [Thu, 11 Mar 2021 05:21:32 +0000 (14:21 +0900)]
axfer: minor code arrangement for container module in a point of nonblocking flag
In internal container module, any file descriptor is expected as
non-blocking mode. Current implementation distinguish the case of
standard input and output from the case to open actual file since
O_NONBLOCK is used for the latter case. However, in both cases,
fcntl(2) is available to set non-blocking mode to the file descriptor.
This commit arranges to use fcntl(2) for both cases.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Jaroslav Kysela <perex@perex.cz>