2016-08-02 20 views
2

계속해서 데이터를 IAudioClient (GetBufferSize/GetCurrentPadding/GetBuffer/ReleaseBuffer)으로 보내지 만, 오디오 장치가 마지막으로 보낸 데이터를 재생할 때를 알고 싶습니다. 마지막으로 데이터 덩어리를 장치에 보냈기 때문에 플레이어가 멈춘 것으로 가정하고 싶지는 않습니다. 버퍼링 된 데이터를 재생 중일 수 있습니다.IAudioClient - 재생이 끝나면 알림을 받습니까?

하드웨어 버퍼 위치를 확인하기 위해 IAudioClock/IAudioClock2을 사용해 보았지만 마지막 청크를 보내는 순간부터 동일하게 유지되었습니다.

나는 또한 IMMNotificationClientIAudioSessionNotification 인터페이스에 관련된 아무것도 표시되지 않습니다 ...

나는 무엇을 놓치고?

감사합니다.

답변

1

IMMNotificationClient 및 IAudioSessionNotification이 도움이되지는 않지만, 새 장치/새 응용 프로그램 세션을 각각 검색하는 데 도움이됩니다. 내가 아는 한 WASAPI에는 마지막 샘플이 장치 (단독 모드) 또는 오디오 엔진 (공유 모드)에 의해 소비 될 때 이벤트를 명시 적으로 보내는 아무것도 없습니다. 과거에 (DirectSound와 비슷하지만 WASAPI와 잘 작동해야하는) 트릭은 오디오 버퍼의 사용 가능한 공간 (GetCurrentPadding을 사용하여 WASAPI의 경우)을 지속적으로 확인하는 것입니다. 마지막 샘플을 보내고 나면 현재 패딩을 즉시 녹음합니다. N 프레임이라고합시다. 그런 다음 N 프레임이 처리 (IAudioClock (2)에 의해보고되거나 타이머를 사용하여 잠시 멈춤) 될 때까지 AudioClient에 0을 쓰고 스트림을 중단합니다. 이것이 독점적 이벤트 중심 모드 스트림에서 작동하는지 여부는 드라이버 품질 문제입니다. 드라이버는 "실제"재생 위치를보고하거나 전체 버퍼 크기로 처리 할 수 ​​있습니다.

+0

IAudioClock :: GetPosition/등은 오디오 재생 여부에 관계없이 항상 동일한 값을 반환합니다. IAudioMeterInformation.GetPeakValue를 사용하고 반환 된 값이 == 0인지 확인할 수 있습니다. 내 경우에는 효과가있는 것 같습니다 (오디오는 적어도 주위의 잡음이 녹음 된 마이크입니다).하지만 제네릭으로는별로 좋아하지 않습니다. 솔루션 - 오디오 스트림에서 음소거 기간을 가질 수 있습니다. –

+0

AudioClock은 스트림을 중단하지 않는 한 지속적으로 증가하는 위치를 반환해야합니다. 문제를 재현하는 샘플 코드가 있습니까? –

+0

아무 것도 게시 할 수 없습니다 - 데이터를 스트리밍하는 스트림 응용 프로그램 (잘 작동합니다)이 있으며 스트리밍하는 동안 타이머가 50ms마다 테스트되고 AudioClock :: GetPosition이 호출됩니다. 두 반환 값이 모두 기록됩니다. 기기는 항상 동일하게 유지되며 기기를 다시 초기화 할 때만 다릅니다. –