Nowe posty

Autor Wątek: Przechwycenie dźwięku ALSA  (Przeczytany 15813 razy)

slacker

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #15 dnia: 2012-06-03, 21:26:07 »
Dobra Panowie! Dajmy z tym spokój bo to bez sensu. Mają być to pliki konfiguracyjne wgrane i żeby nie trzeba było kombinować ani klikać myszką. Połączyłem zawartość dwóch pliczków znalezionych na necie i myślę że ten kierunek będzie najlepszy.

pcm.loopout {
  type dmix
  ipc_key 328211
  slave.pcm "hw:Loopback,0,0"
}

# input device
pcm.loopin {
  type dsnoop
  ipc_key 686592
  slave.pcm "hw:Loopback,1,0"
}

# duplex plug device
pcm.loop {
  type plug
  slave {
    pcm {
      type asym
      playback.pcm "loopout"
      capture.pcm "loopin"
    }
  }
}

pcm.!default{
   type empty
   slave.pcm "loop"
}

Ostatni blok rozwiązuje problem. Każdy program przesyła dźwięk do loopa z którego da się zgrywać dźwięk. Teraz pojawiają się dwa problemy. Czy dużo jest roboty żeby zrobić dodatkowy przełącznik w graficznym jak i konsolowym programie np. alsamixer, aby była możliwość włączenia dodatkowo przesyłu dźwięku na "normalne" głośniki? Można zawsze napisać program, albo wykorzystać gotowe: arecord -D loop -f S16_LE -c 2 -r 44100 | aplay -D hw:0,0 -f S16_LE -r 44100 -c2 jednak wg mnie nie jest to profesjonalne rozwiązanie i coś przerywa "underrun!!! (at least 1.323 ms long)"
Druga sprawa to dokonfigurowanie pliku .asoundrc, aby zminimalizować opóźnienia. Czytałem że coś takiego jest, ale ten plik konfiguracyjny dla zwykłego śmiertelnika jest nie do ogarnięcia...

....
Upsss, jednak się pospieszyłem, amarok nie chce współpracować, firefox OK(przy dźwięku z yt mam przycięcia)

miro57

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #16 dnia: 2012-06-04, 08:17:29 »
Zamiast pary arecord | aplay spróbuj alsaloop.
Przykład: alsaloop -t 100000 -C loop -r 48000 -c 2 -f S16_LE -P hw:0,0

Może tu znajdziesz trochę wskazówek:
https://bbs.archlinux.org/viewtopic.php?pid=765075

slacker

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #17 dnia: 2012-06-04, 11:08:28 »
No tak, zapomniałem o tym alsaloop; dzięki.
Ale problem jest taki że po ok 5min grania, dźwięk się zacina i musze killować program, żeby ponownie go odpalić( i znowu działa przez 5min):
$ alsaloop -t 100000 -C loop -r 48000 -c 2 -f S16_LE -P hw:0,0
underrun for playback hw:0,0 <----- po ok 5min.

miro57

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #18 dnia: 2012-06-04, 12:29:04 »
U mnie działa tak jak to podałem bez problemów.
To polecenie ma więcej możliwości wyświetl alsaloop -h i spróbuj innych
ustawień.
Ja uruchamiam u siebie przez ionice -c 1 -n 0 alsaloop ...
( ionice ma prawa root ), w celu pobrania dźwięku w czasie rzeczywistym
 z Line-IN, zdekodowania surround (wtyczka upmix) i odtworzenia
 na głośnikach z jednoczesnym odtwarzaniem obrazu z karty TV na ekranie.

Różnicą jest to że nie korzystam z "loopa" w .asoundrc .

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Przechwycenie dźwięku ALSA
« Odpowiedź #19 dnia: 2012-06-04, 17:29:11 »
Cytat: slacker
Hmm w kde4? Nigdzie nie widzę żeby coś takiego było i dało się ustawiać
System Settings>Multimedia>Phonon>Audio Hardware Setup.

Pozdrawiam!

slacker

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #20 dnia: 2012-06-04, 18:52:49 »
Z tym alsaloop to się dziwnadła robią, a nawet jak zgrywam arecord do pliku. Wszystko działa jak należy(wrzuta, radia we flashu itp) a jak odpalę youtuba to dźwięk ścina... Czego to może być przyczyna?

miro57

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #21 dnia: 2012-06-04, 19:21:35 »
Przeglądarka firefox i gogle-chrome (chyba raczej flashplayer tych przeglądarek) nie używają bezpośrednio alsy tylko serwera dźwięku pulseaudio.
http://grangerx.wordpress.com/2009/08/03/fedora-11-recording-audio-from-pulseaudio-using-parec-and-sox/

Amarok pewnie używa jakiegoś serwera dźwięku z KDE.

Co do tego arecord czy alsaloop to w Twoim przypadku wystarczy użyć arecord z przekierowaniem strumienia danych do Twojego programu.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Przechwycenie dźwięku ALSA
« Odpowiedź #22 dnia: 2012-06-04, 21:50:34 »
Cytuj
Z tym alsaloop to się dziwnadła robią, a nawet jak zgrywam arecord do pliku. Wszystko działa jak należy(wrzuta, radia we flashu itp) a jak odpalę youtuba to dźwięk ścina... Czego to może być przyczyna?
Miałem podobny problem. Większość kart ma przekierowane wyjście z miksera z powrotem na wejście jako "Wave In" albo "Mix", ale nie wbudowane karty Intel HDA. Z tego co wiem, nie ma możliwości, żeby sprzętowo nagrywać wyjście audio, przynajmniej u mnie. Jedyne rozwiązanie to alsaloop albo serwer dźwięku.

Nie udało mi się tak skonfigurować alsaloop, żeby to w miarę to działało, bo albo coś blokowało sterownik, albo był problem z wydajnością. Szczególnie flash i java potrafią nabruździć. Ta karta po prostu nie nadaje się do tego typu zastosowań.

W tej chwili, jeżeli chcę przekierować dźwięk, używam jackd i to mi wystarczy, tym bardziej, że jest właśnie zaprojektowany do tego typu zastosowań. Może powinieneś z nim coś pokombinować.

Z pulseaudio też próbowałem, ale w sumie to nic innego jak przerośnięta nakładka na alsę i nie oferuje dużo więcej w tej kwestii. Z tego, co pamiętam i tak trzeba byłoby użyć alsaloop albo jackd, więc dałem sobie z nim spokój.

slacker

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #23 dnia: 2012-06-06, 00:25:14 »
Ale tak czy siak, jack też zczytuje dźwięk z alsy tworząc "urządzenie" tak jak ja loopa w asoundrc. Problem ze zczytywaniem, jeśli dobrze rozumuje.
Po skonfigurowaniu wykorzystuję
snd_pcm_readi (h_in, buf, 512);
I dalej z yt mi tnie...

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Przechwycenie dźwięku ALSA
« Odpowiedź #24 dnia: 2012-06-06, 13:02:15 »
Przez
snd_pcm_readi (h_in, buf, 512);
zczytujesz dane z alsy a nie jacka, co nie ma sensu, bo robisz dokładnie to samo, co poprzednio, tylko że masz jeszcze jednego śmiecia w tle. Instalacja jacka i nadal używanie bezpośrednio alsy nie ma sensu.

Jeżeli aplikacja nie używa jacka, tylko bezpośrednio alsę, to odpowiedni moduł w alsie, tworzy takiego uniwersalnego klienta i przekierowuje go na serwer jacka. W żadnym wypadku nie tworzy żadnego dodatkowego "urządzenia".

W przypadku alsy i zapisu/odczytu dźwięku bezpośrednio ze sterownika musisz zaimplementować albo komunikację asynchroniczną albo buforowany odczyt inaczej zawsze będziesz mieć różne overruny i inne, bo nie zdołasz tego przetwarzać w czasie rzeczywistym. Druga sprawa jest taka, że jakość tych sterowników jest różna i to, co na jednej karcie i systemie będzie działać, na innym będzie się ciąć.

Z jackiem, chodziło mi raczej o napisanie zwykłego klienta jacka, który stworzy port o określonej nazwie i umożliwi przekierowanie wyjść programów na niego, a nie nadal bawienie się bezpośrednio alsą. Jack załatwi większość spraw za Ciebie, które normalnie musiałbyś zaimplementować.

slacker

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #25 dnia: 2012-06-13, 00:07:14 »
Przekonałem się do jacka, ale mam problem z uruchomieniem, jak odpale jacka, przykładowo: jackd -r -d alsa (na razie bez realtime) to np. program aplay i jak podobnie inne nie chcą się "połączyć" z dźwiękówką/jackiem
$ aplay /dev/urandom
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
aplay: main:660: audio open error: Device or resource busy
$ aplay -D jack /dev/urandom
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM jack
aplay: main:660: audio open error: No such file or directory

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Przechwycenie dźwięku ALSA
« Odpowiedź #26 dnia: 2012-06-13, 12:42:35 »
U mnie z takim plikiem ~/.asoundrc działa:

pcm.!default {
type plug
slave { pcm "rawjack" }
}

pcm.rawjack {
    type jack
    playback_ports {
        0 system:playback_1
        1 system:playback_2
    }
    capture_ports {
        0 system:capture_1
        1 system:capture_2
    }
}

pcm.recjack {
    type plug
    slave { pcm "rawjack" }
    hint {
  description "JACK Audio Connection Kit (Rec)"
    }
}

pcm.jack {
    type plug
    slave { pcm "rawjack" }
    hint {
  description "JACK Audio Connection Kit"
    }
}
oraz "~/.jackdrc"
/usr/bin/jackd -P60 -p128 -t5000 -u -dalsa -r44100 -p128 -n16 -S -D -Chw:0,0 -Phw:0,0
Tylko musisz ustawić sobie parametry -C oraz -P.

W ".asoundrc" zauważyłem, że nie działa, jeżeli jacka podłączy się bezpośrednio jako "pcm.!default" i trzeba ustawić go jako slave'a (pierwszy akapit asoundrc). Ustaw też sobie urządzenie w jackd dla pewności, że nie używa np. modemu.

slacker

  • Gość
Przechwycenie dźwięku ALSA
« Odpowiedź #27 dnia: 2012-06-13, 16:10:12 »
Coś nowego się pojawiło :)
Czy po takim skonfigurowaniu wszystkie programy poprawnie chodzą? Jakieś jednak problemy się pojawiają?
Tak przy okazji zapytam:
$ aplay /dev/urandom
ALSA lib dlmisc.c:236:(snd1_dlobj_cache_get) Cannot open shared library /usr/lib/alsa-lib/libasound_module_pcm_jack.so
aplay: main:660: audio open error: No such device or address
Tutaj muszę skompilować alsę z obsługą jacka... prawda? - opanowane, wszystko jest ok.
Dzięki wielkie :)