mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-09-24 04:59:14 -07:00
media-sound/pulseaudio-daemon: remove unused patches
Signed-off-by: Michael Mair-Keimberger <mmk@levelnine.at> Signed-off-by: Conrad Kostecki <conikost@gentoo.org>
This commit is contained in:
committed by
Conrad Kostecki
parent
7e7cb3e8ab
commit
2356090f22
@@ -1,35 +0,0 @@
|
||||
commit 86c5fbab5778685e19b5a4a9b8eb04ca90dff780
|
||||
Author: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
|
||||
Date: Sun Feb 5 19:49:10 2023 +0300
|
||||
|
||||
alsa-util: Add more standard sample rates.
|
||||
|
||||
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/776>
|
||||
|
||||
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
|
||||
index 9f35cb20f..fd30f18bd 100644
|
||||
--- a/src/modules/alsa/alsa-util.c
|
||||
+++ b/src/modules/alsa/alsa-util.c
|
||||
@@ -1430,7 +1430,8 @@ unsigned int *pa_alsa_get_supported_rates(snd_pcm_t *pcm, unsigned int fallback_
|
||||
32000, 44100, 48000,
|
||||
64000, 88200, 96000,
|
||||
128000, 176400, 192000,
|
||||
- 384000 };
|
||||
+ 352800, 384000,
|
||||
+ 705600, 768000 };
|
||||
bool supported[PA_ELEMENTSOF(all_rates)] = { false, };
|
||||
snd_pcm_hw_params_t *hwparams;
|
||||
unsigned int i, j, n, *rates = NULL;
|
||||
diff --git a/src/pulse/sample.h b/src/pulse/sample.h
|
||||
index 35346a865..65c0c5d6b 100644
|
||||
--- a/src/pulse/sample.h
|
||||
+++ b/src/pulse/sample.h
|
||||
@@ -128,7 +128,7 @@ PA_C_DECL_BEGIN
|
||||
#define PA_CHANNELS_MAX 32U
|
||||
|
||||
/** Maximum allowed sample rate */
|
||||
-#define PA_RATE_MAX (48000U*8U)
|
||||
+#define PA_RATE_MAX (48000U*16U)
|
||||
|
||||
/** Sample format */
|
||||
typedef enum pa_sample_format {
|
||||
@@ -1,122 +0,0 @@
|
||||
commit 300db779224625144d6279d230c2daa857c967d8
|
||||
Author: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
|
||||
Date: Thu Feb 9 13:28:29 2023 +0300
|
||||
|
||||
pstream: Pass frame size to keep split memblock parts aligned
|
||||
|
||||
`pa_pstream_send_memblock()` would split incoming memblock into parts not
|
||||
exceeding maximum pool block size.
|
||||
|
||||
To make sure split parts of memblock are still frame-aligned add new `align` arg
|
||||
to `pa_pstream_send_memblock`, find out required alignment from stream sample
|
||||
format and pass it there. Bump default alignment to 256 which is good up to
|
||||
32bit 64ch frames.
|
||||
|
||||
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/780>
|
||||
|
||||
diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c
|
||||
index 61f427bd3..ab094ba4e 100644
|
||||
--- a/src/modules/module-tunnel.c
|
||||
+++ b/src/modules/module-tunnel.c
|
||||
@@ -676,7 +676,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
|
||||
* IO thread context where the rest of the messages are
|
||||
* dispatched. Yeah, ugly, but I am a lazy bastard. */
|
||||
|
||||
- pa_pstream_send_memblock(u->pstream, u->channel, 0, PA_SEEK_RELATIVE, chunk);
|
||||
+ pa_pstream_send_memblock(u->pstream, u->channel, 0, PA_SEEK_RELATIVE, chunk, pa_frame_size(&u->sink->sample_spec));
|
||||
|
||||
u->receive_counter += chunk->length;
|
||||
|
||||
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
|
||||
index 0aa627396..3585b27e8 100644
|
||||
--- a/src/pulse/stream.c
|
||||
+++ b/src/pulse/stream.c
|
||||
@@ -1535,7 +1535,7 @@ int pa_stream_write_ext_free(
|
||||
s->write_memblock = NULL;
|
||||
s->write_data = NULL;
|
||||
|
||||
- pa_pstream_send_memblock(s->context->pstream, s->channel, offset, seek, &chunk);
|
||||
+ pa_pstream_send_memblock(s->context->pstream, s->channel, offset, seek, &chunk, pa_frame_size(&s->sample_spec));
|
||||
pa_memblock_unref(chunk.memblock);
|
||||
|
||||
} else {
|
||||
@@ -1569,7 +1569,7 @@ int pa_stream_write_ext_free(
|
||||
pa_memblock_release(chunk.memblock);
|
||||
}
|
||||
|
||||
- pa_pstream_send_memblock(s->context->pstream, s->channel, t_offset, t_seek, &chunk);
|
||||
+ pa_pstream_send_memblock(s->context->pstream, s->channel, t_offset, t_seek, &chunk, pa_frame_size(&s->sample_spec));
|
||||
|
||||
t_offset = 0;
|
||||
t_seek = PA_SEEK_RELATIVE;
|
||||
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
|
||||
index 672182fbc..1342dee10 100644
|
||||
--- a/src/pulsecore/protocol-native.c
|
||||
+++ b/src/pulsecore/protocol-native.c
|
||||
@@ -1260,7 +1260,7 @@ static void native_connection_send_memblock(pa_native_connection *c) {
|
||||
if (schunk.length > r->buffer_attr.fragsize)
|
||||
schunk.length = r->buffer_attr.fragsize;
|
||||
|
||||
- pa_pstream_send_memblock(c->pstream, r->index, 0, PA_SEEK_RELATIVE, &schunk);
|
||||
+ pa_pstream_send_memblock(c->pstream, r->index, 0, PA_SEEK_RELATIVE, &schunk, pa_memblockq_get_base(r->memblockq));
|
||||
|
||||
pa_memblockq_drop(r->memblockq, schunk.length);
|
||||
pa_memblock_unref(schunk.memblock);
|
||||
@@ -2535,7 +2535,7 @@ static void setup_srbchannel(pa_native_connection *c, pa_mem_type_t shm_type) {
|
||||
mc.memblock = srbt.memblock;
|
||||
mc.index = 0;
|
||||
mc.length = pa_memblock_get_length(srbt.memblock);
|
||||
- pa_pstream_send_memblock(c->pstream, 0, 0, 0, &mc);
|
||||
+ pa_pstream_send_memblock(c->pstream, 0, 0, 0, &mc, 0);
|
||||
|
||||
c->srbpending = srb;
|
||||
return;
|
||||
diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c
|
||||
index 7147b776a..ff62f464b 100644
|
||||
--- a/src/pulsecore/pstream.c
|
||||
+++ b/src/pulsecore/pstream.c
|
||||
@@ -82,6 +82,10 @@ typedef uint32_t pa_pstream_descriptor[PA_PSTREAM_DESCRIPTOR_MAX];
|
||||
*/
|
||||
#define FRAME_SIZE_MAX_ALLOW (1024*1024*16)
|
||||
|
||||
+/* Default memblock alignment used with pa_pstream_send_memblock()
|
||||
+ */
|
||||
+#define DEFAULT_PSTREAM_MEMBLOCK_ALIGN (256)
|
||||
+
|
||||
PA_STATIC_FLIST_DECLARE(items, 0, pa_xfree);
|
||||
|
||||
struct item_info {
|
||||
@@ -475,7 +479,7 @@ void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, pa_cmsg_ancil_data
|
||||
p->mainloop->defer_enable(p->defer_event, 1);
|
||||
}
|
||||
|
||||
-void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa_seek_mode_t seek_mode, const pa_memchunk *chunk) {
|
||||
+void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa_seek_mode_t seek_mode, const pa_memchunk *chunk, size_t align) {
|
||||
size_t length, idx;
|
||||
size_t bsm;
|
||||
|
||||
@@ -492,6 +496,11 @@ void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa
|
||||
|
||||
bsm = pa_mempool_block_size_max(p->mempool);
|
||||
|
||||
+ if (align == 0)
|
||||
+ align = DEFAULT_PSTREAM_MEMBLOCK_ALIGN;
|
||||
+
|
||||
+ bsm = (bsm / align) * align;
|
||||
+
|
||||
while (length > 0) {
|
||||
struct item_info *i;
|
||||
size_t n;
|
||||
diff --git a/src/pulsecore/pstream.h b/src/pulsecore/pstream.h
|
||||
index 2bff270ad..88bdca4cc 100644
|
||||
--- a/src/pulsecore/pstream.h
|
||||
+++ b/src/pulsecore/pstream.h
|
||||
@@ -51,7 +51,7 @@ void pa_pstream_unlink(pa_pstream *p);
|
||||
int pa_pstream_attach_memfd_shmid(pa_pstream *p, unsigned shm_id, int memfd_fd);
|
||||
|
||||
void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data);
|
||||
-void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk);
|
||||
+void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk, size_t align);
|
||||
void pa_pstream_send_release(pa_pstream *p, uint32_t block_id);
|
||||
void pa_pstream_send_revoke(pa_pstream *p, uint32_t block_id);
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
commit 1cfa7378236b3cf9daf3be09d3227b92df69cc53
|
||||
Author: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
|
||||
Date: Wed Feb 8 03:24:59 2023 +0300
|
||||
|
||||
resampler: Fix oversized memblock pushed from resampler
|
||||
|
||||
The assumption that the format enum is ordered by size is not valid for quite
|
||||
some time, since 24bit formats were appended to format enum later than 32bit
|
||||
formats. This causes resampler to produce properly aligned memblock of size
|
||||
larger than maximum mempool block size if input format is 24bit and output
|
||||
format is 32bit.
|
||||
|
||||
Oversized block is getting split by `pa_pstream_send_memblock()` into parts of
|
||||
size not exceeding maximum mempool block size. This usually works well but for
|
||||
32ch 32bit 48000Hz stream the frame alignment is 128 bytes and maximum mempool
|
||||
block size value is multiple of 64 but not 128 bytes, therefore resulting parts
|
||||
are misaligned.
|
||||
|
||||
On receiving side this causes extra allocation of 128 byte chunk while `mcalign`
|
||||
helper reassembles properly aligned frame out of second block of misaligned
|
||||
size. While first and second properly aligned frames are retrieved successfully
|
||||
from `mcalign` helper, third retrieved frame would end up with properly aligned
|
||||
size but misaligned memblock index (in this example, that would be 64 bytes.)
|
||||
Attempt to push a chunk with misaligned memblock index causes assertion failure
|
||||
|
||||
Assertion 'uchunk->index % bq->base == 0' failed at memblockq.c:289,
|
||||
function pa_memblockq_push(). Aborting.
|
||||
|
||||
Fix oversized block issue by checking proper size of format instead of enum
|
||||
value.
|
||||
|
||||
Fixes: a67c21f09 ("merge 'lennart' branch back into trunk.")
|
||||
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/778>
|
||||
|
||||
diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
|
||||
index b035f67ed..ba18c92c4 100644
|
||||
--- a/src/pulsecore/resampler.c
|
||||
+++ b/src/pulsecore/resampler.c
|
||||
@@ -613,9 +613,13 @@ size_t pa_resampler_max_block_size(pa_resampler *r) {
|
||||
* conversion */
|
||||
max_ss.channels = (uint8_t) (PA_MAX(r->i_ss.channels, r->o_ss.channels));
|
||||
|
||||
- /* We silently assume that the format enum is ordered by size */
|
||||
- max_ss.format = PA_MAX(r->i_ss.format, r->o_ss.format);
|
||||
- max_ss.format = PA_MAX(max_ss.format, r->work_format);
|
||||
+ max_ss.format = r->i_ss.format;
|
||||
+
|
||||
+ if (pa_sample_size_of_format(max_ss.format) < pa_sample_size_of_format(r->o_ss.format))
|
||||
+ max_ss.format = r->o_ss.format;
|
||||
+
|
||||
+ if (pa_sample_size_of_format(max_ss.format) < pa_sample_size_of_format(r->work_format))
|
||||
+ max_ss.format = r->work_format;
|
||||
|
||||
max_ss.rate = PA_MAX(r->i_ss.rate, r->o_ss.rate);
|
||||
|
||||
@@ -1,382 +0,0 @@
|
||||
commit aed52c507f345d0b5c4cd2b1d2c58dae2d904b53
|
||||
Author: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
|
||||
Date: Wed Feb 22 01:19:24 2023 +0300
|
||||
|
||||
alsa-util: Perform format and rate detection before setting HW params
|
||||
|
||||
Perform detection of supported sample format and rates just after device is
|
||||
opened, before `snd_pcm_hw_params()` is called for the first time. This fixes a
|
||||
problem where device restricts available sample rates after HW params are set
|
||||
preventing sample rate detection (seen with UAC2 devices and kernel 6.1.9)
|
||||
|
||||
Bug: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1414
|
||||
Bug: https://github.com/alsa-project/alsa-lib/issues/119
|
||||
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/782>
|
||||
|
||||
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
|
||||
index 49c39687c..c272e392b 100644
|
||||
--- a/src/modules/alsa/alsa-mixer.c
|
||||
+++ b/src/modules/alsa/alsa-mixer.c
|
||||
@@ -5074,7 +5074,7 @@ static snd_pcm_t* mapping_open_pcm(pa_alsa_mapping *m,
|
||||
handle = pa_alsa_open_by_template(
|
||||
m->device_strings, dev_id, NULL, &try_ss,
|
||||
&try_map, mode, &try_period_size,
|
||||
- &try_buffer_size, 0, NULL, NULL, exact_channels);
|
||||
+ &try_buffer_size, 0, NULL, NULL, NULL, NULL, exact_channels);
|
||||
if (handle && !exact_channels && m->channel_map.channels != try_map.channels) {
|
||||
char buf[PA_CHANNEL_MAP_SNPRINT_MAX];
|
||||
pa_log_debug("Channel map for mapping '%s' permanently changed to '%s'", m->name,
|
||||
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
|
||||
index b249df680..ca22f195f 100644
|
||||
--- a/src/modules/alsa/alsa-sink.c
|
||||
+++ b/src/modules/alsa/alsa-sink.c
|
||||
@@ -2527,7 +2527,9 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||
&ss, &map,
|
||||
SND_PCM_STREAM_PLAYBACK,
|
||||
&period_frames, &buffer_frames, tsched_frames,
|
||||
- &b, &d, mapping)))
|
||||
+ &b, &d,
|
||||
+ &u->supported_formats, &u->supported_rates,
|
||||
+ mapping)))
|
||||
goto fail;
|
||||
|
||||
} else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
|
||||
@@ -2541,7 +2543,9 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||
&ss, &map,
|
||||
SND_PCM_STREAM_PLAYBACK,
|
||||
&period_frames, &buffer_frames, tsched_frames,
|
||||
- &b, &d, profile_set, &mapping)))
|
||||
+ &b, &d,
|
||||
+ &u->supported_formats, &u->supported_rates,
|
||||
+ profile_set, &mapping)))
|
||||
goto fail;
|
||||
|
||||
} else {
|
||||
@@ -2552,7 +2556,9 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||
&ss, &map,
|
||||
SND_PCM_STREAM_PLAYBACK,
|
||||
&period_frames, &buffer_frames, tsched_frames,
|
||||
- &b, &d, false)))
|
||||
+ &b, &d,
|
||||
+ &u->supported_formats, &u->supported_rates,
|
||||
+ false)))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -2598,13 +2604,11 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
|
||||
|
||||
u->verified_sample_spec = ss;
|
||||
|
||||
- u->supported_formats = pa_alsa_get_supported_formats(u->pcm_handle, ss.format);
|
||||
if (!u->supported_formats) {
|
||||
pa_log_error("Failed to find any supported sample formats.");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- u->supported_rates = pa_alsa_get_supported_rates(u->pcm_handle, ss.rate);
|
||||
if (!u->supported_rates) {
|
||||
pa_log_error("Failed to find any supported sample rates.");
|
||||
goto fail;
|
||||
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
|
||||
index ef8b12c32..d88c47f1f 100644
|
||||
--- a/src/modules/alsa/alsa-source.c
|
||||
+++ b/src/modules/alsa/alsa-source.c
|
||||
@@ -2218,7 +2218,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||
&ss, &map,
|
||||
SND_PCM_STREAM_CAPTURE,
|
||||
&period_frames, &buffer_frames, tsched_frames,
|
||||
- &b, &d, mapping)))
|
||||
+ &b, &d, &u->supported_formats, &u->supported_rates, mapping)))
|
||||
goto fail;
|
||||
|
||||
} else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
|
||||
@@ -2232,7 +2232,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||
&ss, &map,
|
||||
SND_PCM_STREAM_CAPTURE,
|
||||
&period_frames, &buffer_frames, tsched_frames,
|
||||
- &b, &d, profile_set, &mapping)))
|
||||
+ &b, &d, &u->supported_formats, &u->supported_rates, profile_set, &mapping)))
|
||||
goto fail;
|
||||
|
||||
} else {
|
||||
@@ -2243,7 +2243,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||
&ss, &map,
|
||||
SND_PCM_STREAM_CAPTURE,
|
||||
&period_frames, &buffer_frames, tsched_frames,
|
||||
- &b, &d, false)))
|
||||
+ &b, &d, &u->supported_formats, &u->supported_rates, false)))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -2279,13 +2279,11 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
|
||||
|
||||
u->verified_sample_spec = ss;
|
||||
|
||||
- u->supported_formats = pa_alsa_get_supported_formats(u->pcm_handle, ss.format);
|
||||
if (!u->supported_formats) {
|
||||
pa_log_error("Failed to find any supported sample formats.");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
- u->supported_rates = pa_alsa_get_supported_rates(u->pcm_handle, ss.rate);
|
||||
if (!u->supported_rates) {
|
||||
pa_log_error("Failed to find any supported sample rates.");
|
||||
goto fail;
|
||||
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
|
||||
index e75756f53..744e7aae1 100644
|
||||
--- a/src/modules/alsa/alsa-ucm.c
|
||||
+++ b/src/modules/alsa/alsa-ucm.c
|
||||
@@ -2026,7 +2026,7 @@ static snd_pcm_t* mapping_open_pcm(pa_alsa_ucm_config *ucm, pa_alsa_mapping *m,
|
||||
try_buffer_size = ucm->core->default_n_fragments * try_period_size;
|
||||
|
||||
pcm = pa_alsa_open_by_device_string(m->device_strings[0], NULL, &try_ss,
|
||||
- &try_map, mode, &try_period_size, &try_buffer_size, 0, NULL, NULL, exact_channels);
|
||||
+ &try_map, mode, &try_period_size, &try_buffer_size, 0, NULL, NULL, NULL, NULL, exact_channels);
|
||||
|
||||
if (pcm) {
|
||||
if (!exact_channels)
|
||||
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
|
||||
index fd30f18bd..b631c870c 100644
|
||||
--- a/src/modules/alsa/alsa-util.c
|
||||
+++ b/src/modules/alsa/alsa-util.c
|
||||
@@ -523,6 +523,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap,
|
||||
bool *use_tsched,
|
||||
+ pa_sample_format_t **query_supported_formats,
|
||||
+ unsigned int **query_supported_rates,
|
||||
pa_alsa_profile_set *ps,
|
||||
pa_alsa_mapping **mapping) {
|
||||
|
||||
@@ -561,6 +563,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
|
||||
tsched_size,
|
||||
use_mmap,
|
||||
use_tsched,
|
||||
+ query_supported_formats,
|
||||
+ query_supported_rates,
|
||||
m);
|
||||
|
||||
if (pcm_handle) {
|
||||
@@ -588,6 +592,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
|
||||
tsched_size,
|
||||
use_mmap,
|
||||
use_tsched,
|
||||
+ query_supported_formats,
|
||||
+ query_supported_rates,
|
||||
m);
|
||||
|
||||
if (pcm_handle) {
|
||||
@@ -612,6 +618,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
|
||||
tsched_size,
|
||||
use_mmap,
|
||||
use_tsched,
|
||||
+ query_supported_formats,
|
||||
+ query_supported_rates,
|
||||
false);
|
||||
pa_xfree(d);
|
||||
|
||||
@@ -632,6 +640,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_mapping(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap,
|
||||
bool *use_tsched,
|
||||
+ pa_sample_format_t **query_supported_formats,
|
||||
+ unsigned int **query_supported_rates,
|
||||
pa_alsa_mapping *m) {
|
||||
|
||||
snd_pcm_t *pcm_handle;
|
||||
@@ -661,6 +671,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_mapping(
|
||||
tsched_size,
|
||||
use_mmap,
|
||||
use_tsched,
|
||||
+ query_supported_formats,
|
||||
+ query_supported_rates,
|
||||
pa_channel_map_valid(&m->channel_map) /* Query the channel count if we don't know what we want */);
|
||||
|
||||
if (!pcm_handle)
|
||||
@@ -684,6 +696,8 @@ snd_pcm_t *pa_alsa_open_by_device_string(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap,
|
||||
bool *use_tsched,
|
||||
+ pa_sample_format_t **query_supported_formats,
|
||||
+ unsigned int **query_supported_rates,
|
||||
bool require_exact_channel_number) {
|
||||
|
||||
int err;
|
||||
@@ -711,6 +725,12 @@ snd_pcm_t *pa_alsa_open_by_device_string(
|
||||
|
||||
pa_log_debug("Managed to open %s", d);
|
||||
|
||||
+ if (query_supported_formats)
|
||||
+ *query_supported_formats = pa_alsa_get_supported_formats(pcm_handle, ss->format);
|
||||
+
|
||||
+ if (query_supported_rates)
|
||||
+ *query_supported_rates = pa_alsa_get_supported_rates(pcm_handle, ss->rate);
|
||||
+
|
||||
if ((err = pa_alsa_set_hw_params(
|
||||
pcm_handle,
|
||||
ss,
|
||||
@@ -784,6 +804,8 @@ snd_pcm_t *pa_alsa_open_by_template(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap,
|
||||
bool *use_tsched,
|
||||
+ pa_sample_format_t **query_supported_formats,
|
||||
+ unsigned int **query_supported_rates,
|
||||
bool require_exact_channel_number) {
|
||||
|
||||
snd_pcm_t *pcm_handle;
|
||||
@@ -805,6 +827,8 @@ snd_pcm_t *pa_alsa_open_by_template(
|
||||
tsched_size,
|
||||
use_mmap,
|
||||
use_tsched,
|
||||
+ query_supported_formats,
|
||||
+ query_supported_rates,
|
||||
require_exact_channel_number);
|
||||
|
||||
pa_xfree(d);
|
||||
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
|
||||
index 2eed3eac3..c65801104 100644
|
||||
--- a/src/modules/alsa/alsa-util.h
|
||||
+++ b/src/modules/alsa/alsa-util.h
|
||||
@@ -67,6 +67,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap, /* modified at return */
|
||||
bool *use_tsched, /* modified at return */
|
||||
+ pa_sample_format_t **query_supported_formats, /* modified at return */
|
||||
+ unsigned int **query_supported_rates, /* modified at return */
|
||||
pa_alsa_profile_set *ps,
|
||||
pa_alsa_mapping **mapping); /* modified at return */
|
||||
|
||||
@@ -82,6 +84,8 @@ snd_pcm_t *pa_alsa_open_by_device_id_mapping(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap, /* modified at return */
|
||||
bool *use_tsched, /* modified at return */
|
||||
+ pa_sample_format_t **query_supported_formats, /* modified at return */
|
||||
+ unsigned int **query_supported_rates, /* modified at return */
|
||||
pa_alsa_mapping *mapping);
|
||||
|
||||
/* Opens the explicit ALSA device */
|
||||
@@ -96,6 +100,8 @@ snd_pcm_t *pa_alsa_open_by_device_string(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap, /* modified at return */
|
||||
bool *use_tsched, /* modified at return */
|
||||
+ pa_sample_format_t **query_supported_formats, /* modified at return */
|
||||
+ unsigned int **query_supported_rates, /* modified at return */
|
||||
bool require_exact_channel_number);
|
||||
|
||||
/* Opens the explicit ALSA device with a fallback list */
|
||||
@@ -111,6 +117,8 @@ snd_pcm_t *pa_alsa_open_by_template(
|
||||
snd_pcm_uframes_t tsched_size,
|
||||
bool *use_mmap, /* modified at return */
|
||||
bool *use_tsched, /* modified at return */
|
||||
+ pa_sample_format_t **query_supported_formats, /* modified at return */
|
||||
+ unsigned int **query_supported_rates, /* modified at return */
|
||||
bool require_exact_channel_number);
|
||||
|
||||
void pa_alsa_dump(pa_log_level_t level, snd_pcm_t *pcm);
|
||||
commit 5ab2b9cb0e32190c3ea12b0f4cb7533d7340bbf1
|
||||
Author: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
|
||||
Date: Wed Feb 22 01:50:22 2023 +0300
|
||||
|
||||
alsa-util: Fix pa_alsa_get_supported_formats fallback.
|
||||
|
||||
Looks like original intention was to scan over sample formats supported by PA,
|
||||
but code does the scan by list of alsa formats. Reverse the map and adjust
|
||||
fallback case which now can use the same map.
|
||||
|
||||
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/782>
|
||||
|
||||
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
|
||||
index b631c870c..d3c092f52 100644
|
||||
--- a/src/modules/alsa/alsa-util.c
|
||||
+++ b/src/modules/alsa/alsa-util.c
|
||||
@@ -1502,35 +1502,35 @@ unsigned int *pa_alsa_get_supported_rates(snd_pcm_t *pcm, unsigned int fallback_
|
||||
}
|
||||
|
||||
pa_sample_format_t *pa_alsa_get_supported_formats(snd_pcm_t *pcm, pa_sample_format_t fallback_format) {
|
||||
- static const snd_pcm_format_t format_trans_to_pa[] = {
|
||||
- [SND_PCM_FORMAT_U8] = PA_SAMPLE_U8,
|
||||
- [SND_PCM_FORMAT_A_LAW] = PA_SAMPLE_ALAW,
|
||||
- [SND_PCM_FORMAT_MU_LAW] = PA_SAMPLE_ULAW,
|
||||
- [SND_PCM_FORMAT_S16_LE] = PA_SAMPLE_S16LE,
|
||||
- [SND_PCM_FORMAT_S16_BE] = PA_SAMPLE_S16BE,
|
||||
- [SND_PCM_FORMAT_FLOAT_LE] = PA_SAMPLE_FLOAT32LE,
|
||||
- [SND_PCM_FORMAT_FLOAT_BE] = PA_SAMPLE_FLOAT32BE,
|
||||
- [SND_PCM_FORMAT_S32_LE] = PA_SAMPLE_S32LE,
|
||||
- [SND_PCM_FORMAT_S32_BE] = PA_SAMPLE_S32BE,
|
||||
- [SND_PCM_FORMAT_S24_3LE] = PA_SAMPLE_S24LE,
|
||||
- [SND_PCM_FORMAT_S24_3BE] = PA_SAMPLE_S24BE,
|
||||
- [SND_PCM_FORMAT_S24_LE] = PA_SAMPLE_S24_32LE,
|
||||
- [SND_PCM_FORMAT_S24_BE] = PA_SAMPLE_S24_32BE,
|
||||
+ static const snd_pcm_format_t format_trans_to_pcm[] = {
|
||||
+ [PA_SAMPLE_U8] = SND_PCM_FORMAT_U8,
|
||||
+ [PA_SAMPLE_ALAW] = SND_PCM_FORMAT_A_LAW,
|
||||
+ [PA_SAMPLE_ULAW] = SND_PCM_FORMAT_MU_LAW,
|
||||
+ [PA_SAMPLE_S16LE] = SND_PCM_FORMAT_S16_LE,
|
||||
+ [PA_SAMPLE_S16BE] = SND_PCM_FORMAT_S16_BE,
|
||||
+ [PA_SAMPLE_FLOAT32LE] = SND_PCM_FORMAT_FLOAT_LE,
|
||||
+ [PA_SAMPLE_FLOAT32BE] = SND_PCM_FORMAT_FLOAT_BE,
|
||||
+ [PA_SAMPLE_S32LE] = SND_PCM_FORMAT_S32_LE,
|
||||
+ [PA_SAMPLE_S32BE] = SND_PCM_FORMAT_S32_BE,
|
||||
+ [PA_SAMPLE_S24LE] = SND_PCM_FORMAT_S24_3LE,
|
||||
+ [PA_SAMPLE_S24BE] = SND_PCM_FORMAT_S24_3BE,
|
||||
+ [PA_SAMPLE_S24_32LE] = SND_PCM_FORMAT_S24_LE,
|
||||
+ [PA_SAMPLE_S24_32BE] = SND_PCM_FORMAT_S24_BE,
|
||||
};
|
||||
- static const snd_pcm_format_t all_formats[] = {
|
||||
- SND_PCM_FORMAT_U8,
|
||||
- SND_PCM_FORMAT_A_LAW,
|
||||
- SND_PCM_FORMAT_MU_LAW,
|
||||
- SND_PCM_FORMAT_S16_LE,
|
||||
- SND_PCM_FORMAT_S16_BE,
|
||||
- SND_PCM_FORMAT_FLOAT_LE,
|
||||
- SND_PCM_FORMAT_FLOAT_BE,
|
||||
- SND_PCM_FORMAT_S32_LE,
|
||||
- SND_PCM_FORMAT_S32_BE,
|
||||
- SND_PCM_FORMAT_S24_3LE,
|
||||
- SND_PCM_FORMAT_S24_3BE,
|
||||
- SND_PCM_FORMAT_S24_LE,
|
||||
- SND_PCM_FORMAT_S24_BE,
|
||||
+ static const pa_sample_format_t all_formats[] = {
|
||||
+ PA_SAMPLE_U8,
|
||||
+ PA_SAMPLE_ALAW,
|
||||
+ PA_SAMPLE_ULAW,
|
||||
+ PA_SAMPLE_S16LE,
|
||||
+ PA_SAMPLE_S16BE,
|
||||
+ PA_SAMPLE_FLOAT32LE,
|
||||
+ PA_SAMPLE_FLOAT32BE,
|
||||
+ PA_SAMPLE_S32LE,
|
||||
+ PA_SAMPLE_S32BE,
|
||||
+ PA_SAMPLE_S24LE,
|
||||
+ PA_SAMPLE_S24BE,
|
||||
+ PA_SAMPLE_S24_32LE,
|
||||
+ PA_SAMPLE_S24_32BE,
|
||||
};
|
||||
bool supported[PA_ELEMENTSOF(all_formats)] = {
|
||||
false,
|
||||
@@ -1548,7 +1548,7 @@ pa_sample_format_t *pa_alsa_get_supported_formats(snd_pcm_t *pcm, pa_sample_form
|
||||
}
|
||||
|
||||
for (i = 0, n = 0; i < PA_ELEMENTSOF(all_formats); i++) {
|
||||
- if (snd_pcm_hw_params_test_format(pcm, hwparams, all_formats[i]) == 0) {
|
||||
+ if (snd_pcm_hw_params_test_format(pcm, hwparams, format_trans_to_pcm[all_formats[i]]) == 0) {
|
||||
supported[i] = true;
|
||||
n++;
|
||||
}
|
||||
@@ -1559,7 +1559,7 @@ pa_sample_format_t *pa_alsa_get_supported_formats(snd_pcm_t *pcm, pa_sample_form
|
||||
|
||||
for (i = 0, j = 0; i < PA_ELEMENTSOF(all_formats); i++) {
|
||||
if (supported[i])
|
||||
- formats[j++] = format_trans_to_pa[all_formats[i]];
|
||||
+ formats[j++] = all_formats[i];
|
||||
}
|
||||
|
||||
formats[j] = PA_SAMPLE_MAX;
|
||||
@@ -1567,7 +1567,7 @@ pa_sample_format_t *pa_alsa_get_supported_formats(snd_pcm_t *pcm, pa_sample_form
|
||||
formats = pa_xnew(pa_sample_format_t, 2);
|
||||
|
||||
formats[0] = fallback_format;
|
||||
- if ((ret = snd_pcm_hw_params_set_format(pcm, hwparams, format_trans_to_pa[formats[0]])) < 0) {
|
||||
+ if ((ret = snd_pcm_hw_params_set_format(pcm, hwparams, format_trans_to_pcm[formats[0]])) < 0) {
|
||||
pa_log_debug("snd_pcm_hw_params_set_format() failed: %s", pa_alsa_strerror(ret));
|
||||
pa_xfree(formats);
|
||||
return NULL;
|
||||
Reference in New Issue
Block a user