Detailed changes v1.2.15.3 v1.2.16
Detailed changelog between 1.2.15.3 and 1.2.16 releases
Changelog between 1.2.13 and 1.2.16 releases
alsa-lib
Core
- Release v1.2.16
- configure: update to autoconf v2.72
- pcm: use new logging for hw_params dump, add pcm_params log interface
This change was omitted.
- github: add pr-validation and label-automation workflows
https://github.com/alsa-project/github-workflows
Control API
- Revert "snd_tlv_convert_to_dB: Fix mute handling for MINMAX_MUTE type"
This reverts commit 41039b49ad3e20506134864028c77aeaba4c0d51.
SND_CTL_TLVT_DB_MINMAX_MUTE means that the hardware is muted on lowest
hardware volume value (not on lowest dB value).
Analysis:
Range: min=0, max=7248
dB: min=-2837, max=-6
dB span: 2831 centibels (28.31 dB)
Volume | After revert/origin | PR#478 behavior
-------|---------------------|----------------------
0 | MUTE | MUTE
1 | -2837 (-28.37 dB) | MUTE <- DIFFERS!
2 | -2837 (-28.37 dB) | MUTE <- DIFFERS!
5 | -2836 (-28.36 dB) | -2836 (-28.36 dB)
10 | -2834 (-28.34 dB) | -2834 (-28.34 dB)
50 | -2818 (-28.18 dB) | -2818 (-28.18 dB)
Range: min=0, max=999
dB: min=0, max=390
dB span: 390 centibels (3.90 dB)
Volume | After revert/origin | PR#478 behavior
-------|---------------------|----------------------
0 | MUTE | MUTE
1 | 0 (0.00 dB) | MUTE <- DIFFERS!
2 | 0 (0.00 dB) | MUTE <- DIFFERS!
5 | 1 (0.01 dB) | 1 (0.01 dB)
10 | 3 (0.03 dB) | 3 (0.03 dB)
50 | 19 (0.19 dB) | 19 (0.19 dB)
Link: https://github.com/alsa-project/alsa-lib/pull/478
- control: remap - fix memory leak in remap_load_list()
- control: remap - cosmetic code reorganization
- control: remap - fix numid lookup issue
The 'amixer controls' and 'amixer cget numid=' combo was not working
correctly when the remapping was active. This assert was trigerred:
amixer: control.c:427: snd_ctl_elem_info: Assertion `ctl && info && (info->id.name[0] || info->id.numid)' failed
All elements must be loaded and mapping created to build
the numid -> fullid link.
- control: ctlparse - make numid parsing more robust
Also correct the last amixer stderr printf to snd_error().
PCM API
- pcm: fix leading space in snd_pcm_hw_param_dump for mask parameters
- pcm: use new logging for hw_params dump, add pcm_params log interface
This change was omitted.
- pcm: snd_pcm_slave_conf - fix C99 variable-length array allocation
The C standard (C99 §6.7.5.2p1) requires VLA bounds to be greater than zero;
a bound of 0 is undefined behavior. Reported by UBSan.
RawMidi API
- rawmidi: clarify no_active_sensing doc: output-only, does not filter input
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sequencer API
- conf, seq, ucm: fix discards const from pointer target
Since glibc-2.43:
For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers
into their input arrays now have definitions as macros that return a
pointer to a const-qualified type when the input argument is a pointer
to a const-qualified type.
https://lists.gnu.org/archive/html/info-gnu/2026-01/msg00005.html
Closes: https://github.com/alsa-project/alsa-lib/pull/496
Topology API
- Topology: Add high and extended rates from Linux 6.12
This patch adds to topologies build support for the very high
sample rates 352.8 kHz, 384 kHz, 705,6 kHz, and 768 kHz. The added
extended rates those were introduced in Linux kernel version 6.12
are 12 kHz, 24 kHz, and 128 kHz.
Closes: https://github.com/alsa-project/alsa-lib/pull/497
- topology: decoder: fix wrong sizeof for enum control allocation in dapm
The tplg_calloc() call for enum control in the dapm widget kcontrol
decode loop used sizeof(*mt) (mixer template) instead of sizeof(*et)
(enum template). On 64-bit systems, snd_tplg_mixer_template is 72 bytes
while snd_tplg_enum_template is 80 bytes, causing an 8-byte heap buffer
overflow when the enum fields (texts, values pointers) were written past
the allocated block. This resulted in heap corruption and e.g. glibc
malloc hit an assert.
Closes: https://github.com/alsa-project/alsa-lib/pull/501
- topology: decoder - add boundary check for channel mixer count
Malicious binary topology file may cause heap corruption.
CVE: CVE-2026-25068
Use Case Manager API
- conf, seq, ucm: fix discards const from pointer target
Since glibc-2.43:
For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers
into their input arrays now have definitions as macros that return a
pointer to a const-qualified type when the input argument is a pointer
to a const-qualified type.
https://lists.gnu.org/archive/html/info-gnu/2026-01/msg00005.html
Closes: https://github.com/alsa-project/alsa-lib/pull/496
- ucm: add DefineRegex 'all' scheme for multiple pattern matches (Syntax 9)
Extend DefineRegex to support two matching schemes:
- "first" (default): matches pattern once, extracts capture groups
- "all": matches pattern multiple times, extracts all matches
The "all" scheme creates variables with naming pattern nameN for Nth
match and nameN_M for Nth match's Mth capture group, enabling
extraction of repeating patterns from strings.
Updated documentation with detailed examples and comprehensive
description of regex flags, schemes, and variable naming conventions.
- ucm: fix optional include
The path is not an absolute path and can't be used with `access()`.
Let's call `uc_mgr_config_load_file()` directly and mask acceptable
error numbers.
Closes: https://github.com/alsa-project/alsa-lib/pull/499
- ucm: add show_err parameter to uc_mgr_get_variable
Add bool show_err parameter to uc_mgr_get_variable() to control whether
an error message is displayed when a variable is not defined. This
centralizes error reporting and eliminates redundant error messages
in callers.
- ucm: find-card,find-device - add UCM variable support for arguments (Syntax 9)
Add variable support for all lookup arguments in find-card and find-device
substitutions. Variables are identified by $ prefix and only enabled for
Syntax 9+ to maintain backward compatibility.
Modified arguments with variable support:
- find-card: field, regex
- find-device: type, field, stream, regex
Example usage:
${find-card:field=$FieldName,regex=$Pattern,return=number}
${find-device:type=$DevType,stream=$StreamType,field=$FieldName,regex=$Pattern}
- ucm: add info-card substitution (Syntax 9)
Implement ${info-card:} substitution to retrieve specific fields from
a card's information structure by card number or ID. Unlike ${find-card:}
which searches through cards using regex, ${info-card:} directly queries
a specific card.
Arguments:
card=<STR> card number or card ID (string identifier)
field=<STR> number, id, driver, name, longname, mixername, components
Allow card and field parameters to reference UCM variables by prefixing
with $ character. When the first character is $, the value is resolved
using uc_mgr_get_variable().
Example usage:
${info-card:card=$MyCard,field=$MyField}
- ucm: evaluate Repeat block before If block (Syntax 9)
- ucm: allow string with substitution for If.Condition block (Syntax 9)
When If.Condition is a string type instead of compound, parse it using
snd_config_load_string with variable substitution support for syntax v9+.
This allows more flexible condition definitions using variable references.
- ucm: optimize if_eval_string with common comparison helper
Refactor if_eval_string() to eliminate code duplication by introducing
a compare_strings() helper function that handles the common pattern of
retrieving, substituting, and comparing string pairs.
- ucm: add Repeat block - repetitive pattern substitution (Syntax 9)
Implements Repeat blocks for generating repetitive configuration patterns
with variable substitution. This feature allows applying a configuration
block multiple times with different variable values, significantly reducing
duplication in UCM configuration files.
iterator abstraction allows easy extension for future pattern types.
Example:
Repeat.VolumeInit {
Pattern {
Variable 'ch'
Type Integer
First 0
Last 7
Step 1
}
Apply {
cset "name='PCM Channel ${var:ch} Volume' 100%"
}
}
- ucm: add integer comparison condition (Syntax 9)
Adds support for integer comparison operations in If.Condition blocks.
Supports operators: ==, !=, <, >, <=, >= for comparing integer values.
Both values are substituted and converted from strings to 64-bit integers.
Hexadecimal (C like) strings are also accepted (like 0x1234).
Example usage:
If.check_channels {
Condition {
Type Integer
Operation ">"
Value1 "${var:channels}"
Value2 "2"
}
True { ... }
}
- ucm: substitute define IDs and macro arguments (Syntax 9)
It is useful to substitute the variable names and string
macro arguments. It may simplify the UCM configurations.
E.g.:
Define."${var:Name} Suffix" "Value"
Macro.a.DoIt "Channels=${var:PlaybackChannels}"
- ucm: fix invalid pointer dereference in parse_open_variables()
When the string with variables is not parseable, do not
try to free invalid cfg pointer.
- ucm: libconfig parser - fix pathname for substituted file
The path name substituted file contents and normal file contents
should be handled similary. Use correct function determining
the right base directory name.
Configuration
- conf, seq, ucm: fix discards const from pointer target
Since glibc-2.43:
For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers
into their input arrays now have definitions as macros that return a
pointer to a const-qualified type when the input argument is a pointer
to a const-qualified type.
https://lists.gnu.org/archive/html/info-gnu/2026-01/msg00005.html
Closes: https://github.com/alsa-project/alsa-lib/pull/496
Error handler
- error: use SND_LOG_LAST/SND_ILOG_LAST in log priority/interface bounds checks
- pcm: use new logging for hw_params dump, add pcm_params log interface
This change was omitted.
alsa-ucm-conf
Core
- github: workflow: fix paths for the last change
- github: workflow: move things to separate alsa-project/github-workflows repo
It is a preparation to be reused for other ALSA repos.
- github: workflow: another permissions fix - inherit
- github: workflow: another permissions fix for pr-validation
- github: workflow: another permissions fix (token)
- github: workflow: try to set permissions explicitly
- github: accept any Signed-off-by tag (case insensitive)
- github: add GitHub label automation and SOB validation workflows
This commit introduces a complete automation system for GitHub repositories
that provides automatic label-based commenting and Signed-off-by validation.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Configuration
- sof-soundwire: rt711-sdca: add Headset Mic Switch to Headset sequences
No sound captured in headset mic through jack on Dell Precision 5480, Ubuntu 24.04.4 LTS kernel version 6.17.0-20-generic
Headset Mic Switch is a DAPM gate that must be enabled to connect the
headset microphone input to the SoundWire capture pipeline. Without it
the mic path is powered down regardless of the FU0F Capture Switch state,
producing silence.
Add Headset Mic Switch on/off to Enable/DisableSequence, matching the
pattern already used for Headphone Switch in the Headphones device.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/740
- sof-soundwire: rt711-sdca: set PGA30.0 volume in BootSequence
No sound from headphone jack on Dell Precision 5480, Ubuntu 24.04.4 LTS kernel version 6.17.0-20-generic
The SOF DSP pipeline volume PGA30.0 (pipeline 30, PCM device 0) defaults
to 0 at boot, which the dBscale treats as a hardware mute. The DAPM chain
is active and audio flows on the SoundWire bus, but the pipeline passes
silence into the codec.
Set PGA30.0 30 Playback Volume to 32,32 (0 dB) so the pipeline is not
muted when headphones are enabled. Software volume is applied on top by
PipeWire/PulseAudio independently.
Tested on Dell Precision 5480 (Intel Raptor Lake-P, rt711-sdca on
SoundWire master-0-2).
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/740
- HDA: move speaker config to HiFi-spk.conf file
No functional change.
- ucm2: Qualcomm: fix device ids for surface pro 12in
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/768
- ucm2: MediaTek: mt8366-evk: Add alsa-ucm support
Add alsa-ucm support for the MediaTek mt8366-evk platform.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/765
- ucm2: Toradex: apalis-imx8: Set default values for input and output devices
Add EnableSequence/DisableSequence entries for the Mic input device. Align
BootSequence with other Toradex NXP module configurations. Remove Lineout
from the BootSequence, as the codec Lineout output pin is not connected on
the Apalis iMX8.
Previously uninitialized configurations were set unpredictably at boot, causing
high-noise input/output behavior. Set these configs explicitly to ensure the
sound card starts in a known working state.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/761
- ucm2: Toradex: apalis-imx8: Fix symlink name and path configuration
Rename apalis-imx8.conf symlink to apalis-imx8qm.conf, which matches the
sound card name for both Apalis iMX8 QuadMax and QuadPlus variants. Also fix
file path set in SectionUseCase to point to the correct HiFi.conf location.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/761
- HDA/HiFi-analog.conf: skip Line2 ConflictingDevice when loctl is empty (Line1 not created)
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/764
- USB-Audio: ALC4080: Add support for ASUS Pro ET900N G3 - Station GB300 platform
This enables:
- Front panel line out
- Front panel mic in
Fix front panel audio routing and PCM settings.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/757
- ucm2: sof-soundwire: add Mic LED control for ACP PDM DMIC
Like for SOF HDA, add software defined Mic LED switch control with
Mic LED bindings.
- ucm2: sof-soundwire: add combined cs42l43-spk+cs35l56 config
In some systems cs42l43-spk and cs35l56 can be used simultaneously to
drive seprate speakers (e.g. tweeters and woofers), add a configuration
to support that.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/748
Link: https://lore.kernel.org/all/20260417144529.2385360-1-mstrozek@opensource.cirrus.com/
- ucm2: sof-soundwire: cs42l43: Separate init handling of speaker and headset
Since cs42l43 can be used without UAJ, make sure the speakers can be
initialised separately. Complements [1] and add a possible speaker mute
LED bind.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/748
Link: https://github.com/alsa-project/alsa-ucm-conf/pull/738 [1]
- ucm2: rt722: add speaker mute LED and PlaybackSwitch for FU06
Attach rt722 FU06 Playback Switch to the speaker mute LED via SetLED
in init.conf, and declare PlaybackSwitch in the Speaker device so
PipeWire can toggle hardware mute.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/753
Link: https://lore.kernel.org/linux-sound/20260423101338.1040131-1-aaron.ma@canonical.com/
- ucm2: Qualcomm: Add HONOR MagicBook Art 14 support
Works with the same topology as CRD device.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/755
- ucm2: Qualcomm: x1e80100: T14s-HiFi: remove duplicate DP Jack names
The DP names had duplicated definitions.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/754
- ucm2: Qualcomm: x1e80100: T14s-HiFi: switch DP outputs to dedicated MultiMedia5/6/7 streams
Align UCM with the topology change that added dedicated multimedia
frontends for DisplayPort (commit c8d6762 "ASoC: qcom:
x1e80100-LENOVO-Thinkpad-T14s: add dedicated multimedia frontend for
DisplayPort").
- SectionVerb EnableSequence: enable DISPLAY_PORT_RX_0/1/2 on
MultiMedia5/6/7 (remove the old MultiMedia1 "0" settings).
- Headphones: disable the DP mixers on the new dedicated streams.
- HDMI0/1/2 devices: route each DISPLAY_PORT_RX_* to its own
MultiMedia frontend, use dedicated PlaybackPCM "hw:${CardId},4/5/6",
add explicit PlaybackChannels 2, and keep the existing JackControl.
This gives independent DP audio streams and matches the new topology.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/754
- ucm2: Qualcomm: Enable Headset Microphone on kaanapali-mtp
Enable missing Headset Microphone on kaanapali-mtp.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/750
- ucm2: Qualcomm: Enable Headset Microphone on sm8750-mtp
Enable missing Headset Microphone on sm8750-mtp.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/750
- ucm2: add Arduino monza support
Arduino VENTUNO has 1xHDMI, 1xDP, Headset(Mic and speakers), LineOut and
EarOut connectors.
Add support for everything except DP, as it is not fully enabled yet.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/751
- ucm2: Qualcomm: Rename qcm6490-idp ucm2 conf
Rename the ucm2 conf for Qualcomm qcm6490-idp.
qcm6490-idp-snd-card.conf -> QCM6490-IDP.conf.
Removed snd-card tags from conf, as name did not
correctly match the actual sound card name.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/746
- ucm2: Qualcomm: Fix headphone mic mute setting on qcm6490-idp
Fix internal mic mute handling by selecting Mic1 to mute the
internal mic when the headphone microphone is enabled.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/746
- ucm2: Add config for Tascam US-2x2HR
USB ID 0644:8070 TEAC Corp. US-2x2HR
Line1/Mic1/Mic2 comments mostly match the device labels
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/693
- sof-soundwire: add rt722 into hs_init
Load rt722/init.conf while using rt722 headset function only
instead of multicodec.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/743
- sof-soundwire: rt1320: add rt1320 dmic config
This patch adds configs for rt1320 dmic function.
It defines the MicMixerElem, a remapped control for the two rt1320-dmic
case, and also attaches rt1320 FU capture controls to the mic LED.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/743
- sof-soundwire: rt1320: add playback control switch
This patch defines 'rt1320 OT23' as PlaybackMixerElem and
a remapped one 'rt1320 OT23 Playback Switch' when using one
or two amps.
And also attach rt1320 OT23 controls to speaker LED.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/743
- sof-soundwire: add companion amp config with rt721 and rt1320
Support the machines with companion amps with rt721 and rt1320.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/744/
- tegra-hda: Add HDMI/DP outputs 2-4 for Tegra186+
Declare the maximum four HDMI/DisplayPort outputs (PCM devices 3, 7,
8 and 9) so PipeWire can see every available port. The HDMI macro's
built-in ControlExists check ensures devices are only created when the
corresponding jack control exists, so SoCs with fewer outputs are
unaffected.
Link: https://lore.kernel.org/alsa-devel/20260416090600.2237882-1-sheetal@nvidia.com/
- ucm2: conf.d: fix h616-audio-codec symlink
- ucm2: conf.d: fix QCS6490-RB3Gen2 symlink
- ucm2: conf.d: fix qcm6490-idp-snd-card symlink
- ucm2: conf.d: fix Kaanapali-MTP.conf symlink
- ucm2: Qualcomm: Create missing symlink for Radxa Dragon Q6A
The long card name set by the Linux kernel is based on the DMI information
for the vendor name, product name and board revision. Create a symlink so
that the configuration is correctly picked up by ALSA if DMI is enabled
in the kernel.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/736
- ucm2: sof-soundwire: cs42l43: support UAJ-less configuration
In some cases cs42l43/cs42l43b devices can be set up without UAJ. In
this case, guard the ConflictingDevices behind a check for a cs42l43's
headset's presence so the UCM can still load even if the headset is
missing.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/738
- ucm2: Focusrite Scarlett 18i20 Gen 1 — fix USB ID regex (1235:800c)
- fix case mismatch in device matching regex
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/739
- USB-Audio: fixes for M-Audio Fast Track Ultra
- use new USB-Audio.conf macros
- follow UCM device numbering rule (continuous - use labeling)
- USB-Audio: Add Audient EVO4
This is a 4in/4out device with 1 analog stereo out and 2 analog mono in.
The hardware mixed loopback interface takes up the remaining 4 channels.
Without this UCM the device is configured as 4.0 surround for in and out.
I copied the Windows config except for the stereo mic mix.
Modifying hardware volumes/gain other than main output seems to require
a driver or external software similar to the one found on github at the
repo github.com/vijay-prema/audient-evo-linux-tools
Closes: #303
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/708
- Add UCM2 configuration for M-Audio Fast Track Ultra
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/672
- ucm2: Qualcomm: add QCS6490 Thundercomm RubikPi3 HiFi config
Add UCM2 configs for the QCS6490 Thundercomm RubikPi3 Board to handle:
- 3.5mm headset playback/capture
- HDMI playback
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/735
- sof-hda-dsp: add workaround for speaker LED on MSI laptops
on these two platforms. This change adresses this issue.
Also fixes 0915b27a which accidentally broke dell workaround.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/716
- ucm2: sof-soundwire: Add support for CS42L43B variant
From UCM point of view CS42L43B codec adds 2 new decimators and removes
a control to change Decimator 1 mode from base CS42L43. Thus reuse
CS42L43 files, and guard the CS42L43B additions behind a condition
that the new Decimator controls exist.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/665
Link: https://lore.kernel.org/all/20260306152829.3130530-1-mstrozek@opensource.cirrus.com/
- ucm2: tegra: wm8903: fix headphones conflicting device
A recent change renames the speaker device but failed to update the
headphones conflicting device list.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/707
- ucm2: sof-soundwire: Add support for Cirrus Logic CS47L47
Add the sof-soundwire and codec files for the CS47L47.
This is a SDCA codec with headphone/headset and digital mic.
The configuration is based on the CS42L45 files.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/709
- Qualcomm: glymur: Add GLYMUR CRD HiFi config
Add UCM2 configs for the Qualcomm GLYMUR CRD Board.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/713
- ucm2: Qualcomm: add ASUS Vivobook 14 (X1407QA) to x1e80100 DMI match
The ASUS Vivobook 14 X1407QA (Snapdragon X X1-26-100, x1p42100 'Purwa' die)
reports DMI product_family as 'ASUS Vivobook 14' but was not matched by the
existing regex, leaving audio non-functional.
Hardware: WCD9385 codec + 2x WSA884x speakers via SoundWire + ADSP Q6APM,
identical audio topology to the other ASUS Snapdragon X devices already matched.
DMI strings:
board_vendor: ASUSTeK COMPUTER INC.
product_family: ASUS Vivobook 14
board_name: X1407QA
product_name: ASUS Vivobook 14 X1407QA_X1407QA
Tested on Fedora 44 aarch64, kernel 6.12+.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/725
- Add multitrack mappings for 1.7.3 firmware
Add split pcm devices for 1.7.3 multitrack mappings
Fix typos in configuration comments
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/729
- ucm2: da7213: Fix mic capture in HeadphoneMic2 use case
Set Mic 2 Volume to index 4 (+18 dB) and Mixin PGA Volume to index
10 (+10.5 dB) for sufficient microphone capture gain.
Remove headphone output controls (Headphone Volume, Headphone Switch,
Mixout DAC switches) as these belong to HeadphoneEnableSeq.conf and
should not be duplicated in the capture sequence.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/730
- USB-Audio: Scarlett 18i20 fix ADAT capture channel count for Gen 1/2
The Scarlett 18i20 Gen 1 (0x800c) and Gen 2 (0x8201) have 18 capture
channels, but the ADAT Optical Input device ("Direct 2") unconditionally
maps 8 channels (indices 12-19). Channel indices 18 and 19 exceed the
available capture channels, causing WirePlumber/PipeWire to reject the
UCM profile:
spa.alsa: Error in ALSA UCM profile for _ucm0003.hw:USB,0 (Direct2):
CaptureChannel6=18 >= CaptureChannels=18
Conditionally size the ADAT capture device based on DirectCaptureChannels:
- Gen 1/2 (18 channels): 6-channel ADAT (indices 12-17)
- Gen 3+ (20+ channels): 8-channel ADAT (indices 12-19)
Tested on a Scarlett 18i20 Gen 2 (USB1235:8201) running PipeWire 1.4
with WirePlumber on CachyOS.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/731
- ucm2: sof-soundwire: add ACP DMIC configuration
add acp-dmic.conf to the sof-soundwire configuration tree to enable
the ACP digital microphone (DMIC) endpoint for AMD SoundWire platforms.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/732
Suggested-by: Jaroslav Kysela <perex@perex.cz>
- USB-Audio: ALC4080 add USBID 0db0:82c4 (MSI MEG Z790 Godlike Max)
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/690
- USB-Audio: ALC4080 add USB ID 0db0:95bb (MSI MEG Z690 Unify)
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/706
- USB-Audio: Add RODECaster Pro II
Use tabs instead of spaces
Reduce files
Include simple configs using new Synthax 8
Remove duplicated Comment assignment
Update Priority values
Fix regex pattern
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/656
- ucm2: codecs: lpass-wsa-macro: disable WSA_COMP
The compander does not seem to work correctly on many of the platforms
currently in use with upstream software. Particularly some very annoying
"boominess on attacks" is heard on X Elite laptops when it's on.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: codecs: lpass-rx-macro: disable RX_COMP
The compander does not seem to work correctly on many of the platforms
currently in use with upstream software. Strange effects such as quiet
sounds being panned to the left channel and some "boominess on attacks"
can be heard when it's on.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: codecs: wcd938x: add enable sequence with CLS_AB_LOHIFI for laptops
Laptops have A/B class amps and using H class mode results in distortion.
Create a specific sequence variant for them.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: codecs: wcd939x: Use CLS_H_LOHIFI instead of CLS_H_ULP by default
The ULP mode is too weak to drive headphones, causing distortion above
30-40% volume. Switch to LOHIFI as a more reasonable default.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: codecs: wcd938x: Use CLS_H_LOHIFI instead of CLS_H_ULP by default
LoHIFI mode makes the headphone audio quality much better compared with
the "Ultra Low power" mode.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: codecs: wcd937x: Use CLS_H_LOHIFI instead of CLS_H_ULP by default
The ULP mode is too weak to drive headphones, causing distortion above
30-40% volume. Switch to LOHIFI as a more reasonable default.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: codecs: wcd934x: Use CLS_H_LOHIFI instead of CLS_H_ULP by default
The ULP mode is too weak to drive headphones, causing distortion above
30-40% volume. Switch to LOHIFI as a more reasonable default.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/670
- ucm2: Qualcomm: qcs8300: Remove Fixed channel setting for monaco-evk
Remove Fixed channel setting for monaco-evk to support stereo
capture.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/694
- ucm2: Qualcomm: sa8775p: Remove Fixed channel setting for lemans-evk
Remove Fixed channel setting for lemans-evk to support stereo
capture.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/694
- Qualcomm: qcs615: Remove JackControl from TALOS EVK HiFi config
The EVK board does not support headset or jack detection.
Keeping JackControl entries prevents PipeWire (wpctl) from
exposing sinks and sources correctly.
Remove JackControl from Headphones and Headset devices so
PipeWire can enumerate playback and capture nodes normally.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/704
- USB-Audio: Motu: M6-HiFi.conf - m6 has only 4 outputs, not 6
We have configuration where it specifies 6 outputs for
motu m6 while devices has only 4. Adjust accordingly.
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/700
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/701
- common: split.conf - simplify macro call arguments
The main macros are more readable now.
- common: split.conf - put macro arguments to one string
Make config a little bit shorter.
- USB-Audio: ALC4080 add USB ID 0db0:19a2 (MSI MAG B850 Tomahawk Wifi)
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/695
- USB-Audio: correct typo in Universal Audio Volt 2 config
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/696
- USB-Audio: cosmetic change for Flow8
- USB-Audio: use macros in the base file
Reduce the file length and increase readability.
- USB-Audio: ALC4080 add USB ID 0db0:d4fa (MSI MPG B850I Edge TI Wifi)
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/647
- USB-Audio: optimize ProfileName assignments
- USB-Audio: merge configs for Solid State Labs SSL 2 (normal + plus + MK II)
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/676
- USB-Audio: ALC4080 - fix Speaker PCM device name
- USB-Audio: ALC4080 - fix 'detect S/PDIF device using find-pcm'
The find-device may be NULL, so use double $$ to reference
the variable (skip NULL check).
- USB-Audio: Fix - ALC4080 add USB ID 0b05:1a7a (ASUS ROG Strix X670E-I Gaming WiFi)
The regex part was omitted.
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/692
- USB-Audio: ALC4080 - detect S/PDIF device using find-pcm
- USB-Audio: ALC4080 - add Headset device
- USB-Audio: ALC4080 - use PCM device indexes rather than full names in variables
- USB-Audio: ALC4080 add USB ID 0b05:1a7a (ASUS ROG Strix X670E-I Gaming WiFi)
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/692
- USB-Audio: ALC4080 - add list of known Jack controls to comment
- USB-Audio: ALC4080 add USB ID 0db0:4c84 (MSI MPG X870I EDGE TI EVO WIFI)
Closes: https://github.com/alsa-project/alsa-ucm-conf/issues/689
- USB-Audio: Add Focusrite Vocaster interfaces
Add split configs for the Focusrite Vocaster One and Two interfaces.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/666
- Add support for the Behringer ULM200D wireless microphones.
This is a USB receiver for two wireless microphones.
Each microphone appears on a different channel.
By default these would be detected as left and right.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/669
- ucm2: da7213: Add ADC switch in HeadphoneMic2 sequences
Enable and disable the ADC switch in HeadphoneMic2EnableSeq.conf and
HeadphoneMic2DisableSeq.conf to ensure headset microphone audio works
properly on Talos EVK with DA7213 codec.
Without this change, the headset mic path remains muted and capture
does not function.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/682
- USB-Audio: Add support for the SSL 2 MK II and SSL2+ MK II
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/681
- USB-Audio: improve channel detection for Solid State Labs SSL 2
It seems that there are two variants with different capture
channel count. Try to identify them using USB bcdDevice value.
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/676
- USB-Audio: Dualsense PS5 - add direct use case
Wine games expecting 4 channel playback stream to handle
correctly audio and haptic channel arrangment.
Add direct use case and make it as first until
user selects another profile which may cause failure
for wine games.
For a permanent solution, wine should combine 4 channel
device from the sinks created using the channel split
mechanism or add pipewire protocol. In later case, the
the straight hardware device output ports should be used.
Link: https://github.com/alsa-project/alsa-ucm-conf/issues/677
- USB-Audio: ALC4080 add USB ID 0b05:19ac (ASUS ROG Maximus Z490/Z590 XIII Hero)
Closes: https://github.com/alsa-project/alsa-ucm-conf/issues/683
- ucm2: Qualcomm: add Asus Vivobook 16 support
Same layout as T14s, 2 speakers, hedphone jack, DMIC
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/668
- ucm2: Qualcomm: Add Lenovo Yoga Air 14s support
Lenovo Yoga Air 14s laptop is basically a Slim 7 for China, and they
share the same audio configuration.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/667
- ucm2: Qualcomm: add Dell XPS 9345
Add a new target with extended regex string. Device is mostly
compatible with Yoga Slim7x, however features only x2 not x3 DP audio
outputs (USB Type-C). As upcoming DP audio addition will require
config separation, create a dedicated config right away.
x4 speakers, x2 DMICs, x2 DP, no headphone jack/WCD codec.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/587
- ucm2: Qualcomm: document existing hardware
In most cases its not the config name (device model name) that matters
but the hardware variation of that model. To make currently supported
devices easier to re-use, document the layout. While most configs do
not yet have DP/HDMI defined, it will matter once these are getting
added.
Closes: https://github.com/alsa-project/alsa-ucm-conf/pull/587
Description
- Release v1.2.16
Detailed changelog between 1.2.15.2 and 1.2.16 releases
Changelog between 1.2.13 and 1.2.16 releases
alsa-utils
Core
- Release v1.2.16 - INSTALL: update compilation from git sources - configure: update to autoconf v2.72
ALSA Control (alsactl)
- aplay, alsactl, topology: fix discards const from pointer target
Since glibc-2.43:
For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers
into their input arrays now have definitions as macros that return a
pointer to a const-qualified type when the input argument is a pointer
to a const-qualified type.
https://lists.gnu.org/archive/html/info-gnu/2026-01/msg00005.html
Closes: https://github.com/alsa-project/alsa-utils/pull/322
- Remove more generated files on "make clean"
Closes: https://github.com/alsa-project/alsa-utils/pull/328
Speaker Test
- speaker-test: extend MAX_CHANNELS from 16 to 32
Add channel names and WAV filenames for channels 17-32 to support
up to 32-channel speaker testing.
- speaker-test: fix segfault with more than 16 channels
get_channel_name() was accessing the channel_name array without bounds
checking. When using more than 16 channels without a channel map, it
would read past the end of the array and crash.
Closes: https://github.com/alsa-project/alsa-utils/pull/319
aconnect
- aconnect: fix error handler for alsa-lib <= 1.2.15
alsa-info.sh
- alsa-info.sh: remove some bashisms to allow run with busybox
Closes: https://github.com/alsa-project/alsa-utils/pull/316
alsaloop
- alsaloop: parse_config(): align optstring order with the long options
The 'd' and 'm' options were not in the same order as the long options. Fix
that.
No functional change, but makes it easier to ensure they are kept in sync.
Closes: https://github.com/alsa-project/alsa-utils/pull/317
- alsaloop: parse_config(): handle long form --wake option
The usage info documents a long form --wake option:
"-W,--wake process wake timeout in ms\n"
But it wasn't handled:
alsaloop --wake 42
alsaloop: unrecognized option '--wake'
Fix that.
Closes: https://github.com/alsa-project/alsa-utils/pull/317
- alsaloop: parse_config(): drop unused 'F' option
It is not documented in the usage info, no corresponding long option and is
not handled in the parsing, so drop it from the optstring.
Closes: https://github.com/alsa-project/alsa-utils/pull/317
- alsaloop: parse_config(): handle short form -B / -E options
The usage info documents both short and long form arguments for these:
"-B,--buffer buffer size in frames\n"
"-E,--period period size in frames\n"
But the short form was missing from the optstring so it wasn't accepted:
alsaloop -B 123 -E 42
alsaloop: invalid option -- 'B'
alsaloop: invalid option -- 'E'
Fix that.
Closes: https://github.com/alsa-project/alsa-utils/pull/317
alsatplg (topology)
- aplay, alsactl, topology: fix discards const from pointer target
Since glibc-2.43:
For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers
into their input arrays now have definitions as macros that return a
pointer to a const-qualified type when the input argument is a pointer
to a const-qualified type.
https://lists.gnu.org/archive/html/info-gnu/2026-01/msg00005.html
Closes: https://github.com/alsa-project/alsa-utils/pull/322
amixer
- amixer: always use line buffering for (s)events
Line buffering is the obviously correct mode for (s)events, but block
buffering would typically be used when piping its output to another
program.
Closes: https://github.com/alsa-project/alsa-utils/pull/306
- amixer: document --file option in man page
- amixer: support --file option
Allows to read commands directly from file.
Refactor exec_stdin() to exec_file() function to support generic files.
Closes: https://github.com/alsa-project/alsa-utils/pull/321
- amixer: support infinite line length for --stdin option
Closes: https://github.com/alsa-project/alsa-utils/pull/321
aplay/arecord
- aplay, alsactl, topology: fix discards const from pointer target
Since glibc-2.43:
For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr,
strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers
into their input arrays now have definitions as macros that return a
pointer to a const-qualified type when the input argument is a pointer
to a const-qualified type.
https://lists.gnu.org/archive/html/info-gnu/2026-01/msg00005.html
Closes: https://github.com/alsa-project/alsa-utils/pull/322
- Remove more generated files on "make clean"
Closes: https://github.com/alsa-project/alsa-utils/pull/328
- aplay: use snprintf instead of sprintf in device_list()
sprintf() does not perform bounds checking. Replace it with snprintf()
using sizeof(name) to follow safer coding practices and make the buffer
size explicit, consistent with how similar fixes have been applied
elsewhere in the codebase
gitcompile
- gitcompile: extensions for gettext and error handling
The gettextize script tends to suggest some solutions, but we
are using them already.
- configure: update to autoconf v2.72
Detailed changelog between 1.2.13 and 1.2.16 releases
Changelog between 1.2.13 and 1.2.16 releases
tinycompress
Core
- Release v1.2.16 - utils: move sofprobeclient to separate subdirectory
Header files
- Utils: cplay: Fix WAV header parsing for multi-channel (5.1/7.1) formats
Multi-channel WAV files (>2 channels) use WAVE_FORMAT_EXTENSIBLE
(type 0xFFFE) with a larger fmt chunk that includes a channel mask
and subformat GUID. The existing parser only handled basic PCM
(type 0x0001), causing several issues with 5.1 (6ch) and 7.1 (8ch)
content:
- The fixed-size fread of struct wave_header (44 bytes) misaligned
the data chunk read when the fmt chunk was larger than 16 bytes,
resulting in audio data being read from the wrong file offset.
- No chunk scanning was performed, so intermediate chunks (fact,
LIST, PEAK) between fmt and data caused parse failures.
- The WAV channel mask (speaker positions FL, FR, FC, LFE, BL, BR,
SL, SR) was never extracted, so firmware received ch_mode=0 and
could not determine the correct channel-to-speaker routing.
Add parse_wave_file() that properly scans chunks, handles both basic
PCM and WAVE_FORMAT_EXTENSIBLE formats, extracts the channel mask,
and positions the file pointer at the start of audio data. For basic
PCM files with >2 channels, a standard default channel mask is
generated per the Microsoft WAV specification.
The channel mask is passed to firmware via snd_codec.ch_mode so it
can correctly map channels to speaker positions. Also add 24-bit
sample format support (SNDRV_PCM_FORMAT_S24_LE).
Closes: https://github.com/alsa-project/tinycompress/pull/32
- tinycompress.h: fix avail/samples typo in comment for get_tstamp function
- lib: return -ERANGE for hpointer/tstamp functions on overflow
- tinycompress.h: fix typos in comment for htimestamp functions
- lib: introduce compress_get_hpointer64
Allow to pass unwrapped avail value to applications. Introduce
new compress_get_hpointer64() function and change callback
in ops.
Use UINT_MAX limiting rather than blind wrap like in the previous
code in compress_get_hpointer().
Closes: https://github.com/alsa-project/tinycompress/pull/31
- compress_ops: remove get_tstamp64 callback
It is not required to polute ops with two versions
of similar callbacks when we introduced V2 ops. Handle the
wrapping in the top level (compress_get_tstamp function).
Closes: https://github.com/alsa-project/tinycompress/pull/31
- compress_ops: add magic and look for compress_plugin_mops symbol
We need more validation of passed ops structure to allow
further API changes in future.
This change looks for compress_plugin_mops symbol in the
dynamic plugin library to make sure that the new magic
and new get_tstamp64 members are handled correctly.
Closes: https://github.com/alsa-project/tinycompress/pull/31
Link: https://github.com/alsa-project/tinycompress/pull/29
Link: https://github.com/alsa-project/tinycompress/pull/30
- include: install compress_ops.h as public header
Move tinycompress/compress_ops.h from noinst_HEADERS to
nobase_include_HEADERS so it gets installed for users.
Closes: https://github.com/alsa-project/tinycompress/pull/30
- compress_ops: add get_tstamp64
Add get_tstamp64 using the new ioctl SNDRV_COMPRESS_TSTAMP64.
- sound: update header to v0.4.0
Kernel has upgraded compress headers and bumped version to 0.4.0,
so update this header as well.
Library
- lib: fix error code for the improved protocol check
- lib: improve protocol version check in hw plugin
- lib: do not pass NULL string pointer to printf
- lib: return -ERANGE for hpointer/tstamp functions on overflow
- lib: include errno.h (posix) instead sys/errno.h
- lib: compress_get_tstamp - clamp samples to UINT_MAX on overflow
- lib: fix return error inconsistency in populate_compress_plugin_ops
- lib: introduce compress_get_hpointer64
Allow to pass unwrapped avail value to applications. Introduce
new compress_get_hpointer64() function and change callback
in ops.
Use UINT_MAX limiting rather than blind wrap like in the previous
code in compress_get_hpointer().
Closes: https://github.com/alsa-project/tinycompress/pull/31
- compress_ops: remove get_tstamp64 callback
It is not required to polute ops with two versions
of similar callbacks when we introduced V2 ops. Handle the
wrapping in the top level (compress_get_tstamp function).
Closes: https://github.com/alsa-project/tinycompress/pull/31
- compress_ops: add magic and look for compress_plugin_mops symbol
We need more validation of passed ops structure to allow
further API changes in future.
This change looks for compress_plugin_mops symbol in the
dynamic plugin library to make sure that the new magic
and new get_tstamp64 members are handled correctly.
Closes: https://github.com/alsa-project/tinycompress/pull/31
Link: https://github.com/alsa-project/tinycompress/pull/29
Link: https://github.com/alsa-project/tinycompress/pull/30
- compress_hw: fix formatting (compress_hw_avail64_from_32)
Closes: https://github.com/alsa-project/tinycompress/pull/31
Link: https://github.com/alsa-project/tinycompress/pull/30
- compress_hw_get_hpointer: use SNDRV_COMPRESS_AVAIL64
Refactor compress_hw_get_hpointer to use the new SNDRV_COMPRESS_AVAIL64
which benefits from overflow safety.
- compress_hw: cache ioctl version
Read the version when opened and cache it to reduce ioctl calls.
- compress_ops: add get_tstamp64
Add get_tstamp64 using the new ioctl SNDRV_COMPRESS_TSTAMP64.
Utilities
- utils: move sofprobeclient to separate subdirectory
- utils: probes_demux: auto-close idle audio files and avoid overwrites
Audio capture files (buffer_<id>.wav) are now automatically closed
after 200 ms of inactivity, so completed recordings can be accessed
while sofprobeclient is still running.
If the same probe point becomes active again, a new file is created
with an incrementing index (buffer_<id>-1.wav, buffer_<id>-2.wav, ...)
rather than overwriting the previous capture. The index is chosen by
probing the filesystem, so existing files from earlier runs are never
clobbered either.
Buffer IDs in file names and log messages are printed in hexadecimal
(e.g. buffer_0x1a.wav) to match firmware conventions.
Closes: https://github.com/alsa-project/tinycompress/pull/35
- utils: sofprobeclient: add -D flag for parser debug messages
Move the "We read N, DSP sent M" diagnostic behind a new -D
(parser debug) flag so it does not clutter normal output.
Closes: https://github.com/alsa-project/tinycompress/pull/35
- utils: sofprobeclient: fix parser buffer overflow on large reads
The compress device may return more data than the parser's internal
buffer (DATA_READ_LIMIT, 4096 bytes) can accept in one call. Feed
captured data in a loop, copying only as much as parser_fetch_free_buffer()
reports available per iteration. This fixes truncated probe packets
that caused checksum errors and missing log lines.
Closes: https://github.com/alsa-project/tinycompress/pull/35
- utils: sofprobeclient: embed SOF probe parser for real-time demux
Integrate the sof-probes demux engine directly into sofprobeclient so
captured compressed data is parsed in real time instead of being
written to a raw file.
Log output from non-audio probe points is printed to stdout
(equivalent to sof-probes -l). Audio probe data is extracted into
buffer_<id>.wav files in the current directory. The file output
parameter is removed; sofprobeclient no longer acts as a generic
recorder.
New files copied from SOF v2.9 sources tools/probes/ with include
paths adjusted for standalone tinycompress build:
probes_demux.c / probes_demux.h - probe stream parser
probes_wave.h - WAV header definitions
probe_dma_frame.h - DMA frame packet format
Closes: https://github.com/alsa-project/tinycompress/pull/35
- utils: sofprobeclient: set SOF probe defaults
Change default parameters to match typical SOF probe usage:
card 3, device 0, buffer 8192, 4 fragments, S32_LE format,
48000 Hz sample rate, and 4 channels.
All parameters remain overridable via command line options.
Closes: https://github.com/alsa-project/tinycompress/pull/35
- utils: add sofprobeclient binary
Add sofprobeclient, a SOF probe client for compressed audio
capture based on crecord. Built from its own source file with
the same libtinycompress linkage as cplay and crecord.
At this phase the sofprobeclient.c is almost exact copy of
crecord.c. Only the reference to the command name have been updated
from "crecord" to "sofprobeclient".
This is a staring point for SOF probe debugging tool that uses
compressed audio capture device for routing logs and audio form
defined probe points out of the DSP subsystem.
Closes: https://github.com/alsa-project/tinycompress/pull/35
- Utils: cplay: Fix WAV header parsing for multi-channel (5.1/7.1) formats
Multi-channel WAV files (>2 channels) use WAVE_FORMAT_EXTENSIBLE
(type 0xFFFE) with a larger fmt chunk that includes a channel mask
and subformat GUID. The existing parser only handled basic PCM
(type 0x0001), causing several issues with 5.1 (6ch) and 7.1 (8ch)
content:
- The fixed-size fread of struct wave_header (44 bytes) misaligned
the data chunk read when the fmt chunk was larger than 16 bytes,
resulting in audio data being read from the wrong file offset.
- No chunk scanning was performed, so intermediate chunks (fact,
LIST, PEAK) between fmt and data caused parse failures.
- The WAV channel mask (speaker positions FL, FR, FC, LFE, BL, BR,
SL, SR) was never extracted, so firmware received ch_mode=0 and
could not determine the correct channel-to-speaker routing.
Add parse_wave_file() that properly scans chunks, handles both basic
PCM and WAVE_FORMAT_EXTENSIBLE formats, extracts the channel mask,
and positions the file pointer at the start of audio data. For basic
PCM files with >2 channels, a standard default channel mask is
generated per the Microsoft WAV specification.
The channel mask is passed to firmware via snd_codec.ch_mode so it
can correctly map channels to speaker positions. Also add 24-bit
sample format support (SNDRV_PCM_FORMAT_S24_LE).
Closes: https://github.com/alsa-project/tinycompress/pull/32
- fcplay: Add restart continuous playback strategy
The restart mode can be requested with -p2 which will result an
open->config->start->drain->close sequence for each of the files.
Closes: https://github.com/alsa-project/tinycompress/pull/33
- fcplay: Introduce new continuous_playback_mode to replace the gapless flag
Add continuous_playback_mode enum to allow expanding the strategies used
for continuous compressed playback (when more than one file is played in a
sequence).
Currently fcplay supports two modes:
0 (w/o -g 1) when each file is just sent over the compress buffer without
any action taken in between the files - NOP mode
1 (w/ -g 1) gapless mode, using metadata, neext_track and partial drain -
GAPLESS mode
No functional change expected.
Closes: https://github.com/alsa-project/tinycompress/pull/33
- fcplay: Create helper function to open and start the compress device
No functional change, just to prepare to support different continuous
playback strategies.
Closes: https://github.com/alsa-project/tinycompress/pull/33
- fcplay: Correct metadata.next_track sequence for gapless playback
The kernel demands the metadata to be set before the next_track is
signaled (since 2013).
Calling next_track before set metadata will case the next_track to be
'lost' in core's snd_compr_next_track().
Reverse the call order of next_track and set_metadata to fix this.
Closes: https://github.com/alsa-project/tinycompress/pull/33
- fcplay: Decode the AAC header to set correct codec->format value
Set the codec->format for AAC based on the information from the header.
Closes: https://github.com/alsa-project/tinycompress/pull/34