LINUX.ORG.RU

Странная разборчивость Firefox по отношению к ALSA

 , ,


1

3

Короче, есть такая конфигурация ALSA->JACK: дефолтный plug -> dmix -> loopback -> dsnoop -> alsa_in -> JACK (кусок .asoundrc ниже, без capture части, она сейчас не важна).

pcm.!default {
    type plug
    slave {
        pcm "aloopDuplex"
        format S32_LE
    }
}

pcm.aloopPlayback {
  type dmix
  ipc_key 1
  ipc_key_add_uid true
  slave {
    pcm "hw:Loopback,0,0"
    format S32_LE
#    rate 48000 # default
    period_size 1024
    buffer_size 4096
  }
}

# duplex device
pcm.aloopDuplex {
  type asym
  playback.pcm "aloopPlayback"
  capture.pcm "aloopCapture"
}

# ------------------------------------------------------
# alsa_in -j alsa_in -d cloop -r 48000 -q 1
pcm.cloop {
  type dsnoop
  ipc_key 3
  ipc_key_add_uid true
  slave {
    pcm "hw:Loopback,1,0"
    format S32_LE
#    rate 48000 # default
    period_size 1024
    buffer_size 4096
  }
}

Формат S32_LE выбран для совместимости с JACK (потому что он обычно запускается первым и alsa_in создаёт свой конец loopback’а с таким форматом).

В принципе, в таком виде всё даже работает, НО. Битрейт в алсовской части, как видно, везде дефолтный 48000. Сам JACK сидит на 96000, поэтому получается двойная конвертация: сначала из источника (с каким-то своим битрейтом) plug делает 48000, а потом уже alsa_in 96000. Мне так показалось, что можно от этого избавиться, указав везде rate 96000 для Алсы, чтобы конверсия была один раз, на стороне plug. Попробовал — ИЧСХ, оно даже работает со speaker-test, например. Но вот Файрфокс, ска, отказывается цепляться к дефолтному устройству с какой-то невнятной диагностикой, чего-то там про MediaSinkAudioError.

Сначала подумал, что ему вообще битрейт выше 48000 не нравится, но он таки цепляется и звук выводит, если: а) запустить через apulse (пульсы в системе нет); или б) если дефолтным устройством задать непосредственно звуковуху, работающую на зажатом битрейте 96000.

ХЗ, чего ему может не нравиться. Ну, то есть, скорей всего, какой-то косяк в его поддержке Алсы, которую афтары постепенно deprecate’ят, но вдруг я чего-то ещё в конфиге не учёл?

★★★★

Итак, благодаря охрененной «компетентности» ЛОРа (рофлмао), я таки вкурил доки на Алсу и причесал конфиг, выкинув лишнее и доведя до вменяемого вида. Хрен знает, что конкретно повлияло, но сейчас ФФ всё видит и звук есть с нужным битрейтом.

Если вдруг кому понадобится:

defaults.pcm.rate_converter "speexrate_best"
#defaults.pcm.rate_converter "speexrate_medium"

loop_parm {
#   float is the default for JACK's alsa_io, but dmix doesn't support it (yet?)
#    format              FLOAT_LE
    format              S32_LE
    rate                96000
    alsa_dev            0
    jack_dev            1
    playback_subdev     0
    capture_subdev      1
}

pcm.!default {
    type plug
    slave.pcm duplex
    hint {
        show on
        description "Duplex Loopback"
    }
}

pcm.duplex {
    type asym
    playback.pcm        playback_out
    capture.pcm         capture_in
}

pcm.playback_out {
    type        dmix
    ipc_key     1
    ipc_key_add_uid true
    slave {
        pcm     loop_alsa_out
        format  { @func refer name loop_parm.format }
        rate    { @func refer name loop_parm.rate }
  }
}

pcm.capture_in {
    type        dsnoop
    ipc_key     2
    ipc_key_add_uid true
    slave {
        pcm     loop_alsa_in
        format  { @func refer name loop_parm.format }
        rate    { @func refer name loop_parm.rate }
    }
}

#------ playback loop
pcm.loop_alsa_out {
    type        hw
    card        Loopback
    device      { @func refer name loop_parm.alsa_dev }
    subdevice   { @func refer name loop_parm.playback_subdev }
}

# alsa_in -j alsa_in -d loop_in -q 1
pcm.loop_in {
    type        hw
    card        Loopback
    device      { @func refer name loop_parm.jack_dev }
    subdevice   { @func refer name loop_parm.playback_subdev }

    # JACK's alsa_io needs format to be set
    format      { @func refer name loop_parm.format }
}
#------ end of playback loop

#------ capture loop
pcm.loop_alsa_in {
    type        hw
    card        Loopback
    device      { @func refer name loop_parm.alsa_dev }
    subdevice   { @func refer name loop_parm.capture_subdev }
}

# alsa_out -j alsa_out -d loop_out -q 1
pcm.loop_out {
    type        hw
    card        Loopback
    device      { @func refer name loop_parm.jack_dev }
    subdevice   { @func refer name loop_parm.capture_subdev }

    # JACK's alsa_io needs format to be set
    format      { @func refer name loop_parm.format }
}
#------ end of capture loop

Алсовские концы лупбэка выносить в отдельные PCM необязательно, можно было просто прописать их в слэйвах dmix/dsnoop, но так наглядней — на случай, если придётся вспоминать, что к чему, когда опять сломают что-нибудь в ядре, Алсе или Фоксе. Можно ещё поиграться с размерами буферов dmix/dsnoop для уменьшения задержек, но звук есть и с дефолтными.

alegz ★★★★
() автор топика

Короче, Файрфоксу может не нравиться размер period_size (или, может, buffer_size). Ему, похоже, надо, чтобы размеры были кратны чему-то, возможно, связанному с битрейтом. При 96000, например, он жрёт period_size 1023 и 1025, но НЕ 1024, который, например, установливается для dmix системным конфигом /usr/share/alsa/pcm/dmix.conf, и вообще часто рекомендуется в разных FAQ’ах. Безопасней подбирать размер через period_time — кратный миллисекунде (скажем, 10000) работает гарантированно.

alegz ★★★★
() автор топика

Ну, по крайней мере спасибо за выложенное решение. Кому нибудь возможно пригодится.

С настройкой альсы вообще всё сложно и уныло, сам лет 5 назад подбирал шаманский конфиг чтобы играло на ноуте. Возможно никакого пульса бы и не возникло если бы она легко и понятно настраивалась…

kirill_rrr ★★★★★
()
Ответ на: комментарий от alegz

Как вариант, можно сделать не !default <-> plug <-> asym <-> dmix/dsnoop, как в приведённом конфиге, а

!default <-> asym (playback) <-> plug <-> dmix 
                  (capture)  <-> plug <-> dsnoop

как в /usr/share/alsa/cards/Loopback.conf. Но не факт, что это чем-то лучше.

alegz ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.