Compare commits

...

255 commits

Author SHA1 Message Date
Fco. Javier F. Serrador
eee0e8f22f Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
2025-10-01 05:20:04 +02:00
Fco. Javier F. Serrador
b50c28af2c Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
2025-10-01 05:20:04 +02:00
Martin Srebotnjak
210f4742e7 Translated using Weblate (Slovenian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2025-10-01 05:20:04 +02:00
Temuri Doghonadze
53532e63bf Translated using Weblate (Georgian)
Currently translated at 79.3% (454 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
2025-10-01 05:20:04 +02:00
Jim Spentzos
6834e0041c Translated using Weblate (Greek)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2025-10-01 05:20:04 +02:00
김인수
329c05b04f Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
2025-10-01 05:20:04 +02:00
Jim Spentzos
76320675d8 Translated using Weblate (Greek)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2025-10-01 05:20:04 +02:00
Salvatore Cocuzza
d5b58d29ea Translated using Weblate (Italian)
Currently translated at 99.6% (570 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/it/
2025-10-01 05:20:04 +02:00
Salvatore Cocuzza
511926ab4b Translated using Weblate (Italian)
Currently translated at 99.3% (568 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/it/
2025-10-01 05:20:04 +02:00
Fco. Javier F. Serrador
f6e1124942 Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
2025-10-01 05:20:04 +02:00
Fco. Javier F. Serrador
c7db9d60a6 Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
2025-10-01 05:20:04 +02:00
Fco. Javier F. Serrador
7493990c84 Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
2025-10-01 05:20:04 +02:00
김인수
79455f69f7 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
2025-10-01 05:20:04 +02:00
Remus-Gabriel Chelu
a1fef186d0 Translated using Weblate (Romanian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ro/
2025-10-01 05:20:04 +02:00
Sergey A
4fa2e83ac3 Translated using Weblate (Russian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ru/
2025-10-01 05:20:04 +02:00
Temuri Doghonadze
f081327511 Translated using Weblate (Georgian)
Currently translated at 78.8% (451 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
2025-10-01 05:20:04 +02:00
Rafael Fontenelle
d3f1e217e7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/pt_BR/
2025-10-01 05:20:04 +02:00
Zayed Al-Saidi
5a3b45cda1 Translated using Weblate (Arabic)
Currently translated at 34.4% (197 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ar/
2025-10-01 05:20:04 +02:00
Rômulo Borges
b4b3889f3c pactl: add JSON output format
Previously, using the -f json or --format=json flags did not return JSON for the following commands:
- get-sink-volume
- get-source-volume
- get-sink-mute
- get-source-mute

This change adds proper JSON output for these commands.
2025-09-28 12:25:49 -03:00
Jonathan Marler
6358bcdf15 ci: Fetch tags by default before building
The CI for merge requests is failing because the meson script is unable
to parse the version. With some print debugging I determined that the
version string being generated on the CI is empty because it has no
git tags. I've added a command to fetch the tags before the build.
2025-09-15 13:15:55 -04:00
Arun Raghavan
1699a78f5b test: Demote once-test failure for meson to skip
Since this fails on CI (presumably due to pthread_setffinity_np() not
being permitted, let's make this a soft failure.
2025-09-15 13:06:54 -04:00
Arun Raghavan
17e471868e stream: Minor whitespace fixups 2025-09-15 13:06:54 -04:00
Jonathan Marler
1fbc6b0e0e stream: fix array out-of-bounds in stream_get_timing_info_callback
This issue was found by enabling ubsan. For me it consistently triggered
after about 28 seconds running a simple example that plays a sine wave
via the mainloop api.

I added a log and confirmed that before the ubsan is triggered the
index variable j is indeed 32 which is out-of-bounds.

Co-authored-by: Arun Raghavan <arun@asymptotic.io>
2025-09-13 12:19:35 -06:00
Yauhen Bugamol
98c7c9eafb Translated using Weblate (Belarusian)
Currently translated at 93.0% (532 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/be/
2025-05-01 08:49:06 +02:00
Yauhen Bugamol
20c853d84b Translated using Weblate (Belarusian)
Currently translated at 91.9% (526 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/be/
2025-05-01 02:34:19 +02:00
Weblate Translation Memory
7daeec45ff Translated using Weblate (Arabic)
Currently translated at 32.5% (186 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ar/
2025-04-27 14:48:30 +02:00
Zayed Al-Saidi
a6d0341209 Translated using Weblate (Arabic)
Currently translated at 32.5% (186 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ar/
2025-04-27 14:48:30 +02:00
Zayed Al-Saidi
6403e29230 Translated using Weblate (Arabic)
Currently translated at 29.3% (168 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ar/
2025-04-27 10:33:19 +02:00
Weblate Translation Memory
7dce3ffcb6 Translated using Weblate (Arabic)
Currently translated at 29.3% (168 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ar/
2025-04-27 10:33:19 +02:00
Ricky Tigg
a2d6f37bce Translated using Weblate (Finnish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/fi/
2025-04-22 18:19:14 +02:00
Salvatore Cocuzza
92993fa4c2 Translated using Weblate (Italian)
Currently translated at 98.9% (566 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/it/
2025-04-18 20:51:23 +02:00
Temuri Doghonadze
73e9692118 Translated using Weblate (Georgian)
Currently translated at 78.8% (451 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
2025-04-13 22:52:44 +02:00
hsu zangmen
e2e1aabc19 Translated using Weblate (Chinese (Traditional) (zh_TW))
Currently translated at 91.9% (526 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/zh_TW/
2025-04-09 03:53:35 +02:00
Remus-Gabriel Chelu
ca39322d5a Translated using Weblate (Romanian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ro/
2025-02-23 21:53:05 +01:00
Remus-Gabriel Chelu
8d7da0d505 Translated using Weblate (Romanian)
Currently translated at 0.3% (2 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ro/
2025-02-19 14:59:47 +01:00
Ricky Tigg
8d12c147af Translated using Weblate (Finnish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/fi/
2024-12-20 13:38:35 +01:00
DK Guy
c03faae6be Translated using Weblate (Danish)
Currently translated at 98.6% (564 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/da/
2024-12-13 18:38:37 +01:00
Andika Triwidada
5cd579acc3 Translated using Weblate (Indonesian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/id/
2024-11-03 11:40:38 +01:00
Andika Triwidada
0296a5cefc Translated using Weblate (Indonesian)
Currently translated at 98.4% (563 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/id/
2024-11-02 17:07:00 +01:00
Arif Budiman
7c5c877a52 Translated using Weblate (Indonesian)
Currently translated at 95.6% (547 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/id/
2024-10-25 13:11:28 +02:00
Hugo Carvalho
31f4c27a5c Translated using Weblate (Portuguese)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/pt/
2024-10-17 17:38:41 +02:00
Remus-Gabriel Chelu
ed789a4dc2 Added translation using Weblate (Romanian) 2024-10-11 18:01:03 +02:00
Rafael Fontenelle
93459a47c0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.4% (569 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/pt_BR/
2024-10-11 18:01:02 +02:00
Giannis Antypas
906362119e Translated using Weblate (Greek)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-09-04 18:38:33 +02:00
Giannis Antypas
60a85fb304 Translated using Weblate (Greek)
Currently translated at 99.3% (568 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-09-01 13:38:29 +02:00
Giannis Antypas
3e2bb8a1ec Translated using Weblate (Greek)
Currently translated at 98.7% (565 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-08-22 11:38:37 +02:00
bert
8ef0d597a1 rtp-recv: Remove inappropriate byte order conversion
Conversion of the `service` argument of `getaddrinfo()` to big-endian
byte order causes module-rtp-recv to bind to an incorrect port (37670)
for SAP announcements on little-endian architectures

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/828>
2024-08-21 13:22:14 +00:00
Martin Srebotnjak
90124125de Translated using Weblate (Slovenian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-08-17 20:38:38 +02:00
Martin Srebotnjak
2c379c1a3d Translated using Weblate (Slovenian)
Currently translated at 91.2% (522 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-08-16 18:38:37 +02:00
Giannis Antypas
3b3f763380 Translated using Weblate (Greek)
Currently translated at 96.8% (554 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-08-16 18:38:36 +02:00
Martin Srebotnjak
cba313d8f5 Translated using Weblate (Slovenian)
Currently translated at 33.9% (194 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/826>
2024-08-05 23:18:43 +00:00
Arun Raghavan
3da5e62741 ci: Add workflow rules to create merge request pipelines
This should make Weblate MRs run again.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/827>
2024-08-05 19:14:12 -04:00
Martin Srebotnjak
7341e5d16d Translated using Weblate (Slovenian)
Currently translated at 33.3% (191 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-08-04 21:41:21 +02:00
김인수
246b3ecf60 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
2024-08-04 21:41:20 +02:00
Giannis Antypas
398103a15a Translated using Weblate (Greek)
Currently translated at 96.6% (553 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-08-03 09:49:52 +02:00
Oğuz Ersen
a14239d2dc Translated using Weblate (Turkish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/tr/
2024-08-01 06:41:28 +02:00
Giannis Antypas
e3d30f8020 Translated using Weblate (Greek)
Currently translated at 96.3% (551 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-07-30 22:41:57 +02:00
Martin Srebotnjak
5c65aa5c11 Translated using Weblate (Slovenian)
Currently translated at 30.4% (174 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-07-26 15:38:50 +02:00
Giannis Antypas
2502f98666 Translated using Weblate (Greek)
Currently translated at 87.2% (499 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/el/
2024-07-20 02:38:56 +02:00
Scrambled 777
aa36bebf23 Translated using Weblate (Hindi)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/hi/
2024-07-20 02:38:56 +02:00
Martin Srebotnjak
608d92e9a6 Translated using Weblate (Slovenian)
Currently translated at 28.8% (165 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-07-20 02:38:56 +02:00
Martin Srebotnjak
565c129e90 Translated using Weblate (Slovenian)
Currently translated at 28.1% (161 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-07-20 02:38:56 +02:00
Martin Srebotnjak
b30d1a0a45 Translated using Weblate (Slovenian)
Currently translated at 27.4% (157 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/sl/
2024-07-20 02:38:56 +02:00
Martin Srebotnjak
5de032e69b Added translation using Weblate (Slovenian) 2024-07-20 02:38:56 +02:00
Sabri Ünal
1678ede2be Translated using Weblate (Turkish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/tr/
2024-07-20 02:38:56 +02:00
김인수
22cef109b9 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
2024-07-20 02:38:56 +02:00
mooo
eacc110590 Translated using Weblate (Lithuanian)
Currently translated at 96.6% (553 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/lt/
2024-07-20 02:38:56 +02:00
김인수
c3af288ab9 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
2024-07-20 02:38:56 +02:00
Matěj Valášek
3230a92540 Translated using Weblate (Czech)
Currently translated at 92.6% (530 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/cs/
2024-07-20 02:38:56 +02:00
Charles Lee
ea836fab31 Translated using Weblate (Chinese (Simplified) (zh_CN))
Currently translated at 94.7% (542 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/zh_CN/
2024-07-20 02:38:56 +02:00
김인수
ea0045e725 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
2024-07-20 02:38:56 +02:00
Temuri Doghonadze
0e862b4508 Translated using Weblate (Georgian)
Currently translated at 76.9% (440 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
2024-07-20 02:38:56 +02:00
Sergey A
3639b05767 Translated using Weblate (Russian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ru/
2024-07-20 02:38:56 +02:00
Temuri Doghonadze
d6b74207da Translated using Weblate (Georgian)
Currently translated at 76.7% (439 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
2024-07-20 02:38:56 +02:00
Yousef Alzahrani
5839e00127 Translated using Weblate (Arabic)
Currently translated at 11.7% (67 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ar/
2024-07-20 02:38:56 +02:00
Yousef Alzahrani
ee3c2499fa Added translation using Weblate (Arabic) 2024-07-20 02:38:56 +02:00
mooo
aa395c4094 Translated using Weblate (Lithuanian)
Currently translated at 96.1% (550 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/lt/
2024-07-20 02:38:56 +02:00
Temuri Doghonadze
2ad14f33d8 Translated using Weblate (Georgian)
Currently translated at 75.0% (429 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
2024-07-20 02:38:56 +02:00
Arun Raghavan
874a609959 json: Allow non-ASCII UTF-8 strings
Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1398
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/813>
2024-07-02 14:15:43 +00:00
Arun Raghavan
3b09ca3a15 echo-cancel: Fix multichannel processing
Missed the new parameters in the webrtc-audio-processing 1.0 move.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/823>
2024-06-25 15:35:42 -04:00
Mohamed Akram
c1990dd026 build-sys: Fix running on macOS
Ensure modules are built as .so files so that they are found by ltdl at
runtime.

Fix HAVE_COREAUDIO not being set on macOS leading to sound not working
in the default configuration.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/3808
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/817>
2024-05-01 21:54:17 +04:00
kwangshik.kim
6c77b0191a cli-command: Fix wrong condition check of pa_module_load
pa_module_load API's return value is integer which is
enum pa_error_code_t with minus such as -PA_ERR_IO
if the module loading is failed.
pa_cli_command_load gets a return value of pa_module_load
as pa_error_code_t which is wrong.
Minus integer value could not covert to enum which is defined
equal or larger than 0 so that pa_cli_command_load would
recognize the return value as larger than 0 if pa_module_load
return value (integer) is minus.

To fix this issue, I modified return value check logic
of pa_module_load API.
As same as pa_module_load's return type, integer would be used
to check if module load is failed in pa_cli_command_load
and the return value would be compared with minus.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/3801
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/814>
2024-04-05 09:31:47 -04:00
Arun Raghavan
84f5b742e3 tests: Don't run volume tests with impossible alignments
This worked so far somehow, but we were sending in some samples at
unrealistic alignments (given that pa_memblockq will be frame-aligned,
and we expect all operations to occur per-frame as well).

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/3803
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/812>
2024-03-22 11:17:35 -04:00
Arun Raghavan
21d7a63e8c build-sys: Add a wrap file for Orc
Makes building Orc as a subproject easier.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/811>
2024-03-22 08:53:46 -04:00
Martin Tournoij
5d7cd8bd0b Don't log battery level and dock status every minute
My log files get completely clobbered by this; thousands of lines of:

	Jan 18 18:14:44 pulseaudio[29946]: [pulseaudio] backend-native.c: Dock Status: undocked
	Jan 18 18:15:39 pulseaudio[29946]: [pulseaudio] backend-native.c: Battery Level: 50%
	Jan 18 18:15:39 pulseaudio[29946]: [pulseaudio] backend-native.c: Dock Status: undocked
	Jan 18 18:16:34 pulseaudio[29946]: [pulseaudio] backend-native.c: Battery Level: 50%
	Jan 18 18:16:34 pulseaudio[29946]: [pulseaudio] backend-native.c: Dock Status: undocked
	Jan 18 18:17:29 pulseaudio[29946]: [pulseaudio] backend-native.c: Battery Level: 50%
	Jan 18 18:17:29 pulseaudio[29946]: [pulseaudio] backend-native.c: Dock Status: undocked
	Jan 18 18:18:25 pulseaudio[29946]: [pulseaudio] backend-native.c: Battery Level: 50%
	Jan 18 18:18:25 pulseaudio[29946]: [pulseaudio] backend-native.c: Dock Status: undocked
	Jan 18 18:19:20 pulseaudio[29946]: [pulseaudio] backend-native.c: Battery Level: 50%
	Jan 18 18:19:20 pulseaudio[29946]: [pulseaudio] backend-native.c: Dock Status: undocked
	Jan 18 18:20:15 pulseaudio[29946]: [pulseaudio] backend-native.c: Battery Level: 50%

This seems like it should be a debug log, not a notice.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/810>
2024-03-18 23:44:09 +00:00
matoro
26ccd1167a tests: remove check2 timeouts in favor of meson
Meson already handles timeouts, configurable on the command line with
--timeout-multiplier.  They are set to 300s for all tests.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/807>
2024-01-30 12:39:47 -05:00
Alper Nebi Yasak
ed3d4f0837 alsa-ucm: Replace port device UCM context assertion with an error
The pa_alsa_ucm_set_port() function is passed both a mapping context and
a device port, and both of these refer to their respective UCM device.
While switching over to having one port per mapping per UCM device, I
expected both of these to be the same device struct, so added an assert
checking so.

This assertion gets triggered when we have multiple UCM verbs declaring
the same UCM device name. The root cause here is that the ports' UCM
device references are set once while creating the ports for the card, so
they happen to be those of a specific verb and may not match those from
a different UCM verb's profiles' mappings.

Solving the root cause necessitates a larger refactor. What we actually
assume here is that name of the UCM device is same for both the port and
the UCM context, which ends up always true in practice. For now, replace
the assert with a check and error.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/802>
2024-01-12 20:34:54 +00:00
Alper Nebi Yasak
f5cacd94ab alsa-ucm: Check UCM verb before working with device status
Some versions of the ALSA libraries run into a segmentation fault when
we query a UCM device/modifier status without first setting a UCM verb.
It's not a reasonable thing to do anyway, so check for this case and
return an error. Also do the check in other helpers.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/801>
2024-01-12 19:54:29 +00:00
Arun Raghavan
1f020889c9 Update NEWS for 17.0
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/805>
2024-01-12 12:22:09 -05:00
Hui Wang
d7dc04e8f5 backend-native: Handle multi AT commands in a buffer
When we connect Lenovo XT99 bt headset in the Ubuntu 22.04, this
headset could only work in A2DP profile, couldn't work in HFP profile
with a high chance.

This headset supports mSBC, after pulseaudio replies "+BCS:2" to
headset, we expect to receive a "AT+BCS=2\r" from the headset, but
with a high chance, it will receive 2 AT commands in a buffer like
this "AT+CHLD=?\rAT+BCS=2\r", and we also observed other 2 AT commands
in a buffer like this "AT+NREC=0\rAT+CGMI?\r".

Here we don't suppose there is only one AT command in a buffer, we
will find each command by the delimiter "\r" and handle each command
by sequence.

Signed-off-by: Hui Wang <hui.wang@canonical.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/804>
2024-01-05 23:12:18 +08:00
Igor V. Kovalenko
81a6cc4967 Fix crash running in restricted environment.
When `pwd.h` header is not available (i.e. not using glibc) and environment
variables are not set (e.g. running via `env --ignore-environment`) client
library would crash due to uninitialized variable in `pa_get_home_dir()`.
Add missing initialization to fix that.

Fixes: #3792
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/800>
2023-11-12 15:53:38 +03:00
Igor V. Kovalenko
06ccfbb996 memblockq: Adjust tail chunk offset into memblock after split
If pa_memblockq_push needs to write into the middle of a chunk, target chunk
is split into head and tail sharing the same memblock. Size of head and
tail chunks is adjusted correctly, head chunk pointer into memblock remains
unchanged from target chunk.

The problem is with tail chunk offset into memblock which should be advanced
past write region of memblock, but currently it is left as 0.

This is causing an issue where seeking a few frames back into the middle of
memblock and writing a frame there ends up with tail chunk referencing frames
from very beginning of memblock causing corrupted output from memblockq.

Fix this by adjusting tail chunk offset into memblock past write region and
add a test case.

Fixes #3789

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/798>
2023-10-25 13:21:34 +00:00
Igor V. Kovalenko
13ea94a1b6 shell-completion: Fix typo in --use-pid-file= suggestion
Fixes #3786

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/799>
2023-10-24 22:53:51 +03:00
Arun Raghavan
13ef02da1b build-sys: Bump webrtc-audio-processing wrap to 1.3
Minor pkgconfig fixup.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/797>
2023-09-05 11:32:53 -04:00
Arun Raghavan
6abe0c58d2 build-sys: Bump webrtc-audio-processing wrap to 1.2
Should make builds actually work now.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/795>
2023-09-01 11:21:29 -04:00
Arun Raghavan
63d38a6864 ci: Drop -werror in build
Can't rely on this while building abseil on older Ubuntu (or at all,
perhaps).

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/795>
2023-09-01 11:21:27 -04:00
Arun Raghavan
3e68ebf4ec ci: Add doxygen to build image
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/795>
2023-09-01 11:21:26 -04:00
Arun Raghavan
217c0e90ef ci: Force build of webrtc-aec
Makes sure we build this, either with system deps or the fallback wrap
file. We also bump the CI meson version to support [provide] in the
wrap file.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/795>
2023-09-01 11:21:15 -04:00
Arun Raghavan
9b37e8d9dc build-sys: Add a webrtc-audio-processing wrap file
This will make things easier on systems where this is missing, as well
as allow us to test things in CI until packages land in
Ubuntu/Fedora/...

The wrap file is taken as-is from the GStreamer project.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/795>
2023-09-01 11:21:12 -04:00
Arun Raghavan
e2b63d157f build-sys: Bump cpp_std to c++17
Match it with webrtc-audio-processing, which is what we care about.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/795>
2023-09-01 11:21:11 -04:00
Rudi Heitbaum
421cf15486 shm: allow for older versions of Linux without MFD_NOEXEC_SEAL
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/794>
2023-08-13 09:37:32 +00:00
김인수
eb302240cc Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:19 -04:00
Temuri Doghonadze
cb9b14c84b Translated using Weblate (Georgian)
Currently translated at 57.8% (331 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:19 -04:00
김인수
707c3b6864 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:19 -04:00
김인수
6ec914182d Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:19 -04:00
Temuri Doghonadze
43a543e84f Translated using Weblate (Georgian)
Currently translated at 50.6% (290 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Asier Sarasua Garmendia
e046e25b08 Translated using Weblate (Basque)
Currently translated at 2.4% (14 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/eu/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Asier Sarasua Garmendia
2dd87e4dd0 Added translation using Weblate (Basque)
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Sabri Ünal
51ce576c70 Translated using Weblate (Turkish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/tr/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Fran Diéguez
89be4c6cd6 Translated using Weblate (Galician)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/gl/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
grimst
a3445976af Translated using Weblate (French)
Currently translated at 85.3% (488 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/fr/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Temuri Doghonadze
6b8a6156b4 Translated using Weblate (Georgian)
Currently translated at 50.1% (287 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
mooo
e2e5161175 Translated using Weblate (Lithuanian)
Currently translated at 91.9% (526 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/lt/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Temuri Doghonadze
940346a51f Translated using Weblate (Georgian)
Currently translated at 48.0% (275 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Fran Diéguez
e3bf4223d2 Translated using Weblate (Galician)
Currently translated at 99.6% (570 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/gl/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Jan Kuparinen
d7806e93b7 Translated using Weblate (Finnish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/fi/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Toni Estevez
996c84d497 Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Temuri Doghonadze
7d66068eea Translated using Weblate (Georgian)
Currently translated at 47.5% (272 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Toni Estevez
01cca9fce7 Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Toni Estevez
7596337cac Translated using Weblate (Spanish)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Ettore Atalan
70b0f4e01a Translated using Weblate (German)
Currently translated at 94.9% (543 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/de/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
김인수
9b4625851b Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Philip Goto
105328fe14 Translated using Weblate (Dutch)
Currently translated at 99.1% (567 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/nl/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Temuri Doghonadze
39834c4052 Translated using Weblate (Georgian)
Currently translated at 44.5% (255 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
김인수
e6ffceb528 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Toni Estevez
97cf85940c Translated using Weblate (Spanish)
Currently translated at 99.8% (571 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/es/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Toni Estevez
262baea15d Translated using Weblate (Catalan)
Currently translated at 71.8% (411 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ca/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Temuri Doghonadze
0368430316 Translated using Weblate (Georgian)
Currently translated at 43.5% (249 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Jiri Grönroos
6f85dc39b1 Translated using Weblate (Finnish)
Currently translated at 93.3% (534 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/fi/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Jordi Mas
f778345cad Translated using Weblate (Catalan)
Currently translated at 71.5% (409 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ca/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Jordi Mas
b8e10711d6 Translated using Weblate (Catalan)
Currently translated at 71.1% (407 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ca/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Hugo Carvalho
58d784ace2 Translated using Weblate (Portuguese)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/pt/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Balázs Meskó
5736a00e44 Translated using Weblate (Hungarian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/hu/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/741>
2023-08-12 12:25:18 -04:00
Arun Raghavan
fec36f3508 build-sys: Bump .so version 16.99.1
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/793>
2023-08-12 16:22:10 +00:00
SimonP
095ad5f4f8 alsa-mixer: Respect XDG base directory spec when loading profile sets
Try $XDG_DATA_HOME, then $XDG_DATA_DIRS, and finally fall back to old behaviour.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/311>
2023-08-12 16:03:30 +00:00
Rudi Heitbaum
7d063d6544 shm: use MFD_NOEXEC_SEAL for shared memory
ref: https://lore.kernel.org/lkml/20221207154939.2532830-4-jeffxu@google.com/

The new MFD_NOEXEC_SEAL and MFD_EXEC flags allows application to
set executable bit at creation time (memfd_create).

When MFD_NOEXEC_SEAL is set, memfd is created without executable bit
(mode:0666), and sealed with F_SEAL_EXEC, so it can't be chmod to
be executable (mode: 0777) after creation.

when MFD_EXEC flag is set, memfd is created with executable bit
(mode:0777), this is the same as the old behavior of memfd_create.

Signed-off-by: Rudi Heitbaum <rudi@heitbaum.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/792>
2023-08-12 15:58:11 +00:00
Arun Raghavan
84c53066c6 build-sys: Bump webrtc-audio-processing dependency
The package name and versioning are changing upstream, so prepare for
that.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/395>
2023-05-25 18:41:19 -04:00
Eero Nurkkala
22bbb5b3ba echo-cancel: add webrtc AEC3 support
Drop a number of now unsupported features, and add new parameters for
pre-/post-amplification.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/395>
2023-05-25 18:40:13 -04:00
Arun Raghavan
b16b107171 echo-cancel-test: Drop references to internal message queue
We don't actually initialise or use it in the test, and this just causes
a crash at the end.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/395>
2023-05-25 18:39:22 -04:00
Gioele Barabucci
e96d278bfc daemon/meson.build: Install dbus policy in /usr, not /etc
From https://bugs.debian.org/1006631:

> dbus supports policy files in both `/usr/share/dbus-1/system.d` and
> `/etc/dbus-1/systemd`. [The] recently released dbus 1.14.0, officially
> deprecates installing packages' default policies into `/etc/dbus-1/systemd`,
> instead reserving it for the sysadmin. This is the same idea as the
> difference between `/usr/lib/udev/rules.d` and `/etc/udev/rules.d`.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/783>
2023-04-21 20:10:24 +00:00
Arun Raghavan
c8af4920f7 ci: Use built-in distribution image name mechanism
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/789>
2023-04-21 16:04:14 -04:00
Arun Raghavan
39ff05e96d ci: Update to freedesktop/ci-templates
The upstream repo changed quite some time ago.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/788>
2023-04-21 15:40:17 -04:00
Georg Chini
86e9c90128 pactl, pacmd: Allow to unset the configured default sink or source
Currently there is no way to unset the default sink or source once it was
configured manually by the user.
This patch introduces the special name @NONE@, which can be used with the pacmd
or pactl set-default-sink and set-default-source commands to unset the user
configured default. When the default is unset, pulseaudio will return to the
standard default sink or source selection mechanism based on priority.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/785>
2023-03-25 20:55:48 +00:00
Weijia Wang
25bfdb3ab8 echo-cancel: Fix macOS build
Signed-off-by: Weijia Wang <contact@weijia.wang>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/786>
2023-03-22 20:09:38 +02:00
Hector Martin
3e038c6d88 alsa: ucm: Fix spurious mixer path removal on initial profile set
The code that removes the mixer path if probing fails can be called in
the path that sets a non-off device profile on hotplug *before*
card->active_profile is updated, which results in spuriously removing
the mixer path. By this point, context->ucm->active_verb would be set
to the same as the profile name, so we can use that instead to avoid
the issue.

On Apple Silicon machines with the UCM profiles in the Asahi Linux repo,
this manifests as the headphones jack having hardware volume controls
*only* if PA is started with headphones connected and until they are
disconnected. Hotplugs end up triggering the bad codepath, and it falls
back to software volume (which is particularly a problem when the
hardware volume happens to be very low or 0 at that point).

Fixes: a9cc1373e2 ("alsa: ucm - update the mixer path also after volume probe")
Signed-off-by: Hector Martin <marcan@marcan.st>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/752>
2023-03-19 21:22:32 +00:00
Alper Nebi Yasak
7005eafee3 alsa-ucm: Fix more instances of profile-verb conflation
The ucm_get_device_property() function adds to each UCM device's
playback_volumes (or capture_volumes) hash map an associated volume
mixer keyed with the UCM verb. These key-value pairs are then iterated
over in various places which assume the key is a profile name. This
assumption is no longer true since we can generate multiple profiles to
use conflicting devices.

A previous commit 4527890416 ("alsa-ucm: Stop conflating profile name
with UCM verb name") fixes some instances of this assumption, but misses
the relation explained above. Fix more instances of misleading
"profile"s where the UCM verb name is actually meant.

Fixes: 4527890416 ("alsa-ucm: Stop conflating profile name with UCM verb name")
Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/771>
2023-03-19 21:09:00 +00:00
Alper Nebi Yasak
45509ff9bc alsa-ucm: Consider devices using the same PCM as incompatible
Although it's a valid UCM configuration to have multiple devices using
the same PlaybackPCM or CapturePCM, it's unclear how PulseAudio should
handle the cases where multiple of these devices are enabled. Some
options I can think of are:

- Merge all devices sharing the same PCM into the same mapping, open
  only one PCM substream for this mapping, and add 'combination ports'
  that enable combinations of the devices. This has been the case until
  recently, although the combination port logic was broken. A problem
  with this is that we can't independently control device volumes. We
  most likely cannot use hardware volumes either.

- Have one mapping for each device in the same profile, and open one PCM
  substream for each mapping. This is the current state, and it fails
  when there are fewer substreams than devices. Otherwise it works, but
  it's still confusing, as sound directed to a device-specific mapping
  might end up playing at multiple devices.

- Make multiple profiles each with combinations of upto-substream-count
  devices, and have one mapping/substream per device. This still causes
  the confusion mentioned above. And it's likely that the substream
  count will almost always be one, where this case degenerates into the
  last one.

- Have one mapping for each device in the same profile, but open only
  one PCM substream. I assume this is possible with software mixing, but
  it is still confusing like the above, and probably less performant.

- Generate multiple profiles each with one of the shared-PCM devices,
  again with one mapping/substream for that one device. The trade-off
  with this is that we can't use multiple of these devices at the same
  time. However, this doesn't have the output device confusion,
  combination port's volume problems, or the substream count limitation.

This patch takes a short-cut to achieve the last option, by considering
shared-PCM devices implicitly conflicting with each other.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/743>
2023-03-19 20:54:18 +00:00
Alper Nebi Yasak
b74269016c alsa-ucm: Disable old modifiers when switching profiles of same verb
While switching profiles of the same UCM verb, existing code first
disables devices that are only on the first profile to avoid conflicts.
However, it only disables devices, not modifiers. Even worse, modifiers
which have PlaybackPCM/CapturePCM are incorrectly treated as devices and
result in a segmentation fault.

Check what we are disabling, and call the appropriate disable function
for both devices and modifiers. Modifiers are disabled before devices,
because _dismod calls fail when the modifier's supported devices are
disabled.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/742>
2023-03-19 20:51:00 +00:00
Alper Nebi Yasak
b382a00f8b alsa-ucm: Add enable, disable, status helpers for modifiers
These are mostly the same as the device helpers added in c83b345169
("alsa-ucm: Add enable, disable, status helpers for devices"), but for
modifiers instead.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/742>
2023-03-19 20:51:00 +00:00
Georg Chini
3aaeb5113d switch-on-connect: Do not overwrite user configured default sink/source
Currently module-switch-on-connect overwrites the default sink or source that
the user has configured. This means that when the overwritten default sink or
source becomes unavailable, the new default will be chosen based on priority
and the default will not return to the originally configured value.
This patch solves the issue by introducing new core variables for the sink
or source chosen by the policy module which have higher priority than the
user configured defaults.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/784>
2023-03-16 20:19:39 +00:00
Biswapriyo Nath
39b6a4c123 meson: Add DEF file to export APIs in Windows
This helps to export correct APIs for compiler toolchain which
does not support version script file. For example, mingw clang.
The APIs in libpulse.def are similar with map-file except those
are in pulse-simple and pulse-mainloop-glib. Those are exported
in different shared library in Windows platform.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/761>
2023-03-16 13:05:44 +05:30
Igor V. Kovalenko
15e76a69bf memblockq: Drop check for chunk index alignment, require aligned length
There is no requirement for chunk index to be aligned, we only need chunk length
to be multiple of sample frame size.

Fixes: 6434853b0 ("memblockq: Do not allow non-frame indices in the memblock queue")
Fixes: 22827a5e1 ("protocol-native: Fail if trying to push unaligned memblock into queue")
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/779>
2023-02-26 19:42:03 +00:00
Igor V. Kovalenko
5ab2b9cb0e 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>
2023-02-25 12:00:38 +00:00
Igor V. Kovalenko
aed52c507f 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>
2023-02-25 12:00:38 +00:00
Ataberk Özen
b8e2198d34 alsa-profiles: rename mappings for Xonar SE
Remove descriptions as well.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/754>
2023-02-20 18:37:36 +03:00
Ataberk Özen
9e85059c64 alsa-profiles: import Asus Xonar SE profile from pipewire
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/754>
2023-02-20 15:33:36 +00:00
Igor V. Kovalenko
300db77922 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>
2023-02-10 12:45:48 +00:00
Igor V. Kovalenko
5830e03036 bluetooth: Do not attempt decoding too short faststream packet data
Looks like sbc_decode() would seldom access more than specified input length
bytes from input buffer if input length is less than expected frame size.

Fix potential access past allocated memory by checking if input contains
complete frame before calling sbc_decode()

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/781>
2023-02-10 00:25:11 +03:00
Alistair Leslie-Hughes
5cefef591e rtp-recv: Use getaddrinfo to improve support for ipv6.
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/774>
2023-02-08 20:50:48 +00:00
Alistair Leslie-Hughes
f44cb36374 rtp-send: Use getaddrinfo to improve support for ipv6 on source address
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/774>
2023-02-08 20:50:48 +00:00
Igor V. Kovalenko
1cfa737823 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>
2023-02-08 20:43:52 +03:00
Georg Chini
6ae3961001 tunnel-sink-new: Fix hang when used in combination with module-combine-sink
When tunnel-sink-new was used in combination with module-combine-sink, PA
would hang because the main thread was blocked waiting for the execution
of the latency snapshot message. The message would never be processed
because the rtpoll associated with the control_inq of module-combine-sink
was never run.
This patch fixes the problem by running the rtpoll in the thread function
to process incoming messages. Though there are no users of the rtpoll for
module-tunnel-source-new, the same change is applied there.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/773>
2023-02-07 09:25:48 +00:00
Igor V. Kovalenko
3e5db72ab7 bluetooth: Amend writeout to send more initial frames
When bluetooth transport has both both sink and source, pulseaudio would
synchronize writing out frames with reading frames from peer to make fair
schedule of reads and writes. Pulseaudio allows two blocks of data to be sent to
peer before synchronizing writes with reads just in case that peer implements
similar write schedule.

It could happen that first blocks are still missed by peer, which would cause
pulseaudio writes to stall waiting for first frames from peer.

Fix this by allowing more data frames out until data from peer is actually
received.

Closes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1424
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/777>
2023-02-06 18:55:47 +00:00
Igor V. Kovalenko
86c5fbab57 alsa-util: Add more standard sample rates.
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/776>
2023-02-06 18:48:56 +00:00
Igor V. Kovalenko
8152f39603 alsa-util: Dump probed rates
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/775>
2023-02-06 18:09:30 +03:00
Alistair Leslie-Hughes
f8b9010582 rtp-send: Use getaddrinfo to improve support for ipv6.
inet_pton isn't guarantee to support IPV6 address when a scope has been specified.

Using getaddrinfo instead, we can safely pass through INET6+scope and have it translated
to a usable address.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/766>
2023-01-21 10:10:02 +00:00
Georg Chini
6473e9ed0e stream-interaction: Fix regression when a trigger role is also a cork role
If the same role is named in trigger_roles and cork_roles, a stream with that
role will crash PA. This patch fixes the crash and re-introduces the old
behavior, so that for example specifying trigger_roles=alarm, phone and
cork_roles=alarm, multimedia means that a phone stream will cork alarm and
multimedia streams while an alarm stream will only cork multimedia streams.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/767>
2023-01-21 10:06:57 +00:00
Georg Chini
94dd7b4b7b stream-interaction: Extend trigger groups to module-role-cork
For module-role-ducking, trigger and ducking groups were introduced some years
ago. This patch extends the functionality to module-role-cork, so that trigger
and cork roles may now contain "/" separated groups.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/767>
2023-01-21 10:06:57 +00:00
Igor V. Kovalenko
33129c88dc backend-native: Fix parsing comma-delimited response
Incoming RFCOMM string has extra end-of-command terminating character which
breaks both AT+BIA= and AT+BAC= parsers which only expect a comma.

This leads to error parsing last element of response in both cases and could
prevent detecting mSBC availability if mSBC codec id comes last, e.g. AT+BIA=1,2

Fix this by additionally checking for delimiters in both parsers.

Fixes: 3c63f8e6d ("backend-native: Fix stack corruption reading RFCOMM AT+BIA= response")
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/768>
2023-01-19 21:38:05 +03:00
flyingOwl
c3eae5d00c time-smoother-2: Fix time calculation by comparing timestamps
This fixes the rare case of resume_time being bigger than time_stamp. Which
happens sometimes when a gstreamer client is quickly seeking through a
media file. The resulting integer underflow then causes a huge value in
current_time which will break the playback.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/764>
2022-12-30 00:16:03 +01:00
Alistair Leslie-Hughes
96bd4e57b5 pulsecore: Set errno before calling read
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/759>
2022-12-14 13:29:20 +11:00
Mart Raudsepp
89ce6321bd proplist-util: Don't assume gdkx is there as gtk could be built without it
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/757>
2022-12-10 09:01:58 +00:00
Shunsuke Shimizu
47a6918739 build-sys: Fix macOS build
* Enable macOS specific modules (module-bonjour-publish,
  module-coreaudio-detect and module-coreaudio-device)
* Correctly set `PA_SOEXT` (.so, .dylib and .dll)
* Build `poll-posix.c` and `semaphore-osx.c`
* Drop linker flag `-Wl,-z,nodelete` on Darwin
* Drop linker flag `-Wl,--no-undefined` on Darwin
* Prefer to `clock_gettime` over compat impl for old Darwin
* Disable SCM credential on Darwin

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/746>
2022-12-07 10:57:01 +00:00
Alistair Leslie-Hughes
e4517da353 pactl: Stop a crash when setting the volume which is out of range
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/758>
2022-12-06 18:37:33 +11:00
Igor V. Kovalenko
0cbbc408ae module-combine-sink: Suspend while unloading to fix crash moving sinks
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/756>
2022-11-27 22:47:30 +03:00
Igor V. Kovalenko
37c72c2072 module-combine-sink: Do not set up rate adjustment timer at load time
Rate adjustment timer is set up when combine sink is resumed and relased when
combine sink is suspended. Do not create this timer again while module is loaded
to prevent duplicate effort causing assertion in time_callback.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/756>
2022-11-27 22:31:51 +03:00
Igor V. Kovalenko
3c63f8e6dc backend-native: Fix stack corruption reading RFCOMM AT+BIA= response
On-stack buffer size is too short for sscanf to read AT+BIA= and AT+BAC=
response strings which have variable length.

Fix this by replacing sscanf with proper copy of input string.

Fixes: cca0d6937 ("bluetooth: add AT+BIA support")
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/755>
2022-11-26 17:01:08 +03:00
Alistair Leslie-Hughes
e650c2b33e Ensure fds are closed when exec functions are used.
When usng shm_open, FD_CLOEXEC is set explicitly.

However when using memfd_create, we must pass the MFD_CLOEXEC flag
to ensure the same fcntl value (FD_CLOEXEC) is set.

Fixes #1394

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/751>
2022-11-24 21:58:53 +00:00
Wim Taymans
3349e1c471 sndfile: handle sndfiles with s24 format
Samples with s24 format should be read with the readf_int read
function instead of the raw function.

This fixes playback of flac/wav with s24 sample format.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/750>
2022-11-10 17:13:58 +01:00
Alistair Leslie-Hughes
3f9455411c Propagate return value from pa_pstream_attach_memfd_shmid
Using wine,
The mmap call in shm_attach sometimes fails with ENOMEM which isn't propagated
up the call stack.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/747>
2022-10-19 08:06:46 +11:00
Igor V. Kovalenko
f2b748e851 bluetooth: Add 20dB boost for faststream source volume
Some devices unexpectedly return stereo backchannel stream with wrong frequency,
and volume of backchannel stream appears too low.

If this happens, boost source volume by 20dB.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/628>
2022-10-17 09:07:09 +03:00
Igor V. Kovalenko
76e01b25f5 bluetooth: Handle fragmented faststream frames
Incoming frames can span multiple packets, add support for this.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/628>
2022-10-17 09:07:09 +03:00
Igor V. Kovalenko
697a1a309a bluetooth: Use stereo sample spec for faststream backchannel
Faststream backchannel decoder does not know whether incoming stream is mono or
stereo before first packet is decoded, and some devices return stereo stream.

As it is not easy to change source sample spec after source is created, use
stereo sample spec always and perform conversion if mono stream is found.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/628>
2022-10-17 09:07:09 +03:00
Igor V. Kovalenko
cddb9f144a bluetooth: Add faststream codec
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/628>
2022-10-17 09:07:09 +03:00
Igor V. Kovalenko
0498e7a3d0 bluetooth: Do not use hardware volume control for A2DP backchannel
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/628>
2022-10-17 09:07:09 +03:00
Igor V. Kovalenko
48f40352a6 bluetooth: Free memblock after codec errors
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/628>
2022-10-17 09:07:09 +03:00
acheronfail
45df212d66 pactl: SUBSCRIBE add a newline after every json message
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/748>
2022-09-27 08:58:50 +00:00
wael
68a0603d76 meson: use proper type for bools
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/749>
2022-09-21 07:06:45 +00:00
Georg Chini
8fe50bbc31 time-smoother-2: Fix stream time when stream starts paused
When a stream is started but has not yet called smoother_2_put(), pa_smoother_2_get()
returns the time since the start of the stream even if the stream was started paused.
When the stream is started paused, pa_smoother_2_get() should return 0 instead. This
patch fixes the problem.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/745>
2022-08-25 08:11:04 +02:00
Marijn Suijten
8188b49bed backend-native: Remove uninformative "Profile unavailable" debug message
This message would print for all transports while not even conveying
the profile of the transport, and might be printed for non-`HFP_HF`
profiles which is the only transport-profile we're interested in.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/740>
2022-08-16 08:16:24 +03:00
Marijn Suijten
518ca03019 backend-native: Update all CIND indicators
When `indicator` is initialized to `1`:
- it always succeeds the `indicator == CIND_CALL_INDICATOR` check;
- hence always calls `continue`;
- hence never reaches the end of the `while` loop where `indicator++` is
  called;
- hence `indicator` never contains any other value than `1` meaning
  `cind_enabled_indicators` is ever updated.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/740>
2022-08-16 08:16:24 +03:00
Marijn Suijten
6ec084e2b3 Revert "bluez5-util: move pa_bluetooth_discovery to header"
This reverts commit b05e34e092.

Now that backend-native uses a different way to get to its own
`native_backend` instance - without going through
`pa_bluetooth_discovery` - this patch can be reverted again, as nothing
outside bluez5-util is supposed to know the internals of this struct.
That's what the many functions are for which all take pointers to this
(at that point) opaque struct instead.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/740>
2022-08-16 08:16:24 +03:00
Marijn Suijten
391dac58a9 backend-native: Add backend pointer to transport_data
This removes the inverse/recursive dependency of backend-native on the
`pa_bluetooth_discovery` struct, which is supposed to be opaque outside
of `bluez5-util` in favour of the many accessor functions defined in
`bluez5-util.h`.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/740>
2022-08-16 08:16:15 +03:00
Marijn Suijten
c6bd6656a2 backend-native: Fix indentation and whitespace style
Replace tabs with spaces, remove trailing whitespace, remove bracing
around single-line `if` blocks.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/740>
2022-08-16 08:13:46 +03:00
Yureka
de8b0c1124 Make gio-2.0 optional when gsettings is disabled
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/654>
2022-08-15 14:42:54 +00:00
Fabrice Fontaine
c789bc5fe3 meson.build: fix build without C++
Fix the following build failure without C++:

../output-1/build/pulseaudio-16.1/meson.build:1:0: ERROR: Unknown compiler(s): [['/home/autobuild/autobuild/instance-1/output-1/per-package/pulseaudio/host/bin/powerpc64-buildroot-linux-gnu-g++']]
The following exception(s) were encountered:
Running "/home/autobuild/autobuild/instance-1/output-1/per-package/pulseaudio/host/bin/powerpc64-buildroot-linux-gnu-g++ --version" gave "[Errno 2] No such file or directory: '/home/autobuild/autobuild/instance-1/output-1/per-package/pulseaudio/host/bin/powerpc64-buildroot-linux-gnu-g++'"

Fixes:
 - http://autobuild.buildroot.org/results/6526a21bd4da3b8458188f27c1ec04c381e4b673

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/737>
2022-08-15 17:37:10 +03:00
Dylan Van Assche
1b031ecee6 bluetooth: hook up UPower backend
Hook up the UPower backend to backend-native to report
the host battery level to the HF.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/631>
2022-08-01 19:16:25 +00:00
Dylan Van Assche
3621731050 bluetooth: add UPower backend
UPower provides information about the power supply and battery
level of the host. Add a backend to retrieve the host battery level.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/631>
2022-08-01 19:16:25 +00:00
Dylan Van Assche
cca0d69375 bluetooth: add AT+BIA support
AT+BIA is used to enable/disable CIND indicators by Bluetooth HFP spec.
By default, all indicators are enabled on connection.
AT+BIA will configure which indicators should be disabled then,
the disabled indicators may be enabled later on again with AT+BIA.
When the connection is lost and recovered, all indicators are enabled
again. The HF will reconfigure the indicators again with an AT+BIA
command.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/631>
2022-08-01 19:16:25 +00:00
Dylan Van Assche
b05e34e092 bluez5-util: move pa_bluetooth_discovery to header
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/631>
2022-08-01 19:16:25 +00:00
Rosen Penev
ff6010b80f meson: fix meson warnings
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/739>
2022-08-01 19:08:41 +00:00
hashitaku
ffbcf36854 shell-completion: add new subcommand get-* for zsh
Added to shell-completion of zsh as there is no completion for the subcommand get-*.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/735>
2022-08-01 18:34:25 +00:00
hashitaku
9f725cafb8 shell-completion: add new subcommand get-* for bash
Added to shell-completion of bash as there is no completion for the subcommand get-*.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/735>
2022-08-01 18:34:25 +00:00
Temuri Doghonadze
dc027d69e8 Translated using Weblate (Georgian)
Currently translated at 43.5% (249 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/736>
2022-07-22 15:18:58 +02:00
Joachim Philipp
9337d4b5b5 Translated using Weblate (German)
Currently translated at 94.9% (543 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/de/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/736>
2022-07-22 15:18:58 +02:00
Temuri Doghonadze
15f242aee5 Translated using Weblate (Georgian)
Currently translated at 43.5% (249 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/736>
2022-07-21 14:42:18 +02:00
김인수
dbe455ce95 Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/736>
2022-07-18 17:19:12 +02:00
Temuri Doghonadze
932b72f417 Translated using Weblate (Georgian)
Currently translated at 29.8% (171 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ka/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/736>
2022-07-18 17:19:12 +02:00
Gogo Gogsi
0f6234e320 Translated using Weblate (Croatian)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/hr/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/736>
2022-07-18 17:19:12 +02:00
Peter Meerwald-Stadler
9360dce76d raop-client: Fix typo
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/733>
2022-07-18 14:47:38 +00:00
Peter Meerwald-Stadler
e8509ea85c volume: Fix typo
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/733>
2022-07-18 14:47:38 +00:00
Peter Meerwald-Stadler
f71eafe4d9 module-tunnel: Fix typos
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/733>
2022-07-18 14:47:38 +00:00
Peter Meerwald-Stadler
63d0db832c module-combine-sink: Fix indentation
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/733>
2022-07-18 14:47:38 +00:00
Peter Meerwald-Stadler
0b4af61ee7 module-combine-sink: Use fabs() instead of abs() for double
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/733>
2022-07-18 14:47:38 +00:00
Igor V. Kovalenko
07a9fcefba build-sys: meson: Move qpaeq to daemon build
Equalizer control requires server modules only available when daemon is built.
Move qpaeq script to be installed together with daemon.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/734>
2022-07-18 14:03:45 +00:00
Nicolas Cavallari
baa3d24b76 build-sys: Add missing libatomic_ops dependencies
Add libatomic_ops dependencies to libraries/modules that showed a
failure on an arch that does not have native atomic operations support.

Not all optional dependencies were tested, so it is possible that
some optional modules are still missing libatomic_ops dependencies.

Signed-off-by: Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/732>
2022-07-18 13:59:14 +00:00
Nicolas Cavallari
fd81201f28 build-sys: Fix atomic support detection
Attempting to use atomics operations on an architecture that does not
support them generally results in a link error:

ld: /tmp/ccjYcMPP.o: in function `func':
testfile.c:(.text+0x1c): undefined reference to `__sync_bool_compare_and_swap_4'

The current build system uses cc.compiles() to check if atomic ops are
supported, but cc.compiles() does not attempt to link, so the test fails
to enable libatomics_opts.

Fix this by using cc.links() instead of cc.compiles().

Signed-off-by: Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/732>
2022-07-18 13:59:14 +00:00
Jaroslav Kysela
81a051089f alsa-mixer: extend pa_alsa_mixer_find with the subdevice check
The full identifier check must be executed for the new melem
creation, otherwise the duplicate control element code check
is reached.

Example (using the snd-aloop driver):

numid=56,iface=PCM,name='PCM Notify',device=1,subdevice=1
numid=62,iface=PCM,name='PCM Notify',device=1,subdevice=2

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/730>
2022-07-18 13:51:33 +00:00
Jaroslav Kysela
d1675df0cd alsa-mixer: fix the re-attach code for the mixer control element
The new helem must be tracked and old helem must be cleared
to make the code work properly. Introduce the pointer to helem
as the private value for melem and add the necessary code.

Also, add a check for the duplicate mixer elements. The duplicate
mixer element invokes the abort check in alsa-lib. Print a warning
instead and handle the exit gracefully.

Fixes: def8eb074 ("alsa-mixer: allow to re-attach the mixer control element")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/730>
2022-07-18 13:51:33 +00:00
Jaroslav Kysela
eb870fcba9 alsa-ucm: remove extra space from the device.intended_roles property
Before:
  device.intended_roles = " voice"

After:
  device.intended_roles = "voice"

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/731>
2022-06-29 17:03:46 +02:00
Alper Nebi Yasak
5dd411190d alsa-ucm: Create multiple profiles per verb for conflicting devices
Right now we try to add all UCM devices of a verb to a single profile.
But if some devices using different PCMs are configured as conflicting
with one another, we will only be able to utilize one of them, chosen
seemingly based on the order in the UCM config file.

This is not a problem with conflicting devices sharing a PCM, as they
are assigned to the same mapping and the ports mechanism only enables
one of them to be active at a time.

To utilize all devices in a UCM verb even when there are conflicting
devices using different PCMs, calculate subsets of devices which
can be simultaneously used and create a profile for each such set.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:15:08 +03:00
Alper Nebi Yasak
e49da7bcd6 alsa-ucm: Disable old devices when switching profiles of same verb
While switching profiles, it was enough to switch UCM verbs since that
disables all enabled UCM devices and every profile had a distinct verb.
However, switching to the current verb does not disable any devices.

To support multiple profiles for a verb we need to explicitly disable
the old profile's devices, since they might be conflicting with the new
profile's devices and will prevent them from being enabled. Compare both
profiles' mappings, and disable the devices not in the new mappings.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:15:08 +03:00
Alper Nebi Yasak
4821a0569e alsa-ucm: Make mapping UCM contexts have only one modifier
After previous patches, we should be generating no combination ports, so
we don't need to store multiple modifiers per mapping. Simplify the code
based on this.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:15:08 +03:00
Alper Nebi Yasak
084d70a1e2 alsa-ucm: Make mapping UCM contexts have only one device
After previous patches, we should be generating no combination ports, so
we don't need to store multiple devices per mapping. Simplify the code
based on this.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:15:07 +03:00
Alper Nebi Yasak
bf1708213b alsa-ucm: Make ports store only one device
After previous patches, we should be generating no combination ports, so
we don't need to store multiple devices per port. Simplify the code
based on this.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:12:37 +03:00
Alper Nebi Yasak
0789a8fb76 alsa-ucm: Remove combination port generation logic
A previous commit makes mapping names depend on the UCM device name.
Since UCM device names are unique, this means a mapping will at most
have one port and thus no combination ports can be generated.

This removes the dead code in the pa_alsa_ucm_add_ports_combination()
function, unrolls the remaining code in its helper functions that it
used, and renames it to pa_alsa_ucm_add_port() to signal that it no
longer generates combinations.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:56 +03:00
Alper Nebi Yasak
a50330a4a5 alsa-ucm: Make one input/output mapping per UCM device
PulseAudio combines UCM devices that have the same PlaybackPCM or
CapturePCM value into a single mapping with multiple ports. It also
creates ports in the same mapping for each valid combination of those
UCM devices.

Since mappings are the things we put in profiles, we can put in a
profile either all devices of a joint mapping or none of them. This
causes some complications with device conflicts. For example, a
different UCM device might be marked as conflicting with some (but not
all) of the devices in a joint mapping. In this case we can do one of
three things:

- Include all devices in one profile, and hope the conflicting device
  isn't chosen as the mapping's active port. We shouldn't do this as it
  puts conflicting devices in the same profile.

- Make one profile with the joint group, and one with the other device.
  This is somewhat acceptable as we have no conflicts, but we sacrifice
  some compatible combinations of devices.

- Do not group the devices into the same mapping, and make one profile
  for each compatible combination of devices. This appears to be the
  best option, one where we can always have the maximum number of
  working devices.

This patch chooses the third option and makes one input and/or output
mapping per UCM device, by using UCM device names instead of PCM device
strings in the mapping names.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:56 +03:00
Alper Nebi Yasak
e8e2f4320c alsa-ucm: Split out helpers for device set name, description, priority
Combination port logic calculates some useful properties for device
groups that we could reuse while generating multiple profiles to support
conflicting devices. Split them into their own functions.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:56 +03:00
Alper Nebi Yasak
5245117781 alsa-ucm: Fix device conformance check
Right now this check is rejecting devices whose UCM config specifies
neither a conflicting device nor a supported device list, and accepting
devices which specify both. However, a device without neither list is
actually unrestricted, and a device with both lists is a configuration
error. Fix the check to accept the former.

Furthermore, this is missing another case where an already selected
device might have a supported devices list that doesn't have the
candidate device. Make this function also check against that, and also
make it accept devices already in the set.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:56 +03:00
Alper Nebi Yasak
0f26022843 alsa-ucm: Rewrite conformant device group generation with idxsets
The existing code meant to generate device groups for combination ports
is tightly coupled to port creation. Similar functionality would be
useful to generate nonconflicting device groups for multiple profiles as
well, so this tries to rewrite it into a more reusable state.

Several things (e.g devices, mapping contexts) use idxsets to store a
device selection. This also switches this conformance check and device
group generation to using idxsets to make it easier to work with those,
with the eventual aim to unify device group representations.

Also try to adjust users of these functions to use idxsets these will
need/return, without causing too much interference.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:56 +03:00
Alper Nebi Yasak
638574c0b7 alsa-ucm: Split profile creation into verb and profile parts
To support having multiple profiles per UCM verb, split the profile
creation into two parts based on whether they should run once for each
verb or for each profile (maybe multiple times per verb).

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:55 +03:00
Alper Nebi Yasak
aa5ced3887 alsa-ucm: Make mapping creation independent from indvidual profiles
The ucm_create_mapping() function is not idempotent. It looks like it
was meant to be called once per device for the devices of a UCM verb
and takes a profile argument simply because a verb has generated a
single profile so far.

Make sure creating mappings per device and adding those mappings to the
profiles happens as separate steps to make it easier to split UCM verbs
and profiles as concepts.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:20 +03:00
Alper Nebi Yasak
4527890416 alsa-ucm: Stop conflating profile name with UCM verb name
So far each profile had the exact name as their associated UCM verb,
which caused the one to be used where the other should have been.
Explicitly get and use the verb name where that was intended, and make
sure things about profiles aren't named after verbs.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:11:17 +03:00
Alper Nebi Yasak
9fc7064b9a alsa-ucm: Let profiles know their associated UCM verb
Currently each UCM verb generates one profile named the same as the
verb, meaning it's trivial to know which verb the profile belongs to.
This will be slightly harder to do when we generate multiple profiles
per UCM verb (e.g. to make use of conflicting devices).

It would still be possible to parse the profile name to get the UCM
verb, but instead let's keep track of the struct instance representing
the profile's associated verb. This also lets us remove a block of code
searching for the verb by its name.

Co-authored-by: Jaroslav Kysela <perex@perex.cz>
[Alper: Reused Jaroslav's UCM profile context changes for UCM verb
instead of combined devices.]

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:10:26 +03:00
Jaroslav Kysela
880ff393f1 alsa-ucm: Set profiles by their struct instance, not their name
While switching profiles, it's possible that we will want to do more
work besides switching UCM verbs. The alsa-card module already has our
profiles as structs, but passes in only the names instead of the entire
struct. Make things work with the struct instead, so we can add other
things (like a UCM context) to it and use those here.

Co-authored-by: Tanu Kaskinen <tanuk@iki.fi>
[Alper: Split into its own commit and integrated Tanu's snippet.]

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Alper Nebi Yasak
c83b345169 alsa-ucm: Add enable, disable, status helpers for devices
Right now manipulating device status is done inline once while setting a
port. However, we will need to reuse this code to disable conflicting
devices of a device we want to enable. Split it into enable and disable
helper functions.

There is another issue with the device enable logic, where trying to
disabling an already disabled device sometimes fails. To avoid that,
implement a status helper and check if the device we want to enable is
already enabled/disabled before trying to do so.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Alper Nebi Yasak
9b06e8fef4 alsa-ucm: Make modifiers track conflicting/supported devices as idxsets
Modifiers currently keep their conflicting and supported devices's
names, and these names are resolved to devices every time we need to use
them. Instead, resolve these device names while creating the modifier
struct and keep track of the resulting device structs in idxsets, same
as how device structs keep track of their support relations.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Alper Nebi Yasak
d8c89de24d alsa-ucm: Always create device conflicting/supported device idxsets
This is intended to make the current and upcoming code a bit clearer, as
we won't need to constantly check for the existence of these idxsets
before using or operating on them.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Alper Nebi Yasak
97d9c28579 idxset: Add reverse iteration functions
Add complementary functions to the existing idxset iterate(),
steal_first(), first(), next() functions that work in the reverse
direction: reverse_iterate(), steal_last(), last() and previous().

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Alper Nebi Yasak
ec668ac44b idxset: Add set comparison operations
Add isdisjoint(), issubset(), issuperset() and equals() functions that
element-wise compare two idxsets.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Alper Nebi Yasak
fb63e58931 idxset: Add set contains() function
This is functionally equivalent to get_by_data(s, p, NULL) == p, but
with a more obvious name and form because some existing code is instead
manually iterating through idxsets to check for existence of an item.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak@gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/596>
2022-06-28 15:08:45 +03:00
Jaroslav Kysela
def8eb074e alsa-mixer: allow to re-attach the mixer control element
It may be possible that the ALSA control element appears
again. Allow this combination by checking, if the pulseaudio
mixer element already exists. Do not create the duplicate
mixer element in this case.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/729>
2022-06-27 22:23:45 +03:00
Takashi Sakamoto
4bdf4c9966 alsa-mixer: avoid assertion at alsa-lib mixer API when element removal
PulseAudio v5.99 or later hits assertion at alsa-lib mixer API due to
wrong handling of removal event for mixer element.

pulseaudio: mixer.c:149: hctl_elem_event_handler: Assertion `bag_empty(bag)' failed.

The removal event is defined as '~0U', thus it's not distinguished from
the other type of event just by bitwise operator.

At the removal event, class implementator for mixer API should detach
mixer element from hcontrol element in callback handler since alsa-lib
has assertion to check the list of mixer elements for a hcontrol element
is empty or not after calling all of handlers. In detail, please refer to
MR to alsa-lib:

 * https://github.com/alsa-project/alsa-lib/pull/244

This commit fixes the above two issues. The issue can be regenerated by
`samples/ctl` Python 3 script of alsa-gobject.

 * https://github.com/alsa-project/alsa-gobject/

It adds some user-defined elements into sound card 0. When terminated by
SIGINT signal, it removes the elements. Then PulseAudio dies due to the
assertion.

Fixes: 1fd8848e64 ("alsa-util: Add functions for accessing mixer elements through mixer class")
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/728>
2022-06-27 22:08:13 +03:00
peijiankang
ffd7a60767 fix translation error of pulseaudio
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/726>
2022-06-23 09:27:15 +00:00
Tanu Kaskinen
2270081fca Update NEWS for 16.1
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/727>
2022-06-21 13:41:30 +03:00
Tanu Kaskinen
089287caf1 i18n: Update .pot and .po files
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/724>
2022-06-18 09:52:36 +03:00
Seong-ho Cho
82bbf2260c Translated using Weblate (Korean)
Currently translated at 100.0% (572 of 572 strings)

Translation: pulseaudio/pulseaudio
Translate-URL: https://translate.fedoraproject.org/projects/pulseaudio/pulseaudio/ko/
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/724>
2022-06-18 09:49:13 +03:00
Jan Palus
dd4dc5e8bc bluetooth/gst: Correct var type for GST_TYPE_BITMASK
GST_TYPE_BITMASK is 64-bit bit mask while corresponding channel_mask in
pulseaudio is int therefore usually 32-bit. Switch to uint64_t instead
to match internal representation in gstreamer.

Fixes pulseaudio crash on ARM 32-bit when pulseaudio is compiled with
gstreamer and either LDAC or aptX support is available.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/723>
2022-06-17 19:12:57 +00:00
Georg Chini
ee8bfb49ad combine-sink: Fix threading issue during underrun
A recent commit added i->origin sink for the sink inputs of the combine sinks.
Therefore pa_sink_process_input_underruns() treated the combine sink like
filter sinks. pa_sink_process_input_underruns() calls itself with the
origin sink, which is only correct for filter sinks because they run in the
thread context of the origin sink. The combine sink however has its own
thread context, so pa_sink_process_input_underruns() was executed in the
wrong context.
This patch fixes the issue by skipping the section for module-combine-sink.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/722>
2022-06-17 12:57:24 +00:00
Igor V. Kovalenko
823e46fba0 build-sys: meson: Make module-console-kit optional
Default build configuration would fail to run on a system without systemd-logind
(or elogind) and without ConsoleKit daemon responding on dbus interface. Here,
module-console-kit would fail to initialize, preventing daemon from starting.

Make module-console-kit an optional build feature to allow opt-out.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/719>
2022-06-13 21:33:29 +00:00
redfast00
9f32b7d7ee rtp: fix 'size mismatch' on BSD style operating systems
On FreeBSD (and probably other BSDs as well), the FIONREAD ioctl
on UDP sockets does not return the size of the next datagram (like
it does on Linux), but returns the size of the output buffer: this
count contain multiple datagrams and also contains the headers.

We fixed this by taking the result of the FIONREAD as lower bound
for the size, adding an upper bound and then removing the check
that the sizes should be exactly the same.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/718>
2022-06-13 20:41:16 +00:00
Igor V. Kovalenko
d7a633df89 rtp: Initialize SDP info struct field added for OPUS
Turned out that pa_sdp_info::enable_opus is never initialized, which seldom
makes module-rtp-recv believe it will be playing OPUS-encoded stream even though
discovered SDP record does not indicate OPUS codec in metadata.

Fix this by adding missing initializer.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/720>
2022-06-13 19:51:37 +00:00
Jaechul Lee
a8a2a31408 sound-file-stream: Fix crash when playing a file which is not aligned
pulseaudio crash occurred when I play a file using pacmd play-file command.
The file is not aligned with its frame size and the last rendering size
is also not aligned. Thus, an assertion was generated at the end of the
file as the following.

memblockq.c: Assertion 'uchunk->length % bq->base == 0' failed at
../src/pulsecore/memblockq.c:288, function pa_memblockq_push(). Aborting.

When I play the file using paplay, it works good. So, I changed to
pa_memblockq_push_align instead of pa_memblockq_push to prevent the
assertion.

Signed-off-by: Jaechul Lee <jcsing.lee@samsung.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/717>
2022-06-09 11:18:48 +09:00
Sean Greenslade
05c06afa58 pactl: fix parsing of percentages with decimal points
The logic for detecting which type of volume was given incorrectly interpreted
any value with a decimal as a VOL_LINEAR. It also could set multiple flags,
which would put the flags variable into an indeterminate state. Additionally,
the flags stack variable was uninitialized which could also lead to an
indeterminate flag state.

Percentages are now prioritized over all other types, and only one type flag
can be set.
2022-06-04 00:24:49 -07:00
Igor V. Kovalenko
b55bcc3df3 rtp: Accept CRLF delimiters in SDP as required by RFC 4566
RFC 4566 states that SDP record is terminated with CRLF, and parsers should be
able to accept records terminated with just LF. Pulseaudio only accepts LF here.

Fix this by accepting both CRLF and LF terminators.
2022-05-30 18:43:35 +00:00
165 changed files with 20240 additions and 5051 deletions

1
.gitignore vendored
View file

@ -37,3 +37,4 @@ stamp-*
.dirstamp
*.orig
*.rej
subprojects/*/

View file

@ -2,7 +2,7 @@
# container and push it to the project's container registry on fd.o GitLab.
# This step is only run when the tag for the container changes, else it is
# effectively a no-op. All of this infrastructure is inherited from the
# wayland/ci-templates repository which is the recommended way to set up CI
# freedesktop/ci-templates repository which is the recommended way to set up CI
# infrastructure on fd.o GitLab.
#
# Once the container stage is done, we move on to the 'build' stage where we
@ -10,6 +10,15 @@
# there doesn't seem to be significant value to splitting the stages at the
# moment.
# Create merge request pipelines for open merge requests, branch pipelines
# otherwise. This allows MRs for new users to run CI.
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
stages:
- container
- build
@ -19,22 +28,21 @@ variables:
# CI runs, for example when adding new packages to FDO_DISTRIBUTION_PACKAGES.
# The tag is an arbitrary string that identifies the exact container
# contents.
FDO_DISTRIBUTION_TAG: '2021-11-03-00'
FDO_DISTRIBUTION_TAG: '2023-08-13-00'
FDO_DISTRIBUTION_VERSION: '20.04'
FDO_UPSTREAM_REPO: 'pulseaudio/pulseaudio'
UBUNTU_IMAGE: "$CI_REGISTRY_IMAGE/ubuntu/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
include:
# We pull templates from master to avoid the overhead of periodically
# scanning for changes upstream. This does means builds might occasionally
# break due to upstream changing things, so if you see unexpected build
# failures, this might be one cause.
- project: 'wayland/ci-templates'
- project: 'freedesktop/ci-templates'
ref: 'master'
file: '/templates/ubuntu.yml'
build-container:
extends: .fdo.container-ifnot-exists@ubuntu
extends: .fdo.container-build@ubuntu
stage: container
variables:
GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
@ -48,6 +56,7 @@ build-container:
check
curl
dbus-x11
doxygen
g++
gcc
gettext
@ -88,17 +97,19 @@ build-container:
wget
build-meson:
extends: .fdo.distribution-image@ubuntu
stage: build
image: $UBUNTU_IMAGE
script:
# Install meson
- wget -q https://github.com/mesonbuild/meson/releases/download/0.50.0/meson-0.50.0.tar.gz
- tar -xf meson-0.50.0.tar.gz
- cd meson-0.50.0
# Install meson (higher than our min version to support our wrap file)
- wget -q https://github.com/mesonbuild/meson/releases/download/0.63.2/meson-0.63.2.tar.gz
- tar -xf meson-0.63.2.tar.gz
- cd meson-0.63.2
- python3 setup.py install
- cd ..
# needed to generate a version
- git fetch https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git --tags
# Do the actual build
- meson build --werror
- meson build -Dwebrtc-aec=enabled
- cd build
- ninja
- ulimit -c 0 # don't dump core files on tests that are supposed to assert

92
NEWS
View file

@ -1,3 +1,95 @@
PulseAudio 17.0
Changes at a glance:
* Notes for end users
* Updates to ALSA UCM-based setups
* Battery level indication to Bluetooth devices
* Support for the Bluetooth FastStream codec
* webrtc-audio-processing dependency updated
* Trigger role groups added to module-role-cork
* XDG base directory spec for profile-set loading
* Notes for application developers
* PA_RATE_MAX increased
* Notes for packagers
* webrtc-audio-processing dependency updated
Contributors
Alistair Leslie-Hughes
Alper Nebi Yasak
Arun Raghavan
Asier Sarasua Garmendia
Ataberk Özen
Balázs Meskó
Biswapriyo Nath
Dylan Van Assche
Eero Nurkkala
Ettore Atalan
Fabrice Fontaine
Fran Diéguez
Georg Chini
Gioele Barabucci
Gogo Gogsi
Hector Martin
Hugo Carvalho
Hui Wang
Igor V. Kovalenko
Jaechul Lee
Jan Kuparinen
Jan Palus
Jaroslav Kysela
Jiri Grönroos
Joachim Philipp
Jordi Mas
Marijn Suijten
Mart Raudsepp
Nicolas Cavallari
Peter Meerwald-Stadler
Philip Goto
Rosen Penev
Rudi Heitbaum
Sabri Ünal
Sean Greenslade
Seong-ho Cho
Shunsuke Shimizu
SimonP
Takashi Sakamoto
Tanu Kaskinen
Temuri Doghonadze
Toni Estevez
Weijia Wang
Wim Taymans
Yureka
acheronfail
flyingOwl
grimst
hashitaku
mooo
peijiankang
redfast00
wael
김인수
PulseAudio 16.1
A bug fix release.
* Fix parsing of percentage volumes with decimal points in pactl
* Fix crash with the "pacmd play-file" command when reads from the disk aren't frame-aligned
* Fix module-rtp-recv sometimes thinking it's receiving an Opus stream when it's not
* Fix frequent crashing in module-combine-sink, regression in 16.0
* Fix crashing on 32-bit architectures when using the GStreamer codecs for LDAC and AptX
Contributors
Georg Chini
Igor V. Kovalenko
Jaechul Lee
Jan Palus
Sean Greenslade
PulseAudio 16.0
Changes at a glance:

View file

@ -174,7 +174,9 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<p><opt>set-default-sink</opt> <arg>SINK</arg></p>
<optdesc><p>Make the specified sink (identified by its symbolic name or numerical index) the default sink.</p></optdesc>
<optdesc><p>Make the specified sink (identified by its symbolic name or numerical index) the default sink.
Use the special name \@NONE@ to unset the user defined default sink. This will make pulseaudio return to the default
sink selection based on sink priority.</p></optdesc>
</option>
<option>
@ -189,7 +191,9 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<p><opt>set-default-source</opt> <arg>SOURCE</arg></p>
<optdesc><p>Make the specified source (identified by its symbolic name or numerical index) the default source.</p></optdesc>
<optdesc><p>Make the specified source (identified by its symbolic name or numerical index) the default source.
Use the special name \@NONE@ to unset the user defined default source. This will make pulseaudio return to the default
source selection based on source priority.</p></optdesc>
</option>
<option>

View file

@ -143,8 +143,10 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<p><opt>set-default-sink|set-default-source</opt> <arg>index|name</arg></p>
<optdesc><p>Make a sink (resp. source) the default. You may specify the
sink (resp. source) by its index in the sink (resp. source) list or by its
name.</p><p>Note that defaults may be overridden by various policy modules
or by specific stream configurations.</p></optdesc>
name. Use the special name \@NONE@ to unset the user defined default sink or
source. In this case, pulseaudio will return to the default sink or source
selection based on priority.</p><p>Note that defaults may be overridden by
various policy modules or by specific stream configurations.</p></optdesc>
</option>
<option>

View file

@ -1,10 +1,12 @@
project('pulseaudio', 'c', 'cpp',
version : run_command(find_program('git-version-gen'), join_paths(meson.current_source_dir(), '.tarball-version')).stdout().strip(),
project('pulseaudio', 'c',
version : run_command(find_program('git-version-gen'), join_paths(meson.current_source_dir(), '.tarball-version'), check : false).stdout().strip(),
meson_version : '>= 0.50.0',
default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
default_options : [ 'c_std=gnu11', 'cpp_std=c++17' ]
)
meson.add_dist_script('scripts/save-tarball-version.sh', meson.project_version())
if not meson.is_subproject()
meson.add_dist_script('scripts/save-tarball-version.sh', meson.project_version())
endif
pa_version_str = meson.project_version()
# For tarballs, the first split will do nothing, but for builds in git, we
@ -25,7 +27,7 @@ pa_protocol_version = 35
# The stable ABI for client applications, for the version info x:y:z
# always will hold x=z
libpulse_version_info = [24, 2, 24]
libpulse_version_info = [24, 3, 24]
# A simplified, synchronous, ABI-stable interface for client
# applications, for the version info x:y:z always will hold x=z
@ -148,7 +150,11 @@ cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
cdata.set_quoted('PA_SOEXT', '.so')
if host_machine.system() == 'windows'
cdata.set_quoted('PA_SOEXT', '.dll')
else
cdata.set_quoted('PA_SOEXT', '.so')
endif
cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
cdata.set('PA_DEFAULT_CONFIG_DIR_UNQUOTED', pulsesysconfdir)
cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
@ -160,8 +166,7 @@ cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(alsadatadir, 'paths'))
cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(alsadatadir, 'profile-sets'))
cdata.set_quoted('PA_ALSA_DATA_DIR', alsadatadir)
cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
cdata.set_quoted('PULSE_LOCALEDIR', localedir)
cdata.set_quoted('GETTEXT_PACKAGE', 'pulseaudio')
@ -185,6 +190,7 @@ endif
# rather than ending up in the config.h file?
if host_machine.system() == 'darwin'
cdata.set('OS_IS_DARWIN', 1)
cdata.set('HAVE_COREAUDIO', 1)
cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
elif host_machine.system() == 'windows'
cdata.set('OS_IS_WIN32', 1)
@ -424,7 +430,7 @@ cdata.set('MESON_BUILD', 1)
# so we request the nodelete flag to be enabled.
# On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
# Windows doesn't support this flag.
if host_machine.system() != 'windows'
if host_machine.system() != 'windows' and host_machine.system() != 'darwin'
nodelete_link_args = ['-Wl,-z,nodelete']
else
nodelete_link_args = []
@ -433,6 +439,7 @@ endif
# Code coverage
if get_option('gcov')
add_languages('cpp')
add_project_arguments('--coverage', language: ['c', 'cpp'])
add_project_link_arguments('--coverage', language: ['c', 'cpp'])
endif
@ -498,22 +505,24 @@ endif
need_libatomic_ops = false
atomictest = '''void func() {
atomictest = '''int main() {
volatile int atomic = 2;
__sync_bool_compare_and_swap (&atomic, 2, 3);
return 0;
}
'''
if cc.compiles(atomictest)
if cc.links(atomictest)
cdata.set('HAVE_ATOMIC_BUILTINS', 1)
newatomictest = '''void func() {
newatomictest = '''int main() {
int c = 0;
__atomic_store_n(&c, 4, __ATOMIC_SEQ_CST);
return 0;
}
'''
if(cc.compiles(newatomictest))
if(cc.links(newatomictest))
cdata.set('HAVE_ATOMIC_BUILTINS_MEMORY_MODEL', 1)
endif
@ -681,7 +690,7 @@ if get_option('daemon')
cdata.set('HAVE_ALSA_UCM', 1)
endif
gio_dep = dependency('gio-2.0', version : '>= 2.26.0')
gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : false)
if get_option('gsettings').enabled()
assert(gio_dep.found(), 'GSettings support needs glib I/O library (GIO)')
cdata.set('HAVE_GSETTINGS', 1)
@ -717,7 +726,7 @@ if get_option('daemon')
cdata.set('HAVE_SOXR', 1)
endif
webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
webrtc_dep = dependency('webrtc-audio-processing-1', version : '>= 1.0', required : get_option('webrtc-aec'))
if webrtc_dep.found()
cdata.set('HAVE_WEBRTC', 1)
endif
@ -732,6 +741,10 @@ if get_option('daemon')
cdata.set('HAVE_SYSTEMD_LOGIN', 1)
endif
if get_option('consolekit').enabled()
assert(dbus_dep.found(), 'ConsoleKit requires D-Bus support')
endif
tcpwrap_dep = cc.find_library('wrap', required: get_option('tcpwrap'))
if cc.has_header('tcpd.h') and cc.has_function('hosts_access', dependencies : tcpwrap_dep)
cdata.set('HAVE_LIBWRAP', 1)
@ -1001,6 +1014,7 @@ summary += [
' Enable HAL->udev compat: @0@'.format(get_option('hal-compat')),
'Enable systemd units: @0@'.format(systemd_dep.found()),
'Enable elogind: @0@'.format(libelogind_dep.found()),
'Enable ConsoleKit: @0@'.format(not get_option('consolekit').disabled() and dbus_dep.found()),
'Enable TCP Wrappers: @0@'.format(tcpwrap_dep.found()),
'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
'Database: @0@'.format(get_option('database')),

View file

@ -99,6 +99,9 @@ option('bluez5-native-headset',
option('bluez5-ofono-headset',
type : 'boolean',
description : 'Optional oFono headset backend support (BlueZ 5)')
option('consolekit',
type : 'feature', value : 'auto',
description : 'Optional ConsoleKit support')
option('dbus',
type : 'feature', value : 'auto',
description : 'Optional D-Bus support')
@ -166,7 +169,7 @@ option('x11',
type : 'feature', value : 'auto',
description : 'Optional X11 support')
option('enable-smoother-2',
type : 'boolean', value : 'true',
type : 'boolean', value : true,
description : 'Use alternative time smoother implementation')
# Echo cancellation

View file

@ -49,3 +49,7 @@ zh_TW
eo
si
ka
eu
ar
sl
ro

View file

@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2019-01-09 12:17+0200\n"
"Last-Translator: F Wolff <friedel@translate.org.za>\n"
"Language-Team: translate-discuss-af@lists.sourceforge.net\n"
@ -988,8 +988,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT-gebaseerde effenaar op %s"
@ -1046,14 +1046,14 @@ msgstr "Klank op @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tonnel vir %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tonnel na %s/%s"
@ -1390,11 +1390,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Ingeboude oudio"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

2903
po/ar.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.as\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:52+0000\n"
"Last-Translator: Amitakhya Phukan <aphukan@fedoraproject.org>\n"
"Language-Team: Assamese <>\n"
@ -1142,8 +1142,8 @@ msgstr ""
"plugin name> label=<ladspa plugin label> control=<comma separated list of "
"input control values>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1206,14 +1206,14 @@ msgstr "@HOSTNAME@ ত অ'ডিঅ'"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1564,11 +1564,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] লগ লক্ষ্য '%s' বৈধ নহয় ।"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "আভ্যন্তৰীণ অ'ডিঅ'"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "মোডেম"

225
po/be.po
View file

@ -9,20 +9,22 @@ msgstr ""
"Project-Id-Version: PulseAudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2016-07-19 11:06+0300\n"
"Last-Translator: Viktar Vaŭčkievič <victorenator@gmail.com>\n"
"Language-Team: Belarusian <>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-05-01 06:49+0000\n"
"Last-Translator: Yauhen Bugamol "
"<bugamol@users.noreply.translate.fedoraproject.org>\n"
"Language-Team: Belarusian <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/be/>\n"
"Language: be\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Lokalize 2.0\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.11.1\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"\n"
@ -97,70 +99,71 @@ msgstr ""
"Каманды:\n"
" -h, --help Паказаць гэту даведку.\n"
" --version Паказаць версію.\n"
" --dump-conf Вывесці агаданую канфігурацыю.\n"
" --dump-modules Вывесці спіс даступных модуляў.\n"
" --dump-resample-methods Вывесці спіс даступных метадаў\n"
" --dump-conf Выгрузіць прадвызначаную "
"канфігурацыю.\n"
" --dump-modules Выгрузіць спіс даступных модуляў.\n"
" --dump-resample-methods Выгрузіць спіс даступных метадаў\n"
" перадыскрэтызацыі.\n"
" --cleanup-shm Ачысціць выкарыстаныя сегменты\n"
" сумеснай памяці.\n"
" --start Запусціць фонавы сэрвіс, калі ён\n"
" --start Запусціць дэман, калі ён\n"
" яшчэ не запушчаны.\n"
" -k --kill Знішчыць запушчаны фонавы сэрвіс.\n"
" --check Праверыць ці запушчаны фонавы "
"сэрвіс\n"
" -k --kill Знішчыць запушчаны дэман.\n"
" --check Праверыць ці запушчаны дэман\n"
" (толькі код завяршэння).\n"
"\n"
"Параметры:\n"
" --system[=BOOL] Агульнасістэмны рэжым.\n"
" -D, --daemonize[=BOOL] Запусціць як фонавы сэрвіс.\n"
" -D, --daemonize[=BOOL] Запусціць як дэман.\n"
" --fail[=BOOL] Выйсці пры памылцы запуску.\n"
" --high-priority[=BOOL] Паспрабаваць павысіць прыярытэт\n"
" (nice)\n"
" (даступна толькі карыстальніку "
"root,\n"
" з уключаным SUID ці з павышаным\n"
" --high-priority[=BOOL] Паспрабаваць павысіць прыярытэт "
"(nice)\n"
" (даступна толькі карыстальніку root,"
"\n"
" з уключаным SUID або з павышаным\n"
" RLIMIT_NICE).\n"
" --realtime[=BOOL] Паспрабаваць уключыць планіроўшчык\n"
" рэальнага часу\n"
" (даступна толькі root,\n"
" з уключаным SUID ці з павышаным\n"
" (даступна толькі карыстальніку root,"
"\n"
" з уключаным SUID або з павышаным\n"
" RLIMIT_RTPRIO).\n"
" --disallow-module-loading[=BOOL] Забараніць загрузку/выгрузку "
"модуляў\n"
" па запыту карыстальніка пасля\n"
" запуску.\n"
" па запыту карыстальніка пасля "
"запуску.\n"
" --disallow-exit[=BOOL] Забараніць выхад па запыту\n"
" карыстальніка.\n"
" --exit-idle-time=СЕКУНДЫ Завяршыць работу пасля азначанага\n"
" часу бяздзеяння.\n"
" --scache-idle-time=СЕКУНДЫ Выгрузіць аўтаматычна загружаныя\n"
" сэмплы пасля азначанага часу\n"
" бяздзеяння.\n"
" сэмплы пасля азначанага часу "
"бяздзеяння.\n"
" --log-level[=УЗРОВЕНЬ] Павялічыць або ўставіць узровень\n"
" інфарматыўнасці.\n"
" -v --verbose Павялічыць узровень "
"інфарматыўнасці.\n"
" -v --verbose Павялічыць узровень інфарматыўнасці."
"\n"
" --log-target={auto,syslog,stderr,file:PATH,newfile:PATH}\n"
" Вызначыць журнал.\n"
" --log-meta[=BOOL] Дадаць месца ў коду да паведамленняў "
"журнала.\n"
" --log-time[=BOOL] Дадаць час да паведамленняў "
"журнала.\n"
" --log-meta[=BOOL] Дадаць месца ў кодзе да "
"паведамленняў журнала.\n"
" --log-time[=BOOL] Дадаць час да паведамленняў журнала."
"\n"
" --log-backtrace=FRAMES Дадаць стэк выклікаў да "
"паведамленняў журнала.\n"
" -p, --dl-search-path=ШЛЯХ Задаць шлях для пошуку дынамічных\n"
" раздзяляльных абʼектаў (дадаткаў).\n"
" раздзяляльных абʼектаў (плагінаў).\n"
" --resample-method=МЕТАД Выкарыстоўваць азначаны метад\n"
" перадыскрэтызацыі\n"
" (Глядзіце --dump-resample-methods\n"
" для магчымых значэнняў).\n"
" (Глядзіце --dump-resample-methods "
"для магчымых значэнняў).\n"
" --use-pid-file[=BOOL] Стварыць PID-файл.\n"
" --no-cpu-limit[=BOOL] Не ўсталёўваць абмежаванні на "
"выкарыстанне\n"
" працэсара на платформах, якія\n"
" падтрымліваюць гэта.\n"
" --disable-shm[=BOOL] Адключыць падтрымку сумеснай "
"памяці.\n"
" --disable-shm[=BOOL] Адключыць падтрымку сумеснай памяці."
"\n"
" --enable-memfd[=BOOL] Уключыць падтрымку memfd-сумеснай\n"
" памяці.\n"
"\n"
@ -170,7 +173,8 @@ msgstr ""
" -F, --file=НАЗВААЙЛА Выканаць азначаны сцэнарый.\n"
" -C Адкрыць камандны радок у\n"
" бягучым тэрмінале пасля запуску.\n"
" -n Не загружаць агаданы файл сцэнарыю.\n"
" -n Не загружаць прадвызначаны файл "
"сцэнарыя.\n"
#: src/daemon/cmdline.c:246
msgid "--daemonize expects boolean argument"
@ -508,7 +512,7 @@ msgstr ""
#: src/daemon/main.c:922
msgid "Failed to acquire stdio."
msgstr "Не атрымалася атрымаць stdio."
msgstr "Не ўдалося атрымаць stdio."
#: src/daemon/main.c:928 src/daemon/main.c:999
#, c-format
@ -536,7 +540,7 @@ msgstr "setsid() пацярпела няўдачу: %s"
#: src/daemon/main.c:1119
msgid "Failed to get machine ID"
msgstr "Не атрымалася атрымаць ідэнтыфікатар машыны"
msgstr "Не ўдалося атрымаць ідэнтыфікатар машыны"
#: src/daemon/main.c:1145
msgid ""
@ -561,9 +565,8 @@ msgid "pa_core_new() failed."
msgstr "pa_core_new() пацярпела няўдачу."
#: src/daemon/main.c:1268
#, fuzzy
msgid "command line arguments"
msgstr "Занадта шмат аргументаў."
msgstr "аргументы каманднага радка"
#: src/daemon/main.c:1275
#, c-format
@ -696,14 +699,12 @@ msgid "Analog Output"
msgstr "Аналагавы выхад"
#: src/modules/alsa/alsa-mixer.c:2808
#, fuzzy
msgid "Headphones 2"
msgstr "Навушнікі"
msgstr "Навушнікі 2"
#: src/modules/alsa/alsa-mixer.c:2809
#, fuzzy
msgid "Headphones Mono Output"
msgstr "Аналагавы монавыхад"
msgstr "Манавыхад навушнікаў"
#: src/modules/alsa/alsa-mixer.c:2810
msgid "Line Out"
@ -711,7 +712,7 @@ msgstr "Лінейны выхад"
#: src/modules/alsa/alsa-mixer.c:2811
msgid "Analog Mono Output"
msgstr "Аналагавы монавыхад"
msgstr "Аналагавы манавыхад"
#: src/modules/alsa/alsa-mixer.c:2812
msgid "Speakers"
@ -738,38 +739,32 @@ msgid "Multichannel Output"
msgstr "Шматканальны выхад"
#: src/modules/alsa/alsa-mixer.c:2818
#, fuzzy
msgid "Game Output"
msgstr "%s выхад"
msgstr "Выхад гульні"
#: src/modules/alsa/alsa-mixer.c:2819 src/modules/alsa/alsa-mixer.c:2820
#, fuzzy
msgid "Chat Output"
msgstr "%s выхад"
msgstr "Выхад размовы"
#: src/modules/alsa/alsa-mixer.c:2821
#, fuzzy
msgid "Chat Input"
msgstr "%s уваход"
msgstr "Уваход размовы"
#: src/modules/alsa/alsa-mixer.c:2822
#, fuzzy
msgid "Virtual Surround 7.1"
msgstr "Віртуальны абʼёмны прыёмнік"
msgstr "Віртуальны абʼёмны 7.1"
#: src/modules/alsa/alsa-mixer.c:4563
msgid "Analog Mono"
msgstr "Аналагавы мона"
#: src/modules/alsa/alsa-mixer.c:4564
#, fuzzy
msgid "Analog Mono (Left)"
msgstr "Аналагавы мона"
msgstr "Аналагавы мона (левы)"
#: src/modules/alsa/alsa-mixer.c:4565
#, fuzzy
msgid "Analog Mono (Right)"
msgstr "Аналагавы мона"
msgstr "Аналагавы мона (правы)"
#. Note: Not translated to "Analog Stereo Input", because the source
#. * name gets "Input" appended to it automatically, so adding "Input"
@ -796,9 +791,8 @@ msgid "Headset"
msgstr "Гарнітура"
#: src/modules/alsa/alsa-mixer.c:4577 src/modules/alsa/alsa-mixer.c:4735
#, fuzzy
msgid "Speakerphone"
msgstr "Дынамік"
msgstr "Гучная сувязь"
#: src/modules/alsa/alsa-mixer.c:4578 src/modules/alsa/alsa-mixer.c:4579
msgid "Multichannel"
@ -874,36 +868,35 @@ msgstr "Лічбавы абʼёмны 5.1 (HDMI)"
#: src/modules/alsa/alsa-mixer.c:4597
msgid "Chat"
msgstr ""
msgstr "Размова"
#: src/modules/alsa/alsa-mixer.c:4598
msgid "Game"
msgstr ""
msgstr "Гульня"
#: src/modules/alsa/alsa-mixer.c:4732
msgid "Analog Mono Duplex"
msgstr "Аналагавы мона дуплекс"
msgstr "Дуплексны аналагавы мона"
#: src/modules/alsa/alsa-mixer.c:4733
msgid "Analog Stereo Duplex"
msgstr "Аналагавы стэрэа дуплекс"
msgstr "Дуплексны аналагавы стэрэа"
#: src/modules/alsa/alsa-mixer.c:4736
msgid "Digital Stereo Duplex (IEC958)"
msgstr "Лічбавы стэрэа дуплекс (IEC958)"
msgstr "Дуплексны лічбавы стэрэа (IEC958)"
#: src/modules/alsa/alsa-mixer.c:4737
msgid "Multichannel Duplex"
msgstr "Шматканальны дуплекс"
msgstr "Дуплексны шматканальны"
#: src/modules/alsa/alsa-mixer.c:4738
#, fuzzy
msgid "Stereo Duplex"
msgstr "Аналагавы стэрэа дуплекс"
msgstr "Дуплексны стэрэа"
#: src/modules/alsa/alsa-mixer.c:4739
msgid "Mono Chat + 7.1 Surround"
msgstr ""
msgstr "Размова, мона + аб'ёмны 7.1"
#: src/modules/alsa/alsa-mixer.c:4740 src/modules/alsa/module-alsa-card.c:197
#: src/modules/bluetooth/module-bluez5-device.c:2263
@ -1177,8 +1170,8 @@ msgstr ""
"autoloaded=<зададзены, калі гэты модуль загружаны аўтаматычна> "
"use_volume_sharing=<yes ці no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1243,14 +1236,14 @@ msgstr "Аўдыя на @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Тунэль для %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Тунэль да %s/%s"
@ -1260,7 +1253,6 @@ msgid "Virtual surround sink"
msgstr "Віртуальны абʼёмны прыёмнік"
#: src/modules/module-virtual-surround-sink.c:54
#, fuzzy
msgid ""
"sink_name=<name for the sink> sink_properties=<properties for the sink> "
"master=<name of sink to filter> sink_master=<name of sink to filter> "
@ -1271,19 +1263,21 @@ msgid ""
"this module is being loaded automatically> "
msgstr ""
"sink_name=<назва прыёмніка> sink_properties=<уласцівасці прыёмніка> "
"master=<назва прыёмніка для фільтрацыі> format=<фармат сэмлаў> rate=<частата "
"сэмлаў> channels=<number of channels> channel_map=<колькасць каналаў> "
"use_volume_sharing=<yes ці no> force_flat_volume=<yes ці no> hrir=<шлях да "
"left_hrir.wav> "
"master=<назва прыёмніка для фільтрацыі> sink_master=<назва прыёмніка для "
"фільтрацыі> format=<фармат сэмлаў> rate=<частата дыскрэдытацыі> "
"channels=<колькасць каналаў> channel_map=<карта каналаў> "
"use_volume_sharing=<yes або no> force_flat_volume=<yes або no> hrir=/шлях/да/"
евага_hrir.wav hrir_left=/шлях/да/левага_hrir.wav "
"hrir_right=/шлях/да/неабавязковага/правага_hrir.wav autoloaded=<задаецца, "
"калі модуль загружаецца аўтаматычна> "
#: src/modules/raop/module-raop-discover.c:295
#, fuzzy
msgid "Unknown device model"
msgstr "Невядомы код памылкі"
msgstr "Невядомая мадэль прылады"
#: src/modules/raop/raop-sink.c:689
msgid "RAOP standard profile"
msgstr ""
msgstr "Стандартны профіль RAOP"
#: src/modules/reserve-wrap.c:149
msgid "PulseAudio Sound Server"
@ -1597,11 +1591,11 @@ msgstr "Не атрымалася адкрыць файлы журнала «%s
msgid "Invalid log target."
msgstr "Некарэктны журнал."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Убудаванае аўдыя"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Мадэм"
@ -1832,7 +1826,7 @@ msgstr "Паток перасунуты ў прыладу %s (%u, %sпрыпын
#: src/utils/pacat.c:393
msgid "not "
msgstr "не"
msgstr "не "
#: src/utils/pacat.c:400
#, c-format
@ -1903,7 +1897,7 @@ msgstr "Атрыманы сігнал — выхад."
#: src/utils/pacat.c:640
#, c-format
msgid "Failed to get latency: %s"
msgstr "Не атрымалася атрымаць затрымку: %s"
msgstr "Не ўдалося атрымаць затрымку: %s"
#: src/utils/pacat.c:645
#, c-format
@ -2368,7 +2362,7 @@ msgstr "read(): %s"
#: src/utils/pactl.c:183
#, c-format
msgid "Failed to get statistics: %s"
msgstr "Не атрымалася атрымаць статыстыку: %s"
msgstr "Не ўдалося атрымаць статыстыку: %s"
#: src/utils/pactl.c:199
#, fuzzy, c-format
@ -2404,7 +2398,7 @@ msgstr "Памер кэшу сэмплаў: %s\n"
#: src/utils/pactl.c:219 src/utils/pactl.c:231 src/utils/pactl.c:245
#, c-format
msgid "Failed to get server information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб серверы: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб серверы: %s"
#: src/utils/pactl.c:224 src/utils/pactl.c:236
#, c-format
@ -2453,15 +2447,15 @@ msgstr ""
#: src/utils/pactl.c:320
msgid "availability unknown"
msgstr ""
msgstr "даступнасць невядомая"
#: src/utils/pactl.c:321
msgid "available"
msgstr ""
msgstr "даступна"
#: src/utils/pactl.c:322
msgid "not available"
msgstr ""
msgstr "недаступна"
#: src/utils/pactl.c:331 src/utils/pactl.c:355
#, fuzzy
@ -2479,7 +2473,7 @@ msgstr "Лінейны ўваход"
#: src/utils/pactl.c:336
msgid "Mic"
msgstr ""
msgstr "Мікрафон"
#: src/utils/pactl.c:338
#, fuzzy
@ -2492,11 +2486,11 @@ msgstr ""
#: src/utils/pactl.c:340
msgid "SPDIF"
msgstr ""
msgstr "SPDIF"
#: src/utils/pactl.c:341
msgid "HDMI"
msgstr ""
msgstr "HDMI"
#: src/utils/pactl.c:342
msgid "TV"
@ -2504,7 +2498,7 @@ msgstr ""
#: src/utils/pactl.c:345
msgid "USB"
msgstr ""
msgstr "USB"
#: src/utils/pactl.c:346
#, fuzzy
@ -2513,18 +2507,17 @@ msgstr "Bluetooth-уваход"
#: src/utils/pactl.c:352
msgid "Network"
msgstr ""
msgstr "Сетка"
#: src/utils/pactl.c:353
#, fuzzy
msgid "Analog"
msgstr "Аналагавы мона"
msgstr "Аналагавы"
#: src/utils/pactl.c:567 src/utils/pactl.c:1834 src/utils/pactl.c:1852
#: src/utils/pactl.c:1875 src/utils/pactl.c:1992
#, c-format
msgid "Failed to get sink information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб прыёмніку: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб прыёмніку: %s"
#: src/utils/pactl.c:664
#, c-format
@ -2571,13 +2564,13 @@ msgid "\tPorts:\n"
msgstr "\tПарты:\n"
#: src/utils/pactl.c:708 src/utils/pactl.c:892
#, fuzzy, c-format
#, c-format
msgid "\t\t%s: %s (type: %s, priority: %u%s%s, %s)\n"
msgstr "\t\t%s: %s (прыёмнікаў: %u, крыніц: %u, прыярытэт: %u, даступны: %s)\n"
msgstr "\t\t%s: %s (тып: %s, прыярытэт: %u%s%s, %s)\n"
#: src/utils/pactl.c:710 src/utils/pactl.c:894 src/utils/pactl.c:1256
msgid ", availability group: "
msgstr ""
msgstr ", група даступнасці: "
#: src/utils/pactl.c:715 src/utils/pactl.c:899
#, c-format
@ -2593,7 +2586,7 @@ msgstr "\tФарматы:\n"
#: src/utils/pactl.c:1934 src/utils/pactl.c:2007
#, c-format
msgid "Failed to get source information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб крыніцы: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб крыніцы: %s"
#: src/utils/pactl.c:849
#, c-format
@ -2645,7 +2638,7 @@ msgstr "н/д"
#: src/utils/pactl.c:924 src/utils/pactl.c:1793
#, c-format
msgid "Failed to get module information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб модулі: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб модулі: %s"
#: src/utils/pactl.c:976
#, c-format
@ -2667,7 +2660,7 @@ msgstr ""
#: src/utils/pactl.c:1002
#, c-format
msgid "Failed to get client information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб кліенце: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб кліенце: %s"
#: src/utils/pactl.c:1056
#, c-format
@ -2687,7 +2680,7 @@ msgstr ""
#: src/utils/pactl.c:1168
#, c-format
msgid "Failed to get card information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб картцы: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб картцы: %s"
#: src/utils/pactl.c:1224
#, c-format
@ -2744,7 +2737,7 @@ msgstr "\t\t\tЧастка профілю(яў): %s"
#: src/utils/pactl.c:1290 src/utils/pactl.c:1954 src/utils/pactl.c:2022
#, c-format
msgid "Failed to get sink input information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб уваходзе прыёмніка: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб уваходзе прыёмніка: %s"
#: src/utils/pactl.c:1366
#, c-format
@ -2788,7 +2781,7 @@ msgstr ""
#: src/utils/pactl.c:1413 src/utils/pactl.c:1974 src/utils/pactl.c:2037
#, c-format
msgid "Failed to get source output information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб выхадзе крыніцы: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб выхадзе крыніцы: %s"
#: src/utils/pactl.c:1489
#, c-format
@ -2832,7 +2825,7 @@ msgstr ""
#: src/utils/pactl.c:1536
#, c-format
msgid "Failed to get sample information: %s"
msgstr "Не атрымалася атрымаць інфармацыю аб сэмпле: %s"
msgstr "Не ўдалося атрымаць інфармацыю аб сэмпле: %s"
#: src/utils/pactl.c:1604
#, c-format
@ -2892,9 +2885,9 @@ msgid "list-handlers message response array element %d is not a JSON object"
msgstr ""
#: src/utils/pactl.c:1800
#, fuzzy, c-format
#, c-format
msgid "Failed to unload module: Module %s not loaded"
msgstr "Не атрымалася выгрузіць модуль: модуль не загружаны"
msgstr "Не ўдалося выгрузіць модуль: модуль %s не загружаны"
#: src/utils/pactl.c:1818
#, fuzzy, c-format
@ -3268,7 +3261,7 @@ msgstr ""
#: src/utils/pactl.c:3194
msgid "You have to specify a card name/index, a port name and a latency offset"
msgstr "Неабходна задаць нумар ці назву карткі, назву порту і зрух затрымкі."
msgstr "Неабходна задаць назву/нумар карты, назву порта і зрух затрымкі"
#: src/utils/pactl.c:3201
msgid "Could not parse latency offset"
@ -3423,7 +3416,7 @@ msgstr "Не атрымалася захаваць дадзеныя cookie\n"
#: src/utils/pax11publish.c:168
#, c-format
msgid "Failed to get FQDN.\n"
msgstr "Не атрымалася атрымаць поўнае даменнае імя (FQDN).\n"
msgstr "Не ўдалося атрымаць поўнае даменнае імя (FQDN).\n"
#: src/utils/pax11publish.c:188
#, c-format

View file

@ -4,7 +4,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2020-10-15 21:30+0000\n"
"Last-Translator: Emanuil Novachev <em.novachev@gmail.com>\n"
"Language-Team: Bulgarian <https://translate.fedoraproject.org/projects/"
@ -1046,8 +1046,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1104,14 +1104,14 @@ msgstr ""
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1448,11 +1448,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr ""
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr ""

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.bn_IN\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:52+0000\n"
"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
"Language-Team: Bengali INDIA <anubad@lists.ankur.org.in>\n"
@ -1157,8 +1157,8 @@ msgstr ""
"plugin name> label=<ladspa plugin label> control=<comma separated list of "
"input control values>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1221,14 +1221,14 @@ msgstr "@HOSTNAME@-র মধ্যে অডিও"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1579,11 +1579,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] লগ টার্গেট '%s' বৈধ নয়।"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "অভ্যন্তরীণ অডিও"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "মোডেম"

View file

@ -28,14 +28,17 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2012-01-30 09:52+0000\n"
"Last-Translator: Josep Torné Llavall <josep.torne@gmail.com>\n"
"Language-Team: Catalan <fedora@softcatala.net>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-09-26 14:19+0000\n"
"Last-Translator: Toni Estevez <toni.estevez@gmail.com>\n"
"Language-Team: Catalan <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/ca/>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.14.1\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
@ -704,25 +707,23 @@ msgstr "Entrada analògica"
#: src/modules/alsa/alsa-mixer.c:2800
msgid "Dock Microphone"
msgstr ""
msgstr "Micròfon de l'acoblador"
#: src/modules/alsa/alsa-mixer.c:2802
msgid "Headset Microphone"
msgstr ""
msgstr "Micròfon de l'auricular"
#: src/modules/alsa/alsa-mixer.c:2806
msgid "Analog Output"
msgstr "Sortida analògica"
#: src/modules/alsa/alsa-mixer.c:2808
#, fuzzy
msgid "Headphones 2"
msgstr "Auriculars"
msgstr "Auriculars 2"
#: src/modules/alsa/alsa-mixer.c:2809
#, fuzzy
msgid "Headphones Mono Output"
msgstr "Sortida mono analògica"
msgstr "Sortida mono analògica dels auriculars"
#: src/modules/alsa/alsa-mixer.c:2810
msgid "Line Out"
@ -879,7 +880,7 @@ msgstr "Envoltant digital 4.0 (IEC958/AC3)"
#: src/modules/alsa/alsa-mixer.c:4593
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Envolvent digital 5.1 (IEC958/AC3)"
msgstr "Envoltant digital 5.1 (IEC958/AC3)"
#: src/modules/alsa/alsa-mixer.c:4594
msgid "Digital Surround 5.1 (IEC958/DTS)"
@ -895,11 +896,11 @@ msgstr "So envoltant digital 5.1 (HDMI)"
#: src/modules/alsa/alsa-mixer.c:4597
msgid "Chat"
msgstr ""
msgstr "Xat"
#: src/modules/alsa/alsa-mixer.c:4598
msgid "Game"
msgstr ""
msgstr "Joc"
#: src/modules/alsa/alsa-mixer.c:4732
msgid "Analog Mono Duplex"
@ -1175,8 +1176,8 @@ msgstr ""
"pulgin=<nom del connector ladspa> label=<etiqueta del connector ladspa> "
"control=<llista separada per comes dels valors de control d'entrada>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1239,14 +1240,14 @@ msgstr "Àudio a @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Túnel per %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1447,7 +1448,7 @@ msgstr "Auxiliar 28"
#: src/pulse/channelmap.c:150
msgid "Auxiliary 29"
msgstr "Auxiliar 31"
msgstr "Auxiliar 29"
#: src/pulse/channelmap.c:151
msgid "Auxiliary 30"
@ -1590,11 +1591,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Àudio intern"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Mòdem"
@ -2774,10 +2775,12 @@ msgstr ""
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
msgstr ""
"no s'ha pogut analitzar correctament la resposta del missatge de list-"
"handlers"
#: src/utils/pactl.c:1718
msgid "list-handlers message response is not a JSON array"
msgstr ""
msgstr "la resposta del missatge de list-handlers no és una matriu de JSON"
#: src/utils/pactl.c:1729
#, c-format

View file

@ -10,16 +10,17 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2018-09-30 17:34+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2023-12-31 14:36+0000\n"
"Last-Translator: Matěj Valášek <valmatej@seznam.cz>\n"
"Language-Team: Czech <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.7\n"
"X-Generator: Weblate 5.3.1\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
@ -561,6 +562,8 @@ msgid ""
"Failed to initialize daemon due to errors while executing startup commands. "
"Source of commands: %s"
msgstr ""
"Nepodařilo se inicializovat démona kvůli chybám při provádění startup "
"příkazů. Zdroj příkazů: %s"
#: src/daemon/main.c:1280
msgid "Daemon startup without any loaded modules, refusing to work."
@ -859,11 +862,11 @@ msgstr "Digitální Surround 5.1 (HDMI)"
#: src/modules/alsa/alsa-mixer.c:4597
msgid "Chat"
msgstr ""
msgstr "Chat"
#: src/modules/alsa/alsa-mixer.c:4598
msgid "Game"
msgstr ""
msgstr "Hra"
#: src/modules/alsa/alsa-mixer.c:4732
msgid "Analog Mono Duplex"
@ -887,7 +890,7 @@ msgstr "Duplexní stereo"
#: src/modules/alsa/alsa-mixer.c:4739
msgid "Mono Chat + 7.1 Surround"
msgstr ""
msgstr "Mono Chat + 7.1 Surround"
#: src/modules/alsa/alsa-mixer.c:4740 src/modules/alsa/module-alsa-card.c:197
#: src/modules/bluetooth/module-bluez5-device.c:2263
@ -1158,8 +1161,8 @@ msgstr ""
"channels=<počet kanálů> channel_map=<mapa kanálů> autoloaded=<zda se má "
"modul načítat automaticky> use_volume_sharing=<používat sdílenou hlasitost>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Ekvalizér používající FFT na %s"
@ -1225,14 +1228,14 @@ msgstr "Zvuk na @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel pro %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunel do %s/%s"
@ -1582,11 +1585,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Neplatný cíl pro záznam."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Vnitřní zvukový systém"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -2435,15 +2438,15 @@ msgstr ""
#: src/utils/pactl.c:320
msgid "availability unknown"
msgstr ""
msgstr "dostupnost neznámá"
#: src/utils/pactl.c:321
msgid "available"
msgstr ""
msgstr "dostupné"
#: src/utils/pactl.c:322
msgid "not available"
msgstr ""
msgstr "není dostupné"
#: src/utils/pactl.c:331 src/utils/pactl.c:355
#, fuzzy
@ -2452,7 +2455,7 @@ msgstr "neznámo"
#: src/utils/pactl.c:332
msgid "Aux"
msgstr ""
msgstr "Aux"
#: src/utils/pactl.c:335
#, fuzzy
@ -2461,7 +2464,7 @@ msgstr "Linkový vstup"
#: src/utils/pactl.c:336
msgid "Mic"
msgstr ""
msgstr "Mic"
#: src/utils/pactl.c:338
#, fuzzy
@ -2470,23 +2473,23 @@ msgstr "Náhlavní souprava"
#: src/utils/pactl.c:339
msgid "Earpiece"
msgstr ""
msgstr "Sluchátka do uší"
#: src/utils/pactl.c:340
msgid "SPDIF"
msgstr ""
msgstr "SPDIF"
#: src/utils/pactl.c:341
msgid "HDMI"
msgstr ""
msgstr "HDMI"
#: src/utils/pactl.c:342
msgid "TV"
msgstr ""
msgstr "TV"
#: src/utils/pactl.c:345
msgid "USB"
msgstr ""
msgstr "USB"
#: src/utils/pactl.c:346
#, fuzzy
@ -2495,7 +2498,7 @@ msgstr "Vstup přes Bluetooth"
#: src/utils/pactl.c:352
msgid "Network"
msgstr ""
msgstr "Síť"
#: src/utils/pactl.c:353
#, fuzzy
@ -2858,20 +2861,22 @@ msgstr "Selhalo volání read(): %s"
#: src/utils/pactl.c:1695
#, c-format
msgid "list-handlers message failed: %s"
msgstr ""
msgstr "list-handlers zpráva selhala: %s"
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
#, fuzzy
msgid "list-handlers message response could not be parsed correctly"
msgstr ""
msgstr "odpověď na zprávu list-handlers nelze správně analyzovat"
#: src/utils/pactl.c:1718
#, fuzzy
msgid "list-handlers message response is not a JSON array"
msgstr ""
msgstr "odpověď zprávy list-handlers není pole JSON"
#: src/utils/pactl.c:1729
#, c-format
msgid "list-handlers message response array element %d is not a JSON object"
msgstr ""
msgstr "prvek pole odpovědí list-handlers %d není objekt JSON"
#: src/utils/pactl.c:1800
#, c-format
@ -3238,6 +3243,8 @@ msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
msgstr ""
"Nadbytečné argumenty budou ignorovány. Všimněte si, že všechny parametry "
"zprávy musí být zadány jako jeden řetězec."
#: src/utils/pactl.c:3182
msgid ""

View file

@ -7,9 +7,9 @@ msgstr ""
"Project-Id-Version: PulseAudio master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-05-21 23:01+0000\n"
"Last-Translator: scootergrisen <scootergrisen@gmail.com>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2024-12-13 17:38+0000\n"
"Last-Translator: DK Guy <peter@nozen.dk>\n"
"Language-Team: Danish <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/da/>\n"
"Language: da\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.6.2\n"
"X-Generator: Weblate 5.8.4\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -175,13 +175,12 @@ msgid "--fail expects boolean argument"
msgstr "--fail venter boolesk argument"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
msgstr ""
"--log-level venter logniveau argument (enten numerisk i området 0..4 eller "
"en af debug, info, notice, warn, error)."
"--log-level forventer logniveau argument (enten numerisk i området 0..4 "
"eller en af debug, info, notice, warn, error)."
#: src/daemon/cmdline.c:277
msgid "--high-priority expects boolean argument"
@ -1133,8 +1132,8 @@ msgstr ""
"channel_map=<kanalkort> autoloaded=<indstil hvis modulet indlæses "
"automatisk> use_volume_sharing=<yes eller no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT-baseret equalizer på %s"
@ -1200,14 +1199,14 @@ msgstr "Lyd på @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel for %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel til %s/%s"
@ -1556,11 +1555,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Ugyldigt logmål."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Indbygget lyd"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

View file

@ -14,8 +14,8 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.de\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-12-05 21:16+0000\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-12-06 09:20+0000\n"
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
"Language-Team: German <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/de/>\n"
@ -24,7 +24,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.9.1\n"
"X-Generator: Weblate 4.14.2\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
@ -188,7 +188,6 @@ msgid "--fail expects boolean argument"
msgstr "--fail erfordert boolesche Variable"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
@ -218,14 +217,12 @@ msgid "--use-pid-file expects boolean argument"
msgstr "--use-pid-file erfordert boolesche Variable"
#: src/daemon/cmdline.c:328
#, fuzzy
msgid ""
"Invalid log target: use either 'syslog', 'journal', 'stderr' or 'auto' or a "
"valid file name 'file:<path>', 'newfile:<path>'."
msgstr ""
"Ungültiges Protokollziel: Benutzen Sie entweder »syslog«, »journal«, "
"»stderr« oder »auto« oder einen gültigen Dateinamen »file:<Pfad>«, »newfile:"
"<Pfad>«."
"Ungültiges Protokollziel: Benutzen Sie entweder »syslog«, »journal«, »stderr«"
" oder »auto« oder einen gültigen Dateinamen »file:<Pfad>«, »newfile:<Pfad>«."
#: src/daemon/cmdline.c:330
msgid ""
@ -1152,8 +1149,8 @@ msgstr ""
"autoloaded=<setzen, wenn dieses Modul automatisch geladen wird> "
"use_volume_sharing=<yes oder no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1220,14 +1217,14 @@ msgstr "Audio auf @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel für %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel zu %s/%s"
@ -1576,11 +1573,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Ungültiges Protokollziel."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Internes Audio"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -3160,7 +3157,7 @@ msgstr "Sie müssen einen Ziel-Namen/-Indexwert und eine Lautstärke angeben."
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101
#, fuzzy
msgid "You have to specify a source name/index"
msgstr "Sie müssen einen Quellennamen angeben."
msgstr "Sie müssen einen Quellennamen/-index angeben"
#: src/utils/pactl.c:3031
msgid "You have to specify a source name/index and a volume"

View file

@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:53+0000\n"
"Last-Translator: Fabian Affolter <fab@fedoraproject.org>\n"
"Language-Team: German <fedora-trans-de@redhat.com>\n"
@ -1130,8 +1130,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1191,14 +1191,14 @@ msgstr ""
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1543,11 +1543,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] Ungültiges Log-Ziel '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Internes Audio"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

490
po/el.po

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2021-02-05 01:40+0000\n"
"Last-Translator: Carmen Bianca Bakker <carmen@carmenbianca.eu>\n"
"Language-Team: Esperanto <https://translate.fedoraproject.org/projects/"
@ -984,8 +984,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1042,14 +1042,14 @@ msgstr "Sono sur @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunelo por %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunelo al %s/%s"
@ -1386,11 +1386,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Integrita sono"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr ""

973
po/es.po

File diff suppressed because it is too large Load diff

2902
po/eu.po Normal file

File diff suppressed because it is too large Load diff

124
po/fi.po
View file

@ -9,9 +9,9 @@ msgstr ""
"Project-Id-Version: git trunk\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2022-05-20 18:18+0000\n"
"Last-Translator: Jan Kuparinen <copper_fin@hotmail.com>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-04-22 16:19+0000\n"
"Last-Translator: Ricky Tigg <ricky.tigg@gmail.com>\n"
"Language-Team: Finnish <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/fi/>\n"
"Language: fi\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.12.2\n"
"X-Generator: Weblate 5.11\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -742,11 +742,11 @@ msgstr "Peli ulostulo"
#: src/modules/alsa/alsa-mixer.c:2819 src/modules/alsa/alsa-mixer.c:2820
msgid "Chat Output"
msgstr "Chatti ulostulo"
msgstr "Pikakeskustelun lähtö"
#: src/modules/alsa/alsa-mixer.c:2821
msgid "Chat Input"
msgstr "Chatti sisääntulo"
msgstr "Pikakeskustelun syöttö"
#: src/modules/alsa/alsa-mixer.c:2822
msgid "Virtual Surround 7.1"
@ -1141,8 +1141,8 @@ msgstr ""
"liitännäisen nimiö (label)> control=<pilkulla erotettu luettelo "
"syötteenhallinta-arvoja> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT-pohjainen taajuuskorjain %s:lla"
@ -1209,14 +1209,14 @@ msgstr "Ääni koneella @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunneli %s@%s:ta varten"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunneli %s/%s:een"
@ -1566,17 +1566,17 @@ msgstr ""
msgid "Invalid log target."
msgstr "Virheellinen lokikirjoituksen kohde."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Sisäinen äänentoisto"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modeemi"
#: src/pulse/error.c:38
msgid "OK"
msgstr "OK"
msgstr "Hyvä on"
#: src/pulse/error.c:39
msgid "Access denied"
@ -1818,7 +1818,7 @@ msgstr "Korkkipyyntöpino on tyhjä: poistetaan korkkivirta"
#: src/utils/pacat.c:425
msgid "Warning: Received more uncork requests than cork requests."
msgstr ""
msgstr "Varoitus: Vastaanotettu enemmän cork-poistopyyntöjä kuin cork-pyyntöjä."
#: src/utils/pacat.c:450
#, c-format
@ -1972,8 +1972,8 @@ msgstr ""
"palvelimella\n"
" --volume=ÄÄNENVOIMAKKUUS Määritä (lineaarinen) "
"aloitusäänenvoimakkuus väliltä 0...65536\n"
" --rate=NÄYTTEENOTTOTAAJUUS Näytteenottotaajuus hertseinä(oletus:"
" 44100)\n"
" --rate=NÄYTTEENOTTOTAAJUUS Näytteenottotaajuus "
"hertseinä(oletus: 44100)\n"
" --format=NÄYTEMUOTO Näytteen tyyppi, yksi seuraavista:"
"s16le, s16be, u8, float32le,\n"
" float32be, ulaw, alaw, s32le, s32be\n"
@ -1993,8 +1993,8 @@ msgstr ""
" --no-remix Älä yli- tai alimiksaa kanavia.\n"
" --no-remap Kartoita kanavat indeksin mukaan, "
"älä nimen mukaan.\n"
" --latency=TAVUA Pyydä määritettyä latenssia tavuissa."
"\n"
" --latency=TAVUA Pyydä määritettyä latenssia "
"tavuissa.\n"
" --process-time=TAVUA Pyydä määritettyä prosessiaikaa "
"pyyntöä kohti tavuissa.\n"
" --property=ASETUS=ARVO Anna määritetylle asetukselle "
@ -2007,24 +2007,29 @@ msgstr ""
#: src/utils/pacat.c:793
msgid "Play back encoded audio files on a PulseAudio sound server."
msgstr ""
msgstr "Toista koodattuja äänitiedostoja PulseAudio-äänipalvelimella."
#: src/utils/pacat.c:797
msgid ""
"Capture audio data from a PulseAudio sound server and write it to a file."
msgstr ""
"Kaappaa äänidataa PulseAudio-äänipalvelimelta ja kirjoita se tiedostoon."
#: src/utils/pacat.c:801
msgid ""
"Capture audio data from a PulseAudio sound server and write it to STDOUT or "
"the specified file."
msgstr ""
"Kaappaa äänidataa PulseAudio-äänipalvelimelta ja kirjoita se STDOUTiin tai "
"määritettyyn tiedostoon."
#: src/utils/pacat.c:805
msgid ""
"Play back audio data from STDIN or the specified file on a PulseAudio sound "
"server."
msgstr ""
"Toista äänidataa STDINistä tai määritetystä tiedostosta PulseAudio-"
"äänipalvelimella."
#: src/utils/pacat.c:819
#, c-format
@ -2074,7 +2079,7 @@ msgstr "Tuntematon tiedostomuoto %s."
#: src/utils/pacat.c:1000
msgid "Failed to parse the argument for --monitor-stream"
msgstr ""
msgstr "Argumentin --monitor-stream jäsentäminen epäonnistui"
#: src/utils/pacat.c:1011
msgid "Invalid sample specification"
@ -2204,7 +2209,7 @@ msgstr "NIMI|#N AVAIN=ARVO"
#: src/utils/pacmd.c:59
msgid "#N KEY=VALUE"
msgstr ""
msgstr "#N AVAIN=ARVO"
#: src/utils/pacmd.c:61
msgid "#N"
@ -2228,7 +2233,7 @@ msgstr "TIEDOSTONIMI NIELU|#N"
#: src/utils/pacmd.c:69 src/utils/pactl.c:2645
msgid "#N SINK|SOURCE"
msgstr ""
msgstr "#N SINKKI|LÄHDE"
#: src/utils/pacmd.c:71 src/utils/pacmd.c:77 src/utils/pacmd.c:78
msgid "1|0"
@ -2244,23 +2249,23 @@ msgstr "NIMI|#N PORT"
#: src/utils/pacmd.c:74 src/utils/pactl.c:2658
msgid "CARD-NAME|CARD-#N PORT OFFSET"
msgstr ""
msgstr "KORTIN NIMI|KORTIN-#N PORTTI OFFSET"
#: src/utils/pacmd.c:75
msgid "TARGET"
msgstr ""
msgstr "KOHDE"
#: src/utils/pacmd.c:76
msgid "NUMERIC-LEVEL"
msgstr ""
msgstr "NUMEROTASO"
#: src/utils/pacmd.c:79
msgid "FRAMES"
msgstr ""
msgstr "ÄÄNIRUUDUT"
#: src/utils/pacmd.c:80 src/utils/pactl.c:2659
msgid "RECIPIENT MESSAGE [MESSAGE_PARAMETERS]"
msgstr ""
msgstr "VASTAAJAN VIESTI [MESSAGE_PARAMETERS]"
#: src/utils/pacmd.c:82
#, c-format
@ -2370,6 +2375,12 @@ msgid ""
"Client Index: %u\n"
"Tile Size: %zu\n"
msgstr ""
"Palvelinmerkkijono: %s\n"
"Kirjastoprotokollan versio: %u\n"
"Palvelinprotokollan versio: %u\n"
"On paikallinen: %s\n"
"Asiakasindeksi: %u\n"
"Laattojen koko: %zu\n"
#: src/utils/pactl.c:294
#, c-format
@ -2396,7 +2407,7 @@ msgstr ""
#: src/utils/pactl.c:320
msgid "availability unknown"
msgstr ""
msgstr "saatavuus tuntematon"
#: src/utils/pactl.c:321
msgid "available"
@ -2412,7 +2423,7 @@ msgstr "Tuntematon"
#: src/utils/pactl.c:332
msgid "Aux"
msgstr ""
msgstr "Aux"
#: src/utils/pactl.c:335
msgid "Line"
@ -2420,27 +2431,27 @@ msgstr "Linja"
#: src/utils/pactl.c:336
msgid "Mic"
msgstr ""
msgstr "Mikrofoni"
#: src/utils/pactl.c:338
msgid "Handset"
msgstr ""
msgstr "Luuri"
#: src/utils/pactl.c:339
msgid "Earpiece"
msgstr ""
msgstr "Kuuloke"
#: src/utils/pactl.c:340
msgid "SPDIF"
msgstr ""
msgstr "SPDIF"
#: src/utils/pactl.c:341
msgid "HDMI"
msgstr ""
msgstr "HDMI"
#: src/utils/pactl.c:342
msgid "TV"
msgstr ""
msgstr "TV"
#: src/utils/pactl.c:345
msgid "USB"
@ -2511,11 +2522,11 @@ msgstr "\tPortit:\n"
#: src/utils/pactl.c:708 src/utils/pactl.c:892
#, c-format
msgid "\t\t%s: %s (type: %s, priority: %u%s%s, %s)\n"
msgstr ""
msgstr "\t\t%s: %s (tyyppi: %s, prioriteetti: %u%s%s, %s)\n"
#: src/utils/pactl.c:710 src/utils/pactl.c:894 src/utils/pactl.c:1256
msgid ", availability group: "
msgstr ""
msgstr ", saatavuusryhmä: "
#: src/utils/pactl.c:715 src/utils/pactl.c:899
#, c-format
@ -2653,6 +2664,7 @@ msgstr "\tProfiilit:\n"
#, c-format
msgid "\t\t%s: %s (sinks: %u, sources: %u, priority: %u, available: %s)\n"
msgstr ""
"\t\t%s: %s (nielut: %u, lähteet: %u, prioriteetti: %u, käytettävissä: %s)\n"
#: src/utils/pactl.c:1245
#, c-format
@ -2664,6 +2676,8 @@ msgstr "\tAktiivinen profiili: %s\n"
msgid ""
"\t\t%s: %s (type: %s, priority: %u, latency offset: %<PRId64> usec%s%s, %s)\n"
msgstr ""
"\t\t%s: %s (tyyppi: %s, prioriteetti: %u, latenssipoikkeama: %<PRId64> "
"usec%s%s, %s)\n"
#: src/utils/pactl.c:1261
#, c-format
@ -2671,11 +2685,13 @@ msgid ""
"\t\t\tProperties:\n"
"\t\t\t\t%s\n"
msgstr ""
"\t\t\tOminaisuudet:\n"
"\t\t\t\t%s\n"
#: src/utils/pactl.c:1265
#, c-format
msgid "\t\t\tPart of profile(s): %s"
msgstr ""
msgstr "\t\t\tOsa profiilista (profiileista): %s"
#: src/utils/pactl.c:1290 src/utils/pactl.c:1954 src/utils/pactl.c:2022
#, c-format
@ -2812,7 +2828,7 @@ msgstr "Viestin lähetys epäonnistui: %s"
#: src/utils/pactl.c:1695
#, c-format
msgid "list-handlers message failed: %s"
msgstr ""
msgstr "listakäsittelijöiden viesti epäonnistui: %s"
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
@ -2826,6 +2842,7 @@ msgstr "list-handlers viestivastaus ei ole JSON-taulukko"
#, c-format
msgid "list-handlers message response array element %d is not a JSON object"
msgstr ""
"listakäsittelijöiden viestivastaustaulukon elementti %d ei ole JSON-objekti"
#: src/utils/pactl.c:1800
#, c-format
@ -2841,7 +2858,11 @@ msgid_plural ""
"Failed to set volume: You tried to set volumes for %d channels, whereas "
"channel(s) supported = %d\n"
msgstr[0] ""
"Äänenvoimakkuuden asettaminen epäonnistui: Yritit asettaa äänenvoimakkuutta "
"%d kanavalle, kun taas tuetut kanavat = %d\n"
msgstr[1] ""
"Äänenvoimakkuuden asettaminen epäonnistui: Yritit asettaa äänenvoimakkuutta "
"%d kanaville, kun taas tuetut kanavat = %d\n"
#: src/utils/pactl.c:2107
#, c-format
@ -2878,7 +2899,7 @@ msgstr "lähde"
#: src/utils/pactl.c:2167
msgid "sink-input"
msgstr ""
msgstr "nielun sisääntulo"
#: src/utils/pactl.c:2170
msgid "source-output"
@ -2894,7 +2915,7 @@ msgstr "asiakas"
#: src/utils/pactl.c:2179
msgid "sample-cache"
msgstr ""
msgstr "näyte-välimuisti"
#: src/utils/pactl.c:2182
msgid "server"
@ -2902,12 +2923,12 @@ msgstr "palvelin"
#: src/utils/pactl.c:2185
msgid "card"
msgstr ""
msgstr "kortti"
#: src/utils/pactl.c:2206
#, c-format
msgid "Event '%s' on %s #%u\n"
msgstr ""
msgstr "Tapahtuma '%s' %s #%u\n"
#: src/utils/pactl.c:2514
msgid "Got SIGINT, exiting."
@ -2919,7 +2940,7 @@ msgstr "Virheellinen äänenvoimakkuuden määritys"
#: src/utils/pactl.c:2581
msgid "Volume outside permissible range.\n"
msgstr ""
msgstr "Äänenvoimakkuus sallitun alueen ulkopuolella.\n"
#: src/utils/pactl.c:2594
msgid "Invalid number of volume specifications.\n"
@ -2951,7 +2972,7 @@ msgstr "TIEDOSTONIMI [NIMI]"
#: src/utils/pactl.c:2641
msgid "NAME [SINK]"
msgstr ""
msgstr "NIMI [NIELU]"
#: src/utils/pactl.c:2653
msgid "NAME|#N VOLUME [VOLUME ...]"
@ -2980,6 +3001,9 @@ msgid ""
"The special names @DEFAULT_SINK@, @DEFAULT_SOURCE@ and @DEFAULT_MONITOR@\n"
"can be used to specify the default sink, source and monitor.\n"
msgstr ""
"\n"
"Erikoisnimiä @DEFAULT_SINK@, @DEFAULT_SOURCE@ ja @DEFAULT_MONITOR@\n"
"voidaan käyttää oletusnielun, lähteen ja näytön määrittämiseen.\n"
#: src/utils/pactl.c:2664
#, c-format
@ -3023,7 +3047,7 @@ msgstr "Virheellinen muotoarvo ”%s”"
#: src/utils/pactl.c:2778
#, c-format
msgid "Specify nothing, or one of: %s"
msgstr ""
msgstr "Määritä tyhjäksi tai jokin seuraavista: %s"
#: src/utils/pactl.c:2788
msgid "Please specify a sample file to load"
@ -3179,6 +3203,8 @@ msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
msgstr ""
"Ylimääräisiä argumentteja annettu, ne jätetään huomiotta. Huomaa, että "
"kaikki viestiparametrit on annettava yhtenä merkkijonona."
#: src/utils/pactl.c:3182
msgid ""
@ -3194,7 +3220,7 @@ msgstr "Kortin nimi/indeksi ja portin nimi ja viivästysasetus on annettava"
#: src/utils/pactl.c:3201
msgid "Could not parse latency offset"
msgstr ""
msgstr "Latenssipoikkeamaa ei voitu jäsentää"
#: src/utils/pactl.c:3213
msgid "No valid command specified."

View file

@ -16,9 +16,9 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2020-12-13 17:35+0000\n"
"Last-Translator: Julien Humbert <julroy67@gmail.com>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2023-03-19 17:20+0000\n"
"Last-Translator: grimst <grimaitres@gmail.com>\n"
"Language-Team: French <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/fr/>\n"
"Language: fr\n"
@ -26,10 +26,10 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
"X-Generator: Weblate 4.15.2\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"\n"
@ -114,8 +114,8 @@ msgstr ""
" --start Lancer le démon sil nest pas en "
"cours dexécution\n"
" -k --kill Tuer un démon en cours dexécution\n"
" --check Rechercher un démon en cours "
"dexécution (retourne uniquement un code de sortie)\n"
" --check Rechercher un démon en cours d"
"exécution (retourne uniquement un code de sortie)\n"
"\n"
"OPTIONS :\n"
" --system[=BOOL] Exécuter en tant quinstance "
@ -136,8 +136,8 @@ msgstr ""
"déchargement de modules\n"
" requis par lutilisateur de module "
"après le lancement\n"
" --disallow-exit[=BOOL] Interdire la sortie requise par "
"lutilisateur\n"
" --disallow-exit[=BOOL] Interdire la sortie requise par l"
"utilisateur\n"
" --exit-idle-time=SECS Quitter le démon lorsquinactif et "
"que cette\n"
" période sest écoulée\n"
@ -169,6 +169,8 @@ msgstr ""
"charge\n"
" --disable-shm[=BOOL] Désactiver la prise en charge de "
"mémoire partagée.\n"
" --enable-memfd[=BOOL] Activer le support de mémoire "
"partagée memfd.\n"
"\n"
"SCRIPT DE LANCEMENT :\n"
" -L, --load=\"MODULE ARGUMENTS\" Charger le module du greffon "
@ -501,29 +503,23 @@ msgstr ""
"plus précise en cours."
#: src/daemon/main.c:878
#, fuzzy
msgid "Running in system mode, but --disallow-exit not set."
msgstr ""
"Le démon sexécute en mode système, mais --disallow-exit nest pas défini!"
msgstr "Exécution en mode système, mais --disallow-exit nest pas défini."
#: src/daemon/main.c:881
#, fuzzy
msgid "Running in system mode, but --disallow-module-loading not set."
msgstr ""
"Le démon sexécute en mode système, mais --disallow-module-loading nest pas "
"défini!"
"Exécution en mode système, mais --disallow-module-loading nest pas défini."
#: src/daemon/main.c:884
#, fuzzy
msgid "Running in system mode, forcibly disabling SHM mode."
msgstr "Le démon sexécute en mode système, désactivation forcée du mode SHM!"
msgstr "Exécution en mode système, désactivation forcée du mode SHM."
#: src/daemon/main.c:889
#, fuzzy
msgid "Running in system mode, forcibly disabling exit idle time."
msgstr ""
"Le démon sexécute en mode système, désactivation forcée de la fermeture "
"après délai dinactivité!"
"Exécution en mode système, désactivation forcée de la fermeture après délai "
"dinactivité."
#: src/daemon/main.c:922
msgid "Failed to acquire stdio."
@ -558,7 +554,6 @@ msgid "Failed to get machine ID"
msgstr "Échec lors de lobtention de lID de la machine"
#: src/daemon/main.c:1145
#, fuzzy
msgid ""
"OK, so you are running PA in system mode. Please make sure that you actually "
"do want to do that.\n"
@ -566,13 +561,11 @@ msgid ""
"Documentation/User/WhatIsWrongWithSystemWide/ for an explanation why system "
"mode is usually a bad idea."
msgstr ""
"Vous exécutez PA dans un mode système. Sachez que vous ne devriez pas faire "
"cela.\n"
"Si vous choisissez malgré tout de le faire, vous êtes responsable de tout "
"dysfonctionnement inattendu.\n"
"Ok, vous êtes en train d'exécuter PA en mode système. Assurez-vous que vous "
"voulez vraiment faire cela.\n"
"Veuillez lire http://www.freedesktop.org/wiki/Software/PulseAudio/"
"Documentation/User/WhatIsWrongWithSystemWide/ pour comprendre pourquoi le "
"mode système est généralement une mauvaise idée."
"Documentation/User/WhatIsWrongWithSystemWide/ pour savoir pourquoi le mode "
"système est généralement une mauvaise idée."
#: src/daemon/main.c:1161
msgid "pa_pid_file_create() failed."
@ -583,9 +576,8 @@ msgid "pa_core_new() failed."
msgstr "Échec de pa_core_new()."
#: src/daemon/main.c:1268
#, fuzzy
msgid "command line arguments"
msgstr "Trop de paramètres."
msgstr "paramètres de la ligne de commande"
#: src/daemon/main.c:1275
#, c-format
@ -1184,8 +1176,8 @@ msgstr ""
"autoloaded=<définir si ce module est chargé automatiquement> "
"use_volume_sharing=<oui ou non> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1249,14 +1241,14 @@ msgstr "Audio sur @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel pour %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel vers %s/%s"
@ -1606,11 +1598,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Cible du journal non valide."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Audio interne"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -1858,11 +1850,10 @@ msgid "Cork request stack is empty: uncorking stream"
msgstr "La pile de requêtes de bouchons est vide : débouchonnage du flux"
#: src/utils/pacat.c:425
#, fuzzy
msgid "Warning: Received more uncork requests than cork requests."
msgstr ""
"Avertissement : il a été reçu davantage de requêtes de bouchonnage que de "
"requêtes de débouchonnage !"
"Avertissement : il a été reçu davantage de requêtes de bouchonnage que de "
"requêtes de bouchonnage."
#: src/utils/pacat.c:450
#, c-format

View file

@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: PulseAudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-09-01 12:04+0000\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2023-04-14 18:20+0000\n"
"Last-Translator: Fran Diéguez <frandieguez@gnome.org>\n"
"Language-Team: Galician <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/gl/>\n"
@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.8\n"
"X-Generator: Weblate 4.15.2\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -189,13 +189,13 @@ msgid "--fail expects boolean argument"
msgstr "--fail agarda un argumento booleano"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
msgstr ""
"--log-level agarda un argumento no nivel do rexistro (xa sexa numérico, "
"dentro do rango de 0..4; xa sexa un de debug, info, notice, warn, ou error)."
"dentro do rango de 0-4 ou ben un destos valores: error, warn, notice, info, "
"debug)."
#: src/daemon/cmdline.c:277
msgid "--high-priority expects boolean argument"
@ -1150,8 +1150,8 @@ msgstr ""
"de canles> autoloaded=<estabelézao se este módulo se carga automaticamente> "
"use_volume_sharing=<si ou non> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Ecualizador baseado en FFT en %s"
@ -1219,14 +1219,14 @@ msgstr "Son en @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Túnel para %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Túnel a %s/%s"
@ -1236,7 +1236,6 @@ msgid "Virtual surround sink"
msgstr "Sumideiro envolvente virtual"
#: src/modules/module-virtual-surround-sink.c:54
#, fuzzy
msgid ""
"sink_name=<name for the sink> sink_properties=<properties for the sink> "
"master=<name of sink to filter> sink_master=<name of sink to filter> "
@ -1247,9 +1246,9 @@ msgid ""
"this module is being loaded automatically> "
msgstr ""
"sink_name=<nome para o destino> sink_properties=<propiedades para o destino> "
"master=<nome do destino a filtrar> sink_master=<nome do destino a "
"filtrar>format=<formato de mostra> rate=<taxa de mostra> channels=<número de "
"canles> channel_map=<asignación de canles> use_volume_sharing=<si ou non> "
"master=<nome do destino a filtrar> sink_master=<nome do destino a filtrar> "
"format=<formato de mostra> rate=<taxa de mostra> channels=<número de canles> "
"channel_map=<asignación de canles> use_volume_sharing=<si ou non> "
"force_flat_volume=<si ou non> hrir=/ruta/ao/left_hrir.wav "
"autoloaded=<estabelecer se este módulo se vai cargar automaticamente> "
@ -1576,11 +1575,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Obxectivo do rexistro incorrecto."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Audio interno"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Módem"
@ -1895,7 +1894,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
msgstr "Produciuse un fallo en pa_stream_update_timing_info(): %s"
#: src/utils/pacat.c:676
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
@ -1974,8 +1973,10 @@ msgstr ""
" -v, --verbose Activar operacións verbosas\n"
"\n"
" -s, --server=SERVER O nome do servidor co que conectar\n"
" -d, --device=DEVICE O nome do dispositivo co que "
"conectar\n"
" -d, --device=DEVICE O nome do sumideiro/orixe ao que "
"conectarse. Os nomes especiais @DEFAULT_SINK@, @DEFAULT_SOURCE@ e "
"@DEFAULT_MONITOR@ poden usarse para especificar o sumideiro, orixe ou "
"monitor predeterminado respectivamente.\n"
" -n, --client-name=NAME Como chamar a este cliente no "
"servidor\n"
" --stream-name=NAME Como chamar a este fluxo no "
@ -1984,12 +1985,10 @@ msgstr ""
"inicial no intervalo entre 0...65536\n"
" --rate=SAMPLERATE A taxa de mostra en Hz (defaults to "
"44100)\n"
" --format=SAMPLEFORMAT O tipo de mostra, unha de s16le, "
"s16be, u8, float32le,\n"
" float32be, ulaw, alaw, s32le, s32be, "
"s24le, s24be,\n"
" s24-32le, s24-32be (o predeterminado "
"é s16ne)\n"
" --format=SAMPLEFORMAT O tipo de mostra, para máis "
"información vexa\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" --channels=CHANNELS O número de canles, 1 para mono, 2 "
"para estéreo\n"
" (predeterminado é 2)\n"
@ -2392,7 +2391,7 @@ msgid "Failed to get server information: %s"
msgstr "Produciuse un fallo ao tentar obter información do servidor: %s"
#: src/utils/pactl.c:224 src/utils/pactl.c:236
#, fuzzy, c-format
#, c-format
msgid "%s\n"
msgstr "%s\n"
@ -2473,22 +2472,18 @@ msgid "Earpiece"
msgstr "Auricular"
#: src/utils/pactl.c:340
#, fuzzy
msgid "SPDIF"
msgstr "SPDIF"
#: src/utils/pactl.c:341
#, fuzzy
msgid "HDMI"
msgstr "HDMI"
#: src/utils/pactl.c:342
#, fuzzy
msgid "TV"
msgstr "TV"
#: src/utils/pactl.c:345
#, fuzzy
msgid "USB"
msgstr "USB"
@ -2868,15 +2863,18 @@ msgstr "Produciuse un fallo no mensaxe list-handlers: %s"
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
msgstr ""
"Non foi posíbel analizar correctamente a resposta da mensaxe de list-handlers"
#: src/utils/pactl.c:1718
msgid "list-handlers message response is not a JSON array"
msgstr ""
msgstr "A respostaa da mensaxe de list-handlers non é unha matriz de JSON"
#: src/utils/pactl.c:1729
#, c-format
msgid "list-handlers message response array element %d is not a JSON object"
msgstr ""
"O elemento %d da matriz de resposta da mensaxe de list-handlers non é un "
"obxecto JSON"
#: src/utils/pactl.c:1800
#, c-format
@ -3040,7 +3038,7 @@ msgstr ""
"poden usarse para especificar o destino, orixe e monitor predeterminados.\n"
#: src/utils/pactl.c:2664
#, fuzzy, c-format
#, c-format
msgid ""
"\n"
" -h, --help Show this help\n"
@ -3056,6 +3054,9 @@ msgstr ""
"\n"
" -h, --help Mostra esta axuda\n"
" --version Mostra a versión\n"
"\n"
" -f, --format=FORMAT O formato da saída. Puede ser "
"«normal» o «json»\n"
" -s, --server=SERVIDOR O nome do servidor co que conectar\n"
" -n, --client-name=NOME Como chamar a este cliente no "
"servidor\n"
@ -3072,9 +3073,9 @@ msgstr ""
"Vinculado con libpulse %s\n"
#: src/utils/pactl.c:2751
#, fuzzy, c-format
#, c-format
msgid "Invalid format value '%s'"
msgstr "Nome do fluxo «%s» incorrecto"
msgstr "Formato do valor «%s» incorrecto"
#: src/utils/pactl.c:2778
#, c-format
@ -3159,18 +3160,16 @@ msgid "You have to specify a source name"
msgstr "Ten que especificar un nome para a fonte"
#: src/utils/pactl.c:2998 src/utils/pactl.c:3076
#, fuzzy
msgid "You have to specify a sink name/index"
msgstr "Ten que especificar un nome de destino"
msgstr "Ten que especificar un nome/índice de destino"
#: src/utils/pactl.c:3008
msgid "You have to specify a sink name/index and a volume"
msgstr "Debe especificar un nome/índice de destino e un volume"
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101
#, fuzzy
msgid "You have to specify a source name/index"
msgstr "Ten que especificar un nome para a fonte"
msgstr "Ten que especificar un nome/índice de fonte"
#: src/utils/pactl.c:3031
msgid "You have to specify a source name/index and a volume"
@ -3235,15 +3234,18 @@ msgid "Invalid source output index specification"
msgstr "Especificación de índice de saída de orixe non válida"
#: src/utils/pactl.c:3162
#, fuzzy
msgid "You have to specify at least an object path and a message name"
msgstr "Debe especificar un nome/índice de destino e un nome de porto"
msgstr ""
"Debe especificar cando menos unha ruta de acceso ao obxecto e un nome de "
"mensaxe"
#: src/utils/pactl.c:3172
msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
msgstr ""
"Fornecéronse argumentos de máis, serán ignorados. Teña en conta que todos os "
"parámetros de mensaxe deben ingresarse como unha única cadea."
#: src/utils/pactl.c:3182
msgid ""
@ -3308,7 +3310,7 @@ msgid "WARNING: Child process terminated by signal %u\n"
msgstr "AVISO: o proceso fillo foi rematado polo sinal %u\n"
#: src/utils/pasuspender.c:228
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options] -- PROGRAM [ARGUMENTS ...]\n"
"\n"
@ -3320,7 +3322,9 @@ msgid ""
"to\n"
"\n"
msgstr ""
"%s [opcións] ... \n"
"%s [opcións] --PROGRAMA [ARGUMENTOS ...]... \n"
"\n"
"Suspende temporalmente PulseAudio mentres se executa o PROGRAMA.\n"
"\n"
" -h, --help Mostra esta axuda\n"
" --version Mostra a versión\n"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PulseAudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:53+0000\n"
"Last-Translator: Sweta Kothari <swkothar@redhat.com>\n"
"Language-Team: Gujarati\n"
@ -1147,8 +1147,8 @@ msgstr ""
"plugin name> label=<ladspa plugin label> control=<comma separated list of "
"input control values>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1211,14 +1211,14 @@ msgstr "@HOSTNAME@ પર ઓડિયો"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1569,11 +1569,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] અયોગ્ય લોગ લક્ષ્ય '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "આંતરિક ઓડિયો"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "મોડેમ"

View file

@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2021-05-12 11:02+0000\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <https://translate.fedoraproject.org/projects/"
@ -980,8 +980,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1038,14 +1038,14 @@ msgstr ""
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1382,11 +1382,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "צליל פנימי"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "מודם"

1754
po/hi.po

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-03-28 19:10+0000\n"
"Last-Translator: Gogo Gogsi <linux.hr@protonmail.com>\n"
"Language-Team: Croatian <https://translate.fedoraproject.org/projects/"
@ -1160,6 +1160,8 @@ msgstr ""
"autoloaded=<postavi ako se ovaj modul učitava automatski> "
"use_volume_sharing=<da ili ne> "
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#, c-format
@ -1227,12 +1229,16 @@ msgstr "Zvuk na @NAZIVRAČUNALA@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel za %s@%s"
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#, c-format
@ -1583,11 +1589,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Neispravno odredište zapisa."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609 src/pulsecore/sink.c:3600
msgid "Built-in Audio"
msgstr "Ugrađeni zvuk"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614 src/pulsecore/sink.c:3605
msgid "Modem"
msgstr "Modem"
@ -1904,7 +1910,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
msgstr "pa_stream_update_timing_info() neuspjelo: %s"
#: src/utils/pacat.c:676
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
@ -1985,7 +1991,9 @@ msgstr ""
" -s, --server=POSLUŽITELJ Naziv poslužitelja za "
"povezivanje\n"
" -d, --device=UREĐAJ Naziv slivnika/izvora za "
"povezivanje\n"
"povezivanje. Posebni nazivi @DEFAULT_SINK@, @DEFAULT_SOURCE@ i "
"@DEFAULT_MONITOR@ mogu se koristiti za određivanje zadanog slivnika, izvora "
"i nadgledanja.\n"
" -n, --client-name=NAZIV Naziv klijenta na poslužitelju\n"
" --stream-name=NAZIV Naziv strujanja na poslužitelju\n"
" --volume=GLASNOĆA ZVUKA Određuje početnu (linearnu) "
@ -1994,7 +2002,7 @@ msgstr ""
" --format=FORMAT UZORKA Vrsta uzorka, pogledajte\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" za moguće vrijenosti (zadano je "
" za moguće vrijednosti (zadano je "
"s16ne)\n"
" --channels=KANALI Broj kanala, 1 za mono, 2 za stereo\n"
" (zadano 2)\n"
@ -2002,14 +2010,14 @@ msgstr ""
"umjesto zadanog\n"
" --fix-format Uzima uzorak formata iz slivnika/"
"izvora s kojim\n"
" je tok povezan.\n"
" je strujanje povezano.\n"
" --fix-rate Uzima frekvenciju iz slivnika/izvora "
"s kojim\n"
" je tok povezan.\n"
" je strujanje povezano.\n"
" --fix-channels Uzima broj kanala i mapiranje "
"kanala\n"
" iz slivnika/izvora s kojim je tok "
"povezan.\n"
" iz slivnika/izvora s kojim je "
"strujanje povezano.\n"
" --no-remix Ne smanjuj ili pojačavaj kanale.\n"
" --no-remap Mapiraj kanale prema sadržaju "
"umjesto nazivu.\n"
@ -2021,8 +2029,8 @@ msgstr ""
"msek.\n"
" --process-time-msec=MSEK Zahtijevaj određeno vrijeme procesa "
"po zahtjevu u msek.\n"
" --property=VLASNIŠTVO=VRIJEDNOST Postavi određeno vlasništvo "
"za određenu vrijednost.\n"
" --property=SVOJSTVO=VRIJEDNOST Postavi određeno svojstvo za "
"određenu vrijednost.\n"
" --raw Snimaj/Reproduciraj osnovne PCM "
"podatke.\n"
" --passthrough Prolaz podataka.\n"

View file

@ -10,9 +10,9 @@ msgstr ""
"Project-Id-Version: PulseAudio master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-11-21 13:16+0000\n"
"Last-Translator: . Ovari <ovari123@zoho.com>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-08-09 21:19+0000\n"
"Last-Translator: Balázs Meskó <meskobalazs@mailbox.org>\n"
"Language-Team: Hungarian <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/hu/>\n"
"Language: hu\n"
@ -20,13 +20,13 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.9\n"
"X-Generator: Weblate 4.13\n"
"X-Poedit-Language: Hungarian\n"
"X-Poedit-Country: HUNGARY\n"
"X-Poedit-SourceCharset: utf-8\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"\n"
@ -187,7 +187,6 @@ msgid "--fail expects boolean argument"
msgstr "a --fail paraméter logikai értéket vár"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
@ -216,14 +215,13 @@ msgid "--use-pid-file expects boolean argument"
msgstr "a --use-pid-file paraméter logikai értéket vár"
#: src/daemon/cmdline.c:328
#, fuzzy
msgid ""
"Invalid log target: use either 'syslog', 'journal', 'stderr' or 'auto' or a "
"valid file name 'file:<path>', 'newfile:<path>'."
msgstr ""
"Érvénytelen naplózási cél: használja a „syslog”, „journal”, „stderr” vagy az "
"„auto” egyikét, vagy egy érvényes fájlnevet: „file:<útvonal>”, „newfile:"
"<útvonal>”."
"„auto” egyikét, vagy egy érvényes fájlnevet: „file:<útvonal>”, "
"„newfile:<útvonal>”."
#: src/daemon/cmdline.c:330
msgid ""
@ -960,7 +958,7 @@ msgstr ""
"más érték volt."
#: src/modules/alsa/alsa-util.c:1183 src/modules/alsa/alsa-util.c:1277
#, fuzzy, c-format
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
"ms).\n"
@ -983,7 +981,7 @@ msgstr[1] ""
"ezt a problémát az ALSA fejlesztői felé."
#: src/modules/alsa/alsa-util.c:1249
#, fuzzy, c-format
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
@ -1019,7 +1017,7 @@ msgstr ""
"ezt a problémát az ALSA fejlesztői felé."
#: src/modules/alsa/alsa-util.c:1339
#, fuzzy, c-format
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
"(%lu ms).\n"
@ -1163,8 +1161,8 @@ msgstr ""
"channel_map=<csatornaleképzés> autoloaded=<beállítva, ha ez a modul "
"automatikusan betöltődik> use_volume_sharing=<igen vagy nem> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT alapú hangszínszabályzó ezen: %s"
@ -1178,7 +1176,6 @@ msgid "Virtual LADSPA sink"
msgstr "Látszólagos LADSPA nyelő"
#: src/modules/module-ladspa-sink.c:54
#, fuzzy
msgid ""
"sink_name=<name for the sink> sink_properties=<properties for the sink> "
"sink_input_properties=<properties for the sink input> master=<name of sink "
@ -1197,7 +1194,8 @@ msgstr ""
"control=<bemenetszabályzó értékek vesszővel elválasztott listája> "
"input_ladspaport_map=<bemeneti LADSPA portnevek vesszővel elválasztott "
"listája> output_ladspaport_map=<kimeneti LADSPA portnevek vesszővel "
"elválasztott listája> "
"elválasztott listája> autoloaded=<állítsa be ha a modul automatikusan "
"töltődik be> "
#: src/modules/module-null-sink.c:46
msgid "Clocked NULL sink"
@ -1230,14 +1228,14 @@ msgstr "Hangok ezen a számítógépen: @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Alagút ennek: %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Alagút ehhez: %s/%s"
@ -1247,7 +1245,6 @@ msgid "Virtual surround sink"
msgstr "Virtuális térhatású nyelő"
#: src/modules/module-virtual-surround-sink.c:54
#, fuzzy
msgid ""
"sink_name=<name for the sink> sink_properties=<properties for the sink> "
"master=<name of sink to filter> sink_master=<name of sink to filter> "
@ -1262,6 +1259,7 @@ msgstr ""
"rate=<mintavételezési gyakoriság> channels=<csatornák száma> "
"channel_map=<csatornaleképzés> use_volume_sharing=<igen vag nem> "
"force_flat_volume=<igen vag nem> hrir=/útvonal/left_hrir.wav "
"autoloaded=<állítsa be ha a modul automatikusan töltődik be> "
#: src/modules/raop/module-raop-discover.c:295
msgid "Unknown device model"
@ -1546,7 +1544,7 @@ msgid "invalid"
msgstr "érvénytelen"
#: src/pulsecore/core-util.c:1790
#, fuzzy, c-format
#, c-format
msgid ""
"XDG_RUNTIME_DIR (%s) is not owned by us (uid %d), but by uid %d! (This could "
"e.g. happen if you try to connect to a non-root PulseAudio as a root user, "
@ -1554,7 +1552,7 @@ msgid ""
msgstr ""
"Az XDG_RUNTIME_DIR (%s) tulajdonosa nem a PulseAudio (uid %d), hanem ez az "
"uid: %d! (Ez például akkor fordulhat elő, ha egy nem rootként futó "
"PulseAudio-hoz root felhasználóként próbál csatlakozni a natív protokollon. "
"PulseAudióhoz root felhasználóként próbál csatlakozni a natív protokollon. "
"Ne tegye.)"
#: src/pulsecore/core-util.h:97
@ -1586,11 +1584,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Érvénytelen naplózási cél."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Belső hangforrás"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -1910,7 +1908,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
msgstr "A „pa_stream_update_timing_info()” függvényhívás meghiúsult: %s"
#: src/utils/pacat.c:676
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
@ -1977,7 +1975,7 @@ msgid ""
" --monitor-stream=INDEX Record from the sink input with "
"index INDEX.\n"
msgstr ""
"%s [KAPCSOLÓ]\n"
"%s [KAPCSOLÓK]\n"
"\n"
"%s\n"
"\n"
@ -2020,8 +2018,8 @@ msgstr ""
" --fix-channels A csatornaszám és a csatornaleképzés "
"átvétele a nyelőtől/forrástól,\n"
" amelyhez az adatfolyam csatlakozik.\n"
" --no-remix Ne keverjen fel vagy le "
"csatornákat.\n"
" --no-remix Ne keverjen fel vagy le csatornákat."
"\n"
" --no-remap Csatornák leképezése index és nem "
"név szerint.\n"
" --latency=BÁJT A bájtokban megadott késleltetés "
@ -2376,14 +2374,14 @@ msgid "Failed to get statistics: %s"
msgstr "Nem sikerült a statisztika lekérdezése: %s"
#: src/utils/pactl.c:199
#, fuzzy, c-format
#, c-format
msgid "Currently in use: %u block containing %s bytes total.\n"
msgid_plural "Currently in use: %u blocks containing %s bytes total.\n"
msgstr[0] "Jelenleg használt: %u blokk, összesen %s bájt tartalommal.\n"
msgstr[1] "Jelenleg használt: %u blokk, összesen %s bájt tartalommal.\n"
#: src/utils/pactl.c:205
#, fuzzy, c-format
#, c-format
msgid "Allocated during whole lifetime: %u block containing %s bytes total.\n"
msgid_plural ""
"Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
@ -2562,9 +2560,9 @@ msgid "\tPorts:\n"
msgstr "\tPortok:\n"
#: src/utils/pactl.c:708 src/utils/pactl.c:892
#, fuzzy, c-format
#, c-format
msgid "\t\t%s: %s (type: %s, priority: %u%s%s, %s)\n"
msgstr "\t\t%s: %s (nyelők: %u, források: %u, prioritás: %u, elérhető: %s)\n"
msgstr "\t\t%s: %s (típus: %s, prioritás: %u%s%s, %s)\n"
#: src/utils/pactl.c:710 src/utils/pactl.c:894 src/utils/pactl.c:1256
msgid ", availability group: "
@ -2717,6 +2715,8 @@ msgstr "\tAktív profil: %s\n"
msgid ""
"\t\t%s: %s (type: %s, priority: %u, latency offset: %<PRId64> usec%s%s, %s)\n"
msgstr ""
"\t\t%s: %s (típus: %s, prioritás: %u, késleltetési eltolás: %<PRId64> "
"usec%s%s, %s)\n"
#: src/utils/pactl.c:1261
#, c-format
@ -2888,7 +2888,7 @@ msgid "Failed to unload module: Module %s not loaded"
msgstr "Nem sikerült eltávolítani a modult: nincs betöltve %s nevű modul"
#: src/utils/pactl.c:1818
#, fuzzy, c-format
#, c-format
msgid ""
"Failed to set volume: You tried to set volumes for %d channel, whereas "
"channel(s) supported = %d\n"
@ -3044,7 +3044,7 @@ msgstr ""
"használhatók az alapértelmezett nyelő, forrás és megfigyelő megadására.\n"
#: src/utils/pactl.c:2664
#, fuzzy, c-format
#, c-format
msgid ""
"\n"
" -h, --help Show this help\n"
@ -3061,6 +3061,8 @@ msgstr ""
" -h, --help Ezen súgó megjelenítése\n"
" --version Verziószám megjelenítése\n"
"\n"
" -f, --format=FORMAT A kimenet formátuma. „normal” vagy "
"„json”.\n"
" -s, --server=KISZOLGÁLÓ Csatlakozás ehhez a kiszolgálóhoz\n"
" -n, --client-name=NÉV A kliens neve a kiszolgálón\n"
@ -3159,18 +3161,16 @@ msgid "You have to specify a source name"
msgstr "Meg kell adnia egy forrás nevét"
#: src/utils/pactl.c:2998 src/utils/pactl.c:3076
#, fuzzy
msgid "You have to specify a sink name/index"
msgstr "Meg kell adnia egy nyelő nevét"
msgstr "Meg kell adnia egy nyelő nevét/indexét"
#: src/utils/pactl.c:3008
msgid "You have to specify a sink name/index and a volume"
msgstr "Meg kell adnia egy nyelő nevét vagy indexét és egy hangerőt"
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101
#, fuzzy
msgid "You have to specify a source name/index"
msgstr "Meg kell adnia egy forrás nevét"
msgstr "Meg kell adnia egy forrás nevét/indexét"
#: src/utils/pactl.c:3031
msgid "You have to specify a source name/index and a volume"
@ -3235,15 +3235,17 @@ msgid "Invalid source output index specification"
msgstr "A forrás bemeneti indexének megadása érvénytelen"
#: src/utils/pactl.c:3162
#, fuzzy
msgid "You have to specify at least an object path and a message name"
msgstr "Meg kell adnia a nyelő nevét vagy indexét, és egy port nevét"
msgstr "Meg kell adnia legalább egy objektumútvonalat és egy üzenetnevet"
#: src/utils/pactl.c:3172
msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
msgstr ""
"Túl sok argumentum lett megadva, figyelmen kívül lesznek hagyva. Vegye "
"figyelembe, hogy az üzenetparamétereket egyetlen karakterláncban kell "
"megadni."
#: src/utils/pactl.c:3182
msgid ""
@ -3309,7 +3311,7 @@ msgstr ""
"FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n"
#: src/utils/pasuspender.c:228
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options] -- PROGRAM [ARGUMENTS ...]\n"
"\n"
@ -3321,7 +3323,9 @@ msgid ""
"to\n"
"\n"
msgstr ""
"%s [KAPCSOLÓK] ... \n"
"%s [KAPCSOLÓK] -- PROGRAM [ARGUMENTUMOK …]\n"
"\n"
"A PulseAudio ideiglenes felfüggesztése, amíg a PROGRAM fut.\n"
"\n"
" -h, --help Ezen súgó megjelenítése\n"
" --version Verziószám megjelenítése\n"

176
po/id.po
View file

@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: PulseAudio master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-09-24 12:05+0000\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2024-11-03 10:40+0000\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"Language-Team: Indonesian <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/id/>\n"
@ -19,10 +19,10 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.8\n"
"X-Generator: Weblate 5.8.2\n"
#: src/daemon/cmdline.c:113
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"\n"
@ -113,8 +113,8 @@ msgstr ""
"OPSI:\n"
" --system[=BOOL] Jalankan sebagai instansi seluruh "
"sistem\n"
" -D, --daemonize[=BOOL] Jadikan daemon setelah awalan\n"
" --fail[=BOOL] Keluar ketika awalan gagal\n"
" -D, --daemonize[=BOOL] Jadikan daemon setelah awal mula\n"
" --fail[=BOOL] Keluar ketika awal mula gagal\n"
" --high-priority[=BOOL] Coba tata ke aras nice tinggi\n"
" (hanya tersedia sebagai root, ketika "
"SUID\n"
@ -126,21 +126,19 @@ msgstr ""
" atau RLIMIT_RTPRIO yang dinaikkan)\n"
" --disallow-module-loading[=BOOL] Larang muat/bongkar modul yang "
"diminta\n"
" pengguna setelah awalan\n"
" pengguna setelah awal mula\n"
" --disallow-exit[=BOOL] Larang permintaan keluar dari "
"pengguna\n"
" --exit-idle-time=SECS Matikan daemon ketika menganggur "
"dan\n"
" waktu ini habis\n"
" --module-idle-time=SECS Bongkar modul yang dimuat sendiri "
"ketika\n"
" menganggur dan waktu ini habis\n"
" waktu ini berlalu\n"
" --scache-idle-time=SECS Bongkar contoh yang dimuat sendiri "
"ketika\n"
" menganggur dan waktu ini habis\n"
" menganggur dan waktu ini berlalu\n"
" --log-level[=LEVEL] Naikkan atau tata aras kerincian\n"
" -v Naikkan aras kerincian\n"
" --log-target={auto,syslog,stderr} Nyatakan target log\n"
" -v --verbose Naikkan aras kerincian\n"
" --log-target={auto,syslog,stderr,file:PATH,newfile:PATH} \n"
" Nyatakan target log\n"
" --log-meta[=BOOL] Sertakan lokasi kode dalam pesan "
"log\n"
" --log-time[=BOOL] Sertakan penanda waktu dalam pesan "
@ -159,8 +157,10 @@ msgstr ""
" --no-cpu-limit[=BOOL] Jangan pasang pembatas beban CPU\n"
" pada platform yang mendukungannya.\n"
" --disable-shm[=BOOL] Matikan dukungan memori bersama.\n"
" --enable-memfd[=BOOL] Fungsikan dukungan memori bersama "
"memfd.\n"
"\n"
"SKRIP AWALAN:\n"
"SKRIP AWAL MULA:\n"
" -L, --load=\"ARGUMEN MODUL\" Muat modul plugin yang dinyatakan\n"
" dengan argumen yang disertakan\n"
" -F, --file=NAMABERKAS Jalankan skrip yang dinyatakan\n"
@ -179,13 +179,12 @@ msgid "--fail expects boolean argument"
msgstr "--fail mengharapkan argumen bool"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
msgstr ""
"--log-level mengharapkan argumen aras log (bisa berupa angka 0..4 atau salah "
"satu dari debug, info, notice, warn, error)."
"satu dari error, warn, notice, info, debug)."
#: src/daemon/cmdline.c:277
msgid "--high-priority expects boolean argument"
@ -591,12 +590,10 @@ msgid "Docking Station Microphone"
msgstr "Mikrofon Docking Station"
#: src/modules/alsa/alsa-mixer.c:2711
#, fuzzy
msgid "Docking Station Line In"
msgstr "Jalur Masuk Docking Station"
#: src/modules/alsa/alsa-mixer.c:2712 src/modules/alsa/alsa-mixer.c:2803
#, fuzzy
msgid "Line In"
msgstr "Jalur Masuk"
@ -698,7 +695,6 @@ msgid "Headphones Mono Output"
msgstr "Keluaran Mono Headphone"
#: src/modules/alsa/alsa-mixer.c:2810
#, fuzzy
msgid "Line Out"
msgstr "Jalur Keluar"
@ -731,9 +727,8 @@ msgid "Multichannel Output"
msgstr "Keluaran Multikanal"
#: src/modules/alsa/alsa-mixer.c:2818
#, fuzzy
msgid "Game Output"
msgstr "Keluaran %s"
msgstr "Keluaran Game"
#: src/modules/alsa/alsa-mixer.c:2819 src/modules/alsa/alsa-mixer.c:2820
msgid "Chat Output"
@ -941,7 +936,7 @@ msgstr ""
"mengembalikan 0 atau nilai lain < min_avail."
#: src/modules/alsa/alsa-util.c:1183 src/modules/alsa/alsa-util.c:1277
#, fuzzy, c-format
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
"ms).\n"
@ -953,13 +948,13 @@ msgid_plural ""
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
"to the ALSA developers."
msgstr[0] ""
"snd_pcm_avail() mengembalikan nilai yang luar biasa besar: %lu byte (%lu "
"ms).\n"
"snd_pcm_avail() mengembalikan nilai yang luar biasa besar: %lu byte (%lu ms)."
"\n"
"Sangat mungkin ini adalah kutu pada driver ALSA '%s'. Silakan laporkan hal "
"ini ke para pengembang ALSA."
#: src/modules/alsa/alsa-util.c:1249
#, fuzzy, c-format
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
@ -990,7 +985,7 @@ msgstr ""
"kasus ini ke para pengembang ALSA."
#: src/modules/alsa/alsa-util.c:1339
#, fuzzy, c-format
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
"(%lu ms).\n"
@ -1002,8 +997,8 @@ msgid_plural ""
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
"to the ALSA developers."
msgstr[0] ""
"snd_pcm_mmap_begin() mengembalikan nilai yang luar biasa besar: %lu byte "
"(%lu ms).\n"
"snd_pcm_mmap_begin() mengembalikan nilai yang luar biasa besar: %lu byte ("
"%lu ms).\n"
"Sangat mungkin ini adalah kutu pada driver ALSA '%s'. Silakan laporkan hal "
"ini ke para pengembang ALSA."
@ -1043,37 +1038,30 @@ msgid "Phone"
msgstr "Telepon"
#: src/modules/bluetooth/module-bluez5-device.c:2042
#, fuzzy
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "High Fidelity Playback (Muara A2DP)"
msgstr "Putar High Fidelity (Muara A2DP)"
#: src/modules/bluetooth/module-bluez5-device.c:2054
#, fuzzy
msgid "High Fidelity Capture (A2DP Source)"
msgstr "High Fidelity Capture (Sumber A2DP)"
msgstr "Penangkapan High Fidelity (Sumber A2DP)"
#: src/modules/bluetooth/module-bluez5-device.c:2066
#, fuzzy
msgid "Headset Head Unit (HSP)"
msgstr "Headset Head Unit (HSP/HFP)"
#: src/modules/bluetooth/module-bluez5-device.c:2079
#, fuzzy
msgid "Headset Audio Gateway (HSP)"
msgstr "Headset Audio Gateway (HSP/HFP)"
msgstr "Gateway Audio Headset (HSP/HFP)"
#: src/modules/bluetooth/module-bluez5-device.c:2092
#, fuzzy
msgid "Handsfree Head Unit (HFP)"
msgstr "Headset Head Unit (HSP/HFP)"
msgstr "Unit Kepala Handsfree (HFP)"
#: src/modules/bluetooth/module-bluez5-device.c:2105
#, fuzzy
msgid "Handsfree Audio Gateway (HFP)"
msgstr "Headset Audio Gateway (HSP/HFP)"
msgstr "Gateway Audio Handsfree (HSP/HFP)"
#: src/modules/echo-cancel/module-echo-cancel.c:59
#, fuzzy
msgid ""
"source_name=<name for the source> source_properties=<properties for the "
"source> source_master=<name of source to filter> sink_name=<name for the "
@ -1086,16 +1074,16 @@ msgid ""
"loaded automatically> use_volume_sharing=<yes or no> use_master_format=<yes "
"or no> "
msgstr ""
"source_name=<name for the source> source_properties=<properties for the "
"source> source_master=<name of source to filter> sink_name=<name for the "
"sink> sink_properties=<properties for the sink> sink_master=<name of sink to "
"filter> adjust_time=<how often to readjust rates in s> adjust_threshold=<how "
"much drift to readjust after in ms> format=<sample format> rate=<sample "
"rate> channels=<number of channels> channel_map=<channel map> "
"aec_method=<implementation to use> aec_args=<parameters for the AEC engine> "
"save_aec=<save AEC data in /tmp> autoloaded=<set if this module is being "
"loaded automatically> use_volume_sharing=<yes or no> use_master_format=<yes "
"or no> "
"source_name=<nama sumber> source_properties=<properti sumber> "
"source_master=<nama sumber untuk disaring> sink_name=<nama muara> "
"sink_properties=<properti muara> sink_master=<nama muara untuk disaraing> "
"adjust_time=<seberapa sering menyetel ulang laju dalam detik> "
"adjust_threshold=<seberapa banyak drift disetel ulang setelahnya dalam mili "
"detik> format=<format cuplikan> rate=<laju cuplikan> channels=<cacah kanal> "
"channel_map=<peta kanal> aec_method=<implementasi yang dipakai> "
"aec_args=<parameter bagi mesin AEC> save_aec=<simpan data AEC dalam /tmp> "
"autoloaded=<tata apakah modul ini dimuat secara otomatis> "
"use_volume_sharing=<yes atau no> use_master_format=<yes atau no> "
#. add on profile
#: src/modules/macosx/module-coreaudio-device.c:825
@ -1116,7 +1104,6 @@ msgid "Always keeps at least one source loaded even if it's a null one"
msgstr "Selalu jaga paling tidak satu muara bermuatan bahkan jika berupa null"
#: src/modules/module-equalizer-sink.c:68
#, fuzzy
msgid "General Purpose Equalizer"
msgstr "Equalizer Tujuan Umum"
@ -1132,8 +1119,8 @@ msgstr ""
"channels=<cacah kanal> channel_map=<peta kanal> autoloaded=<tata bila modul "
"ini dimuat secara otomatis> use_volume_sharing=<yes atau no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Ekualiser berbasis FFT pada %s"
@ -1147,7 +1134,6 @@ msgid "Virtual LADSPA sink"
msgstr "Muara virtual LADSPA"
#: src/modules/module-ladspa-sink.c:54
#, fuzzy
msgid ""
"sink_name=<name for the sink> sink_properties=<properties for the sink> "
"sink_input_properties=<properties for the sink input> master=<name of sink "
@ -1159,15 +1145,15 @@ msgid ""
"separated list of output LADSPA port names> autoloaded=<set if this module "
"is being loaded automatically> "
msgstr ""
"sink_name=<nama bagi muara> sink_properties=<properti bagi muara> "
"sink_input_properties=<properti bagi masukan muara> master=<nama muara untuk "
"sink_name=<nama muara> sink_properties=<properti muara> "
"sink_input_properties=<properti masukan muara> master=<nama muara untuk "
"disaring> sink_master=<nama muara yang akan disaring> format=<format "
"cuplikan> rate=<laju cuplikan> channels=<cacah kanal> channel_map=<peta "
"kanal> plugin=<nama plugin ladspa> label=<label plugin ladspa> "
"control=<daftar nilai kendali masukan yang dipisahkan dengan koma> \n"
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
"output_ladspaport_map=<comma separated list of output LADSPA port names> "
"autoloaded=<set if this module is being loaded automatically> "
"control=<daftar nilai kendali masukan yang dipisah koma> "
"input_ladspaport_map=<daftar dipisah koma dari nama port masukan LADSPA> "
"output_ladspaport_map=<daftar dipisah koma dari nama port keluaran LADSPA> "
"autoloaded=<tata apakah modul dimuat secara otomatis> "
#: src/modules/module-null-sink.c:46
msgid "Clocked NULL sink"
@ -1200,14 +1186,14 @@ msgstr "Audio pada @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel untuk %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel ke %s/%s"
@ -1557,11 +1543,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Target log tidak valid."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Audio Bawaan"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -1876,7 +1862,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
msgstr "pa_stream_update_timing_info() gagal: %s"
#: src/utils/pacat.c:676
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
@ -1955,7 +1941,9 @@ msgstr ""
" -v, --verbose Aktifkan operasi cerewet\n"
"\n"
" -s, --server=SERVER Nama server untuk dihubungi\n"
" -d, --device=DEVICE Nama muara/sumber untuk dihubungi\n"
" -d, --device=DEVICE Nama muara/sumber untuk dihubungi. "
"Nama khusus @DEFAULT_SINK@, @DEFAULT_SOURCE@, dan @DEFAULT_MONITOR@ masing-"
"masing dapat dipakai untuk menyatakan muara, sumber, dan monitor.\n"
" -n, --client-name=NAME Bagaimana memanggil klien ini di "
"server\n"
" --stream-name=NAME Bagaimana memanggil stream ini di "
@ -1964,35 +1952,34 @@ msgstr ""
"jangkauan 0...65536\n"
" --rate=SAMPLERATE Laju cuplikan dalam Hz (nilai baku "
"44100)\n"
" --format=SAMPLEFORMAT Jenis cuplikan, salah satu dari "
"s16le, s16be, u8, float32le,\n"
" float32be, ulaw, alaw, s32le, s32be, "
"s24le, s24be,\n"
" s24-32le, s24-32be (nilai baku "
"s16ne)\n"
" --format=SAMPLEFORMAT Format cuplikan, lihat\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" untuk nilai-nilai yang mungkin ("
"nilai baku s16ne)\n"
" --channels=CHANNELS Cacah kanal, 1 untuk mono, 2 untuk "
"stereo\n"
" (nilai baku 2)\n"
" --channel-map=CHANNELMAP Peta kanal yang dipakai sebagai "
"pengganti baku\n"
" --fix-format Ambil format cuplikan dari muara "
"stream\n"
" --fix-format Ambil format cuplikan dari muara/"
"sumber stream\n"
" yang sedang tersambung.\n"
" --fix-rate Ambil laju cuplikan dari muara "
"stream\n"
" --fix-rate Ambil laju cuplikan dari muara/"
"sumber stream\n"
" yang sedang tersambung.\n"
" --fix-channels Ambil cacah kanal dan peta kanal "
"dari muara stream\n"
"dari muara/sumber stream\n"
" yang sedang tersambung.\n"
" --no-remix Jangan upmix atau downmix kanal.\n"
" --no-remap Petakan kanal berdasar indeks bukan "
"nama.\n"
" --latency=BYTE Minta latensi yang dinyatakan, dalam "
" --latency=BYTE Minta latensi yang dinyatakan dalam "
"byte.\n"
" --process-time=BYTE Minta waktu proses yang dinyatakan "
"bagi tiap permintaan\n"
" dalam byte.\n"
" --latency-msec=MSEC Minta latensi yang dinyatakan, dalam "
" --latency-msec=MSEC Minta latensi yang dinyatakan dalam "
"milidetik.\n"
" --process-time-msec=MSEC Minta waktu proses yang dinyatakan "
"bagi tiap permintaan\n"
@ -2262,12 +2249,10 @@ msgid "TARGET"
msgstr "TARGET"
#: src/utils/pacmd.c:76
#, fuzzy
msgid "NUMERIC-LEVEL"
msgstr "NUMERIC-LEVEL"
msgstr "ARAS-NUMERIK"
#: src/utils/pacmd.c:79
#, fuzzy
msgid "FRAMES"
msgstr "BINGKAI"
@ -2434,9 +2419,8 @@ msgid "Aux"
msgstr "Aux"
#: src/utils/pactl.c:335
#, fuzzy
msgid "Line"
msgstr "Jalur Masuk"
msgstr "Jalur"
#: src/utils/pactl.c:336
msgid "Mic"
@ -2526,7 +2510,7 @@ msgstr ""
#: src/utils/pactl.c:706 src/utils/pactl.c:890 src/utils/pactl.c:1251
#, c-format
msgid "\tPorts:\n"
msgstr "»Port:\n"
msgstr "\tPort:\n"
#: src/utils/pactl.c:708 src/utils/pactl.c:892
#, c-format
@ -2540,7 +2524,7 @@ msgstr ", grup ketersediaan: "
#: src/utils/pactl.c:715 src/utils/pactl.c:899
#, c-format
msgid "\tActive Port: %s\n"
msgstr "»Port Aktif: %s\n"
msgstr "\tPort Aktif: %s\n"
#: src/utils/pactl.c:721 src/utils/pactl.c:905
#, c-format
@ -3009,7 +2993,7 @@ msgstr ""
"dapat dipakai untuk menyatakan muara, sumber, dan pemantau baku.\n"
#: src/utils/pactl.c:2664
#, fuzzy, c-format
#, c-format
msgid ""
"\n"
" -h, --help Show this help\n"
@ -3026,6 +3010,8 @@ msgstr ""
" -h, --help Tampilkan bantuan ini\n"
" --version Tampilkan versi\n"
"\n"
" -f, --format=FORMAT Format keluaran. \"normal\" atau "
"\"json\"\n"
" -s, --server=SERVER Nama server tujuan koneksi\n"
" -n, --client-name=NAMA Bagaimana memanggil klien ini pada "
"server\n"
@ -3042,9 +3028,9 @@ msgstr ""
"Ditaut dengan libpulse %s\n"
#: src/utils/pactl.c:2751
#, fuzzy, c-format
#, c-format
msgid "Invalid format value '%s'"
msgstr "Nama stream '%s' tak valid"
msgstr "Nilai format '%s' tidak valid"
#: src/utils/pactl.c:2778
#, c-format
@ -3276,7 +3262,7 @@ msgid "WARNING: Child process terminated by signal %u\n"
msgstr "PERINGATAN: Proses anak diakhiri oleh sinyal %u\n"
#: src/utils/pasuspender.c:228
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options] -- PROGRAM [ARGUMENTS ...]\n"
"\n"
@ -3288,7 +3274,9 @@ msgid ""
"to\n"
"\n"
msgstr ""
"%s [opsi] ... \n"
"%s [opsi] -- PROGRAM [ARGUMEN ...]\n"
"\n"
"Sementara mensuspensi PulseAudio ketika PROGRAM berjalan.\n"
"\n"
" -h, --help Tampilkan bantuan ini\n"
" --version Tampilkan versi\n"

View file

@ -11,9 +11,9 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-04-19 20:02+0000\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-06-08 14:42+0000\n"
"Last-Translator: Salvatore Cocuzza <info@salvatorecocuzza.it>\n"
"Language-Team: Italian <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/it/>\n"
"Language: it\n"
@ -21,7 +21,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.6\n"
"X-Generator: Weblate 5.11.4\n"
# mamma mia che impressione
#: src/daemon/cmdline.c:113
@ -198,14 +198,12 @@ msgid "--fail expects boolean argument"
msgstr "--fail richiede un argomento booleano"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
msgstr ""
"--log-level richiede il livello di registro come argomento (sia "
"nell'intervallo numerico 0..4 oppure uno tra debug, info, notice, warn, "
"error)."
"--log-level si aspetta un argomento a livello di log (un valore numerico "
"compreso tra 0 e 4 oppure uno tra error, warn, notice, info, debug)."
#: src/daemon/cmdline.c:277
msgid "--high-priority expects boolean argument"
@ -1163,8 +1161,8 @@ msgstr ""
"channel_map=<mappa canali> autoloaded=<imposta se il modulo viene caricato "
"automaticamente> use_volume_sharing=<yes o no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Equalizzatore basato su FFT su %s"
@ -1230,14 +1228,14 @@ msgstr "Audio su @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel per %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel verso %s/%s"
@ -1247,7 +1245,6 @@ msgid "Virtual surround sink"
msgstr "Sink surround virtuale"
#: src/modules/module-virtual-surround-sink.c:54
#, fuzzy
msgid ""
"sink_name=<name for the sink> sink_properties=<properties for the sink> "
"master=<name of sink to filter> sink_master=<name of sink to filter> "
@ -1590,11 +1587,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Destinazione di registrazione non valida."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Audio interno"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -2420,7 +2417,7 @@ msgstr "Recupero delle informazioni del server non riuscito: %s"
#: src/utils/pactl.c:224 src/utils/pactl.c:236
#, c-format
msgid "%s\n"
msgstr ""
msgstr "%s\n"
#: src/utils/pactl.c:281
#, c-format
@ -2491,7 +2488,6 @@ msgid "Mic"
msgstr "Mic"
#: src/utils/pactl.c:338
#, fuzzy
msgid "Handset"
msgstr "Cuffie con microfono"
@ -2586,7 +2582,6 @@ msgid "\t\t%s: %s (type: %s, priority: %u%s%s, %s)\n"
msgstr "\t\t%s: %s (tipo: %s, priorità: %u%s%s, %s)\n"
#: src/utils/pactl.c:710 src/utils/pactl.c:894 src/utils/pactl.c:1256
#, fuzzy
msgid ", availability group: "
msgstr ", gruppo disponibilità: "
@ -2898,7 +2893,7 @@ msgstr "Invia messaggio non riuscito: %s"
#: src/utils/pactl.c:1695
#, c-format
msgid "list-handlers message failed: %s"
msgstr ""
msgstr "messaggio list-handlers non riuscito: %s"
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
@ -2912,6 +2907,8 @@ msgstr ""
#, c-format
msgid "list-handlers message response array element %d is not a JSON object"
msgstr ""
"l'elemento %d dell'array di risposta al messaggio dei gestori di elenchi non "
"è un oggetto JSON"
#: src/utils/pactl.c:1800
#, c-format
@ -3110,9 +3107,9 @@ msgstr ""
"Link eseguito con libpulse %s\n"
#: src/utils/pactl.c:2751
#, fuzzy, c-format
#, c-format
msgid "Invalid format value '%s'"
msgstr "Nome dello stream «%s» non valido"
msgstr "Formato valore non valido '%s'"
#: src/utils/pactl.c:2778
#, c-format
@ -3198,18 +3195,16 @@ msgid "You have to specify a source name"
msgstr "È necessario specificare il nome di una sorgente"
#: src/utils/pactl.c:2998 src/utils/pactl.c:3076
#, fuzzy
msgid "You have to specify a sink name/index"
msgstr "È necessario specificare un nome di sink"
msgstr "Devi specificare un nome/indice del sink"
#: src/utils/pactl.c:3008
msgid "You have to specify a sink name/index and a volume"
msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101
#, fuzzy
msgid "You have to specify a source name/index"
msgstr "È necessario specificare il nome di una sorgente"
msgstr "Devi specificare un nome/indice sorgente"
#: src/utils/pactl.c:3031
msgid "You have to specify a source name/index and a volume"
@ -3275,15 +3270,17 @@ msgid "Invalid source output index specification"
msgstr "Specifica di indice di uscita per la sorgente non valida"
#: src/utils/pactl.c:3162
#, fuzzy
msgid "You have to specify at least an object path and a message name"
msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
msgstr ""
"Devi specificare almeno un percorso dell'oggetto e un nome del messaggio"
#: src/utils/pactl.c:3172
msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
msgstr ""
"Gli argomenti in eccesso verranno ignorati. Si noti che tutti i parametri "
"del messaggio devono essere specificati come un'unica stringa."
#: src/utils/pactl.c:3182
msgid ""

View file

@ -13,7 +13,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-02-20 03:16+0000\n"
"Last-Translator: Takuro Onoue <kusanaginoturugi@gmail.com>\n"
"Language-Team: Japanese <https://translate.fedoraproject.org/projects/"
@ -1140,8 +1140,8 @@ msgstr ""
"ル数> channel_map=<チャンネルマップ> autoloaded=<このモジュールが自動でロード"
"されている場合にセット> use_volume_sharing=<yes 又は no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1205,14 +1205,14 @@ msgstr "@HOSTNAME@ 上のオーディオ"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "%s@%s のトンネル"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "%s/%s へのトンネル"
@ -1560,11 +1560,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "無効なログターゲット。"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "内部オーディオ"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "モデム"

997
po/ka.po

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2020-06-30 08:04+0500\n"
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
"Language-Team: \n"
@ -989,8 +989,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1047,14 +1047,14 @@ msgstr ""
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1391,11 +1391,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Журнал мақсаты дұрыс емес."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Құрамындағы аудио"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Модем"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.kn\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:54+0000\n"
"Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
"Language-Team: Kannada <kde-l10n-kn@kde.org>\n"
@ -1153,8 +1153,8 @@ msgstr ""
"label=<ladspa ಪ್ಲಗ್‌ಇನ್ ಹೆಸರು> control=<ವಿರಾಮ ಚಿಹ್ನೆಗಳನ್ನು ಹೊಂದಿರುವ ಇನ್‌ಪುಟ್ ನಿಯಂತ್ರಣ "
"ಮೌಲ್ಯಗಳ ಪಟ್ಟಿ>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1217,14 +1217,14 @@ msgstr "@HOSTNAME@ ನಲ್ಲಿನ ಆಡಿಯೊ"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1575,11 +1575,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ದಾಖಲೆ ಗುರಿ '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "ಆಂತರಿಕ ಆಡಿಯೊ"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "ಮಾಡೆಮ್"

221
po/ko.po
View file

@ -6,8 +6,8 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2022-05-20 18:18+0000\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-06-14 13:17+0000\n"
"Last-Translator: 김인수 <simmon@nplob.com>\n"
"Language-Team: Korean <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/ko/>\n"
@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.12.2\n"
"X-Generator: Weblate 5.11.4\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -94,23 +94,23 @@ msgstr ""
"명령:\n"
" -h, --help 도움말을 표시\n"
" --version 버전을 표시\n"
" --dump-conf 기본 구성 덤프\n"
" --dump-modules 사용 가능한 모듈의 목록을 덤프\n"
" --dump-resample-methods 사용 가능한 재표본 방식으로 덤프\n"
" --dump-conf 기본 구성 덤프\n"
" --dump-modules 사용 가능한 모듈의 덤프 목록\n"
" --dump-resample-methods 재표본 방법 덤프\n"
" --cleanup-shm 오래된 공유 메모리 세그멘트 정리\n"
" --start 만약 실행되지 않았으면 데몬을 시작\n"
" -k --kill 실행 중인 데몬을 제거\n"
" --check 동작 중인 데몬을 위한 점검 (종료 "
"코드만 반환)\n"
" --check 동작 중인 데몬 점검 (종료 코드만 "
"반환)\n"
"\n"
"OPTIONS:\n"
"옵션:\n"
" --system[=BOOL] 시스템-전반의 인스턴스로 실행\n"
" -D, --daemonize[=BOOL] 시작 후에 데몬화\n"
" --fail[=BOOL] 시작이 실패 할 때에 종료\n"
" --high-priority[=BOOL] 높은 수준으로 설정을 시도\n"
" (root로만 사용 가능, SUID 또는\n"
" 높은 RLIMIT_NICE일 때에)\n"
" --realtime[=BOOL] Try to enable realtime scheduling\n"
" --realtime[=BOOL] 실시간 스케쥴링 활성 시도\n"
" (root로만 사용 가능, SUID 또는\n"
" 높은 RLIMIT_RTPRIO일 때에)\n"
" --disallow-module-loading[=BOOL] 시작 후 사용자가 요청 모듈을\n"
@ -121,7 +121,7 @@ msgstr ""
" --exit-idle-time=SECS 유휴 상태이고 시간이 경과하면\n"
" 데몬을 종료함\n"
" --scache-idle-time=SECS 유휴 상태이고 시간이 경과하면\n"
" 자동 적재된 표을 내려 놓음\n"
" 자동 적재된 표을 내려 놓음\n"
" --log-level[=LEVEL] 자세한 표시 수준을 높이거나 설정\n"
" -v --verbose 자세한 표시 수준을 높임\n"
" --log-target={auto,syslog,stderr,file:PATH,newfile:PATH}\n"
@ -132,11 +132,11 @@ msgstr ""
" -p, --dl-search-path=PATH 동적 공유 객체(플러그인)을 위한\n"
" 검색 경로를 설정\n"
" --resample-method=METHOD 지정한 재표본 방식을 사용\n"
" (사용 가능한 값을 위해 --dump-"
"resample-methods을\n"
" (사용 가능한 값은 --dump-resample-"
"methods 옵션을\n"
" 참조)\n"
" --use-pid-file[=BOOL] PID 파일을 생성\n"
" --no-cpu-limit[=BOOL] 이를 지원하는 CPU 적재 제한기를\n"
" --no-cpu-limit[=BOOL] 이를 지원하는 CPU 부하 제한기를\n"
" 설치하지 않음.\n"
" --disable-shm[=BOOL] 공유 메모리 지원을 비활성화.\n"
" --enable-memfd[=BOOL] memfd 공유 메모리 지원을 활성화.\n"
@ -145,7 +145,7 @@ msgstr ""
" -L, --load=\"MODULE ARGUMENTS\" 지정된 인수와 함께 지정된 "
"플러그인\n"
" 모듈을 적재\n"
" -F, --file=FILENAME 지정 스크립트 실행\n"
" -F, --file=FILENAME 지정 스크립트 실행\n"
" -C 시작 후에 동작 중인 TTY에서\n"
" 명령 줄을 엽니다\n"
"\n"
@ -153,39 +153,39 @@ msgstr ""
#: src/daemon/cmdline.c:246
msgid "--daemonize expects boolean argument"
msgstr "--daemonize 에는 부울 인수가 필요합니다"
msgstr "--daemonize 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:254
msgid "--fail expects boolean argument"
msgstr "--fail 에는 부울 인수가 필요합니다"
msgstr "--fail 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:265
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
msgstr ""
"--log-level 에는 로그 수준 인수가 필요합니다 (0~4 숫자 범위 또는 오류, 경고, "
"알림, 정보, 디버그 중 하나 )."
"--log-level 에는 로그 수준 인자 값이 필요합니다 (0~4 숫자 범위 또는 오류, 경"
"고, 알림, 정보, 디버그 중 하나)."
#: src/daemon/cmdline.c:277
msgid "--high-priority expects boolean argument"
msgstr "--high-priority 에는 부울 인수가 필요합니다"
msgstr "--high-priority 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:285
msgid "--realtime expects boolean argument"
msgstr "--realtime 에는 부울 인수가 필요합니다"
msgstr "--realtime 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:293
msgid "--disallow-module-loading expects boolean argument"
msgstr "--disallow-module-loading 에는 부울 인수가 필요합니다"
msgstr "--disallow-module-loading 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:301
msgid "--disallow-exit expects boolean argument"
msgstr "--disallow-exit 에는 부울 인수가 필요합니다"
msgstr "--disallow-exit 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:309
msgid "--use-pid-file expects boolean argument"
msgstr "--use-pid-file 부울 인수가 필요합니다"
msgstr "--use-pid-file 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:328
msgid ""
@ -205,32 +205,32 @@ msgstr ""
#: src/daemon/cmdline.c:338
msgid "--log-time expects boolean argument"
msgstr "--log-time 에는 부울 인수가 필요합니다"
msgstr "--log-time 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:346
msgid "--log-meta expects boolean argument"
msgstr "--log-meta 에는 부울 인수가 필요합니다"
msgstr "--log-meta 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:366
#, c-format
msgid "Invalid resample method '%s'."
msgstr "잘못된 리샘플링 방 '%s'."
msgstr "잘못된 리샘플링 방 '%s'."
#: src/daemon/cmdline.c:373
msgid "--system expects boolean argument"
msgstr "--system 에는 부울 인수가 필요합니다"
msgstr "--system 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:381
msgid "--no-cpu-limit expects boolean argument"
msgstr "--no-cpu-limit 에는 부울 인수가 필요합니다"
msgstr "--no-cpu-limit 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:389
msgid "--disable-shm expects boolean argument"
msgstr "--disable-shm 에는 부울 인수가 필요합니다"
msgstr "--disable-shm 에는 부울 인자 값이 필요합니다"
#: src/daemon/cmdline.c:397
msgid "--enable-memfd expects boolean argument"
msgstr "--enable-memfd는 부울 인수가 예상됩니다"
msgstr "--enable-memfd 는 부울 인수가 예상됩니다"
#: src/daemon/daemon-conf.c:270
#, c-format
@ -275,12 +275,12 @@ msgstr "[%s:%u] 잘못된 채널 맵 '%s'."
#: src/daemon/daemon-conf.c:433
#, c-format
msgid "[%s:%u] Invalid number of fragments '%s'."
msgstr "[%s:%u] 잘못된 fragment 수 '%s'."
msgstr "[%s:%u] 잘못된 조각 수 '%s'."
#: src/daemon/daemon-conf.c:450
#, c-format
msgid "[%s:%u] Invalid fragment size '%s'."
msgstr "[%s:%u] 잘못된 fragment 크기 '%s'."
msgstr "[%s:%u] 잘못된 조각 크기 '%s'."
#: src/daemon/daemon-conf.c:467
#, c-format
@ -302,7 +302,7 @@ msgid ""
"The specified default channel map has a different number of channels than "
"the specified default number of channels."
msgstr ""
"지정 기본 채널 맵은 지정 기본 채널 수와는 다른 채널 수를 가지고 있습니다."
"지정 기본 채널 맵은 지정 기본 채널 수와는 다른 채널 수를 가지고 있습니다."
#: src/daemon/daemon-conf.c:788
#, c-format
@ -342,7 +342,7 @@ msgstr "사용법: %s\n"
#: src/daemon/dumpmodules.c:70
#, c-format
msgid "Load Once: %s\n"
msgstr "한 번 로딩하기: %s\n"
msgstr "한 번 적재하기: %s\n"
#: src/daemon/dumpmodules.c:72
#, c-format
@ -365,7 +365,7 @@ msgstr "기존 lt_dlopen 로더를 찾는데 실패했습니다."
#: src/daemon/ltdl-bind-now.c:131
msgid "Failed to allocate new dl loader."
msgstr "새 dl 로더를 할당하는데 실패했습니다."
msgstr "새 dl 로더 할당에 실패했습니다."
#: src/daemon/ltdl-bind-now.c:144
msgid "Failed to add bind-now-loader."
@ -374,22 +374,22 @@ msgstr "bind-now-loader를 추가하는데 실패했습니다."
#: src/daemon/main.c:265
#, c-format
msgid "Failed to find user '%s'."
msgstr "사용자 '%s'를 찾을 수 없습니다."
msgstr "'%s' 사용자를 찾을 수 없습니다."
#: src/daemon/main.c:270
#, c-format
msgid "Failed to find group '%s'."
msgstr "그룹 '%s'를 찾을 수 없습니다."
msgstr "'%s' 그룹을 찾을 수 없습니다."
#: src/daemon/main.c:279
#, c-format
msgid "GID of user '%s' and of group '%s' don't match."
msgstr "사용자 '%s'의 GID와 그룹 '%s'가 일치하지 않습니다."
msgstr "'%s' 사용자의 GID와 '%s' 그룹 정보가 일치하지 않습니다."
#: src/daemon/main.c:284
#, c-format
msgid "Home directory of user '%s' is not '%s', ignoring."
msgstr "사용자 '%s'의 홈 디렉토리가 '%s'가 아닙니다, 무시됨."
msgstr "사용자 '%s'의 홈 디렉토리가 '%s' 아니면, 무시합니다."
#: src/daemon/main.c:287 src/daemon/main.c:292
#, c-format
@ -413,7 +413,7 @@ msgstr "UID 변경 실패: %s"
#: src/daemon/main.c:360
msgid "System wide mode unsupported on this platform."
msgstr "시스템 전역 모드는 이 플랫폼에서 지원되지 않습니다."
msgstr "시스템 전역 모드는 이 기술환경에서 지원하지 않습니다."
#: src/daemon/main.c:650
msgid "Failed to parse command line."
@ -423,8 +423,7 @@ msgstr "명령어 행 분석 실패."
msgid ""
"System mode refused for non-root user. Only starting the D-Bus server lookup "
"service."
msgstr ""
"비 root 사용자에 대해 시스템 모드는 거부되었습니다. D-Bus 서버 검색 서비스만 "
msgstr "non-root 사용자에게 시스템 방식이 거부되었습니다. D-Bus 서버 검색 서비스만 "
"시작합니다."
#: src/daemon/main.c:788
@ -436,12 +435,12 @@ msgstr "데몬 종료 실패: %s"
msgid ""
"This program is not intended to be run as root (unless --system is "
"specified)."
msgstr ""
"프로그램이 root로 실행되지 않습니다. (실행하려면 --system을 명기하십시오)."
msgstr "이와 같은 프로그램은 root로 동작하도록 의도되지 않았습니다 (--system 이 "
"지정되지 않은 경우)."
#: src/daemon/main.c:820
msgid "Root privileges required."
msgstr "Root 권한이 필요합니다."
msgstr "루트 권한이 필요합니다."
#: src/daemon/main.c:827
msgid "--start not supported for system instances."
@ -450,24 +449,22 @@ msgstr "--start는 시스템 인스턴스에 대해 지원되지 않습니다."
#: src/daemon/main.c:867
#, c-format
msgid "User-configured server at %s, refusing to start/autospawn."
msgstr "%s에서 사용자 설정한 서버, start/autospawn을 거부하고 있습니다."
msgstr "%s에 User-configured 서버, start/autospawn을 거부하고 있습니다."
#: src/daemon/main.c:873
#, c-format
msgid ""
"User-configured server at %s, which appears to be local. Probing deeper."
msgstr "%s에 사용자가 설정한 서버, 이는 로컬에 있습니다. 상세히 조사합니다."
msgstr "%s에 User-configured 서버, 이는 로컬에 있습니다. 상세히 조사합니다."
#: src/daemon/main.c:878
msgid "Running in system mode, but --disallow-exit not set."
msgstr ""
"시스템 모드에서 실행중입니다. 하지만 --disallow-exit가 설정되지 않았습니다."
msgstr "시스템 방식에서 실행 중이지만, --disallow-exit 를 설정하지 않았습니다."
#: src/daemon/main.c:881
msgid "Running in system mode, but --disallow-module-loading not set."
msgstr ""
"시스템 모드에서 실행 중입니다. 하지만 --disallow-module-loading이 설정되어 있"
"지 않습니다."
msgstr "시스템 방식에서 실행 중이지만, --disallow-module-loading 를 설정하지 "
"않았습니다."
#: src/daemon/main.c:884
msgid "Running in system mode, forcibly disabling SHM mode."
@ -659,7 +656,7 @@ msgstr "도킹스테이션 마이크"
#: src/modules/alsa/alsa-mixer.c:2802
msgid "Headset Microphone"
msgstr "후면 마이크"
msgstr "헤드셋 마이크"
#: src/modules/alsa/alsa-mixer.c:2806
msgid "Analog Output"
@ -719,7 +716,7 @@ msgstr "대화 입력"
#: src/modules/alsa/alsa-mixer.c:2822
msgid "Virtual Surround 7.1"
msgstr "가상 서라운드 싱크"
msgstr "가상 서라운드 7.1"
#: src/modules/alsa/alsa-mixer.c:4563
msgid "Analog Mono"
@ -863,7 +860,7 @@ msgstr "스테레오 듀플렉스"
#: src/modules/alsa/alsa-mixer.c:4739
msgid "Mono Chat + 7.1 Surround"
msgstr "모노 Chat + 7.1 Surround"
msgstr "모노 대화 + 7.1 서라운드"
#: src/modules/alsa/alsa-mixer.c:4740 src/modules/alsa/module-alsa-card.c:197
#: src/modules/bluetooth/module-bluez5-device.c:2263
@ -1013,15 +1010,15 @@ msgstr "전화기"
#: src/modules/bluetooth/module-bluez5-device.c:2042
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "Hi-Fi 재생 (A2DP Sink)"
msgstr "고음질 재생 (A2DP Sink)"
#: src/modules/bluetooth/module-bluez5-device.c:2054
msgid "High Fidelity Capture (A2DP Source)"
msgstr "Hi-Fi 캡쳐 (A2DP Source)"
msgstr "고음질 캡쳐 (A2DP Source)"
#: src/modules/bluetooth/module-bluez5-device.c:2066
msgid "Headset Head Unit (HSP)"
msgstr "헤드셋 헤드 유닛 (HSP)"
msgstr "헤드셋 헤드 단위 (HSP)"
#: src/modules/bluetooth/module-bluez5-device.c:2079
msgid "Headset Audio Gateway (HSP)"
@ -1029,7 +1026,7 @@ msgstr "헤드셋 오디오 게이트웨어 (HSP)"
#: src/modules/bluetooth/module-bluez5-device.c:2092
msgid "Handsfree Head Unit (HFP)"
msgstr "핸즈프리 헤드 유닛 (HFP)"
msgstr "핸즈프리 헤드 단위 (HFP)"
#: src/modules/bluetooth/module-bluez5-device.c:2105
msgid "Handsfree Audio Gateway (HFP)"
@ -1092,8 +1089,8 @@ msgstr ""
"channel_map=<채널 맵> autoloaded=<이 모듈이 자동으로 로드된다면 설정하십시오"
"> use_volume_sharing=<yes 또는 no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "고속퓨리에변환 기반 이퀄라이저 동작 %s"
@ -1157,14 +1154,14 @@ msgstr "호스트 @HOSTNAME@의 오디오"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "%s@%s 위한 터널"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "%s/%s가는 터널"
@ -1478,9 +1475,9 @@ msgid ""
"e.g. happen if you try to connect to a non-root PulseAudio as a root user, "
"over the native protocol. Don't do that.)"
msgstr ""
"XDG_RUNTIME_DIR (%s)는 우리(uid %d)가 아니라 uid %d가 소유합니다! (기본적인 "
"통신규약을 통해 비-root가 PluseAudio에 root 사용자로 연결을 시도할 때에 예를 "
"들어 발생 할 수 있습니다. 그렇게 하지 않습니다.)"
"XDG_RUNTIME_DIR (%s)는 우리(uid %d)가 아니라 uid %d가 소유합니다! (자체 "
"통신규약을 통해 root 사용자로 root가 아닌 PluseAudio에 연결을 시도 할 때에 "
"예시로 발생 할 수 있습니다. 그렇게 하지 않습니다.)"
#: src/pulsecore/core-util.h:97
msgid "yes"
@ -1511,17 +1508,17 @@ msgstr ""
msgid "Invalid log target."
msgstr "잘못된 기록 대상."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "내장 오디오"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "모뎀"
#: src/pulse/error.c:38
msgid "OK"
msgstr "OK"
msgstr "확인"
#: src/pulse/error.c:39
msgid "Access denied"
@ -1589,7 +1586,7 @@ msgstr "자료 없음"
#: src/pulse/error.c:55
msgid "Incompatible protocol version"
msgstr "호환되지 않는 통신규약 버전"
msgstr "호환되지 않는 프로토콜 버전"
#: src/pulse/error.c:56
msgid "Too large"
@ -1908,11 +1905,11 @@ msgstr ""
" -v, --verbose 자세한 작업 활성화합니다\n"
"\n"
" -s, --server=SERVER 연결하고자 하는 서버의 이름\n"
" -d, --device=DEVICE 연결하고자 하는 싱크/원천의 이름. "
"별한 이름 @DEFAULT_SINK@, @DEFAULT_SOURCE@과 @DEFAULT_MONITOR@는 각기 기본 "
"크, 원천과 관리를 지정하는데 사용 될 수 있습니다.\n"
" -n, --client-name=NAME 서버에서 이와 같은 클라이언트를 "
"호출하는 방법\n"
" -d, --device=DEVICE 연결하고자 하는 싱크/원천의 이름. "
"별한 이름 @DEFAULT_SINK@, @DEFAULT_SOURCE@과 @DEFAULT_MONITOR@는 각기 기본 "
"크, 원천과 관리를 지정하는데 사용 될 수 있습니다.\n"
" -n, --client-name=NAME 서버에서 이와 같은 클라이언트를 호출"
"하는 방법\n"
" --stream-name=NAME 서버에서 이와 같은 스트림을 호출하는 "
"방법\n"
" --volume=VOLUME 범위 0...65536에서 초기(선형) 소리를 "
@ -1925,29 +1922,29 @@ msgstr ""
" --channels=CHANNELS 채널의 수, 모노 1, 스테레오 2\n"
" (기본값 2)\n"
" --channel-map=CHANNELMAP 기본값 대신에 사용하려는 채널맵\n"
" --fix-format 스트림이 연결되고 있는 싱크/"
"원천에서\n"
" --fix-format 스트림이 연결되고 있는 싱크/원천에"
"서\n"
" 샘플 형식을 가져옵니다.\n"
" --fix-rate 스트림이 연결되고 있는 싱크/"
"원천에서\n"
" --fix-rate 스트림이 연결되고 있는 싱크/원천에"
"서\n"
" 샘플 비율을 가져옵니다.\n"
" --fix-channels 스트림이 연결되고 있는 싱크/"
"원천에서\n"
" --fix-channels 스트림이 연결되고 있는 싱크/원천에"
"서\n"
" 채널 수와 채널맵을 가져옵니다.\n"
" --no-remix 채널을 언믹스하거나 다운믹스 하지 "
"습니다.\n"
" --no-remap 이름 대신에 색인으로 채널을 "
"맵핑합니다.\n"
" --latency=BYTES 바이트 단위로 지정된 지연시간을 "
"요청합니다.\n"
" --process-time=BYTES 바이트 단위로 요청당 지정된 "
"처리시간을 요청합니다.\n"
" --latency-msec=MSEC msec 단위로 지정된 지연시간을 "
"요청합니다.\n"
" --no-remix 채널을 언믹스하거나 다운믹스 하지 "
"습니다.\n"
" --no-remap 이름 대신에 색인으로 채널을 맵핑합니"
"다.\n"
" --latency=BYTES 바이트 단위로 지정된 지연시간을 요청"
"합니다.\n"
" --process-time=BYTES 바이트 단위로 요청당 지정된 처리시간"
"을 요청합니다.\n"
" --latency-msec=MSEC msec 단위로 지정된 지연시간을 요청합"
"니다.\n"
" --process-time-msec=MSEC msec 단위로 요청당 지정된 처리시간을 "
"요청합니다.\n"
" --property=PROPERTY=VALUE 지정된 속성을 지정된 값으로 "
"설정합니다.\n"
" --property=PROPERTY=VALUE 지정된 속성을 지정된 값으로 설정합니"
"다.\n"
" --raw raw PCM 자료를 기록하거나/재생.\n"
" --passthrough 통과 자료.\n"
" --file-format[=FFORMAT] 형식화된 PCM 자료 기록/재생.\n"
@ -2441,7 +2438,7 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
"싱크 #%u\n"
"Sink #%u\n"
"\t상태: %s\n"
"\t이름: %s\n"
"\t설명: %s\n"
@ -2450,10 +2447,10 @@ msgstr ""
"\t채널 맵: %s\n"
"\t소유자 모듈: %u\n"
"\t무음: %s\n"
"\t볼륨: %s%s%s\n"
"\t균형 %0.2f\n"
"\t기본 볼륨: %s%s%s\n"
"\t모니터 소스: %s\n"
"\t음량: %s\n"
"\t 균형 %0.2f\n"
"\t기본 음량: %s\n"
"\t모니터 원천: %s\n"
"\t지연시간: %0.0f usec, 설정 %0.0f usec\n"
"\t플래그: %s%s%s%s%s%s%s\n"
"\t속성:\n"
@ -2510,7 +2507,7 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
"소스 #%u\n"
"원천 #%u\n"
"\t상태: %s\n"
"\t이름: %s\n"
"\t설명: %s\n"
@ -2519,11 +2516,11 @@ msgstr ""
"\t채널 맵: %s\n"
"\t소유자 모듈: %u\n"
"\t무음: %s\n"
"\t볼륨: %s%s%s\n"
"\t볼륨: %s\n"
"\t 균형 %0.2f\n"
"\t기본 볼륨: %s%s%s\n"
"\t싱크 모니터: %s\n"
"\t지연시간: %0.0f usec, 설정 %0.0f usec\n"
"\t기본 볼륨: %s\n"
"\t싱크 모니터:%s\n"
"\t지연시간:%0.0f usec, 설정 %0.0f usec\n"
"\t플래그: %s%s%s%s%s%s\n"
"\t속성:\n"
"\t\t%s\n"
@ -2673,8 +2670,7 @@ msgstr ""
"\t코르크: %s\n"
"\t무음: %s\n"
"\t볼륨: %s\n"
"\t %s\n"
"\t균형 %0.2f\n"
"\t 균형 %0.2f\n"
"\t버퍼 지연 시간: %0.0f usec\n"
"\t싱크 지연 시간: %0.0f usec\n"
"\t리샘플링 방법: %s\n"
@ -2751,8 +2747,7 @@ msgstr ""
"\t샘플 사양: %s\n"
"\t채널맵: %s\n"
"\t볼륨: %s\n"
"\t %s\n"
"\t균형 %0.2f\n"
"\t 균형 %0.2f\n"
"\t길이: %0.1fs\n"
"\t크기: %s\n"
"\t레이지: %s\n"
@ -3136,8 +3131,8 @@ msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
msgstr ""
"초과 인수가 주어지면, 이들은 무시될 것입니다. 모든 메시지 변수는 단일 문자열"
"로 주어져야 합니다."
"초과 인자 값을 부여하면 무시합니다. 모든 메시지 변수는 단일 문자열로 주어져"
"야 합니다."
#: src/utils/pactl.c:3182
msgid ""
@ -3211,7 +3206,7 @@ msgid ""
"to\n"
"\n"
msgstr ""
"%s [옵션] -- 프로그램 -[ 인 ...]\n"
"%s [옵션] -- 프로그램 -[ 인 ...]\n"
"\n"
"프로그램이 동작 할 때에 일시적으로 PulseAudio를 중지합니다.\n"
"\n"

107
po/lt.po
View file

@ -8,17 +8,18 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2019-09-01 16:15+0300\n"
"Last-Translator: Moo\n"
"Language-Team: \n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2024-02-15 22:36+0000\n"
"Last-Translator: mooo <hazap@hotmail.com>\n"
"Language-Team: Lithuanian <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/lt/>\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.1\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && ("
"n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.4\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -702,9 +703,8 @@ msgid "Analog Output"
msgstr "Analoginė išvestis"
#: src/modules/alsa/alsa-mixer.c:2808
#, fuzzy
msgid "Headphones 2"
msgstr "Ausinės"
msgstr "Ausinės 2"
#: src/modules/alsa/alsa-mixer.c:2809
msgid "Headphones Mono Output"
@ -751,28 +751,24 @@ msgid "Chat Output"
msgstr "Pokalbio išvestis"
#: src/modules/alsa/alsa-mixer.c:2821
#, fuzzy
msgid "Chat Input"
msgstr "Pokalbio vestis"
msgstr "Pokalbio įvestis"
#: src/modules/alsa/alsa-mixer.c:2822
#, fuzzy
msgid "Virtual Surround 7.1"
msgstr "Virtualus erdvinis rinktuvas"
msgstr "Virtuali erdvinė 7.1"
#: src/modules/alsa/alsa-mixer.c:4563
msgid "Analog Mono"
msgstr "Analoginė mono"
#: src/modules/alsa/alsa-mixer.c:4564
#, fuzzy
msgid "Analog Mono (Left)"
msgstr "Analoginė mono"
msgstr "Analoginė mono (kairioji)"
#: src/modules/alsa/alsa-mixer.c:4565
#, fuzzy
msgid "Analog Mono (Right)"
msgstr "Analoginė mono"
msgstr "Analoginė mono (dešinioji)"
#. Note: Not translated to "Analog Stereo Input", because the source
#. * name gets "Input" appended to it automatically, so adding "Input"
@ -877,11 +873,11 @@ msgstr "Skaitmeninė erdvinė 5.1 (HDMI)"
#: src/modules/alsa/alsa-mixer.c:4597
msgid "Chat"
msgstr ""
msgstr "Pokalbis"
#: src/modules/alsa/alsa-mixer.c:4598
msgid "Game"
msgstr ""
msgstr "Žaidimas"
#: src/modules/alsa/alsa-mixer.c:4732
msgid "Analog Mono Duplex"
@ -905,7 +901,7 @@ msgstr "Dvipusė stereo"
#: src/modules/alsa/alsa-mixer.c:4739
msgid "Mono Chat + 7.1 Surround"
msgstr ""
msgstr "Mono pokalbis + 7.1 erdvinė"
#: src/modules/alsa/alsa-mixer.c:4740 src/modules/alsa/module-alsa-card.c:197
#: src/modules/bluetooth/module-bluez5-device.c:2263
@ -1102,19 +1098,16 @@ msgid "Headset Head Unit (HSP)"
msgstr "Ausinių su mikrofonu pagrindinis įtaisas (HSP/HFP)"
#: src/modules/bluetooth/module-bluez5-device.c:2079
#, fuzzy
msgid "Headset Audio Gateway (HSP)"
msgstr "Ausinių su mikrofonu garso tinklų sietuvas (HSP/HFP)"
msgstr "Ausinių su mikrofonu garso tinklų sietuvas (HSP)"
#: src/modules/bluetooth/module-bluez5-device.c:2092
#, fuzzy
msgid "Handsfree Head Unit (HFP)"
msgstr "Ausinių su mikrofonu pagrindinis įtaisas (HSP/HFP)"
msgstr "Laisvų rankų įrangos pagrindinis įtaisas (HFP)"
#: src/modules/bluetooth/module-bluez5-device.c:2105
#, fuzzy
msgid "Handsfree Audio Gateway (HFP)"
msgstr "Ausinių su mikrofonu garso tinklų sietuvas (HSP/HFP)"
msgstr "Laisvų rankų įrangos garso tinklų sietuvas (HFP)"
#: src/modules/echo-cancel/module-echo-cancel.c:59
msgid ""
@ -1176,8 +1169,8 @@ msgstr ""
"schema> autoloaded=<nustatyti ar šis modulis bus įkeliamas automatiškai> "
"use_volume_sharing=<yes arba no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT pagrįstas glodintuvas ties %s"
@ -1245,14 +1238,14 @@ msgstr "Garsas ties @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunelis, skirtas %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunelis į %s/%s"
@ -1603,11 +1596,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Neteisinga žurnalo paskirtis."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Įtaisytas garsas"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modemas"
@ -2416,9 +2409,9 @@ msgid "Failed to get server information: %s"
msgstr "Nepavyko gauti serverio informacijos: %s"
#: src/utils/pactl.c:224 src/utils/pactl.c:236
#, fuzzy, c-format
#, c-format
msgid "%s\n"
msgstr "%s %s\n"
msgstr "%s\n"
#: src/utils/pactl.c:281
#, c-format
@ -2462,20 +2455,19 @@ msgstr ""
#: src/utils/pactl.c:320
msgid "availability unknown"
msgstr ""
msgstr "prieinamumas nežinomas"
#: src/utils/pactl.c:321
msgid "available"
msgstr ""
msgstr "prieinama"
#: src/utils/pactl.c:322
msgid "not available"
msgstr ""
msgstr "neprieinama"
#: src/utils/pactl.c:331 src/utils/pactl.c:355
#, fuzzy
msgid "Unknown"
msgstr "nežinoma"
msgstr "Nežinoma"
#: src/utils/pactl.c:332
msgid "Aux"
@ -2488,12 +2480,11 @@ msgstr "Įvadinė linija"
#: src/utils/pactl.c:336
msgid "Mic"
msgstr ""
msgstr "Mikrofonas"
#: src/utils/pactl.c:338
#, fuzzy
msgid "Handset"
msgstr "Ausinės su mikrofonu"
msgstr "Telefono ragelis"
#: src/utils/pactl.c:339
msgid "Earpiece"
@ -2501,28 +2492,27 @@ msgstr ""
#: src/utils/pactl.c:340
msgid "SPDIF"
msgstr ""
msgstr "SPDIF"
#: src/utils/pactl.c:341
msgid "HDMI"
msgstr ""
msgstr "HDMI"
#: src/utils/pactl.c:342
msgid "TV"
msgstr ""
msgstr "Televizorius"
#: src/utils/pactl.c:345
msgid "USB"
msgstr ""
msgstr "USB"
#: src/utils/pactl.c:346
#, fuzzy
msgid "Bluetooth"
msgstr "Bluetooth įvestis"
msgstr "Bluetooth"
#: src/utils/pactl.c:352
msgid "Network"
msgstr ""
msgstr "Tinklas"
#: src/utils/pactl.c:353
#, fuzzy
@ -2580,14 +2570,13 @@ msgid "\tPorts:\n"
msgstr "\tPrievadai:\n"
#: src/utils/pactl.c:708 src/utils/pactl.c:892
#, fuzzy, c-format
#, c-format
msgid "\t\t%s: %s (type: %s, priority: %u%s%s, %s)\n"
msgstr ""
"\t\t%s: %s (rinktuvų: %u, šaltinių: %u, pirmenybė: %u, prieinama: %s)\n"
msgstr "\t\t%s: %s (tipas: %s, pirmenybė: %u%s%s, %s)\n"
#: src/utils/pactl.c:710 src/utils/pactl.c:894 src/utils/pactl.c:1256
msgid ", availability group: "
msgstr ""
msgstr ", prieinamumo grupė: "
#: src/utils/pactl.c:715 src/utils/pactl.c:899
#, c-format
@ -2880,9 +2869,9 @@ msgid "Failure: %s"
msgstr "Triktis: %s"
#: src/utils/pactl.c:1667
#, fuzzy, c-format
#, c-format
msgid "Send message failed: %s"
msgstr "read() nepavyko: %s"
msgstr "Nepavyko išsiųsti pranešimo: %s"
#: src/utils/pactl.c:1695
#, c-format
@ -2891,11 +2880,11 @@ msgstr ""
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
msgstr ""
msgstr "nepavyko teisingai išnagrinėti list-handlers pranešimo atsako"
#: src/utils/pactl.c:1718
msgid "list-handlers message response is not a JSON array"
msgstr ""
msgstr "list-handlers pranešimo atsakas nėra JSON masyvas"
#: src/utils/pactl.c:1729
#, c-format

View file

@ -6,7 +6,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.ml\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:41+0000\n"
"Last-Translator: \n"
"Language-Team: <en@li.org>\n"
@ -1133,8 +1133,8 @@ msgstr ""
"plugin name> label=<ladspa plugin label> control=<comma separated list of "
"input control values>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1197,14 +1197,14 @@ msgstr "@HOSTNAME@-ലുള്ള ഓഡിയോ"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1555,11 +1555,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] തെറ്റായ ലോഗ് ടാര്‍ഗറ്റ് '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "ഇന്റേര്‍ണല്‍ ഓഡിയോ"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "മോഡം"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:54+0000\n"
"Last-Translator: Sandeep Shedmake <sshedmak@redhat.com>\n"
"Language-Team: Marathi <fedora-trans-mr@redhat.com>\n"
@ -1139,8 +1139,8 @@ msgstr ""
"नाव> label=<ladspa प्लगइन लेबल> control=<इंपुट कंट्रोल मुल्यांची स्वल्पविराम विभाजीत "
"सूची>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1203,14 +1203,14 @@ msgstr "@HOSTNAME@ वरील ऑडिओ"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1561,11 +1561,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] अवैध लॉग लक्ष्य '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "आंतरीक ऑडिओ"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "मोडेम"

View file

@ -9,9 +9,9 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-03-30 23:01+0000\n"
"Last-Translator: Pjotr Vertaalt <pjotrvertaalt@gmail.com>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-11-17 18:19+0000\n"
"Last-Translator: Philip Goto <philip.goto@gmail.com>\n"
"Language-Team: Dutch <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/nl/>\n"
"Language: nl\n"
@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.5.2\n"
"X-Generator: Weblate 4.14.2\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -1122,8 +1122,8 @@ msgstr ""
"channel_map=<kanalenkaart> autoloaded=<ingesteld indien deze module "
"automatisch wordt geladen> use_volume_sharing=<ja of nee> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT-gebaseerd mengpaneel op %s"
@ -1190,14 +1190,14 @@ msgstr "Geluid op @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel voor %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel naar %s/%s"
@ -1546,11 +1546,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Ongeldig logboekdoel."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Ingebouwde audio"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -2237,11 +2237,11 @@ msgstr "NUMERIEK-NIVEAU"
#: src/utils/pacmd.c:79
msgid "FRAMES"
msgstr ""
msgstr "FRAMES"
#: src/utils/pacmd.c:80 src/utils/pactl.c:2659
msgid "RECIPIENT MESSAGE [MESSAGE_PARAMETERS]"
msgstr ""
msgstr "ONTVANGER BERICHT [PARAMETERS_BERICHT]"
#: src/utils/pacmd.c:82
#, c-format
@ -2342,9 +2342,9 @@ msgid "Failed to get server information: %s"
msgstr "Serverinformatie verkrijgen mislukte: %s"
#: src/utils/pactl.c:224 src/utils/pactl.c:236
#, fuzzy, c-format
#, c-format
msgid "%s\n"
msgstr "%s %s"
msgstr "%s\n"
#: src/utils/pactl.c:281
#, c-format
@ -2416,7 +2416,7 @@ msgstr "Mic"
#: src/utils/pactl.c:338
msgid "Handset"
msgstr ""
msgstr "Telefoon"
#: src/utils/pactl.c:339
msgid "Earpiece"
@ -2879,7 +2879,7 @@ msgstr "bron"
#: src/utils/pactl.c:2167
msgid "sink-input"
msgstr ""
msgstr "afvoerinvoer"
#: src/utils/pactl.c:2170
msgid "source-output"
@ -2895,7 +2895,7 @@ msgstr "cliënt"
#: src/utils/pactl.c:2179
msgid "sample-cache"
msgstr ""
msgstr "voorbeeldcache"
#: src/utils/pactl.c:2182
msgid "server"
@ -3017,9 +3017,9 @@ msgstr ""
"Gelinkt met libpulse %s\n"
#: src/utils/pactl.c:2751
#, fuzzy, c-format
#, c-format
msgid "Invalid format value '%s'"
msgstr "Ongeldige stroomnaam %s"
msgstr "Ongeldige formaatwaarde %s"
#: src/utils/pactl.c:2778
#, c-format
@ -3103,18 +3103,16 @@ msgid "You have to specify a source name"
msgstr "U dient een bronnaam op te geven"
#: src/utils/pactl.c:2998 src/utils/pactl.c:3076
#, fuzzy
msgid "You have to specify a sink name/index"
msgstr "U dient een afvoernaam op te geven"
msgstr "U dient een afvoernaam/-index op te geven"
#: src/utils/pactl.c:3008
msgid "You have to specify a sink name/index and a volume"
msgstr "U dient een afvoernaam/index en een volume op te geven"
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101
#, fuzzy
msgid "You have to specify a source name/index"
msgstr "U dient een bronnaam op te geven"
msgstr "U dient een bronnaam/-index op te geven"
#: src/utils/pactl.c:3031
msgid "You have to specify a source name/index and a volume"

View file

@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-05-23 11:18+0000\n"
"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
"Language-Team: Norwegian Nynorsk <https://translate.fedoraproject.org/"
@ -1122,8 +1122,8 @@ msgstr ""
"channels=<talet på kanalar> channel_map=<kanaldefinisjon> autoloaded=<vel "
"dette viss modulen vert lasta automatisk> use_volume_sharing=<yes eller no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT-basert lydbalanse­kontroll på %s"
@ -1190,14 +1190,14 @@ msgstr "Lyd på @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunell for %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunell til %s/%s"
@ -1548,11 +1548,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Ugyldig loggmål."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Innebygd lyd"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -1946,8 +1946,8 @@ msgstr ""
" --version Vis versjonsinformasjon.\n"
"\n"
" -r, --record Opprett tilkopling for lydopptak.\n"
" -p, --playback Opprett tilkopling for lydavspeling."
"\n"
" -p, --playback Opprett tilkopling for "
"lydavspeling.\n"
"\n"
" -v, --verbose Vis meir detaljerte meldingar.\n"
"\n"
@ -1955,14 +1955,14 @@ msgstr ""
" -d, --device=EINING Namnet på sluket/kjelda å kopla til. "
"Du kan bruka namna @DEFAULT_SINK@, @DEFAULT_SOURCE@ og @DEFAULT_MONITOR@ for "
"å velja standard sluk/kjelde/avlyttar.\n"
" -n, --client-name=NAMN Kva klienten skal kallast på tenaren."
"\n"
" --stream-name=NAMN Kva straumen skal kallast på tenaren."
"\n"
" --volume=LYDSTYRKE Vel startlydstyrke (lineær). Verdiar:"
" 065536.\n"
" --rate=SAMPLINGSRATE Samplingsrate i Hz (standard: 44100)."
"\n"
" -n, --client-name=NAMN Kva klienten skal kallast på "
"tenaren.\n"
" --stream-name=NAMN Kva straumen skal kallast på "
"tenaren.\n"
" --volume=LYDSTYRKE Vel startlydstyrke (lineær). "
"Verdiar: 065536.\n"
" --rate=SAMPLINGSRATE Samplingsrate i Hz (standard: "
"44100).\n"
" --format=SAMPLEFORMAT Samplingsformat. Sjå\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
@ -1983,8 +1983,8 @@ msgstr ""
"frå\n"
" sluket/kjelda som straumen vert "
"kopla til.\n"
" --no-remix Ikkje oppmiks eller nedmiks kanalar."
"\n"
" --no-remix Ikkje oppmiks eller nedmiks "
"kanalar.\n"
" --no-remap Definer kanalar etter indeks, ikkje "
"etter namn.\n"
" --latency=BYTE Be om valt latenstid, målt i byte.\n"
@ -1998,8 +1998,8 @@ msgstr ""
"verdi.\n"
" --raw Ta opp / spel av rå PCM-data.\n"
" --passthrough Vidaresend lyddata.\n"
" --file-format[=FFORMAT] Ta opp / spel av formatert PCM-data."
"\n"
" --file-format[=FFORMAT] Ta opp / spel av formatert PCM-"
"data.\n"
" --list-file-formats Vis tilgjengelege filformat.\n"
" --monitor-stream=INDEKS Ta opp frå sluk-inndata med indeksen "
"INDEKS.\n"

View file

@ -13,7 +13,7 @@ msgstr ""
"Project-Id-Version: pulseaudio trunk\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2016-10-12 22:20+0200\n"
"Last-Translator: Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>\n"
"Language-Team: Tot En Òc\n"
@ -1051,8 +1051,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1119,14 +1119,14 @@ msgstr "Audio sus @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1474,11 +1474,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Àudio integrat"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modèm"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.or\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:55+0000\n"
"Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
"Language-Team: Oriya <oriya-it@googlegroups.com>\n"
@ -1164,8 +1164,8 @@ msgstr ""
"channel_map=<ଚ୍ୟାନେଲ ମ୍ୟାପ> plugin=<ladspa ପ୍ଲଗଇନ ନାମ> label=<ladspa ପ୍ଲଗଇନ "
"ନାମପଟି> control=<କମା ଦ୍ୱାରା ପୃଥକ ନିବେଶ ନିୟନ୍ତ୍ରଣ ମୂଲ୍ୟ ତାଲିକା>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1227,14 +1227,14 @@ msgstr "@HOSTNAME@ ରେ ଧ୍ୱନି"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1584,11 +1584,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] ଅବୈଧ ଲଗ ଲକ୍ଷ୍ଯସ୍ଥଳ '%s'।"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "ଆଭ୍ୟନ୍ତରୀଣ ଧ୍ୱନି"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "ମଡେମ"

View file

@ -11,7 +11,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.pa\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:55+0000\n"
"Last-Translator: Jaswinder Singh <jsingh@redhat.com>\n"
"Language-Team: Punjabi/Panjabi <kde-i18n-doc@kde.org>\n"
@ -1135,8 +1135,8 @@ msgstr ""
"plugin name> label=<ladspa plugin label> control=<comma separated list of "
"input control values>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1199,14 +1199,14 @@ msgstr "@HOSTNAME@ ਉੱਪਰ ਆਡੀਓ"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1557,11 +1557,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] ਗਲਤ ਲਾਗ ਟਾਰਗੇਟ '%s'।"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "ਅੰਦਰੂਨੀ ਆਡੀਓ"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "ਮਾਡਮ"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-05-21 10:06+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <https://translate.fedoraproject.org/projects/"
@ -1151,8 +1151,8 @@ msgstr ""
"kanałów> autoloaded=<należy ustawić, jeśli ten moduł jest automatycznie "
"uruchamiany> use_volume_sharing=<yes lub no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Korektor graficzny na podstawie FFT na %s"
@ -1219,14 +1219,14 @@ msgstr "Dźwięk na @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel dla %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunel do %s/%s"
@ -1576,11 +1576,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Nieprawidłowy dziennik docelowy."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Wbudowany dźwięk"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

509
po/pt.po

File diff suppressed because it is too large Load diff

View file

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-08-04 08:04+0000\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-05-10 22:55+0000\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
"Language-Team: Portuguese (Brazil) <https://translate.fedoraproject.org/"
"projects/pulseaudio/pulseaudio/pt_BR/>\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.7.2\n"
"X-Generator: Weblate 5.11.3\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -193,13 +193,12 @@ msgid "--fail expects boolean argument"
msgstr "--fail espera argumento booleano"
#: src/daemon/cmdline.c:265
#, fuzzy
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of error, warn, notice, info, debug)."
msgstr ""
"--log-level espera um argumento em nível de log (seja numérico na faixa de "
"0..4 seja algum entre debug, info, notice, warn, error)."
"0..4 seja algum entre error, warn, notice, info, debug)."
#: src/daemon/cmdline.c:277
msgid "--high-priority expects boolean argument"
@ -1162,8 +1161,8 @@ msgstr ""
"canais> autoloaded=<define se este módulo está sendo carregado "
"automaticamente> use_volume_sharing=<yes ou no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Equalizador baseado em FFT em %s"
@ -1230,14 +1229,14 @@ msgstr "Áudio em @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Túnel para %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Túnel para %s/%s"
@ -1587,11 +1586,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Alvo do log inválido."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Áudio interno"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -1909,7 +1908,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
msgstr "pa_stream_update_timing_info() falhou: %s"
#: src/utils/pacat.c:676
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
@ -1988,62 +1987,58 @@ msgstr ""
" -v, --verbose Habilita operações no modo "
"detalhado\n"
"\n"
" -s, --server=SERVIDOR O nome do servidor a conectar-se\n"
" -d, --device=DISPOSITIVO O nome do destino/fonte a conectar-"
"se\n"
" -s, --server=SERVIDOR O nome do servidor para se conectar\n"
" -d, --device=DISPOSITIVO O nome do destino/fonte para se "
"conectar\n"
" -n, --client-name=NOME Como chamar este cliente no "
"servidor\n"
" --stream-name=NOME Como chamar este fluxo no servidor\n"
" --volume=VOLUME Especifica a faixa (linear) inicial\n"
" de volume no intervalo 0...65536\n"
" --rate=TAXA_DE_AMOSTRAGEM Taxa de amostragem, Hz (padrão "
" --volume=VOLUME Especifica o volume (linear) inicial "
"no intervalo 0...65536\n"
" --rate=TAXA_DE_AMOSTRAGEM Taxa de amostragem em Hz (padrão: "
"44100)\n"
" --format=FORMATO_DE_AMOSTRAGEM Tipo de amostragem, veja\n"
" --format=FORMATO_DE_AMOSTRAGEM Formato da amostragem, veja\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" para valores possíveis (padrão: "
"s16ne)\n"
" --channels=CANAIS O número de canais, 1 para mono,\n"
" 2 para estéreo (padrão: 2)\n"
" --channel-map=MAPA_DE_CANAIS Mapeamento de canais a ser usado no\n"
" lugar do padrão\n"
" --fix-format Obtém o formato da amostragem do\n"
" destino/fonte onde o fluxo está\n"
" sendo conectado.\n"
" --fix-rate Obtém a taxa de amostragem do\n"
" destino/fonte onde o fluxo está\n"
" sendo conectado.\n"
" --fix-channels Obtém o número de canais e o mapa "
"de\n"
" canais do destino onde o fluxo está\n"
" sendo conectado.\n"
" --no-remix Não faz upmix nem downmix dos "
"canais.\n"
" --no-remap Mapeia os canais por índice em vez\n"
" de nome\n"
" --latency=BYTES Requisita a latência especificada "
"em\n"
" bytes.\n"
" --process-time=BYTES Requisita o tempo de processo\n"
" especificado por requisições em "
" --channels=CANAIS O número de canais, 1 para mono, 2 "
"para estéreo\n"
" (padrão: 2)\n"
" --channel-map=MAPA_DE_CANAIS Mapeamento de canais para usar em "
"vez do padrão\n"
" --fix-format Obtém o formato da amostragem do "
"destino/fonte onde\n"
" o fluxo está sendo conectado.\n"
" --fix-rate Obtém a taxa de amostragem do "
"destino/fonte onde\n"
" o fluxo está sendo conectado.\n"
" --fix-channels Obtém o número de canais e o mapa de "
"canais do destino\n"
" onde o fluxo está sendo conectado.\n"
" --no-remix Não faz upmix nem downmix dos canais."
"\n"
" --no-remap Mapeia os canais por índice em vez "
"de nome.\n"
" --latency=BYTES Requisita a latência especificada em "
"bytes.\n"
" --latency-msec=MSEGUNDOS Requisita a latência especificada "
"em\n"
" milissegundos.\n"
" --process-time-msec=MSEGUNDOS Requisita a o tempo do processo por\n"
" requisição em milissegundos.\n"
" --process-time=BYTES Requisita o tempo de processo por "
"requisições em bytes.\n"
" --latency-msec=MSEGUNDOS Requisita a latência especificada em "
"milissegundos.\n"
" --process-time-msec=MSEGUNDOS Requisita o tempo de processo por "
"requisições em milissegundos.\n"
" --property=PROPRIEDADE=VALOR Define a propriedade especificada "
"para\n"
" o valor especificado.\n"
"para o valor especificado.\n"
" --raw Grava/reproduz dados PCM não "
"tratados.\n"
" --passthrough Dados para conversão.\n"
" --file-format[=FORMATO_ARQUIVO] Grava/reproduz dados PCM "
"formatados.\n"
" --file-format[=FORMATO_ARQUIVO] Grava/reproduz dados PCM formatados."
"\n"
" --list-file-formats Lista formatos de arquivo "
"disponíveis.\n"
" --monitor-stream=ÍNDICE Grava da entrada do destino com "
"índice.\n"
"índice ÍNDICE.\n"
#: src/utils/pacat.c:793
msgid "Play back encoded audio files on a PulseAudio sound server."
@ -2876,11 +2871,12 @@ msgstr "mensagem list-handlers falhou: %s"
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
msgstr "a resposta da mensagem list-handlers não pôde ser tratada corretamente"
msgstr ""
"a resposta da mensagem de list-handlers não pôde ser tratada corretamente"
#: src/utils/pactl.c:1718
msgid "list-handlers message response is not a JSON array"
msgstr "a resposta da mensagem list-handlers não é um array JSON"
msgstr "a resposta da mensagem de list-handlers não é um array JSON"
#: src/utils/pactl.c:1729
#, c-format
@ -3052,7 +3048,7 @@ msgstr ""
"padrão.\n"
#: src/utils/pactl.c:2664
#, fuzzy, c-format
#, c-format
msgid ""
"\n"
" -h, --help Show this help\n"
@ -3069,7 +3065,9 @@ msgstr ""
" -h, --help Mostra esta ajuda\n"
" --version Mostra a versão\n"
"\n"
" -s, --server=SERVIDOR Nome do servidor a ser conectado\n"
" -f, --format=FORMATO O formato da saída. \"normal\" ou "
"\"json\"\n"
" -s, --server=SERVIDOR Nome do servidor para se conectar\n"
" -n, --client-name=NOME Como chamar este cliente no "
"servidor\n"
@ -3085,9 +3083,9 @@ msgstr ""
"Vinculado com libpulse %s\n"
#: src/utils/pactl.c:2751
#, fuzzy, c-format
#, c-format
msgid "Invalid format value '%s'"
msgstr "Nome do fluxo “%s” inválido"
msgstr "Valor de formato “%s” inválido"
#: src/utils/pactl.c:2778
#, c-format

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -954,7 +954,7 @@ msgid ""
"is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094 src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097 src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1008,12 +1008,12 @@ msgstr ""
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356 src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370 src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697 src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715 src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1348,11 +1348,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr ""
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr ""

3412
po/ro.po Normal file

File diff suppressed because it is too large Load diff

458
po/ru.po
View file

@ -9,18 +9,18 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2022-05-23 11:18+0000\n"
"Last-Translator: Sergey A. <sw@atrus.ru>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-05-11 00:38+0000\n"
"Last-Translator: \"Sergey A.\" <Ser82-png@yandex.ru>\n"
"Language-Team: Russian <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.12.2\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.11.3\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -109,8 +109,8 @@ msgstr ""
" --start Запустить демон, если ещё не "
"запущен\n"
" -k --kill Убить процесс запущенного демона\n"
" --check Проверить, запущен ли демон ("
"возвращает только код завершения)\n"
" --check Проверить, запущен ли демон "
"(возвращает только код завершения)\n"
"\n"
"ПАРАМЕТРЫ:\n"
" --system[=BOOL] Запустить в общесистемном режиме\n"
@ -397,7 +397,7 @@ msgstr ""
#: src/daemon/ltdl-bind-now.c:144
msgid "Failed to add bind-now-loader."
msgstr "Не удалось добавить новый загрузчик bind-now."
msgstr "Не удалось добавить bind-now-loader."
#: src/daemon/main.c:265
#, c-format
@ -1063,7 +1063,7 @@ msgstr "Хендс-фри"
#: src/modules/bluetooth/module-bluez5-device.c:1971
msgid "Headphone"
msgstr "Наушник"
msgstr "Наушники"
#: src/modules/bluetooth/module-bluez5-device.c:1977 src/utils/pactl.c:347
msgid "Portable"
@ -1170,8 +1170,8 @@ msgstr ""
"загружен автоматически> use_volume_sharing=<использовать общий уровень "
"громкости (yes или no)> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Эквалайзер на основе БПФ на %s"
@ -1238,18 +1238,14 @@ msgstr "Аудио на @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:320
#: src/modules/module-tunnel-source-new.c:305
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Туннель для %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:564
#: src/modules/module-tunnel-source-new.c:540
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Туннель к %s/%s"
@ -1272,10 +1268,9 @@ msgstr ""
"приёмника для фильтрации> sink_master=<имя приёмника для фильтрации> "
"format=<формат отсчётов> rate=<частота дискретизации> channels=<число "
"каналов> channel_map=<схема каналов> use_volume_sharing=<использовать общий "
"уровень (yes или no)> force_flat_volume=<yes или no> hrir=/path/to/"
"left_hrir.wav hrir_left=/path/to/left_hrir.wav hrir_right=/path/to/optional/"
"right_hrir.wav autoloaded=<установлено, если этот модуль загружается "
"автоматически> "
"уровень (yes или no)> force_flat_volume=<yes или no> hrir=/path/to/left_hrir."
"wav hrir_left=/path/to/left_hrir.wav hrir_right=/path/to/optional/right_hrir."
"wav autoloaded=<установлено, если этот модуль загружается автоматически> "
#: src/modules/raop/module-raop-discover.c:295
msgid "Unknown device model"
@ -1602,11 +1597,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Недопустимый журнал."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Встроенное аудио"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Модем"
@ -2042,8 +2037,8 @@ msgstr ""
"байтах.\n"
" --process-time=BYTES Запросить указанное время процесса "
"на запрос в байтах.\n"
" --latency-msec=MSEC Запросить указанную задержку в мсек."
"\n"
" --latency-msec=MSEC Запросить указанную задержку в "
"мсек.\n"
" --process-time-msec=MSEC Запросить указанное время процесса "
"на запрос в мсек.\n"
" --property=PROPERTY=VALUE Установить для указанного свойства "
@ -2095,7 +2090,7 @@ msgstr ""
"Скомпилировано с libpulse %s\n"
"Скомпоновано с libpulse %s\n"
#: src/utils/pacat.c:852 src/utils/pactl.c:2731 src/utils/pactl.c:2720
#: src/utils/pacat.c:852 src/utils/pactl.c:2731
#, c-format
msgid "Invalid client name '%s'"
msgstr "Недопустимое имя клиента «%s»"
@ -2168,7 +2163,7 @@ msgstr ""
"Предупреждение: указанная спецификация отсчётов будет заменена спецификацией "
"из файла."
#: src/utils/pacat.c:1091 src/utils/pactl.c:2806 src/utils/pactl.c:2794
#: src/utils/pacat.c:1091 src/utils/pactl.c:2806
msgid "Failed to determine sample specification from file."
msgstr "Не удалось определить спецификацию отсчётов из файла."
@ -2204,7 +2199,7 @@ msgstr "воспроизведения"
msgid "Failed to set media name."
msgstr "Не удалось установить имя потока."
#: src/utils/pacat.c:1172 src/utils/pactl.c:3218 src/utils/pactl.c:3206
#: src/utils/pacat.c:1172 src/utils/pactl.c:3218
msgid "pa_mainloop_new() failed."
msgstr "Произошла ошибка при выполнении pa_mainloop_new()."
@ -2212,11 +2207,11 @@ msgstr "Произошла ошибка при выполнении pa_mainloop_
msgid "io_new() failed."
msgstr "Произошла ошибка при выполнении io_new()."
#: src/utils/pacat.c:1202 src/utils/pactl.c:3230 src/utils/pactl.c:3218
#: src/utils/pacat.c:1202 src/utils/pactl.c:3230
msgid "pa_context_new() failed."
msgstr "Произошла ошибка при выполнении pa_context_new()."
#: src/utils/pacat.c:1210 src/utils/pactl.c:3236 src/utils/pactl.c:3224
#: src/utils/pacat.c:1210 src/utils/pactl.c:3236
#, c-format
msgid "pa_context_connect() failed: %s"
msgstr "Произошла ошибка при выполнении pa_context_connect(): %s"
@ -2225,22 +2220,21 @@ msgstr "Произошла ошибка при выполнении pa_context_c
msgid "pa_context_rttime_new() failed."
msgstr "Произошла ошибка при выполнении pa_context_rttime_new()."
#: src/utils/pacat.c:1223 src/utils/pactl.c:3241 src/utils/pactl.c:3229
#: src/utils/pacat.c:1223 src/utils/pactl.c:3241
msgid "pa_mainloop_run() failed."
msgstr "Произошла ошибка при выполнении pa_mainloop_run()."
#: src/utils/pacmd.c:51 src/utils/pactl.c:2643 src/utils/pactl.c:2632
#: src/utils/pacmd.c:51 src/utils/pactl.c:2643
msgid "NAME [ARGS ...]"
msgstr "ИМЯ [АРГУМЕНТЫ ...]"
#: src/utils/pacmd.c:52 src/utils/pacmd.c:60 src/utils/pactl.c:2644
#: src/utils/pactl.c:2651 src/utils/pactl.c:2652 src/utils/pactl.c:2633
#: src/utils/pactl.c:2640 src/utils/pactl.c:2641
#: src/utils/pactl.c:2651 src/utils/pactl.c:2652
msgid "NAME|#N"
msgstr "ИМЯ|№"
#: src/utils/pacmd.c:53 src/utils/pacmd.c:63 src/utils/pactl.c:2642
#: src/utils/pactl.c:2649 src/utils/pactl.c:2631 src/utils/pactl.c:2638
#: src/utils/pactl.c:2649
msgid "NAME"
msgstr "ИМЯ"
@ -2253,7 +2247,6 @@ msgid "#N VOLUME"
msgstr "№ ГРОМКОСТЬ"
#: src/utils/pacmd.c:56 src/utils/pacmd.c:70 src/utils/pactl.c:2646
#: src/utils/pactl.c:2635
msgid "NAME|#N 1|0"
msgstr "ИМЯ|№ 1|0"
@ -2289,7 +2282,7 @@ msgstr "ПУТЬ"
msgid "FILENAME SINK|#N"
msgstr "ИМЯ_ФАЙЛА АУДИОПРИЁМНИК|№"
#: src/utils/pacmd.c:69 src/utils/pactl.c:2645 src/utils/pactl.c:2634
#: src/utils/pacmd.c:69 src/utils/pactl.c:2645
msgid "#N SINK|SOURCE"
msgstr "№ АУДИОПРИЁМНИК|ИСТОЧНИК"
@ -2297,15 +2290,15 @@ msgstr "№ АУДИОПРИЁМНИК|ИСТОЧНИК"
msgid "1|0"
msgstr "1|0"
#: src/utils/pacmd.c:72 src/utils/pactl.c:2647 src/utils/pactl.c:2636
#: src/utils/pacmd.c:72 src/utils/pactl.c:2647
msgid "CARD PROFILE"
msgstr "ПЛАТА ПРОФИЛЬ"
#: src/utils/pacmd.c:73 src/utils/pactl.c:2650 src/utils/pactl.c:2639
#: src/utils/pacmd.c:73 src/utils/pactl.c:2650
msgid "NAME|#N PORT"
msgstr "ИМЯ|№ ПОРТ"
#: src/utils/pacmd.c:74 src/utils/pactl.c:2658 src/utils/pactl.c:2647
#: src/utils/pacmd.c:74 src/utils/pactl.c:2658
msgid "CARD-NAME|CARD-#N PORT OFFSET"
msgstr "ИМЯ_ПЛАТЫ|№_ПЛАТЫ ПОРТ ЗАДЕРЖКА"
@ -2321,7 +2314,7 @@ msgstr "ЧИСЛОВОЙ-УРОВЕНЬ"
msgid "FRAMES"
msgstr "КАДРОВ"
#: src/utils/pacmd.c:80 src/utils/pactl.c:2659 src/utils/pactl.c:2648
#: src/utils/pacmd.c:80 src/utils/pactl.c:2659
msgid "RECIPIENT MESSAGE [MESSAGE_PARAMETERS]"
msgstr "СООБЩЕНИЕ ПОЛУЧАТЕЛЯ [ПАРАМЕТРЫ_СООБЩЕНИЯ]"
@ -2505,7 +2498,7 @@ msgstr "Гарнитура"
#: src/utils/pactl.c:339
msgid "Earpiece"
msgstr "Наушник"
msgstr "Наушники-вкладыши"
#: src/utils/pactl.c:340
msgid "SPDIF"
@ -3019,15 +3012,15 @@ msgstr "Получен сигнал для остановки (SIGINT), выхо
msgid "Invalid volume specification"
msgstr "Недопустимое значение громкости"
#: src/utils/pactl.c:2581 src/utils/pactl.c:2570
#: src/utils/pactl.c:2581
msgid "Volume outside permissible range.\n"
msgstr "Указанная громкость выходит за границы разрешённого диапазона.\n"
#: src/utils/pactl.c:2594 src/utils/pactl.c:2583
#: src/utils/pactl.c:2594
msgid "Invalid number of volume specifications.\n"
msgstr "Недопустимое количество значений громкости.\n"
#: src/utils/pactl.c:2606 src/utils/pactl.c:2595
#: src/utils/pactl.c:2606
msgid "Inconsistent volume specification.\n"
msgstr "Несогласованные способы указания значений громкости.\n"
@ -3039,46 +3032,43 @@ msgstr "Несогласованные способы указания знач
#: src/utils/pactl.c:2651 src/utils/pactl.c:2652 src/utils/pactl.c:2653
#: src/utils/pactl.c:2654 src/utils/pactl.c:2655 src/utils/pactl.c:2656
#: src/utils/pactl.c:2657 src/utils/pactl.c:2658 src/utils/pactl.c:2659
#: src/utils/pactl.c:2660 src/utils/pactl.c:2625 src/utils/pactl.c:2626
#: src/utils/pactl.c:2627 src/utils/pactl.c:2628 src/utils/pactl.c:2629
#: src/utils/pactl.c:2630 src/utils/pactl.c:2631 src/utils/pactl.c:2632
#: src/utils/pactl.c:2633 src/utils/pactl.c:2634 src/utils/pactl.c:2635
#: src/utils/pactl.c:2660
msgid "[options]"
msgstr "[параметры]"
#: src/utils/pactl.c:2638 src/utils/pactl.c:2627
#: src/utils/pactl.c:2638
msgid "[TYPE]"
msgstr "[ТИП]"
#: src/utils/pactl.c:2640 src/utils/pactl.c:2629
#: src/utils/pactl.c:2640
msgid "FILENAME [NAME]"
msgstr "ИМЯ_ФАЙЛА [ИМЯ]"
#: src/utils/pactl.c:2641 src/utils/pactl.c:2630
#: src/utils/pactl.c:2641
msgid "NAME [SINK]"
msgstr "ИМЯ [АУДИОПРИЁМНИК]"
#: src/utils/pactl.c:2653 src/utils/pactl.c:2642
#: src/utils/pactl.c:2653
msgid "NAME|#N VOLUME [VOLUME ...]"
msgstr "ИМЯ|№ ГРОМКОСТЬ [ГРОМКОСТЬ ...]"
#: src/utils/pactl.c:2654 src/utils/pactl.c:2643
#: src/utils/pactl.c:2654
msgid "#N VOLUME [VOLUME ...]"
msgstr "№ ГРОМКОСТЬ [ГРОМКОСТЬ ...]"
#: src/utils/pactl.c:2655 src/utils/pactl.c:2644
#: src/utils/pactl.c:2655
msgid "NAME|#N 1|0|toggle"
msgstr "ИМЯ|№ 1|0|toggle"
#: src/utils/pactl.c:2656 src/utils/pactl.c:2645
#: src/utils/pactl.c:2656
msgid "#N 1|0|toggle"
msgstr "№ 1|0|toggle"
#: src/utils/pactl.c:2657 src/utils/pactl.c:2646
#: src/utils/pactl.c:2657
msgid "#N FORMATS"
msgstr "№ ФОРМАТЫ"
#: src/utils/pactl.c:2661 src/utils/pactl.c:2650
#: src/utils/pactl.c:2661
#, c-format
msgid ""
"\n"
@ -3090,7 +3080,7 @@ msgstr ""
"можно использовать для указания аудиоприёмника, источника и монитора, "
"используемых по умолчанию.\n"
#: src/utils/pactl.c:2664 src/utils/pactl.c:2653
#: src/utils/pactl.c:2664
#, c-format
msgid ""
"\n"
@ -3113,7 +3103,7 @@ msgstr ""
" -s, --server=СЕРВЕР Имя сервера для подключения\n"
" -n, --client-name=ИМЯ Имя этого клиента на сервере\n"
#: src/utils/pactl.c:2707 src/utils/pactl.c:2696
#: src/utils/pactl.c:2707
#, c-format
msgid ""
"pactl %s\n"
@ -3124,66 +3114,65 @@ msgstr ""
"Скомпилировано с libpulse %s\n"
"Скомпоновано с libpulse %s\n"
#: src/utils/pactl.c:2751 src/utils/pactl.c:2739
#: src/utils/pactl.c:2751
#, c-format
msgid "Invalid format value '%s'"
msgstr "Недопустимое значение формата «%s»"
#: src/utils/pactl.c:2778 src/utils/pactl.c:2766
#: src/utils/pactl.c:2778
#, c-format
msgid "Specify nothing, or one of: %s"
msgstr "Не указывайте ничего либо укажите одно из: %s"
#: src/utils/pactl.c:2788 src/utils/pactl.c:2776
#: src/utils/pactl.c:2788
msgid "Please specify a sample file to load"
msgstr "Необходимо указать файл, из которого будет загружен сэмпл"
#: src/utils/pactl.c:2801 src/utils/pactl.c:2789
#: src/utils/pactl.c:2801
msgid "Failed to open sound file."
msgstr "Не удалось открыть аудиофайл."
#: src/utils/pactl.c:2813 src/utils/pactl.c:2801
#: src/utils/pactl.c:2813
msgid "Warning: Failed to determine sample specification from file."
msgstr "Предупреждение: не удалось определить спецификацию отсчётов из файла."
#: src/utils/pactl.c:2823 src/utils/pactl.c:2811
#: src/utils/pactl.c:2823
msgid "You have to specify a sample name to play"
msgstr "Необходимо указать имя сэмпла для воспроизведения"
#: src/utils/pactl.c:2835 src/utils/pactl.c:2823
#: src/utils/pactl.c:2835
msgid "You have to specify a sample name to remove"
msgstr "Необходимо указать имя сэмпла для удаления"
#: src/utils/pactl.c:2844 src/utils/pactl.c:2832
#: src/utils/pactl.c:2844
msgid "You have to specify a sink input index and a sink"
msgstr "Необходимо указать номер входа аудиоприёмника и аудиоприёмник"
#: src/utils/pactl.c:2854 src/utils/pactl.c:2842
#: src/utils/pactl.c:2854
msgid "You have to specify a source output index and a source"
msgstr "Необходимо указать номер выхода источника и источник"
#: src/utils/pactl.c:2869 src/utils/pactl.c:2857
#: src/utils/pactl.c:2869
msgid "You have to specify a module name and arguments."
msgstr "Необходимо указать имя модуля и аргументы."
#: src/utils/pactl.c:2889 src/utils/pactl.c:2877
#: src/utils/pactl.c:2889
msgid "You have to specify a module index or name"
msgstr "Необходимо указать номер или имя модуля"
#: src/utils/pactl.c:2902 src/utils/pactl.c:2890
#: src/utils/pactl.c:2902
msgid ""
"You may not specify more than one sink. You have to specify a boolean value."
msgstr ""
"Нельзя указывать больше одного аудиоприёмника. Необходимо указать логическое "
"значение."
#: src/utils/pactl.c:2907 src/utils/pactl.c:2927 src/utils/pactl.c:2895
#: src/utils/pactl.c:2915
#: src/utils/pactl.c:2907 src/utils/pactl.c:2927
msgid "Invalid suspend specification."
msgstr ""
"Недопустимое значение операции приостановки, ожидалось логическое значение."
#: src/utils/pactl.c:2922 src/utils/pactl.c:2910
#: src/utils/pactl.c:2922
msgid ""
"You may not specify more than one source. You have to specify a boolean "
"value."
@ -3191,61 +3180,59 @@ msgstr ""
"Нельзя указывать больше одного источника. Необходимо указать логическое "
"значение."
#: src/utils/pactl.c:2939 src/utils/pactl.c:2927
#: src/utils/pactl.c:2939
msgid "You have to specify a card name/index and a profile name"
msgstr "Необходимо указать имя или номер звуковой платы и имя профиля"
#: src/utils/pactl.c:2950 src/utils/pactl.c:2938
#: src/utils/pactl.c:2950
msgid "You have to specify a sink name/index and a port name"
msgstr "Необходимо указать имя или номер аудиоприёмника и имя порта"
#: src/utils/pactl.c:2961 src/utils/pactl.c:2949
#: src/utils/pactl.c:2961
msgid "You have to specify a sink name"
msgstr "Необходимо указать имя аудиоприёмника"
#: src/utils/pactl.c:2974 src/utils/pactl.c:2962
#: src/utils/pactl.c:2974
msgid "You have to specify a source name/index and a port name"
msgstr "Необходимо указать имя или номер источника и имя порта"
#: src/utils/pactl.c:2985 src/utils/pactl.c:2973
#: src/utils/pactl.c:2985
msgid "You have to specify a source name"
msgstr "Необходимо указать имя источника"
#: src/utils/pactl.c:2998 src/utils/pactl.c:3076 src/utils/pactl.c:2986
#: src/utils/pactl.c:3064
#: src/utils/pactl.c:2998 src/utils/pactl.c:3076
msgid "You have to specify a sink name/index"
msgstr "Необходимо указать имя или номер аудиоприёмника"
#: src/utils/pactl.c:3008 src/utils/pactl.c:2996
#: src/utils/pactl.c:3008
msgid "You have to specify a sink name/index and a volume"
msgstr "Необходимо указать имя или номер аудиоприёмника и громкость"
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101 src/utils/pactl.c:3009
#: src/utils/pactl.c:3089
#: src/utils/pactl.c:3021 src/utils/pactl.c:3101
msgid "You have to specify a source name/index"
msgstr "Необходимо указать имя или номер источника"
#: src/utils/pactl.c:3031 src/utils/pactl.c:3019
#: src/utils/pactl.c:3031
msgid "You have to specify a source name/index and a volume"
msgstr "Необходимо указать имя или номер источника и громкость"
#: src/utils/pactl.c:3044 src/utils/pactl.c:3032
#: src/utils/pactl.c:3044
msgid "You have to specify a sink input index and a volume"
msgstr "Необходимо указать номер входа аудиоприёмника и громкость"
#: src/utils/pactl.c:3049 src/utils/pactl.c:3037
#: src/utils/pactl.c:3049
msgid "Invalid sink input index"
msgstr "Недопустимый номер входа аудиоприёмника"
#: src/utils/pactl.c:3060 src/utils/pactl.c:3048
#: src/utils/pactl.c:3060
msgid "You have to specify a source output index and a volume"
msgstr "Необходимо указать номер выхода источника и громкость"
#: src/utils/pactl.c:3065 src/utils/pactl.c:3053
#: src/utils/pactl.c:3065
msgid "Invalid source output index"
msgstr "Недопустимый номер выхода источника"
#: src/utils/pactl.c:3086 src/utils/pactl.c:3074
#: src/utils/pactl.c:3086
msgid ""
"You have to specify a sink name/index and a mute action (0, 1, or 'toggle')"
msgstr ""
@ -3253,30 +3240,29 @@ msgstr ""
"выключения звука (0, 1 или «toggle»)"
#: src/utils/pactl.c:3091 src/utils/pactl.c:3116 src/utils/pactl.c:3136
#: src/utils/pactl.c:3154 src/utils/pactl.c:3079 src/utils/pactl.c:3104
#: src/utils/pactl.c:3124 src/utils/pactl.c:3142
#: src/utils/pactl.c:3154
msgid "Invalid mute specification"
msgstr "Недопустимое логическое значение выключения звука"
#: src/utils/pactl.c:3111 src/utils/pactl.c:3099
#: src/utils/pactl.c:3111
msgid ""
"You have to specify a source name/index and a mute action (0, 1, or 'toggle')"
msgstr ""
"Необходимо указать имя или номер источника и логическое значение выключения "
"звука (0, 1 или «toggle»)"
#: src/utils/pactl.c:3126 src/utils/pactl.c:3114
#: src/utils/pactl.c:3126
msgid ""
"You have to specify a sink input index and a mute action (0, 1, or 'toggle')"
msgstr ""
"Необходимо указать номер входа аудиоприёмника и логическое значение "
"выключения звука (0, 1 или «toggle»)"
#: src/utils/pactl.c:3131 src/utils/pactl.c:3119
#: src/utils/pactl.c:3131
msgid "Invalid sink input index specification"
msgstr "Недопустимый номер входа аудиоприёмника"
msgstr "Недопустимая спецификация номера входа аудиоприёмника"
#: src/utils/pactl.c:3144 src/utils/pactl.c:3132
#: src/utils/pactl.c:3144
msgid ""
"You have to specify a source output index and a mute action (0, 1, or "
"'toggle')"
@ -3284,15 +3270,15 @@ msgstr ""
"Необходимо указать номер выхода источника и логическое значение выключения "
"звука (0, 1 или «toggle»)"
#: src/utils/pactl.c:3149 src/utils/pactl.c:3137
#: src/utils/pactl.c:3149
msgid "Invalid source output index specification"
msgstr "Недопустимый номер выхода источника"
#: src/utils/pactl.c:3162 src/utils/pactl.c:3150
#: src/utils/pactl.c:3162
msgid "You have to specify at least an object path and a message name"
msgstr "Вы должны указать как минимум путь к объекту и имя сообщения"
#: src/utils/pactl.c:3160
#: src/utils/pactl.c:3172
msgid ""
"Excess arguments given, they will be ignored. Note that all message "
"parameters must be given as a single string."
@ -3300,7 +3286,7 @@ msgstr ""
"Даны лишние аргументы, они будут проигнорированы. Обратите внимание, что все "
"параметры сообщения должны быть предоставлены в виде одной строки."
#: src/utils/pactl.c:3182 src/utils/pactl.c:3170
#: src/utils/pactl.c:3182
msgid ""
"You have to specify a sink index and a semicolon-separated list of supported "
"formats"
@ -3308,15 +3294,15 @@ msgstr ""
"Необходимо указать номер аудиоприёмника и разделённый запятыми список "
"поддерживаемых форматов"
#: src/utils/pactl.c:3194 src/utils/pactl.c:3182
#: src/utils/pactl.c:3194
msgid "You have to specify a card name/index, a port name and a latency offset"
msgstr "Необходимо указать имя или номер звуковой платы, имя порта и задержку"
#: src/utils/pactl.c:3201 src/utils/pactl.c:3189
#: src/utils/pactl.c:3201
msgid "Could not parse latency offset"
msgstr "Недопустимое значение задержки"
#: src/utils/pactl.c:3213 src/utils/pactl.c:3201
#: src/utils/pactl.c:3213
msgid "No valid command specified."
msgstr "Имя команды не указано или не распознано."
@ -3480,134 +3466,134 @@ msgstr "Не удалось загрузить данные cookie.\n"
msgid "Not yet implemented.\n"
msgstr "Не реализовано.\n"
#: src/utils/pacat.c:676
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
"\n"
" -h, --help Show this help\n"
" --version Show version\n"
"\n"
" -r, --record Create a connection for recording\n"
" -p, --playback Create a connection for playback\n"
"\n"
" -v, --verbose Enable verbose operations\n"
"\n"
" -s, --server=SERVER The name of the server to connect "
"to\n"
" -d, --device=DEVICE The name of the sink/source to "
"connect to\n"
" -n, --client-name=NAME How to call this client on the "
"server\n"
" --stream-name=NAME How to call this stream on the "
"server\n"
" --volume=VOLUME Specify the initial (linear) volume "
"in range 0...65536\n"
" --rate=SAMPLERATE The sample rate in Hz (defaults to "
"44100)\n"
" --format=SAMPLEFORMAT The sample format, see\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" for possible values (defaults to "
"s16ne)\n"
" --channels=CHANNELS The number of channels, 1 for mono, "
"2 for stereo\n"
" (defaults to 2)\n"
" --channel-map=CHANNELMAP Channel map to use instead of the "
"default\n"
" --fix-format Take the sample format from the sink/"
"source the stream is\n"
" being connected to.\n"
" --fix-rate Take the sampling rate from the sink/"
"source the stream is\n"
" being connected to.\n"
" --fix-channels Take the number of channels and the "
"channel map\n"
" from the sink/source the stream is "
"being connected to.\n"
" --no-remix Don't upmix or downmix channels.\n"
" --no-remap Map channels by index instead of "
"name.\n"
" --latency=BYTES Request the specified latency in "
"bytes.\n"
" --process-time=BYTES Request the specified process time "
"per request in bytes.\n"
" --latency-msec=MSEC Request the specified latency in "
"msec.\n"
" --process-time-msec=MSEC Request the specified process time "
"per request in msec.\n"
" --property=PROPERTY=VALUE Set the specified property to the "
"specified value.\n"
" --raw Record/play raw PCM data.\n"
" --passthrough Passthrough data.\n"
" --file-format[=FFORMAT] Record/play formatted PCM data.\n"
" --list-file-formats List available file formats.\n"
" --monitor-stream=INDEX Record from the sink input with "
"index INDEX.\n"
msgstr ""
"%s [параметры]\n"
"%s\n"
"\n"
" -h, --help Показать эту справку\n"
" --version Показать сведения о версии\n"
"\n"
" -r, --record Создать соединение для записи\n"
" -p, --playback Создать соединение для "
"воспроизведения\n"
"\n"
" -v, --verbose Включить подробные операции\n"
"\n"
" -s, --server=СЕРВЕР Имя сервера для подключения\n"
" -d, --device=УСТРОЙСТВО Имя приёмника/источника для "
"подключения\n"
" -n, --client-name=ИМЯ Имя этого клиента на сервере\n"
" --stream-name=ИМЯ Имя этого потока на сервере\n"
" --volume=VOLUME Указать начальную (линейную) "
"громкость в диапазоне 0...65536\n"
" --rate=SAMPLERATE Частота дискретизации в Гц (по "
"умолчанию 44100)\n"
" --format=SAMPLEFORMAT Формат выборки, смотрите\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" возможные значения (по умолчанию "
"s16ne)\n"
" --channels=КАНАЛЫ Количество каналов, 1 для моно, 2 "
"для стерео\n"
" (по умолчанию 2)\n"
" --channel-map=CHANNELMAP Карта каналов для использования "
"вместо установленной по умолчанию\n"
" --fix-format Взять образец формата из приёмника/"
"источника, к которому\n"
" подключен поток.\n"
" --fix-rate Взять частоту дискретизации из "
"приёмника/источника, к которому\n"
" подключен поток.\n"
" --fix-channels Взять количество каналов и карту "
"каналов\n"
" из приёмника/источника, к которому "
"подключен поток.\n"
" --no-remix Не менять число каналов.\n"
" --no-remap Сопоставлять каналы по индексу, а не "
"по имени.\n"
" --latency=BYTES Запросить указанную задержку в "
"байтах.\n"
" --process-time=BYTES Запросить указанное время процесса "
"на запрос в байтах.\n"
" --latency-msec=MSEC Запросить указанную задержку в мсек."
"\n"
" --process-time-msec=MSEC Запросить указанное время процесса "
"на запрос в мсек.\n"
" --property=PROPERTY=VALUE Установить для указанного свойства "
"указанное значение.\n"
" --raw Запись/воспроизведение "
"необработанных данных PCM.\n"
" --passthrough Пропускать данные.\n"
" --file-format[=FFORMAT] Запись/воспроизведение "
"форматированных данных PCM.\n"
" --list-file-formats Список доступных форматов файлов.\n"
" --monitor-stream=INDEX Запись с входа приёмника с индексом "
"INDEX.\n"
#~ msgid ""
#~ "%s [options]\n"
#~ "%s\n"
#~ "\n"
#~ " -h, --help Show this help\n"
#~ " --version Show version\n"
#~ "\n"
#~ " -r, --record Create a connection for "
#~ "recording\n"
#~ " -p, --playback Create a connection for playback\n"
#~ "\n"
#~ " -v, --verbose Enable verbose operations\n"
#~ "\n"
#~ " -s, --server=SERVER The name of the server to connect "
#~ "to\n"
#~ " -d, --device=DEVICE The name of the sink/source to "
#~ "connect to\n"
#~ " -n, --client-name=NAME How to call this client on the "
#~ "server\n"
#~ " --stream-name=NAME How to call this stream on the "
#~ "server\n"
#~ " --volume=VOLUME Specify the initial (linear) "
#~ "volume in range 0...65536\n"
#~ " --rate=SAMPLERATE The sample rate in Hz (defaults "
#~ "to 44100)\n"
#~ " --format=SAMPLEFORMAT The sample format, see\n"
#~ " https://www.freedesktop.org/wiki/"
#~ "Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
#~ " for possible values (defaults to "
#~ "s16ne)\n"
#~ " --channels=CHANNELS The number of channels, 1 for "
#~ "mono, 2 for stereo\n"
#~ " (defaults to 2)\n"
#~ " --channel-map=CHANNELMAP Channel map to use instead of the "
#~ "default\n"
#~ " --fix-format Take the sample format from the "
#~ "sink/source the stream is\n"
#~ " being connected to.\n"
#~ " --fix-rate Take the sampling rate from the "
#~ "sink/source the stream is\n"
#~ " being connected to.\n"
#~ " --fix-channels Take the number of channels and "
#~ "the channel map\n"
#~ " from the sink/source the stream "
#~ "is being connected to.\n"
#~ " --no-remix Don't upmix or downmix channels.\n"
#~ " --no-remap Map channels by index instead of "
#~ "name.\n"
#~ " --latency=BYTES Request the specified latency in "
#~ "bytes.\n"
#~ " --process-time=BYTES Request the specified process "
#~ "time per request in bytes.\n"
#~ " --latency-msec=MSEC Request the specified latency in "
#~ "msec.\n"
#~ " --process-time-msec=MSEC Request the specified process "
#~ "time per request in msec.\n"
#~ " --property=PROPERTY=VALUE Set the specified property to the "
#~ "specified value.\n"
#~ " --raw Record/play raw PCM data.\n"
#~ " --passthrough Passthrough data.\n"
#~ " --file-format[=FFORMAT] Record/play formatted PCM data.\n"
#~ " --list-file-formats List available file formats.\n"
#~ " --monitor-stream=INDEX Record from the sink input with "
#~ "index INDEX.\n"
#~ msgstr ""
#~ "%s [параметры]\n"
#~ "%s\n"
#~ "\n"
#~ " -h, --help Показать эту справку\n"
#~ " --version Показать сведения о версии\n"
#~ "\n"
#~ " -r, --record Создать соединение для записи\n"
#~ " -p, --playback Создать соединение для "
#~ "воспроизведения\n"
#~ "\n"
#~ " -v, --verbose Включить подробные операции\n"
#~ "\n"
#~ " -s, --server=СЕРВЕР Имя сервера для подключения\n"
#~ " -d, --device=УСТРОЙСТВО Имя приёмника/источника для "
#~ "подключения\n"
#~ " -n, --client-name=ИМЯ Имя этого клиента на сервере\n"
#~ " --stream-name=ИМЯ Имя этого потока на сервере\n"
#~ " --volume=VOLUME Указать начальную (линейную) "
#~ "громкость в диапазоне 0...65536\n"
#~ " --rate=SAMPLERATE Частота дискретизации в Гц (по "
#~ "умолчанию 44100)\n"
#~ " --format=SAMPLEFORMAT Формат выборки, смотрите\n"
#~ " https://www.freedesktop.org/wiki/"
#~ "Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
#~ " возможные значения (по умолчанию "
#~ "s16ne)\n"
#~ " --channels=КАНАЛЫ Количество каналов, 1 для моно, 2 "
#~ "для стерео\n"
#~ " (по умолчанию 2)\n"
#~ " --channel-map=CHANNELMAP Карта каналов для использования "
#~ "вместо установленной по умолчанию\n"
#~ " --fix-format Взять образец формата из "
#~ "приёмника/источника, к которому\n"
#~ " подключен поток.\n"
#~ " --fix-rate Взять частоту дискретизации из "
#~ "приёмника/источника, к которому\n"
#~ " подключен поток.\n"
#~ " --fix-channels Взять количество каналов и карту "
#~ "каналов\n"
#~ " из приёмника/источника, к "
#~ "которому подключен поток.\n"
#~ " --no-remix Не менять число каналов.\n"
#~ " --no-remap Сопоставлять каналы по индексу, а "
#~ "не по имени.\n"
#~ " --latency=BYTES Запросить указанную задержку в "
#~ "байтах.\n"
#~ " --process-time=BYTES Запросить указанное время "
#~ "процесса на запрос в байтах.\n"
#~ " --latency-msec=MSEC Запросить указанную задержку в "
#~ "мсек.\n"
#~ " --process-time-msec=MSEC Запросить указанное время "
#~ "процесса на запрос в мсек.\n"
#~ " --property=PROPERTY=VALUE Установить для указанного "
#~ "свойства указанное значение.\n"
#~ " --raw Запись/воспроизведение "
#~ "необработанных данных PCM.\n"
#~ " --passthrough Пропускать данные.\n"
#~ " --file-format[=FFORMAT] Запись/воспроизведение "
#~ "форматированных данных PCM.\n"
#~ " --list-file-formats Список доступных форматов "
#~ "файлов.\n"
#~ " --monitor-stream=INDEX Запись с входа приёмника с "
#~ "индексом INDEX.\n"
#~ msgid "Failed to initialize daemon."
#~ msgstr "Не удалось инициализировать демон."

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2021-08-19 21:04+0000\n"
"Last-Translator: Hela Basa <r45xveza@pm.me>\n"
"Language-Team: Sinhala <https://translate.fedoraproject.org/projects/"
@ -980,8 +980,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1038,14 +1038,14 @@ msgstr ""
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1382,11 +1382,11 @@ msgstr ""
msgid "Invalid log target."
msgstr ""
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr ""
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr ""

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PulseAudio master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2020-11-25 08:35+0000\n"
"Last-Translator: Dusan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <https://translate.fedoraproject.org/projects/"
@ -1002,8 +1002,8 @@ msgid ""
"this module is being loaded automatically> use_volume_sharing=<yes or no> "
msgstr ""
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1060,14 +1060,14 @@ msgstr "Zvuk na @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel pre %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunel do %s/%s"
@ -1405,11 +1405,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Neplatný cieľ záznamu."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Vstavaný zvuk"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

3376
po/sl.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:55+0000\n"
"Last-Translator: Miloš Komarčević <kmilos@gmail.com>\n"
"Language-Team: Serbian (sr) <fedora-trans-sr@redhat.com>\n"
@ -1181,8 +1181,8 @@ msgstr ""
"ladspa додатка> label=<ознака ladspa додатка> control=<списак улазних "
"контролних вредности раздвојених зарезом>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1245,14 +1245,14 @@ msgstr "Аудио на @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1603,11 +1603,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] Неисправан циљни дневник „%s“."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Унутрашњи звук"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Модем"

View file

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:55+0000\n"
"Last-Translator: Miloš Komarčević <kmilos@gmail.com>\n"
"Language-Team: Serbian (sr) <fedora-trans-sr@redhat.com>\n"
@ -1182,8 +1182,8 @@ msgstr ""
"ladspa dodatka> label=<oznaka ladspa dodatka> control=<spisak ulaznih "
"kontrolnih vrednosti razdvojenih zarezom>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1246,14 +1246,14 @@ msgstr "Audio na @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1604,11 +1604,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] Neispravan ciljni dnevnik „%s“."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Unutrašnji zvuk"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

View file

@ -19,7 +19,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-05-18 22:27+0000\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <https://translate.fedoraproject.org/projects/"
@ -1140,8 +1140,8 @@ msgstr ""
"channel_map=<kanalmappning> autoloaded=<om denna modul läses in automatiskt> "
"use_volume_sharing=<ja eller nej> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT-baserad equalizer på %s"
@ -1208,14 +1208,14 @@ msgstr "Ljud på @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel för %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel till %s/%s"
@ -1563,11 +1563,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Ogiltigt mål för logg."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Inbyggt ljud"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.ta\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:56+0000\n"
"Last-Translator: I. Felix <ifelix@redhat.com>\n"
"Language-Team: Tamil <fedora-trans-ta@redhat.com>\n"
@ -1173,8 +1173,8 @@ msgstr ""
"plugin name> label=<ladspa plugin label> control=<comma separated list of "
"input control values>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1237,14 +1237,14 @@ msgstr "@HOSTNAME@இல் ஆடியோ"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1595,11 +1595,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] தவறான பதிவு இலக்கு '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "உட்புற ஆடியோ"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "மாதிரி"

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx.te\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2012-01-30 09:56+0000\n"
"Last-Translator: Krishna Babu K <kkrothap@redhat.com>\n"
"Language-Team: Telugu <en@li.org>\n"
@ -1143,8 +1143,8 @@ msgstr ""
"channel_map=<చానల్ మాప్> plugin=<ladspa ప్లగిన్ నామము> label=<ladspa ప్లగిన్ లేబుల్> "
"control=<ఇన్పుట్ నియంత్రణ విలువలయొక్క జాబితా>"
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr ""
@ -1206,14 +1206,14 @@ msgstr "@HOSTNAME@ పై ఆడియో"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr ""
@ -1563,11 +1563,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "[%s:%u] చెల్లని లాగ్ లక్ష్యము '%s'."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "అంతర్గత ఆడియో"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "మోడెమ్"

View file

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: PulseAudio master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2022-05-18 22:27+0000\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2024-08-01 04:41+0000\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
"Language-Team: Turkish <https://translate.fedoraproject.org/projects/"
"pulseaudio/pulseaudio/tr/>\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.12.2\n"
"X-Generator: Weblate 5.6.2\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -105,17 +105,17 @@ msgstr ""
"yöntemlerini döker\n"
" --cleanup-shm Eski paylaşımlı bellek segmentlerini "
"temizler\n"
" --start Eğer çalışmıyorsa arka plan "
"programını başlatır\n"
" -k --kill Çalışan bir arka plan progamını "
" --start Eğer çalışmıyorsa art alan hizmetini "
"başlatır\n"
" -k --kill Çalışan bir art alan hizmetini "
"sonlandırır\n"
" --check Çalışan bir arka plan programını "
" --check Çalışan bir art alan hizmetini "
"denetler (sadece çıkış kodu döner)\n"
"\n"
"SEÇENEKLER:\n"
" --system[=BOOL] Sistem çapında örnek olarak "
"çalıştırır\n"
" -D, --daemonize[=BOOL] Başladıktan sonra arka plan programı "
" -D, --daemonize[=BOOL] Başladıktan sonra art alan hizmeti "
"olarak çalıştırır\n"
" --fail[=BOOL] Başlangıç başarısız olduğunda çıkar\n"
" --high-priority[=BOOL] Yüksek öncelik seviyesi ayarlamayı "
@ -136,7 +136,7 @@ msgstr ""
" --disallow-exit[=BOOL] Kullanıcının çıkış isteğine izin "
"vermez\n"
" --exit-idle-time=SANİYE Boştayken ve bu süre geçtiğinde\n"
" arka plan programını sonlandırır\n"
" art alan hizmetini sonlandırır\n"
" --scache-idle-time=SANİYE Boştayken ve bu süre geçtiğinde "
"otomatik\n"
" yüklenmiş örnekleri kaldırır\n"
@ -459,7 +459,7 @@ msgstr ""
#: src/daemon/main.c:788
#, c-format
msgid "Failed to kill daemon: %s"
msgstr "Arka plan programı durdurulamadı: %s"
msgstr "Art alan hizmeti durdurulamadı: %s"
#: src/daemon/main.c:817
msgid ""
@ -532,7 +532,7 @@ msgstr "read() başarısız oldu: %s"
#: src/daemon/main.c:954
msgid "Daemon startup failed."
msgstr "Arka plan programını başlatma başarısız oldu."
msgstr "Art alan hizmetini başlatma başarısız oldu."
#: src/daemon/main.c:987
#, c-format
@ -575,12 +575,14 @@ msgid ""
"Failed to initialize daemon due to errors while executing startup commands. "
"Source of commands: %s"
msgstr ""
"Başlatma komutlarını çalıştırırken oluşan hatalar nedeniyle arka plan "
"programı başlatılamadı. Komutların kaynağı: %s"
"Başlatma komutlarını çalıştırırken oluşan hatalar nedeniyle art alan hizmeti "
"başlatılamadı. Komutların kaynağı: %s"
#: src/daemon/main.c:1280
msgid "Daemon startup without any loaded modules, refusing to work."
msgstr "Hiç yüklü modül olmadan arka plan programının çalışması reddediliyor."
msgstr ""
"Hiç modül yüklenmeden çalışmaya başlamayan art alan hizmeti, çalışmayı "
"reddediyor."
#: src/daemon/pulseaudio.desktop.in:4
msgid "PulseAudio Sound System"
@ -1131,8 +1133,8 @@ msgstr ""
"otomatikyüklenmiş=<set if this module is being loaded automatically> "
"ses_paylaşım_kullan=<yes or no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "%s üzerinde FFT tabanlı dengeleyici"
@ -1199,14 +1201,14 @@ msgstr "@HOSTNAME@ üzerindeki SES"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "%s@%s için tünel"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "%s/%s tünel"
@ -1556,11 +1558,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Geçersiz günlük hedefi."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Dahili Ses"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Modem"
@ -1704,7 +1706,7 @@ msgstr "Akış boşaltma başarısız oldu: %s"
#: src/utils/pacat.c:139
msgid "Playback stream drained."
msgstr "Playback akışı boşaltıldı."
msgstr "Oynatım akışı boşaltıldı."
#: src/utils/pacat.c:150
msgid "Draining connection to server."
@ -1967,8 +1969,8 @@ msgstr ""
" --format=ÖRNEKLEMEBİÇİMİ Örnekleme biçimi, olası değerler için\n"
" https://www.freedesktop.org/wiki/"
"Software/PulseAudio/Documentation/User/SupportedAudioFormats/\n"
" adresine bakın (öntanımlı değer: s16ne)"
"\n"
" adresine bakın (öntanımlı değer: "
"s16ne)\n"
" --channels=KANALLAR Kanal sayısı, mono için 1, stereo için "
"2\n"
" (öntanımlı değer: 2)\n"
@ -1981,8 +1983,8 @@ msgstr ""
" --fix-channels Kanal eşlemesini ve kanal sayısını "
"akışın bağlı olduğu\n"
" alıcı/kaynaktan alır.\n"
" --no-remix Kanalları indirgemez ya da çoğaltamaz."
"\n"
" --no-remix Kanalları indirgemez ya da "
"çoğaltamaz.\n"
" --no-remap Ad yerine dizin ile kanalları eşler.\n"
" --latency=BAYT Bayt cinsinden belirtilen gecikmeyi "
"ister.\n"
@ -2298,7 +2300,7 @@ msgstr ""
#: src/utils/pacmd.c:143
msgid "No PulseAudio daemon running, or not running as session daemon."
msgstr ""
"Çalışan PulseAudio arka plan programı yok veya bir oturum arka plan progamı "
"Çalışan PulseAudio art alan hizmeti yok veya bir oturum art alan hizmeti "
"olarak çalışmıyor."
#: src/utils/pacmd.c:148
@ -2313,11 +2315,11 @@ msgstr "connect(): %s"
#: src/utils/pacmd.c:173
msgid "Failed to kill PulseAudio daemon."
msgstr "PulseAudio arka plan programı durdurulamadı."
msgstr "PulseAudio art alan hizmeti durdurulamadı."
#: src/utils/pacmd.c:181
msgid "Daemon not responding."
msgstr "Arka plan programı yanıt vermiyor."
msgstr "Art alan hizmeti yanıt vermiyor."
#: src/utils/pacmd.c:213 src/utils/pacmd.c:322 src/utils/pacmd.c:340
#, c-format
@ -3330,12 +3332,11 @@ msgid ""
msgstr ""
"%s [-D ekran] [-S sunucu] [-O alıcı] [-I kaynak] [-c dosya] [-d|-e|-i|-r]\n"
"\n"
" -d X11 ekranına bağlı geçerli PulseAudio verilerini gösterir "
"(öntanımlı)\n"
" -e X11 ekranına bağlı yerel PulseAudio verilerini dışa aktarır\n"
" -d X11 ekranına bağlı geçerli PulseAudio verilerini göster (öntanımlı)\n"
" -e X11 ekranına bağlı yerel PulseAudio verilerini dışa aktar\n"
" -i X11 ekranından PulseAudio verilerini yerel çevresel değişkenlere ve "
"çerez dosyalarına aktarır.\n"
" -r X11 ekranından PulseAudio verilerini kaldırır\n"
"çerez dosyalarına aktar\n"
" -r X11 ekranından PulseAudio verilerini kaldır\n"
#: src/utils/pax11publish.c:91
#, c-format

View file

@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2022-05-18 22:27+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <https://translate.fedoraproject.org/projects/"
@ -1174,8 +1174,8 @@ msgstr ""
"channel_map=<карта каналів> autoloaded=<визначити, чи слід завантажувати цей "
"модуль у автоматичному режимі> use_volume_sharing=<yes або no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "Еквалайзер на основі ШПФ на %s"
@ -1242,14 +1242,14 @@ msgstr "Звук на @НАЗВАВУЗЛА@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Тунель для %s@%s"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Тунель до %s/%s"
@ -1601,11 +1601,11 @@ msgstr ""
msgid "Invalid log target."
msgstr "Некоректна адреса файла журналу."
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "Вбудоване аудіо"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "Модем"

View file

@ -12,9 +12,9 @@ msgstr ""
"Project-Id-Version: pulseaudio.master-tx\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2021-12-04 09:16+0000\n"
"Last-Translator: Lv Genggeng <lvgenggeng@uniontech.com>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2023-12-22 16:37+0000\n"
"Last-Translator: Charles Lee <lchopn@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.fedoraproject.org/"
"projects/pulseaudio/pulseaudio/zh_CN/>\n"
"Language: zh_CN\n"
@ -22,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.9.1\n"
"X-Generator: Weblate 5.3\n"
"X-Launchpad-Export-Date: 2016-03-22 13:23+0000\n"
#: src/daemon/cmdline.c:113
@ -1083,8 +1083,8 @@ msgstr ""
"format=<采样格式> rate=<采样率> channels=<声道数> channel_map=<声道映射> "
"autoloaded=<若为自动加载则会设置> use_volume_sharing=<yes 或 no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "基于快速傅里叶变换的均衡器%s"
@ -1147,14 +1147,14 @@ msgstr "@HOSTNAME@ 中的音频"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "%s@%s 的通道"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "到远程信宿 %s/%s 的通道"
@ -1498,11 +1498,11 @@ msgstr "尝试打开目标文件 '%s''%s.1''%s.2'…'%s.%d',但均失败
msgid "Invalid log target."
msgstr "无效的日志目标。"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "内置音频"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "调制解调器"
@ -1816,7 +1816,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
msgstr "pa_stream_update_timing_info() 失败:%s"
#: src/utils/pacat.c:676
#, fuzzy, c-format
#, c-format
msgid ""
"%s [options]\n"
"%s\n"
@ -1885,6 +1885,7 @@ msgid ""
msgstr ""
"%s [选项]\n"
"%s\n"
"\n"
" -h, --help 显示此帮助\n"
" --version 显示版本\n"
"\n"
@ -1897,21 +1898,21 @@ msgstr ""
" -d, --device=设备名 要连接的信宿/信源名称\n"
" -n, --client-name=名称 如何在服务器中调用此客户端\n"
" --stream-name=名称 如何在服务器中调用这个流\n"
" --volume=音量 指定初始线性音量取值在0...65536之"
"间\n"
" --volume=音量 指定初始线性音量取值在0..."
"65536之间\n"
" --rate=SAMPLERATE 采样频率(单位 Hz默认为44100\n"
" --format=SAMPLEFORMAT 采样类型s16le、s16be、u8、float32le "
"一\n"
" float32be、ulaw、alaw、s32le、s32be 中取"
"(默认为 s16ne\n"
" --format=SAMPLEFORMAT 采样类型s16le、s16be、u8、float32le "
"一\n"
" float32be、ulaw、alaw、s32le、s32be "
"中取(默认为 s16ne\n"
" --channels=CHANNELS 通道数1为单声道2为立体声默认为2\n"
" --channel-map=CHANNELMAP 取代默认值的通道映射表\n"
" --fix-format 从流连接的信宿中提取采样格式。\n"
" --fix-rate 从流连接的信宿中提取采样率。\n"
" --fix-channels 从流连接的信宿中提取通道数和通道映射"
"表。\n"
" --no-remix 不要对通道进行 upmix 或者 downmix 操"
"作。\n"
" --fix-channels 从流连接的信宿中提取通道数和通道映射表。"
"\n"
" --no-remix 不要对通道进行 upmix 或者 downmix 操作。"
"\n"
" --no-remap 根据下标而非名称来映射通道。\n"
" --latency=BYTES 请求指定字节数的延迟。\n"
" --process-time=BYTES 每次请求指定字节数的处理时间。\n"

View file

@ -9,16 +9,17 @@ msgstr ""
"Project-Id-Version: PulseAudio Volume Control\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/"
"issues/new\n"
"POT-Creation-Date: 2022-05-16 23:56+0300\n"
"PO-Revision-Date: 2020-01-11 13:49+0800\n"
"Last-Translator: pan93412 <pan93412@gmail.com>\n"
"Language-Team: Chinese <zh-l10n@lists.linux.org.tw>\n"
"POT-Creation-Date: 2022-06-18 09:49+0300\n"
"PO-Revision-Date: 2025-04-09 01:53+0000\n"
"Last-Translator: hsu zangmen <chzang55@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://translate.fedoraproject.org/"
"projects/pulseaudio/pulseaudio/zh_TW/>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 19.12.0\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.10.4\n"
#: src/daemon/cmdline.c:113
#, c-format
@ -1083,8 +1084,8 @@ msgstr ""
"sink> format=<取樣格式> rate=<取樣率> channels=<聲道數> channel_map=<聲道對應"
"表> autoloaded=<設定此模組是否正被自動載入> use_volume_sharing=<yes 或 no> "
#: src/modules/module-equalizer-sink.c:1094
#: src/modules/module-equalizer-sink.c:1217
#: src/modules/module-equalizer-sink.c:1097
#: src/modules/module-equalizer-sink.c:1220
#, c-format
msgid "FFT based equalizer on %s"
msgstr "FFT 基礎等化器於 %s"
@ -1148,14 +1149,14 @@ msgstr "音效位於 @HOSTNAME@"
#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis@lazus'
#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis@lazus'
#: src/modules/module-tunnel-sink-new.c:356
#: src/modules/module-tunnel-source-new.c:342
#: src/modules/module-tunnel-sink-new.c:370
#: src/modules/module-tunnel-source-new.c:354
#, c-format
msgid "Tunnel for %s@%s"
msgstr "%s@%s 的穿隧道"
#: src/modules/module-tunnel-sink-new.c:697
#: src/modules/module-tunnel-source-new.c:668
#: src/modules/module-tunnel-sink-new.c:715
#: src/modules/module-tunnel-source-new.c:684
#, c-format
msgid "Tunnel to %s/%s"
msgstr "前往 %s/%s 的穿隧道"
@ -1501,11 +1502,11 @@ msgstr "試圖開啟目標檔「%s」、「%s.1」、「%s.2」...「%s.%d」
msgid "Invalid log target."
msgstr "無效的紀錄目標。"
#: src/pulsecore/sink.c:3600
#: src/pulsecore/sink.c:3609
msgid "Built-in Audio"
msgstr "內部音效"
#: src/pulsecore/sink.c:3605
#: src/pulsecore/sink.c:3614
msgid "Modem"
msgstr "數據機"
@ -2751,11 +2752,11 @@ msgstr ""
#: src/utils/pactl.c:1711 src/utils/pactl.c:1760
msgid "list-handlers message response could not be parsed correctly"
msgstr ""
msgstr "無法正確解析 list-handlers 訊息回應"
#: src/utils/pactl.c:1718
msgid "list-handlers message response is not a JSON array"
msgstr ""
msgstr "list-handlers 訊息回應內容不是 JSON 陣列"
#: src/utils/pactl.c:1729
#, c-format

View file

@ -17,7 +17,14 @@ print_map_file() {
echo "};"
}
TARGET_FILE=$1
shift
print_def_file() {
echo "EXPORTS"
ctags -I ${CTAGS_IDENTIFIER_LIST} -f - --c-kinds=p "$@" | awk '/^pa_/ && !/(^pa_glib_|^pa_simple_)/ { print $1 }' | sort
}
cd "${MESON_SOURCE_ROOT}/${MESON_SUBDIR}" && print_map_file "$@" > ${TARGET_FILE}
MAP_FILE=$1
DEF_FILE=$2
shift 2
cd "${MESON_SOURCE_ROOT}/${MESON_SUBDIR}" && print_map_file "$@" > ${MAP_FILE}
cd "${MESON_SOURCE_ROOT}/${MESON_SUBDIR}" && print_def_file "$@" > ${DEF_FILE}

View file

@ -116,12 +116,13 @@ _pactl() {
modules samples clients message-handlers'
local commands=(stat info list exit upload-sample play-sample remove-sample
load-module unload-module move-sink-input move-source-output
suspend-sink suspend-source set-card-profile set-default-sink
set-sink-port set-default-source set-source-port set-sink-volume
suspend-sink suspend-source set-card-profile get-default-sink
set-default-sink set-sink-port get-default-source set-default-source
set-source-port get-sink-volume set-sink-volume get-source-volume
set-source-volume set-sink-input-volume set-source-output-volume
set-sink-mute set-source-mute set-sink-input-mute
set-source-output-mute set-sink-formats set-port-latency-offset
subscribe send-message help)
get-sink-mute set-sink-mute get-source-mute set-source-mute
set-sink-input-mute set-source-output-mute set-sink-formats
set-port-latency-offset subscribe send-message help)
_init_completion -n = || return
preprev=${words[$cword-2]}
@ -186,6 +187,8 @@ _pactl() {
remove-sample) ;; # TODO
get-default*) ;;
load-module)
comps=$(__all_modules)
COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
@ -500,7 +503,7 @@ _pulseaudio()
--start -k --kill --check --system= -D --daemonize= --fail= --high-priority=
--realtime= --disallow-module-loading= --disallow-exit= --exit-idle-time=
--scache-idle-time= --log-level= -v --log-target= --log-meta= --log-time=
--log-backtrace= -p --dl-search-path= --resample-method= --use-pit-file=
--log-backtrace= -p --dl-search-path= --resample-method= --use-pid-file=
--no-cpu-limit= --disable-shm= --enable-memfd= -L --load= -F --file= -C -n'
_init_completion -n = || return

View file

@ -18,10 +18,12 @@ _devices() {
if [[ $service == pactl || $service == pacmd ]]; then
case $words[$((CURRENT - 1))] in
set-sink-input-*) cmd=('sink-inputs');;
get-sink-*) cmd=('sinks');;
set-sink-*) cmd=('sinks');;
set-default-sink) cmd=('sinks');;
set-default-source) cmd=('sources');;
set-source-output-*) cmd=('source-outputs');;
get-source-*) cmd=('sources');;
set-source-*) cmd=('sources');;
suspend-sink) cmd=('sinks');;
suspend-source) cmd=('sources');;
@ -257,16 +259,22 @@ _pactl_completion() {
'suspend-sink: suspend or resume a sink'
'suspend-source: suspend or resume a source'
'set-card-profile: set a card profile'
'get-default-sink: get the default sink'
'set-default-sink: set the default sink'
'get-default-source: get the default source'
'set-default-source: set the default source'
'set-sink-port: set the sink port of a sink'
'set-source-port: set the source port of a source'
'set-port-latency-offset: set a latency offset on a port'
'get-sink-volume: get the volume of a sink'
'set-sink-volume: set the volume of a sink'
'get-source-volume: get the volume of a source'
'set-source-volume: set the volume of a source'
'set-sink-input-volume: set the volume of a stream'
'set-source-output-volume: set the volume of a recording stream'
'get-sink-mute: get the mute status of a sink'
'set-sink-mute: mute a sink'
'get-source-mute: get the mute status of a source'
'set-source-mute: mute a source'
'set-sink-input-mute: mute a stream'
'set-source-output-mute: mute a recording stream'
@ -492,11 +500,15 @@ _pactl_completion() {
set-default-source) if ((CURRENT == 2)); then _devices; fi;;
set-sink-port) _set_sink_port_parameter;;
set-source-port) _set_source_port_parameter;;
get-sink-volume) if ((CURRENT == 2)); then _devices; fi;;
set-sink-volume) if ((CURRENT == 2)); then _devices; fi;;
get-source-volume) if ((CURRENT == 2)); then _devices; fi;;
set-source-volume) if ((CURRENT == 2)); then _devices; fi;;
set-sink-input-volume) if ((CURRENT == 2)); then _devices; fi;;
set-source-output-volume) if ((CURRENT == 2)); then _devices; fi;;
get-sink-mute) if ((CURRENT == 2)); then _devices; fi;;
set-sink-mute) _set_sink_mute_parameter;;
get-source-mute) if ((CURRENT == 2)); then _devices; fi;;
set-source-mute) _set_source_mute_parameter;;
set-sink-input-mute) _set_sink_input_mute_parameter;;
set-source-output-mute) _set_source_output_mute_parameter;;

View file

@ -141,7 +141,7 @@ custom_target('system.pa',
if dbus_dep.found()
install_data('pulseaudio-system.conf',
install_dir : join_paths(sysconfdir, 'dbus-1', 'system.d')
install_dir : join_paths(datadir, 'dbus-1', 'system.d')
)
endif

View file

@ -182,9 +182,14 @@ if host_machine.system() == 'windows'
else
libpulsecommon_sources += [
'pulsecore/mutex-posix.c',
'pulsecore/semaphore-posix.c',
'pulsecore/thread-posix.c'
'pulsecore/poll-posix.c',
'pulsecore/thread-posix.c',
]
if host_machine.system() == 'darwin'
libpulsecommon_sources += ['pulsecore/semaphore-osx.c']
else
libpulsecommon_sources += ['pulsecore/semaphore-posix.c']
endif
endif
# FIXME: Do SIMD things
@ -205,7 +210,7 @@ else
libm_dep, thread_dep, dl_dep, shm_dep, iconv_dep, sndfile_dep, dbus_dep,
x11_dep, libsystemd_dep, glib_dep.partial_dependency(compile_args: true),
gtk_dep.partial_dependency(compile_args: true), asyncns_dep, libintl_dep,
platform_dep, platform_socket_dep, execinfo_dep,
platform_dep, platform_socket_dep, execinfo_dep, libatomic_ops_dep,
],
implicit_include_directories : false)

View file

@ -175,6 +175,9 @@ ATTRS{idVendor}=="1395", ATTRS{idProduct}=="0300", ENV{PULSE_PROFILE_SET}="usb-g
# Sennheiser GSP 670 USB headset
ATTRS{idVendor}=="1395", ATTRS{idProduct}=="008a", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf"
# Asus Xonar SE
ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="189d", ENV{PULSE_PROFILE_SET}="asus-xonar-se.conf"
GOTO="pulseaudio_end"
LABEL="pulseaudio_check_pci"

View file

@ -2838,7 +2838,7 @@ static int path_verify(pa_alsa_path *p) {
if (p->device_port_type == PA_DEVICE_PORT_TYPE_UNKNOWN)
p->device_port_type = map->type;
if (!p->description)
p->description = pa_xstrdup(map->description);
p->description = pa_xstrdup(_(map->description));
}
if (!p->description) {
@ -2851,41 +2851,44 @@ static int path_verify(pa_alsa_path *p) {
return 0;
}
static char *get_path_config_path(const char *paths_dir, const char *fname) {
char *path_config_path;
static char *get_data_path(const char *data_dir, const char *data_type, const char *fname) {
char *result;
char *dir;
char *data_home;
pa_dynarray *data_dirs;
if (paths_dir) {
path_config_path = pa_maybe_prefix_path(fname, paths_dir);
if (access(path_config_path, R_OK) == 0)
return path_config_path;
if (data_dir) {
result = pa_maybe_prefix_path(fname, data_dir);
if (access(result, R_OK) == 0)
return result;
else
pa_xfree(path_config_path);
pa_xfree(result);
}
#ifdef HAVE_RUNNING_FROM_BUILD_TREE
if (pa_run_from_build_tree()) {
path_config_path = pa_maybe_prefix_path(fname, PA_SRCDIR "/modules/alsa/mixer/paths/");
if (access(path_config_path, R_OK) == 0)
return path_config_path;
dir = pa_sprintf_malloc(PA_SRCDIR "/modules/alsa/mixer/%s/", data_type);
result = pa_maybe_prefix_path(fname, dir);
pa_xfree(dir);
if (access(result, R_OK) == 0)
return result;
else
pa_xfree(path_config_path);
pa_xfree(result);
}
#endif
if (pa_get_data_home_dir(&data_home) == 0) {
dir = pa_sprintf_malloc("%s" PA_PATH_SEP "alsa-mixer" PA_PATH_SEP "paths", data_home);
dir = pa_sprintf_malloc("%s" PA_PATH_SEP "alsa-mixer" PA_PATH_SEP "%s", data_home, data_type);
pa_xfree(data_home);
path_config_path = pa_maybe_prefix_path(fname, dir);
result = pa_maybe_prefix_path(fname, dir);
pa_xfree(dir);
if (access(path_config_path, R_OK) == 0)
return path_config_path;
if (access(result, R_OK) == 0)
return result;
else
pa_xfree(path_config_path);
pa_xfree(result);
}
if (pa_get_data_dirs(&data_dirs) == 0) {
@ -2893,24 +2896,27 @@ static char *get_path_config_path(const char *paths_dir, const char *fname) {
const char *n;
PA_DYNARRAY_FOREACH(n, data_dirs, idx) {
dir = pa_sprintf_malloc("%s" PA_PATH_SEP "alsa-mixer" PA_PATH_SEP "paths", n);
path_config_path = pa_maybe_prefix_path(fname, dir);
dir = pa_sprintf_malloc("%s" PA_PATH_SEP "alsa-mixer" PA_PATH_SEP "%s", n, data_type);
result = pa_maybe_prefix_path(fname, dir);
pa_xfree(dir);
if (access(path_config_path, R_OK) == 0) {
if (access(result, R_OK) == 0) {
pa_dynarray_free(data_dirs);
return path_config_path;
return result;
}
else {
pa_xfree(path_config_path);
pa_xfree(result);
}
}
pa_dynarray_free(data_dirs);
}
path_config_path = pa_maybe_prefix_path(fname, PA_ALSA_PATHS_DIR);
return path_config_path;
dir = pa_sprintf_malloc(PA_ALSA_DATA_DIR PA_PATH_SEP "%s", data_type);
result = pa_maybe_prefix_path(fname, dir);
pa_xfree(dir);
return result;
}
pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa_direction_t direction) {
@ -2977,7 +2983,7 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa
items[2].data = &p->description;
items[3].data = &mute_during_activation;
fn = get_path_config_path(paths_dir, fname);
fn = get_data_path(paths_dir, "paths", fname);
pa_log_info("Loading path config: %s", fn);
@ -4971,11 +4977,9 @@ pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel
if (!fname)
fname = "default.conf";
fn = pa_maybe_prefix_path(fname,
#ifdef HAVE_RUNNING_FROM_BUILD_TREE
pa_run_from_build_tree() ? PA_SRCDIR "/modules/alsa/mixer/profile-sets/" :
#endif
PA_ALSA_PROFILE_SETS_DIR);
fn = get_data_path(NULL, "profile-sets", fname);
pa_log_info("Loading profile set: %s", fn);
r = pa_config_parse(fn, NULL, items, NULL, false, ps);
pa_xfree(fn);
@ -5074,7 +5078,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,

View file

@ -318,7 +318,7 @@ struct pa_alsa_mapping {
pa_sink *sink;
pa_source *source;
/* ucm device context*/
/* ucm device context */
pa_alsa_ucm_mapping_context ucm_context;
};
@ -342,6 +342,9 @@ struct pa_alsa_profile {
pa_idxset *input_mappings;
pa_idxset *output_mappings;
/* ucm device context */
pa_alsa_ucm_profile_context ucm_context;
};
struct pa_alsa_decibel_fix {

View file

@ -1721,7 +1721,7 @@ static int sink_set_port_ucm_cb(pa_sink *s, pa_device_port *p) {
else
sync_mixer(u, p);
return pa_alsa_ucm_set_port(u->ucm_context, p, true);
return pa_alsa_ucm_set_port(u->ucm_context, p);
}
static int sink_set_port_cb(pa_sink *s, pa_device_port *p) {
@ -2239,7 +2239,7 @@ static int setup_mixer(struct userdata *u, bool ignore_dB) {
* will be NULL, but the UCM device enable sequence will still need to be
* executed. */
if (u->sink->active_port && u->ucm_context) {
if (pa_alsa_ucm_set_port(u->ucm_context, u->sink->active_port, true) < 0)
if (pa_alsa_ucm_set_port(u->ucm_context, u->sink->active_port) < 0)
return -1;
}
@ -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;

View file

@ -1595,7 +1595,7 @@ static int source_set_port_ucm_cb(pa_source *s, pa_device_port *p) {
else
sync_mixer(u, p);
return pa_alsa_ucm_set_port(u->ucm_context, p, false);
return pa_alsa_ucm_set_port(u->ucm_context, p);
}
static int source_set_port_cb(pa_source *s, pa_device_port *p) {
@ -1943,7 +1943,7 @@ static int setup_mixer(struct userdata *u, bool ignore_dB) {
* will be NULL, but the UCM device enable sequence will still need to be
* executed. */
if (u->source->active_port && u->ucm_context) {
if (pa_alsa_ucm_set_port(u->ucm_context, u->source->active_port, false) < 0)
if (pa_alsa_ucm_set_port(u->ucm_context, u->source->active_port) < 0)
return -1;
}
@ -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;

File diff suppressed because it is too large Load diff

View file

@ -140,12 +140,13 @@ typedef struct pa_alsa_ucm_modifier pa_alsa_ucm_modifier;
typedef struct pa_alsa_ucm_device pa_alsa_ucm_device;
typedef struct pa_alsa_ucm_config pa_alsa_ucm_config;
typedef struct pa_alsa_ucm_mapping_context pa_alsa_ucm_mapping_context;
typedef struct pa_alsa_ucm_profile_context pa_alsa_ucm_profile_context;
typedef struct pa_alsa_ucm_port_data pa_alsa_ucm_port_data;
typedef struct pa_alsa_ucm_volume pa_alsa_ucm_volume;
int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index);
pa_alsa_profile_set* pa_alsa_ucm_add_profile_set(pa_alsa_ucm_config *ucm, pa_channel_map *default_channel_map);
int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, const char *new_profile, const char *old_profile);
int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, pa_alsa_profile *new_profile, pa_alsa_profile *old_profile);
int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, const char *verb_desc, pa_alsa_ucm_verb **p_verb);
@ -157,14 +158,14 @@ void pa_alsa_ucm_add_ports(
pa_card *card,
snd_pcm_t *pcm_handle,
bool ignore_dB);
void pa_alsa_ucm_add_ports_combination(
void pa_alsa_ucm_add_port(
pa_hashmap *hash,
pa_alsa_ucm_mapping_context *context,
bool is_sink,
pa_hashmap *ports,
pa_card_profile *cp,
pa_core *core);
int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink);
int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port);
void pa_alsa_ucm_free(pa_alsa_ucm_config *ucm);
void pa_alsa_ucm_mapping_context_free(pa_alsa_ucm_mapping_context *context);
@ -221,11 +222,8 @@ struct pa_alsa_ucm_modifier {
pa_proplist *proplist;
int n_confdev;
int n_suppdev;
const char **conflicting_devices;
const char **supported_devices;
pa_idxset *conflicting_devices;
pa_idxset *supported_devices;
pa_direction_t action_direction;
@ -264,21 +262,23 @@ struct pa_alsa_ucm_mapping_context {
pa_alsa_ucm_config *ucm;
pa_direction_t direction;
pa_idxset *ucm_devices;
pa_idxset *ucm_modifiers;
pa_alsa_ucm_device *ucm_device;
pa_alsa_ucm_modifier *ucm_modifier;
};
struct pa_alsa_ucm_profile_context {
pa_alsa_ucm_verb *verb;
};
struct pa_alsa_ucm_port_data {
pa_alsa_ucm_config *ucm;
pa_device_port *core_port;
/* A single port will be associated with multiple devices if it represents
* a combination of devices. */
pa_dynarray *devices; /* pa_alsa_ucm_device */
pa_alsa_ucm_device *device;
/* profile name -> pa_alsa_path for volume control */
/* verb name -> pa_alsa_path for volume control */
pa_hashmap *paths;
/* Current path, set when activating profile */
/* Current path, set when activating verb */
pa_alsa_path *path;
/* ELD info */

View file

@ -40,6 +40,7 @@
#include <pulsecore/thread.h>
#include <pulsecore/conf-parser.h>
#include <pulsecore/core-rtclock.h>
#include <pulsecore/strbuf.h>
#include "alsa-util.h"
#include "alsa-mixer.h"
@ -522,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) {
@ -560,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) {
@ -587,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) {
@ -611,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);
@ -631,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;
@ -660,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)
@ -683,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;
@ -710,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,
@ -783,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;
@ -804,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);
@ -1406,13 +1431,31 @@ char *pa_alsa_get_reserve_name(const char *device) {
return pa_sprintf_malloc("Audio%i", i);
}
static void dump_supported_rates(unsigned int* values)
{
pa_strbuf *buf;
char *str;
int i;
buf = pa_strbuf_new();
for (i = 0; values[i]; i++) {
pa_strbuf_printf(buf, " %u", values[i]);
}
str = pa_strbuf_to_string_free(buf);
pa_log_debug("Supported rates:%s", str);
pa_xfree(str);
}
unsigned int *pa_alsa_get_supported_rates(snd_pcm_t *pcm, unsigned int fallback_rate) {
static unsigned int all_rates[] = { 8000, 11025, 12000,
16000, 22050, 24000,
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;
@ -1454,39 +1497,40 @@ unsigned int *pa_alsa_get_supported_rates(snd_pcm_t *pcm, unsigned int fallback_
rates[1] = 0;
}
dump_supported_rates(rates);
return rates;
}
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,
@ -1504,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++;
}
@ -1515,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;
@ -1523,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;
@ -1614,14 +1658,16 @@ static snd_mixer_elem_t *pa_alsa_mixer_find(snd_mixer_t *mixer,
snd_ctl_elem_iface_t iface,
const char *name,
unsigned int index,
unsigned int device) {
unsigned int device,
unsigned int subdevice) {
snd_mixer_elem_t *elem;
for (elem = snd_mixer_first_elem(mixer); elem; elem = snd_mixer_elem_next(elem)) {
snd_hctl_elem_t *helem;
snd_hctl_elem_t **_helem, *helem;
if (snd_mixer_elem_get_type(elem) != SND_MIXER_ELEM_PULSEAUDIO)
continue;
helem = snd_mixer_elem_get_private(elem);
_helem = snd_mixer_elem_get_private(elem);
helem = *_helem;
if (snd_hctl_elem_get_interface(helem) != iface)
continue;
if (!pa_streq(snd_hctl_elem_get_name(helem), name))
@ -1630,17 +1676,19 @@ static snd_mixer_elem_t *pa_alsa_mixer_find(snd_mixer_t *mixer,
continue;
if (snd_hctl_elem_get_device(helem) != device)
continue;
if (snd_hctl_elem_get_subdevice(helem) != subdevice)
continue;
return elem;
}
return NULL;
}
snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, struct pa_alsa_mixer_id *alsa_id, unsigned int device) {
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_CARD, alsa_id->name, alsa_id->index, device);
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_CARD, alsa_id->name, alsa_id->index, device, 0);
}
snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device) {
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_PCM, name, 0, device);
return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_PCM, name, 0, device, 0);
}
static int mixer_class_compare(const snd_mixer_elem_t *c1, const snd_mixer_elem_t *c2)
@ -1649,31 +1697,79 @@ static int mixer_class_compare(const snd_mixer_elem_t *c1, const snd_mixer_elem_
return c1 == c2 ? 0 : (c1 > c2 ? 1 : -1);
}
static void mixer_melem_free(snd_mixer_elem_t *elem)
{
snd_hctl_elem_t **_helem;
_helem = snd_mixer_elem_get_private(elem);
pa_xfree(_helem);
}
static int mixer_class_event(snd_mixer_class_t *class, unsigned int mask,
snd_hctl_elem_t *helem, snd_mixer_elem_t *melem)
{
int err;
const char *name = snd_hctl_elem_get_name(helem);
if (mask & SND_CTL_EVENT_MASK_ADD) {
snd_hctl_elem_t **_helem;
/* NOTE: The remove event is defined as '~0U`. */
if (mask == SND_CTL_EVENT_MASK_REMOVE) {
/* NOTE: Unless we remove the pointer to melem from the linked-list at
* private_data of helem, an assertion will be hit in alsa-lib since
* the list is not empty. */
_helem = snd_mixer_elem_get_private(melem);
*_helem = NULL;
snd_mixer_elem_detach(melem, helem);
} else if (mask & SND_CTL_EVENT_MASK_ADD) {
snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem);
if (iface == SND_CTL_ELEM_IFACE_CARD || iface == SND_CTL_ELEM_IFACE_PCM) {
snd_mixer_t *mixer = snd_mixer_class_get_mixer(class);
snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem);
const char *name = snd_hctl_elem_get_name(helem);
const int index = snd_hctl_elem_get_index(helem);
const int device = snd_hctl_elem_get_device(helem);
const int subdevice = snd_hctl_elem_get_subdevice(helem);
snd_mixer_elem_t *new_melem;
bool found = true;
/* Put the hctl pointer as our private data - it will be useful for callbacks */
if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, helem, NULL)) < 0) {
pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err));
return 0;
new_melem = pa_alsa_mixer_find(mixer, iface, name, index, device, subdevice);
if (!new_melem) {
_helem = pa_xmalloc(sizeof(snd_hctl_elem_t *));
*_helem = helem;
/* Put the hctl pointer as our private data - it will be useful for callbacks */
if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, _helem, mixer_melem_free)) < 0) {
pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err));
return 0;
}
found = false;
} else {
_helem = snd_mixer_elem_get_private(new_melem);
if (_helem) {
char *s1, *s2;
snd_ctl_elem_id_t *id1, *id2;
snd_ctl_elem_id_alloca(&id1);
snd_ctl_elem_id_alloca(&id2);
snd_hctl_elem_get_id(helem, id1);
snd_hctl_elem_get_id(*_helem, id2);
s1 = snd_ctl_ascii_elem_id_get(id1);
s2 = snd_ctl_ascii_elem_id_get(id2);
pa_log_warn("mixer_class_event - duplicate mixer controls: %s | %s", s1, s2);
free(s2);
free(s1);
return 0;
}
*_helem = helem;
}
if ((err = snd_mixer_elem_attach(new_melem, helem)) < 0) {
pa_log_warn("snd_mixer_elem_attach failed: %s", pa_alsa_strerror(err));
snd_mixer_elem_free(melem);
snd_mixer_elem_free(melem);
return 0;
}
if ((err = snd_mixer_elem_add(new_melem, class)) < 0) {
pa_log_warn("snd_mixer_elem_add failed: %s", pa_alsa_strerror(err));
return 0;
if (!found) {
if ((err = snd_mixer_elem_add(new_melem, class)) < 0) {
pa_log_warn("snd_mixer_elem_add failed: %s", pa_alsa_strerror(err));
return 0;
}
}
}
}

View file

@ -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);

View file

@ -0,0 +1,91 @@
# This file is part of PulseAudio.
#
# PulseAudio is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of the
# License, or (at your option) any later version.
#
# PulseAudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
; ASUS Xonar SE card.
; This card has two devices for each rear and front panel jacks.
;
; See default.conf for an explanation on the directives used here.
[General]
auto-profiles = yes
[Mapping analog-stereo-headset]
device-strings = hw:%f,1
channel-map = left,right
paths-output = analog-output analog-output-headphones
paths-input = analog-input-mic analog-input-headphone-mic analog-input-headset-mic
priority = 15
[Mapping analog-stereo]
device-strings = hw:%f,0
channel-map = left,right
paths-output = analog-output analog-output-speaker
paths-input = analog-input analog-input-mic analog-input-linein
priority = 14
[Mapping analog-surround-21]
device-strings = surround21:%f
channel-map = front-left,front-right,lfe
paths-output = analog-output-speaker
priority = 13
direction = output
[Mapping analog-surround-40]
device-strings = surround40:%f
channel-map = front-left,front-right,rear-left,rear-right
paths-output = analog-output-speaker
priority = 12
direction = output
[Mapping analog-surround-41]
device-strings = surround41:%f
channel-map = front-left,front-right,rear-left,rear-right,lfe
paths-output = analog-output-speaker
priority = 13
direction = output
[Mapping analog-surround-50]
device-strings = surround50:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center
paths-output = analog-output-speaker
priority = 12
direction = output
[Mapping analog-surround-51]
device-strings = surround51:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
paths-output = analog-output-speaker
priority = 13
direction = output
[Mapping iec958-stereo]
device-strings = iec958:%f
channel-map = left,right
paths-output = iec958-stereo-output
priority = 5
[Mapping iec958-ac3-surround-40]
device-strings = a52:%f
channel-map = front-left,front-right,rear-left,rear-right
paths-output = iec958-stereo-output
priority = 2
direction = output
[Mapping iec958-ac3-surround-51]
device-strings = a52:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
paths-output = iec958-stereo-output
priority = 3
direction = output

View file

@ -162,7 +162,7 @@ static void add_profiles(struct userdata *u, pa_hashmap *h, pa_hashmap *ports) {
PA_IDXSET_FOREACH(m, ap->output_mappings, idx) {
if (u->use_ucm)
pa_alsa_ucm_add_ports_combination(NULL, &m->ucm_context, true, ports, cp, u->core);
pa_alsa_ucm_add_port(NULL, &m->ucm_context, true, ports, cp, u->core);
else
pa_alsa_path_set_add_ports(m->output_path_set, cp, ports, NULL, u->core);
if (m->channel_map.channels > cp->max_sink_channels)
@ -175,7 +175,7 @@ static void add_profiles(struct userdata *u, pa_hashmap *h, pa_hashmap *ports) {
PA_IDXSET_FOREACH(m, ap->input_mappings, idx) {
if (u->use_ucm)
pa_alsa_ucm_add_ports_combination(NULL, &m->ucm_context, false, ports, cp, u->core);
pa_alsa_ucm_add_port(NULL, &m->ucm_context, false, ports, cp, u->core);
else
pa_alsa_path_set_add_ports(m->input_path_set, cp, ports, NULL, u->core);
if (m->channel_map.channels > cp->max_source_channels)
@ -249,8 +249,7 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
/* if UCM is available for this card then update the verb */
if (u->use_ucm) {
if (pa_alsa_ucm_set_profile(&u->ucm, c, nd->profile ? nd->profile->name : NULL,
od->profile ? od->profile->name : NULL) < 0) {
if (pa_alsa_ucm_set_profile(&u->ucm, c, nd->profile, od->profile) < 0) {
ret = -1;
goto finish;
}
@ -302,7 +301,7 @@ static void init_profile(struct userdata *u) {
if (d->profile && u->use_ucm) {
/* Set initial verb */
if (pa_alsa_ucm_set_profile(ucm, u->card, d->profile->name, NULL) < 0) {
if (pa_alsa_ucm_set_profile(ucm, u->card, d->profile, NULL) < 0) {
pa_log("Failed to set ucm profile %s", d->profile->name);
return;
}
@ -371,7 +370,7 @@ struct temp_port_avail {
static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
struct userdata *u = snd_mixer_elem_get_callback_private(melem);
snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem);
snd_hctl_elem_t **_elem = snd_mixer_elem_get_private(melem), *elem;
snd_ctl_elem_value_t *elem_value;
bool plugged_in;
void *state;
@ -381,6 +380,8 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
pa_available_t active_available = PA_AVAILABLE_UNKNOWN;
pa_assert(u);
pa_assert(_elem);
elem = *_elem;
/* Changing the jack state may cause a port change, and a port change will
* make the sink or source change the mixer settings. If there are multiple
@ -563,13 +564,18 @@ static pa_device_port* find_port_with_eld_device(struct userdata *u, int device)
static int hdmi_eld_changed(snd_mixer_elem_t *melem, unsigned int mask) {
struct userdata *u = snd_mixer_elem_get_callback_private(melem);
snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem);
int device = snd_hctl_elem_get_device(elem);
snd_hctl_elem_t **_elem = snd_mixer_elem_get_private(melem), *elem;
int device;
const char *old_monitor_name;
pa_device_port *p;
pa_hdmi_eld eld;
bool changed = false;
pa_assert(u);
pa_assert(_elem);
elem = *_elem;
device = snd_hctl_elem_get_device(elem);
if (mask == SND_CTL_EVENT_MASK_REMOVE)
return 0;

View file

@ -42,9 +42,6 @@ typedef struct pa_a2dp_endpoint_conf {
/* A2DP codec id */
pa_a2dp_codec_id id;
/* True if codec is bi-directional and supports backchannel */
bool support_backchannel;
/* Returns true if the codec can be supported on the system */
bool (*can_be_supported)(bool for_encoding);

View file

@ -556,7 +556,6 @@ static size_t decode_buffer_hd(void *codec_info, const uint8_t *input_buffer, si
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_aptx = {
.id = { A2DP_CODEC_VENDOR, APTX_VENDOR_ID, APTX_CODEC_ID },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities,
.choose_remote_endpoint = choose_remote_endpoint,
@ -580,7 +579,6 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_aptx = {
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_aptx_hd = {
.id = { A2DP_CODEC_VENDOR, APTX_HD_VENDOR_ID, APTX_HD_CODEC_ID },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities_hd,
.choose_remote_endpoint = choose_remote_endpoint_hd,

View file

@ -22,6 +22,7 @@
#endif
#include <arpa/inet.h>
#include <stdint.h>
#include <pulsecore/log.h>
#include <pulsecore/macro.h>
@ -82,7 +83,7 @@ fail:
static GstCaps *gst_create_caps_from_sample_spec(const pa_sample_spec *ss) {
gchar *sample_format;
GstCaps *caps;
int channel_mask;
uint64_t channel_mask;
switch (ss->format) {
case PA_SAMPLE_S16LE:

View file

@ -433,7 +433,6 @@ static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_hq = {
.id = { A2DP_CODEC_VENDOR, LDAC_VENDOR_ID, LDAC_CODEC_ID },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities,
.choose_remote_endpoint = choose_remote_endpoint,
@ -456,7 +455,6 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_hq = {
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_sq = {
.id = { A2DP_CODEC_VENDOR, LDAC_VENDOR_ID, LDAC_CODEC_ID },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities,
.choose_remote_endpoint = choose_remote_endpoint,
@ -479,7 +477,6 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_sq = {
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_mq = {
.id = { A2DP_CODEC_VENDOR, LDAC_VENDOR_ID, LDAC_CODEC_ID },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities,
.choose_remote_endpoint = choose_remote_endpoint,

View file

@ -39,6 +39,8 @@
#define SBC_BITPOOL_DEC_STEP 5
#define SBC_BITPOOL_INC_STEP 1
#define SBC_SYNCWORD 0x9C
struct sbc_info {
sbc_t sbc; /* Codec data */
size_t codesize, frame_length; /* SBC Codesize, frame_length. We simply cache those values here */
@ -54,6 +56,12 @@ struct sbc_info {
uint8_t nr_blocks;
uint8_t nr_subbands;
bool boost_source_volume;
/* Size of SBC frame fragment left over from previous decoding iteration */
size_t frame_fragment_size;
/* Maximum SBC frame size is 512 bytes when SBC compression ratio > 1 */
uint8_t frame_fragment[512];
};
static bool can_be_supported(bool for_encoding) {
@ -108,6 +116,24 @@ static bool can_accept_capabilities_xq(const uint8_t *capabilities_buffer, uint8
return true;
}
static bool can_accept_capabilities_faststream(const uint8_t *capabilities_buffer, uint8_t capabilities_size, bool for_encoding) {
const a2dp_faststream_t *capabilities = (const a2dp_faststream_t *) capabilities_buffer;
if (capabilities_size != sizeof(*capabilities))
return false;
if (!(capabilities->direction & (FASTSTREAM_DIRECTION_SINK | FASTSTREAM_DIRECTION_SOURCE)))
return false;
if (!(capabilities->sink_frequency & (FASTSTREAM_SINK_SAMPLING_FREQ_44100 | FASTSTREAM_SINK_SAMPLING_FREQ_48000)))
return false;
if (!(capabilities->source_frequency & FASTSTREAM_SOURCE_SAMPLING_FREQ_16000))
return false;
return true;
}
static const char *choose_remote_endpoint(const pa_hashmap *capabilities_hashmap, const pa_sample_spec *default_sample_spec, bool for_encoding) {
const pa_a2dp_codec_capabilities *a2dp_capabilities;
const char *key;
@ -136,6 +162,23 @@ static const char *choose_remote_endpoint_xq(const pa_hashmap *capabilities_hash
return NULL;
}
static const char *choose_remote_endpoint_faststream(const pa_hashmap *capabilities_hashmap, const pa_sample_spec *default_sample_spec, bool for_encoding) {
const pa_a2dp_codec_capabilities *a2dp_capabilities;
const char *key;
void *state;
/* There is no preference, just choose random valid entry */
PA_HASHMAP_FOREACH_KV(key, a2dp_capabilities, capabilities_hashmap, state) {
pa_log_debug("choose_remote_endpoint_faststream checking peer endpoint '%s'", key);
if (can_accept_capabilities_faststream(a2dp_capabilities->buffer, a2dp_capabilities->size, for_encoding))
return key;
}
pa_log_debug("choose_remote_endpoint_faststream matched no peer endpoint");
return NULL;
}
static uint8_t fill_capabilities(uint8_t capabilities_buffer[MAX_A2DP_CAPS_SIZE]) {
a2dp_sbc_t *capabilities = (a2dp_sbc_t *) capabilities_buffer;
@ -326,6 +369,46 @@ static uint8_t fill_capabilities_xq(uint8_t capabilities_buffer[MAX_A2DP_CAPS_SI
return sizeof(*capabilities);
}
static uint8_t fill_capabilities_faststream(uint8_t capabilities_buffer[MAX_A2DP_CAPS_SIZE]) {
a2dp_faststream_t *capabilities = (a2dp_faststream_t *) capabilities_buffer;
pa_zero(*capabilities);
capabilities->info = A2DP_SET_VENDOR_ID_CODEC_ID(FASTSTREAM_VENDOR_ID, FASTSTREAM_CODEC_ID);
capabilities->direction = FASTSTREAM_DIRECTION_SINK | FASTSTREAM_DIRECTION_SOURCE;
capabilities->sink_frequency = FASTSTREAM_SINK_SAMPLING_FREQ_44100 | FASTSTREAM_SINK_SAMPLING_FREQ_48000;
capabilities->source_frequency = FASTSTREAM_SOURCE_SAMPLING_FREQ_16000;
return sizeof(*capabilities);
}
static bool is_configuration_valid_faststream(const uint8_t *config_buffer, uint8_t config_size) {
const a2dp_faststream_t *config = (const a2dp_faststream_t *) config_buffer;
if (config_size != sizeof(*config)) {
pa_log_error("Invalid size of config buffer");
return false;
}
if (!(config->direction & (FASTSTREAM_DIRECTION_SINK | FASTSTREAM_DIRECTION_SOURCE))) {
pa_log_error("Invalid FastStream direction in configuration");
return false;
}
if (config->sink_frequency != FASTSTREAM_SINK_SAMPLING_FREQ_44100 && config->sink_frequency != FASTSTREAM_SINK_SAMPLING_FREQ_48000) {
pa_log_error("Invalid FastStream sink sampling frequency in configuration");
return false;
}
if (config->source_frequency != FASTSTREAM_SOURCE_SAMPLING_FREQ_16000) {
pa_log_error("Invalid FastStream source sampling frequency in configuration");
return false;
}
return true;
}
static bool is_configuration_valid(const uint8_t *config_buffer, uint8_t config_size) {
const a2dp_sbc_t *config = (const a2dp_sbc_t *) config_buffer;
@ -527,6 +610,85 @@ static uint8_t fill_preferred_configuration(const pa_sample_spec *default_sample
return sizeof(*config);
}
static uint8_t fill_preferred_configuration_faststream(const pa_sample_spec *default_sample_spec, const uint8_t *capabilities_buffer, uint8_t capabilities_size, uint8_t config_buffer[MAX_A2DP_CAPS_SIZE]) {
a2dp_faststream_t *config = (a2dp_faststream_t *) config_buffer;
const a2dp_faststream_t *capabilities = (const a2dp_faststream_t *) capabilities_buffer;
int i;
static const struct {
uint32_t rate;
uint8_t cap;
} sink_freq_table[] = {
{ 44100U, FASTSTREAM_SINK_SAMPLING_FREQ_44100 },
{ 48000U, FASTSTREAM_SINK_SAMPLING_FREQ_48000 }
};
static const struct {
uint32_t rate;
uint8_t cap;
} source_freq_table[] = {
{ 16000U, FASTSTREAM_SOURCE_SAMPLING_FREQ_16000 }
};
if (capabilities_size != sizeof(*capabilities)) {
pa_log_error("Invalid size of FastStream capabilities buffer");
return 0;
}
pa_zero(*config);
/* Find the lowest freq that is at least as high as the requested sampling rate */
for (i = 0; (unsigned) i < PA_ELEMENTSOF(sink_freq_table); i++)
if (sink_freq_table[i].rate >= default_sample_spec->rate && (capabilities->sink_frequency & sink_freq_table[i].cap)) {
config->sink_frequency = sink_freq_table[i].cap;
break;
}
/* Match with endpoint capabilities */
if ((unsigned) i == PA_ELEMENTSOF(sink_freq_table)) {
for (--i; i >= 0; i--) {
if (capabilities->sink_frequency & sink_freq_table[i].cap) {
config->sink_frequency = sink_freq_table[i].cap;
break;
}
}
if (i < 0) {
pa_log_error("Not suitable FastStream sink sample rate");
return 0;
}
}
pa_assert((unsigned) i < PA_ELEMENTSOF(sink_freq_table));
/* Only single frequency (for now?) */
config->source_frequency = FASTSTREAM_SOURCE_SAMPLING_FREQ_16000;
i = 0;
/* Match with endpoint capabilities */
if ((unsigned) i == PA_ELEMENTSOF(source_freq_table)) {
for (--i; i >= 0; i--) {
if (capabilities->source_frequency & source_freq_table[i].cap) {
config->source_frequency = source_freq_table[i].cap;
break;
}
}
if (i < 0) {
pa_log_error("Not suitable FastStream source sample rate");
return 0;
}
}
pa_assert((unsigned) i < PA_ELEMENTSOF(source_freq_table));
config->direction = FASTSTREAM_DIRECTION_SINK | FASTSTREAM_DIRECTION_SOURCE;
config->info = A2DP_SET_VENDOR_ID_CODEC_ID(FASTSTREAM_VENDOR_ID, FASTSTREAM_CODEC_ID);
return sizeof(*config);
}
static uint8_t fill_preferred_configuration_xq(const pa_sample_spec *default_sample_spec, const uint8_t *capabilities_buffer, uint8_t capabilities_size, uint8_t config_buffer[MAX_A2DP_CAPS_SIZE], uint32_t bitrate_cap) {
a2dp_sbc_t *config = (a2dp_sbc_t *) config_buffer;
const a2dp_sbc_t *capabilities = (const a2dp_sbc_t *) capabilities_buffer;
@ -684,6 +846,79 @@ static void *init(bool for_encoding, bool for_backchannel, const uint8_t *config
return sbc_info;
}
static void *init_faststream(bool for_encoding, bool for_backchannel, const uint8_t *config_buffer, uint8_t config_size, pa_sample_spec *sample_spec, pa_core *core) {
struct sbc_info *sbc_info;
const a2dp_faststream_t *config = (const a2dp_faststream_t *) config_buffer;
int ret;
pa_assert(config_size == sizeof(*config));
sbc_info = pa_xnew0(struct sbc_info, 1);
ret = sbc_init(&sbc_info->sbc, 0);
if (ret != 0) {
pa_xfree(sbc_info);
pa_log_error("SBC initialization failed: %d", ret);
return NULL;
}
sample_spec->format = PA_SAMPLE_S16LE;
if (for_encoding != for_backchannel) {
switch (config->sink_frequency) {
case FASTSTREAM_SINK_SAMPLING_FREQ_44100:
sbc_info->frequency = SBC_FREQ_44100;
sample_spec->rate = 44100U;
break;
case FASTSTREAM_SINK_SAMPLING_FREQ_48000:
sbc_info->frequency = SBC_FREQ_48000;
sample_spec->rate = 48000U;
break;
default:
pa_assert_not_reached();
}
sample_spec->channels = 2;
sbc_info->mode = SBC_MODE_JOINT_STEREO;
sbc_info->initial_bitpool = sbc_info->min_bitpool = sbc_info->max_bitpool = 29;
} else {
switch (config->source_frequency) {
case FASTSTREAM_SOURCE_SAMPLING_FREQ_16000:
sbc_info->frequency = SBC_FREQ_16000;
sample_spec->rate = 16000U;
break;
default:
pa_assert_not_reached();
}
sample_spec->channels = 2;
sbc_info->mode = SBC_MODE_MONO;
sbc_info->initial_bitpool = sbc_info->min_bitpool = sbc_info->max_bitpool = 32;
}
sbc_info->allocation = SBC_AM_LOUDNESS;
sbc_info->subbands = SBC_SB_8;
sbc_info->nr_subbands = 8;
sbc_info->blocks = SBC_BLK_16;
sbc_info->nr_blocks = 16;
set_params(sbc_info);
if (sbc_info->frame_length & 1)
++sbc_info->frame_length;
pa_log_info("FastStream %s SBC parameters: allocation=%s, subbands=%u, blocks=%u, mode=%s bitpool=%u codesize=%u frame_length=%u",
for_encoding ? "encoder" : "decoder",
sbc_info->sbc.allocation ? "SNR" : "Loudness", sbc_info->sbc.subbands ? 8 : 4,
(sbc_info->sbc.blocks+1)*4, sbc_info->sbc.mode == SBC_MODE_MONO ? "Mono" :
sbc_info->sbc.mode == SBC_MODE_DUAL_CHANNEL ? "DualChannel" :
sbc_info->sbc.mode == SBC_MODE_STEREO ? "Stereo" : "JointStereo",
sbc_info->sbc.bitpool, (unsigned)sbc_info->codesize, (unsigned)sbc_info->frame_length);
return sbc_info;
}
static void deinit(void *codec_info) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
@ -709,6 +944,12 @@ static int reset(void *codec_info) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
int ret;
/* forget about source volume boost */
sbc_info->boost_source_volume = false;
/* forget last saved frame fragment */
sbc_info->frame_fragment_size = 0;
ret = sbc_reinit(&sbc_info->sbc, 0);
if (ret != 0) {
pa_log_error("SBC reinitialization failed: %d", ret);
@ -722,6 +963,25 @@ static int reset(void *codec_info) {
return 0;
}
static int reset_faststream(void *codec_info) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
int ret;
ret = sbc_reinit(&sbc_info->sbc, 0);
if (ret != 0) {
pa_log_error("SBC reinitialization failed: %d", ret);
return -1;
}
/* sbc_reinit() sets also default parameters, so reset them back */
set_params(sbc_info);
if (sbc_info->frame_length & 1)
++sbc_info->frame_length;
sbc_info->seq_num = 0;
return 0;
}
static size_t get_block_size(void *codec_info, size_t link_mtu) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
size_t rtp_size = sizeof(struct rtp_header) + sizeof(struct rtp_payload);
@ -742,6 +1002,28 @@ static size_t get_block_size(void *codec_info, size_t link_mtu) {
return frame_count * sbc_info->codesize;
}
static size_t get_write_block_size_faststream(void *codec_info, size_t link_mtu) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
size_t frame_count = link_mtu / sbc_info->frame_length;
/* 3 frames seem to work best, with minimal glitches */
if (frame_count > 3)
frame_count = 3;
return frame_count * sbc_info->codesize;
}
static size_t get_read_block_size_faststream(void *codec_info, size_t link_mtu) {
/* With SBC bitpool >= 29 and any combination of blocks, subbands
* and channels maximum compression ratio 4:1 is achieved with
* blocks=16, subbands=8, channels=2, bitpool=29
*
* Though smaller bitpools can yield higher compression ratio, faststream is
* assumed to have fixed bitpool so maximum output size is link_mtu * 4.
*/
return link_mtu * 4;
}
static size_t get_encoded_block_size(void *codec_info, size_t input_size) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
size_t rtp_size = sizeof(struct rtp_header) + sizeof(struct rtp_payload);
@ -752,6 +1034,15 @@ static size_t get_encoded_block_size(void *codec_info, size_t input_size) {
return (input_size / sbc_info->codesize) * sbc_info->frame_length + rtp_size;
}
static size_t get_encoded_block_size_faststream(void *codec_info, size_t input_size) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
/* input size should be aligned to codec input block size */
pa_assert_fp(input_size % sbc_info->codesize == 0);
return (input_size / sbc_info->codesize) * sbc_info->frame_length;
}
static size_t reduce_encoder_bitrate(void *codec_info, size_t write_link_mtu) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
uint8_t bitpool;
@ -860,6 +1151,72 @@ static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t
return d - output_buffer;
}
static size_t encode_buffer_faststream(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
uint8_t *d;
const uint8_t *p;
size_t to_write, to_encode;
uint8_t frame_count;
frame_count = 0;
p = input_buffer;
to_encode = input_size;
d = output_buffer;
to_write = output_size;
/* frame_count is only 4 bit number */
while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
ssize_t written;
ssize_t encoded;
encoded = sbc_encode(&sbc_info->sbc,
p, to_encode,
d, to_write,
&written);
if (PA_UNLIKELY(encoded <= 0)) {
pa_log_error("SBC encoding error (%li)", (long) encoded);
break;
}
if (PA_UNLIKELY(written < 0)) {
pa_log_error("SBC encoding error (%li)", (long) written);
break;
}
while (written < sbc_info->frame_length && written < to_write)
d[written++] = 0;
pa_assert_fp((size_t) encoded <= to_encode);
pa_assert_fp((size_t) encoded == sbc_info->codesize);
pa_assert_fp((size_t) written <= to_write);
pa_assert_fp((size_t) written == sbc_info->frame_length);
p += encoded;
to_encode -= encoded;
d += written;
to_write -= written;
frame_count++;
}
PA_ONCE_BEGIN {
pa_log_debug("Using SBC codec implementation: %s", pa_strnull(sbc_get_implementation_info(&sbc_info->sbc)));
} PA_ONCE_END;
if (PA_UNLIKELY(frame_count == 0)) {
*processed = 0;
return 0;
}
*processed = p - input_buffer;
return d - output_buffer;
}
static size_t decode_buffer(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
@ -924,9 +1281,146 @@ static size_t decode_buffer(void *codec_info, const uint8_t *input_buffer, size_
return d - output_buffer;
}
static size_t decode_buffer_faststream(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
const uint8_t *p;
uint8_t *d;
size_t to_write, to_decode;
pa_sample_spec decoded_sample_spec = {
.format = PA_SAMPLE_S16LE,
.channels = 2,
.rate = 16000U
};
uint8_t decode_buffer[4096];
uint8_t frame_buffer[4096];
to_decode = input_size;
/* append input buffer to fragment left from previous decode call */
if (sbc_info->frame_fragment_size) {
if (sbc_info->frame_fragment_size + to_decode > sizeof(frame_buffer)) {
pa_log_debug("FastStream SBC input (saved + incoming) size %lu larger than buffer size %lu, input truncated to fit",
sbc_info->frame_fragment_size + to_decode, sizeof(frame_buffer));
to_decode = sizeof(frame_buffer) - sbc_info->frame_fragment_size;
}
memcpy(frame_buffer, sbc_info->frame_fragment, sbc_info->frame_fragment_size);
memcpy(frame_buffer + sbc_info->frame_fragment_size, input_buffer, to_decode);
to_decode += sbc_info->frame_fragment_size;
p = frame_buffer;
/* clear saved fragment */
sbc_info->frame_fragment_size = 0;
} else
p = input_buffer;
d = output_buffer;
to_write = output_size;
while (PA_LIKELY(to_decode > 0 && to_write > 0)) {
size_t written = 0;
ssize_t decoded;
/* skip to SBC sync word before attempting decode */
if (*p != SBC_SYNCWORD) {
++p;
--to_decode;
continue;
}
if (to_decode < sbc_info->frame_length) {
pa_log_debug("FastStream SBC input %lu is too short (expected frame length %lu)", to_decode, sbc_info->frame_length);
break;
}
decoded = sbc_decode(&sbc_info->sbc,
p, to_decode,
decode_buffer, sizeof(decode_buffer),
&written);
if (PA_UNLIKELY(decoded <= 0)) {
/* sbc_decode returns -1 if input too short,
* break from loop to save this frame fragment for next decode iteration */
if (decoded == -1) {
pa_log_debug("FastStream SBC decoding error (%li) input %lu is too short", (long) decoded, to_decode);
break;
}
/* otherwise failed to decode frame, skip to next SBC sync word */
pa_log_error("FastStream SBC decoding error (%li)", (long) decoded);
decoded = 1;
} else {
/* Reset codesize and frame_length to values found by decoder */
sbc_info->codesize = sbc_get_codesize(&sbc_info->sbc);
sbc_info->frame_length = sbc_get_frame_length(&sbc_info->sbc);
if (sbc_info->mode != sbc_info->sbc.mode)
sbc_info->mode = sbc_info->sbc.mode;
if (sbc_info->frequency != sbc_info->sbc.frequency) {
/* some devices unexpectedly return SBC frequency different from 16000
* remember this, and keep incoming sample rate at 16000 */
pa_log_debug("FastStream decoder detected SBC frequency %u, expected %u", sbc_info->sbc.frequency, sbc_info->frequency);
sbc_info->frequency = sbc_info->sbc.frequency;
/* volume is too low for known devices with unexpected source SBC frequency */
pa_log_debug("FastStream decoder requesting 20dB boost for source volume");
sbc_info->boost_source_volume = true;
}
if (sbc_info->sbc.mode == SBC_MODE_MONO) {
const void *interleave_buf[2] = {decode_buffer, decode_buffer};
/* mono->stereo conversion needs to fit into remaining output space */
written = PA_MIN(to_write / 2, written);
pa_interleave(interleave_buf, 2, d, pa_sample_size(&decoded_sample_spec), written / pa_sample_size(&decoded_sample_spec));
written *= 2;
} else
memcpy(d, decode_buffer, written);
}
pa_assert_fp((size_t) decoded <= to_decode);
pa_assert_fp((size_t) written <= to_write);
p += decoded;
to_decode -= decoded;
d += written;
to_write -= written;
}
if (to_decode) {
if (to_decode > sizeof(sbc_info->frame_fragment)) {
pa_log_debug("FastStream remaining SBC fragment size %lu larger than buffer size %lu, remainder truncated to fit",
to_decode, sizeof(sbc_info->frame_fragment));
p += to_decode - sizeof(sbc_info->frame_fragment);
to_decode = sizeof(sbc_info->frame_fragment);
}
pa_log_debug("FastStream saving SBC fragment size %lu for next decoding iteration", to_decode);
memcpy(sbc_info->frame_fragment, p, to_decode);
sbc_info->frame_fragment_size = to_decode;
}
*processed = input_size;
return d - output_buffer;
}
/* Boost sink backchannel mic volume by 20dB as it appears too quiet */
double get_source_output_volume_factor_dB_faststream(void *codec_info) {
struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
if (sbc_info->boost_source_volume)
return 20.;
return 1.0;
}
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc = {
.id = { A2DP_CODEC_SBC, 0, 0 },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities,
.choose_remote_endpoint = choose_remote_endpoint,
@ -964,7 +1458,6 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc = {
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc_xq_453 = {
.id = { A2DP_CODEC_SBC, 0, 0 },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities_xq,
.choose_remote_endpoint = choose_remote_endpoint_xq,
@ -989,7 +1482,6 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc_xq_453 = {
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc_xq_512 = {
.id = { A2DP_CODEC_SBC, 0, 0 },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities_xq,
.choose_remote_endpoint = choose_remote_endpoint_xq,
@ -1014,7 +1506,6 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc_xq_512 = {
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc_xq_552 = {
.id = { A2DP_CODEC_SBC, 0, 0 },
.support_backchannel = false,
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities_xq,
.choose_remote_endpoint = choose_remote_endpoint_xq,
@ -1036,3 +1527,49 @@ const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_sbc_xq_552 = {
.decode_buffer = decode_buffer,
},
};
/* FastStream codec is just SBC codec with fixed parameters.
*
* Sink stream parameters:
* 48.0kHz or 44.1kHz,
* Blocks 16,
* Sub-bands 8,
* Joint Stereo,
* Allocation method Loudness,
* Bitpool = 29
* (data rate = 212kbps, packet size = (71+1)3 <= DM5 = 220, with 3 SBC frames).
* SBC frame size is 71 bytes, but FastStream is zero-padded to the even size (72).
*
* Source stream parameters:
* 16kHz,
* Mono,
* Blocks 16,
* Sub-bands 8,
* Allocation method Loudness,
* Bitpool = 32
* (data rate = 72kbps, packet size = 723 <= DM5 = 220, with 3 SBC frames).
*/
const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_faststream = {
.id = { A2DP_CODEC_VENDOR, FASTSTREAM_VENDOR_ID, FASTSTREAM_CODEC_ID },
.can_be_supported = can_be_supported,
.can_accept_capabilities = can_accept_capabilities_faststream,
.choose_remote_endpoint = choose_remote_endpoint_faststream,
.fill_capabilities = fill_capabilities_faststream,
.is_configuration_valid = is_configuration_valid_faststream,
.fill_preferred_configuration = fill_preferred_configuration_faststream,
.bt_codec = {
.name = "faststream",
.description = "FastStream",
.support_backchannel = true,
.init = init_faststream,
.deinit = deinit,
.reset = reset_faststream,
.get_read_block_size = get_read_block_size_faststream,
.get_write_block_size = get_write_block_size_faststream,
.get_encoded_block_size = get_encoded_block_size_faststream,
.encode_buffer = encode_buffer_faststream,
.decode_buffer = decode_buffer_faststream,
.get_source_output_volume_factor_dB = get_source_output_volume_factor_dB_faststream,
},
};

View file

@ -52,6 +52,7 @@ extern const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_hq;
extern const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_sq;
extern const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_ldac_eqmid_mq;
#endif
extern const pa_a2dp_endpoint_conf pa_a2dp_endpoint_conf_faststream;
/* This is list of supported codecs. Their order is important.
* Codec with lower index has higher priority. */
@ -69,6 +70,7 @@ static const pa_a2dp_endpoint_conf *pa_a2dp_endpoint_configurations[] = {
&pa_a2dp_endpoint_conf_sbc_xq_453,
&pa_a2dp_endpoint_conf_sbc_xq_512,
&pa_a2dp_endpoint_conf_sbc_xq_552,
&pa_a2dp_endpoint_conf_faststream,
};
unsigned int pa_bluetooth_a2dp_endpoint_conf_count(void) {

View file

@ -38,15 +38,25 @@
#include "bluez5-util.h"
#include "bt-codec-msbc.h"
#include "upower.h"
#define MANDATORY_CALL_INDICATORS \
"(\"call\",(0-1))," \
"(\"callsetup\",(0-3))," \
"(\"callheld\",(0-2))" \
struct pa_bluetooth_backend {
pa_core *core;
pa_dbus_connection *connection;
pa_bluetooth_discovery *discovery;
pa_hook_slot *adapter_uuids_changed_slot;
pa_hook_slot *host_battery_level_changed_slot;
pa_upower_backend *upower;
bool enable_shared_profiles;
bool enable_hsp_hs;
bool enable_hfp_hf;
bool cmer_indicator_reporting_enabled;
uint32_t cind_enabled_indicators;
PA_LLIST_HEAD(pa_dbus_pending, pending);
};
@ -57,6 +67,7 @@ struct transport_data {
int sco_fd;
pa_io_event *sco_io;
pa_mainloop_api *mainloop;
pa_bluetooth_backend *backend;
};
struct hfp_config {
@ -97,6 +108,20 @@ enum hfp_ag_features {
HFP_AG_INDICATORS = 10,
};
/*
* Always keep this struct in sync with indicator discovery of AT+CIND=?
* These indicators are used in bitflags and intentionally start at 1
* since AT+CIND indicators start at index 1.
*/
typedef enum pa_bluetooth_ag_to_hf_indicators {
CIND_CALL_INDICATOR = 1,
CIND_CALL_SETUP_INDICATOR = 2,
CIND_CALL_HELD_INDICATOR = 3,
CIND_SERVICE_INDICATOR = 4,
CIND_BATT_CHG_INDICATOR = 5,
CIND_INDICATOR_MAX = 6
} pa_bluetooth_ag_to_hf_indicators_t;
/* gateway features we support, which is as little as we can get away with */
static uint32_t hfp_features =
/* HFP 1.6 requires this */
@ -589,11 +614,13 @@ static pa_volume_t set_source_volume(pa_bluetooth_transport *t, pa_volume_t volu
static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf)
{
struct hfp_config *c = t->config;
int indicator, val;
char str[5];
struct transport_data *trd = t->userdata;
pa_bluetooth_backend *b = trd->backend;
int indicator, mode, val;
char *str;
const char *r;
size_t len;
const char *state;
const char *state = NULL;
/* first-time initialize selected codec to CVSD */
if (c->selected_codec == 0)
@ -608,18 +635,47 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf
c->state = 1;
return true;
} else if (sscanf(buf, "AT+BAC=%3s", str) == 1) {
} else if (pa_startswith(buf, "AT+BIA=")) {
/* Indicators start with index 1 and follow the order of the AT+CIND=? response */
str = pa_xstrdup(buf + 7);
for (indicator = 1; (r = pa_split_in_place(str, ",\r\n", &len, &state)); indicator++) {
/* Ignore updates to mandatory indicators which are always ON */
if (indicator == CIND_CALL_INDICATOR
|| indicator == CIND_CALL_SETUP_INDICATOR
|| indicator == CIND_CALL_HELD_INDICATOR)
continue;
/* Indicators may have no value and should be skipped */
if (len == 0)
continue;
if (len == 1 && r[0] == '1')
b->cind_enabled_indicators |= (1 << indicator);
else if (len == 1 && r[0] == '0')
b->cind_enabled_indicators &= ~(1 << indicator);
else {
pa_log_error("Unable to parse indicator of AT+BIA command: %s", buf);
rfcomm_write_response(fd, "ERROR");
pa_xfree(str);
return false;
}
}
pa_xfree(str);
return true;
} else if (pa_startswith(buf, "AT+BAC=")) {
c->support_msbc = false;
state = NULL;
/* check if codec id 2 (mSBC) is in the list of supported codecs */
while ((r = pa_split_in_place(str, ",", &len, &state))) {
str = pa_xstrdup(buf + 7);
while ((r = pa_split_in_place(str, ",\r\n", &len, &state))) {
if (len == 1 && r[0] == '2') {
c->support_msbc = true;
break;
}
}
pa_xfree(str);
c->support_codec_negotiation = true;
@ -633,24 +689,48 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf
return true;
} else if (c->state == 1 && pa_startswith(buf, "AT+CIND=?")) {
/* we declare minimal no indicators */
rfcomm_write_response(fd, "+CIND: "
/* many indicators can be supported, only call and
* callheld are mandatory, so that's all we reply */
"(\"service\",(0-1)),"
"(\"call\",(0-1)),"
"(\"callsetup\",(0-3)),"
"(\"callheld\",(0-2))");
/* UPower backend available, declare support for more indicators */
if (b->upower) {
rfcomm_write_response(fd, "+CIND: "
MANDATORY_CALL_INDICATORS ","
"(\"service\",(0-1)),"
"(\"battchg\",(0-5))");
/* Minimal indicators supported without any additional backend */
} else {
rfcomm_write_response(fd, "+CIND: "
MANDATORY_CALL_INDICATORS ","
"(\"service\",(0-1))");
}
c->state = 2;
return true;
} else if (c->state == 2 && pa_startswith(buf, "AT+CIND?")) {
rfcomm_write_response(fd, "+CIND: 0,0,0,0");
if (b->upower)
rfcomm_write_response(fd, "+CIND: 0,0,0,0,%u", pa_upower_get_battery_level(b->upower));
else
rfcomm_write_response(fd, "+CIND: 0,0,0,0");
c->state = 3;
return true;
} else if ((c->state == 2 || c->state == 3) && pa_startswith(buf, "AT+CMER=")) {
rfcomm_write_response(fd, "OK");
if (sscanf(buf, "AT+CMER=%d,%*d,%*d,%d", &mode, &val) == 2) {
/* Bluetooth HFP spec only defines mode == 3 */
if (mode != 3)
pa_log_warn("Unexpected mode for AT+CMER: %d", mode);
/* Configure CMER event reporting */
b->cmer_indicator_reporting_enabled = !!val;
pa_log_debug("Event indications enabled? %s", pa_yes_no(val));
rfcomm_write_response(fd, "OK");
}
else {
pa_log_error("Unable to parse AT+CMER command: %s", buf);
rfcomm_write_response(fd, "ERROR");
return false;
}
if (c->support_codec_negotiation) {
if (c->support_msbc && pa_bluetooth_discovery_get_enable_msbc(t->device->discovery)) {
@ -738,8 +818,62 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf
return true;
}
static int get_rfcomm_fd(pa_bluetooth_discovery *discovery) {
struct pa_bluetooth_transport *t;
struct transport_data *trd = NULL;
void *state = NULL;
/* Find RFCOMM transport by checking if a HSP or HFP profile transport is available */
while ((t = pa_hashmap_iterate(pa_bluetooth_discovery_get_transports(discovery), &state, NULL))) {
/* Skip non-connected transports */
if (!t || t->state == PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) {
continue;
}
/* Break when an RFCOMM capable transport profile is available */
if (t->profile == PA_BLUETOOTH_PROFILE_HFP_HF) {
trd = t->userdata;
break;
}
}
/* Skip if RFCOMM channel is not available yet */
if (!trd) {
pa_log_info("RFCOMM not available yet, skipping notification");
return -1;
}
return trd->rfcomm_fd;
}
static pa_hook_result_t host_battery_level_changed_cb(pa_bluetooth_discovery *y, const pa_upower_backend *u, pa_bluetooth_backend *b) {
int rfcomm_fd;
pa_assert(y);
pa_assert(u);
pa_assert(b);
/* Get RFCOMM channel if available */
rfcomm_fd = get_rfcomm_fd(y);
if (rfcomm_fd < 0)
return PA_HOOK_OK;
/* Notify HF about AG battery level change over RFCOMM */
if (b->cmer_indicator_reporting_enabled && (b->cind_enabled_indicators & (1 << CIND_BATT_CHG_INDICATOR))) {
rfcomm_write_response(rfcomm_fd, "+CIEV: %d,%d", CIND_BATT_CHG_INDICATOR, u->battery_level);
pa_log_debug("HG notified of AG's battery level change");
/* Skip notification if indicator is disabled or event reporting is completely disabled */
} else
pa_log_debug("Battery level change indicator disabled, skipping notification");
return PA_HOOK_OK;
}
static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
pa_bluetooth_transport *t = userdata;
struct transport_data *trd = t->userdata;
pa_bluetooth_backend *b = trd->backend;
int i;
pa_assert(io);
pa_assert(t);
@ -755,111 +889,130 @@ static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_i
}
if (events & PA_IO_EVENT_INPUT) {
char buf[512];
char rbuf[512];
ssize_t len;
int gain, dummy;
bool do_reply = false;
int vendor, product, version, features;
char *buf = rbuf;
int num;
len = pa_read(fd, buf, 511, NULL);
len = pa_read(fd, rbuf, 511, NULL);
if (len < 0) {
pa_log_error("RFCOMM read error: %s", pa_cstrerror(errno));
goto fail;
}
buf[len] = 0;
pa_log_debug("RFCOMM << %s", buf);
rbuf[len] = 0;
pa_log_debug("RFCOMM << %s", rbuf);
/* There are only four HSP AT commands:
* AT+VGS=value: value between 0 and 15, sent by the HS to AG to set the speaker gain.
* +VGS=value is sent by AG to HS as a response to an AT+VGS command or when the gain
* is changed on the AG side.
* AT+VGM=value: value between 0 and 15, sent by the HS to AG to set the microphone gain.
* +VGM=value is sent by AG to HS as a response to an AT+VGM command or when the gain
* is changed on the AG side.
* AT+CKPD=200: Sent by HS when headset button is pressed.
* RING: Sent by AG to HS to notify of an incoming call. It can safely be ignored because
* it does not expect a reply. */
if (sscanf(buf, "AT+VGS=%d", &gain) == 1 || sscanf(buf, "\r\n+VGM%*[=:]%d\r\n", &gain) == 1) {
if (!t->set_sink_volume) {
pa_log_debug("HS/HF peer supports speaker gain control");
t->set_sink_volume = set_sink_volume;
}
t->sink_volume = hsp_gain_to_volume(gain);
pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SINK_VOLUME_CHANGED), t);
do_reply = true;
} else if (sscanf(buf, "AT+VGM=%d", &gain) == 1 || sscanf(buf, "\r\n+VGS%*[=:]%d\r\n", &gain) == 1) {
if (!t->set_source_volume) {
pa_log_debug("HS/HF peer supports microphone gain control");
t->set_source_volume = set_source_volume;
}
t->source_volume = hsp_gain_to_volume(gain);
pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SOURCE_VOLUME_CHANGED), t);
do_reply = true;
} else if (sscanf(buf, "AT+CKPD=%d", &dummy) == 1) {
do_reply = true;
} else if (sscanf(buf, "AT+XAPL=%04x-%04x-%04x,%d", &vendor, &product, &version, &features) == 4) {
if (features & 0x2)
/* claim, that we support battery status reports */
rfcomm_write_response(fd, "+XAPL=iPhone,6");
do_reply = true;
} else if (sscanf(buf, "AT+IPHONEACCEV=%d", &num) == 1) {
char *substr = buf, *keystr;
int key, val, i;
do_reply = true;
for (i = 0; i < num; ++i) {
keystr = strchr(substr, ',');
if (!keystr) {
pa_log_warn("%s misses key for argument #%d", buf, i);
do_reply = false;
break;
while (buf[0]) {
/* There are only four HSP AT commands:
* AT+VGS=value: value between 0 and 15, sent by the HS to AG to set the speaker gain.
* +VGS=value is sent by AG to HS as a response to an AT+VGS command or when the gain
* is changed on the AG side.
* AT+VGM=value: value between 0 and 15, sent by the HS to AG to set the microphone gain.
* +VGM=value is sent by AG to HS as a response to an AT+VGM command or when the gain
* is changed on the AG side.
* AT+CKPD=200: Sent by HS when headset button is pressed.
* RING: Sent by AG to HS to notify of an incoming call. It can safely be ignored because
* it does not expect a reply. */
if (sscanf(buf, "AT+VGS=%d", &gain) == 1 || sscanf(buf, "\r\n+VGM%*[=:]%d\r\n", &gain) == 1) {
if (!t->set_sink_volume) {
pa_log_debug("HS/HF peer supports speaker gain control");
t->set_sink_volume = set_sink_volume;
}
keystr++;
substr = strchr(keystr, ',');
if (!substr) {
pa_log_warn("%s misses value for argument #%d", buf, i);
do_reply = false;
break;
}
substr++;
key = atoi(keystr);
val = atoi(substr);
t->sink_volume = hsp_gain_to_volume(gain);
pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SINK_VOLUME_CHANGED), t);
do_reply = true;
switch (key) {
case 1:
pa_log_notice("Battery Level: %d0%%", val + 1);
pa_bluetooth_device_report_battery_level(t->device, (val + 1) * 10, "Apple accessory indication");
break;
case 2:
pa_log_notice("Dock Status: %s", val ? "docked" : "undocked");
break;
default:
pa_log_debug("Unexpected IPHONEACCEV key %#x", key);
break;
} else if (sscanf(buf, "AT+VGM=%d", &gain) == 1 || sscanf(buf, "\r\n+VGS%*[=:]%d\r\n", &gain) == 1) {
if (!t->set_source_volume) {
pa_log_debug("HS/HF peer supports microphone gain control");
t->set_source_volume = set_source_volume;
}
}
if (!do_reply)
t->source_volume = hsp_gain_to_volume(gain);
pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SOURCE_VOLUME_CHANGED), t);
do_reply = true;
} else if (sscanf(buf, "AT+CKPD=%d", &dummy) == 1) {
do_reply = true;
} else if (sscanf(buf, "AT+XAPL=%04x-%04x-%04x,%d", &vendor, &product, &version, &features) == 4) {
if (features & 0x2)
/* claim, that we support battery status reports */
rfcomm_write_response(fd, "+XAPL=iPhone,6");
do_reply = true;
} else if (sscanf(buf, "AT+IPHONEACCEV=%d", &num) == 1) {
char *substr = buf, *keystr;
int key, val, i;
do_reply = true;
for (i = 0; i < num; ++i) {
keystr = strchr(substr, ',');
if (!keystr) {
pa_log_warn("%s misses key for argument #%d", buf, i);
do_reply = false;
break;
}
keystr++;
substr = strchr(keystr, ',');
if (!substr) {
pa_log_warn("%s misses value for argument #%d", buf, i);
do_reply = false;
break;
}
substr++;
key = atoi(keystr);
val = atoi(substr);
switch (key) {
case 1:
pa_log_debug("Battery Level: %d0%%", val + 1);
pa_bluetooth_device_report_battery_level(t->device, (val + 1) * 10, "Apple accessory indication");
break;
case 2:
pa_log_debug("Dock Status: %s", val ? "docked" : "undocked");
break;
default:
pa_log_debug("Unexpected IPHONEACCEV key %#x", key);
break;
}
}
if (!do_reply)
rfcomm_write_response(fd, "ERROR");
} else if (t->config) { /* t->config is only non-null for hfp profile */
do_reply = hfp_rfcomm_handle(fd, t, buf);
} else {
rfcomm_write_response(fd, "ERROR");
} else if (t->config) { /* t->config is only non-null for hfp profile */
do_reply = hfp_rfcomm_handle(fd, t, buf);
} else {
rfcomm_write_response(fd, "ERROR");
do_reply = false;
}
do_reply = false;
}
if (do_reply)
rfcomm_write_response(fd, "OK");
if (do_reply)
rfcomm_write_response(fd, "OK");
if (buf[0] == '\r') /* in case it is the command with format \r\nCOMMAND\r\n, skip the starting \r */
buf = buf + 1;
buf = strstr(buf, "\r"); /* try to find the next AT command in the buf */
if (!buf)
break;
else if (buf[1] == '\n')
buf = buf + 2; /* skip \r\n */
else
buf = buf + 1; /* skip \r */
}
}
return;
fail:
/* Service Connection lost, reset indicators and event reporting to default values */
b->cmer_indicator_reporting_enabled = false;
for (i = 1; i < CIND_INDICATOR_MAX; i++)
b->cind_enabled_indicators |= (1 << i);
pa_bluetooth_transport_unlink(t);
pa_bluetooth_transport_free(t);
}
@ -1022,6 +1175,7 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
trd = pa_xnew0(struct transport_data, 1);
trd->rfcomm_fd = fd;
trd->mainloop = b->core->mainloop;
trd->backend = b;
trd->rfcomm_io = trd->mainloop->io_new(b->core->mainloop, fd, PA_IO_EVENT_INPUT,
rfcomm_io_callback, t);
t->userdata = trd;
@ -1188,6 +1342,7 @@ void pa_bluetooth_native_backend_enable_shared_profiles(pa_bluetooth_backend *na
pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, bool enable_shared_profiles) {
pa_bluetooth_backend *backend;
DBusError err;
int i;
pa_log_debug("Bluetooth Headset Backend API support using the native backend");
@ -1211,6 +1366,10 @@ pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_d
pa_hook_connect(pa_bluetooth_discovery_hook(y, PA_BLUETOOTH_HOOK_ADAPTER_UUIDS_CHANGED), PA_HOOK_NORMAL,
(pa_hook_cb_t) adapter_uuids_changed_cb, backend);
backend->host_battery_level_changed_slot =
pa_hook_connect(pa_bluetooth_discovery_hook(y, PA_BLUETOOTH_HOOK_HOST_BATTERY_LEVEL_CHANGED), PA_HOOK_NORMAL,
(pa_hook_cb_t) host_battery_level_changed_cb, backend);
if (!backend->enable_hsp_hs && !backend->enable_hfp_hf)
pa_log_warn("Both HSP HS and HFP HF bluetooth profiles disabled in native backend. Native backend will not register for headset connections.");
@ -1220,6 +1379,16 @@ pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_d
if (backend->enable_shared_profiles)
native_backend_apply_profile_registration_change(backend, true);
backend->upower = pa_upower_backend_new(c, y);
/* All CIND indicators are enabled by default until overriden by AT+BIA */
for (i = 1; i < CIND_INDICATOR_MAX; i++)
backend->cind_enabled_indicators |= (1 << i);
/* While all CIND indicators are enabled, event reporting is not enabled by default */
backend->cmer_indicator_reporting_enabled = false;
return backend;
}
@ -1231,12 +1400,18 @@ void pa_bluetooth_native_backend_free(pa_bluetooth_backend *backend) {
if (backend->adapter_uuids_changed_slot)
pa_hook_slot_free(backend->adapter_uuids_changed_slot);
if (backend->host_battery_level_changed_slot)
pa_hook_slot_free(backend->host_battery_level_changed_slot);
if (backend->enable_shared_profiles)
native_backend_apply_profile_registration_change(backend, false);
if (backend->enable_hsp_hs)
profile_done(backend, PA_BLUETOOTH_PROFILE_HSP_HS);
if (backend->upower)
pa_upower_backend_free(backend->upower);
pa_dbus_connection_unref(backend->connection);
pa_xfree(backend);

View file

@ -1202,6 +1202,13 @@ bool pa_bluetooth_discovery_get_enable_msbc(pa_bluetooth_discovery *y)
return y->enable_msbc;
}
pa_hashmap* pa_bluetooth_discovery_get_transports(pa_bluetooth_discovery *y) {
pa_assert(y);
pa_assert(PA_REFCNT_VALUE(y) > 0);
return y->transports;
}
pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_address(pa_bluetooth_discovery *y, const char *remote, const char *local) {
pa_bluetooth_device *d;
void *state = NULL;

View file

@ -62,12 +62,14 @@ typedef struct pa_bluetooth_device pa_bluetooth_device;
typedef struct pa_bluetooth_adapter pa_bluetooth_adapter;
typedef struct pa_bluetooth_discovery pa_bluetooth_discovery;
typedef struct pa_bluetooth_backend pa_bluetooth_backend;
typedef struct pa_upower_backend pa_upower_backend;
typedef enum pa_bluetooth_hook {
PA_BLUETOOTH_HOOK_ADAPTER_UUIDS_CHANGED, /* Call data: pa_bluetooth_adapter */
PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED, /* Call data: pa_bluetooth_device */
PA_BLUETOOTH_HOOK_DEVICE_UNLINK, /* Call data: pa_bluetooth_device */
PA_BLUETOOTH_HOOK_DEVICE_BATTERY_LEVEL_CHANGED, /* Call data: pa_bluetooth_device */
PA_BLUETOOTH_HOOK_HOST_BATTERY_LEVEL_CHANGED, /* Call data: pa_upower_backend */
PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED, /* Call data: pa_bluetooth_transport */
PA_BLUETOOTH_HOOK_TRANSPORT_SOURCE_VOLUME_CHANGED, /* Call data: pa_bluetooth_transport */
PA_BLUETOOTH_HOOK_TRANSPORT_SINK_VOLUME_CHANGED, /* Call data: pa_bluetooth_transport */
@ -245,4 +247,5 @@ void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is
bool pa_bluetooth_discovery_get_enable_native_hsp_hs(pa_bluetooth_discovery *y);
bool pa_bluetooth_discovery_get_enable_native_hfp_hf(pa_bluetooth_discovery *y);
bool pa_bluetooth_discovery_get_enable_msbc(pa_bluetooth_discovery *y);
pa_hashmap* pa_bluetooth_discovery_get_transports(pa_bluetooth_discovery *y);
#endif

View file

@ -26,6 +26,9 @@ typedef struct pa_bt_codec {
/* Human readable codec description */
const char *description;
/* True if codec is bi-directional and supports backchannel */
bool support_backchannel;
/* Initialize codec, returns codec info data and set sample_spec,
* for_encoding is true when codec_info is used for encoding,
* for_backchannel is true when codec_info is used for backchannel */
@ -64,4 +67,7 @@ typedef struct pa_bt_codec {
* returns size of filled ouput_buffer and set processed to size of
* processed input_buffer */
size_t (*decode_buffer)(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed);
/* Get volume factor which needs to be applied to output samples */
double (*get_source_output_volume_factor_dB)(void *codec_info);
} pa_bt_codec;

View file

@ -16,6 +16,8 @@ libbluez5_util_headers = [
if get_option('bluez5-native-headset')
libbluez5_util_sources += [ 'backend-native.c' ]
libbluez5_util_sources += [ 'upower.c' ]
libbluez5_util_headers += [ 'upower.h' ]
endif
if get_option('bluez5-ofono-headset')
@ -35,7 +37,7 @@ libbluez5_util = shared_library('bluez5-util',
c_args : [pa_c_args, server_c_args],
link_args : [nodelete_link_args],
include_directories : [configinc, topinc],
dependencies : [libpulse_dep, libpulsecommon_dep, libpulsecore_dep, bluez_dep, dbus_dep, sbc_dep, libintl_dep, bluez5_gst_dep, bluez5_gstapp_dep],
dependencies : [libpulse_dep, libpulsecommon_dep, libpulsecore_dep, bluez_dep, dbus_dep, sbc_dep, libintl_dep, bluez5_gst_dep, bluez5_gstapp_dep, libm_dep],
install : true,
install_rpath : privlibdir,
install_dir : modlibexecdir,

View file

@ -116,6 +116,8 @@ struct userdata {
pa_hook_slot *sink_volume_changed_slot;
pa_hook_slot *source_volume_changed_slot;
pa_hook_slot *source_output_new_hook_slot;
pa_bluetooth_discovery *discovery;
pa_bluetooth_device *device;
pa_bluetooth_transport *transport;
@ -392,6 +394,8 @@ static int bt_process_render(struct userdata *u) {
if (processed != u->write_memchunk.length) {
pa_log_error("Encoding error");
pa_memblock_unref(u->write_memchunk.memblock);
pa_memchunk_reset(&u->write_memchunk);
return -1;
}
@ -535,6 +539,7 @@ static int bt_process_push(struct userdata *u) {
if (processed != (size_t) received) {
pa_log_error("Decoding error");
pa_memblock_unref(memchunk.memblock);
return -1;
}
@ -961,6 +966,12 @@ static void source_setup_volume_callback(pa_source *s) {
if (pa_bluetooth_profile_is_a2dp(u->profile) && !u->transport->device->avrcp_absolute_volume)
return;
/* Do not use hardware volume controls for backchannel of A2DP sink */
if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK) {
pa_assert_fp(u->transport->bt_codec && u->transport->bt_codec->support_backchannel);
return;
}
/* Remote volume control has to be supported for the callback to make sense,
* otherwise this source should continue performing attenuation in software
* without HW_VOLUME_CTL.
@ -1029,6 +1040,12 @@ static int add_source(struct userdata *u) {
if (!u->transport_acquired)
switch (u->profile) {
case PA_BLUETOOTH_PROFILE_A2DP_SINK:
if (u->bt_codec && u->bt_codec->support_backchannel)
data.suspend_cause = PA_SUSPEND_USER;
else
pa_assert_not_reached();
break;
case PA_BLUETOOTH_PROFILE_A2DP_SOURCE:
case PA_BLUETOOTH_PROFILE_HFP_AG:
case PA_BLUETOOTH_PROFILE_HSP_AG:
@ -1043,7 +1060,6 @@ static int add_source(struct userdata *u) {
else
pa_assert_not_reached();
break;
case PA_BLUETOOTH_PROFILE_A2DP_SINK:
case PA_BLUETOOTH_PROFILE_OFF:
pa_assert_not_reached();
break;
@ -1198,6 +1214,12 @@ static void sink_setup_volume_callback(pa_sink *s) {
if (pa_bluetooth_profile_is_a2dp(u->profile) && !u->transport->device->avrcp_absolute_volume)
return;
/* Do not use hardware volume controls for backchannel of A2DP source */
if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE) {
pa_assert_fp(u->transport->bt_codec && u->transport->bt_codec->support_backchannel);
return;
}
/* Remote volume control has to be supported for the callback to make sense,
* otherwise this sink should continue performing attenuation in software
* without HW_VOLUME_CTL.
@ -1322,6 +1344,7 @@ static pa_direction_t get_profile_direction(pa_bluetooth_profile_t p) {
/* Run from main thread */
static int transport_config(struct userdata *u) {
bool reverse_backchannel;
pa_assert(u);
pa_assert(u->transport);
pa_assert(!u->bt_codec);
@ -1334,15 +1357,18 @@ static int transport_config(struct userdata *u) {
/* reset encoder buffer contents */
u->encoder_buffer_used = 0;
if (get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT) {
u->encoder_info = u->bt_codec->init(true, false, u->transport->config, u->transport->config_size, &u->encoder_sample_spec, u->core);
/* forward encoding direction */
reverse_backchannel = u->bt_codec->support_backchannel && !(get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT);
if ((get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT) || u->bt_codec->support_backchannel) {
u->encoder_info = u->bt_codec->init(true, reverse_backchannel, u->transport->config, u->transport->config_size, &u->encoder_sample_spec, u->core);
if (!u->encoder_info)
return -1;
}
if (get_profile_direction(u->profile) & PA_DIRECTION_INPUT) {
u->decoder_info = u->bt_codec->init(false, false, u->transport->config, u->transport->config_size, &u->decoder_sample_spec, u->core);
if ((get_profile_direction(u->profile) & PA_DIRECTION_INPUT) || u->bt_codec->support_backchannel) {
u->decoder_info = u->bt_codec->init(false, reverse_backchannel, u->transport->config, u->transport->config_size, &u->decoder_sample_spec, u->core);
if (!u->decoder_info) {
if (u->encoder_info) {
@ -1400,11 +1426,11 @@ static int init_profile(struct userdata *u) {
pa_assert(u->transport);
if (get_profile_direction (u->profile) & PA_DIRECTION_OUTPUT)
if ((get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT) || u->bt_codec->support_backchannel)
if (add_sink(u) < 0)
r = -1;
if (get_profile_direction (u->profile) & PA_DIRECTION_INPUT)
if ((get_profile_direction(u->profile) & PA_DIRECTION_INPUT) || u->bt_codec->support_backchannel)
if (add_source(u) < 0)
r = -1;
@ -1523,8 +1549,8 @@ static void thread_func(void *userdata) {
writable = true;
/* If we have a source, we let the source determine the timing
* for the sink */
if (have_source) {
* for the sink unless peer has not sent any data yet */
if (have_source && u->read_index > 0) {
/* If the stream is writable, send some data if necessary */
if (writable) {
@ -1605,13 +1631,15 @@ static void thread_func(void *userdata) {
skip_bytes -= bytes_to_render;
}
if (u->write_index > 0 && (get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT)) {
size_t new_write_block_size = u->bt_codec->reduce_encoder_bitrate(u->encoder_info, u->write_link_mtu);
if (new_write_block_size) {
u->write_block_size = new_write_block_size;
handle_sink_block_size_change(u);
if (u->write_index > 0 && (get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT || u->bt_codec->support_backchannel)) {
if (u->bt_codec->reduce_encoder_bitrate) {
size_t new_write_block_size = u->bt_codec->reduce_encoder_bitrate(u->encoder_info, u->write_link_mtu);
if (new_write_block_size) {
u->write_block_size = new_write_block_size;
handle_sink_block_size_change(u);
}
pa_gettimeofday(&tv_last_output_rate_change);
}
pa_gettimeofday(&tv_last_output_rate_change);
}
}
@ -1635,6 +1663,12 @@ static void thread_func(void *userdata) {
goto fail;
if (result) {
if (have_source && u->read_index <= 0) {
/* We have a source but peer has not sent any data yet, log this */
if (pa_log_ratelimit(PA_LOG_DEBUG))
pa_log_debug("Still no data received from source, sent one more block to sink");
}
writable = false;
have_written = true;
}
@ -1654,7 +1688,7 @@ static void thread_func(void *userdata) {
sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0;
/* pa_log("Sleeping for %lu; time passed %lu, next write at %lu", (unsigned long) sleep_for, (unsigned long) time_passed, (unsigned long)next_write_at); */
if ((get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT) && u->write_memchunk.memblock == NULL) {
if ((get_profile_direction(u->profile) & PA_DIRECTION_OUTPUT || u->bt_codec->support_backchannel) && u->write_memchunk.memblock == NULL) {
/* bt_write_buffer() is keeping up with input, try increasing bitrate */
if (u->bt_codec->increase_encoder_bitrate
&& pa_timeval_age(&tv_last_output_rate_change) >= u->device->output_rate_refresh_interval_ms * PA_USEC_PER_MSEC) {
@ -1886,10 +1920,10 @@ static pa_available_t get_port_availability(struct userdata *u, pa_direction_t d
for (i = 0; i < PA_BLUETOOTH_PROFILE_COUNT; i++) {
pa_bluetooth_transport *transport;
if (!(get_profile_direction(i) & direction))
if (!(transport = u->device->transports[i]))
continue;
if (!(transport = u->device->transports[i]))
if (!(get_profile_direction(i) & direction || (transport->bt_codec && transport->bt_codec->support_backchannel)))
continue;
switch(transport->state) {
@ -2729,6 +2763,30 @@ static int device_process_msg(pa_msgobject *obj, int code, void *data, int64_t o
return 0;
}
/* Run from main thread */
static pa_hook_result_t a2dp_source_output_fixate_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
double volume_factor_dB;
pa_cvolume cv;
pa_assert(c);
pa_assert(new_data);
pa_assert(u);
/* When transport is released, there is no decoder and no codec */
if (!u->bt_codec || !u->decoder_info)
return PA_HOOK_OK;
if (!u->bt_codec->get_source_output_volume_factor_dB)
return PA_HOOK_OK;
volume_factor_dB = u->bt_codec->get_source_output_volume_factor_dB(u->decoder_info);
pa_cvolume_set(&cv, u->decoder_sample_spec.channels, pa_sw_volume_from_dB(volume_factor_dB));
pa_source_output_new_data_apply_volume_factor_source(new_data, &cv);
return PA_HOOK_OK;
}
int pa__init(pa_module* m) {
struct userdata *u;
const char *path;
@ -2810,6 +2868,8 @@ int pa__init(pa_module* m) {
u->transport_source_volume_changed_slot =
pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SOURCE_VOLUME_CHANGED), PA_HOOK_NORMAL, (pa_hook_cb_t) transport_source_volume_changed_cb, u);
u->source_output_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) a2dp_source_output_fixate_hook_callback, u);
if (add_card(u) < 0)
goto fail;
@ -2873,6 +2933,9 @@ void pa__done(pa_module *m) {
stop_thread(u);
if (u->source_output_new_hook_slot)
pa_hook_slot_free(u->source_output_new_hook_slot);
if (u->device_connection_changed_slot)
pa_hook_slot_free(u->device_connection_changed_slot);

View file

@ -0,0 +1,300 @@
/***
This file is part of PulseAudio.
Copyright 2022 Dylan Van Assche <me@dylanvanassche.be>
PulseAudio is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
PulseAudio is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
***/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <math.h>
#include <pulsecore/core-error.h>
#include <pulsecore/core-util.h>
#include <pulsecore/dbus-shared.h>
#include <pulsecore/log.h>
#include <pulse/timeval.h>
#include <pulse/rtclock.h>
#include "upower.h"
static pa_dbus_pending* send_and_add_to_pending(pa_upower_backend *backend, DBusMessage *m,
DBusPendingCallNotifyFunction func, void *call_data) {
pa_dbus_pending *p;
DBusPendingCall *call;
pa_assert(backend);
pa_assert(m);
pa_assert_se(dbus_connection_send_with_reply(pa_dbus_connection_get(backend->connection), m, &call, -1));
p = pa_dbus_pending_new(pa_dbus_connection_get(backend->connection), m, call, backend, call_data);
PA_LLIST_PREPEND(pa_dbus_pending, backend->pending, p);
dbus_pending_call_set_notify(call, func, p, NULL);
return p;
}
static void parse_percentage(pa_upower_backend *b, DBusMessageIter *i) {
double percentage;
unsigned int battery_level;
pa_assert(i);
pa_assert(dbus_message_iter_get_arg_type(i) == DBUS_TYPE_DOUBLE);
dbus_message_iter_get_basic(i, &percentage);
battery_level = (unsigned int) round(percentage / 20.0);
if (battery_level != b->battery_level) {
b->battery_level = battery_level;
pa_log_debug("AG battery level updated (%d/5)", b->battery_level);
pa_hook_fire(pa_bluetooth_discovery_hook(b->discovery, PA_BLUETOOTH_HOOK_HOST_BATTERY_LEVEL_CHANGED), b);
}
}
static void get_percentage_reply(DBusPendingCall *pending, void *userdata) {
pa_dbus_pending *p;
pa_upower_backend *b;
DBusMessage *r;
DBusMessageIter arg_i, variant_i;
pa_assert(pending);
pa_assert_se(p = userdata);
pa_assert_se(b = p->context_data);
pa_assert_se(r = dbus_pending_call_steal_reply(pending));
if (dbus_message_is_error(r, DBUS_ERROR_UNKNOWN_METHOD)) {
pa_log_warn("UPower D-Bus Display Device not available");
goto finish;
}
if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) {
pa_log_error("Get() failed: %s: %s", dbus_message_get_error_name(r), pa_dbus_get_error_message(r));
goto finish;
}
if (!dbus_message_iter_init(r, &arg_i) || !pa_streq(dbus_message_get_signature(r), "v")) {
pa_log_error("Invalid reply signature for Get()");
goto finish;
}
dbus_message_iter_recurse(&arg_i, &variant_i);
parse_percentage(b, &variant_i);
finish:
dbus_message_unref(r);
PA_LLIST_REMOVE(pa_dbus_pending, b->pending, p);
pa_dbus_pending_free(p);
}
static const char *check_variant_property(DBusMessageIter *i) {
const char *key;
pa_assert(i);
if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING) {
pa_log_error("Property name not a string.");
return NULL;
}
dbus_message_iter_get_basic(i, &key);
if (!dbus_message_iter_next(i)) {
pa_log_error("Property value missing");
return NULL;
}
if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_VARIANT) {
pa_log_error("Property value not a variant.");
return NULL;
}
return key;
}
static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *data) {
DBusError err;
DBusMessage *m2;
static const char* upower_device_interface = UPOWER_SERVICE UPOWER_DEVICE_INTERFACE;
static const char* percentage_property = "Percentage";
pa_upower_backend *b = data;
const char *path, *interface, *member;
pa_assert(bus);
pa_assert(m);
pa_assert(b);
dbus_error_init(&err);
path = dbus_message_get_path(m);
interface = dbus_message_get_interface(m);
member = dbus_message_get_member(m);
pa_log_debug("dbus: path=%s, interface=%s, member=%s", path, interface, member);
/* UPower D-Bus status change */
if (dbus_message_is_signal(m, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) {
const char *name, *old_owner, *new_owner;
if (!dbus_message_get_args(m, &err,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_STRING, &old_owner,
DBUS_TYPE_STRING, &new_owner,
DBUS_TYPE_INVALID)) {
pa_log_error("Failed to parse " DBUS_INTERFACE_DBUS ".NameOwnerChanged: %s", err.message);
goto fail;
}
if (pa_streq(name, UPOWER_SERVICE)) {
/* UPower disappeared from D-Bus */
if (old_owner && *old_owner) {
pa_log_debug("UPower disappeared from D-Bus");
b->battery_level = 0;
pa_hook_fire(pa_bluetooth_discovery_hook(b->discovery, PA_BLUETOOTH_HOOK_HOST_BATTERY_LEVEL_CHANGED), b);
}
/* UPower appeared on D-Bus */
if (new_owner && *new_owner) {
pa_log_debug("UPower appeared on D-Bus");
/* Update battery level */
pa_assert_se(m2 = dbus_message_new_method_call(UPOWER_SERVICE, UPOWER_DISPLAY_DEVICE_OBJECT, DBUS_INTERFACE_PROPERTIES, "Get"));
pa_assert_se(dbus_message_append_args(m2,
DBUS_TYPE_STRING, &upower_device_interface,
DBUS_TYPE_STRING, &percentage_property,
DBUS_TYPE_INVALID));
send_and_add_to_pending(b, m2, get_percentage_reply, NULL);
}
}
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
/* UPower battery level property updates */
} else if (dbus_message_is_signal(m, DBUS_INTERFACE_PROPERTIES, "PropertiesChanged")) {
DBusMessageIter arg_i, element_i;
if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "sa{sv}as")) {
pa_log_error("Invalid signature found in PropertiesChanged");
goto fail;
}
/* Skip interface name */
pa_assert_se(dbus_message_iter_next(&arg_i));
pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_ARRAY);
dbus_message_iter_recurse(&arg_i, &element_i);
/* Parse UPower property updates */
while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter dict_i, variant_i;
const char *key;
dbus_message_iter_recurse(&element_i, &dict_i);
/* Retrieve property name */
key = check_variant_property(&dict_i);
if (key == NULL) {
pa_log_error("Received invalid property!");
break;
}
dbus_message_iter_recurse(&dict_i, &variant_i);
if(pa_streq(path, UPOWER_DISPLAY_DEVICE_OBJECT)) {
pa_log_debug("UPower Device property updated: %s", key);
if(pa_streq(key, "Percentage"))
parse_percentage(b, &variant_i);
}
dbus_message_iter_next(&element_i);
}
}
fail:
dbus_error_free(&err);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
unsigned int pa_upower_get_battery_level(pa_upower_backend *backend) {
return backend->battery_level;
}
pa_upower_backend *pa_upower_backend_new(pa_core *c, pa_bluetooth_discovery *d) {
pa_upower_backend *backend;
DBusError err;
DBusMessage *m;
static const char* upower_device_interface = UPOWER_SERVICE UPOWER_DEVICE_INTERFACE;
static const char* percentage_property = "Percentage";
pa_log_debug("Native backend enabled UPower battery status reporting");
backend = pa_xnew0(pa_upower_backend, 1);
backend->core = c;
backend->discovery = d;
/* Get DBus connection */
dbus_error_init(&err);
if (!(backend->connection = pa_dbus_bus_get(c, DBUS_BUS_SYSTEM, &err))) {
pa_log("Failed to get D-Bus connection: %s", err.message);
dbus_error_free(&err);
pa_xfree(backend);
return NULL;
}
/* Add filter callback for DBus connection */
if (!dbus_connection_add_filter(pa_dbus_connection_get(backend->connection), filter_cb, backend, NULL)) {
pa_log_error("Failed to add filter function");
pa_dbus_connection_unref(backend->connection);
pa_xfree(backend);
return NULL;
}
/* Register for battery level changes from UPower */
if (pa_dbus_add_matches(pa_dbus_connection_get(backend->connection), &err,
"type='signal',sender='" DBUS_SERVICE_DBUS "',interface='" DBUS_INTERFACE_DBUS "',member='NameOwnerChanged',"
"arg0='" UPOWER_SERVICE "'",
"type='signal',sender='" UPOWER_SERVICE "',interface='" DBUS_INTERFACE_PROPERTIES "',member='PropertiesChanged'",
NULL) < 0) {
pa_log("Failed to add UPower D-Bus matches: %s", err.message);
dbus_connection_remove_filter(pa_dbus_connection_get(backend->connection), filter_cb, backend);
pa_dbus_connection_unref(backend->connection);
pa_xfree(backend);
return NULL;
}
/* Initialize battery level by requesting it from UPower */
pa_assert_se(m = dbus_message_new_method_call(UPOWER_SERVICE, UPOWER_DISPLAY_DEVICE_OBJECT, DBUS_INTERFACE_PROPERTIES, "Get"));
pa_assert_se(dbus_message_append_args(m,
DBUS_TYPE_STRING, &upower_device_interface,
DBUS_TYPE_STRING, &percentage_property,
DBUS_TYPE_INVALID));
send_and_add_to_pending(backend, m, get_percentage_reply, NULL);
return backend;
}
void pa_upower_backend_free(pa_upower_backend *backend) {
pa_assert(backend);
pa_dbus_free_pending_list(&backend->pending);
pa_dbus_connection_unref(backend->connection);
pa_xfree(backend);
}

View file

@ -0,0 +1,39 @@
#pragma once
/***
This file is part of PulseAudio.
Copyright 2022 Dylan Van Assche <me@dylanvanassche.be>
PulseAudio is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
PulseAudio is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
***/
#include "bluez5-util.h"
#define UPOWER_SERVICE "org.freedesktop.UPower"
#define UPOWER_DEVICE_INTERFACE ".Device"
#define UPOWER_DISPLAY_DEVICE_OBJECT "/org/freedesktop/UPower/devices/DisplayDevice"
struct pa_upower_backend {
pa_core *core;
pa_dbus_connection *connection;
pa_bluetooth_discovery *discovery;
unsigned int battery_level;
PA_LLIST_HEAD(pa_dbus_pending, pending);
};
pa_upower_backend *pa_upower_backend_new(pa_core *c, pa_bluetooth_discovery *d);
void pa_upower_backend_free(pa_upower_backend *backend);
unsigned int pa_upower_get_battery_level(pa_upower_backend *backend);

View file

@ -3,19 +3,28 @@
# even conditional ones).
# This library requires a symbol from module-echo-cancel, hence we need
# '-Wl,--unresolved-symbols=ignore-in-object-files' otherwise it fails
# '-Wl,--unresolved-symbols=ignore-in-object-files', or
# '-Wl,-undefined,dynamic_lookup' on macOS, otherwise it fails
# at link time.
add_languages('cpp')
libwebrtc_util_sources = [
'webrtc.cc'
]
if host_machine.system() == 'darwin'
ignore_unresolved_symbols_link_args = ['-Wl,-undefined,dynamic_lookup']
else
ignore_unresolved_symbols_link_args = ['-Wl,--unresolved-symbols=ignore-in-object-files']
endif
libwebrtc_util = shared_library('webrtc-util',
libwebrtc_util_sources,
cpp_args : [pa_c_args, server_c_args],
include_directories : [configinc, topinc],
dependencies : [libpulse_dep, libpulsecommon_dep, libpulsecore_dep, libatomic_ops_dep, webrtc_dep, libintl_dep],
link_args : [nodelete_link_args, '-Wl,--unresolved-symbols=ignore-in-object-files'],
link_args : [nodelete_link_args, ignore_unresolved_symbols_link_args],
install : true,
install_rpath : privlibdir,
install_dir : modlibexecdir,

View file

@ -2370,8 +2370,6 @@ int main(int argc, char* argv[]) {
}
u.ec->done(u.ec);
u.ec->msg->dead = true;
pa_echo_canceller_msg_unref(u.ec->msg);
out:
if (u.captured_file)

View file

@ -3,8 +3,8 @@
Copyright 2011 Collabora Ltd.
2015 Aldebaran SoftBank Group
Contributor: Arun Raghavan <mail@arunraghavan.net>
2020 Arun Raghavan <arun@asymptotic.io>
2020 Eero Nurkkala <eero.nurkkala@offcode.fi>
PulseAudio is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
@ -34,80 +34,47 @@ PA_C_DECL_BEGIN
#include "echo-cancel.h"
PA_C_DECL_END
#include <webrtc/modules/audio_processing/include/audio_processing.h>
#include <webrtc/modules/interface/module_common_types.h>
#include <webrtc/system_wrappers/include/trace.h>
#define WEBRTC_APM_DEBUG_DUMP 0
#include <modules/audio_processing/include/audio_processing.h>
#define BLOCK_SIZE_US 10000
#define DEFAULT_HIGH_PASS_FILTER true
#define DEFAULT_NOISE_SUPPRESSION true
#define DEFAULT_TRANSIENT_NOISE_SUPPRESSION true
#define DEFAULT_ANALOG_GAIN_CONTROL true
#define DEFAULT_DIGITAL_GAIN_CONTROL false
#define DEFAULT_MOBILE false
#define DEFAULT_ROUTING_MODE "speakerphone"
#define DEFAULT_COMFORT_NOISE true
#define DEFAULT_DRIFT_COMPENSATION false
#define DEFAULT_VAD true
#define DEFAULT_EXTENDED_FILTER false
#define DEFAULT_INTELLIGIBILITY_ENHANCER false
#define DEFAULT_EXPERIMENTAL_AGC false
#define DEFAULT_VAD false
#define DEFAULT_AGC_START_VOLUME 85
#define DEFAULT_BEAMFORMING false
#define DEFAULT_TRACE false
#define DEFAULT_POSTAMP_ENABLE false
#define DEFAULT_POSTAMP_GAIN_DB 0
#define DEFAULT_PREAMP_ENABLE false
#define DEFAULT_PREAMP_GAIN_DB 0
#define WEBRTC_AGC_MAX_VOLUME 255
#define WEBRTC_POSTAMP_GAIN_MAX_DB 90
#define WEBRTC_PREAMP_GAIN_MAX_DB 90
static const char* const valid_modargs[] = {
"high_pass_filter",
"noise_suppression",
"agc_start_volume",
"analog_gain_control",
"digital_gain_control",
"high_pass_filter",
"mobile",
"routing_mode",
"comfort_noise",
"drift_compensation",
"noise_suppression",
"post_amplifier",
"post_amplifier_gain",
"pre_amplifier",
"pre_amplifier_gain",
"transient_noise_suppression",
"voice_detection",
"extended_filter",
"intelligibility_enhancer",
"experimental_agc",
"agc_start_volume",
"beamforming",
"mic_geometry", /* documented in parse_mic_geometry() */
"target_direction", /* documented in parse_mic_geometry() */
"trace",
NULL
};
static int routing_mode_from_string(const char *rmode) {
if (pa_streq(rmode, "quiet-earpiece-or-headset"))
return webrtc::EchoControlMobile::kQuietEarpieceOrHeadset;
else if (pa_streq(rmode, "earpiece"))
return webrtc::EchoControlMobile::kEarpiece;
else if (pa_streq(rmode, "loud-earpiece"))
return webrtc::EchoControlMobile::kLoudEarpiece;
else if (pa_streq(rmode, "speakerphone"))
return webrtc::EchoControlMobile::kSpeakerphone;
else if (pa_streq(rmode, "loud-speakerphone"))
return webrtc::EchoControlMobile::kLoudSpeakerphone;
else
return -1;
}
class PaWebrtcTraceCallback : public webrtc::TraceCallback {
void Print(webrtc::TraceLevel level, const char *message, int length)
{
if (level & webrtc::kTraceError || level & webrtc::kTraceCritical)
pa_log("%s", message);
else if (level & webrtc::kTraceWarning)
pa_log_warn("%s", message);
else if (level & webrtc::kTraceInfo)
pa_log_info("%s", message);
else
pa_log_debug("%s", message);
}
};
static int webrtc_volume_from_pa(pa_volume_t v)
{
return (v * WEBRTC_AGC_MAX_VOLUME) / PA_VOLUME_NORM;
@ -120,8 +87,7 @@ static pa_volume_t webrtc_volume_to_pa(int v)
static void webrtc_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map,
pa_sample_spec *play_ss, pa_channel_map *play_map,
pa_sample_spec *out_ss, pa_channel_map *out_map,
bool beamforming)
pa_sample_spec *out_ss, pa_channel_map *out_map)
{
rec_ss->format = PA_SAMPLE_FLOAT32NE;
play_ss->format = PA_SAMPLE_FLOAT32NE;
@ -139,110 +105,22 @@ static void webrtc_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_ma
*out_ss = *rec_ss;
*out_map = *rec_map;
if (beamforming) {
/* The beamformer gives us a single channel */
out_ss->channels = 1;
pa_channel_map_init_mono(out_map);
}
/* Playback stream rate needs to be the same as capture */
play_ss->rate = rec_ss->rate;
}
static bool parse_point(const char **point, float (&f)[3]) {
int ret, length;
ret = sscanf(*point, "%g,%g,%g%n", &f[0], &f[1], &f[2], &length);
if (ret != 3)
return false;
/* Consume the bytes we've read so far */
*point += length;
return true;
}
static bool parse_mic_geometry(const char **mic_geometry, std::vector<webrtc::Point>& geometry) {
/* The microphone geometry is expressed as cartesian point form:
* x1,y1,z1,x2,y2,z2,...
*
* Where x1,y1,z1 is the position of the first microphone with regards to
* the array's "center", x2,y2,z2 the position of the second, and so on.
*
* 'x' is the horizontal coordinate, with positive values being to the
* right from the mic array's perspective.
*
* 'y' is the depth coordinate, with positive values being in front of the
* array.
*
* 'z' is the vertical coordinate, with positive values being above the
* array.
*
* All distances are in meters.
*/
/* The target direction is expected to be in spherical point form:
* a,e,r
*
* Where 'a' is the azimuth of the target point relative to the center of
* the array, 'e' its elevation, and 'r' the radius.
*
* 0 radians azimuth is to the right of the array, and positive angles
* move in a counter-clockwise direction.
*
* 0 radians elevation is horizontal w.r.t. the array, and positive
* angles go upwards.
*
* radius is distance from the array center in meters.
*/
long unsigned int i;
float f[3];
for (i = 0; i < geometry.size(); i++) {
if (!parse_point(mic_geometry, f)) {
pa_log("Failed to parse channel %lu in mic_geometry", i);
return false;
}
/* Except for the last point, we should have a trailing comma */
if (i != geometry.size() - 1) {
if (**mic_geometry != ',') {
pa_log("Failed to parse channel %lu in mic_geometry", i);
return false;
}
(*mic_geometry)++;
}
pa_log_debug("Got mic #%lu position: (%g, %g, %g)", i, f[0], f[1], f[2]);
geometry[i].c[0] = f[0];
geometry[i].c[1] = f[1];
geometry[i].c[2] = f[2];
}
if (**mic_geometry != '\0') {
pa_log("Failed to parse mic_geometry value: more parameters than expected");
return false;
}
return true;
}
bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
pa_sample_spec *rec_ss, pa_channel_map *rec_map,
pa_sample_spec *play_ss, pa_channel_map *play_map,
pa_sample_spec *out_ss, pa_channel_map *out_map,
uint32_t *nframes, const char *args) {
webrtc::AudioProcessing *apm = NULL;
webrtc::AudioProcessing *apm = webrtc::AudioProcessingBuilder().Create();
webrtc::ProcessingConfig pconfig;
webrtc::Config config;
bool hpf, ns, agc, dgc, mobile, cn, vad, ext_filter, intelligibility, experimental_agc, beamforming;
int rm = -1, i;
uint32_t agc_start_volume;
webrtc::AudioProcessing::Config config;
bool hpf, ns, tns, agc, dgc, mobile, pre_amp, vad, post_amp;
int i;
uint32_t agc_start_volume, pre_amp_gain, post_amp_gain;
pa_modargs *ma;
bool trace = false;
if (!(ma = pa_modargs_new(args, valid_modargs))) {
pa_log("Failed to parse submodule arguments.");
@ -261,6 +139,12 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
goto fail;
}
tns = DEFAULT_TRANSIENT_NOISE_SUPPRESSION;
if (pa_modargs_get_value_boolean(ma, "transient_noise_suppression", &tns) < 0) {
pa_log("Failed to parse transient_noise_suppression value");
goto fail;
}
agc = DEFAULT_ANALOG_GAIN_CONTROL;
if (pa_modargs_get_value_boolean(ma, "analog_gain_control", &agc) < 0) {
pa_log("Failed to parse analog_gain_control value");
@ -278,6 +162,36 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
goto fail;
}
pre_amp = DEFAULT_PREAMP_ENABLE;
if (pa_modargs_get_value_boolean(ma, "pre_amplifier", &pre_amp) < 0) {
pa_log("Failed to parse pre_amplifier value");
goto fail;
}
pre_amp_gain = DEFAULT_PREAMP_GAIN_DB;
if (pa_modargs_get_value_u32(ma, "pre_amplifier_gain", &pre_amp_gain) < 0) {
pa_log("Failed to parse pre_amplifier_gain value");
goto fail;
}
if (pre_amp_gain > WEBRTC_PREAMP_GAIN_MAX_DB) {
pa_log("Preamp gain must not exceed %u", WEBRTC_PREAMP_GAIN_MAX_DB);
goto fail;
}
post_amp = DEFAULT_POSTAMP_ENABLE;
if (pa_modargs_get_value_boolean(ma, "post_amplifier", &post_amp) < 0) {
pa_log("Failed to parse post_amplifier value");
goto fail;
}
post_amp_gain = DEFAULT_POSTAMP_GAIN_DB;
if (pa_modargs_get_value_u32(ma, "post_amplifier_gain", &post_amp_gain) < 0) {
pa_log("Failed to parse post_amplifier_gain value");
goto fail;
}
if (post_amp_gain > WEBRTC_POSTAMP_GAIN_MAX_DB) {
pa_log("Postamp gain must not exceed %u", WEBRTC_POSTAMP_GAIN_MAX_DB);
goto fail;
}
mobile = DEFAULT_MOBILE;
if (pa_modargs_get_value_boolean(ma, "mobile", &mobile) < 0) {
pa_log("Failed to parse mobile value");
@ -285,33 +199,6 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
}
ec->params.drift_compensation = DEFAULT_DRIFT_COMPENSATION;
if (pa_modargs_get_value_boolean(ma, "drift_compensation", &ec->params.drift_compensation) < 0) {
pa_log("Failed to parse drift_compensation value");
goto fail;
}
if (mobile) {
if (ec->params.drift_compensation) {
pa_log("Can't use drift_compensation in mobile mode");
goto fail;
}
if ((rm = routing_mode_from_string(pa_modargs_get_value(ma, "routing_mode", DEFAULT_ROUTING_MODE))) < 0) {
pa_log("Failed to parse routing_mode value");
goto fail;
}
cn = DEFAULT_COMFORT_NOISE;
if (pa_modargs_get_value_boolean(ma, "comfort_noise", &cn) < 0) {
pa_log("Failed to parse cn value");
goto fail;
}
} else {
if (pa_modargs_get_value(ma, "comfort_noise", NULL) || pa_modargs_get_value(ma, "routing_mode", NULL)) {
pa_log("The routing_mode and comfort_noise options are only valid with mobile=true");
goto fail;
}
}
vad = DEFAULT_VAD;
if (pa_modargs_get_value_boolean(ma, "voice_detection", &vad) < 0) {
@ -319,24 +206,6 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
goto fail;
}
ext_filter = DEFAULT_EXTENDED_FILTER;
if (pa_modargs_get_value_boolean(ma, "extended_filter", &ext_filter) < 0) {
pa_log("Failed to parse extended_filter value");
goto fail;
}
intelligibility = DEFAULT_INTELLIGIBILITY_ENHANCER;
if (pa_modargs_get_value_boolean(ma, "intelligibility_enhancer", &intelligibility) < 0) {
pa_log("Failed to parse intelligibility_enhancer value");
goto fail;
}
experimental_agc = DEFAULT_EXPERIMENTAL_AGC;
if (pa_modargs_get_value_boolean(ma, "experimental_agc", &experimental_agc) < 0) {
pa_log("Failed to parse experimental_agc value");
goto fail;
}
agc_start_volume = DEFAULT_AGC_START_VOLUME;
if (pa_modargs_get_value_u32(ma, "agc_start_volume", &agc_start_volume) < 0) {
pa_log("Failed to parse agc_start_volume value");
@ -348,82 +217,7 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
}
ec->params.webrtc.agc_start_volume = agc_start_volume;
beamforming = DEFAULT_BEAMFORMING;
if (pa_modargs_get_value_boolean(ma, "beamforming", &beamforming) < 0) {
pa_log("Failed to parse beamforming value");
goto fail;
}
if (ext_filter)
config.Set<webrtc::ExtendedFilter>(new webrtc::ExtendedFilter(true));
if (intelligibility)
pa_log_warn("The intelligibility enhancer is not currently supported");
if (experimental_agc)
config.Set<webrtc::ExperimentalAgc>(new webrtc::ExperimentalAgc(true, ec->params.webrtc.agc_start_volume));
trace = DEFAULT_TRACE;
if (pa_modargs_get_value_boolean(ma, "trace", &trace) < 0) {
pa_log("Failed to parse trace value");
goto fail;
}
if (trace) {
webrtc::Trace::CreateTrace();
webrtc::Trace::set_level_filter(webrtc::kTraceAll);
ec->params.webrtc.trace_callback = new PaWebrtcTraceCallback();
webrtc::Trace::SetTraceCallback((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback);
}
webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map, beamforming);
/* We do this after fixate because we need the capture channel count */
if (beamforming) {
std::vector<webrtc::Point> geometry(rec_ss->channels);
webrtc::SphericalPointf direction(0.0f, 0.0f, 0.0f);
const char *mic_geometry, *target_direction;
if (!(mic_geometry = pa_modargs_get_value(ma, "mic_geometry", NULL))) {
pa_log("mic_geometry must be set if beamforming is enabled");
goto fail;
}
if (!parse_mic_geometry(&mic_geometry, geometry)) {
pa_log("Failed to parse mic_geometry value");
goto fail;
}
if ((target_direction = pa_modargs_get_value(ma, "target_direction", NULL))) {
float f[3];
if (!parse_point(&target_direction, f)) {
pa_log("Failed to parse target_direction value");
goto fail;
}
if (*target_direction != '\0') {
pa_log("Failed to parse target_direction value: more parameters than expected");
goto fail;
}
#define IS_ZERO(f) ((f) < 0.000001 && (f) > -0.000001)
if (!IS_ZERO(f[1]) || !IS_ZERO(f[2])) {
pa_log("The beamformer currently only supports targeting along the azimuth");
goto fail;
}
direction.s[0] = f[0];
direction.s[1] = f[1];
direction.s[2] = f[2];
}
if (!target_direction)
config.Set<webrtc::Beamforming>(new webrtc::Beamforming(true, geometry));
else
config.Set<webrtc::Beamforming>(new webrtc::Beamforming(true, geometry, direction));
}
apm = webrtc::AudioProcessing::Create(config);
webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map);
pconfig = {
webrtc::StreamConfig(rec_ss->rate, rec_ss->channels, false), /* input stream */
@ -436,46 +230,62 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
goto fail;
}
if (pre_amp) {
config.pre_amplifier.enabled = true;
config.pre_amplifier.fixed_gain_factor = (float)pre_amp_gain;
} else
config.pre_amplifier.enabled = false;
if (hpf)
apm->high_pass_filter()->Enable(true);
config.high_pass_filter.enabled = true;
else
config.high_pass_filter.enabled = false;
if (!mobile) {
apm->echo_cancellation()->enable_drift_compensation(ec->params.drift_compensation);
apm->echo_cancellation()->Enable(true);
} else {
apm->echo_control_mobile()->set_routing_mode(static_cast<webrtc::EchoControlMobile::RoutingMode>(rm));
apm->echo_control_mobile()->enable_comfort_noise(cn);
apm->echo_control_mobile()->Enable(true);
}
config.echo_canceller.enabled = true;
config.pipeline.multi_channel_capture = rec_ss->channels > 1;
config.pipeline.multi_channel_render = play_ss->channels > 1;
if (ns) {
apm->noise_suppression()->set_level(webrtc::NoiseSuppression::kHigh);
apm->noise_suppression()->Enable(true);
}
if (!mobile)
config.echo_canceller.mobile_mode = false;
else
config.echo_canceller.mobile_mode = true;
if (agc || dgc) {
if (mobile && rm <= webrtc::EchoControlMobile::kEarpiece) {
/* Maybe this should be a knob, but we've got a lot of knobs already */
apm->gain_control()->set_mode(webrtc::GainControl::kFixedDigital);
ec->params.webrtc.agc = false;
} else if (dgc) {
apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveDigital);
ec->params.webrtc.agc = false;
} else {
apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveAnalog);
if (apm->gain_control()->set_analog_level_limits(0, WEBRTC_AGC_MAX_VOLUME) !=
webrtc::AudioProcessing::kNoError) {
pa_log("Failed to initialise AGC");
goto fail;
}
ec->params.webrtc.agc = true;
}
if (ns)
config.noise_suppression.enabled = true;
else
config.noise_suppression.enabled = false;
apm->gain_control()->Enable(true);
if (tns)
config.transient_suppression.enabled = true;
else
config.transient_suppression.enabled = false;
if (dgc) {
ec->params.webrtc.agc = false;
config.gain_controller1.enabled = true;
if (mobile)
config.gain_controller1.mode = webrtc::AudioProcessing::Config::GainController1::kFixedDigital;
else
config.gain_controller1.mode = webrtc::AudioProcessing::Config::GainController1::kAdaptiveDigital;
} else if (agc) {
ec->params.webrtc.agc = true;
config.gain_controller1.enabled = true;
config.gain_controller1.mode = webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog;
config.gain_controller1.analog_level_minimum = 0;
config.gain_controller1.analog_level_maximum = WEBRTC_AGC_MAX_VOLUME;
}
if (vad)
apm->voice_detection()->Enable(true);
config.voice_detection.enabled = true;
else
config.voice_detection.enabled = false;
if (post_amp) {
config.gain_controller2.enabled = true;
config.gain_controller2.fixed_digital.gain_db = (float)post_amp_gain;
config.gain_controller2.adaptive_digital.enabled = false;
} else
config.gain_controller2.enabled = false;
ec->params.webrtc.apm = apm;
ec->params.webrtc.rec_ss = *rec_ss;
@ -485,6 +295,8 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
*nframes = ec->params.webrtc.blocksize;
ec->params.webrtc.first = true;
apm->ApplyConfig(config);
for (i = 0; i < rec_ss->channels; i++)
ec->params.webrtc.rec_buffer[i] = pa_xnew(float, *nframes);
for (i = 0; i < play_ss->channels; i++)
@ -496,10 +308,7 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
fail:
if (ma)
pa_modargs_free(ma);
if (ec->params.webrtc.trace_callback) {
webrtc::Trace::ReturnTrace();
delete ((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback);
} if (apm)
if (apm)
delete apm;
return false;
@ -515,12 +324,6 @@ void pa_webrtc_ec_play(pa_echo_canceller *ec, const uint8_t *play) {
pa_deinterleave(play, (void **) buf, ss->channels, pa_sample_size(ss), n);
pa_assert_se(apm->ProcessReverseStream(buf, config, config, buf) == webrtc::AudioProcessing::kNoError);
/* FIXME: If ProcessReverseStream() makes any changes to the audio, such as
* applying intelligibility enhancement, those changes don't have any
* effect. This function is called at the source side, but the processing
* would have to be done in the sink to be able to feed the processed audio
* to speakers. */
}
void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out) {
@ -538,7 +341,7 @@ void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out
if (ec->params.webrtc.agc) {
pa_volume_t v = pa_echo_canceller_get_capture_volume(ec);
old_volume = webrtc_volume_from_pa(v);
apm->gain_control()->set_stream_analog_level(old_volume);
apm->set_stream_analog_level(old_volume);
}
apm->set_stream_delay_ms(0);
@ -553,7 +356,7 @@ void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out
ec->params.webrtc.first = false;
new_volume = ec->params.webrtc.agc_start_volume;
} else {
new_volume = apm->gain_control()->stream_analog_level();
new_volume = apm->recommended_stream_analog_level();
}
if (old_volume != new_volume)
@ -564,9 +367,6 @@ void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out
}
void pa_webrtc_ec_set_drift(pa_echo_canceller *ec, float drift) {
webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm;
apm->echo_cancellation()->set_stream_drift_samples(drift * ec->params.webrtc.blocksize);
}
void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) {
@ -577,11 +377,6 @@ void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *
void pa_webrtc_ec_done(pa_echo_canceller *ec) {
int i;
if (ec->params.webrtc.trace_callback) {
webrtc::Trace::ReturnTrace();
delete ((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback);
}
if (ec->params.webrtc.apm) {
delete (webrtc::AudioProcessing*)ec->params.webrtc.apm;
ec->params.webrtc.apm = NULL;

View file

@ -8,15 +8,12 @@ all_modules = [
[ 'module-always-sink', 'module-always-sink.c' ],
[ 'module-always-source', 'module-always-source.c' ],
[ 'module-augment-properties', 'module-augment-properties.c' ],
# [ 'module-bonjour-publish', 'macosx/module-bonjour-publish.c' ],
[ 'module-card-restore', 'module-card-restore.c' ],
[ 'module-cli', 'module-cli.c', [], [], [], libcli ],
[ 'module-cli-protocol-tcp', 'module-protocol-stub.c', [], ['-DUSE_PROTOCOL_CLI', '-DUSE_TCP_SOCKETS'], [], libprotocol_cli ],
[ 'module-cli-protocol-unix', 'module-protocol-stub.c', [], ['-DUSE_PROTOCOL_CLI', '-DUSE_UNIX_SOCKETS'], [], libprotocol_cli ],
[ 'module-combine', 'module-combine.c' ],
[ 'module-combine-sink', 'module-combine-sink.c' ],
# [ 'module-coreaudio-detect', 'macosx/module-coreaudio-detect.c' ],
# [ 'module-coreaudio-device', 'macosx/module-coreaudio-device.c' ],
[ 'module-combine-sink', 'module-combine-sink.c', [], [], [libatomic_ops_dep] ],
[ 'module-default-device-restore', 'module-default-device-restore.c', [], [], [], libprotocol_native ],
[ 'module-detect', 'module-detect.c' ],
[ 'module-device-manager', 'module-device-manager.c', [], [], [], libprotocol_native ],
@ -73,11 +70,21 @@ endif
if host_machine.system() != 'windows'
all_modules += [
[ 'module-rtp-recv', 'rtp/module-rtp-recv.c', [], [], [], librtp ],
[ 'module-rtp-recv', 'rtp/module-rtp-recv.c', [], [], [libatomic_ops_dep], librtp ],
[ 'module-rtp-send', 'rtp/module-rtp-send.c' , [], [], [], librtp ],
]
endif
if host_machine.system() == 'darwin'
bonjour_dep = dependency('appleframeworks', modules : ['CoreFoundation'])
coreaudio_dep = dependency('appleframeworks', modules : ['CoreAudio'])
all_modules += [
[ 'module-bonjour-publish', 'macosx/module-bonjour-publish.c', [], [], [bonjour_dep] ],
[ 'module-coreaudio-detect', 'macosx/module-coreaudio-detect.c', [], [], [coreaudio_dep] ],
[ 'module-coreaudio-device', 'macosx/module-coreaudio-device.c', [], [], [coreaudio_dep] ],
]
endif
# Modules enabled by headers
if cc.has_header('linux/input.h')
@ -130,7 +137,6 @@ endif
if dbus_dep.found()
all_modules += [
[ 'module-console-kit', 'module-console-kit.c', [], [], [dbus_dep] ],
[ 'module-dbus-protocol',
[ 'dbus/iface-card.c', 'dbus/iface-card.h',
'dbus/iface-card-profile.c', 'dbus/iface-card-profile.h',
@ -147,6 +153,12 @@ if dbus_dep.found()
[], [], [dbus_dep] ],
[ 'module-rygel-media-server', 'module-rygel-media-server.c', [], [], [dbus_dep], libprotocol_http ],
]
if not get_option('consolekit').disabled()
all_modules += [
[ 'module-console-kit', 'module-console-kit.c', [], [], [dbus_dep] ],
]
endif
endif
if fftw_dep.found()
@ -238,7 +250,7 @@ module_echo_cancel_sources = [
]
module_echo_cancel_orc_sources = []
module_echo_cancel_flags = []
module_echo_cancel_deps = []
module_echo_cancel_deps = [libatomic_ops_dep]
module_echo_cancel_libs = []
if get_option('adrian-aec')
@ -293,6 +305,18 @@ all_modules += [
# FIXME: meson doesn't support multiple RPATH arguments currently
rpath_dirs = join_paths(privlibdir) + ':' + join_paths(modlibexecdir)
if host_machine.system() != 'windows' and host_machine.system() != 'darwin'
no_undefined_args = ['-Wl,--no-undefined']
else
no_undefined_args = []
endif
module_suffix = []
if host_machine.system() == 'darwin'
# meson defaults to dylib but ltdl expects so
module_suffix = 'so'
endif
foreach m : all_modules
name = m[0]
sources = m[1]
@ -310,8 +334,9 @@ foreach m : all_modules
install_rpath : rpath_dirs,
install_dir : modlibexecdir,
dependencies : [thread_dep, libpulse_dep, libpulsecommon_dep, libpulsecore_dep, libintl_dep, platform_dep, platform_socket_dep] + extra_deps,
link_args : [nodelete_link_args, '-Wl,--no-undefined' ],
link_args : [nodelete_link_args, no_undefined_args],
link_with : extra_libs,
name_prefix : '',
name_suffix : module_suffix,
implicit_include_directories : false)
endforeach

View file

@ -23,6 +23,7 @@
#include <stdio.h>
#include <errno.h>
#include <math.h>
#include <pulse/rtclock.h>
#include <pulse/timeval.h>
@ -178,7 +179,7 @@ struct userdata {
#ifdef USE_SMOOTHER_2
pa_smoother_2 *smoother;
#else
pa_smoother *smoother;
pa_smoother *smoother;
#endif
uint64_t counter;
@ -239,7 +240,7 @@ static uint32_t rate_controller(
/* Choose the rate that is nearer to base_rate */
new_rate = new_rate_2;
if (abs(new_rate_1 - base_rate) < abs(new_rate_2 - base_rate))
if (fabs(new_rate_1 - base_rate) < fabs(new_rate_2 - base_rate))
new_rate = new_rate_1;
return (uint32_t)(new_rate + 0.5);
@ -1710,9 +1711,6 @@ int pa__init(pa_module*m) {
PA_IDXSET_FOREACH(o, u->outputs, idx)
output_verify(o);
if (u->adjust_time > 0)
u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time, time_callback, u);
pa_modargs_free(ma);
return 0;
@ -1735,6 +1733,9 @@ void pa__done(pa_module*m) {
if (!(u = m->userdata))
return;
if (u->sink && PA_SINK_IS_LINKED(u->sink->state))
pa_sink_suspend(u->sink, true, PA_SUSPEND_UNAVAILABLE);
pa_strlist_free(u->unlinked_slaves);
if (u->sink_put_slot)

View file

@ -100,7 +100,7 @@ static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, void*
/* No default sink, nothing to move away, just set the new default */
if (!c->default_sink) {
pa_core_set_configured_default_sink(c, sink->name);
pa_core_set_policy_default_sink(c, sink->name);
return PA_HOOK_OK;
}
@ -116,7 +116,7 @@ static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, void*
}
/* Actually do the switch to the new sink */
pa_core_set_configured_default_sink(c, sink->name);
pa_core_set_policy_default_sink(c, sink->name);
return PA_HOOK_OK;
}
@ -160,7 +160,7 @@ static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source,
/* No default source, nothing to move away, just set the new default */
if (!c->default_source) {
pa_core_set_configured_default_source(c, source->name);
pa_core_set_policy_default_source(c, source->name);
return PA_HOOK_OK;
}
@ -176,7 +176,7 @@ static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source,
}
/* Actually do the switch to the new source */
pa_core_set_configured_default_source(c, source->name);
pa_core_set_policy_default_source(c, source->name);
return PA_HOOK_OK;
}

Some files were not shown because too many files have changed in this diff Show more