3 * PROJECT: ReactOS Multimedia Control Panel
4 * FILE: dll/cpl/mmsys/mmsys.c
5 * PURPOSE: ReactOS Multimedia Control Panel
6 * PROGRAMMER: Thoams Weidenmueller <w3seek@reactos.com>
7 * Dmitry Chapyshev <dmitry@reactos.org>
16 HWPD_STANDARDLIST
= 0,
18 HWPD_MAX
= HWPD_LARGELIST
19 } HWPAGE_DISPLAYMODE
, *PHWPAGE_DISPLAYMODE
;
36 static EVENT_LABEL_ITEM EventLabels
[] =
58 static SYSTEM_SCHEME_ITEM SystemSchemes
[] =
63 IDS_REACTOS_DEFAULT_SCHEME
78 DeviceCreateHardwarePageEx(HWND hWndParent
,
81 HWPAGE_DISPLAYMODE DisplayMode
);
83 #define NUM_APPLETS (1)
86 HINSTANCE hApplet
= 0;
89 const APPLET Applets
[NUM_APPLETS
] =
91 {IDI_CPLICON
, IDS_CPLNAME
, IDS_CPLDESCRIPTION
, MmSysApplet
},
98 DPRINT1("DllCanUnloadNow() stubs\n");
103 DllGetClassObject(REFCLSID rclsid
,
107 DPRINT1("DllGetClassObject() stubs\n");
113 ShowDriverSettingsAfterForkW(HWND hwnd
,
118 DPRINT1("ShowDriverSettingsAfterForkW() stubs\n");
122 ShowDriverSettingsAfterForkA(HWND hwnd
,
127 DPRINT1("ShowDriverSettingsAfterForkA() stubs\n");
131 ShowDriverSettingsAfterFork(HWND hwnd
,
136 DPRINT1("ShowDriverSettingsAfterFork() stubs\n");
140 ShowMMCPLPropertySheet(HWND hwnd
,
145 DPRINT1("ShowMMCPLPropertySheet() stubs\n");
150 ShowAudioPropertySheet(HWND hwnd
,
155 DPRINT1("ShowAudioPropertySheet() stubs\n");
159 mmseRunOnceW(HWND hwnd
,
164 DPRINT1("mmseRunOnceW() stubs\n");
168 mmseRunOnceA(HWND hwnd
,
173 DPRINT1("mmseRunOnceA() stubs\n");
177 mmseRunOnce(HWND hwnd
,
182 DPRINT1("mmseRunOnce() stubs\n");
186 MediaPropPageProvider(LPVOID Info
,
187 LPFNADDPROPSHEETPAGE PropSheetPage
,
190 DPRINT1("MediaPropPageProvider() stubs\n");
195 ShowFullControlPanel(HWND hwnd
,
200 DPRINT1("ShowFullControlPanel() stubs\n");
204 InstallSystemSoundLabels(HKEY hKey
)
212 if (RegCreateKeyExW(hKey
, EventLabels
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
214 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)EventLabels
[i
].DefaultName
, (wcslen(EventLabels
[i
].DefaultName
)+1) * sizeof(WCHAR
));
215 swprintf(Buffer
, L
"@mmsys.cpl,-%u", EventLabels
[i
].LocalizedResId
);
216 RegSetValueExW(hSubKey
, L
"DispFileName", 0, REG_SZ
, (LPBYTE
)Buffer
, (wcslen(Buffer
)+1) * sizeof(WCHAR
));
218 RegCloseKey(hSubKey
);
221 }while(EventLabels
[i
].LabelName
);
225 InstallSystemSoundSchemeNames(HKEY hKey
)
232 if (RegCreateKeyExW(hKey
, SystemSchemes
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
234 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)SystemSchemes
[i
].DefaultName
, (wcslen(SystemSchemes
[i
].DefaultName
)+1) * sizeof(WCHAR
));
235 RegCloseKey(hSubKey
);
238 }while(SystemSchemes
[i
].LabelName
);
242 InstallDefaultSystemSoundScheme(HKEY hRootKey
)
245 WCHAR Path
[MAX_PATH
];
248 if (RegCreateKeyExW(hRootKey
, L
".Default", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
251 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (LPBYTE
)SystemSchemes
[0].DefaultName
, (wcslen(SystemSchemes
[0].DefaultName
)+1) * sizeof(WCHAR
));
252 swprintf(Path
, L
"@mmsys.cpl,-%u", SystemSchemes
[0].IconId
);
253 RegSetValueExW(hKey
, L
"DispFileName", 0, REG_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
257 if (RegCreateKeyExW(hKey
, EventLabels
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
261 swprintf(Path
, L
"%%SystemRoot%%\\media\\%s", EventLabels
[i
].FileName
);
262 if (RegCreateKeyExW(hSubKey
, L
".Current", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hScheme
, NULL
) == ERROR_SUCCESS
)
264 RegSetValueExW(hScheme
, NULL
, 0, REG_EXPAND_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
265 RegCloseKey(hScheme
);
268 if (RegCreateKeyExW(hSubKey
, L
".Default", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hScheme
, NULL
) == ERROR_SUCCESS
)
270 RegSetValueExW(hScheme
, NULL
, 0, REG_EXPAND_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
271 RegCloseKey(hScheme
);
273 RegCloseKey(hSubKey
);
276 }while(EventLabels
[i
].LabelName
);
283 InstallSystemSoundScheme()
288 if (RegCreateKeyExW(HKEY_CURRENT_USER
, L
"AppEvents", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
291 if (RegCreateKeyExW(hKey
, L
"EventLabels", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
293 InstallSystemSoundLabels(hSubKey
);
294 RegCloseKey(hSubKey
);
297 if (RegCreateKeyExW(hKey
, L
"Schemes", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, &dwDisposition
) == ERROR_SUCCESS
)
301 if (RegCreateKeyExW(hSubKey
, L
"Names", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hNames
, NULL
) == ERROR_SUCCESS
)
303 InstallSystemSoundSchemeNames(hNames
);
307 if (RegCreateKeyExW(hSubKey
, L
"Apps", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hNames
, NULL
) == ERROR_SUCCESS
)
309 InstallDefaultSystemSoundScheme(hNames
);
311 if (dwDisposition
& REG_CREATED_NEW_KEY
)
314 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)L
".Default", (wcslen(L
".Default")+1) * sizeof(WCHAR
));
318 RegCloseKey(hSubKey
);
326 MMSYS_InstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
330 WCHAR szBuffer
[MAX_PATH
];
334 SC_HANDLE hSCManager
, hService
;
340 if (!IsEqualIID(&pspDevInfoData
->ClassGuid
, &GUID_DEVCLASS_SOUND
) &&
341 !IsEqualIID(&pspDevInfoData
->ClassGuid
, &GUID_DEVCLASS_MEDIA
))
342 return ERROR_DI_DO_DEFAULT
;
344 Length
= GetWindowsDirectoryW(szBuffer
, MAX_PATH
);
345 if (!Length
|| Length
>= MAX_PATH
- 14)
347 return ERROR_GEN_FAILURE
;
350 pBuffer
= PathAddBackslashW(szBuffer
);
353 return ERROR_GEN_FAILURE
;
356 wcscpy(pBuffer
, L
"inf\\audio.inf");
358 hInf
= SetupOpenInfFileW(szBuffer
,
363 if (hInf
== INVALID_HANDLE_VALUE
)
365 return ERROR_GEN_FAILURE
;
368 Context
= SetupInitDefaultQueueCallback(NULL
);
371 SetupCloseInfFile(hInf
);
372 return ERROR_GEN_FAILURE
;
375 Result
= SetupInstallFromInfSectionW(NULL
,
382 SetupDefaultQueueCallbackW
,
389 Result
= SetupInstallServicesFromInfSectionW(hInf
,
390 L
"Audio_Inst.NT.Services",
394 SetupTermDefaultQueueCallback(Context
);
395 SetupCloseInfFile(hInf
);
399 hSCManager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_CONNECT
);
402 return ERROR_DI_DO_DEFAULT
;
405 hService
= OpenService(hSCManager
, L
"RosAudioSrv", SERVICE_ALL_ACCESS
);
408 /* Make RosAudioSrv start automatically */
409 ChangeServiceConfig(hService
, SERVICE_NO_CHANGE
, SERVICE_AUTO_START
, SERVICE_NO_CHANGE
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
411 StartService(hService
, 0, NULL
);
412 CloseServiceHandle(hService
);
414 CloseServiceHandle(hSCManager
);
416 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0, GENERIC_READ
| GENERIC_WRITE
, &hKey
) == ERROR_SUCCESS
)
418 szBuffer
[Length
] = '\0';
419 pBuffer
= PathAddBackslashW(szBuffer
);
420 wcscpy(pBuffer
, L
"system32\\wdmaud.drv");
422 for(Index
= 1; Index
<= 4; Index
++)
424 swprintf(WaveName
, L
"wave%u", Index
);
425 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, NULL
, &BufferSize
) != ERROR_MORE_DATA
)
427 /* Store new audio driver entry */
428 RegSetValueExW(hKey
, WaveName
, 0, REG_SZ
, (LPBYTE
)szBuffer
, (wcslen(szBuffer
)+1) * sizeof(WCHAR
));
433 WCHAR Buffer
[MAX_PATH
];
434 BufferSize
= sizeof(Buffer
);
436 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, (LPBYTE
)Buffer
, &BufferSize
) == ERROR_SUCCESS
)
438 /* Make sure the buffer is zero terminated */
439 Buffer
[MAX_PATH
-1] = L
'\0';
441 if (!wcsicmp(Buffer
, szBuffer
))
443 /* An entry already exists */
451 InstallSystemSoundScheme();
453 return ERROR_DI_DO_DEFAULT
;
458 MMSYS_RemoveDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
460 return ERROR_DI_DO_DEFAULT
;
464 MMSYS_AllowInstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
466 return ERROR_DI_DO_DEFAULT
;
470 MMSYS_SelectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
472 return ERROR_DI_DO_DEFAULT
;
476 MMSYS_DetectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
478 return ERROR_DI_DO_DEFAULT
;
482 MMSYS_SelectBestCompatDRV(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
484 return ERROR_DI_DO_DEFAULT
;
488 MediaClassInstaller(IN DI_FUNCTION diFunction
,
489 IN HDEVINFO hDevInfo
,
490 IN PSP_DEVINFO_DATA pspDevInfoData OPTIONAL
)
494 case DIF_INSTALLDEVICE
:
495 return MMSYS_InstallDevice(hDevInfo
, pspDevInfoData
);
497 return MMSYS_RemoveDevice(hDevInfo
, pspDevInfoData
);
498 case DIF_ALLOW_INSTALL
:
499 return MMSYS_AllowInstallDevice(hDevInfo
, pspDevInfoData
);
500 case DIF_SELECTDEVICE
:
501 return MMSYS_SelectDevice(hDevInfo
, pspDevInfoData
);
503 return MMSYS_DetectDevice(hDevInfo
, pspDevInfoData
);
504 case DIF_SELECTBESTCOMPATDRV
:
505 return MMSYS_SelectBestCompatDRV(hDevInfo
, pspDevInfoData
);
507 return ERROR_DI_DO_DEFAULT
;
512 /* Hardware property page dialog callback */
513 static INT_PTR CALLBACK
514 HardwareDlgProc(HWND hwndDlg
,
519 UNREFERENCED_PARAMETER(lParam
);
520 UNREFERENCED_PARAMETER(wParam
);
526 Guids
[0] = GUID_DEVCLASS_CDROM
;
527 Guids
[1] = GUID_DEVCLASS_MEDIA
;
529 /* Create the hardware page */
530 DeviceCreateHardwarePageEx(hwndDlg
,
532 sizeof(Guids
) / sizeof(Guids
[0]),
542 MmSysApplet(HWND hwnd
,
547 PROPSHEETPAGE psp
[5];
548 PROPSHEETHEADER psh
; // = { 0 };
551 UNREFERENCED_PARAMETER(lParam
);
552 UNREFERENCED_PARAMETER(wParam
);
553 UNREFERENCED_PARAMETER(uMsg
);
558 sizeof(Caption
) / sizeof(TCHAR
));
560 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
561 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
562 psh
.hwndParent
= hwnd
;
563 psh
.hInstance
= hApplet
;
564 psh
.hIcon
= LoadIcon(hApplet
,
565 MAKEINTRESOURCE(IDI_CPLICON
));
566 psh
.pszCaption
= Caption
;
567 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
571 InitPropSheetPage(&psp
[0], IDD_VOLUME
,VolumeDlgProc
);
572 InitPropSheetPage(&psp
[1], IDD_SOUNDS
,SoundsDlgProc
);
573 InitPropSheetPage(&psp
[2], IDD_AUDIO
,AudioDlgProc
);
574 InitPropSheetPage(&psp
[3], IDD_VOICE
,VoiceDlgProc
);
575 InitPropSheetPage(&psp
[4], IDD_HARDWARE
,HardwareDlgProc
);
577 return (LONG
)(PropertySheet(&psh
) != -1);
581 InitPropSheetPage(PROPSHEETPAGE
*psp
,
585 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
586 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
587 psp
->dwFlags
= PSP_DEFAULT
;
588 psp
->hInstance
= hApplet
;
589 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
590 psp
->pfnDlgProc
= DlgProc
;
594 /* Control Panel Callback */
596 CPlApplet(HWND hwndCpl
,
611 CPLINFO
*CPlInfo
= (CPLINFO
*)lParam2
;
612 UINT uAppIndex
= (UINT
)lParam1
;
615 CPlInfo
->idIcon
= Applets
[uAppIndex
].idIcon
;
616 CPlInfo
->idName
= Applets
[uAppIndex
].idName
;
617 CPlInfo
->idInfo
= Applets
[uAppIndex
].idDescription
;
623 UINT uAppIndex
= (UINT
)lParam1
;
624 Applets
[uAppIndex
].AppletProc(hwndCpl
,
637 DllMain(HINSTANCE hinstDLL
,
641 UNREFERENCED_PARAMETER(lpReserved
);
644 case DLL_PROCESS_ATTACH
:
646 DisableThreadLibraryCalls(hinstDLL
);