LINUX.ORG.RU

apulse

 ,


23

13

Everyone! Listen up! Today... today...

$ apulse <program-name> [program parameters]

https://github.com/i-rinat/apulse — эмуляция PulseAudio. Когда приложение пытается загрузить libpulse.so, ему подсовывают её версию от apulse, в которой реализована часть функций, достаточная, чтобы запустить Skype и некоторый другой софт.

★★★★★

Последнее исправление: i-rinat (всего исправлений: 2)

Ответ на: комментарий от anonymous

геморно ставить -дев:32 на 64битную бубунту

Это гораздо проще, чем выковыривать GLib из кода. Ставишь libglib2.0-dev:amd64, libglib2.0-0:i386, а потом делаешь симлинк:

# ln -s /lib/i386-linux-gnu/libglib-2.0.so.0 /lib/i386-linux-gnu/libglib-2.0.so

проще пульсу обратно поставить.

А зачем ты её удалял?

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от anonymous

а почему может отваливаться микрофон?

Без понятия. В issues на Github есть один баг. Там у человека не работает USB микрофон в Skype. Самое странное там состоит в том, что в дампе данных, которые читаются с микрофона и отсылаются в Skype, звук есть. Если файл затолкать в aplay, слышно всё, что захватил микрофон.

Либо Skype решил притвориться глухим, либо что-то его вынуждает приглушать громкость.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

у родителей в Скайпе с пульсой звук отвалился в USB-камере. ничего не помогало: удалили пульсу, поставил apulse, прописал параметры, опана, и звук есть.

Deleted
()
Ответ на: комментарий от O02eg

Зачем? ALSA и сама умеет выводить в гарнитуру. Правда, я не ковырял еще ввод, но вывод несложно реализуется через механизм хуков.

yars068 ★★★★
()
Ответ на: комментарий от Gonzo

Waterlaz, твоя штука тоже не помогает почему-то. Если что: Debian 7 Wheezy, pulseaudio нет.

Моя штука работает только на OSSv4. Эмуляция oss из alsa не работает.

Waterlaz ★★★★★
()
Ответ на: комментарий от aplay

Ъ по ссылкам не ходят, даже если они же сами на них ссылаются.

O02eg ★★★★★
()
6 августа 2015 г.

Вот спасибо, добрый человек! В Qt5.5 с оф. сайта libQt5Multimedia.so с пульсой слинковано, на слабеньком ноуте неохота было ни Qt пересобирать, ни pulseaudio ставить, а тут раз — и всё работает.

fluorite ★★★★★
()
Ответ на: комментарий от anonymous

а некоторые до сих пор не смирились со своей внутренней любовью к pulseaudio

anonymous
()

помоему пора пилить конфу(если в них ещё сидят) имени i-rinat, да консультироваться там у него, как делать что-то для удобства, а не ныть на форумах о том, когда разработчики очередную пульсу починят

Dred ★★★★★
()

Че там у FreeBSD? И вообще, OpenBSD и NetBSD и может даже к юниксам? :-)
А то люди бегут на фряшку от лени, а все равно пульсу ставить приходиться )

mystery ★★
()
Ответ на: комментарий от mystery

Че там у FreeBSD?

# pkg rquery %v pulseaudio
6.0_2
 pkg rquery %rn pulseaudio
pavucontrol
obs-studio
xpra
gstreamer1-plugins-pulse
paman
gmerlin
lives
gstreamer-plugins-pulse
empathy
pavumeter
quisk
cinnamon
gnunet
xfce4-pulseaudio-plugin
gtick
gnome-settings-daemon
aegisub
qmmp
qt4-mobility
twpsk
cinnamon-control-center
deforaos-phone
paprefs
gnome-media
squeak
xfce4-volumed-pulse
cinnamon-settings-daemon
gnome-shell

Так что вполне нормально, если не ставить третий гнум.
К тому же, частичто изэтого софта пульса выпиливается втыком нужных опций и пересборкой:

pkg roptions gnome-media aegisub 
gnome-media - PULSEAUDIO: on
aegisub - ALSA: off
aegisub - DOCS: on
aegisub - FFMPEG: on
aegisub - FFTW: on
aegisub - HUNSPELL: on
aegisub - OPENAL: off
aegisub - PORTAUDIO: off
aegisub - PULSEAUDIO: on
А так - половина кед, гтк2 и гтк3, кутя четвертая и пятая - но пульса не подтянулась.

anonymous
()
Ответ на: комментарий от yars068

Ну, для меня это приятная новость, конечно, но до этого ни у кого не работало)

Waterlaz ★★★★★
()
28 сентября 2015 г.

А bluetooth с apulse никак не подружить? хочу звук на колонки по bluetooth передать а bluez 5x без пульсы жить не может

irton ★★★★★
()
Ответ на: комментарий от irton

а bluez 5x без пульсы жить не может

Поглядел я на bluez. И не нашёл вызовов PulseAudio. Наоборот, в PulseAudio есть backend для bluez. Фактически, он использует bluez как ещё одну аудиокарту.

Чисто технически можно исправить apulse так, чтобы он умел выводить звук и в ALSA, и в Bluez. Но если с ALSA можно положиться на dmix, то с Bluez такое может не прокатить. Нужно будет как-то синхронизироваться, чтобы несколько клиентов могли воспроизводить звук через один слив. То есть нужно сделать отдельный демон, который будет принимать через несколько соединений несколько потоков, микшировать их и выводить в Bluez или ALSA, согласно настройкам. Настройки надо где-то хранить и как-то менять. Voilà! Ещё один PulseAudio!

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

нужен демон

Но ведь alsa вроде бы никаких демонов не использует и при этом может выводить в неблокирующем режиме... А еще наверняка есть различия в реализациях bluez 4 и 5.

yars068 ★★★★
()
Ответ на: комментарий от i-rinat

https://wiki.archlinux.org/index.php/Bluetooth_headset

я смотрел этот мануал, и у меня как раз выдало ошибку a2dp-sync которая описана в арчевики

в соседней новости ЛОРа поповоду выхода пульсы 7.0 тоже упоминают что bluez5 не хочет в alsa.

irton ★★★★★
()
Ответ на: комментарий от yars068

Но ведь alsa вроде бы никаких демонов не использует и при этом может выводить в неблокирующем режиме

У ALSA точка встречи потоков находится либо в ядре (dmix), либо в самом аудиоадаптере (аппаратный микшер). А вот про Bluez ничего уверенно сказать не могу, но мне кажется, что у него интерфейс через D-Bus, то есть в userspace.

Как-то я себе плохо это всё представляю.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от irton

bluez5 не хочет в alsa

Почитал ещё. Тут скорее ALSA не хочет в Bluez 5. Самому Bluez всё равно, кто его использует, он предоставляет API и всё. Нужно плагин для ALSA писать. Он раньше был в составе Bluez, но, видимо, им надоело им заниматься.

i-rinat ★★★★★
() автор топика
3 февраля 2016 г.

Привет! Вот лог сборки, а вот ошибка:

kanotix@Kanotix:~/skype-4.3.0.37$ ./skype
./skype: symbol lookup error: /usr/lib/libpulse.so.0: undefined symbol: snd_pcm_avail
kanotix@Kanotix:~/skype-4.3.0.37$

Я ничего не требую, так как обновить libasound2 мне необходимо в любом случае. Потому что во-первых, версию 1.0.24 требует Google Chrome, а мне его в любом случае устанавливать сюда для эмулятора Android. Во-вторых, потому что даже в SLED 11 (2009 года) уже 1.1.0.

Запостил просто чтобы ты знал. Может, сделаешь проверку на наличие этой функции. Может, пофиксишь (если это возможно).

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от ZenitharChampion

Эту функцию в 1.0.18 добавили. Её можно заменить на последовательные вызовы snd_pcm_hwsync() и snd_pcm_avail_update(). Но snd_pcm_hwsync() уже объявлена устаревшей, так что её использовать не хочется.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Бывают же условия «если версия такая-то, то это, а иначе то»? Вот для GTK, вот для GCC:

# if __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4
...
#else
...
#endif

Может и с libasound2 прокатит?

Спасибо за наводку, пойду вкорячивать :-)

ZenitharChampion ★★★★★
()

Вкорячил

--- a/src/apulse-stream.c  2015-12-19 19:45:50.000000000 +0000
+++ b/src/apulse-stream.c  2016-02-03 17:27:24.743612261 +0000
@@ -78,7 +78,7 @@
     int                 paused = g_atomic_int_get(&s->paused);

     if (events & (PA_IO_EVENT_INPUT | PA_IO_EVENT_OUTPUT)) {
-        frame_count = snd_pcm_avail(s->ph);
+        frame_count = snd_pcm_hwsync(s->ph), snd_pcm_avail_update(s->ph);
         if (frame_count < 0) {
             if (frame_count == -EBADFD) {
                 // stream was closed
@@ -90,7 +90,7 @@
                 cnt ++;
                 ret = snd_pcm_recover(s->ph, frame_count, 1);
             } while (ret == -1 && errno == EINTR && cnt < 5);
-            frame_count = snd_pcm_avail(s->ph);
+            frame_count = snd_pcm_hwsync(s->ph), snd_pcm_avail_update(s->ph);
             if (frame_count < 0) {
                 trace_error("%s, can't recover after failed snd_pcm_avail (%d)\n", __func__,
                             (int)frame_count);

Не работает :-( Программа запускается, но тестовый звук не воспроизводится.

ZenitharChampion ★★★★★
()

Спустя минут 20-30 разговора в skype меня перестают слышать.
Помогает кнопка завершить звонок/переподключиться к разговору.

Ошибок вроде бы никаких не вываливается, как можно отследить причину?

afterlanding ★★
()
Ответ на: комментарий от afterlanding

В настройках Skype, во вкладке «Устройства» есть галочка «Позволить Skype автоматически подстраивать громкость». Если она установлена, её надо убрать.

Эта часть API, управление громкостью, не реализована. Я пробовал её включать, но что-то там было не так, и Skype почему-то убирал звук совсем.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от afterlanding

Есть похожий багрепорт: https://github.com/i-rinat/apulse/issues/33

В голову приходит только дампить собранные с микрофона данные в файл, чтобы потом проверить, не пропадают ли они там. Подозреваю, что они там всё же будут. В конце концов, раз в apulse нет управления громкостью, ни программного, ни аппаратного. Шанс того, что это ALSA перестаёт данные отдавать, уж очень маленький. Есть шанс того, что в apulse где-то пропущена обработка ошибок от ALSA, но я таких мест не вижу.

i-rinat ★★★★★
() автор топика
Ответ на: Вкорячил от ZenitharChampion

Попробовал сейчас на своей системе заменить snd_pcm_avail на комбинацию snd_pcm_hwsync+snd_pcm_avail_update. Mpv музыку играет. И даже без snd_pcm_hwsync работает.

Возможно, дело в чём-то другом.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

Покажешь как менял?

Вот так: https://github.com/i-rinat/apulse/commit/340e65d58b501710353dd0fbe97090f40170...

Кстати, прикол. Я было хотел написать, что менял так же как ты, но потом решил ещё раз проверить. И так как запятую никогда не использую, баг не увидел, ни в первый раз, ни в последующие.

В выражении frame_count = snd_pcm_hwsync(s->ph), snd_pcm_avail_update(s->ph); сначала выполнятся snd_pcm_hwsync(), затем её результат присваивается переменной frame_count. Потом выполняется snd_pcm_avail_update(), и её результат становится результатом всего выражения. Но это значение не используется. Для починки надо ещё скобки поставить: frame_count = (snd_pcm_hwsync(s->ph), snd_pcm_avail_update(s->ph));.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

В смысле? Ну, я ж недавно собирал твой релиз (может в конце того года, не помню точно) плюс у меня Deb7. А что не так? Сорри, если туплю )

Gonzo ★★★★★
()
Ответ на: комментарий от Gonzo

Предпоследний коммит был сделан 19 декабря 2015 года, с тех пор до сегодняшнего дня новых не было. Сегодня добавил один патч, который должен позволить собираться с ALSA версий 1.0.17 и старше. Эту версию ALSA выпустили семь лет назад.

Просто ZenitharChampion любит играться с древними дистрибутивами. А мне вот сегодня напомнили о существовании apulse, и я решил — почему бы и не добавить. Изменения небольшие.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Ааа... я видать не так понял, подумал, что ты починил это:

Спустя минут 20-30 разговора в skype меня перестают слышать.

Просто тоже один раз такое отлавливал. Правда, оно для меня не критично, т.к. звуком в скайпе пользуюсь раз в пятилетку.

Gonzo ★★★★★
()
Ответ на: комментарий от i-rinat

A у меня вот такая проблема

При попытке собрать получается это

  
alexlu@alexlu-OEM:~/apulse-master/build$ make
[  6%] Built target trace-helper
Linking C shared library libpulse.so
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../libasound.so when searching for -lasound
/usr/bin/ld: skipping incompatible /usr/lib/libasound.so when searching for -lasound
/usr/bin/ld: cannot find -lasound
collect2: error: ld returned 1 exit status
CMakeFiles/pulse.dir/build.make:386: ошибка выполнения рецепта для цели «libpulse.so.0»
make[2]: *** [libpulse.so.0] Ошибка 1
CMakeFiles/Makefile2:60: ошибка выполнения рецепта для цели «CMakeFiles/pulse.dir/all»
make[1]: *** [CMakeFiles/pulse.dir/all] Ошибка 2
Makefile:117: ошибка выполнения рецепта для цели «all»
make: *** [all] Ошибка 2
alexlu@alexlu-OEM:~/apulse-master/build$ 


Кто знает как исправить? Ubuntu 15.04

alexdarktech
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.