quartz: Stop DSound buffer playback when the filter is paused or stopped, not the next time it's processed.
This commit is contained in:
parent
79d4dfb601
commit
868dd534e8
|
@ -166,17 +166,6 @@ static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, LPBYTE data,
|
||||||
DWORD size2;
|
DWORD size2;
|
||||||
DWORD play_pos,buf_free;
|
DWORD play_pos,buf_free;
|
||||||
|
|
||||||
if (This->state != State_Running) {
|
|
||||||
DWORD state;
|
|
||||||
if (SUCCEEDED(IDirectSoundBuffer_GetStatus(This->dsbuffer, &state))) {
|
|
||||||
if (state & DSBSTATUS_PLAYING) {
|
|
||||||
IDirectSoundBuffer_Stop(This->dsbuffer);
|
|
||||||
This->started = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
hr = IDirectSoundBuffer_GetCurrentPosition(This->dsbuffer, &play_pos, NULL);
|
hr = IDirectSoundBuffer_GetCurrentPosition(This->dsbuffer, &play_pos, NULL);
|
||||||
|
@ -241,6 +230,9 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("%p %p\n", iface, pSample);
|
TRACE("%p %p\n", iface, pSample);
|
||||||
|
|
||||||
|
if (This->state != State_Running)
|
||||||
|
return VFW_E_WRONG_STATE;
|
||||||
|
|
||||||
hr = IMediaSample_GetPointer(pSample, &pbSrcStream);
|
hr = IMediaSample_GetPointer(pSample, &pbSrcStream);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
|
@ -452,7 +444,21 @@ static HRESULT WINAPI DSoundRender_Stop(IBaseFilter * iface)
|
||||||
|
|
||||||
EnterCriticalSection(&This->csFilter);
|
EnterCriticalSection(&This->csFilter);
|
||||||
{
|
{
|
||||||
This->state = State_Stopped;
|
DWORD state = 0;
|
||||||
|
if (This->dsbuffer)
|
||||||
|
{
|
||||||
|
hr = IDirectSoundBuffer_GetStatus(This->dsbuffer, &state);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
if (state & DSBSTATUS_PLAYING)
|
||||||
|
hr = IDirectSoundBuffer_Stop(This->dsbuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
This->started = FALSE;
|
||||||
|
This->state = State_Stopped;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&This->csFilter);
|
LeaveCriticalSection(&This->csFilter);
|
||||||
|
|
||||||
|
@ -468,7 +474,21 @@ static HRESULT WINAPI DSoundRender_Pause(IBaseFilter * iface)
|
||||||
|
|
||||||
EnterCriticalSection(&This->csFilter);
|
EnterCriticalSection(&This->csFilter);
|
||||||
{
|
{
|
||||||
This->state = State_Paused;
|
DWORD state = 0;
|
||||||
|
if (This->dsbuffer)
|
||||||
|
{
|
||||||
|
hr = IDirectSoundBuffer_GetStatus(This->dsbuffer, &state);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
if (state & DSBSTATUS_PLAYING)
|
||||||
|
hr = IDirectSoundBuffer_Stop(This->dsbuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
This->started = FALSE;
|
||||||
|
This->state = State_Paused;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&This->csFilter);
|
LeaveCriticalSection(&This->csFilter);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue