LINUX.ORG.RU

Помогите настроить alsa

 , , ,


0

1

С помощью Chat GPT составил конфиг:

pcm.!default {
    type asym

    playback.pcm {
        type dmix
        ipc_key 1024
        slave.pcm 'hw:0,0'
        slave {
           pcm 'hw:0,0'
           rate 44100
           format S24_3LE
        }
        bindings {
            0 0
        }
    }

    capture.pcm {
        type plug
        slave.pcm 'hw:0,0'
        format S24_3LE
    }
}

pcm.rate44100 {
    type rate
    slave.pcm dmix
    rate 44100
    resample.quality 10
}

pcm.rate48000 {
    type rate
    slave.pcm dmix
    rate 48000
    resample.quality 10
}

pcm.rate88200 {
    type rate
    slave.pcm dmix
    rate 88200
    resample.quality 10
}

pcm.rate96000 {
    type rate
    slave.pcm dmix
    rate 96000
    resample.quality 10
}

pcm.rate192000 {
    type rate
    slave.pcm dmix
    rate 192000
    resample.quality 10
}
Но что-то в этом конфиге не правильно.

mpv пишет:
[ao/alsa] ALSA channel map conflicts with channel count!
[ao/alsa] Asked for 2 channels, got 1 - fallback to mono.
AO: [alsa] 44100Hz mono 1ch s32
звук есть только из левого динамика.
Ещё такая ошибка:
$ aplay file.wav -v --dump-hw-params   
Playing WAVE 'file.wav' : Signed 24 bit Little Endian in 3bytes, Rate 96000 Hz, Stereo
HW Params of device "default":
--------------------
ACCESS:  MMAP_INTERLEAVED MMAP_NONINTERLEAVED RW_INTERLEAVED RW_NONINTERLEAVED
FORMAT:  S32_LE
SUBFORMAT:  STD MSBITS_MAX MSBITS_20 MSBITS_24
SAMPLE_BITS: 32
FRAME_BITS: 32
CHANNELS: 1
RATE: 44100
PERIOD_TIME: (125170 125171)
PERIOD_SIZE: 5520
PERIOD_BYTES: 22080
PERIODS: [2 3]
BUFFER_TIME: (250340 375511)
BUFFER_SIZE: [11040 16560]
BUFFER_BYTES: [44160 66240]
TICK_TIME: ALL
--------------------
aplay: set_params:1387: Sample format non available
Available formats:
- S32_LE
format точно поддерживается, и он так ругается вообще на любой формат, даже на S16_LE, и даже если вообще формат не указывать.
Если закомментировать секцию bindings:
$ aplay file.wav -v   --dump-hw-params   
Playing WAVE 'file.wav' : Signed 24 bit Little Endian in 3bytes, Rate 96000 Hz, Stereo
HW Params of device "default":
--------------------
ACCESS:  MMAP_INTERLEAVED MMAP_NONINTERLEAVED RW_INTERLEAVED RW_NONINTERLEAVED
FORMAT:  S32_LE
SUBFORMAT:  STD MSBITS_MAX MSBITS_20 MSBITS_24
SAMPLE_BITS: 32
FRAME_BITS: 64
CHANNELS: 2
RATE: 44100
PERIOD_TIME: (125170 125171)
PERIOD_SIZE: 5520
PERIOD_BYTES: 44160
PERIODS: [2 3]
BUFFER_TIME: (250340 375511)
BUFFER_SIZE: [11040 16560]
BUFFER_BYTES: [88320 132480]
TICK_TIME: ALL
--------------------
aplay: set_params:1387: Sample format non available
Available formats:
- S32_LE
и в mpv звук 2 канала.
Обратите внимание, что с секцией bindings и без неё в выводе aplay разница в 4-х строчках (FRAME_BITS, CHANNELS, PERIOD_BYTES, BUFFER_BYTES).

Может, этот конфиг вообще не правильный. Нужен конфиг, чтобы был звук из нескольких программ, format S24_3LE, чтобы всегда использовалась та частота дискретизации что в источнике (по умолчанию это не работает) и resample.quality 10 и rate_converter samplerate_best (если это имеет смысл, или эти опции не нужны потому что всегда будет использоваться частота дискретизации источника?).

★★★★★

Последнее исправление: teod0r (всего исправлений: 3)

в общем, по сравнению с дефолтом тебе не нравится, что используется plughw вместо hw. возьми /usr/share/alsa/pcm/default.conf, скопируй в ~/.asoundrc и удали оттуда плагин plug.

вместо

default {
        # use plughw as default
        type plug
        slave.pcm {
                type hw
                card $CARD
        }
        hint.device 0
}

пропиши

default {
        type hw
        card $CARD
        hint.device 0
}

должно хватить. дальше по ситуации.

anonymous
()
Ответ на: комментарий от firkax

таких тонкостей не знал. т.е. так невозможно сделать? чтоб в каждой программе была частота дискретизации из воспроизводимого файла?
какую тогда частоту прописать? карта поддерживает 44100 48000 88200 96000 192000.
сейчас вернулся к старому конфигу:

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

pcm.dmixer {
        type dmix
        ipc_key 1024

        slave {
                pcm 'hw:0,0'
                format S24_3LE
                period_time 0
                period_size 1024
                buffer_size 4096
#               rate 96000
        }

}
куда прописать:
resample.quality 10
rate_converter samplerate_best
?
как подобрать period_size и buffer_size?

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

чтоб включить 24-битный звук, ‘resample.quality 10’, ‘rate_converter samplerate_best’, и хотел чтобы всегда использовалась та частота дискретизации что в источнике

Для этого и многого другого придумали PipeWire, но ты, конечно, можешь попытаться это сделать без него.

anonymous
()
Ответ на: комментарий от teod0r

Частоту карты надо переключать контролами карты, ALSA сама по себе про это ничего не знает. Все эти rate в конфиге для всех плагинов, кроме преобразующих частоту, имеют значение селекторов («с другими не работай»).

куда прописать:
resample.quality 10
rate_converter samplerate_best

Никуда. defaults.pcm.rate_converter "speexrate_best" хватит по уши.

В общем, вот мой конфиг. В нём используется hw:Loopback для последующего подключения к JACK (джековскую половину конфига я тут выкинул, чтоб не мешалась), вместо этого указывай hw для своей карты, и её параметры. (Блок loop_parm тут только для удобства, эти значения можно прописать непосредственно в нужные места.)

defaults.pcm.rate_converter "speexrate_best"
#defaults.pcm.rate_converter "speexrate_medium"
#defaults.pcm.rate_converter "speexrate"
        
loop_parm {
    format              S32_LE
    rate                96000
    alsa_dev            0
    playback_subdev     0
    capture_subdev      1
}
    
pcm.!default duplex_loop

pcm.duplex_loop {
    type asym
    playback.pcm        "plug:dmix_out"
    
    capture.pcm {
        type plug
        slave.pcm dsnoop_in
        # to avoid possible phase inversions with digital mics
        route_policy copy
    }
    hint.device 0
}

pcm.dmix_out {
    type        dmix
    ipc_key     49634
    ipc_key_add_uid true
    hw_ptr_alignment rounddown
    slave {
        # dmix allows a hw slave only
        pcm     loop_alsa_out
        format  { @func refer name loop_parm.format }
        rate    { @func refer name loop_parm.rate }
 
        # wine alsa out looback sizes (960/3840)
        period_time     10000
        periods         4
    }
}

pcm.dsnoop_in {
    type        dsnoop
    ipc_key     18819
    ipc_key_add_uid true
    slave {
        pcm     loop_alsa_in
        format  { @func refer name loop_parm.format }
        rate    { @func refer name loop_parm.rate }
        period_size 1536 # 16 ms
        periods 4
    }
}

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

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

А вообще для того, чтоб разобраться в алсовских конфигах, надо читать

и прочее оттуда.

alegz ★★★★
()
Последнее исправление: alegz (всего исправлений: 1)