>> Вырубил sndiod (чтобы программы, использующие sndio, подключались в /dev/audio напрямую),
>> проиграл тот же файл - пилы нет, а audioctl говорит, что
>> play.rate=44100. То есть ресемплирование, видимо, успешно делается штатным кодеком, так
>> как в audio(4) используется линейное и тоже, судя по коду (очень
>> похож на код из sndiod), без dithering'а - как я понимаю,
>> в этом случае пилу я тоже должен был услышать.
> Точно сказать о качестве ресемплинга по наличию/отсутствия dithering'а нельзя ;) Ага, понял, это я не тот код смотрел.
Вот, похоже, именно ресемплинг в sndiod (dsp.c, функция resamp_do):
for (;;) {
if (diff < 0) {
if (ifr == 0)
break;
ctx_start ^= 1;
ctx = ctxbuf + ctx_start;
for (c = nch; c > 0; c--) {
*ctx = *idata++;
ctx += RESAMP_NCTX;
}
diff += oblksz;
ifr--;
} else if (diff > 0) {
if (ofr == 0)
break;
ctx = ctxbuf;
for (c = nch; c > 0; c--) {
s = ctx[ctx_start];
ds = ctx[ctx_start ^ 1] - s;
ctx += RESAMP_NCTX;
*odata++ = s + ADATA_MULDIV(ds, diff, oblksz);
}
diff -= iblksz;
ofr--;
} else {
if (ifr == 0 || ofr == 0)
break;
ctx = ctxbuf + ctx_start;
for (c = nch; c > 0; c--) {
*odata++ = *ctx;
ctx += RESAMP_NCTX;
}
ctx_start ^= 1;
ctx = ctxbuf + ctx_start;
for (c = nch; c > 0; c--) {
*ctx = *idata++;
ctx += RESAMP_NCTX;
}
diff -= iblksz;
diff += oblksz;
ifr--;
ofr--;
}
}
p->diff = diff;
p->ctx_start = ctx_start;
return oblksz - ofr;
Сравнивая с кодом в libsamplerate (пять режимов работы, три из них не дают "пилу" в прошлом тесте), больше всего сходства вижу с src_sinc.c, - а именно в том модуле реализованы те самые три "корректных" алгоритма. Но могу и ошибиться, конечно, так как весьма смутно понимаю, что тут на самом деле происходит. :(
> К сожалению не могу проверить дешевые кодеки в режиме 44.1kHz, так как
> alsa просто не позволяет выставить этот режим. Насколько я знаю -
> общая политика alsa избегать аппаратного ресемплинга, так как он обычно реализован
> через зад, точнее zoh или linear.
> А патчить alsa для включения 44.1 лениво :)
> Проверьте не изменилась ли скорость воспроизведения при форсировании 44.1.
Проверил, конечно. И сейчас ещё раз специально проверил через time aucat, чтобы своим ушам не доверять лишний раз. Тик в тик с sndio с выставлением на /dev/audio0 как 44,1кГц, так и 48кГц. У меня на одном из прошлых ноутбуков кодек вёл себя неадекватно в этом плане, так что я уже однажды обжёгшийся. :)
> К сожалению не нашел dataheet на ваш кодек.
Тем хуже ему... :)
>[оверквотинг удален]
>
> Использовать следующим образом. Отключить программную регулировку громкости (если она
> где-то используется). Включить всю аппаратную громкость на полную - в микшере
> и колонках. Если вся ваша звуковая система (плеер/драйвер/codec/dsp/dac) производят всю
> обработку аудио корректно или вообще никак не изменяют исходный сигнал (bit
> perfect), то вы услышите тихую музыку, плавно тонущую в равномерном шуме.
> Если звук будет звучать неоднородно, как бы то появляясь и исчезая c
> неприятными (жесткими) призвуками - где-то есть проблема. Если проблема возникает только
> на коком-то определенном формате, то значит проблема в плеере или используемой
> им библиотеке.
Попробовал с wav в aucat, ffplay (надеялся увидеть сонограмму), MoC (использует libsamplerate) и sox, с sndiod -r 44100 и без оного. По результатам - с sndiod звук немного тише (он приглушает звук на 3дБ, чтобы реальная громкость клиентов не скакала при изменении их количества в разумных пределах), но в обоих случаях слышно только музыку и шум (колонок), без призвуков и пропаданий.