From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/client.c | 20 +++++++++++++++----- dlls/mmdevapi/mmdevdrv.h | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 1058c639ff9..297ce5fa9a2 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -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);
if (mode == AUDCLNT_SHAREMODE_SHARED) { - *period = def_period; + if (*period == 0 || !client->init_audioclient3) + *period = def_period; + else if (*period < min_period) + return AUDCLNT_E_INVALID_DEVICE_PERIOD; if (*duration < 3 * *period) *duration = 3 * *period; } else { @@ -1018,14 +1021,21 @@ static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, D const GUID *session_guid) { struct audio_client *This = impl_from_IAudioClient3(iface); - REFERENCE_TIME duration; - FIXME("(%p)->(0x%lx, %u, %p, %s) - partial stub\n", This, flags, period_frames, format, debugstr_guid(session_guid)); + REFERENCE_TIME period; + HRESULT hr; + + TRACE("(%p)->(0x%lx, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid));
if (!format) return E_POINTER;
- duration = period_frames * (REFERENCE_TIME)10000000 / format->nSamplesPerSec; - return client_Initialize(iface, AUDCLNT_SHAREMODE_SHARED, flags, duration, 0, format, session_guid); + period = period_frames * (REFERENCE_TIME)10000000 / format->nSamplesPerSec; + + This->init_audioclient3 = TRUE; + hr = client_Initialize(iface, AUDCLNT_SHAREMODE_SHARED, flags, 0, period, format, session_guid); + This->init_audioclient3 = FALSE; + + return hr; }
const IAudioClient3Vtbl AudioClient3_Vtbl = diff --git a/dlls/mmdevapi/mmdevdrv.h b/dlls/mmdevapi/mmdevdrv.h index 42b01443ff0..7a124151f03 100644 --- a/dlls/mmdevapi/mmdevdrv.h +++ b/dlls/mmdevapi/mmdevdrv.h @@ -69,6 +69,8 @@ struct audio_client { IMMDevice *parent; IUnknown *marshal;
+ BOOLEAN init_audioclient3; + EDataFlow dataflow; float *vols; UINT32 channel_count;