DirectX Sound 에서 기본적으로 버퍼를 생성 하는 부분에서 보통 다음과 같이 한다고 SDK 를 통해 알고 있었습니다만 이렇게 할 경우, 현재 CooperativeLevel 로 지정된 윈도우의 포커스를 잃을 경우 갑자기 소리가 안나옵니다 !


ZeroMemory( &dsdesc, sizeof( DSBUFFERDESC ) );
dsdesc.dwSize = sizeof( DSBUFFERDESC );
dsdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPOSITIONNOTIFY;
dsdesc.dwBufferBytes = size;
dsdesc.lpwfxFormat = &wavfmt;


그래서 구글신에게 찾아 보니, 버퍼 생성시 하나의 flag 하나인 DSBCAPS_GLOBALFOCUS 을 더 지정 하면 된는걸 알았습니다 ...


ZeroMemory( &dsdesc, sizeof( DSBUFFERDESC ) );
dsdesc.dwSize = sizeof( DSBUFFERDESC );
dsdesc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_GLOBALFOCUS;
dsdesc.dwBufferBytes = size;
dsdesc.lpwfxFormat = &wavfmt;


이렇게 생성한 버퍼는 현재 Dsound 를 할당 받은 윈도우가 포커스를 잃어도 소리가 나옵니다. 고로 FLTK MPG123 GUI player 는 그냥 DSound 출력으로 가도록 하는데 지장이 없어 졌습니다. 물론 MM audio 출력을 써도 되는데, 이게 Windows 98 때 이후로 변한게 없는걸로 아니, 특별히 audio out 을 만들어야 하는게 아니라면 NULL out (보통 file write) 을 만들던지, ALSA 도 고려해서 audio buffer fill, cache, queued loop 등등을 구현 해야 할지 고려 해야 겠습니다.

Posted by 견족자K rageworx