Latar Belakang
Sungguh menakjubkan melihat betapa banyak upaya telah dilakukan untuk mencoba menyelesaikan berbagai masalah terkait suara untuk Raspberry Pi. Tampaknya itu harus menjadi titik terlemah bagi pengguna baru untuk berhasil mengembangkan dan menggunakan ALSA di bawah Raspbian. Setelah menghabiskan banyak waktu dan usaha untuk membuat suara RPi3 saya bekerja di berbagai versi OS dan distribusi Linux lainnya, saya memutuskan untuk menulis halaman solusi to-go-to yang konklusif. Setidaknya untuk topik menggunakan kartu suara eksternal pada Raspbian Stretch terbaru
.
Sistem suara ALSA
ALSA dimaksudkan untuk mendukung segala jenis perangkat berbasis * nix, terlepas dari konfigurasi perangkat kerasnya dan berapa pun usia perangkat kerasnya. Tidak perlu, ada gunanya mencoba masuk ke rincian
20 tahun
perkembangannya. Kami hanya menerapkan esensi untuk situasi saat ini.
Namun, tidak pernah ada waktu dalam sejarah umat manusia menghasilkan diagram yang tidak berguna dan disfungsional, seperti mencoba menjelaskan ALSA. Satu-satunya yang jauh informatif adalah dua:
Mendapatkan info sistem
Langkah pertama adalah mencari tahu suara apa, jika ada, yang berfungsi dan perangkat keras apa yang sudah Anda miliki. Ada banyak cara untuk mengetahui detals, tetapi bagi kebanyakan orang, kebanyakan detail itu tidak ada artinya. Kami menunjukkan yang paling penting.
Apa yang ingin kita ketahui tentang sistem (suara) kita?
Kami ingin tahu:
- nama dan versi perangkat keras suara bawaan
- nama dan versi perangkat keras suara eksternal
- apa driver kernel (modul) yang digunakannya
- apa driver / modul kernel terkait suara lainnya dimuat
- kartu suara apa yang tersedia
- dalam urutan apa kartu suara digunakan dan dipilih oleh OS dan program
- jika ada perangkat keras atau program sistem suara yang saling bertentangan
Dari mana Anda ingin memutar dan merekam suara di sistem Anda?
Pilihan Anda untuk memainkan suara, dapat:
- Dari jack headphone audio 3,5 mm internal (audio analog)
- Dari layar / monitor yang terhubung HDMI
- Dari kartu suara USB eksternal
- Dari port GPIO
Pilihan Anda untuk merekam suara, dapat:
- Sebuah. Dari kartu suara USB eksternal (dengan setidaknya satu jenis input)
- b. Dari file atau streaming
- c. Dari GPIO
Dalam posting ini , kami akan memberi tahu Anda cara memutar dan merekam menggunakan kartu suara USB eksternal .
Rencana keberhasilan bukti di masa depan?
Dengan pembaruan RPi, selalu ada perubahan dan peningkatan baru, sering kali memecahkan solusi lama. Idenya di sini, adalah membuat sesedikit mungkin perubahan pada sistem mungkin atau membuatnya jelas jika diperlukan. Itu berarti, kami lebih suka menggunakan konfigurasi oleh-pengguna, daripada yang luas sistem. Yaitu Cobalah untuk menggunakan file konfigurasi di direktori home Anda, daripada di file sistem yang dimiliki root.
TL; DR (Ayo berangkat!)
Nyalakan ulang dan pasang kartu suara USB eksternal Anda, jadi kami mulai di halaman yang sama ...
A. Kumpulkan beberapa info
# 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]
Di sini kita melihat bahwa sistem default ( card 0
) menggunakan modul ALSA bcm2835. Meskipun kami biasanya dapat menentukan kartu apa yang akan digunakan, beberapa perangkat lunak seperti omxplayer
tidak memiliki opsi ini, dan akan gagal menghasilkan suara dengan berbagai cara.
Pada titik ini Anda sudah bisa mencoba mengkonfigurasi file konfigurasi ALSA Anda. Beberapa berhasil, sementara yang lain tidak karena tidak jelas bagaimana dan di mana ini harus dilakukan. Yang akhirnya kami inginkan, adalah memberi tahu sistem kami untuk menggunakan kartu suara USB eksternal kami.
B. Hapus Audio Bloat
Kecuali Anda memiliki alasan yang sangat baik untuk menyimpan PulseAudio (PA) atau
perangkat lunak server JACK tambahan , Anda harus menghapus instalannya , jika ada. Mereka cenderung mengganggu ALSA, karena mereka mengendalikan banyak fungsi ALSA, dan semua konfigurasi tambahan yang diperlukan oleh mereka, membuat semuanya sangat membingungkan!
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
C. Nonaktifkan kartu suara internal (Broadcom)
Soundcard internal digerakkan oleh modul kernel di:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
Kecuali Anda berencana untuk menggunakan jack audio (in 1) atau HDMI (in 2), Anda harus menonaktifkan modul kernel ini. Ada dua metode untuk melakukan ini.
- Nonaktifkan dengan flag konfigurasi boot
- Cegah agar tidak dimuat ke kernel oleh
modprobe.d
daemon
Mencoba untuk tetap dengan pendekatan minimalis kami, kami memilih (1).
# 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
Jika karena alasan tertentu, Anda lebih suka menggunakan metode (2), maka Anda perlu membuat daftar hitam modul kernel. Untuk melakukan ini, Anda cukup memasukkan kata blacklist
, diikuti dengan nama modul dalam *.conf
file apa pun di bawah /etc/modprobe.d/
. Namun, sudah ada file yang kosong dan disimpan di sana, yang dipanggil raspi-blacklist.conf
untuk tujuan ini. Namun, setelah 6 bulan, Anda akan lupa tentang ini, dan apa isinya, jadi lebih baik Anda menamainya setelah modul yang Anda daftar hitam.
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
Apa bedanya? Tidak ada, AFAICT.
Setelah reboot, periksa kembali modul suara Anda.
$ 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! Bcm2835 menjengkelkan Anda ( card 0
) hilang, tetapi indeks kartu USB adalah sama! Ini sebenarnya bagus.
Konfigurasikan ALSA Anda
Seperti yang sudah saya sebutkan, kami ingin ALSA menggunakan kartu suara USB sendiri sebagai default. Ini juga berarti bahwa kami ingin memiliki indeks pertama yang tersedia dalam daftar modul suara kernel. Karena modul telah dihapus di atas dan indeksnya sama (kartu 1), kami baik. Tapi dalam kasus kita perlu beban bcm2835 lagi, kita tidak, seperti yang modul akan kembali tampil sebagai yang pertama ( card 0
).
Kita hanya perlu memberi tahu ALSA apa seharusnya indeks kartu PCM default kita
dan dalam urutan apa mereka harus diprioritaskan dalam kernel.
Ada 3 tempat di mana Anda dapat mengkonfigurasi ALSA Anda.
- yang pengguna config di:
~/.asoundrc
- yang sistem config di:
/usr/share/alsa/alsa.conf
- yang sistem modul conf di:
/lib/modprobe.d/aliases.conf
2 yang pertama mengubah perangkat default, sedangkan yang terakhir, memastikan urutan penampilan.
Kami pertama-tama memperbaiki konfigurasi khusus pengguna kami untuk digunakan card 1
. Jika Anda memiliki lebih dari satu kartu yang ditampilkan, lalu pilih indeks kartu yang Anda inginkan sebagai kartu standar.
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
Selanjutnya, kami memperbaiki konfigurasi sistem, menggunakan nomor indeks kartu yang sama seperti di atas. Kami perlu melakukan ini, karena beberapa paket sistem tidak akan pernah melihat file konfigurasi pengguna Anda.
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
Sekarang reboot untuk perubahan yang berlaku.
Anda sekarang harus memiliki sistem audio yang berfungsi.
Ayo kita coba!
Untuk melakukan tes yang tepat, Anda perlu file yang tepat untuk mengujinya. Jadi sebelum apa pun, pastikan semua file suara dan video Anda benar-benar berfungsi.
(Saya menghabiskan banyak waktu mencoba untuk mendapatkan beberapa video uji h264 / mp4 untuk memutar audio, hanya untuk menemukan nanti, bahwa tidak pernah ada audio yang dikodekan! Duh!)
PERINGATAN Jika Anda mencoba menguji video yang menggunakan MPEG-2
atau VC-1
codec, Anda harus
membeli (!) Kunci codec
dari organisasi RPi untuk dapat sepenuhnya memecahkan kode dengan decoder perangkat keras bawaan. Jika tidak, Anda harus mengonversi file terlebih dahulu.
Anda dapat memeriksa apakah codec Anda diaktifkan dengan:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
Anda akan memerlukan beberapa file terverifikasi untuk diuji. Anda dapat mengunduh dan menggunakannya jika tidak memilikinya.
# 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
Selanjutnya, ayo MAIN !!
# 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
ANDA BAIK UNTUK PERGI!
[opsional] Urutan Perangkat Keras Audio Tambahan
CATATAN Jika Anda menggunakan bagian ini, Anda perlu mengubah semua nilai indeks kartu di bagian di atas!
Jika Anda telah memasang perangkat keras audio tambahan, dan itu tidak muncul seperti yang Anda inginkan, Anda dapat memaksa untuk mengatur ulang urutan di mana modul muncul, dalam /lib/modprobe.d/aliases.conf
file.
Beberapa solusi telah mengusulkan untuk melakukan perubahan pada file ini. Sayangnya, mereka tidak menyadari bahwa modul suara USB standar RPi salah eja! Jadi perubahan tidak pernah berpengaruh. Modul kernel suara kita prihatin, dipanggil snd_usb_audio
dan tidak snd-usb-audio
. Nama file adalah snd-usb-audio.ko
dan terletak di: /lib/modules/4.9.59-v7+/kernel/sound/usb/
.
Cukup lucu, teks dalam file mengatakan itu tidak perlu diubah!
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
Referensi:
aplay
secara konsisten tidak melakukan apa pun setelah semua pekerjaan ini, sampai saya menggunakan-D plughw:0,0
alih-alih-D hw:0,0
(berdasarkan shttps: //raspberrypi.stackexchange.com/a/89162). Sayangnya, sementara hampir semuanya sekarang dapat memutar audio melalui USB, utilitas yang paling saya butuhkan untuk bekerja (vban_receptor
) masih tidak berfungsi, tetapi pada titik ini hampir pasti bukan kesalahan pengaturan lagi