Jak to chytry musi dwa razy więcej skryptów pisać
Mam kartę TV. Nic wielkiego, kto nie ma takiej karty. Zakupiłem ją już dość dawno temu, a że na takie bajery szkoda mi kasy, to kupiłem to co było najtańsze pod ręką.
Wybór padł na AverTV GO 007 FM. Ja już nie mogę, ale wy zastanówcie się ponownie jak wasze oczy spoczną na tej nazwie gdzieś w sklepie.
Karta zasadniczo działa pod Linuksem. Ale wytwornym żartem producenta jest umieszczenie na tej karcie … samych wejść ! Mamy więc ‘video input’, ‘audio input’ no i ‘tv input’. Bystrzaki zawołają – a jak z tej karty wyprowadzić dźwięk, skoro nie ma wyjścia ?
Otóż sendo sprawy – ta karta NIE POSIADA wyjścia audio. Przez co obsługa dźwięku jest nieco upierdliwia, przynajmniej pod Linuksem ( z racji tego, że na wiadomy system sterowniki przewidują tę inowację i jakoś ją pewnie obsługują ).
Nie zgłębiając się w barwne opisy tego, jak to nie uwierzyłem, że wszystkie wejście audio to faktycznie wejście audio i próbowałem po swojemu to wszystko opanować, podam krótki przepis, jak uporać się z tą kartą.
AverTV GO 007 FM a sprawa dźwięku
Koncept
Twórcy sterowników dla Linuksa przewidzieli, że ktoś będzie próbował wydobyć jakiś dźwięk z tego tunera. I w ten sposób sterownik w postaci modułu saa7134 posiada moduł wspomagający o nazwie saa7134-oss lub saa7134-alsa. Koncepcja jest taka – moduł saa7134-oss/alsa zarejestruje w systemie urządzenie w standardzie OSS lub ALSA które będzie odzwierciedlało to, co w chwili obecnej będzie grało w tunerze naszej karty.
Jednak to dopiero od wersji kernela 2.6.15. Wcześniejsze wersje ( we wcześniejszych kernelach ) mają wersję modułu saa7134 który przyjmuje parametr oss=x i tam tak właśnie rejestruje się owo urządzenie.
Na potwierdzenie tego, że nie mijam się z prawdą :
$#modinfo saa7134
$#modinfo saa7134-oss
$#modinfo saa7134-alsa
Zatem, udało się nam zarejestrować urządzenie dźwiękowe, które jest nośnikiem dźwięku z tunera. Jednak, jak usłyszeć ten dźwięk w jego akustycznym wydaniu, nie wirtualnym ? Ano właśnie, tu cały trick. Przekierujemy sobie dźwięk z ‘karty muzycznej’ tunera na kartę muzyczną do której podłączone mamy głosniki.
Wykonanie
Potrzebujemy takiego oto zestawu :
– rzeczona karta
– zainstalowany program od obsługi TV – u mnie TvTime
– zainstalowany pakiecik sox
– bash
– edytor tekstu
– sprawną klawiaturę
Skryptujemy
Do wyłapania dźwięku z urządzenia które zarejestrował nam moduł saa7134-oss ( lub parametr dla modułu saa7134 ) posłuży nam program sox. Użyję w przykładzie urządzenia OSS, dociekliwi mogą rejestrować sobie urządzenie w standarcie ALSA i tak przerobić podane poniżej skrypty, aby zadziałały.
Ale zanim skrypty, powiem co będziemy robić.
Będziemy uruchamiać TvTime. Jeżeli załadowaliśmy wcześniej moduł saa7134-oss/alsa, to w podczas działania programu TvTime na urządzeniu muzycznym przypisanym do tunera pojawi się nam udźwiękowienie do ruchomych obrazków. Teraz, z tego urządzenia my te dane zgrabnie zbierzemy i podamy na urządzenie dźwiękowe, które posiada wyjście audio i do którego najprawdopodobniej mamy podłączone głośniki.
Czyli, w tym samym momencie musimy mieć uruchomione dwa programy – TvTime i sox.
No … ale jak klikamy na ikonce TvTime, to się nam tylko ten program uruchamia. Ale możemy to zmienić.
Edytujemy ( jako root ) plik /usr/bin/tvon. Jest on pusty, ale tylko przez chwilę.
$#joe /usr/bin/tvon
( zamiast ‘joe’ użyj swojego edytora tekstu. Np. ‘vi’. Jak lubisz. )
Do tego pliku wklejamy co następuje :
#!/bin/sh
JEST=`ps -C sox| grep sox`
if [ -z “$JEST” ]; then
tvtime&
# usuń komentarz (#) z linijki z poleceniem która cię dotyczy
# w przypadku użycia modułu saa7134-alsa dźwięk łapiemy i przekierowujemy tak
# sox -r 32000 -w -t alsa hw:1,0 -t alsa -w hw:0,0
# w przypadku użycia modułu saa7134-oss dźwięk łapiemy i przekierowujemy tak
# sox -r 32000 -w -t ossdsp /dev/dsp2 -t ossdsp -w /dev/dsp&
else
killall tvtime
killall sox
fi;
Czynimy plik wykonywalnym :
$#chmod 755 /usr/bin/tvon
Tak oto napisaliśmy swój program ! Prawdziwy !
Po jego uruchomieniu, sprawdzi on sobie, czy w komputerze działa proces sox. Jeżeli nie działa, uruchomi i jego i TvTime. Czyli, będziemy mieli jednocześnie działający sox i TvTime, a to oznacza … Dźwięk z programów TV.
Jeżeli natomiast program wykryje proces sox, wyłączy go, jak też TvTime’a. Na amen.
Nieładnie to wszystko może wygląda, ale na potrzeby domowe działa.
Co teraz ? Ano – teraz, dodajemy sobie do panelu, do menu, czy gdzie – aktywator, który będzie uruchamiał nasze nowe polecenie ‘tvon’. Obsługa jak opisałem wyżej – uruchamiamy raz, mamy TV, uruchamiamy ponownie, nie mamy TV, ani programu sox ( zauważyliście na pewno po analizie problemu, że odpalenie TvTime i sox’a i następne wyłączenie ‘krzyżykiem’ TvTime’a owocuje wyłączeniem tylko TvTime’a, a sox zostaje. )
Uwagi :
– polecenia w skrypcie podane są bez ścieżek – jeżeli zatem, nie masz ustawionych ścieżek na swoim profilu, przed każdym poleceniem wpiszą pełną ścieżkę ( whereis sox, tvtime, killall, ps itp )
– moduły najlepiej załadować w kolejności : saa7134-oss/alsa, saa7134. Załadujesz je przy starcie systemu, dopisując je do /etc/modules. Kolejna uwaga – zdarzyć się może, że moduł saa7134 jest wcześniej już załadowany przez kernel ( przy starcie, automagicznie ). Trzeba zmusić kernel, żeby tego nie robił
– ja mam urządzenia dźwiękowe /dev/dsp2 i /dev/dsp. Ktoś kto posiada kilka kart muzycznych, bądź rejestruje nowe urządzenie jako któreś z koleji ( modinfo saa7134-oss i parametr dsp_nr), musi użyć konkretnych urządzeń. Aby je wyśledzić, trzeba, o dziwo, zerknąć w /dev/, lub w /var/log/syslog :
May 15 19:22:34 zzzap kernel: saa7134 OSS driver for DMA sound loaded
May 15 19:22:34 zzzap kernel: saa7133[0]: registered device dsp2
May 15 19:22:34 zzzap kernel: saa7133[0]: registered device mixer2
W zasadzie … Wydaje się, że to wszystko. Jak to mówią, u mnie działa.
Aver to zło. Było brać leadteka experta, cena podobna, a instalacja pod linuxem sprowadza się do apt-get tvtime 🙂
PS. Popraw url do atari.area na http://atariarea.krap.pl :))
W powyższej historyjce lepsza byłaby niemal każda karta posiadająca wyjście audio, które można podłączyć do wejścia AUX karty muzycznej.
Nawet jakiś badziewny Prolink PixelView którego skądś wydłubałem, ma takie wyjście ( karta Play TV, na Conexant’cie ).
Link się poprawił 🙂
A możesz ten skrypt przerobić na Alsę?
mialem podobny problem z karta PixelView PlayTV Mobile (PCMCIA) zastosowalem prostsze rozwiazanie przed odpaleniem programu tv, typu TvTime, odpalam z konsoli cos takiego “arecord -D hw:1,0 -r 32000 -c 2 -f S16_LE | aplay -” i smigia wysmienicie 😀