Offтопик:
Сообщение от
ViktKors
2. При передаче DSD потока сигнал мьюта приходит либо слишком поздно, либо чуть заранее, но в произвольный момент. Т.е. DSD поток внезапно прервался, ЦАП щелкнул по ушам, после чего Аманеро почесалась и таки выдала сигнал мьют.
Или выдала его за 2 миллисекунды до пропадания DSD потока - слишком поздно, чтоб убрать громкость перед мьютом плавно.
немного пофлудим автору, но думаю всем будет интересно разобраться, мне в том числе.
Если взглянуть на исходный код обработчик аудио данных SDK XMOS, то видно как процессор определяет, PCM поток или DSD:
audio.xc, начиная с 822 строки
Код:
if((dsdMode == DSD_MODE_OFF) && (curSamFreq > 96000))
{
if((DSD_MASK(samplesOut[0]) == dsdMarker) && (DSD_MASK(samplesOut[1]) == dsdMarker))
{
dsdCount++;
dsdMarker ^= DSD_MARKER_XOR;
if(dsdCount == DSD_EN_THRESH)
{
IsDataReady=0;
dsdMode = DSD_MODE_DOP;
dsdCount = 0;
dsdMarker = DSD_MARKER_2;
// Set clocks low
p_lrclk <: 0;
p_bclk <: 0;
p_dsd_clk <: 0;
return 0;
}
}
else
{
dsdCount = 0;
dsdMarker = DSD_MARKER_2;
}
}
else if(dsdMode == DSD_MODE_DOP) // DSD DoP Mode
{
/* If we are running in DOP mode, check if we need to come out */
if((DSD_MASK(samplesOut[0]) != DSD_MARKER_1) && (DSD_MASK(samplesOut[1]) != DSD_MARKER_1))
{
if((DSD_MASK(samplesOut[0]) != DSD_MARKER_2) && (DSD_MASK(samplesOut[1]) != DSD_MARKER_2))
{
dsdMode = DSD_MODE_OFF;
IsDataReady=0;
// Set clocks low
p_lrclk <: 0;
p_bclk <: 0;
p_dsd_clk <: 0;
return 0;
}
}
}
для определения, что начался DSD поток, проверяются DSD маркеры и кол-во маркеров, идущих подряд, эти параметры задаются в
dsd_support.h
Код:
#ifndef _DSD_H_
#define _DSD_H_
#define DSD_MODE_OFF 0
#define DSD_MODE_DOP 1
#define DSD_MODE_NATIVE 2
/* DoP defines */
#define DSD_MARKER_1 0xFA
#define DSD_MARKER_2 0x05
#define DSD_MARKER_XOR 0xFF
#define DSD_EN_THRESH 32 /* Number of consecutive DSD markers before switching to DSD mode */
#define DSD_MASK(x) ((x >> 24) & 0xff)
#endif
DSD_MARKER_1 и DSD_MARKER_2 задаёт паттерн, при котором у нас начинается DSD поток. На моей памяти этот паттерн можно менять в плагине ASIO для foobar, тогда транспорт вообще может и не переключиться
DSD_EN_THRESH как раз задаёт кол-во сэмплов, после которого нужно переключаться в DSD. И получается так, что эти 32 сэмпла успевают "пролетать" на выход, тем самым сильно портя звук. Можно даже высчитать
но мне лень, сколько мс(мкс) будет длиться щелчок на выходе. Еще нужно учесть заторможенность самого процессора, она конечно не такая большая, но тем не менее, и самое страшное, заторможенность реле, которое еще добавит длительности щелчку(я в последней плате использую программный муте, даже страшно представить сколько длится щелчок, спасает только AK4493, где реализован авто переход PCM<->DSD). Имея такой способ определения потока DSD щелчка не избежать никаким способом, хоть маленький, но будет.
Думаю в аманеро нечто похожее.
Я могу конечно ошибаться в своих выкладках, но изучая исходный код пришел к такому мнению.
Социальные закладки