From dd155531245f58a7cf04665511fc663265ba7aa2 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 12 Feb 2010 06:18:31 +0000 Subject: [PATCH] [MMIXER, WDMAUD_KERNEL] - Implement retrieving device path svn path=/trunk/; revision=45582 --- .../drivers/wdm/audio/legacy/wdmaud/mmixer.c | 8 ++- reactos/lib/drivers/sound/mmixer/mmixer.h | 7 +++ reactos/lib/drivers/sound/mmixer/wave.c | 58 +++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c index 1d8a806d430..cf58846decb 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -551,10 +551,12 @@ NTSTATUS WdmAudGetPnpNameByIndexAndType( IN ULONG DeviceIndex, IN SOUND_DEVICE_TYPE DeviceType, - OUT LPWSTR *Device) + OUT LPWSTR *DevicePath) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + if (MMixerGetWaveDevicePath(&MixerContext, DeviceType == WAVE_IN_DEVICE_TYPE, DeviceIndex, DevicePath) == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + else + return STATUS_UNSUCCESSFUL; } NTSTATUS diff --git a/reactos/lib/drivers/sound/mmixer/mmixer.h b/reactos/lib/drivers/sound/mmixer/mmixer.h index 7f117e36223..e14d663cd49 100644 --- a/reactos/lib/drivers/sound/mmixer/mmixer.h +++ b/reactos/lib/drivers/sound/mmixer/mmixer.h @@ -191,4 +191,11 @@ MMixerSetWaveStatus( IN HANDLE PinHandle, IN KSSTATE State); +MIXER_STATUS +MMixerGetWaveDevicePath( + IN PMIXER_CONTEXT MixerContext, + IN ULONG bWaveIn, + IN ULONG DeviceId, + OUT LPWSTR * DevicePath); + #endif diff --git a/reactos/lib/drivers/sound/mmixer/wave.c b/reactos/lib/drivers/sound/mmixer/wave.c index c156378f289..a8b2675cac9 100644 --- a/reactos/lib/drivers/sound/mmixer/wave.c +++ b/reactos/lib/drivers/sound/mmixer/wave.c @@ -611,3 +611,61 @@ MMixerSetWaveStatus( return MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &Length); } + +MIXER_STATUS +MMixerGetWaveDevicePath( + IN PMIXER_CONTEXT MixerContext, + IN ULONG bWaveIn, + IN ULONG DeviceId, + OUT LPWSTR * DevicePath) +{ + PMIXER_LIST MixerList; + LPMIXER_DATA MixerData; + LPWAVE_INFO WaveInfo; + ULONG Length; + MIXER_STATUS Status; + + // verify mixer context + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + { + // invalid context passed + return Status; + } + + // grab mixer list + MixerList = (PMIXER_LIST)MixerContext->MixerContext; + + /* find destination wave */ + Status = MMixerGetWaveInfoByIndexAndType(MixerList, DeviceId, bWaveIn, &WaveInfo); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to find wave info */ + return MM_STATUS_INVALID_PARAMETER; + } + + /* get associated device id */ + MixerData = MMixerGetDataByDeviceId(MixerList, WaveInfo->DeviceId); + if (!MixerData) + return MM_STATUS_INVALID_PARAMETER; + + /* calculate length */ + Length = wcslen(MixerData->DeviceName)+1; + + /* allocate destination buffer */ + *DevicePath = MixerContext->Alloc(Length * sizeof(WCHAR)); + + if (!*DevicePath) + { + /* no memory */ + return MM_STATUS_NO_MEMORY; + } + + /* copy device path */ + MixerContext->Copy(*DevicePath, MixerData->DeviceName, Length * sizeof(WCHAR)); + + /* done */ + return MM_STATUS_SUCCESS; +} + -- 2.17.1