Programming/MFC-C++

Wave 출력 및 waveOutClose 함수, Callback 함수와의 연동

빠릿베짱이 2013. 4. 18. 22:17
반응형

waveOutClose

- 장치를 닫는 함수 인데, 희안하게도 Callback 함수에 WOM_CLOSE 메시지가 전달되지 않았다.

계속 무한 삽질 끝에, 알아낸 사실..

본 소스에서만 그런지 모르겠지만, 일반적으로

Callback에서 웨이브 WOM_DONE 메시지 전달 시 새로운 음성 데이터를 Write한다.

이런식으로 결국 wave 장치에는 출력해야할 데이터가 쌓이게 된다.

이런 경우 waveOutClose 함수를 콜해도 제대로 작동하지 않고, 모든 음성 데이터가 출력되고 난 후에

동작한다.

이를 해결하기 위해, Callback 함수에서 종료를 원하는지 판단하여 만약 사용자가 종료를 원할 경우에는

새로 장치에 waveOutWrite 하지 않고, 그냥 아무동작 없이 지나가면

waveOutClose 함수가 제대로 동작한다.

 

메모리릭

m_hdr[i] = new WAVEHDR();//(WAVEHDR*) calloc(1, sizeof(WAVEHDR));
waveOutPrepareHeader(_waveout, m_hdr[i], sizeof(WAVEHDR));
waveOutWrite(_waveout, m_hdr[i], sizeof(WAVEHDR));

보통 초기에 위와 같이 버퍼를 생성한다. 만약 음성 출력이 종료 될때

초기에 할당한 버퍼를 지워야 릭(Leak)이 발생하지 않는다.

_started = false;
 
 for (int i=0; i<4; i++)
 {
      waveOutUnprepareHeader(_waveout, m_hdr[i], sizeof(WAVEHDR));  
 }

 while(waveOutClose(_waveout))
 {
      Sleep(100);
 }

 for (int i=0; i<4; i++)
 {
  if (m_hdr[i]->lpData)
   free(m_hdr[i]->lpData);
  delete m_hdr[i];
 }

 

반응형