2016-09-23 4 views
1

Sony PHA-3을 구입하여 기본 모드로 DSD를 재생하는 앱을 작성하려고합니다. (DoP 모드에서 성공했습니다.) 그러나 samplerate를 2.8MHz로 설정하면 ASIOCallbacks :: bufferSwitchTimeInfo가 너무 빨라지는 것을 발견했습니다.ASIOCallbacks :: bufferSwitchTimeInfo가 2.8MHz로 매우 느리게 들어옴 Sony PHA-3에서 DSD 형식의 샘플링을 사용합니다.

1 초에 완료해야하는 2.8MHz 샘플을 요청하는 데 거의 8 초가 걸립니다.

코드는 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 Hz입니다.

그리고 asioDriverInfo.samples은 ASIOCallbacks에 할당 :: bufferSwitchTimeInfo 아래와 같이 :

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

그것은 샘플의 원본 코드입니다.

그래서 나는 아주 천천히 경과 된 시간을 쉽게 알 수 있습니다.

나는 samplerate를 2.8MHz * 4라고 말하는 더 높은 레벨로 올리려고 노력했는데, 1 초 전진 시간을 보는 것이 더 길다.

샘플링 속도를 2.8MHz 이하로 낮추려고했지만 API가 실패했습니다.

반드시 SDK의 가이드에 따라 SampleFormat을 설정해야합니다.

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

  aif.FormatType = kASIODSDFormat; 

      ASIOSampleRate finalSampleRate = 176400; 

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

실제로 SampleFormat을 DSD로 설정하지 않으면 samplerate를 2.8MHz로 설정하면 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 데모를 작성하고이 문제를 해결하는 데 도움이 되었습니까?

대단히 감사드립니다.

답변

0

문제가 해결되었습니다.

kAsioSetIoFormat 후에 getBufferSize 및 createBuffers를 사용해야합니다.