Harici bir USB ses kartını nasıl kullanabilir ve varsayılan olarak nasıl ayarlayabilirim?


16

RPi3'ümde çalışan C-Media'dan harici bir USB ses kartım var. Kart dizini ve ALSA eklentisini belirterek aplay / arecord kullanarak bazı kayıtları oynatabilirim . Ancak, diğer birçok ses dosyası hiç beklemiyor veya beklendiği gibi çalmıyor. Diğer bazı oynatıcı yazılımları da çalışmaz.

S: ALSA'yı varsayılan olarak kullanacak şekilde nasıl ayarlayabilirim?

Yanıtlar:


33

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:

resim açıklamasını buraya girin resim açıklamasını buraya girin

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:

  1. Dahili 3,5 mm ses kulaklık jakından (analog ses)
  2. HDMI bağlı ekrandan / monitörden
  3. Harici bir USB ses kartından
  4. 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.

  1. Önyükleme yapılandırma bayrağıyla devre dışı bırakma
  2. modprobe.dDaemon 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üğü blacklistve ardından *.confaltındaki herhangi bir dosyaya modülün adını girmeniz yeterlidir /etc/modprobe.d/. Ancak, zaten raspi-blacklist.confbu 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.kove 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:


Raspian ile bir raspi 3B + kullanmak aplay, ben -D plughw:0,0yerine -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
Mike 'Pomax' Kamermans

1
Evet, bu kanlı bir kabus. Lütfen burada farklı PCM eklentileri listesine bakın . Ardından "ALSA cihazları ve eklentileri" adlı 1. bölümü buradan okuyun . Belki de plughwbunun yerine neden kullanmanız gerektiğine ışık tutmanıza yardımcı olur hw. BTW. Yana hw, oysa düz donanıma olan plughwbazı işlemler yapar, size aslında oynamaya çalışıyoruz kontrol etmek isteyebilir.
not2qubit

Ben /usr/share/sounds/alsa(özellikle Front_Center.wav) , bataklık standart test ses dosyalarından biri ile test
Mike 'Pomax' Kamermans

1
Sen mutlak yıldızsın. Ahududu pi'sinden ses çıkarmanın ne yapacağına dair net bir rehberliği olmayan çok günlük bir proje olacağını ummuyordum. Tüm + 1'ler sizin için.
Kieran

3
Çok az sayıda oy hakkı olması suçtur.
BradChesney79
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.