Здравствуйте.
Я вас сейчас буду немного расстраивать по поводу качества ресэмплирования.
Изучал исходники libasound2, нашёл много нового и интересного.
Например, перед запуском любого из перечисленных ресэмплеров (samplerate_xxx, speex_xxx) происходит автоматическое преобразования сигнала в 16 бит, а после обратно.
По этому, если вы претендуете на 24-х или 32-х разрядный звук, то забудьте про это.
В принципе у libasound2 есть интерфейс без преобразования, но им никто из известных ресэмплеров не пользуется.
Второе.
Предположим вы хотите послушать 8-ми кГц файл, а dmix настроен на 48кГц.
По идее ресэмплер должен увеличить частоту дискр в 6 раз (с 8000 до 48000), но не всё так просто!
Пусть period_size у вас, например, 1024 (такой обычно рекомендуют на сайте алсы).
Тогда алса очень хитро расчитает размеры кадров:
выходной будет ровно period_size = 1024,
а входной (int)( period_size * 8000 / 48000 ) = 170.
Теперь алса будет предлагать ресэмплеру из 170 отсчётов сделать 1024 и никак иначе.
Кажется, что всё Ok, но простой расчёт показывает, что из 170 можно сделать только 1020. А где взять ещё 4?
Разные ресэмплеры бурут недостающие отсчёты в разных местах:
speex делает линейную интерпоняцию из 1020 в 1024,
lavcrate вставляет повторяющиеся числа,
c samplerate не разобрался, он вызывает ещё одну библиотеку и мне стало лениво дебажить.
Чем это грозит?
Ну, тем, что вы думаете, что слушаете 8000 сконветированное на 48000,
а на самом деле 8000 на 48128 или 7968 на 48000, как больше нравиться.
Аудиофилы должны быть в шоке.