/*
+ * PROJECT: ReactOS Sound System
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: dll/win32/wdmaud.drv/wdmaud.c
*
- * PROJECT: ReactOS WDM Audio driver mapper
- * FILE: dll/win32/wdmaud.drv/wdmaud.c
- * PURPOSE: wdmaud.drv
- * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
+ * PURPOSE: WDM Audio Driver (User-mode part)
+ * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
+ *
+ * NOTES: Looking for wodMessage & co? You won't find them here. Try
+ * the MME Buddy library, which is where these routines are
+ * actually implemented.
*
- * UPDATE HISTORY:
- * 25/05/2008 Created
*/
-#include <stdarg.h>
-
-#include <windows.h>
-#include <mmsystem.h>
-#include <mmddk.h>
-#include <mmreg.h>
-#include <debug.h>
-
-DWORD APIENTRY
-mxdMessage(UINT uDevice,
- UINT uMsg,
- DWORD dwUser,
- DWORD dwParam1,
- DWORD dwParam2)
-{
- DPRINT1("mxdMessage(%04X, %04X, %08X, %08X, %08X);\n", uDevice, uMsg, dwUser, dwParam1, dwParam2);
-
- switch (uMsg)
- {
- case MXDM_INIT:
- break;
-
- case MXDM_GETNUMDEVS:
- break;
-
- case MXDM_GETDEVCAPS:
- break;
+#include "wdmaud.h"
- case MXDM_OPEN:
- break;
- case MXDM_CLOSE:
- break;
+#ifndef USE_MMIXER_LIB
+#define FUNC_NAME(x) x##ByLegacy
+#else
+#define FUNC_NAME(x) x##ByMMixer
+#endif
- case MXDM_GETLINEINFO:
- break;
-
- case MXDM_GETLINECONTROLS:
- break;
-
- case MXDM_GETCONTROLDETAILS:
- break;
-
- case MXDM_SETCONTROLDETAILS:
- break;
- }
-
- return MMSYSERR_NOTSUPPORTED;
-}
-
-DWORD APIENTRY
-auxMessage(UINT uDevice,
- UINT uMsg,
- DWORD dwUser,
- DWORD dwParam1,
- DWORD dwParam2)
+MMRESULT
+QueryWdmWaveDeviceFormatSupport(
+ IN PSOUND_DEVICE Device,
+ IN PWAVEFORMATEX WaveFormat,
+ IN DWORD WaveFormatSize)
{
- DPRINT1("auxMessage(%04X, %04X, %08X, %08X, %08X);\n", uDevice, uMsg, dwUser, dwParam1, dwParam2);
-
- switch (uMsg)
- {
- case AUXDM_GETDEVCAPS:
-
- break;
-
- case AUXDM_GETNUMDEVS:
-
- break;
-
- case AUXDM_GETVOLUME:
-
- break;
-
- case AUXDM_SETVOLUME:
-
- break;
-
- default:
- return MMSYSERR_NOTSUPPORTED;
- }
-
- return MMSYSERR_NOTSUPPORTED;
+ /* Whatever... */
+ return MMSYSERR_NOERROR;
}
-DWORD APIENTRY
-wodMessage(UINT uDevice,
- UINT uMsg,
- DWORD dwUser,
- DWORD dwParam1,
- DWORD dwParam2)
+MMRESULT
+PopulateWdmDeviceList(
+ MMDEVICE_TYPE DeviceType)
{
- DPRINT1("wodMessage(%04X, %04X, %08X, %08X, %08X);\n", uDevice, uMsg, dwUser, dwParam1, dwParam2);
-
- switch (uMsg)
- {
- case WODM_GETNUMDEVS:
- break;
-
- case WODM_GETDEVCAPS:
- break;
-
- case WODM_OPEN:
- break;
-
- case WODM_CLOSE:
- break;
+ MMRESULT Result;
+ DWORD DeviceCount = 0;
+ PSOUND_DEVICE SoundDevice = NULL;
+ MMFUNCTION_TABLE FuncTable;
+ DWORD i;
- case WODM_WRITE:
- break;
+ VALIDATE_MMSYS_PARAMETER( IS_VALID_SOUND_DEVICE_TYPE(DeviceType) );
- case WODM_PAUSE:
- break;
+ Result = FUNC_NAME(WdmAudGetNumWdmDevs)(DeviceType, &DeviceCount);
- case WODM_RESTART:
- break;
-
- case WODM_RESET:
- break;
-
- case WODM_BREAKLOOP:
- break;
-
- case WODM_GETPOS:
- break;
-
- case WODM_SETPITCH:
- break;
-
- case WODM_SETVOLUME:
- break;
-
- case WODM_SETPLAYBACKRATE:
- break;
-
- case WODM_GETPITCH:
- break;
-
- case WODM_GETVOLUME:
- break;
-
- case WODM_GETPLAYBACKRATE:
- break;
-
- default:
- return MMSYSERR_NOTSUPPORTED;
+ if ( ! MMSUCCESS(Result) )
+ {
+ SND_ERR(L"Error %d while obtaining number of devices\n", Result);
+ return TranslateInternalMmResult(Result);
}
- return MMSYSERR_NOTSUPPORTED;
-}
+ SND_TRACE(L"%d devices of type %d found\n", DeviceCount, DeviceType);
-DWORD APIENTRY
-widMessage(UINT uDevice,
- UINT uMsg,
- DWORD dwUser,
- DWORD dwParam1,
- DWORD dwParam2)
-{
- DPRINT1("widMessage(%04X, %04X, %08X, %08X, %08X);\n", uDevice, uMsg, dwUser, dwParam1, dwParam2);
- switch (uMsg)
+ for ( i = 0; i < DeviceCount; ++ i )
{
- case WIDM_GETNUMDEVS:
- break;
-
- case WIDM_GETDEVCAPS:
- break;
-
- case WIDM_OPEN:
- break;
-
- case WIDM_CLOSE:
- break;
-
- case WIDM_ADDBUFFER:
- break;
-
- case WIDM_STOP:
- break;
-
- case WIDM_START:
- break;
-
- case WIDM_RESET:
- break;
-
- case WIDM_GETPOS:
- break;
-
- default:
- return MMSYSERR_NOTSUPPORTED;
+ Result = ListSoundDevice(DeviceType, UlongToPtr(i), &SoundDevice);
+
+ if ( ! MMSUCCESS(Result) )
+ {
+ SND_ERR(L"Failed to list sound device - error %d\n", Result);
+ return TranslateInternalMmResult(Result);
+ }
+
+ /* Set up our function table */
+ ZeroMemory(&FuncTable, sizeof(MMFUNCTION_TABLE));
+ FuncTable.GetCapabilities = FUNC_NAME(WdmAudGetCapabilities);
+ FuncTable.QueryWaveFormatSupport = QueryWdmWaveDeviceFormatSupport; //FIXME
+ FuncTable.Open = FUNC_NAME(WdmAudOpenSoundDevice);
+ FuncTable.Close = FUNC_NAME(WdmAudCloseSoundDevice);
+ FuncTable.GetDeviceInterfaceString = FUNC_NAME(WdmAudGetDeviceInterfaceString);
+
+ if (DeviceType == MIXER_DEVICE_TYPE)
+ {
+ FuncTable.SetWaveFormat = FUNC_NAME(WdmAudSetMixerDeviceFormat);
+ FuncTable.QueryMixerInfo = FUNC_NAME(WdmAudQueryMixerInfo);
+ }
+ else if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE)
+ {
+ FuncTable.SetWaveFormat = FUNC_NAME(WdmAudSetWaveDeviceFormat);
+ FuncTable.SetState = FUNC_NAME(WdmAudSetWaveState);
+ FuncTable.ResetStream = FUNC_NAME(WdmAudResetStream);
+ FuncTable.GetPos = FUNC_NAME(WdmAudGetWavePosition);
+
+#ifndef USERMODE_MIXER
+ FuncTable.CommitWaveBuffer = FUNC_NAME(WdmAudCommitWaveBuffer);
+#else
+ FuncTable.CommitWaveBuffer = WriteFileEx_Remixer;
+#endif
+ }
+
+ SetSoundDeviceFunctionTable(SoundDevice, &FuncTable);
}
- return MMSYSERR_NOTSUPPORTED;
+ return MMSYSERR_NOERROR;
}
-DWORD APIENTRY
-modMessage(UINT uDevice,
- UINT uMsg,
- DWORD dwUser,
- DWORD dwParam1,
- DWORD dwParam2)
-{
- DPRINT1("modMessage(%04X, %04X, %08X, %08X, %08X);\n", uDevice, uMsg, dwUser, dwParam1, dwParam2);
- return MMSYSERR_NOTSUPPORTED;
-}
-LRESULT
-DriverProc(DWORD dwDriverID,
- HDRVR hDriver,
- UINT uiMessage,
- LPARAM lParam1,
- LPARAM lParam2)
+LONG
+APIENTRY
+DriverProc(
+ DWORD DriverId,
+ HANDLE DriverHandle,
+ UINT Message,
+ LONG Parameter1,
+ LONG Parameter2)
{
- return DefDriverProc(dwDriverID, hDriver, uiMessage, lParam1, lParam2);
+ switch ( Message )
+ {
+ case DRV_LOAD :
+ {
+ HANDLE Handle;
+ MMRESULT Result;
+ SND_TRACE(L"DRV_LOAD\n");
+
+ Result = InitEntrypointMutexes();
+
+ if ( ! MMSUCCESS(Result) )
+ return 0L;
+
+ Result = FUNC_NAME(WdmAudOpenSoundDevice)(NULL, &Handle);
+
+ if ( Result != MMSYSERR_NOERROR )
+ {
+ SND_ERR(L"Failed to open \\\\.\\wdmaud\n");
+ //UnlistAllSoundDevices();
+
+ return 0L;
+ }
+
+ /* Populate the device lists */
+ SND_TRACE(L"Populating device lists\n");
+ PopulateWdmDeviceList(WAVE_OUT_DEVICE_TYPE);
+ PopulateWdmDeviceList(WAVE_IN_DEVICE_TYPE);
+ PopulateWdmDeviceList(MIDI_OUT_DEVICE_TYPE);
+ PopulateWdmDeviceList(MIDI_IN_DEVICE_TYPE);
+ PopulateWdmDeviceList(AUX_DEVICE_TYPE);
+ PopulateWdmDeviceList(MIXER_DEVICE_TYPE);
+
+ SND_TRACE(L"Initialisation complete\n");
+
+ return 1L;
+ }
+
+ case DRV_FREE :
+ {
+ SND_TRACE(L"DRV_FREE\n");
+
+ FUNC_NAME(WdmAudCleanup)();
+
+ /* TODO: Clean up the path names! */
+ UnlistAllSoundDevices();
+
+ CleanupEntrypointMutexes();
+
+ SND_TRACE(L"Unfreed memory blocks: %d\n",
+ GetMemoryAllocationCount());
+
+ return 1L;
+ }
+
+ case DRV_ENABLE :
+ case DRV_DISABLE :
+ {
+ SND_TRACE(L"DRV_ENABLE / DRV_DISABLE\n");
+ return 1L;
+ }
+
+ case DRV_OPEN :
+ case DRV_CLOSE :
+ {
+ SND_TRACE(L"DRV_OPEN / DRV_CLOSE\n");
+ return 1L;
+ }
+
+ case DRV_QUERYCONFIGURE :
+ {
+ SND_TRACE(L"DRV_QUERYCONFIGURE\n");
+ return 0L;
+ }
+ case DRV_CONFIGURE :
+ return DRVCNF_OK;
+
+ default :
+ SND_TRACE(L"Unhandled message %d\n", Message);
+ return DefDriverProc(DriverId,
+ DriverHandle,
+ Message,
+ Parameter1,
+ Parameter2);
+ }
}
-BOOL WINAPI
-DllMain(IN HINSTANCE hinstDLL,
- IN DWORD dwReason,
- IN LPVOID lpvReserved)
+
+BOOL WINAPI DllMain(
+ HINSTANCE hinstDLL,
+ DWORD fdwReason,
+ LPVOID lpvReserved)
{
- switch (dwReason)
+ switch ( fdwReason )
{
- case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hinstDLL);
+ case DLL_PROCESS_ATTACH :
+ SND_TRACE(L"WDMAUD.DRV - Process attached\n");
+ break;
+ case DLL_PROCESS_DETACH :
+ SND_TRACE(L"WDMAUD.DRV - Process detached\n");
+ break;
+ case DLL_THREAD_ATTACH :
+ SND_TRACE(L"WDMAUD.DRV - Thread attached\n");
+ break;
+ case DLL_THREAD_DETACH :
+ SND_TRACE(L"WDMAUD.DRV - Thread detached\n");
break;
}
return TRUE;
}
-