Arka fon
Raspberry Pi için çeşitli sesle ilgili sorunları çözmeye çalışmak için ne kadar çaba harcandığını görmek şaşırtıcı. Görünüşe göre yeni kullanıcıların Raspbian altında ALSA ile başarılı bir şekilde gelişmeleri ve kullanmaları için en zayıf nokta olmalı. Kendi RPi3 sesimi farklı işletim sistemi sürümlerinde ve diğer Linux dağıtımlarında da çalıştırabilmek için epey zaman ve çaba harcadıktan sonra, kesin çözüm sayfası yazmaya karar verdim. En azından en yeni Raspbian Stretch'te harici bir ses kartı kullanma konusu için
.
ALSA ses sistemi
ALSA, donanım yapılandırmasına ve donanımın kaç yaşında olduğuna bakılmaksızın her türlü * nix tabanlı aygıtı desteklemeyi amaçlamaktadır. Tabii ki, 20 yıllık
gelişiminin ayrıntılarına girmeye çalışmanın pek bir anlamı yok
. Özü sadece mevcut bir duruma uyguluyoruz.
Bununla birlikte, tarihte hiçbir zaman insanlık, ALSA'yı açıklamaya çalışmak için bu kadar işe yaramaz ve işlevsiz diyagramlar üretmedi. Uzaktan bilgilendirici olanlar sadece ikisi:
Sistem bilgisi alma
İlk adım, varsa hangi sesin çalıştığını ve hangi donanıma sahip olduğunuzu bulmaktır. Ayrıntıları bulmanın her türlü yolu vardır, ancak ortalama bir kişi için, bu detayların çoğu anlamsızdır. En önemlilerini gösteriyoruz.
(Ses) sistemimiz hakkında ne bilmek istiyoruz?
Bilmek istiyoruz:
- dahili ses donanım adı ve sürümleri
- harici ses donanım adı ve sürümleri
- hangi çekirdek sürücülerini (modülleri) kullanır
- diğer sesle ilgili çekirdek sürücüleri / modülleri yüklendi
- hangi ses kartları mevcut
- ses kartları işletim sistemi ve programlar tarafından hangi sırada kullanılır ve seçilir
- çakışan donanım veya ses sistemi programları varsa
Sisteminizde nereden ses çalmak ve kaydetmek istiyorsunuz?
Ses çalma seçenekleriniz şunlar olabilir:
- Dahili 3,5 mm ses kulaklık jakından (analog ses)
- HDMI bağlı ekrandan / monitörden
- Harici bir USB ses kartından
- GPIO bağlantı noktasından
Ses kaydetme seçenekleriniz şunlar olabilir:
- a. Harici bir USB ses kartından (en az bir giriş türüyle)
- b. Bir dosya veya akıştan
- c. Bir GPIO'dan
Gelen bu yazı, biz nasıl söyleyecektir oynamak ve harici USB ses kartı kullanarak kayıt .
Geleceğe dönük bir başarı planı mı?
RPi'nin güncellemelerinde, genellikle eski çözümleri bozan sürekli yeni değişiklikler ve iyileştirmeler akışı var. Buradaki fikir, sistemde mümkün olduğunca az değişiklik yapmak veya gerekirse bunları açık hale getirmektir. Bu, sistem çapında olandan daha fazla bir kullanıcı yanlısı yapılandırma kullanmayı tercih ettiğimiz anlamına gelir. Yani kök dizin sistem dosyalarında değil, ana dizininizde yapılandırma dosyalarını kullanmaya çalışın.
TL; DR (Hadi başlayalım!)
Harici USB ses kartınızı yeniden başlatın ve ekleyin, böylece aynı sayfada başlayalım ...
A. Biraz bilgi toplayın
# Check ALSA modules
cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio
# Check sound hardware
cat /proc/asound/cards
0 [ALSA ]: bcm2835 - bcm2835 ALSA
bcm2835 ALSA
1 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed
# Check info on card-1
amixer -c 1
Simple mixer control 'Headphone',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 151
Mono:
Front Left: Playback 104 [69%] [-8.88dB] [on]
Front Right: Playback 104 [69%] [-8.88dB] [on]
Simple mixer control 'Mic',0
Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
Playback channels: Mono
Capture channels: Mono
Limits: Playback 0 - 32 Capture 0 - 16
Mono: Playback 23 [72%] [34.36dB] [off] Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [on]
Burada sistem varsayılanının ( card 0
) bcm2835 ALSA modülünü kullandığını görüyoruz. Genellikle hangi kartı kullanacağımızı belirleyebilsek de, omxplayer gibi bazı yazılımlarda
bu seçenek yoktur ve çeşitli şekillerde ses üretemezler.
Bu noktada, ALSA yapılandırma dosyalarınızı zaten yapılandırmayı deneyebilirsiniz. Bazıları başarılı, bazıları ise bunun nasıl ve nerede yapılması gerektiği belli olmadığı için değil. Sonunda istediğimiz şey, sistemimize harici USB ses kartımızı kullanmasını söylemektir.
B. Kaldır Ses Bloat
PulseAudio (PA) veya
ek JACK sunucu yazılımını saklamak için çok iyi nedenleriniz olmadıkça , varsa onları kaldırmalısınız . ALSA'ya müdahale etme eğilimindedirler, çünkü birçok ALSA işlevinin kontrolünü ele geçirirler ve bunlar için gerekli tüm ek yapılandırmalar, işleri inanılmaz derecede kafa karıştırıcı hale getirir!
sudo apt-get remove pulseaudio
# You can keep `jack*`, but make sure it is not running.
# If it is running you need to stop it, disble it or remove it.
service --status-all
# Disable the running service with:
sudo systemctl disable xxxxx
Dahili (Broadcom) ses kartını devre dışı bırakın
Dahili ses kartı çekirdek modülü tarafından tahrik edilir:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
Ses jakını (1'de) veya HDMI'yı (2'de) kullanmayı planlamıyorsanız, bu çekirdek modülünü devre dışı bırakmalısınız. Bunu yapmak için iki yöntem vardır.
- Önyükleme yapılandırma bayrağıyla devre dışı bırakma
modprobe.d
Daemon tarafından çekirdeğe yüklenmesini önleyin
Minimalist yaklaşımımızla kalmaya çalışırken (1) 'i seçiyoruz.
# Edit boot config with:
sudo nano /boot/config.txt
# so that:
cat /boot/config.txt
...
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
dtparam=audio=off
...
# You need to reboot!
sudo reboot now
Herhangi bir nedenle, yöntem (2) 'yi kullanmayı tercih ediyorsanız, çekirdek modülünü kara listeye almanız gerekir. Bunu yapmak için, sözcüğü blacklist
ve ardından *.conf
altındaki herhangi bir dosyaya modülün adını girmeniz yeterlidir /etc/modprobe.d/
. Ancak, zaten raspi-blacklist.conf
bu amaç için çağrılan boş, ayrılmış bir dosya var . Bununla birlikte, 6 ay sonra, bunu ve içerdiği şeyi unutmuş olacaksınız, böylece kara listeye eklediğiniz modülden sonra adlandırmayı daha iyi hale getireceksiniz.
cd /etc/modprobe.d/
# Manually edit a new file: blacklist-snd_bcm2835.conf
#sudo nano blacklist-snd_bcm2835.conf
# And add the line: blacklist snd_bcm2835
## OR directly with:
sudo tee /etc/modprobe.d/blacklist-snd_bcm2835.conf <<EOF
blacklist snd_bcm2835
EOF
# You need to reboot!
sudo reboot now
Fark ne? Yok, AFAICT.
Yeniden başlattıktan sonra ses modüllerinizi tekrar kontrol edin.
$ cat /proc/asound/modules
1 snd_usb_audio
$ cat /proc/asound/cards
1 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed
Bom! Can sıkıcı bcm2835 ( card 0
) yok, ancak USB kartının dizini aynı! Bu aslında iyi.
ALSA'nızı yapılandırın
Daha önce de belirttiğim gibi ALSA'nın kendi USB ses kartımızı varsayılan olarak kullanmasını istiyoruz. Bu aynı zamanda çekirdek ses modülleri listesinde ilk kullanılabilir dizine sahip olmasını istediğimiz anlamına gelir. Modül yukarıda kaldırıldığından ve dizin aynı olduğundan (kart 1) iyi durumdayız. Ancak bcm2835'i tekrar yüklememiz gerektiğinde, bu modül birincisi ( card 0
) olarak yeniden görüneceğinden , değiliz .
ALSA'ya varsayılan PCM kart endeksimizin ne olması gerektiğini ve çekirdekte hangi sırayla önceliklendirilmesi gerektiğini söylememiz yeterlidir
.
ALSA'nızı yapılandırabileceğiniz 3 yer vardır.
- Kullanıcı konfigürasyon içinde:
~/.asoundrc
- Sistem yapılandırma içinde:
/usr/share/alsa/alsa.conf
- sistem modülü conf içinde:
/lib/modprobe.d/aliases.conf
İlk 2 varsayılan cihazları değiştirirken, son 2 görünüm sırasını sağlar.
Önce kullanıcıya özel yapılandırmamızı düzeltiriz card 1
. Gösterilen birden fazla kartınız varsa, varsayılan olmasını istediğiniz kartın dizinini seçin.
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
Ardından, sistem yapılandırmasını yukarıdaki ile aynı kart dizin numaralarını kullanarak düzeltiriz. Bazı sistem paketleri hiçbir zaman kullanıcı yapılandırma dosyanızı görmeyeceğinden bunu yapmamız gerekir.
sudo nano /usr/share/alsa/alsa.conf
# then replace:
#defaults.ctl.card 0
#defaults.pcm.card 0
# with:
defaults.ctl.card 1
defaults.pcm.card 1
Şimdi değişikliklerin geçerli olması için yeniden başlatın.
Şimdi çalışan bir ses sisteminiz olmalıdır.
Test edelim!
Uygun bir test yapmak için test edilecek uygun dosyalara ihtiyacınız vardır. Her şeyden önce, tüm ses ve video dosyalarınızın gerçekten çalıştığından emin olun.
(Ses kodunu çalmak için bazı h264 / mp4 test videosu almaya çalışırken çok zaman geçirdim, ancak daha sonra keşfetmek için hiç kodlanmamış ses yoktu!
UYARIMPEG-2
veya VC-1
codec bileşenlerini
kullanan videoları test etmeye çalışıyorsanız
, yerleşik donanım kod çözücülerle kodunu tamamen çözmek için RPi kuruluşundan bir codec anahtarı satın almanız (!) Gerekir. Aksi takdirde, önce dosyaları dönüştürmeniz gerekir.
Codec'inizin etkinleştirilip etkinleştirilmediğini aşağıdakilerle kontrol edebilirsiniz:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
Test etmek için bazı doğrulanmış dosyalara ihtiyacınız olacak. Bunları yoksa indirebilir ve kullanabilirsiniz.
# get some demo sound and video files
cd ~/Music
wget -Lk http://rpf.io/lamp3 -O example_11k.mp3
wget -Lk http://www.kozco.com/tech/piano2-CoolEdit.mp3 -O pianoTest_48k.mp3
wget -Lk http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_2mb.mp4 -O bbb_720p_2mb.mp4
wget -Lk https://raw.githubusercontent.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4 -O bbb_360_22k.mp4
Sonra, OYNA!
# Double-check!
aplay -l && arecord -l
**** List of PLAYBACK Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
**** List of CAPTURE Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
# Play white noise on 2-channels (L/R) on Card-1
speaker-test -c2 -D hw:1,0
# Play a WAV sound file
speaker-test -c2 -D hw:1,0 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav
# Once the correct default card+device is set, and after reboot,
# then full left/right voice test (above) is performed, just by:
speaker-test -c2 -twav
# Record some sounds (with a VU bar):
arecord --device=hw:1,0 --format S16_LE --rate 44100 -c1 -V mono test.wav
# Play recorded sounds
aplay -D plughw:1,0 test.wav
# Play recorded sounds (sample rate have to be equal)
speaker-test -c2 -D plughw:1,0 -r 44100 --test=wav -W $HOME -w test.wav
# Install an MP3 player
sudo apt-get install mpg123
# Play some MP3 file
mpg123 -v -r 44100 some.mp3
# Play an MP3 sound stream
mpg123 http://ice1.somafm.com/u80s-128-mp3
# This plays video, but no sound!
omxplayer -o alsa /opt/vc/src/hello_pi/hello_video/test.h264
# This plays video and sound!
omxplayer -o alsa bbb_720p_2mb.mp4
# The following plays sometimes (!?) and at the wrong speed!
omxplayer -o alsa some.mp3
SENİN GİTMEN İYİDİR!
[isteğe bağlı] Ek Ses Donanımı Sırası
NOT Bu bölümü kullanırsanız, yukarıdaki bölümlerdeki tüm kart dizini değerlerini değiştirmeniz gerekir!
Ek ses donanımı eklediyseniz ve istediğiniz gibi görünmüyorsa, modülde dosyaların görünme sırasını yeniden düzenlemeye zorlayabilirsiniz /lib/modprobe.d/aliases.conf
.
Bazı çözümler bu dosyada değişiklik yapılmasını önerdi. Ne yazık ki, RPi varsayılan USB ses modülünün yanlış yazılmış olduğunun farkında değiller! Yani değişiklikler asla etkili olmaz. Endişe ettiğimiz ses çekirdek modülü denir snd_usb_audio
, değil snd-usb-audio
. Dosya adı snd-usb-audio.ko
ve yer: /lib/modules/4.9.59-v7+/kernel/sound/usb/
.
Komik olan, dosyadaki metnin değiştirilmesine gerek olmadığını söylüyor!
sudo nano /lib/modprobe.d/aliases.conf
#--------------------------------------
# For original (out-of-box) use
#--------------------------------------
# replace this:
options snd-usb-audio index=-2
# with this:
options snd_usb_audio index=-2
#--------------------------------------
# To change the index & order
#--------------------------------------
# Set the index value of the cards:
options snd_usb_audio index=0
options snd_bcm2835 index=1
# Set the order:
options snd slots=snd_usb_audio,snd_bcm2835
Referanslar:
aplay
, ben-D plughw:0,0
yerine-D hw:0,0
(shttps: //raspberrypi.stackexchange.com/a/89162 dayalı) yerine , bu işten sonra sürekli hiçbir şey yapmadı . Ne yazık ki, hemen hemen her şey şimdi USB üzerinden ses çalabilirken, en çok çalışmam gereken yardımcı program (vban_receptor
) hala çalışmıyor, ancak bu noktada artık kurulumun hatası kesinlikle değil