1

Тема: Качество звука при снятии двух каналов с линейного входа одновременно

Добрый день.
Я поставил сервер трансляции интернет-радио для одного из самых популярных офлайновых радио в городе (Челябинск).
Операционная система ubuntu server, сервер трансляции icecast2, стример — ices2. Соответственно формат вещания — OGG. Данные снимались с линейного аудиовхода. Еще когда я мучался с установкой звука, я предусмотрел многпользовательский доступ к аудиоустройствам как на запись, так и на воспроизведение (кажется esd это называется).
И все бы было хорошо, но понадобился еще один поток, обязательно в mp3 формате, для обслуживания встроенных на сайтах Flash-плееров, потому что flash к 10 версии, будь он не ладен, так и не научился воспросизводить OGG.
Нагуглил для этой цели Darkice. Собрал, включил, прослушал, все хорошо, mp3 поток работает нормально. Включил OGG и ужаснулся, поток был с деффектом (суть деффекта объясню ниже). Стал разбиратся, выяснил, что причина диффекта именно включение другого стримера в лице даркайса. Т.е. как только я его выключаю, все ОК. Стал его внимательнее разглядывать, увидел что top выдает у него приоритет -99 (высокий). Не nice, а именно приоритет. Погуглив с часок так и не нашел штатных средств ОС для понижения приоритета. Пошел в исходники, закоментировал повышение приоритета, персобрал, запустил.
Теперь ices2 потоки стали получше, но глюки полностью не прекратились. И на MP3 потоках тоже появились деффекты.
В общем как не мучался, как не искал соотношение между разными nice для этих приложений, так и не удалось убрать диффекты на обоих стриммерах сразу, до исправления оставил конфмгурацию так, что на OGG каличество дифектов чуть меньше чем на MP3.

Суть деффектов в следующем: Каждые 2-10 секунд звук перепрыгивает. Т.е. поток идет непрерывно, музыка не перестает играть, но периодически пропадет то пол секунды, то секунда звука. Как будто вырезаны. Естественно просто так время пропадать не может, канал берется с линейного входа, и рано или поздно звуку просто неоткуда взяться, стример провисает на 3-5 секунд, чтобы заполнить буферы, опустошенные пропавшем временем.

Адрес сервера: http://77.233.175.58:8000/ можете сами послушать деффекты (повторюсь, на MP3 более замтены).

Это точно не качество связи и не пропавшие пакеты. Я думаю что это происходит из-за блокировок аудиоустройства каждым стримером. У кого больше приоритет (меньше nice) тот и лучше себя чувствует. Это также не связано с загрузкой процессора, кодирование всех 4-х потоков не отъедает более 12% общей мощности процессора.

Очень надеюсь хотябы на предположения что это может быть. Готов, если нужно, выложить любые конфиги стримеров и сервера. Сейчас еще поищу конфиг esd, выложу первым ответом.

Добавлено спустя     4 минуты   29 секунд:
Конфиг /etc/asound.conf
[mono]pcm.card0 {
    type hw
    card 0
    # mmap_emulation true
}

#pcm.dmix0 {
#    type dmix
#    ipc_key 34521
#    slave {
#        pcm "card0"
#    }
#}


pcm.dmix0 {
    type dmix
    ipc_key 1024 ## needs to be a power of 2
    slave {
        pcm "hw:0"
        period_time 0
        period_size 1024
        buffer_size 8192
        #format S16_LE
        rate 44100 ## not necessary
    }
    #slowptr true
}

pcm.dsnoop0 {
    type dsnoop
    ipc_key 2048
    slave {
        pcm "card0"
        #rate 48000
    }
}

pcm.asym0 {
    type asym
    playback.pcm "dmix0"
    capture.pcm "dsnoop0"
}

pcm.pasym0 {
    type plug
    slave.pcm "asym0"
}

# 'dsp0' is espected by OSS emulation etc.
pcm.dsp0 {
    type        plug
    slave.pcm    "asym0"
}

ctl.dsp0 {
    type    hw
    card    0
}

pcm.!default {
    type        plug
    slave.pcm    "asym0"
}

ctl.!default {
    type    hw
    card    0
}[/mono]

2

Re: Качество звука при снятии двух каналов с линейного входа одновременно

Проблему решил.
Для тех кому будет интересно и кто найдет тему в гугле:
Неплохой мануал по конфигам alsa: http://wiki.linuxmusic.ru/doku.php?id=b … 3%3A1%3A10
Оттуда я взял секцию pcm.dsnoop0 (см предыдущий конфиг) и получилось вот что:
[mono]pcm.dsnoop0 {
        type dsnoop
        ipc_key 2048
        slave {
                pcm "card0"
                channels 2
                period_size 1024
                buffer_size 8192
                rate 48000
                periods 0
                period_time 0
        }
}[/mono]

Нужно обратить внимание на увеличенный буфер (8192 против начальных 4096) и periods 0.
Что такое periods я не разобрался. Однако после рестарта сервера ices отказался запускаться с формулировкой, что ему нужно хотя-бы periods=2.
Пришлось открыть его конфиг и кое чего поправить:
[mono]<input>
    <module>alsa</module>
    <param name="rate">48000</param>
    <param name="channels">2</param>
    <param name="device">default</param>
    <param name="periods">0</param>
    <param name="buffer-time">500</param>
</input>[/mono]
После этого запустились и ices и darkice. Оба потока без прерываний.
Сказать точно что помогло — увеличение буфера или устранение periods не могу, а выянять на работающем сервере не хочется.

3

Re: Качество звука при снятии двух каналов с линейного входа одновременно

Спасибо за то что публично поделились решением проблемы!
В будущем может помочь другим.