LINUX.ORG.RU

Debian | Alsa | Звук работает только в одной программе

 , ,


1

1

Впринцепи в заглавии всё написано. Мне необходимо использовать именно alsa, но при этом мне очень не нравиться воспроизведение звука только с одной программы. Я не очень понял, ошибка ли это, или так и должно быть, но в общем, есть ли этому какое-то решение?


Должен быть настроен dmix, тогда несколько приложений сможет выводить звук.

Советую почитать про dmix и про его настройку через файл asound.conf

James_Holden ★★★★
()

Вроде бы работает, но при этом, есть одна программа, которая таки забирает себе весь звук (reaeper, если это что-то даёт).

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

Для reaper это нормально. С ним лучше работать не на голой alsa, а через jack или pipewire.

James_Holden ★★★★
()

Так а задержка ж тогда увеличиться. (Попробовал щас с ardour, тоже самое)

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

Так а задержка ж тогда увеличиться

Не очень увеличится. К тому же, перед колдунством с ардурами и джеками, пульсаудио совершенно по-простому можно временно прибить, тогла вообще никакой задержки не будет.

piyavking ★★★★★
()
Последнее исправление: piyavking (всего исправлений: 1)

А как ты это настроил? Потому что я тоже использую Debian 11 Xfce с голой ALSA — и прямо сейчас звук одновременно играет из Firefox ESR и VLC.

Делал так: сперва ставил с netinstall минимальную ОС, потом создавал файлы:

vsevolod@hp15:~$ cat /etc/apt/preferences.d/pulse 
Package: pulseaudio:amd64 pulseaudio:i386
Pin: release n=bullseye
Pin-Priority: -1
vsevolod@hp15:~$ cat /etc/apt/preferences.d/pipewire 
Package: pipewire:amd64 pipewire:i386
Pin: release n=bullseye
Pin-Priority: -1
vsevolod@hp15:~$ 

И apt update, после этого уже поверх ставил Xfce, X-server и прочее, как GUI регулятор громкости использую volumeicon-alsa, и всё работает почти из коробки, осталось только приоритетом поставить вывод звука не с HDMI выхода (чисто под мое железо):

vsevolod@hp15:~$ cat /etc/modprobe.d/audio.conf 
options snd_hda_intel index=1,0
Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 2)
Ответ на: комментарий от Vsevolod-linuxoid

Штука как раз в том, что vlc с firefox у меня вместе играют (я правда не тестил, но mpv и brave работают нормально), однако всякие музыкальные программы всё равно хапают себе весь звук.

azim
() автор топика

Мой опыт использования звука - следующий.

  • AC97
  • HDA Intel
  • Emu10k

Первые два товарища вот как у меня работали... Это было в 2005-2007 годы. Часть программ у меня работали, выводя звук одновременно. Но были и такие программы, которые захватывали звук монопольно. Я никак не мог понять, почему так.

Оказалось, что ALSA появилась приблизительно в 2002-2003 годы, а до ALSA был OSS. И что некоторые программы не знают про ALSA, и выводят звук в OSS. Внутри ALSA есть эмуляция OSSv3. Вот только, когда используется эта самая эмуляция OSS, то такая программа... монопольно захватывает звук.

Как победить? Убедиться, что в систему не загружаются следующие модули ядра:

snd-pcm-oss
snd-mixer-oss

В этом случае, ни одна программа даже не попытается воспроизводить звук через OSS. И ничто не захватит звук монопольно.

Вопрос... А может ли монопольно захватить звук приложение ALSA?

Надо включать dmix, тогда не захватит. Вот инструкция

Кроме того, я слышал, что mplayer при воспроизведении звука AC3, может захватить монопольно звуковую карту. При этом не важно, поддерживается ли звуковой картой аппаратное микширование, и включен ли dmix или нет. Я не проверял этот слух.

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

А может ли монопольно захватить звук приложение ALSA?

Да. Если это приложение выберет не виртуальное устройство типа «default» или «surround50», а хардварьное типа «hw:CARD=PCH,DEV=0».

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

Да. Если это приложение выберет не виртуальное устройство типа «default» или «surround50», а хардварьное типа «hw:CARD=PCH,DEV=0».

для такого случая я немного видоизменил пример перехвата open найденный в сети

// gcc -shared -fPIC -I/usr/include/alsa/  intercept.c -o inspect_open.so -ldl -lasound

// LD_PRELOAD=./inspect_open.so mactor

#define _GNU_SOURCE
#include <dlfcn.h>
#include <asoundlib.h>

typedef int (*orig_open_f_type)(snd_pcm_t **pcm,
  const char *name, snd_pcm_stream_t   stream,
  int   mode);

int snd_pcm_open(snd_pcm_t **pcm, const char *name,
  snd_pcm_stream_t stream, int mode)
{
    /* Some evil injected code goes here. */

    orig_open_f_type orig_open;
    orig_open = (orig_open_f_type)dlsym(RTLD_NEXT,"snd_pcm_open");
    return orig_open(pcm, "default", stream, mode);
}

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

А достаточно было всего-лишь:


snd_pcm_t *dev = NULL;

char *dev_name = "default";


if (0 > snd_pcm_open(&dev, dev_name, SND_PCM_STREAM_PLAYBACK, 0)) {
    // error
}

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.