Решихме да напишем няколко реда относно този проблем, защото информацията в нета е доста оскъдна. Накратко, capture картите на Osprey от серия 230 (и не само те), но в моя случай ставаше дума за такава имат проблем със звука. Те варират от пълната му липса до едно дразнещо бучене, макар и да се чува някакво подобие на звук. По-често срещаният проблем е вторият и причината всъщност е във високият gain. Из мейлинг листите има доста въпроси относно този проблем, но малка част от тях водят до някакво решение.
До ядро 2.6.9 Viewcast са имали собствени драйвери за Linux за своите карти, но в последствие тяхната разработка е била прехвърлена на общността и в частност на хората зад v4l/dvb. Драйверите за v4l поначало са част от linux ядрото. В ядрото идващо с CentOS 5.2, а именно 2.6.18 нужните драйвери за разпознаване и работа на Osprey картите са налице. Това са bttv за video и snd_bt87x за звука. И докато видеото може да се каже че е с перфектно качество, то както вече стана дума не можем да кажем това и за звука. При малко по-усилено търсене могат да се намерят едни стари пачове от 2006-та година, които са решавали проблема посредством btaudio, но на мен те не ми свършиха работа.
И така, ако в dmesg, или /var/log/messages виждаме нещо подобно:
bttv: driver version 0.9.18 loaded
bttv: using 8 buffers with 2080k (520 pages) each for capture
bttv: Bt8xx card found (0).
bttv0: Bt878 (rev 17) at 0000:0b:04.0, irq: 19, latency: 132, mmio: 0xd8000000
bttv0: detected: Osprey-200 [card=88], PCI subsystem ID is 0070:ff01
bttv0: using: Osprey 200/250 [card=88,autodetected]
bttv0: gpio: en=00000000, out=00000000 in=00ffffff [init]
bttv0: osprey eeprom: card=89 ‘Osprey 210/220/230’ serial=5436547
bttv0: osprey eeprom: Changing card type from 88 to 89
bttv0: tuner absent
bttv0: registered device video0
bttv0: registered device vbi0
то картата ни е разпозната, модулът е зареден и можем да я ползваме по предназначение (засега без звук).
Ето и основните стъпки, по които да се ръководи човек сблъскал се с подобен род проблем, като те като цяло са малко redhat specific, но не би трябвало да бъде проблем да се ползват и за други дистрибуции.
- Сваляваме osprey-snd-patch.
cd /usr/src/
wget http://just4nick.net/blog/wp-content/uploads/2009/09/osprey-snd.patch
- Сваляме сорс кода на v4l-dvb и го разархивираме.
wget http://linuxtv.org/hg/~tap/bttv/archive/tip.tar.gz
tar -zxvf bttv-35ddb77b68f8.tar.gz
mv bttv-35ddb77b68f8 v4l-dvb
- Прилагаме patch-a.
patch –dry-run -p1 -d v4l-dvb < osprey-snd.patch
Както се вижда и от самия код ползваме опцията на patch за суха тренировка –dry-run. Така се предпазваме от грешки. Ако всичко е наред, би трябвало да видим нещо от този род:
patching file linux/drivers/media/video/bt8xx/bttv-if.c
patching file linux/drivers/media/video/bt8xx/bttv.h
Hunk #1 succeeded at 302 (offset 1 line).
patching file linux/sound/pci/bt87x.c
Hunk #7 succeeded at 437 (offset 2 lines).
Hunk #9 succeeded at 778 (offset 2 lines).
Hunk #11 succeeded at 984 (offset 2 lines).
Hunk #12 succeeded at 1084 (offset 2 lines).
Hunk #13 succeeded at 1109 (offset 2 lines).
След което можем да пристъпим към същинското прилагане на patch-а с командата:
patch -p1 -d v4l-dvb < osprey-snd.patch
- Инсталираме kernel-devel, kernel-headers, redhat-rpm-config, rpm-build.
yum -y install kernel-devel kernel-headers redhat-rpm-config rpm-build
- Сваляме и инсталираме src rpm-a на ядрото.
cd /usr/local/src/
wget ftp://mirror.switch.ch/pool/3/mirror/centos/5.3/updates/SRPMS/kernel-2.6.18-128.4.1.el5.src.rpm
rpm -ivh kernel-2.6.18-128.4.1.el5.src.rpm
- Билдваме модифицирания код на ядрото.
cd /usr/src/redhat/SPECS
rpmbuild -bp –target=$(arch) kernel-2.6.spec
- Коригираме Makefile.
cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
vim Makefile
където променяме
EXTRAVERSION = -prep
EXTRAVERSION = -128.4.1.el5
- Компилираме и инсталираме driver-ите.
cp configs/kernel-2.6.18-x86_64.config .config
make modules_prepare
cd /usr/src/v4l-dvb
make all
make install
make sound-install
Ако всичко мине успешно, то при изпълняването на
ls -la /lib/modules/2.6.18-128.4.1.el5/kernel/sound/pci/snd-bt87x.ko
би трябвало да видим, че модула е налице и е с текуща дата и час.
- Зареждаме модула.
rmmod snd_bt87x
modprobe snd_bt87x
След което би трябвало да е възможно да коригираме sound capture посресдством alsamixer и да имаме нормално работещ звук.