По порядку.
1. Транкейт, как можно видеть из кода, приведенного выше, реализуется побитовым сдвигом вправо (операция >>).
2. По поводу дизеринга. В нем то же осуществляется транкейт до 16 бит тем же самым способом (после добавления псевдослучайного шума).
3. До недавнего времени ЦРГ был реализован внутри модуля DSP. Однако сейчас, когда он стал практически без задержки, его реализация перенеслась в модуль PCM (я делал сборки для 3.4 точно так же). Т.е. теперь на него приходят данные после обработки в DSP модуле в 16-битном формате (если я ничего не перепутал). Стало от этого хуже или лучше или ничего не изменилось, я сказать не могу, замеры где-то выкладывал AfArt, но судя по всему ничего качественно не поменялось.
Прокомментирую код, приведенный в посте выше:
На вход поступают данные в 32-битном формате в двух массивах: для левого и правого канала
Коэффициент сдвига берется отсюда:Код:const int32_t *src[]
Вычисляется некий коефициент смещения (?) = 1/2 величины сдвига (я так понимаю для округления вверх)Код:const int scale = data->output_scale;
Далее, пока не будет пройдены все данные, происходит следующее:Код:const int dc_bias = 1 << (scale - 1);
последовательно по каналам к данным прибавляется dc_bias (округление вверх ?)Код:*dst++ = clip_sample_16((*s0++ + dc_bias) >> scale);
Затем происходит сдвиг данных (транкейт)Код:(*s0++ + dc_bias)
Затем проверка на клиппингКод:>> scale
суть которой в том, что если преобразованное (простым откидыванием старших бит) из 32 бит к 16 битам число не одно и то жеКод:clip_sample_16
Осуществляется операция "Исключающее ИЛИ" (или "Сложение по модулю 2") уровня сигнала 0x7fff и старшего бита исходного сигналаКод:if ((int16_t)sample != sample)
Код:sample = 0x7fff ^ (sample >> 31);