Cria um dispositivo virtual no arquivo .asoundrc

3

Eu tenho tentado criar um dispositivo virtual para gravar o áudio interno da minha placa de som usando ALSA puro. Depois de pesquisar muito, encontrei um .asoundrc file¹ muito próximo do que estou procurando:

pcm.mycard {
    type hw
    card 0
}

ctl.mycard {
    type hw
    card 0
}

pcm.myconvert {
    type plug
    slave {
        pcm "myrecord"
        format S16_LE
    }
}

pcm.myrecord {
    type file
    format "raw"
    slave.pcm "mycard"
    file "| oggenc -Q -q6 -r -B %b -C %c -R %r -o /tmp/record-$(date +%%Y-%%m-%%d_%%H%%M%%S).ogg -"
}

pcm.!default{
   type asym
   playback.pcm "myconvert"
   capture.pcm "mycard"
}

Esta configuração possibilita gravar um arquivo ogg com todo o áudio reproduzido no meu computador. O que eu gostaria de fazer agora é modificar a parte pcm.myrecord da configuração, para que o áudio seja "transmitido" em um cartão virtual que eu possa capturar mais tarde, digamos, arecord . Eu ficaria feliz se alguém pudesse me ajudar com isso.

Eu tentei isso: Como faço para criar dispositivo virtual ALSA a partir do qual eu possa gravar tudo o que é jogado? mas isso não funcionou para mim. Abaixo, a saída de arecord -L :

muammar@zarathustra /tmp 
  % arecord -L                                                                                                                                         !10015
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=PCH
    HDA Intel PCH, CS4208 Analog
    Default Audio Device
sysdefault:CARD=PCH
    HDA Intel PCH, CS4208 Analog
    Default Audio Device
front:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Front speakers
dmix:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct sample mixing device
dsnoop:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct sample snooping device
hw:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct hardware device without any conversions
plughw:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Hardware device with all software conversions
default:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
sysdefault:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
front:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Front speakers
surround21:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
dmix:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct sample mixing device
dmix:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct sample mixing device
dsnoop:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct sample snooping device
dsnoop:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct sample snooping device
hw:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct hardware device without any conversions
hw:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct hardware device without any conversions
plughw:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Hardware device with all software conversions
plughw:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Hardware device with all software conversions

Obrigado.

  1. link
por muammar 15.09.2016 / 21:09

1 resposta

4

Eu resolvi este problema da seguinte forma:

Primeiro, carregue o módulo snd-aloop :

sudo modprobe snd-aloop

Isso criará um novo dispositivo chamado Loopback :

± % cat /proc/asound/cards                                                                                                                             !10017

 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xc1814000 irq 60
 1 [HDMI           ]: HDA-Intel - HDA Intel HDMI
                      HDA Intel HDMI at 0xc1810000 irq 61
 2 [Loopback       ]: Loopback - Loopback
                      Loopback 1

A partir das informações mostradas acima, temos que criar dois dispositivos hw :

  1. hw:0,0 (PCH é minha principal placa de som).
  2. hw:2,1 (o dispositivo virtual Loopback ).

Normalmente, hw dispositivos têm o formato: hw:X,Y . Para nossos propósitos, parece que Y para o cartão principal é sempre 0 enquanto para Loopback temos Y igual a 1 .

Agora, para fazer todo esse trabalho, precisamos de um arquivo ~/.asoundrc com o seguinte:

pcm.!default {
  type asym
  playback.pcm "LoopAndReal"
  #capture.pcm "looprec"
  capture.pcm "hw:X1,Y1"
}

pcm.looprec {
    type hw
    card "Loopback"
    device 1
    subdevice 0
}


pcm.LoopAndReal {
  type plug
  slave.pcm mdev
  route_policy "duplicate"
}


pcm.mdev {
  type multi
  slaves.a.pcm pcm.MixReale
  slaves.a.channels 2
  slaves.b.pcm pcm.MixLoopback
  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
}


pcm.MixReale {
  type dmix
  ipc_key 1024
  slave {
    pcm "hw:X1,Y1"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

pcm.MixLoopback {
  type dmix
  ipc_key 1025
  slave {
    pcm "hw:Loopback,0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

Modifique hw:X1,Y1 com os valores da sua placa principal (no meu caso hw:0,0 ).

Você pode testar se essa configuração funciona reproduzindo algo em seu computador. Se você ouvir, então está bem. Agora vamos jogar algo no computador e gravá-lo deste dispositivo virtual com ffmpeg :

ffmpeg -f alsa -i hw:X2,Y2 -c:a libmp3lame -b:a 256k -vn capture.mp3

Em que hw:X2,Y2 precisa ser substituído pelo dispositivo Loopback , neste caso hw:2,1 .

Suponho que usar arecord também funcione.

    
por 16.09.2016 / 01:17