Commit graph

688 commits

Author SHA1 Message Date
Kai-Heng Feng
dd70c3c589 module-alsa-card: Set a minimum profile priority if it's not set
If the profile is generated from UCM, the priority won't be set so it
stays as 0.

Assume a card has two available profiles, when the selected one becomes
unavailable, module-switch-on-port-available's find_best_profile()
should pick the next available one. However, since the priority is 0,
the "off" profile was chosen instead of the available one.

So let's set the priority to 1 to make profile that is available has
higher priority than "off" profile.
2020-08-10 11:52:31 +00:00
Kai-Heng Feng
e153fb8706 alsa-mixer: Recognize USB audio jack mixer
UAC v2 and v3 support insertion control (jack detection), and the
created jack mixers have "- Input" suffix and "- Output" suffix for
input jack and output jack, respectively.

Add these jacks so we don't always need to rely on UCM or PulseAudio
profile-set.
2020-08-05 00:42:26 +08:00
Tanu Kaskinen
9636c2940b udev: fix too long card name with HyperX Cloud Orbit S
Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/820
2020-08-04 12:40:22 +00:00
Wim Taymans
4d1e568619 alsa-util: fix check for digit
Fix the check for a digit by checking if the value is between the
*character* '0' (not *value* 0) and '9'.
2020-08-03 09:58:39 +02:00
Tomasz Kontusz
47d811224d alsa-mixer: add support for Astro A50 gaming headset 2020-07-26 04:39:40 +00:00
Tomasz Kontusz
8482b62b0a alsa-mixer: add description-key to Mappings and Profiles 2020-07-26 04:39:40 +00:00
Tomasz Kontusz
9696e10791 alsa-mixer: Remove unused iec958-passthrough* descriptions
They were unused since 20f1fa17be.
2020-07-26 04:39:40 +00:00
Tomasz Kontusz
680d7bb976 alsa-mixer: Fix well-known descriptions for steelseries game/chat outputs 2020-07-26 04:39:40 +00:00
Hui Wang
c8653c13fa alsa: adjust ucm sink/source priority according to ports priority
On the machines with the ucm used, the different input/output devices
often have different pcm stream, so they often belong to different
sources and sinks, this is greatly different from the design of all
devices connected to a codec (without ucm).

For example, on a machine with ucm2 used:
the internal dmic is on source#0
the external mic is on the source#1
the internal spk is on sink#0
the external headphone is on sink#1

Users expect that after plugging the external device, it will become
the active device automatically. The switch-on-port-available could
make it to be the active_port on its own source/sink, but can't make
source/sink to be default_source/sink since the sources/sinks belong
to the same profile (HiFi usually).

If we adjust the source/sink priority according to ucm ports priority,
the device_port.c could handle the default_source/sink changing then.
Usually we set higher priority for external device than internal
device in the ucm.

In order to bring the lowest side effect on the source/sink priority,
I change the ucm priority to units digit first, then add it to the
original priority.

Signed-off-by: Hui Wang <hui.wang@canonical.com>
2020-07-17 09:20:50 +00:00
Hui Wang
ede8cbb131 alsa: make the unsuspend more robust
We met a weird situation on a couple of Lenovo machines and at least
on one Dell machine. First we open the gnome-sound-setting, then
suspend and resume the system, after the system resume back, the audio
devices change to dummy, the audio doesn't work anymore. And pacmd
list-cards shows no available sound card.

Through debugging I found after resume, the alsa receives POLLERR
events and it will call unsuspend to recover the pcm, but at that
moment, the device nodes in /dev/snd/ is not accessible, so the
snd_pcm_open() fails and the pulseaudio unload the module-alsa-card.

Here I add retry and pa_msleep if snd_pcm_open fails, I tested it on
all machines which have this problem, pa_msleep(25) is ok for most of
them, there is only one machine which needs to call pa_msleep(25)
twice, so for safety reason, I set the max retry times to 4.

Signed-off-by: Hui Wang <hui.wang@canonical.com>
2020-07-09 16:43:17 +08:00
Tanu Kaskinen
f12795330b alsa-ucm: Fix NULL pointer handling
get_mixer_device() can return NULL when no mixer device is configured
for the device, so mdev2 can be NULL.
2020-07-06 12:47:19 +03:00
Eero Nurkkala
0b5ab6be5a alsa-ucm: disallow null mdev argument into pa_alsa_open_mixer_by_name()
It's possible for mdev to be NULL. In this case, an assert is taken
in pa_alsa_open_mixer_by_name() with debug builds, and a crash with
release builds. However, it's possible to bypass this trouble by taking
the error path if mdev is NULL.

Reported-by: Jarkko Sankala <jarkko.sankala@offcode.fi>
Signed-off-by: Eero Nurkkala <eero.nurkkala@offcode.fi>
2020-07-06 12:47:19 +03:00
Tanu Kaskinen
04c554b7d5 sink, source: Use the global configuration for the avoid_resampling default
Previously avoid_resampling was always false unless the sink or source
implementation explicitly configured the variable. The null sink doesn't
explicitly configure it, so it didn't switch the sample rate as
expected when avoid_resampling was enabled.

This change means that also sinks that don't support rate switching can
have avoid_resampling set to true, but I think that's fine, because
pa_sink_reconfigure() doesn't try to do anything if the reconfigure()
callback isn't set.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/923
2020-06-22 14:47:42 +00:00
Jaroslav Kysela
80b993cf55 alsa ucm: set device port type
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-06-17 06:06:12 +00:00
Jaroslav Kysela
0333c2ba8f alsa: legacy card - implement device port type parser and assignment
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-06-17 06:06:12 +00:00
Jaroslav Kysela
6618527451 alsa: legacy card - set available_group
Create automatically the groups per paths where
the similar jacks are used.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-06-17 06:06:12 +00:00
Jaroslav Kysela
1fb449213f alsa-ucm: set available_group (use jack name)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-06-17 06:06:12 +00:00
Hui Wang
3549a4d926 alsa-mixer: store the ucm_device with the order of their priority
There is some case that multiple ucm devices share an amixer Jack
like "Headphones", "Headset" and "Mic2" share the "Headphone Mic Jack",
When the Jack state is changed, the module-switch-on-port-available
will process them in the order they are in the jack->ucm_devices, and
the last device will decide the final setting.

But usually users put priority for those devices and expect the
final setting is based on the highest priority device if there is no
other policies like manual selection. So here do some change to store
the ucm_devices according to their priority (from low to high).

For example, we have ucm devices definition like below (ucm2):
               SectionDevice."Mic2" {
                        Comment "Headphones Stereo Microphone"
			...
                        Value {
                                CapturePriority 200
				...
                }

                SectionDevice."Headset" {
                        Comment "Headset Mono Microphone"
			...
                        Value {
                                CapturePriority 300
				...
                        }
                }

Without this patch, the final setting is based on Mic2, after applying
this patch, the final setting is based on the Headset (with higher
priority than Mic2).

Signed-off-by: Hui Wang <hui.wang@canonical.com>
2020-06-10 08:46:51 +03:00
Jaroslav Kysela
5eb02e31a6 alsa sink/source: fix the mixer initialization
- remove duplicate mixer initialization in sink
- use the similar mixer initialization for source like for sink

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-04-09 16:42:28 +03:00
Jaroslav Kysela
fc5f263e59 ucm: fix the port / ucm device activation on boot
The UCM device must be activated using the pa_alsa_ucm_set_port()
call on boot (the sink creation time). In case when the
mixer controls are not defined for the application in the
UCM configuration, the mixer_handle is NULL.

Call the pa_alsa_ucm_set_port() before the mixer_handle check.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-04-09 16:42:28 +03:00
Wim Taymans
4dc73f5167 alsa-ucm: use the right profile name
Use the right profile name or else we could pass NULL to
pa_hashmap_get() and crash.
2020-03-25 16:35:53 +01:00
Wim Taymans
f3f16fe6df alsa: handle unavailbale HW volume in UCM
It is possible that UCM doesn't specify hardware volume controls.
Fall back to software controls instead of aborting.
2020-03-20 12:07:36 +01:00
Tanu Kaskinen
9d36210bec ucm: Don't log errors during normal operation
It's completely normal to not have explicit channel configuration for
stereo devices. In fact, the ALSA developers actively avoid configuring
the channels for stereo devices.

I also dropped the word "duplex" from the messages, because "stereo
duplex" implies bidirectionality, but most devices use one direction
only.
2020-03-17 09:31:38 +02:00
Jaroslav Kysela
4da4670fdb alsa ucm: do not assign JackHWMute when JackControl is missing for the UCM device
Fixes: https://github.com/alsa-project/alsa-ucm-conf/issues/14

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-03-01 15:55:37 +01:00
Jaroslav Kysela
cabd387e26 alsa-ucm: correct the channel default logic (stereo)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-02-15 13:07:43 +00:00
Tanu Kaskinen
5d70f1226b alsa: Document that mixer elements can be identified by a combination of name and index 2020-02-14 11:01:04 +02:00
Jaroslav Kysela
cd4a69374c alsa-ucm: allow to set profile priority from UCM value
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-23 11:10:44 +00:00
Jaroslav Kysela
d7dbd0cbe3 alsa-mixer: improve check for the empty path set for sink/source
The unused mixer instances are created without this code.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-23 11:10:44 +00:00
Jaroslav Kysela
8837c90b7f alsa-mixer: do the quick card number lookup to save mixer instances
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-23 11:10:44 +00:00
Jaroslav Kysela
3ceff8bb3f alsa-ucm: add support for HDMI ELD
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-23 11:10:44 +00:00
Jaroslav Kysela
3bd7c70c51 alsa: rewrite mixer open/close, cache mixer accesses in probe
The ALSA mixer can be opened multiple times (especially for UCM
in the probe). This adds a simple mixer cache to prevent
multiple open calls.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-23 11:10:44 +00:00
Laurent Bigonville
6438e5c46d alsa-mixer: Set the intended-role of Steelseries Arctis 5/7 headset as phone
Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/640
2019-12-23 10:33:30 +01:00
Laurent Bigonville
c6a0665618 alsa-mixer: Add the ability to pass the intended-role to the mapping
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/640
2019-12-23 10:31:41 +01:00
Jaroslav Kysela
f18b0c3402 alsa-mixer: handle interface type (CARD,PCM) for mixer element lookups
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:35:40 +01:00
Jaroslav Kysela
dacfcbb09c alsa-ucm: use the proper mixer name for ucm pcm sink/source
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:29:11 +01:00
Jaroslav Kysela
e438382a51 alsa-ucm: get the mixer names from ucm, don't guess
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:29:11 +01:00
Jaroslav Kysela
ddd0fdb997 alsa-ucm: add control and mixer device items
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:29:11 +01:00
Jaroslav Kysela
d8200ee805 alsa-util: do not try to guess the mixer name from the PCM name
This is just invalid. It results to an error in almost all cases.
The hw:<number> scheme is sufficient to get the right card mixer.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:29:11 +01:00
Jaroslav Kysela
ef1df94627 alsa-ucm: do not try to use UCM device name as jack name by default
Remove the implicit rule. It is perfectly ok to have the jack with
the same name for another I/O in the driver. Trust only the
value obtained from UCM.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:29:11 +01:00
Jaroslav Kysela
4c64f73c97 alsa-ucm: parse correctly the device values
The UCM library is used to get the fallback values from the verbs
and the defaults section. There is no reason to duplicate this code
inside application.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-18 08:29:11 +01:00
Kai-Heng Feng
734a00c849 alsa: Skip resume PCM if hardware doesn't support it
Hardwares without SNDRV_PCM_INFO_RESUME capability, like USB Audio,
don't support snd_pcm_resume() when it's in suspended state.

Let's use snd_pcm_hw_params_can_resume() to check hardware's capability
before snd_pcm_resume() attempt. If it doesn't support resume, just go
to snd_pcm_drop() to leave suspended state directly.
2019-12-10 16:16:18 +08:00
Jaroslav Kysela
e6779ad229 alsa-ucm: validate access to PA_DEVICE_PORT_DATA()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00
Jaroslav Kysela
f5c02dfcd8 alsa-ucm: add comments to ucm_get_mixer_id()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00
Jaroslav Kysela
e04f14ebf3 alsa-ucm: fix parsing for JackControl
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00
Jaroslav Kysela
156bd77424 alsa-ucm: split correctly JackHWMute device names
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00
Jaroslav Kysela
6d830bf0f0 alsa-ucm: add support for master volume
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00
Jaroslav Kysela
dc9dc70fcc alsa-ucm: use the correct mixer identifiers as first
The mixer identifiers should be used for snd_mixer_selem API.
Use them as first, then try to fallback to the raw control
identifiers.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00
Jaska Uimonen
9acacd9ba3 alsa-ucm: Fix volume control based on review
- sync mixer logic added
- mixer path creation, empty set in mapping creation, paths added in path creation
- path creation moved inside new port creation as it might be called twice otherwise
- some comments added
2019-12-06 10:05:44 +00:00
Arun Raghavan
3dfccada46 alsa-ucm: Support Playback/CaptureVolume
This allows us to support the PlaybackVolume and CaptureVolume commands
in UCM, specifying a mixer control to use for hardware volume control.
This only works with ports corresponding to single devices at the
moment, and doesn't support stacking controls for combination ports.

The configuration is intended to provide a control (like Headphone
Playback Volume), but we try to resolve to a simple mixer control
(Headphone) to reuse existing volume paths.

On the UCM side, this also requires that when disabling the device for
the port, the volume should be reset to some default.

When enabling/disabling combination devices, things are a bit iffy since
we have no way to reset the volume before switching to a combination
device. It would be nice to have a combination-transition-sequence
command in UCM to handle this and other similar cases.

PlaybackSwitch and CaptureSwitch are yet to be implemented.
2019-12-06 10:05:44 +00:00
Jaroslav Kysela
1c240b7a12 alsa-mixer: improve alsa_id_decode() function
Accept those identifiers:

        Speaker,1
        'Speaker',1
        "Speaker",1

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2019-12-06 10:05:44 +00:00