Commit graph

1560 commits

Author SHA1 Message Date
Jaroslav Kysela
1a1f0fb244 pcm: rate - fix some gcc warnings
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-28 12:13:56 +02:00
Jaroslav Kysela
e0e0846590 pcm: direct plugins - fix bad memory access when channel bindings do not match hw
Fix and cleanup snd_pcm_direct_check_interleave() function.
Add requested / hardware channel check and use goto when the interleaved

Fixes: https://github.com/alsa-project/alsa-lib/issues/117
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-21 15:18:28 +02:00
Takashi Iwai
a5e11f9a81 pcm: Move snd_pcm_channel_area_addr() and _step() to public header
Used in the rate plugins commonly.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
2021-06-21 14:22:36 +02:00
Jaroslav Kysela
dd609ef968 pcm: direct plugins - fix hw_ptr in the status callback
The parent hw_ptr may be in another range (boundary limit).
Set the correct value for the caller.

BugLink: https://github.com/alsa-project/alsa-lib/issues/155
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-21 09:28:43 +02:00
Jaroslav Kysela
212c6c18c4 pcm: dmix - use pcm_frame_diff() in snd_pcm_dmix_sync_ptr0()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-21 09:23:02 +02:00
Jaroslav Kysela
3f737a2a2c pcm: improve docs for snd_pcm_sw_params_get_avail_min() and snd_pcm_status_get_avail_max()
Fixes: https://github.com/alsa-project/alsa-lib/issues/44
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-18 11:35:36 +02:00
Takashi Iwai
119d9c1678 pcm: rate: Improve the support multiple formats
This patch extends the PCM rate plugin for allowing its converter
plugin to deal with multiple formats.  Currently, the converter plugin
is allowed to take different formats only when convert callback is
defined.  And for this way (so far only the standard linear rate
plugin does), all linear formats have to be handled, and it's
cumbersome.

OTOH, most other rate plugins are implemented with convert_s16
callback, which accepts only S16 format.  This is often not ideal
because many converter engines can handle 32bit formats.  Also, the
target format is often 32bit format, hence this would require
additional conversion even if the converter engine can output 32bit
natively.

In this patch, for addressing the problems above, the rate plugin API
is extended in the following way:

- The new get_supported_formats callback is added; this stores the bit
  masks of the supported input and output formats, as well as the
  behavior flags.  Currently only linear formats are allowed.
- When the plugin accepts only the interleaved stream, set
  SND_PCM_RATE_FLAG_INTERLEAVED flag bit.  Otherwise the code has to
  handle snd_pcm_channel_area at each call.
- When both input and output formats have to be identical, pass
  SND_PCM_RATE_FLAG_SYNC_FORMATS flag bit.
- When the converter wants to process different formats, use convert
  callback instead of convert_s16.  You can put both in the ops for
  compatibility, too.
  The input and output formats are found in the info argument of init
  callback.
- Now the PCM rate plugin core will skip the temporary buffer
  allocation and conversions for pre- and post-process if not needed
  (i.e. matching with the requested input or output format).

The rate plugin API version is bumped to 0x010003.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
2021-06-17 11:40:38 +02:00
Takashi Iwai
5089358aa9 pcm: rate: Refactoring temporary buffer allocations
Introduce common helpers to allocate and release the temporary buffers
and the associated snd_pcm_channel.  Now two allocated objects are
used instead of one malloc to be split.

Also, change the snd_pcm_channel set up to be in interleaved mode.
This will be necessary in the following change in the rate plugin.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
2021-06-17 10:20:25 +02:00
Jaroslav Kysela
a154cb2904 pcm: direct - remove dead code
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-03 07:29:43 +02:00
Jaroslav Kysela
eabadf545c pcm: softvol - fix early exit in add_tlv_info()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-02 19:49:29 +02:00
Jaroslav Kysela
74c6382df6 pcm: remove extra NULL checks in snd_pcm_dshare_open()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-02 19:46:58 +02:00
Jaroslav Kysela
01a45aec6f pcm: remove extra NULL checks in snd_pcm_dsnoop_open()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-02 19:39:32 +02:00
Jaroslav Kysela
eb95cad4e2 pcm: remove extra NULL checks in snd_pcm_dmix_open()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-02 19:37:53 +02:00
Jaroslav Kysela
2fee6af9b6 pcm: direct - fix pcmp error path in _snd_pcm_direct_new()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-06-02 19:35:44 +02:00
Jaroslav Kysela
1e56b1031f pcm: hw - correct the comment in snd_pcm_hw_state()
Fixes: c7a939ee ("pcm: hw - fix again snd_pcm_hw_state() when the driver was disconnected")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-05-27 23:28:20 +02:00
Jaroslav Kysela
c7a939ee31 pcm: hw - fix again snd_pcm_hw_state() when the driver was disconnected
Fixes: 2c8e31f5 ("pcm: hw - fix snd_pcm_hw_state()")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-05-27 22:01:38 +02:00
Jaroslav Kysela
2c8e31f509 pcm: hw - fix snd_pcm_hw_state()
The pcm status function should not return an error code.
Return always only the mmaped status.

Fixes: https://github.com/alsa-project/alsa-lib/issues/137
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-05-25 15:30:45 +02:00
Jaroslav Kysela
da33eda632 pcm: fix open in direct plugins - wrong pointer assignment
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-05-13 10:18:27 +02:00
Jaroslav Kysela
27f4a85a95 pcm: direct - move the direct struct init to _snd_pcm_direct_new()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-04-13 18:55:37 +02:00
Vanitha Channaiah
446777c67e pcm: dshare - fix shared memory pointer check
Currently shared memory pointer is initialized to 0 and set to -1
in some, but not in all error paths.
In cleanup path of open the shm pointer is only compared to be non-NULL
before dereferencing it which leads to SEGFAULT in case it was set to -1.

This patch initializes pointer to -1 to have a unique identification
for invalid pointer and also checks for pointer being not -1 on
access in cleanup path.

Signed-off-by: Vanitha Channaiah <vanitha.channaiah@in.bosch.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-04-13 18:21:53 +02:00
Jaroslav Kysela
8f5779eb3f ucm: add LibraryConfig support
This commit allows to define private alsa-lib's configuration. When
the configuration is present, the device values ("PlaybackCTL",
"CaptureCTL", "PlaybackMixer", "CaptureMixer", "CapturePCM")
are prefixed with '_ucmHEXA.' string where HEXA is replaced by the
unique hexadecimal number identifying the opened ucm manager handle.

    Syntax 4

    LibraryConfig.a_label.SubstiConfig {
            # substituted library configuration like:
            usr_share_dir "${ConfLibDir}"
    }

    LibraryConfig.b_label.Config {
            # non-substituted library configuration like:
            usr_share_dir "/usr/share/alsa"
    }

    The File counterparts:

    LibraryConfig.c_label.SubstiFile "/some/path"
    LibraryConfig.d_label.File "/some/path"

Note that for files the contents is substituted on the request,
but the file name is always substituted (useful for ${ConfDir} etc.).

The private configuration is not saved or preserved. It's life time
belongs to the opened ucm manager handle.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-04-13 17:14:28 +02:00
Jaroslav Kysela
bb646ecb47 pcm: empty plugin - fix the docs
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-04-07 16:22:34 +02:00
Jaroslav Kysela
058299bff3 pcm: softvol - improve TLV data check for new configs
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-02-26 21:10:59 +01:00
Jaroslav Kysela
1d1062d920 pcm: fix snd_pcm_plugin_status()
The appl_ptr difference must be computed before
the appl_ptr in the status structure is updated.

Fixes: da5b70d3f ("pcm: plugin - fix status code for capture")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-02-26 21:08:28 +01:00
Jaroslav Kysela
19ad9bdc49 conf: introduce snd_config_get_card() function
It's helper for the "card" entries parsing. It reduces
the code in most of open_hw functions.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-02-26 21:08:28 +01:00
Jaroslav Kysela
b9a4997e92 pcm: softvol - make snd_pcm_parse_control_id private
The function is not used externally (it's not exported in headers).
Make it private.

Use snd_config_get_ctl_iface() for the interface value parsing.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-02-26 21:08:28 +01:00
Jaroslav Kysela
24db585dd1 pcm: softvol - do not set TLV access flags for the switch
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-02-26 21:08:25 +01:00
Jaroslav Kysela
00eafe98ee pcm: pcm_ioplug - fix the avail_update mmap capture copy issue
It seems that the commit "pcm: ioplug: Transfer all available data"
introduced new regressions (wrong memory access). The second issue
is that the avail_update in ioplug does not move appl_ptr nor hw_ptr,
so it's possible that the transfers may be repetitive.

This patch moves the transfer calls to mmap_begin callback where it
should be. The pointer wraps are handled by design now.

Fixes: 1714332719 ("pcm: ioplug: Transfer all available data")
BugLink: https://github.com/alsa-project/alsa-lib/pull/103
Tested-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-27 11:39:15 +01:00
Takashi Iwai
55d59821ff pcm: share: Pass appl_ptr and hw_ptr in snd_pcm_status()
This one also has the same problem as others; the appl_ptr and hw_ptr
of share plugin aren't updated in snd_pcm_status() call.  Fix it.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-22 17:58:07 +01:00
Takashi Iwai
bcc762f99a pcm: null: Pass appl_ptr and hw_ptr in snd_pcm_status()
Just like the previous fix for ioplug, the null plugin also misses the
appl_ptr and hw_ptr updates for snd_pcm_status().  Fix it as well.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-22 17:58:07 +01:00
Takashi Iwai
26fdcb98e6 pcm: ioplug: Pass appl_ptr and hw_ptr in snd_pcm_status()
The snd_pcm_status() of the ioplug doesn't return the current
positions of hw_ptr and appl_ptr as advertised.  Fix it by copying the
current values stored in the plugin data.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-22 17:58:07 +01:00
Takashi Iwai
f2c1a9f327 pcm: direct: Fix the missing appl_ptr update
A snd_pcm_status() call for the direct plugins receives the status
from the slave PCM, but this doesn't contain a valid appl_ptr, since
the slave PCM for the direct plugins is in a free-wheel mode, hence
the appl_ptr is always zero.  This result in the inconsistent
status->appl_ptr and pcm->appl.ptr, hitting the recently introduced
assert() call.

Fix it by transferring the plugin's appl_ptr to the upper caller.

BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1181194
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-22 17:58:07 +01:00
Jaroslav Kysela
0de72e63d7 pcm: dmix/dshare - delay calculation fixes and cleanups
Unfortunately, we cannot use status->avail from slave, because this value
does not wrap to the buffer size and it may even overflow slave boundary
(endless run). We can use only hw_ptr from slave.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-20 17:05:00 +01:00
Jaroslav Kysela
644514e85d pcm_plugin: set the initial hw_ptr/appl_ptr from the child pcm
The direct plugins (dmix & etc.) sets own initial
hw_ptr and appl_ptr. Use this initial settings
to export correct values in snd_pcm_status().

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-20 17:04:49 +01:00
Jaroslav Kysela
b62f66442b pcm: rate - fix the capture delay values
Use the correct snd_pcm_mmap_capture_delay() function instead
snd_pcm_mmap_capture_hw_avail().

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-04 17:27:37 +01:00
Jaroslav Kysela
ac520b2ed1 pcm: rate - use pcm_frame_diff() on related places
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-04 17:14:42 +01:00
Jaroslav Kysela
da5b70d3fa pcm: plugin - fix status code for capture
The recent updates do not take in account the possible
calls for the capture stream. Fix the avail and delay
inconsistencies (and assert).

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-04 12:32:27 +01:00
Jaroslav Kysela
fc0f7af9ee pcm: rate - use pcm_frame_diff() in snd_pcm_rate_playback_internal_delay()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-04 12:31:52 +01:00
Jaroslav Kysela
6cee452eab pcm: ioplug - fix the delay calculation for old plugins
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 17:16:11 +01:00
Jaroslav Kysela
5988bb3ff4 pcm: rate - tidy up snd_pcm_rate_avail_update()
No functional change - just move the capture code to
a separate function for the better readability.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 17:16:11 +01:00
Jaroslav Kysela
6ca01c07ee pcm: ioplug - fix the delay calculation in the status callback
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 17:15:53 +01:00
Jaroslav Kysela
21549e6583 Revert "pcm_plugin: fix delay"
This reverts commit aba87e5098.

The commit does not look good. The plugins must handle
the delay value correctly.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 16:43:30 +01:00
Jaroslav Kysela
28cc099d9e pcm: plugin - optimize sync in snd_pcm_plugin_status()
Do hw_ptr sync only once after the status call. This avoids
double update.

Also, the application pointer must not change when
the status is called. Add assert() call for this condition.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 16:41:32 +01:00
Jaroslav Kysela
fa1895aa2b pcm: plugin - tidy snd_pcm_plugin_avail_update()
No functional changes - move the code to snd_pcm_plugin_sync_hw_ptr()
and put the mmap capture updates to separate function for readability.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 16:34:07 +01:00
Jaroslav Kysela
49eea5d7bc pcm: plugin status - revert the recent changes
It's no reason to sync the avail/delay fields using the mirrored
buffer pointers. The slave information must be valid.

The original report probably tries to fix something for
the specific plugin. Revert all changes.

Fixes: afe6ff3b33 ("pcm: plugin status - fix the return value (regression)")
Fixes: 4f90392f07 ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-01-03 16:16:44 +01:00
Jaroslav Kysela
afe6ff3b33 pcm: plugin status - fix the return value (regression)
The snd_pcm_plugin_avail_update() error code in snd_pcm_plugin_status()
should not be reported to the caller. The state errors can be determined
using the state member in the status structure.

Fixes: 4f90392f07 ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
BugLink: https://github.com/alsa-project/alsa-lib/issues/107
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-12-30 09:38:04 +01:00
Jaroslav Kysela
36aff79747 pcm: fix __snd_pcm_state() return value
The __snd_pcm_state() must return a valid state, not an error value
when the plugin callback is not defined. Use the first state
SND_PCM_STATE_OPEN - the other functions will return the error
code depending on this state.

Link: https://lore.kernel.org/alsa-devel/20201226213547.175071-10-alexhenrie24@gmail.com/
Reported-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2020-12-27 13:31:57 +01:00
Alex Henrie
fc719bfe4e pcm_multi: remove dead assignment from _snd_pcm_multi_open
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2020-12-27 09:28:24 +01:00
Alex Henrie
2e470d59d8 pcm: remove dead assignments from snd_pcm_rate_(commit_area|grab_next_period)
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2020-12-27 09:27:26 +01:00
Jonas Holmberg
7d36895225 pcm: set the snd_pcm_ioplug_status() tstamp field
Set the status tstamp field so that it can be accessed with
snd_pcm_status_get_htstamp().

Signed-off-by: Jonas Holmberg <jonashg@axis.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2020-12-02 15:29:26 +01:00