Commit graph

1602 commits

Author SHA1 Message Date
Jaroslav Kysela
264d6c43ee pcm: hw: introduce SNDRV_PCM_HW_PARAMS_DRAIN_SILENCE
The application may not require to touch the playback
sample stream for the drain operation at all. In this case,
the application is responsible to setup a silencing mechanism
for the playback or another graceful stop (like using the
rewind operation).

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-05-03 15:58:56 +02:00
Jaroslav Kysela
90e25887d2 pcm: hw: introduce SNDRV_PCM_INFO_PERFECT_DRAIN
Handle the driver informing us that it is not necessary to set up
silencing upon playback draining. This will be the case for drivers
which are guaranteed to not read any samples beyond the application
pointer.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-05-03 14:00:57 +02:00
Jaroslav Kysela
dd9cb31a90 pcm: hw: add drain_silence configuration keyword
# Add silence in drain (-1 = auto /default/, 0 = off, > 0 milliseconds)
  [drain_silence INT]

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-05-03 13:56:19 +02:00
Jaroslav Kysela
2115cdb4dc pcm: hw: setup explicit silencing for snd_pcm_drain by default
Some applications may not alignt transfers to the period size
and also the driver developers may not follow the consequeces of the
access beyond valid samples in the playback DMA buffer.

To avoid clicks, fill a little silence at the end of the playback
ring buffer when snd_pcm_drain() is called.

Related: https://lore.kernel.org/alsa-devel/20230420113324.877164-2-oswald.buddenhagen@gmx.de/
Related: https://lore.kernel.org/alsa-devel/20230405201219.2197789-2-oswald.buddenhagen@gmx.de/
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-05-03 13:50:56 +02:00
Maxython
b40fcda7fb compilation: fix ANDROID -> __ANDROID__ define detection
Fixes: https://github.com/alsa-project/alsa-lib/pull/301/
Signed-off-by: Maxython <mixython@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-05-02 14:52:27 +02:00
Jaroslav Kysela
a8afb0449c pcm: avoid endless loop in snd_pcm_sw_params_default()
BugLink: https://lore.kernel.org/alsa-devel/167734349294.22.1388671545195719262@mailman-web.alsa-project.org/
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-02-25 18:03:46 +01:00
Gunnar Dibbern
2f9bbefb8d pcm: hw - fix return code checking in snd_pcm_hw_hw_refine
The isse was introduced in commit 7f2d6c3

Fixes: 7f2d6c3a ("pcm: hw: change rate range syntax")
Fixes: https://github.com/alsa-project/alsa-lib/issues/271
Fixes: https://github.com/alsa-project/alsa-lib/pull/293
Signed-off-by: Gunnar Dibbern <gunnar.dibbern@lht.dlh.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2023-01-29 18:58:51 +01:00
Alan Young
2e82060ebc pcm: rate: fix last_commit_ptr boundary wrapping
Wrap last_commit_ptr using boundary. Was just wrapped to 0, which is
correct only if the buffer size, and hence the boundary, is an integer
multiple of the period size.

Fixes: 467d69c5bc ("Fix CPU hog with combination of rate plugin")
Fixes: 29041c5220 ("fix infinite draining of the rate plugin in SND_PCM_NONBLOCK mode")
Link: https://lore.kernel.org/alsa-devel/20221230164814.901457-1-consult.awy@gmail.com/
Signed-off-by: Alan Young <consult.awy@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-12-30 20:12:42 +01:00
Jaroslav Kysela
9f2c68cef7 pcm: route/softvol use snd_config_get_ireal vs get_real to handle also integers
Link: https://lore.kernel.org/alsa-devel/f9a7ad6a256d4ad7a31642dcf875d436@axis.com/
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-12-13 10:31:35 +01:00
Jaroslav Kysela
425e4d1fbe pcm: fix the fast_ops pcm argument for fast_ops
The fast_ops callback invocation must always pass the fast_op_arg
as the pcm argument. Plugins expect that.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-11-14 14:39:26 +01:00
Jaroslav Kysela
39060852d8 pcm: rate - correct the previous fix for snd_pcm_rate_may_wait_for_avail_min()
The previous fix in aa4f56c3 was not correct. The root of the cause is
implementation in snd_pcm_may_wait_for_avail_min() inline function
where the improper pcm argument is passed to the fast_ops function.

Fixes: aa4f56c3 ("pcm: rate - fix the crash in snd_pcm_rate_may_wait_for_avail_min()")
Fixes: d9dbb57b ("pcm: rate - rewrite the may_wait_for_avail_min callback for the rate plugin")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-11-09 09:35:05 +01:00
Jaroslav Kysela
aa4f56c3c9 pcm: rate - fix the crash in snd_pcm_rate_may_wait_for_avail_min()
The pcm argument passed to the conversion function in
snd_pcm_plugin_may_wait_for_avail_min_conv() should be
pcm->fast_op_arg.

Test command: arecord -Dplughw:x -r12000 -c2 -fS16_LE -M temp.wav

Fixes: d9dbb57b ("pcm: rate - rewrite the may_wait_for_avail_min callback for the rate plugin")

BugLink: https://lore.kernel.org/alsa-devel/1667793912-18957-1-git-send-email-shengjiu.wang@nxp.com/
Fixes: https://github.com/alsa-project/alsa-lib/issues/282
Reported-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-11-09 08:18:06 +01:00
Jaroslav Kysela
9253f08fb7 pcm: rate: fix the crash for the partial period copy
The size argument in snd_pcm_rate_commit_area can be smaller
than cont in drain. Return the original code. It should
not make things worse. Perhaps, we can fill the rest of
the period with silence in this case.

Fixes: https://github.com/alsa-project/alsa-lib/issues/274
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-10-17 13:58:41 +02:00
SASANO Takayoshi
60c1430b43 add DragonFlyBSD build support (except test/)
due to undefined reference to 'environ' error, ucm_exec.c uses workaround.

Fixes: https://github.com/alsa-project/alsa-lib/pull/250
Signed-off-by: SASANO Takayoshi <uaa@uaa.org.uk>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-10-17 13:11:47 +02:00
SASANO Takayoshi
b33ef3f73d add NetBSD/OpenBSD build support (except test/)
Fixes: https://github.com/alsa-project/alsa-lib/pull/250
Signed-off-by: SASANO Takayoshi <uaa@uaa.org.uk>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-10-17 13:11:29 +02:00
Jaroslav Kysela
0222f45d11 pcm: hw_params - copy periods and buffer_time to the local variable
It is expected to return the correct numbers for get_periods and
get_buffer_time requests. Copy the appropriate fields in the
hw_params call.

Fixes: https://github.com/alsa-project/alsa-lib/issues/258
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-08-18 11:23:45 +02:00
Jaroslav Kysela
8033ff9996 pcm: fix the dshare delay reporting
Pulseaudio uses full ring buffer when the incorrect delay is reported.

BugLink: https://github.com/alsa-project/alsa-ucm-conf/issues/198
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-08-16 17:22:36 +02:00
Jaroslav Kysela
378c6a9215 pcm: direct plugins: make three more symbols private to library
Those symbols should not be exported:
	snd_pcm_direct_poll_descriptors
	snd_pcm_direct_check_xrun
	snd_pcm_direct_slave_recover

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-07-08 21:44:50 +02:00
Jaroslav Kysela
65c4796a85 pcm: share plugin: handle -EINTR
Fixes: https://github.com/alsa-project/alsa-lib/pull/242
Fixes: b97047b4 ("pcm: share plugin: return error if socket read or write call fails")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-06-27 13:36:36 +02:00
Tomohiro IKEDA
b97047b450 pcm: share plugin: return error if socket read or write call fails
Fixes: https://github.com/alsa-project/alsa-lib/pull/242
Signed-off-by: Tomohiro IKEDA <rilakkuma.san.xjapan@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-06-27 13:35:44 +02:00
Tomohiro IKEDA
ff0db96bbc pcm: dmix - Add error handler for fgets
Fixes: https://github.com/alsa-project/alsa-lib/pull/238
Signed-off-by: Tomohiro IKEDA <rilakkuma.san.xjapan@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-06-17 10:23:43 +02:00
Jaroslav Kysela
7f2d6c3aac pcm: hw: change rate range syntax
Allow three configuration types:

  rate 48000			# single rate
  rate [ 48000 ]		# single rate (2nd)
  rate [ 44100 48000 ]		# range

Fixes: https://github.com/alsa-project/alsa-lib/pull/191
Fixes: ac04cb63 ("hw: add "min_rate" and "max_rate" as alternatives to single "rate" parameter")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 18:45:23 +02:00
Benedek Kupper
d85c0d8d46 pcm: hw: add "min_rate" and "max_rate" as alternatives to single "rate" parameter
Fixes: https://github.com/alsa-project/alsa-lib/pull/191
Signed-off-by: Benedek Kupper <benedek.kupper@streamunlimited.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 18:44:42 +02:00
Jaroslav Kysela
d9dbb57b94 pcm: rate - rewrite the may_wait_for_avail_min callback for the rate plugin
Shuffle the code to avoid special conditions using the plugin type
in the generic plugin code. The rate plugin has the own
may_wait_for_avail_min callback implementation now.

Fixes: d21e0e01 ("pcm: plugin - fix avail_min calculation on rate plugin")
Fixes: https://github.com/alsa-project/alsa-lib/pull/218
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 10:50:27 +02:00
Andreas Pape
d21e0e01c6 pcm: plugin - fix avail_min calculation on rate plugin
commit 88e4ae27, ff1f669d introduced a dynamic recalculation of the slave's
avail_min value.
The calculated avail_min setting did not take into account, that the avail_min value
depends on the used sampling rate and must be adapted accordingly
if the slave is using a different sampling rate.
That leads to too large/too small calculated avail_min settings and inaccurate
period wake-up events if a rate converter plugin is used.

This patch is adapting the avail_min calculation to consider a different
sampling rate between actual pcm and it's slave.

Fixes: https://github.com/alsa-project/alsa-lib/pull/218
Signed-off-by: Andreas Pape <apape@de.adit-jv.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 10:35:45 +02:00
Katsuhiro Suzuki
b62fc061e4 pcm: dmix: fix wrong scaling in 32bits pcm mixing
Generic mixing function for 32bits pcm has used 8bits right shift for
pre-scaling. But this is generating wrong result if pcm data is
negative value because return value type of bswap_32() is unsigned int.

This patch adds type cast bswap_32() result to signed int.

Fixes: https://github.com/alsa-project/alsa-lib/pull/222
Signed-off-by: Katsuhiro Suzuki <katsuhiro@katsuster.net>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 10:01:10 +02:00
Jaroslav Kysela
4fb83669ef pcm: ladspa - Use LFS calls (readdir64)
Continue the work in commit ba86ac55 ("conf: Use LFS calls when reading
config files") and fix the PCM LADSPA code, too.

Fixes: https://github.com/alsa-project/alsa-lib/pull/223
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 09:55:12 +02:00
Jaroslav Kysela
a53c2b25f1 pcm: fix for the unitialized write buffer
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-20 08:47:07 +02:00
Jaroslav Kysela
859448f010 control: decode HDMI device name from ELD
The HDMI drivers set an uniform PCM names. Use ELD (EDID) to obtain
the HDMI device name and send this string to applications for a better
user experience.

Example (aplay -l):

  card 1: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
    Subdevices: 1/1

  vs improved:

  card 1: PCH [HDA Intel PCH], device 8: HDMI 2 [Philips 272P4]
    Subdevices: 1/1

Fixes: https://github.com/alsa-project/alsa-lib/issues/209
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-05 14:31:45 +02:00
Yutao Yuan
9c0c757b85 pcm: multi: return correct hwptr and avail from snd_pcm_multi_status()
Ensure the logic of snd_pcm_multi_status() is consistent with
snd_pcm_multi_avail_update().

Fixes: https://github.com/alsa-project/alsa-lib/pull/224
Fixes: https://github.com/alsa-project/alsa-lib/issues/217
Signed-off-by: Yutao Yuan <infmagic2047reg@outlook.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-04 15:44:04 +02:00
Jaroslav Kysela
3f108fc5b8 pcm: direct - allow 'off' string for hw_ptr_alignment
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-03 19:12:03 +02:00
Jaroslav Kysela
d0ebce5928 pcm: direct - cleanups for snd_pcm_direct_reset_slave_ptr()
- improve readability
- pass slave hw_ptr as argument - improves the code flow

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-05-03 19:09:01 +02:00
Jaroslav Kysela
76659453ef pcm: direct - add support for channel bindings in snd_pcm_direct_query_chmaps()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2022-04-06 20:18:42 +02:00
Takashi Iwai
bb9f258e19 pcm: direct: Check xrun/suspend before the slave hwptr update
The xrun/suspend may happen at any time and we should check it right
after the slave hwptr update (but before the actual sync_ptr update in
direct pcm side).  Otherwise the hwptr value may be screwed and get
unexpected large read/write.

Reported-by: S.J. Wang <shengjiu.wang@nxp.com>
Acked-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2022-03-10 12:58:51 +01:00
Takashi Iwai
3577a7a26b pcm: direct: Move slave PCM state checks into XRUN check helper
The check of slave PCM state is always done before the client's
recoveries count check, so let's merge them to the common helper.
Also rename the helper function to snd_pcm_direct_check_xrun() as it's
checking both slave and client states now.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
2022-03-10 12:58:51 +01:00
Takashi Iwai
b3ce9cb839 pcm: direct: Improved suspend/resume support
The current resume handling in PCM direct plugins don't treat multiple
clients properly: once after the slave PCM gets resumed by one
client, the access from others at a later point is seen as already
running although the internal state isn't updated and becomes
inconsistent.  This may end up a negative size, which eventually hangs
up.

This patch is an attempt to improve the handling for resume.  Now the
suspended state is treated similarly like XRUN; namely, we keep the
slave PCM "recoveries" count that is modified at each time the slave
PCM XRUN happens, so that we can check the inconsistency against the
client's state.  As a differentiation to XRUN, we set the highest bit
of recoveries count when the slave stream hits SUSPENDED state.  This
bit is referred at comparing with clients, and the client's state is
updated to either XRUN or SUSPENDED depending on this bit.

Along with this change, the actual resume is done in
snd_pcm_direct_slave_recover(), and snd_pcm_direct_resume() rather
calls this internally.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
2022-03-10 12:58:51 +01:00
Takashi Iwai
29fbe34a0d pcm: direct: Propagate error code from snd_pcm_direct_client_chk_xrun()
Change the snd_pcm_direct_client_chk_xrun() function to return the
current XRUN state via an error code instead of the state change.
This allows the caller more straightforwardly returning its error, and
also covers the case where XRUN has been set but the function gets
called twice.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
2022-03-10 12:58:51 +01:00
Alan Young
5b035bfa4a pcm: rate: fix drain of partial period at end of buffer
In the case that:
* the buffer size is not an integer multiple of the period size, and
* drain must flush a partial period located before the end of the buffer
  but without a full period available, where
* these conditions may pertain to the source or slave pcm buffer, and
* because rate conversion is always done on a full period,
it is necessary to check that both a full source period is available
before source pcm buffer wrap and a full slave period is available
before slave pcm buffer wrap in order to use the simple, single-commit
implementation in snd_pcm_rate_commit_area().

The alternative fix would be to change snd_pcm_rate_write_areas1() to
take size and slave_size parameters. This would be more disruptive to
the code base, tricky to get right, and is unnecessary given that
snd_pcm_mmap_commit() only commits the partial period of actually valid
converted samples.

Fixes: 3047f8fa5a ("Fix possible problems of playback drain with rate plugin")
Signed-off-by: Alan Young <consult.awy@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2022-03-08 10:37:30 +01:00
Jaroslav Kysela
faee7f678d pcm: softvol - mark _snd_pcm_parse_control_id as static
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-11-02 11:04:43 +01:00
Jaroslav Kysela
f0d540f851 pcm: partially revert "pcm: softvol - make snd_pcm_parse_control_id private"
This reverts partially commit b9a4997e92.

It seems that we have have some users for this very specific function.
Mark it deprecated and keep the softvol implementation separate,
so we can remove this function easily in future.

Fixes: https://github.com/alsa-project/alsa-lib/issues/186
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-11-02 11:00:35 +01:00
Sava Jakovljev
1aeea94ce8 pcm: multi plugin - adjust appl_ptr on rewind/forward operations
When doing rewind or forward operations, application pointer needs to
be properly adjusted, in the same way when doing commit/write
operations.

Fixes: https://github.com/alsa-project/alsa-lib/pull/161
Signed-off-by: Sava Jakovljev <sava.jakovljev@teufel.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-09-03 08:54:56 +02:00
Henrik Enquist
c4972cb154 pcm: add a note about return values of snd_pcm_state()
Fixes: https://github.com/alsa-project/alsa-lib/pull/162
Signed-off-by: Henrik Enquist <henrik.enquist@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2021-09-03 08:41:40 +02:00
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