Я купил 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 и помочь мне решить эту проблему?
Большое спасибо заранее.
Проблема устранена.
Я должен получитьBufferSize и создатьBuffers после kAsioSetIoFormat.
Других решений пока нет …