mmdevapi: Complete IAudioClient3_InitializeSharedAudioStream.

This commit is contained in:
Davide Beatrici 2024-06-20 20:00:02 +02:00 committed by Alexandre Julliard
parent 73a501ab46
commit 9d046996cb

View file

@ -117,7 +117,7 @@ static HRESULT get_periods(struct audio_client *client,
return params.result; return params.result;
} }
static HRESULT adjust_timing(struct audio_client *client, static HRESULT adjust_timing(struct audio_client *client, const BOOLEAN force_def_period,
REFERENCE_TIME *duration, REFERENCE_TIME *period, REFERENCE_TIME *duration, REFERENCE_TIME *period,
const AUDCLNT_SHAREMODE mode, const DWORD flags, const AUDCLNT_SHAREMODE mode, const DWORD flags,
const WAVEFORMATEX *fmt) const WAVEFORMATEX *fmt)
@ -133,7 +133,10 @@ static HRESULT adjust_timing(struct audio_client *client,
TRACE("Device periods: %lu default and %lu minimum\n", (ULONG)def_period, (ULONG)min_period); TRACE("Device periods: %lu default and %lu minimum\n", (ULONG)def_period, (ULONG)min_period);
if (mode == AUDCLNT_SHAREMODE_SHARED) { if (mode == AUDCLNT_SHAREMODE_SHARED) {
*period = def_period; if (*period == 0 || force_def_period)
*period = def_period;
else if (*period < min_period)
return AUDCLNT_E_INVALID_DEVICE_PERIOD;
if (*duration < 3 * *period) if (*duration < 3 * *period)
*duration = 3 * *period; *duration = 3 * *period;
} else { } else {
@ -355,7 +358,7 @@ skip:
return wcsdup(name); return wcsdup(name);
} }
static HRESULT stream_init(struct audio_client *client, static HRESULT stream_init(struct audio_client *client, const BOOLEAN force_def_period,
const AUDCLNT_SHAREMODE mode, const DWORD flags, const AUDCLNT_SHAREMODE mode, const DWORD flags,
REFERENCE_TIME duration, REFERENCE_TIME period, REFERENCE_TIME duration, REFERENCE_TIME period,
const WAVEFORMATEX *fmt, const GUID *sessionguid) const WAVEFORMATEX *fmt, const GUID *sessionguid)
@ -387,7 +390,7 @@ static HRESULT stream_init(struct audio_client *client,
return E_INVALIDARG; return E_INVALIDARG;
} }
if (FAILED(params.result = adjust_timing(client, &duration, &period, mode, flags, fmt))) if (FAILED(params.result = adjust_timing(client, force_def_period, &duration, &period, mode, flags, fmt)))
return params.result; return params.result;
sessions_lock(); sessions_lock();
@ -636,7 +639,7 @@ static HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE
wine_dbgstr_longlong(period), fmt, wine_dbgstr_longlong(period), fmt,
debugstr_guid(sessionguid)); debugstr_guid(sessionguid));
return stream_init(This, mode, flags, duration, period, fmt, sessionguid); return stream_init(This, TRUE, mode, flags, duration, period, fmt, sessionguid);
} }
static HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) static HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out)
@ -1027,14 +1030,16 @@ static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, D
const GUID *session_guid) const GUID *session_guid)
{ {
struct audio_client *This = impl_from_IAudioClient3(iface); struct audio_client *This = impl_from_IAudioClient3(iface);
REFERENCE_TIME duration; REFERENCE_TIME period;
FIXME("(%p)->(0x%lx, %u, %p, %s) - partial stub\n", This, flags, period_frames, format, debugstr_guid(session_guid));
TRACE("(%p)->(0x%lx, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid));
if (!format) if (!format)
return E_POINTER; return E_POINTER;
duration = period_frames * (REFERENCE_TIME)10000000 / format->nSamplesPerSec; period = period_frames * (REFERENCE_TIME)10000000 / format->nSamplesPerSec;
return stream_init(This, AUDCLNT_SHAREMODE_SHARED, flags, duration, 0, format, session_guid);
return stream_init(This, FALSE, AUDCLNT_SHAREMODE_SHARED, flags, 0, period, format, session_guid);
} }
const IAudioClient3Vtbl AudioClient3_Vtbl = const IAudioClient3Vtbl AudioClient3_Vtbl =