From 8368c614e6a1232f34a14cd6495cf2f68933030d Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Fri, 6 Oct 2023 17:57:58 +0100 Subject: gentoo auto-resync : 06:10:2023 - 17:57:58 --- media-sound/Manifest.gz | Bin 57445 -> 57450 bytes media-sound/pulseaudio-daemon/Manifest | 5 + ...eaudio-16.1-add-more-standard-samplerates.patch | 35 ++ .../pulseaudio-16.1-fix-memblock-alignment.patch | 122 +++++++ ...dio-16.1-fix-resampler-oversized-memblock.patch | 55 +++ ...dio-16.1-fix-uac2-broken-avoid-resampling.patch | 382 ++++++++++++++++++++ .../pulseaudio-daemon-16.1-r8.ebuild | 393 +++++++++++++++++++++ 7 files changed, 992 insertions(+) create mode 100644 media-sound/pulseaudio-daemon/files/pulseaudio-16.1-add-more-standard-samplerates.patch create mode 100644 media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-memblock-alignment.patch create mode 100644 media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-resampler-oversized-memblock.patch create mode 100644 media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-uac2-broken-avoid-resampling.patch create mode 100644 media-sound/pulseaudio-daemon/pulseaudio-daemon-16.1-r8.ebuild (limited to 'media-sound') diff --git a/media-sound/Manifest.gz b/media-sound/Manifest.gz index fb801594fc2b..b2b52f236f19 100644 Binary files a/media-sound/Manifest.gz and b/media-sound/Manifest.gz differ diff --git a/media-sound/pulseaudio-daemon/Manifest b/media-sound/pulseaudio-daemon/Manifest index f62d4dc220f1..8068e03c554a 100644 --- a/media-sound/pulseaudio-daemon/Manifest +++ b/media-sound/pulseaudio-daemon/Manifest @@ -1,5 +1,9 @@ AUX enable-autospawn.conf 65 BLAKE2B 47e57076b19000ca3c57f0368e453198131c41a5a9c2d0cc8632f0a7ed4e5c992cf93e3c7651c4f3b59ceaf177d4d811bd6774676a2b005ec12259e56d99b4d2 SHA512 61f90b0d19e807a672bd39d190c1102db0b8c46284cf09d4a19b4b96d566633e56a60d21a3a1374e447e8e06496a3aef56bf5ae574337c081e7cf18842458e59 AUX pulseaudio-16.0-optional-module-console-kit.patch 3077 BLAKE2B 3b8abc67478f6c8848a24788bdceeb5bce868bf5214a092c3abbd39a3102679e4b390e56231de0559c8389730a2a75ba21bf4d9f9d942792589c6db66d6eb04d SHA512 bec1a747593d9130bb8cfb05b0894e467c953264879f2a856a420b07ee688640ec2279c136daa825b21e0e7e3bfc3aa1e333487a776d1c7ffb9a6d0293a0502b +AUX pulseaudio-16.1-add-more-standard-samplerates.patch 1422 BLAKE2B 2e7ec0ee8560d80414550b0fe1eb8bfa0e1c9d90668dbb6366f0b23e651f6723fcd65a87ba16caba33b632919b39742cbc6b630f2a5a86952333606858b75a29 SHA512 534862debdac1aa091cedcd8058f7b0ef1cafc5c5f9bc72a96fc065b04b4809a6aed2f119fa71bfcd9ac9011d6809901972006efb908353f8baa16621024a657 +AUX pulseaudio-16.1-fix-memblock-alignment.patch 5531 BLAKE2B 419fdd5fde012455421e5020bc00105685e65b87c972eb50676f4f5e6a58a8d0fa574c0e3d946c15ce4a6ec42e9465913e3a60742784939d85d298bc1bbdf610 SHA512 e7b948a0eee82162fb2fbb8a679e1fcedd91a8525c3528e98c990aa33370a33345dfe7fa02a529a2d4e484ce011c882e0458edd9113e20c2a652a8bb8815d175 +AUX pulseaudio-16.1-fix-resampler-oversized-memblock.patch 2698 BLAKE2B 1543bed3fd24a7d574ff2415f63c5e8495c0af0e95085a4c4b598d9fbcda25f6338b8a9bbbda6c9d29e42e1ffe77b2456d05b16b55386c557978427a9e0b5a8a SHA512 72ba1c128f5b5c5b665569fddd31995bdf099b152ce928f3177d2267735968b26b6a2e3cfa90e01f377f910eaa8eaf2d7dbded9ad443ca863fcfa0929cd548af +AUX pulseaudio-16.1-fix-uac2-broken-avoid-resampling.patch 16883 BLAKE2B 013b3124b7c37ef63c823a2069f799047be2d07e4d2b78f78e1b5bb0041d26dccf9fc09269e9cf8b51da0802a9a33e6aad10cd1bb8c8c1580bf12579582ae446 SHA512 a615c02aa2c4c9bcdd186b9b340e3f4f49d00925cb702df8b698cfb00e7ef6bacc97165ae0e21d67befdc47f770eed2acaa39598deb9eccbf89355fa60e12d0f AUX pulseaudio-16.1-module-combine-sink-load-crash.patch 1052 BLAKE2B 09fa471cb40a83bd1969795ed8f7f3b1418efb99e1d79e6135785d4e54f0ebcb44813cf584067f4462b800e18661a508a120521e606687e2a49836020eb0ccf3 SHA512 3817f5267fd8287a7be4004189432601128c10c592fe54e4bdbdbb1a6ddd2fadede82dab047ea6693ef81cb04280e1fa4968d883ce7e03c2646145488f36d52a AUX pulseaudio-16.1-module-combine-sink-unload-crash.patch 802 BLAKE2B 4c82bf606bb6b7123d53dac093044e9d74328f7eef616ad2da4a2c37e7dca3223e2ecc1bafd7dfc4b363c5bff20dd915a5f328236389b6dae37a74688fe886e0 SHA512 4cb64be8a41e16cf854d992416bdc25b327ab8adc706e091e20fc6bf35c7161ed798b611db2060a14af5974a987f10931f9086b45bb0b95cd82010ce952e0c80 AUX pulseaudio-16.1-move-qpaeq-to-daemon.patch 1029 BLAKE2B f7695aff795d0b0828d95eaba7b059492f33315a3086fb6cfd63e7de011c0416a5ca56e26932ac7c6ee3784dc63ad0b5918bedcf23bc1d8d3fbdfb8df72c78d1 SHA512 0ba164221dca646728ea7ecbb26fa8d00b65cb45e4dc71a0298e80349548dd1adca2142b26dba138618b27f71c955186d255a45b1be790d8b9da43d60817daa4 @@ -11,4 +15,5 @@ DIST pulseaudio-16.1.tar.xz 1545596 BLAKE2B 535706abcea2cae39834b23c8bdc37f71b0e EBUILD pulseaudio-daemon-16.1-r3.ebuild 12141 BLAKE2B ae0a36088045b7aea5ccb2100de788b1cc4c467c09439f8b807c98837b58e68dde47fa62f9f49e8db1555946974ca2d23be444f7586d3125dcdcb808d434a33e SHA512 a562b813894362d908158b4b730c0693ebf96b8131033626c6999f0feeaecddf3464b88c994667763a0848d5584f322fffb61b3cda2b59d402d12b39bedfe521 EBUILD pulseaudio-daemon-16.1-r6.ebuild 12337 BLAKE2B 16dd8c294a205010865914420818cb3ce20f47060dfa356c0bb89413dbf738351e26c95aa28f03c1abf775485e6c9414320df43adf94190f6591a2b62291199c SHA512 20f5349d6d5b723fc784837a70047aa33fd2ea78f13974e83b3b7fe2a323e944917a764dafe46ddb4bf340a79e4ef85891005f44076883f2689793460aa245b8 EBUILD pulseaudio-daemon-16.1-r7.ebuild 12098 BLAKE2B 0c0aa39e26262b0a4df7b8491278611971fc22e72f2638fda3fd18b64d4e788359bf86d30c080668bcfde130a4051ee65afbab55719b4f1c203f731db7dbc699 SHA512 6fb3fd5f11a48d4373756ccdb4e09211017d77895e8a0dafa09d5b33a9a250c7793867997d4e570678f22911ad303221b5a903718826b83e1c8459ab7c47c329 +EBUILD pulseaudio-daemon-16.1-r8.ebuild 12499 BLAKE2B 1c96f280303f64778eab92959b225bda2b1aa0546c3a2ef1bbfb8b92c7a99eb01b14bd26daed7a05a6cb75b5a3cf73586431ce3b2b596bd5f1a9d17794f58830 SHA512 e387ed0ba94d68780d69ad48ef0053da6ffb230644d4c8031b65c9ebdc8a4b08aa4f0f99cfc4ec6bcb551b8b09716a1ad0fab15e7aef8c0afaa9fa4379740507 MISC metadata.xml 3504 BLAKE2B ed8301d5eb41e597247ad2067063c262c9b18db6db6c7203a73196a9af48015b9f14105426688d5f5b394e66f7b26c7fa8cdb99f65a671b24d7ea619fc976bd8 SHA512 f77678eb60695f69416a81cb03dc58f559023d18c8bd0a5362767c3705f22b14cef3da1a537efb080f764623cd0cc5adeb10896836c57fadbf5dc9fc0263975c diff --git a/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-add-more-standard-samplerates.patch b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-add-more-standard-samplerates.patch new file mode 100644 index 000000000000..e1ea200c4c4c --- /dev/null +++ b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-add-more-standard-samplerates.patch @@ -0,0 +1,35 @@ +commit 86c5fbab5778685e19b5a4a9b8eb04ca90dff780 +Author: Igor V. Kovalenko +Date: Sun Feb 5 19:49:10 2023 +0300 + + alsa-util: Add more standard sample rates. + + Part-of: + +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-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-memblock-alignment.patch b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-memblock-alignment.patch new file mode 100644 index 000000000000..b05e530ac89d --- /dev/null +++ b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-memblock-alignment.patch @@ -0,0 +1,122 @@ +commit 300db779224625144d6279d230c2daa857c967d8 +Author: Igor V. Kovalenko +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: + +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-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-resampler-oversized-memblock.patch b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-resampler-oversized-memblock.patch new file mode 100644 index 000000000000..bd3d39d0af82 --- /dev/null +++ b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-resampler-oversized-memblock.patch @@ -0,0 +1,55 @@ +commit 1cfa7378236b3cf9daf3be09d3227b92df69cc53 +Author: Igor V. Kovalenko +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: + +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); + diff --git a/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-uac2-broken-avoid-resampling.patch b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-uac2-broken-avoid-resampling.patch new file mode 100644 index 000000000000..a260ced351a5 --- /dev/null +++ b/media-sound/pulseaudio-daemon/files/pulseaudio-16.1-fix-uac2-broken-avoid-resampling.patch @@ -0,0 +1,382 @@ +commit aed52c507f345d0b5c4cd2b1d2c58dae2d904b53 +Author: Igor V. Kovalenko +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: + +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 +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: + +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; diff --git a/media-sound/pulseaudio-daemon/pulseaudio-daemon-16.1-r8.ebuild b/media-sound/pulseaudio-daemon/pulseaudio-daemon-16.1-r8.ebuild new file mode 100644 index 000000000000..e12ba4cea6fc --- /dev/null +++ b/media-sound/pulseaudio-daemon/pulseaudio-daemon-16.1-r8.ebuild @@ -0,0 +1,393 @@ +# Copyright 1999-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI="7" + +MY_PV="${PV/_pre*}" +MY_P="pulseaudio-${MY_PV}" +inherit bash-completion-r1 gnome2-utils meson optfeature systemd tmpfiles udev + +DESCRIPTION="Daemon component of PulseAudio (networked sound server)" +HOMEPAGE="https://www.freedesktop.org/wiki/Software/PulseAudio/" + +if [[ ${PV} = 9999 ]]; then + inherit git-r3 + EGIT_BRANCH="master" + EGIT_REPO_URI="https://gitlab.freedesktop.org/pulseaudio/pulseaudio" +else + SRC_URI="https://freedesktop.org/software/pulseaudio/releases/${MY_P}.tar.xz" + KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~sparc ~x86 ~amd64-linux ~x86-linux" +fi + +S="${WORKDIR}/${MY_P}" + +# libpulse-simple and libpulse link to libpulse-core; this is daemon's +# library and can link to gdbm and other GPL-only libraries. In this +# cases, we have a fully GPL-2 package. Leaving the rest of the +# GPL-forcing USE flags for those who use them. +LICENSE="!gdbm? ( LGPL-2.1 ) gdbm? ( GPL-2 )" + +SLOT="0" + +# +alsa-plugin as discussed in bug #519530 +# TODO: Find out why webrtc-aec is + prefixed - there's already the always available speexdsp-aec +# NOTE: The current ebuild sets +X almost certainly just for the pulseaudio.desktop file +IUSE="+alsa +alsa-plugin aptx +asyncns bluetooth dbus elogind equalizer fftw +gdbm +glib gstreamer jack ldac lirc +ofono-headset +orc oss selinux sox ssl systemd system-wide tcpd test +udev valgrind +webrtc-aec +X zeroconf" + +RESTRICT="!test? ( test )" + +# See "*** BLUEZ support not found (requires D-Bus)" in configure.ac +# Basically all IUSE are either ${MULTILIB_USEDEP} for client libs or they belong under !daemon () +# We duplicate alsa-plugin, {native,ofono}-headset under daemon to let users deal with them at once +REQUIRED_USE=" + ?? ( elogind systemd ) + alsa-plugin? ( alsa ) + aptx? ( bluetooth ) + bluetooth? ( dbus ) + equalizer? ( dbus ) + ldac? ( bluetooth ) + ofono-headset? ( bluetooth ) + udev? ( || ( alsa oss ) ) + zeroconf? ( dbus ) +" + +# NOTE: +# - libpcre needed in some cases, bug #472228 +# - media-libs/speexdsp is providing echo canceller implementation and used in resampler +# TODO: libatomic_ops is only needed on some architectures and conditions, and then at runtime too +gstreamer_deps=" + media-libs/gst-plugins-base + >=media-libs/gstreamer-1.14 +" +COMMON_DEPEND=" + ~media-libs/libpulse-${PV}[dbus?,glib?,systemd?,valgrind?,X?] + >=media-libs/libpulse-16.1-r3 + dev-libs/libatomic_ops + >=media-libs/libsndfile-1.0.20 + >=media-libs/speexdsp-1.2 + alsa? ( >=media-libs/alsa-lib-1.0.24 ) + aptx? ( ${gstreamer_deps} ) + asyncns? ( >=net-libs/libasyncns-0.1 ) + bluetooth? ( + >=net-wireless/bluez-5 + media-libs/sbc + ) + dev-libs/libltdl + sys-kernel/linux-headers + >=sys-libs/libcap-2.22-r2 + dbus? ( >=sys-apps/dbus-1.4.12 ) + elibc_mingw? ( dev-libs/libpcre:3 ) + elogind? ( sys-auth/elogind ) + equalizer? ( + sci-libs/fftw:3.0= + ) + fftw? ( + sci-libs/fftw:3.0= + ) + gdbm? ( sys-libs/gdbm:= ) + glib? ( >=dev-libs/glib-2.28.0:2 ) + gstreamer? ( + ${gstreamer_deps} + >=dev-libs/glib-2.26.0:2 + ) + jack? ( virtual/jack ) + ldac? ( ${gstreamer_deps} ) + lirc? ( app-misc/lirc ) + ofono-headset? ( >=net-misc/ofono-1.13 ) + orc? ( >=dev-lang/orc-0.4.15 ) + selinux? ( sec-policy/selinux-pulseaudio ) + sox? ( >=media-libs/soxr-0.1.1 ) + ssl? ( dev-libs/openssl:= ) + systemd? ( sys-apps/systemd:= ) + tcpd? ( sys-apps/tcp-wrappers ) + udev? ( >=virtual/udev-143[hwdb(+)] ) + valgrind? ( dev-util/valgrind ) + webrtc-aec? ( >=media-libs/webrtc-audio-processing-0.2:0 ) + X? ( + >=x11-libs/libxcb-1.6 + x11-libs/libICE + x11-libs/libSM + >=x11-libs/libX11-1.4.0 + >=x11-libs/libXtst-1.0.99.2 + ) + zeroconf? ( >=net-dns/avahi-0.6.12[dbus] ) +" + +# pulseaudio ships a bundle xmltoman, which uses XML::Parser +DEPEND=" + ${COMMON_DEPEND} + test? ( >=dev-libs/check-0.9.10 ) + X? ( x11-base/xorg-proto ) +" + +# alsa-utils dep is for the alsasound init.d script (see bug 155707); TODO: read it +# NOTE: Only system-wide needs acct-group/audio unless elogind/systemd is not used +RDEPEND=" + ${COMMON_DEPEND} + system-wide? ( + alsa? ( media-sound/alsa-utils ) + acct-user/pulse + acct-group/audio + acct-group/pulse-access + ) + bluetooth? ( + ldac? ( media-plugins/gst-plugins-ldac ) + aptx? ( media-plugins/gst-plugins-openaptx ) + ) + !media-video/pipewire[sound-server(+)] +" +unset gstreamer_deps + +# This is a PDEPEND to avoid a circular dep +PDEPEND=" + alsa? ( alsa-plugin? ( >=media-plugins/alsa-plugins-1.0.27-r1[pulseaudio] ) ) +" + +BDEPEND=" + dev-lang/perl + dev-perl/XML-Parser + sys-devel/gettext + sys-devel/m4 + virtual/libiconv + virtual/libintl + virtual/pkgconfig + orc? ( >=dev-lang/orc-0.4.15 ) + system-wide? ( dev-util/unifdef ) +" + +DOCS=( NEWS README ) + +# patches merged upstream, to be removed with 16.2 or later bump +PATCHES=( + "${FILESDIR}"/pulseaudio-16.0-optional-module-console-kit.patch + "${FILESDIR}"/pulseaudio-16.1-module-combine-sink-load-crash.patch + "${FILESDIR}"/pulseaudio-16.1-module-combine-sink-unload-crash.patch + "${FILESDIR}"/pulseaudio-16.1-move-qpaeq-to-daemon.patch + # alignment fix changes internal abi, added requirement matching >=media-libs/libpulse-16.1-r3 + "${FILESDIR}"/pulseaudio-16.1-fix-memblock-alignment.patch + "${FILESDIR}"/pulseaudio-16.1-add-more-standard-samplerates.patch + "${FILESDIR}"/pulseaudio-16.1-fix-resampler-oversized-memblock.patch + "${FILESDIR}"/pulseaudio-16.1-fix-uac2-broken-avoid-resampling.patch +) + +src_prepare() { + default + + gnome2_environment_reset +} + +src_configure() { + local enable_bluez5_gstreamer="disabled" + if use aptx || use ldac ; then + enable_bluez5_gstreamer="enabled" + fi + + local enable_fftw="disabled" + if use equalizer || use fftw ; then + enable_fftw="enabled" + fi + + local emesonargs=( + --localstatedir="${EPREFIX}"/var + + -Ddaemon=true + -Dclient=false + -Ddoxygen=false + -Dgcov=false + -Dman=true + # tests involve random modules, so just do them for the native # TODO: tests should run always + $(meson_use test tests) + -Ddatabase=$(usex gdbm gdbm simple) # tdb is also an option but no one cares about it + -Dstream-restore-clear-old-devices=true + -Drunning-from-build-tree=false + + # Paths + -Dmodlibexecdir="${EPREFIX}/usr/$(get_libdir)/pulseaudio/modules" # Was $(get_libdir)/${P} + -Dsystemduserunitdir=$(systemd_get_userunitdir) + -Dudevrulesdir="${EPREFIX}$(get_udevdir)/rules.d" + -Dbashcompletiondir="$(get_bashcompdir)" # Alternatively DEPEND on app-shells/bash-completion for pkg-config to provide the value + + # Optional features + $(meson_feature alsa) + $(meson_feature asyncns) + $(meson_feature zeroconf avahi) + $(meson_feature bluetooth bluez5) + -Dbluez5-gstreamer=${enable_bluez5_gstreamer} + $(meson_use bluetooth bluez5-native-headset) + $(meson_use ofono-headset bluez5-ofono-headset) + -Dconsolekit=disabled + $(meson_feature dbus) + $(meson_feature elogind) + -Dfftw=${enable_fftw} + $(meson_feature glib) # WARNING: toggling this likely changes ABI + $(meson_feature glib gsettings) # Supposedly correct? + $(meson_feature gstreamer) + -Dgtk=disabled + -Dhal-compat=false + -Dipv6=true + $(meson_feature jack) + $(meson_feature lirc) + $(meson_feature ssl openssl) + $(meson_feature orc) + $(meson_feature oss oss-output) + -Dsamplerate=disabled # Matches upstream + $(meson_feature sox soxr) + -Dspeex=enabled + $(meson_feature systemd) + $(meson_feature tcpd tcpwrap) + $(meson_feature udev) + $(meson_feature valgrind) + $(meson_feature X x11) + + # Echo cancellation + -Dadrian-aec=false # Not packaged? + $(meson_feature webrtc-aec) + ) + + meson_src_configure +} + +src_install() { + meson_src_install + + # qpaeq moved to media-sound/qpaeq + if [[ -f "${ED}"/usr/bin/qpaeq ]]; then + rm "${ED}"/usr/bin/qpaeq || die + fi + + # Upstream installs 'pactl' if client is built, with all symlinks except for + # 'pulseaudio', 'pacmd' and 'pasuspender' which are installed if server is built. + # This trips QA warning, workaround: + # - install missing aliases in media-libs/libpulse (client build) + # - remove corresponding symlinks in media-sound/pulseaudio-daemonclient (server build) + rm "${D}/$(get_bashcompdir)"/pulseaudio || die + rm "${D}/$(get_bashcompdir)"/pacmd || die + rm "${D}/$(get_bashcompdir)"/pasuspender || die + + # Daemon configuration scripts will try to load snippets from corresponding '.d' dirs. + # Install these dirs to silence a warning if they are missing. + keepdir /etc/pulse/default.pa.d + keepdir /etc/pulse/system.pa.d + + if use system-wide; then + newconfd "${FILESDIR}"/pulseaudio.conf.d pulseaudio + + use_define() { + local define=${2:-$(echo ${1} | tr '[:lower:]' '[:upper:]')} + + use "${1}" && echo "-D${define}" || echo "-U${define}" + } + + unifdef -x 1 \ + $(use_define zeroconf AVAHI) \ + $(use_define alsa) \ + $(use_define bluetooth) \ + $(use_define udev) \ + "${FILESDIR}"/pulseaudio.init.d-5 \ + > "${T}"/pulseaudio \ + || die + + doinitd "${T}"/pulseaudio + + systemd_dounit "${FILESDIR}"/pulseaudio.service + + # We need /var/run/pulse, bug 442852 + newtmpfiles "${FILESDIR}"/pulseaudio.tmpfiles pulseaudio.conf + else + # Prevent warnings when system-wide is not used, bug 447694 + if use dbus; then + rm "${ED}"/etc/dbus-1/system.d/pulseaudio-system.conf || die + fi + fi + + if use zeroconf; then + sed -i \ + -e '/module-zeroconf-publish/s:^#::' \ + "${ED}/etc/pulse/default.pa" \ + || die + fi + + # Only enable autospawning pulseaudio daemon on systems without systemd + if ! use systemd; then + insinto /etc/pulse/client.conf.d + newins "${FILESDIR}/enable-autospawn.conf" "enable-autospawn.conf" + fi + + find "${ED}" \( -name '*.a' -o -name '*.la' \) -delete || die +} + +pkg_postinst() { + gnome2_schemas_update + + use udev && udev_reload + + if use system-wide; then + tmpfiles_process "pulseaudio.conf" + + elog "You have enabled the 'system-wide' USE flag for pulseaudio." + elog "This mode should only be used on headless servers, embedded systems," + elog "or thin clients. It will usually require manual configuration, and is" + elog "incompatible with many expected pulseaudio features." + elog "On normal desktop systems, system-wide mode is STRONGLY DISCOURAGED." + elog "" + elog "For more information, see" + elog " https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/" + elog " https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/SystemWide/" + elog " https://wiki.gentoo.org/wiki/PulseAudio#Headless_server" + elog "" + fi + + if use bluetooth; then + elog "You have enabled bluetooth USE flag for pulseaudio. Daemon will now handle" + elog "bluetooth Headset (HSP HS and HSP AG) and Handsfree (HFP HF) profiles using" + elog "native headset backend by default. This can be selectively disabled" + elog "via runtime configuration arguments to module-bluetooth-discover" + elog "in /etc/pulse/default.pa" + elog "To disable HFP HF append enable_native_hfp_hf=false" + elog "To disable HSP HS append enable_native_hsp_hs=false" + elog "To disable HSP AG append headset=auto or headset=ofono" + elog "(note this does NOT require enabling USE ofono)" + elog "" + fi + + if use ofono-headset; then + elog "You have enabled both native and ofono headset profiles. The runtime decision" + elog "which to use is done via the 'headset' argument of module-bluetooth-discover." + elog "" + fi + + if use gstreamer; then + elog "GStreamer-based RTP implementation modile enabled." + elog "To use OPUS payload install media-plugins/gst-plugins-opus" + elog "and add enable_opus=1 argument to module-rtp-send" + elog "" + fi + + if use systemd; then + elog "Pulseaudio autospawn by client library is no longer enabled when systemd is available." + elog "It's recommended to start pulseaudio via its systemd user units:" + elog "" + elog " systemctl --user enable pulseaudio.service pulseaudio.socket" + elog "" + elog "Root user can change system default configuration for all users:" + elog "" + elog " systemctl --global enable pulseaudio.service pulseaudio.socket" + elog "" + elog "If you would like to enable autospawn by client library, edit autospawn flag in /etc/pulse/client.conf like this:" + elog "" + elog " autospawn = yes" + elog "" + elog "The change from autospawn to user units will take effect after restarting." + elog "" + fi + + optfeature_header "PulseAudio can be enhanced by installing the following:" + use equalizer && optfeature "qpaeq script for equalizer GUI" media-sound/qpaeq + use dbus && optfeature "restricted realtime capabilities via D-Bus" sys-auth/rtkit +} + +pkg_postrm() { + gnome2_schemas_update + use udev && udev_reload +} -- cgit v1.2.3