2013-12-09 8 views
0

내 응용 프로그램은 내 PC에 연결된 마이크의 오디오 샘플을 녹음합니다. 그래서 Windows WaveInXXX API를 선택하여 작업을 수행했습니다.Windows 오디오/WaveInAddBuffer() 블록

설명서를 읽은 후 WaveInProc과 콜백 메커니즘을 사용하지 않기로 결정하여 스레드를 동기화하는 번거 로움을 덜어줍니다. 전체 응용 프로그램은 상당히 커서 디버깅이 더 간단해질 것이라고 생각했습니다. 응용 프로그램에서 샘플 블록을 요청하면 버퍼 대기열을 반복하여 처리하고, 데이터를 복사하고, 준비하지 않은 채 준비하고, 버퍼 대기열에 다시 추가합니다.

WaveInOpen() 
WaveInStart() 
FunctionAddingPreparedBuffersToTheQueue() 
while(someConditionThatEventuallyBecomesFalse) 
    if(NextBufferInQueueIsMarkedDone) 
     GetDataFromBuffer() 
     UnpreparePrepareHeaderAndAddBuffer() 
    else 
     WaitForAShortTime() 
WaveInStop() 
WaveInClose() 

이제 문제가 나타납니다 : 기본 프로그램 구조는 내가 분명히 기본적인 프로그램 흐름하게 희망이 보이는이 비록 약간의 시간 후,을 (내가 정확한 상태를 재현 할 수없는 오전), WaveInAddBuffer() 교착 상태가 발생 나머지 모든 스레드와 동일한 스레드 교착 상태가 발생할 때 추가 될 버퍼의 헤더가 준비되고 dwFlags == WHDR_PREPARED == 2.

이 교착 상태의 원인은 무엇입니까?

+0

문제의 원인을 아직 알지 못하더라도 문제를 설명하기 위해 [SSCCE] (http://sscce.org)를 게시 해보십시오. 면함. – IInspectable

+1

그럼 콜백 메카니즘은'CALLBACK_NULL'입니까? 교착 상태에 빠져서 고정 된 스레드 호출 스택을 잡을 수 있습니다. 이것이 도움이 될 것입니다. 내 생각 엔 문제는'NextBufferInQueueIsMarkedDone' 주위에 있고 당신은 즉시 그것들에 접근하는 버퍼 플래그를 체크하고있다 ('WHDR_DONE'을 체크한다). 그렇다면, 그렇게해서는 안되며, 선호하는 콜백 메커니즘을 통해 버퍼 가용성에 대한 알림을 받아야합니다. –

+0

@RomanR. 나는 당신의 충고에 따라,'CALLBACK_NULL' 대신에'CALLBACK_FUNCTION'을 사용했고, 교착 상태는 사라졌습니다. 그래서 고마워요! 불행히도 초기 문제가 무엇인지는 여전히 불만족 스럽습니다. 이전에 문제가 있었던 것처럼 왜 버퍼 플래그를 확인한다고 생각합니까? – fewu

답변

1

나는 그런 문제를 보지 못했지만, 짐작은 모든 준비되지 않은/준비 사이클과 관련된 단편화와 같은 것일 수 있습니다. 그들은 필요하지 않습니다. 각 버퍼에 대해 준비를 한 번 수행 한 다음 녹음을 마칠 때 준비하지 않을 수 있습니다. (실제 메모리에 버퍼를 잠근다.)