ฉันจะใช้การ์ดเสียง USB ภายนอกและตั้งเป็นค่าเริ่มต้นได้อย่างไร


16

ฉันมีการ์ดเสียง USB ภายนอกจากC-Media ที่ทำงานบน RPi3 ของฉัน ฉันสามารถเล่นการบันทึกโดยใช้aplay / arecordโดยการระบุดัชนีบัตรและปลั๊กอิน ALSA อย่างไรก็ตามไฟล์เสียงอื่น ๆ จำนวนมากไม่เล่นเลยหรือไม่เป็นไปตามที่คาดไว้ ซอฟต์แวร์เครื่องเล่นอื่น ๆ บางอย่างไม่ทำงาน

ถาม: ฉันจะตั้งค่า ALSA ให้ใช้งานเป็นค่าเริ่มต้นได้อย่างไร

คำตอบ:


32

พื้นหลัง

มันวิเศษมากที่ได้เห็นว่ามีความพยายามมากแค่ไหนในการพยายามแก้ไขปัญหาเกี่ยวกับเสียงต่างๆสำหรับ Raspberry Pi เห็นได้ชัดว่ามันจะต้องเป็นจุดอ่อนที่สุดสำหรับผู้ใช้ใหม่ที่จะพัฒนาและใช้ ALSA ภายใต้ Raspbian ได้สำเร็จ หลังจากใช้เวลาและความพยายามอย่างมากเพื่อให้เสียง RPi3 ของฉันทำงานในระบบปฏิบัติการรุ่นต่าง ๆ และใน Linux ดิสทริบิวชันอื่น ๆ ด้วยฉันตัดสินใจที่จะเขียนหน้าสรุปโซลูชันไปสู่ อย่างน้อยสำหรับหัวข้อของการใช้การ์ดเสียงภายนอกบนล่าสุด Raspbian ยืด

ระบบเสียง ALSA

ALSA มีวัตถุประสงค์เพื่อสนับสนุนอุปกรณ์ที่ใช้ * nix ประเภทใดก็ได้โดยไม่คำนึงถึงการกำหนดค่าฮาร์ดแวร์และคำนึงถึงอายุของฮาร์ดแวร์ จำเป็นต้องมีจุดเล็ก ๆ ในการพยายามที่จะได้รับรายละเอียด ของการพัฒนา20 ปี เราใช้สิ่งสำคัญกับสถานการณ์ปัจจุบัน

อย่างไรก็ตามในเวลาไม่นานในประวัติศาสตร์มนุษย์ได้สร้างไดอะแกรมที่ไร้ประโยชน์และผิดปกติจำนวนมากเพื่อพยายามอธิบาย ALSA คนเดียวที่ให้ข้อมูลจากระยะไกลคือสองคนนี้:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

รับข้อมูลระบบ

ขั้นตอนแรกคือการหาว่าเสียงมีอะไรทำงานและฮาร์ดแวร์ใดบ้างที่คุณมีอยู่ มีหลายวิธีที่จะค้นหาตัวตน แต่สำหรับคนทั่วไปรายละเอียดส่วนใหญ่นั้นไร้ความหมาย เราแสดงสิ่งที่สำคัญที่สุด

เราต้องการรู้อะไรเกี่ยวกับระบบ (เสียง) ของเรา

เราต้องการที่จะรู้ว่า:

  • ชื่อและเวอร์ชั่นของฮาร์ดแวร์เสียงในตัว
  • ชื่อและเวอร์ชั่นของฮาร์ดแวร์เสียงภายนอก
  • เคอร์เนลไดรเวอร์ใด (โมดูล) ที่ใช้
  • มีการโหลดไดรเวอร์ / โมดูลเคอร์เนลเสียงอื่น ๆ ที่เกี่ยวข้องกับเสียงอะไร
  • มีการ์ดเสียงอะไรบ้าง
  • ลำดับของการ์ดเสียงที่ใช้และเลือกโดยระบบปฏิบัติการและโปรแกรม
  • หากมีโปรแกรมฮาร์ดแวร์หรือระบบเสียงที่ขัดแย้งกัน

คุณต้องการเล่นและบันทึกเสียงบนระบบของคุณจากที่ใด

ตัวเลือกของคุณสำหรับการเล่นเสียงสามารถ:

  1. จากช่องเสียบหูฟังเสียง 3.5 มม. ภายใน (เสียงอะนาล็อก)
  2. จากหน้าจอ / มอนิเตอร์ที่เชื่อมต่อ HDMI
  3. จากการ์ดเสียง USB ภายนอก
  4. จากพอร์ต GPIO

ตัวเลือกของคุณสำหรับการบันทึกเสียงสามารถ:

  • จากการ์ดเสียง USB ภายนอก (ที่มีอินพุตอย่างน้อยหนึ่งประเภท)
  • ข จากไฟล์หรือสตรีม
  • ค. จาก GPIO

ในนี้โพสต์เราจะบอกวิธีการเล่นและบันทึกการใช้การ์ดเสียง USB ภายนอก

แผนความสำเร็จในอนาคตพิสูจน์?

ด้วยการอัปเดตของ RPi ทำให้มีการเปลี่ยนแปลงและปรับปรุงใหม่ ๆ อย่างต่อเนื่องซึ่งมักจะทำลายโซลูชันเก่า แนวคิดในที่นี้คือการเปลี่ยนแปลงระบบให้น้อยที่สุดเท่าที่จะทำได้หรือทำให้ชัดเจนหากจำเป็น ซึ่งหมายความว่าเราต้องการใช้การกำหนดค่าตามผู้ใช้มากกว่าระบบที่กว้าง เช่นพยายามใช้ไฟล์การกำหนดค่าในไดเรกทอรีบ้านของคุณแทนที่จะเป็นไฟล์ระบบที่เป็นเจ้าของรูท


TL; DR (เริ่มกันเถอะ!)

รีบูตและปลั๊กอินการ์ดเสียง USB ภายนอกของคุณดังนั้นเราจึงเริ่มต้นในหน้าเดียวกัน ...

A. รวบรวมข้อมูล

# 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]

ที่นี่เราเห็นว่าค่าเริ่มต้นของระบบ ( card 0) กำลังใช้โมดูล bcm2835 ALSA แม้ว่าโดยปกติเราจะสามารถระบุการ์ดที่จะใช้ แต่ซอฟต์แวร์บางอย่างเช่นomxplayer ไม่มีตัวเลือกนี้และจะไม่สร้างเสียงใด ๆ ในรูปแบบต่างๆ

ถึงตอนนี้คุณสามารถลองกำหนดค่าไฟล์ ALSA ได้แล้ว บางคนประสบความสำเร็จในขณะที่คนอื่น ๆ ไม่ได้เพราะไม่ชัดเจนว่าควรทำอย่างไรและที่ไหน สิ่งที่เราต้องการในที่สุดคือบอกให้ระบบของเราใช้การ์ดเสียง USB ภายนอกของเรา

B. ลบเสียงบวม

หากคุณไม่มีเหตุผลที่ดีในการเก็บPulseAudio (PA) หรือ ซอฟต์แวร์เซิร์ฟเวอร์JACK เพิ่มเติม คุณควรถอนการติดตั้งหากมี พวกเขามักจะยุ่งเกี่ยวกับ ALSA เนื่องจากพวกเขาควบคุมฟังก์ชั่น ALSA จำนวนมากและการกำหนดค่าเพิ่มเติมทั้งหมดที่จำเป็นสำหรับผู้ใช้ทำให้สิ่งต่าง ๆ สับสนอย่างไม่น่าเชื่อ!

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. ปิดการใช้งานการ์ดเสียงภายใน (Broadcom)

การ์ดเสียงภายในขับเคลื่อนโดยโมดูลเคอร์เนลใน: /lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko หากคุณไม่ได้วางแผนที่จะใช้แจ็คเสียง (ใน 1) หรือ HDMI (ใน 2) คุณควรปิดการใช้งานโมดูลเคอร์เนลนี้ มีสองวิธีในการทำเช่นนี้

  1. ปิดใช้งานด้วยการตั้งค่าสถานะการบูต
  2. ป้องกันมิให้โหลดลงในเคอร์เนลโดยmodprobe.ddaemon

พยายามอยู่กับแนวทางแบบเรียบง่ายเราเลือก (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

หากด้วยเหตุผลบางอย่างคุณต้องการใช้วิธีการ (2) จากนั้นคุณต้องบัญชีดำโมดูลเคอร์เนล การทำเช่นนี้คุณเพียงแค่ใส่คำblacklistตามด้วยชื่อของโมดูลในไฟล์ภายใต้*.conf /etc/modprobe.d/อย่างไรก็ตามมีไฟล์ที่ว่างและสำรองไว้แล้วซึ่งถูกเรียกraspi-blacklist.confใช้เพื่อจุดประสงค์นี้ อย่างไรก็ตามหลังจาก 6 เดือนคุณจะลืมเรื่องนี้และสิ่งที่อยู่ในนั้นดังนั้นคุณควรตั้งชื่อให้ดีขึ้นหลังจากโมดูลที่คุณกำลังขึ้นบัญชีดำ

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

ความแตกต่างคืออะไร? ไม่มี AFAICT

หลังจากรีบูตให้ตรวจสอบโมดูลเสียงของคุณอีกครั้ง

$ 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

บอม! bcm2835 ที่น่ารำคาญของคุณcard 0หายไปแล้ว แต่ดัชนีของการ์ด USB เหมือนกัน! นี่เป็นสิ่งที่ดีจริงๆ

กำหนดค่า ALSA ของคุณ

ตามที่ฉันได้กล่าวไปแล้วเราต้องการให้ ALSA ใช้การ์ดเสียง USB ของเราเป็นค่าเริ่มต้น นี่ก็หมายความว่าเราต้องการให้มีดัชนีแรกที่มีอยู่ในรายการของโมดูลเสียงเคอร์เนล เนื่องจากโมดูลถูกลบด้านบนและดัชนีเหมือนกัน (การ์ด 1) เราก็ดี แต่ในกรณีที่เราต้อง bcm2835 โหลดอีกครั้งเราไม่ได้เป็นที่โมดูลจะปรากฏขึ้นอีกครั้งเป็นครั้งแรก ( card 0)

เราเพียงแค่ต้องบอก ALSA ว่าดัชนีบัตร PCM เริ่มต้นของเราควรเป็นอย่างไร และในลำดับใดที่ควรจัดลำดับความสำคัญในเคอร์เนล

มี 3 ที่ที่คุณสามารถกำหนดค่า ALSA ของคุณได้

  • config ของผู้ใช้ใน:~/.asoundrc
  • กำหนดค่าระบบใน:/usr/share/alsa/alsa.conf
  • conf โมดูลระบบใน:/lib/modprobe.d/aliases.conf

2 ตัวแรกเปลี่ยนอุปกรณ์เริ่มต้นในขณะที่ตัวสุดท้ายให้ความมั่นใจในลำดับของการปรากฏตัว

เราแก้ไขการตั้งค่าเฉพาะของผู้ใช้card 1ก่อน หากคุณมีการ์ดแสดงมากกว่าหนึ่งใบให้เลือกดัชนีของการ์ดที่คุณต้องการให้เป็นค่าเริ่มต้น

#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc

pcm.!default {
        type hw
        card 1
}

ctl.!default {
        type hw
        card 1
}
EOF

ต่อไปเราจะแก้ไขการกำหนดค่าระบบโดยใช้หมายเลขดัชนีบัตรเดียวกันข้างต้น เราต้องทำเช่นนี้เพราะแพ็คเกจระบบบางอย่างจะไม่เห็นไฟล์กำหนดค่าผู้ใช้ของคุณ

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

ตอนนี้รีบูตเพื่อให้การเปลี่ยนแปลงมีผล

ตอนนี้คุณควรมีระบบเสียงที่ใช้งานได้


มาทดสอบกัน!

ในการทำการทดสอบที่เหมาะสมคุณต้องมีไฟล์ที่เหมาะสมในการทดสอบ ดังนั้นก่อนอื่นให้ตรวจสอบให้แน่ใจว่าไฟล์เสียงและวิดีโอทั้งหมดของคุณใช้งานได้จริง

(ฉันใช้เวลานานมากในการลองทดสอบวิดีโอ h264 / mp4 เพื่อเล่นเสียงเพื่อค้นพบในภายหลังเท่านั้นว่ามันไม่เคยเข้ารหัสเสียงเลย! Duh!)

คำเตือนหากคุณพยายามทดสอบวิดีโอที่ใช้MPEG-2หรือVC-1 ตัวแปลงสัญญาณคุณต้อง ซื้อ (!) รหัสตัวแปลงสัญญาณ จากองค์กร RPi เพื่อให้สามารถถอดรหัสได้อย่างสมบูรณ์ด้วยตัวถอดรหัสฮาร์ดแวร์ในตัว มิฉะนั้นคุณจะต้องแปลงไฟล์ก่อน

คุณสามารถตรวจสอบว่าตัวแปลงสัญญาณของคุณเปิดใช้งานด้วย:

# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1

คุณจะต้องมีไฟล์ที่ได้รับการตรวจสอบเพื่อทำการทดสอบ คุณสามารถดาวน์โหลดและใช้สิ่งเหล่านี้ได้หากคุณไม่มี

# 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

ต่อไปมาเล่นกันเถอะ !!

# 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

คุณพร้อมที่จะไป!


[ไม่บังคับ] ลำดับของฮาร์ดแวร์เสียงเพิ่มเติม

หมายเหตุ หากคุณใช้ส่วนนี้คุณจะต้องเปลี่ยนค่าดัชนีบัตรทั้งหมดในส่วนด้านบน!

หากคุณแนบฮาร์ดแวร์เครื่องเสียงเพิ่มเติมและไม่ปรากฏขึ้นตามที่คุณต้องการคุณสามารถบังคับให้จัดเรียงลำดับการแสดงโมดูลใหม่ใน/lib/modprobe.d/aliases.confไฟล์

โซลูชันบางตัวเสนอให้ทำการเปลี่ยนแปลงในไฟล์นี้ น่าเสียดายที่พวกเขาไม่ทราบว่าโมดูลเสียง USB เริ่มต้นของ RPi นั้นสะกดผิด! ดังนั้นการเปลี่ยนแปลงจะไม่มีผล โมดูลเสียงเคอร์เนลที่เรามีความกังวลกับจะเรียกว่าไม่snd_usb_audio snd-usb-audioชื่อไฟล์ที่ถูกและตั้งอยู่ใน:snd-usb-audio.ko/lib/modules/4.9.59-v7+/kernel/sound/usb/

ตลกพอข้อความในไฟล์บอกว่าไม่จำเป็นต้องแก้ไข!

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

อ้างอิง:


การใช้ raspi 3B + กับ Raspian aplayไม่ได้ทำอะไรหลังจากทำงานนี้มาตลอดจนกระทั่งฉันใช้-D plughw:0,0แทน-D hw:0,0(ตาม shttps: //raspberrypi.stackexchange.com/a/89162) น่าเสียดายที่ในขณะนี้เกือบทุกอย่างสามารถเล่นเสียงผ่าน USB ได้ยูทิลิตี้ที่ฉันต้องทำงานส่วนใหญ่ ( vban_receptor) ยังใช้งานไม่ได้ แต่ ณ จุดนี้มันแทบจะไม่ใช่ความผิดของการตั้งค่าอีกต่อไปแล้ว
Mike 'Pomax' Kamermans

1
ใช่นี่คือฝันร้ายนองเลือด โปรดดูได้ที่รายการปลั๊กอิน PCM ที่แตกต่างกันที่นี่ อ่านแล้วส่วนที่ 1 ชื่อ"อุปกรณ์ ALSA และปลั๊กอิน" ที่นี่ บางทีนั่นอาจจะช่วยให้หลั่งน้ำตาแสงบางอย่างเกี่ยวกับเหตุผลที่คุณต้องการที่จะใช้แทนplughw hwBTW เนื่องจากhwตรงไปยังฮาร์ดแวร์ในขณะที่plughwประมวลผลบางอย่างคุณอาจต้องการตรวจสอบสิ่งที่คุณกำลังพยายามเล่นจริง
not2qubit

ฉันทดสอบด้วยหนึ่งในไฟล์เสียงทดสอบมาตรฐาน bog ใน/usr/share/sounds/alsa(โดยเฉพาะFront_Center.wav)
Mike 'Pomax' Kamermans

1
คุณติดดาวแน่นอน ฉันไม่ได้คาดหวังว่าการได้รับเสียงจากราสเบอร์รี่ปี่จะเป็นโครงการที่ใช้เวลาหลายวันโดยไม่มีคำแนะนำที่ชัดเจนเกี่ยวกับสิ่งที่ต้องทำ +1 ทั้งหมดสำหรับคุณ
Kieran

3
เป็นความผิดทางอาญาที่มีผู้ลงคะแนนเสียงน้อยมาก
BradChesney79
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.