Xuất âm thanh cho nhiều thiết bị âm thanh một cách đồng thời


10

Tôi muốn RasPi của tôi gửi âm thanh đến cổng âm thanh trên bo mạch của tôi và cả thẻ kỹ thuật số của tôi (I2S Hifiberry Digi). Điều này nên có thể với ALSA. Tôi đã tải trình điều khiển và có thể gửi riêng cho cả hai thiết bị âm thanh, nhưng kết hợp chúng chỉ không hoạt động. Có một số bài viết trên mạng giải thích cách thực hiện việc này, nhưng tôi không thể làm cho cấu hình của mình hoạt động.

Lỗi từ aplay:

Playing WAVE 'sin1000_48khz.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM not usable
aplay: set_params:1059: Broken configuration for this PCM: no configurations available

Đầu ra của "aplay -l"

**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Đầu ra của "aplay -L"

null
   Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=sndrpihifiberry
    snd_rpi_hifiberry_digi,
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device`

Nội dung của /etc/asound.conf

pcm.both {
    type route
    slave.pcm {
        type multi    
        slaves.a.pcm "hw:0,0"
        slaves.b.pcm "hw:1,0"
        slaves.a.channels 2
        slaves.b.channels 2

        bindings.0.slave a
        bindings.0.channel 0    
        bindings.1.slave a
        bindings.1.channel 1

        bindings.2.slave b
        bindings.2.channel 0
        bindings.3.slave b
        bindings.3.channel 1
    }

    ttable.0.0 1
    ttable.1.1 1

    ttable.0.2 1
    ttable.1.3 1
}

ctl.both {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.hifiberry {
    type hw    
    card sndrpihifiberry
    device 0
}

ctl.hifiberry {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.audioout {
    type hw
    card ALSA
    device 0
}

ctl.audioout {
    type hw
    card ALSA
    device 0
}

pcm.!default {
    type plug
    slave {
        pcm both
    }
}

#pcm.!default {    
#    type hw
#    card sndrpihifiberry
#    device 0
#}

ctl.!default {
    type hw
    card sndrpihifiberry
    device 0
}

Tôi nghĩ bạn nên nhìn vào pulseaudio. Nhưng tôi có thể sai ở đây
Gerben

3
Tôi đã xem xét pulseaudio. Kinh nghiệm của tôi là về cơ bản nó không hoạt động.
Christi

Sau khi điều tra thêm (và lần thử thứ hai với pulseaudio), tôi nghĩ rằng vấn đề là loại tính năng này yêu cầu quyền truy cập chung vào bộ nhớ card âm thanh và / hoặc hỗ trợ mmap. Trình điều khiển RasPi I2S không hỗ trợ điều này. Tôi thực sự không thể xác nhận điều này, vì không có thông tin gỡ lỗi đặc biệt hữu ích nào từ ALSA hoặc PulseAudio - nói chung, mọi thứ đều hoạt động cho đến khi bạn cố gắng tham gia vào nhiều nguồn âm thanh. Tôi không chắc liệu điều này có được khắc phục trong hạt nhân RasPi hay không, nhưng cố gắng khắc phục nó sẽ mất nhiều thời gian hơn tôi sẵn sàng đầu tư.
Christi

Tôi chỉ có thể đề nghị cố gắng để pulseaudio hoạt động , vì nó có khả năng thực hiện chính xác những gì bạn muốn làm (bao gồm cả việc mở rộng sang các soundcard khác trên mạng).
earthmeLon

Như tôi đã đề cập ở trên, tôi đã làm cho Pulseaudio hoạt động. Nó hoạt động tốt trên từng thiết bị riêng lẻ và sau đó thất bại khi bạn cố gắng tạo một luồng đến nhiều đầu ra cùng một lúc. Tôi tin rằng việc thiếu ánh xạ bộ nhớ trong trình điều khiển RasPi I2S là thủ phạm, nhưng việc gỡ lỗi thêm về cơ bản sẽ liên quan đến việc tìm hiểu cấu trúc bên trong của ALSA và / hoặc Pulseaudio mà tôi không có thời gian hoặc thiên hướng để làm.
Christi

Câu trả lời:


1

Đó là một chút hack nhưng bạn đã xem xét teelệnh? Đọc thêm về StackExchange theo hướng phát lại của tee và xem Wiki của artical để biết thêm ví dụ. Tôi nghĩ rằng nếu bạn có một lệnh xuất tên tệp hoặc liên kết đến nội dung phương tiện, lscó lẽ và sử dụng teeđể gọi các lệnh đến trình phát đa phương tiện ưa thích của bạn. Đây là cách tôi sẽ viết kịch bản xung quanh vấn đề ...


#!/bin/bash
MediaPlayer="$1"
MediaOptions1="$2"
MediaOptions2="$3"
InputParcer="ls $4"
${InputParcer} | tee >(${MediaPlayer} ${MediaOptions1}) >(${MediaPlayer} ${MediaOptions2}) || echo 'Exiting baddly'

Ghi chú:

Ở trên có thể được mã hóa cứng để có các tùy chọn chắc chắn cho mỗi lần đưa ra ngoài và InputParcerbiến cần được chỉnh sửa nếu bạn dự định gửi một thư mục hoặc liên kết web có chứa nhiều hơn một tệp phương tiện. Nhưng một tệp tại một thời điểm này sẽ xuất ra cả hai nếu MediaOptions1/2 được mã hóa cứng hoặc được đặt trên mỗi lần chạy. Đó là một chút hack, bạn đã được cảnh báo.

... Sau khi thử nghiệm và sau đó tôi có khả năng ném vào if [ ${#} < 4]; then echo "error"; figần đầu; chỉnh sửa 4bao nhiêu đối số mà tôi cảm thấy cần phải có. Chạy như vậy bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'là chắc chắn sẽ sửa đổi cho hệ thống của bạn các tùy chọn và đường dẫn tệp bạn muốn chạy; những thứ ở giữa <>.

Vấn đề với việc sử dụng teelà nó không khả thi giữa các hương vị của Linux và nó có thể gây ra sự cố với âm thanh không phát đồng bộ giữa các đầu ra. Thay vào đó, tôi khuyên bạn nên sử dụng omxplayer -o bothđể xuất âm thanh cho hai thiết bị riêng biệt, nhưng vì điều này chỉ được thử nghiệm trên một RPi có HDMI & Audio được cắm vào, không hoàn toàn là thiết lập được OP và OP yêu cầu alsa.

Ngoài ra còn có một blog đẹp về chủ đề cấu hình đa người dùng card âm thanh alsa mà bạn có thể muốn xem qua; có lẽ bạn đã có lỗi trong đó sẽ khiến mã trên của tôi chặn điểm tranh luận; chỉ cần lưu ý rằng hướng dẫn ở đó hướng tới Slaker có hương vị Linux chứ không phải Raspbian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.