[PATCH 3/4] xaudio2: Call OnStreamEnd callback
Andrew Eikum
aeikum at codeweavers.com
Tue Sep 15 12:25:34 CDT 2015
---
dlls/xaudio2_7/tests/xaudio2.c | 41 +++++++++++++++++++++++++++++++++++++++--
dlls/xaudio2_7/xaudio_dll.c | 5 +++++
2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/dlls/xaudio2_7/tests/xaudio2.c b/dlls/xaudio2_7/tests/xaudio2.c
index aabb70e..4cac2b6 100644
--- a/dlls/xaudio2_7/tests/xaudio2.c
+++ b/dlls/xaudio2_7/tests/xaudio2.c
@@ -374,9 +374,11 @@ static const IXAudio2VoiceCallbackVtbl vcb_buf_vtbl = {
static IXAudio2VoiceCallback vcb_buf = { &vcb_buf_vtbl };
static int nloopends = 0;
+static int nstreamends = 0;
static void WINAPI loop_buf_OnStreamEnd(IXAudio2VoiceCallback *This)
{
+ ++nstreamends;
}
static void WINAPI loop_buf_OnBufferStart(IXAudio2VoiceCallback *This,
@@ -421,7 +423,7 @@ static void test_buffer_callbacks(IXAudio2 *xa)
XAUDIO2_BUFFER buf;
XAUDIO2_VOICE_STATE state;
struct vcb_buf_testdata testdata[5];
- int i;
+ int i, timeout;
obs_calls = 0;
obe_calls = 0;
@@ -434,6 +436,7 @@ static void test_buffer_callbacks(IXAudio2 *xa)
hr = IXAudio2_CreateMasteringVoice(xa, &master, 2, 44100, 0, NULL, NULL, AudioCategory_GameEffects);
ok(hr == S_OK, "CreateMasteringVoice failed: %08x\n", hr);
+ /* test OnBufferStart/End callbacks */
fmt.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
fmt.nChannels = 2;
fmt.nSamplesPerSec = 44100;
@@ -479,14 +482,48 @@ static void test_buffer_callbacks(IXAudio2 *xa)
ok(state.SamplesPlayed == 4410 * 5, "Got wrong samples played\n");
- HeapFree(GetProcessHeap(), 0, (void*)buf.pAudioData);
+ if(xaudio27)
+ IXAudio27SourceVoice_DestroyVoice((IXAudio27SourceVoice*)src);
+ else
+ IXAudio2SourceVoice_DestroyVoice(src);
+
+
+ /* test OnStreamEnd callback */
+ XA2CALL(CreateSourceVoice, &src, &fmt, 0, 1.f, &loop_buf, NULL, NULL);
+ ok(hr == S_OK, "CreateSourceVoice failed: %08x\n", hr);
+
+ buf.Flags = XAUDIO2_END_OF_STREAM;
+
+ hr = IXAudio2SourceVoice_SubmitSourceBuffer(src, &buf, NULL);
+ ok(hr == S_OK, "SubmitSourceBuffer failed: %08x\n", hr);
+
+ hr = IXAudio2SourceVoice_Start(src, 0, XAUDIO2_COMMIT_NOW);
+ ok(hr == S_OK, "Start failed: %08x\n", hr);
+
+ timeout = 0;
+ while(nstreamends == 0 && timeout < 1000){
+ Sleep(100);
+ timeout += 100;
+ }
+
+ ok(nstreamends == 1, "Got wrong number of OnStreamEnd calls: %u\n", nstreamends);
+
+ /* xaudio resets SamplesPlayed after processing an end-of-stream buffer */
+ if(xaudio27)
+ IXAudio27SourceVoice_GetState((IXAudio27SourceVoice*)src, &state);
+ else
+ IXAudio2SourceVoice_GetState(src, &state, 0);
+ ok(state.SamplesPlayed == 0, "Got wrong samples played\n");
if(xaudio27)
IXAudio27SourceVoice_DestroyVoice((IXAudio27SourceVoice*)src);
else
IXAudio2SourceVoice_DestroyVoice(src);
+
IXAudio2MasteringVoice_DestroyVoice(master);
+
+ HeapFree(GetProcessHeap(), 0, (void*)buf.pAudioData);
}
static UINT32 play_to_completion(IXAudio2SourceVoice *src, UINT32 max_samples)
diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 540e772..aee3c4e 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -3085,9 +3085,14 @@ static void update_source_state(XA2SourceImpl *src)
TRACE("%p: done with buffer %u\n", src, old_buf);
+ if(src->buffers[old_buf].xa2buffer.Flags & XAUDIO2_END_OF_STREAM)
+ src->played_frames = 0;
+
if(src->cb){
IXAudio2VoiceCallback_OnBufferEnd(src->cb,
src->buffers[old_buf].xa2buffer.pContext);
+ if(src->buffers[old_buf].xa2buffer.Flags & XAUDIO2_END_OF_STREAM)
+ IXAudio2VoiceCallback_OnStreamEnd(src->cb);
if(src->nbufs > 0)
IXAudio2VoiceCallback_OnBufferStart(src->cb,
--
2.5.1
More information about the wine-patches
mailing list