Bagaimana saya bisa menggunakan kartu suara USB eksternal dan menetapkannya sebagai standar?


16

Saya mendapatkan kartu suara USB eksternal dari C-Media yang berjalan di RPi3 saya. Saya dapat memutar beberapa rekaman menggunakan aplay / arecord dengan menentukan indeks kartu dan plugin ALSA. Namun, banyak file suara lainnya tidak dapat diputar sama sekali, atau tidak seperti yang diharapkan. Beberapa perangkat lunak pemutar lain juga tidak berfungsi.

T: Bagaimana saya bisa mengatur ALSA untuk menggunakannya secara default?

Jawaban:


32

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:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

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:

  1. Dari jack headphone audio 3,5 mm internal (audio analog)
  2. Dari layar / monitor yang terhubung HDMI
  3. Dari kartu suara USB eksternal
  4. 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.

  1. Nonaktifkan dengan flag konfigurasi boot
  2. Cegah agar tidak dimuat ke kernel oleh modprobe.ddaemon

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 *.conffile apa pun di bawah /etc/modprobe.d/. Namun, sudah ada file yang kosong dan disimpan di sana, yang dipanggil raspi-blacklist.confuntuk 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-2atau 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.conffile.

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_audiodan tidak snd-usb-audio. Nama file adalah snd-usb-audio.kodan 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:


Menggunakan raspi 3B + dengan Raspian, aplaysecara konsisten tidak melakukan apa pun setelah semua pekerjaan ini, sampai saya menggunakan -D plughw:0,0alih-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
Mike 'Pomax' Kamermans

1
Ya, ini adalah mimpi buruk berdarah. Silakan lihat daftar berbagai plugin PCM di sini . Kemudian baca bagian 1 bernama "ALSA devices and plugins" di sini . Mungkin itu akan membantu titik terang tentang mengapa Anda perlu menggunakan plughwbukan hw. BTW. Karena hwlangsung ke perangkat keras, sedangkan plughwpemrosesan, Anda mungkin ingin memeriksa apa yang sebenarnya Anda coba mainkan.
not2qubit

Saya mengujinya dengan salah satu file audio pengujian standar rawa di /usr/share/sounds/alsa(khusus, Front_Center.wav)
Mike 'Pomax' Kamermans

1
Anda bintang mutlak. Saya tidak berharap bahwa mengeluarkan suara dari raspberry pi akan menjadi proyek multi-hari tanpa panduan yang jelas tentang apa yang harus dilakukan. Semua +1 untuk Anda.
Kieran

3
Adalah kriminal bahwa ada sedikit upvotes.
BradChesney79
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.