ASIOCallbacks :: bufferSwitchTimeInfo работает очень медленно с частотой дискретизации 2,8 МГц в формате DSD на Sony PHA-3

Я купил Sony PHA-3 и пытаюсь написать приложение для воспроизведения DSD в собственном режиме. (Мне удалось в режиме DoP.)
Однако, когда я установил частоту дискретизации на 2,8 МГц, я обнаружил, что ASIOCallbacks :: bufferSwitchTimeInfo работает не так быстро, как должно быть.

Потребуется около 8 секунд, чтобы запросить образцы с частотой 2,8 МГц, которые должны быть завершены за 1 секунду.

Код просто изменен из примера хоста asiosdk 2.3, поэтому я опубликую часть кодов ключей, чтобы помочь завершить мой вопрос.

После запуска ASIO образец хоста продолжит печатать информацию о времени, указав следующую информацию:

fprintf (stdout, "%d ms / %d ms / %d samples **%ds**", asioDriverInfo.sysRefTime,
(long)(asioDriverInfo.nanoSeconds / 1000000.0),
(long)asioDriverInfo.samples,
(long)(**asioDriverInfo.samples  / asioDriverInfo.sampleRate**));

Последнее выражение скажет мне, сколько секунд прошло. (AsioDriverInfo.samples / asioDriverInfo.sampleRate).

Где asioDriverInfo.sampleRate составляет 2822400 Гц.

И asioDriverInfo.samples присваивается в ASIOCallbacks :: bufferSwitchTimeInfo, как показано ниже:

    if (timeInfo->timeInfo.flags & kSamplePositionValid)
asioDriverInfo.samples = ASIO64toDouble(timeInfo->timeInfo.samplePosition);
else
asioDriverInfo.samples = 0;

Это оригинальный код образца.

Так что я могу легко узнать, что время прошло очень медленно.

Я пытался поднять частоту дискретизации еще выше, скажем, до 2,8 МГц * 4, еще дольше увидеть время, чтобы продвинуться на 1 секунду.

Я попытался снизить частоту дискретизации до уровня ниже 2,8 МГц, API не удалось.

Я определенно установил SampleFormat в соответствии с руководством SDK.

ASIOIoFormat aif;
MemSet (&aif, 0, sizeof (aif));

            aif.FormatType = kASIODSDFormat;

ASIOSampleRate finalSampleRate = 176400;

if(ASE_SUCCESS == ASIOFuture(kAsioSetIoFormat,&aif) ){
finalSampleRate = 2822400;
}

Фактически, без установки SampleFormat на DSD, установка частоты дискретизации на 2,8 МГц приведет к сбою API.

Наконец, я вспомнил, что все DAW (Cubase / Reaper, …) имеют возможность установить приоритет потока, поэтому я сомневался, что поток обратного вызова недостаточно высок, а также попытался повысить приоритет потока, чтобы посмотреть, может ли это Помогите. Однако, когда я проверяю приоритет потока, он возвращает THREAD_PRIORITY_TIME_CRITICAL.

static double processedSamples = 0;

if (processedSamples == 0)
{
HANDLE t = GetCurrentThread();
int p = GetThreadPriority(t); // I get THREAD_PRIORITY_TIME_CRITICAL here

SetThreadPriority(t, THREAD_PRIORITY_HIGHEST); // So the priority is no need to raise anymore....(SAD)
}

То же самое для свойства ThreadPriorityBoost. Это не отключено (уже усилено).

Кто-нибудь пытался написать демо asio и помочь мне решить эту проблему?

Большое спасибо заранее.

1

Решение

Проблема устранена.

Я должен получитьBufferSize и создатьBuffers после kAsioSetIoFormat.

0

Другие решения

Других решений пока нет …