Separar canal stereo em dois dispositivos virtuais Mono

69 views
Skip to first unread message

Caio

unread,
Apr 29, 2015, 4:36:56 PM4/29/15
to sis_emb...@googlegroups.com
Boa noite pessoal,

Alguém já teve experiência com Jack ou Alsa e pode me ajudar?

Preciso separar o canal de áudio Stereo em dois canais Mono (tanto de playback como de captura).
Seria como transformar um dispositivo de áudio de captura / playback stereo em dois dispositivos virtuais de captura/playback só que mono (L - R).
reduzir ou cortar o volume de um dos canais de áudio não é interessante pois tenho necessidade de trabalhar com os dois canais de forma simultânea e separadas.


Obrigado!

Abraços


--
----------------------------------------------
Caio Pereira

Cleiton Bueno

unread,
Apr 29, 2015, 8:04:26 PM4/29/15
to sis_emb...@googlegroups.com
Caio, você quer fazer isso direto na captura com o device de audio? Ou você já tem um arquivo(.wav, .mp3, .raw) e quer fazer isso?

Daniel Mazzer

unread,
Apr 29, 2015, 8:18:09 PM4/29/15
to sis_emb...@googlegroups.com
Caio, 

Nunca mexi com isso, mas como me interessa, andei pesquisando e encontrei algumas coisas.

Veja se te ajuda:

Acho que o caminho e criar uma interface virtual e rotear cada canal de áudio da entrada para uma dessas interfaces.

Abraço,


_______________ _____ _____ __ ___ __ _ _ _  _   
Daniel Mazzer
dma...@gmail.com
skype: danielmazzer

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

Caio

unread,
Apr 29, 2015, 8:22:14 PM4/29/15
to sis_emb...@googlegroups.com
@Cleiton
Quero fazer isso na captura e no playback

@Daniel Mazzer
Obrigado vou dar uma olhada vlw

Abraços

Caio Pereira
--
----------------------------------------------
Caio Pereira

Cleiton Bueno

unread,
Apr 29, 2015, 8:24:18 PM4/29/15
to sis_emb...@googlegroups.com
Ok, o que seria no playback. Digo isso porque, se já capturou e passou para L e R porque no playback?

Caio

unread,
Apr 29, 2015, 8:27:58 PM4/29/15
to sis_emb...@googlegroups.com
Cleiton,

Na verdade tenho uma limitação de apenas 1 codec na placa.
Como minha aplicação irá trabalhar apenas com áudio Mono, estou tentando transformar "um codec stereo em dois mono" (a grosso modo).
Imagine 1 Speaker e 1 Mic para cada canal.

Abs

Caio Pereira

Caio

unread,
Apr 29, 2015, 8:29:05 PM4/29/15
to sis_emb...@googlegroups.com
@Daniel Mazzer

Na captura eu consegui achar esse link

http://alsa.opensrc.org/Dsnoop#Recording_from_left_or_right_channel

Vou testar amanhã.
No playback ainda estou buscando.

Abs

--
----------------------------------------------
Caio Pereira

Cleiton Bueno

unread,
Apr 29, 2015, 9:23:41 PM4/29/15
to sis_emb...@googlegroups.com
Mesmo assim não entendi como o playback encaixaria no projeto, mas tudo bem.

Se for Linux acho que da pra resolver fácil isso.

Já implementei em Python e com Linux coisas como pegar um audio X e dividir em dois canais e o oposto, juntá-los, e outro caso foi, iniciar aplicação e realizar a gravação do device por numero de amostras e/ou tempo e na sequencia processava e fazia outras coisas.


Processar wave pode usar o modulo nativo wave https://docs.python.org/2/library/wave.html
Para lidar com device, pode usar o ossaudiodev (https://docs.python.org/2/library/ossaudiodev.html)
Ou o alsaaudio, porém alsaaudio você deverá instalar, facil -> apt-get install python-alsaaudio (http://pyalsaaudio.sourceforge.net/)
Manipulação eu gosto de usar a audioop, não precisa instalar, apenas importar o modulo (https://docs.python.org/2/library/audioop.html)


Não sei ao certo o foco da sua aplicação, mas acho que com alsaaudio e audioop você resolve o problema e em poucas linhas, o legal dessas libs é a liberdade de recursos que você tem.

E pra você ainda, se instalar a python-alsaaudio acessa o diretório:

/usr/share/doc/python-alsaaudio/examples/ e la tem:

mixertest.py
playbacktest.py
recordtest.py
test.py



Usei como base esses caras na época.


Espero que ajude.


Att,
Cleiton Bueno


Blog | Linkedin | Portal Embarcados | Twitter | Google+


Em quarta-feira, 29 de abril de 2015 17:36:56 UTC-3, caiortp escreveu:

Caio

unread,
Apr 29, 2015, 9:55:55 PM4/29/15
to sis_emb...@googlegroups.com
Cleiton ,

Obrigado pela dica, mas acho que utilizando ossaudiodev você não vai conseguir separar o canal de áudio em L e R, apenas vai conseguir mono ( por favor me corrija se estiver errado).

É realmente é difícil imaginar a situação, mas nem sempre os projetos são do jeito que queremos.

Mas image uma aplicação na qual você tem duas interfaces de áudio
Viva Voz (Mic + Speaker) e dois conectores de áudio (head phone e mic) (mas apenas 1 codec de áudio) e neste caso vc poderá instanciar 2 softphones independentes.

Não é a aplicação, mas tentando demonstrar um exemplo.

Abraços

Caio Pereira

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.



--
----------------------------------------------
Caio Pereira

Cleiton Bueno

unread,
Apr 29, 2015, 10:31:18 PM4/29/15
to sis_emb...@googlegroups.com
Ok, sobre o ossaudiodev vi que ele trabalha com os dois canais após configurar no channels, mas não sei se realmente separa dentro da função controls, talvez usando o audioop você mata isso, porque o audioop tem essa função:

    lsample = audioop.tomono(sample, width, 1, 0)
    rsample = audioop.tomono(sample, width, 0, 1)

Ae separa cada L e R.

Mas para o seu caso, acho que alsaaudio + audioop casa perfeito.

Caio

unread,
Apr 29, 2015, 10:50:19 PM4/29/15
to sis_emb...@googlegroups.com
Cleiton,

Obrigado! Vou testar.


Abraços

Caio Pereira

Caio

unread,
Apr 29, 2015, 11:14:57 PM4/29/15
to sis_emb...@googlegroups.com
Acho que consegui alguma coisa aqui.
Consegui separar os dois canais de áudio para playback


Referências
http://www.mixxx.org/forums/viewtopic.php?f=3&t=3848

asoundrc.conf

pcm.device-separation {
   type dmix
   ipc_key 1234
   slave {
      pcm "hw:0,0"
      period_time 0
      period_size 1024
      buffer_size 4096
      rate 44100
   }
}

pcm.unified-left {
   type route
   slave.pcm device-separation
   slave.channels 2
   ttable.0.0 0.5
   ttable.1.0 0.5
}

pcm.unified-right {
   type route
   slave.pcm device-separation
   slave.channels 2
   ttable.0.1 0.5
   ttable.1.1 0.5
}


aplay -D unified-left /usr/share/sounds/alsa/Side_Right.wav & aplay -D unified-right /usr/share/sounds/alsa/Side_Left.wav


Para captura eu ainda não testei mas estou seguindo esse tutorial mas aqui em casa não vou conseguir testar
http://alsa.opensrc.org/Dsnoop#Recording_from_left_or_right_channel


Se eu conseguir utilizar isso como um device virtual fica 100%

Obrigado pessoal.

Abraços

Caio Pereira
--
----------------------------------------------
Caio Pereira

Caio

unread,
May 27, 2015, 8:48:33 AM5/27/15
to sis_emb...@googlegroups.com
Bom dia pessoal,

Compartilhando a solução

arquivo ~/.asoundrc

pcm.record_left {
    type dsnoop
    ipc_key 234884
    slave {
        pcm "hw:0,0"
        channels 2
    }
    bindings.0  0
}
pcm.record_right {
    type dsnoop
    ipc_key 2241234
    slave {
        pcm "hw:0,0"
        channels 2
    }   
    bindings.0  1

}

pcm.device-separation {
   type dmix
   ipc_key 1234
   slave {
      pcm "hw:0,0"
      period_time 0
      period_size 4096
      buffer_size 8192
      rate 44100
   }
}

pcm.play_left {

   type route
   slave.pcm device-separation
   slave.channels 2
   ttable.0.0 0.5
   ttable.1.0 0.5
}

pcm.play_right {

   type route
   slave.pcm device-separation
   slave.channels 2
   ttable.0.1 0.5
   ttable.1.1 0.5
}



Para testar.

aplay -D play_left /usr/share/sounds/alsa/Side_Right.wav
aplay -D play_right /usr/share/sounds/alsa/Side_Left.wav


arecord -D record_left left.wav
arecord -D record_right right.wav

OBS: Quando utilizado um microfone stereo você irá observar apenas que o áudio gravado será mono.

Ainda é possível utilizar plugins LADSPA (Linux Audio Developer's Simple Plugin API)  , como um filtro passa baixa, passa alta entre outros. O LADSPA também é utilizado pelo Audacity, caso você tenha instalado algum plugin do Audacity poderá ser reaproveitado no arquivo .asoundrc
www.ladspa.org

Para testar utilizei alguns plugins do repositório
https://github.com/swh/ladspa

É possível adicionar um filtro passa baixa Butterworth apenas para o canal play_right
A Alteração do arquivo ficaria assim.

Alterar o type do pcm.play_right para tipo plug

pcm.play_right {
   type plug

   slave.pcm device-separation
   slave.channels 2
   ttable.0.1 0.5
   ttable.1.1 0.5
}

Adicione o filtro

pcm.play_right_filter {
    type ladspa
    slave.pcm "play_right";
    path "/usr/lib/ladspa";
    plugins [{
    label buttlow_iir
    input {
        controls [ 3800 1.1  ]
    }
    }]
}

aplay -D play_right_filter teste.wav



Para utilizar filtro na captura
Adicione

pcm.left_side {
   type plug
   slave.pcm record_left
}

pcm.input_left_filter {
    type ladspa
    slave.pcm "left_side";
    path "/usr/lib/ladspa";
    plugins [{
        label buttlow_iir
        input {
                controls [ 3800 1.1  ]
        }
    }]
}


arecord -D input_left_filter teste.wav


A Sintaxe de configuração do alsa é bem chata! Mas dá para fazer bastante coisa.


Abraços


Caio Pereira
--
----------------------------------------------
Caio Pereira
Reply all
Reply to author
Forward
0 new messages