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];
}
'Programming > MFC-C++' 카테고리의 다른 글
MFC 폴더 선택 Dialog (0) | 2013.04.24 |
---|---|
CFileDialog 불러오기 저장하기 (0) | 2013.04.19 |
IK SVM (Fast Intersection / Additive Kernel SVMs) (0) | 2013.04.08 |
FFMpeg x264 Header 패킷 분석 (0) | 2013.04.02 |
Kinect for Window & OpenNI 동시 설치 및 사용하기 (0) | 2013.03.26 |