diff options
author | Igor V. Kovalenko <igor.v.kovalenko@gmail.com> | 2023-10-06 11:35:25 +0300 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2023-10-06 13:05:10 +0100 |
commit | 54658a5b7647472f798ec8ab53e7be5f3e529bf6 (patch) | |
tree | b6354f62fbedf3a9282d28a31797133dc773c925 /media-libs/libpulse | |
parent | media-libs/libpulse: Backport smoother fixes to 16.1 (diff) | |
download | gentoo-54658a5b7647472f798ec8ab53e7be5f3e529bf6.tar.gz gentoo-54658a5b7647472f798ec8ab53e7be5f3e529bf6.tar.bz2 gentoo-54658a5b7647472f798ec8ab53e7be5f3e529bf6.zip |
media-libs/libpulse: Backport memblock alignment fix
Memblock alignment fix changes internal ABI, therefore patch and bump
media-sound/pulseaudio-daemon together with media-libs/libpulse.
Upstream commit 300db779224625144d6279d230c2daa857c967d8
While at it, add similar implementation change for sample rate detection
affecting both places.
Upstream commit 86c5fbab5778685e19b5a4a9b8eb04ca90dff780
Signed-off-by: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'media-libs/libpulse')
3 files changed, 160 insertions, 1 deletions
diff --git a/media-libs/libpulse/files/pulseaudio-16.1-add-more-standard-samplerates.patch b/media-libs/libpulse/files/pulseaudio-16.1-add-more-standard-samplerates.patch new file mode 100644 index 000000000000..e1ea200c4c4c --- /dev/null +++ b/media-libs/libpulse/files/pulseaudio-16.1-add-more-standard-samplerates.patch @@ -0,0 +1,35 @@ +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 { diff --git a/media-libs/libpulse/files/pulseaudio-16.1-fix-memblock-alignment.patch b/media-libs/libpulse/files/pulseaudio-16.1-fix-memblock-alignment.patch new file mode 100644 index 000000000000..b05e530ac89d --- /dev/null +++ b/media-libs/libpulse/files/pulseaudio-16.1-fix-memblock-alignment.patch @@ -0,0 +1,122 @@ +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); + diff --git a/media-libs/libpulse/libpulse-16.1-r3.ebuild b/media-libs/libpulse/libpulse-16.1-r3.ebuild index 4668093c1a09..a67865f3948a 100644 --- a/media-libs/libpulse/libpulse-16.1-r3.ebuild +++ b/media-libs/libpulse/libpulse-16.1-r3.ebuild @@ -66,7 +66,7 @@ BDEPEND=" PDEPEND=" || ( media-video/pipewire[sound-server(+)] - media-sound/pulseaudio-daemon + >=media-sound/pulseaudio-daemon-16.1-r8 media-sound/pulseaudio[daemon(+)] ) " @@ -79,6 +79,8 @@ PATCHES=( "${FILESDIR}"/pulseaudio-16.1-proplist-util-without-gdkx.patch "${FILESDIR}"/pulseaudio-16.1-smoother-start-paused.patch "${FILESDIR}"/pulseaudio-16.1-smoother-time-calculation.patch + "${FILESDIR}"/pulseaudio-16.1-fix-memblock-alignment.patch + "${FILESDIR}"/pulseaudio-16.1-add-more-standard-samplerates.patch ) src_prepare() { |