Aynı anda birden fazla ses cihazına ses çıkışı


10

RasPi'min yerleşik ses çıkış portuma ve ayrıca Dijital çıkış kartım (I2S Hifiberry Digi) için ses göndermesini istiyorum. Bu ALSA ile mümkün olmalıdır. Sürücüleri yükledim ve her iki ses cihazına da ayrı ayrı gönderebilirim, ancak onları birleştirmek işe yaramıyor. Bunu nasıl yapacağınızı açıklayan birkaç yazı var, ancak yapılandırmamın çalışmasını sağlayamıyorum.

Aplay hatası:

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

"Aplay -l" çıktısı

**** 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

"Aplay -L" çıktısı

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`

/Etc/asound.conf içeriği

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
}

Bence pulseaudio'ya bakmalısın. Ama burada yanılmış olabilirim
Gerben

3
Pulseaudio'ya baktım. Benim deneyim temelde işe yaramadı oldu.
Christi

Daha fazla araştırmadan sonra (ve pulseaudio ile ikinci bir girişimden sonra), sorunun bu tür özelliklerin ses kartı belleğine ve / veya mmap desteğine ortak erişim gerektirdiğini düşünüyorum. RasPi I2S sürücüsü bunu desteklemiyor. ALSA veya PulseAudio'dan özellikle yararlı bir hata ayıklama bilgisi olmadığından bunu gerçekten doğrulayamıyorum - genel olarak, birden fazla ses kaynağına girmeye çalışana kadar her şey çalışıyor. Bunun RasPi çekirdeklerinde düzeltilip düzeltilmeyeceğinden emin değilim, ancak düzeltmeye çalışmak yatırım yapmaya hazır olduğumdan daha fazla zaman alacaktı.
Christi

Sadece pulseaudio'yu çalışmaya çalışmayı önerebilirim , çünkü tam olarak ne yapmak istediğinizi yapabilir (ağdaki diğer ses kartlarına genişletme dahil).
16'da

Yukarıda da bahsettiğim gibi Pulseaudio'yu çalıştırdım. Her aygıtta iyi çalışır ve aynı anda birden çok çıkış için bir akış oluşturmaya çalıştığınızda başarısız olur. RasPi I2S sürücüsünde suçlunun bellek haritalama eksikliğine inanıyorum, ancak daha fazla hata ayıklama, temelde ALSA ve / veya Pulseaudio'nun iç yapısını öğrenmem, zamanım veya eğilimim yok.
Christi

Yanıtlar:


1

Biraz kibirli ama teekomutu düşündün mü? Tee yeniden yönde StackExchange hakkında daha fazla bilgi edinin ve daha fazla örnek için Wiki'nin makalesine bakın . Dosya adını veya medya içeriğine bağlantı veren bir komutunuz varsa lsve belki de teetercih ettiğiniz medya yürütücüsüne komut çağırmak için kullandığınızı düşünüyorum. Sorunun etrafına nasıl yazı yazacağım ...


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

Notlar:

Yukarıdakilerin her çıkış çatallama için belirli seçeneklere sahip olması zor bir şekilde kodlanmış olabilir ve InputParcerbirden fazla medya dosyası içeren bir dizin veya web bağlantısı göndermeyi planlıyorsanız değişken düzenlenmelidir. Ama her seferinde bir dosya, bu should hem çıkış ise MediaOptions1/2 ya sert kodlu veya her kaçak seti vardır. Biraz kurnaz, uyarıldın.

... test ettikten sonra ve muhtemelen if [ ${#} < 4]; then echo "error"; fien üste fırlatırdım ; 4orada olması gerektiğini düşündüğüm argümanlar için düzenleme . Olduğu gibi çalıştırmak bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>', sisteminiz için çalıştırılmasını istediğiniz seçenekleri ve dosya yollarını değiştirdiğinizden emin olabilirsiniz; arasındaki şeyler <>.

Kullanmayla teeilgili sorunlar , Linux'un lezzetleri arasında çok erişilebilir olmaması ve ses ile çıkışlar arasında senkronize olmayan sorunlara neden olabilmesidir. Bunun yerine omxplayer -o both, iki ayrı cihaza ses çıkışı için kullanmanızı öneririm , ancak bu sadece HDMI ve Ses çıkışı takılı bir RPi üzerinde test edildiğinden, OP ve OP tarafından kullanılan kurulum tam olarak bir şey istemedi alsa.

Ayrıca bakmak isteyebilirsiniz alsa çok ses kartı çok kullanıcı yapılandırmaları konusunda güzel bir blog var; belki de yukarıdaki kodumu tartışmalı bir nokta haline getirecek bir hatayla karşılaşırsınız; sadece orada kılavuz Raspbian değil Slaker aromalı Linux yönelik olduğunu unutmayın.

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.