LINUX.ORG.RU

Умное разделение звука для различных X серверов


0

2

Текущая картина:
Запущено несколько X-серверов (2), на первом - игрушка, на нулевом-десктоп. Не зависимо от того на каком десктопе находишься, звук «слышен с обоих».

Попытаюсь объяснить что хотелось бы получить:
На всех десктопах слышен звук с нулевого и с себя, на нулевом слышен звук только с нулевого.


Пока не представляю как это сделать и вообще реально ли это сделать сейчас простым конфигурированием звуковых серверов (использую pulse + alsa), может уже есть люди, копавшие в эту сторону?



Последнее исправление: rap-kasta (всего исправлений: 1)

А как вы думаете это реализовать, ведь иксы и альса не подозревают о существовании друг друга :)

Eddy_Em ☆☆☆☆☆
()

Не зависимо от того на каком десктопе находишься, звук «слышен с обоих».

Это странно, потому что в федоре и убунту при переключении даже в консоль звук с иксов прекращается. Аналогично, если переключится на другого пользователя в другой X. Пульс интегрирован с ConsoleKit, через который и отслеживаются все эти переключения.

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

Зато пульс очень даже подозревает, и строка коннекта у него прописана в свойствах рутового окна в том числе.

vga ★★
()

Один из вариантов - глушить звук игрухи при переключении на первый икс-сервер. А вот как это сделать... По идее через тот же консолькит, он должен говорить, когда меняются иксы и либо через pacmd либо через dbus глушить стрим игры.

vga ★★
()

Инкрементирую вопрос, тоже интересно.

Viglim
()
Ответ на: комментарий от vga

P.S. Глушить звук можно например через «pactl set-sink-input-mute 1988 1», где 1988 - номер Sink Input, можно узнать через pactl list

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

>при переключении с любого икса, кроме нулевого, гасить на нём звук
Да, именно так

rap-kasta
() автор топика
Ответ на: комментарий от Viglim

Гм, а я понял, что задача в том, что при переключении на нулевой икс глушить звук игрухи (чтоб поработать), а при переключении на игруху - включать ее звук (все остальные звуки не трогать, вдруг там пиджин звонит или еще что).

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

P.P.S. Все-таки pacmd лучше, чем pactl. pacmd list-sink-inputs показывает только стримы, без всякого ненужного мусора, pacmd set-sink-input-mute - глушит стрим.

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

По сути вы объяснили одно и тоже разными словами.
Лучше приведу пример.

переходим с (0) на (1/n): звук есть и от 0 и от 1/n
переходим с (1/n) на (0): звук есть только от 0 (с 1/n глушится)
переходим с 1 на 2: звук с 1 глушится


что при переключении на нулевой икс глушить звук игрухи (чтоб поработать), а при переключении на игруху - включать ее звук


Нужно именно для этого, какой вы проницательный)

rap-kasta
() автор топика
Ответ на: комментарий от rap-kasta

Ну тогда я вот вижу как-то так, как описал. dbus-monitor --system должен показать ивент от ConsoleKit при переключении иксов теоретически, по этому ивенту делать pacmd set-sink-input-mute игруха 0 или 1.

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

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

rap-kasta
() автор топика
Ответ на: комментарий от rap-kasta

ну просто запусти dbus-monitor --system и попереключайся, там будут ивенты от консолекит, вот у меня такой

signal sender=:1.17 -> dest=(null destination) serial=7850 path=/org/freedesktop/ConsoleKit/Session3; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged

А доки здесь - http://www.freedesktop.org/wiki/Software/ConsoleKit

Может можно как-то по-другому, это просто первое, что в голову пришло.

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

Значит, задача сводится к «вешаем обработчик на действие ActiveChanged и по нему выкелючаем звук в нужной сессии»

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

Именно так, за сегодня-завтра сделаю, наработанное выложу в этой теме.

P.S. у кого в дистрибутивах «уже так» или «почти так» (н-р глушится при любом переключении) - поглядите и отпишитесь плз _как_ это реализовано.

rap-kasta
() автор топика
Ответ на: комментарий от rap-kasta

Хорошо. Я бы и сам сделал, да вот линукса нет под рукой.

Viglim
()
Ответ на: комментарий от rap-kasta

эээ, ну я и так могу сказать

$ pacmd list-modules 
....................
    index: 17
	name: <module-console-kit>
	argument: <>
	used: -1
	load once: yes
	properties:
		module.author = "Lennart Poettering"
		module.description = "Create a client for each ConsoleKit session of this user"
		module.version = "0.9.21"
...........

Вот оно скорее всего это и делает. Но естественно, оно делает не так, как хочется в данном случае. То есть оно делает тупо - если пользователей другой - заглушить/остановить. А в данном случае хочется чего-то хитрого, с логикой. Поэтому нужен скрипт (что проще) или написать свой модуль под пульс (что сложнее).

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

Хм, проверил сейчас из под пользователя.

И...ничего не изменилось, только теперь звук из wine'а при переходе на 0й заклинивает. Думал коряво глушение работает, ан нет - запустил mplayer на обоих, попереключал - глюков нет, звучит всегда с обоих.

rap-kasta
() автор топика
Ответ на: комментарий от Viglim

Консолькит говорит когда меняется сессия, а pacmd глушит/разрешает стримы при смене сессии. Аналога pacmd для альсы я не знаю (наверное его не существует, инача зачем тогда был пульс вообще, управление стримами - одна из его главных фич)

vga ★★
()

Так, с consoleKit оказался фейл... (вот блин прогер, а забываю перед реализацией нормально проверить что и как будет...)
Он отдаёт данные только когда уходишь с 0 и приходишь в 0 (так же указывается bool значение, которое показывает пришёл или ушёл с 0).
Встаёт загвоздка - любой переход, который не затрагивает 0, не логируется consoleKit'ом.

Для 2х сессий конечно можно и так реализовать, но всё же хочется, чтобы работало спокойно на любом количестве.

rap-kasta
() автор топика
Ответ на: комментарий от rap-kasta

Странно, может зависит от того, как именно вторая сессия запущена?

Вот мои переключения с одних иксов на другие и обратно

$ dbus-monitor --system interface=org.freedesktop.ConsoleKit.Session
signal sender=org.freedesktop.DBus -> dest=:1.99 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.99"
signal sender=:1.18 -> dest=(null destination) serial=1001 path=/org/freedesktop/ConsoleKit/Session1; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged
   boolean false
signal sender=:1.18 -> dest=(null destination) serial=1002 path=/org/freedesktop/ConsoleKit/Session3; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged
   boolean true
signal sender=:1.18 -> dest=(null destination) serial=1044 path=/org/freedesktop/ConsoleKit/Session3; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged
   boolean false
signal sender=:1.18 -> dest=(null destination) serial=1045 path=/org/freedesktop/ConsoleKit/Session1; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged
   boolean true

Вторые иксы запущены для другого пользователя через fast user switching в гноме. Видно, что есть и уход и приход на оба десктопа. Как запустить другие иксы, чтобы не работало?

vga ★★
()
Ответ на: комментарий от rap-kasta

Запустил вторые иксы: X :1 vt9

Запустил на них openbox: DISPLAY=:1 openbox - действительно, не работает, показывает только приход на нулевые иксы.

Запустил openbox через ck-launch-session: DISPLAY=:1 ck-launch-session openbox - все работает

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

ммм, стоит учесть, что у меня запускаются голые иксы, а в них приложение (wine/goo/другие_увлекательные_игры).

rap-kasta
() автор топика
Ответ на: комментарий от vga

Как я помню, ck-launch-session goo надо добавить в ~/.xinitrc или передавать в xlaunch.

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