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>
28 HWPD_STANDARDLIST
= 0,
30 HWPD_MAX
= HWPD_LARGELIST
31 } HWPAGE_DISPLAYMODE
, *PHWPAGE_DISPLAYMODE
;
48 static EVENT_LABEL_ITEM EventLabels
[] =
70 static SYSTEM_SCHEME_ITEM SystemSchemes
[] =
75 IDS_REACTOS_DEFAULT_SCHEME
90 DeviceCreateHardwarePageEx(HWND hWndParent
,
93 HWPAGE_DISPLAYMODE DisplayMode
);
95 #define NUM_APPLETS (1)
98 HINSTANCE hApplet
= 0;
101 const APPLET Applets
[NUM_APPLETS
] =
103 {IDI_CPLICON
, IDS_CPLNAME
, IDS_CPLDESCRIPTION
, MmSysApplet
},
108 DllCanUnloadNow(VOID
)
110 DPRINT1("DllCanUnloadNow() stubs\n");
115 DllGetClassObject(REFCLSID rclsid
,
119 DPRINT1("DllGetClassObject() stubs\n");
125 ShowDriverSettingsAfterForkW(HWND hwnd
,
130 DPRINT1("ShowDriverSettingsAfterForkW() stubs\n");
134 ShowDriverSettingsAfterForkA(HWND hwnd
,
139 DPRINT1("ShowDriverSettingsAfterForkA() stubs\n");
143 ShowDriverSettingsAfterFork(HWND hwnd
,
148 DPRINT1("ShowDriverSettingsAfterFork() stubs\n");
152 ShowMMCPLPropertySheet(HWND hwnd
,
157 DPRINT1("ShowMMCPLPropertySheet() stubs\n");
162 ShowAudioPropertySheet(HWND hwnd
,
167 DPRINT1("ShowAudioPropertySheet() stubs\n");
171 mmseRunOnceW(HWND hwnd
,
176 DPRINT1("mmseRunOnceW() stubs\n");
180 mmseRunOnceA(HWND hwnd
,
185 DPRINT1("mmseRunOnceA() stubs\n");
189 mmseRunOnce(HWND hwnd
,
194 DPRINT1("mmseRunOnce() stubs\n");
198 MediaPropPageProvider(LPVOID Info
,
199 LPFNADDPROPSHEETPAGE PropSheetPage
,
202 DPRINT1("MediaPropPageProvider() stubs\n");
207 ShowFullControlPanel(HWND hwnd
,
212 DPRINT1("ShowFullControlPanel() stubs\n");
216 InstallSystemSoundLabels(HKEY hKey
)
224 if (RegCreateKeyExW(hKey
, EventLabels
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
226 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)EventLabels
[i
].DefaultName
, (wcslen(EventLabels
[i
].DefaultName
)+1) * sizeof(WCHAR
));
227 swprintf(Buffer
, L
"@mmsys.cpl,-%u", EventLabels
[i
].LocalizedResId
);
228 RegSetValueExW(hSubKey
, L
"DispFileName", 0, REG_SZ
, (LPBYTE
)Buffer
, (wcslen(Buffer
)+1) * sizeof(WCHAR
));
230 RegCloseKey(hSubKey
);
233 }while(EventLabels
[i
].LabelName
);
237 InstallSystemSoundSchemeNames(HKEY hKey
)
244 if (RegCreateKeyExW(hKey
, SystemSchemes
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
246 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)SystemSchemes
[i
].DefaultName
, (wcslen(SystemSchemes
[i
].DefaultName
)+1) * sizeof(WCHAR
));
247 RegCloseKey(hSubKey
);
250 }while(SystemSchemes
[i
].LabelName
);
254 InstallDefaultSystemSoundScheme(HKEY hRootKey
)
257 WCHAR Path
[MAX_PATH
];
260 if (RegCreateKeyExW(hRootKey
, L
".Default", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
263 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (LPBYTE
)SystemSchemes
[0].DefaultName
, (wcslen(SystemSchemes
[0].DefaultName
)+1) * sizeof(WCHAR
));
264 swprintf(Path
, L
"@mmsys.cpl,-%u", SystemSchemes
[0].IconId
);
265 RegSetValueExW(hKey
, L
"DispFileName", 0, REG_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
269 if (RegCreateKeyExW(hKey
, EventLabels
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
273 swprintf(Path
, L
"%%SystemRoot%%\\media\\%s", EventLabels
[i
].FileName
);
274 if (RegCreateKeyExW(hSubKey
, L
".Current", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hScheme
, NULL
) == ERROR_SUCCESS
)
276 RegSetValueExW(hScheme
, NULL
, 0, REG_EXPAND_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
277 RegCloseKey(hScheme
);
280 if (RegCreateKeyExW(hSubKey
, L
".Default", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hScheme
, NULL
) == ERROR_SUCCESS
)
282 RegSetValueExW(hScheme
, NULL
, 0, REG_EXPAND_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
283 RegCloseKey(hScheme
);
285 RegCloseKey(hSubKey
);
288 }while(EventLabels
[i
].LabelName
);
295 InstallSystemSoundScheme()
300 if (RegCreateKeyExW(HKEY_CURRENT_USER
, L
"AppEvents", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
303 if (RegCreateKeyExW(hKey
, L
"EventLabels", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
305 InstallSystemSoundLabels(hSubKey
);
306 RegCloseKey(hSubKey
);
309 if (RegCreateKeyExW(hKey
, L
"Schemes", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, &dwDisposition
) == ERROR_SUCCESS
)
313 if (RegCreateKeyExW(hSubKey
, L
"Names", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hNames
, NULL
) == ERROR_SUCCESS
)
315 InstallSystemSoundSchemeNames(hNames
);
319 if (RegCreateKeyExW(hSubKey
, L
"Apps", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hNames
, NULL
) == ERROR_SUCCESS
)
321 InstallDefaultSystemSoundScheme(hNames
);
323 if (dwDisposition
& REG_CREATED_NEW_KEY
)
325 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)L
".Default", (wcslen(L
".Default")+1) * sizeof(WCHAR
)); //FIXME
329 RegCloseKey(hSubKey
);
337 MMSYS_InstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
341 WCHAR szBuffer
[MAX_PATH
];
345 SC_HANDLE hSCManager
, hService
;
351 if (!IsEqualIID(&pspDevInfoData
->ClassGuid
, &GUID_DEVCLASS_SOUND
) &&
352 !IsEqualIID(&pspDevInfoData
->ClassGuid
, &GUID_DEVCLASS_MEDIA
))
353 return ERROR_DI_DO_DEFAULT
;
355 Length
= GetWindowsDirectoryW(szBuffer
, MAX_PATH
);
356 if (!Length
|| Length
>= MAX_PATH
- 14)
358 return ERROR_GEN_FAILURE
;
361 pBuffer
= PathAddBackslashW(szBuffer
);
364 return ERROR_GEN_FAILURE
;
367 wcscpy(pBuffer
, L
"inf\\audio.inf");
369 hInf
= SetupOpenInfFileW(szBuffer
,
374 if (hInf
== INVALID_HANDLE_VALUE
)
376 return ERROR_GEN_FAILURE
;
379 Context
= SetupInitDefaultQueueCallback(NULL
);
382 SetupCloseInfFile(hInf
);
383 return ERROR_GEN_FAILURE
;
386 Result
= SetupInstallFromInfSectionW(NULL
,
393 SetupDefaultQueueCallbackW
,
398 SetupTermDefaultQueueCallback(Context
);
399 SetupCloseInfFile(hInf
);
403 hSCManager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_CONNECT
);
406 return ERROR_DI_DO_DEFAULT
;
409 hService
= OpenService(hSCManager
, L
"RosAudioSrv", SERVICE_ALL_ACCESS
);
412 /* make RosAudioSrv start automatically */
413 ChangeServiceConfig(hService
, SERVICE_NO_CHANGE
, SERVICE_AUTO_START
, SERVICE_NO_CHANGE
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
415 StartService(hService
, 0, NULL
);
416 CloseServiceHandle(hService
);
418 CloseServiceHandle(hSCManager
);
420 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0, GENERIC_READ
| GENERIC_WRITE
, &hKey
) == ERROR_SUCCESS
)
422 szBuffer
[Length
] = '\0';
423 pBuffer
= PathAddBackslashW(szBuffer
);
424 wcscpy(pBuffer
, L
"system32\\wdmaud.drv");
426 for(Index
= 1; Index
<= 4; Index
++)
428 swprintf(WaveName
, L
"wave%u", Index
);
429 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, NULL
, &BufferSize
) != ERROR_MORE_DATA
)
431 /* Store new audio driver entry */
432 RegSetValueExW(hKey
, WaveName
, 0, REG_SZ
, (LPBYTE
)szBuffer
, (wcslen(szBuffer
)+1) * sizeof(WCHAR
));
437 WCHAR Buffer
[MAX_PATH
];
438 BufferSize
= sizeof(Buffer
);
440 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, (LPBYTE
)Buffer
, &BufferSize
) == ERROR_SUCCESS
)
442 /* Make sure the buffer is zero terminated */
443 Buffer
[MAX_PATH
-1] = L
'\0';
445 if (!wcsicmp(Buffer
, szBuffer
))
447 /* an entry already exists */
455 InstallSystemSoundScheme();
457 return ERROR_DI_DO_DEFAULT
;
462 MMSYS_RemoveDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
464 return ERROR_DI_DO_DEFAULT
;
468 MMSYS_AllowInstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
470 return ERROR_DI_DO_DEFAULT
;
474 MMSYS_SelectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
476 return ERROR_DI_DO_DEFAULT
;
480 MMSYS_DetectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
482 return ERROR_DI_DO_DEFAULT
;
486 MMSYS_SelectBestCompatDRV(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
488 return ERROR_DI_DO_DEFAULT
;
492 MediaClassInstaller(IN DI_FUNCTION diFunction
,
493 IN HDEVINFO hDevInfo
,
494 IN PSP_DEVINFO_DATA pspDevInfoData OPTIONAL
)
498 case DIF_INSTALLDEVICE
:
499 return MMSYS_InstallDevice(hDevInfo
, pspDevInfoData
);
501 return MMSYS_RemoveDevice(hDevInfo
, pspDevInfoData
);
502 case DIF_ALLOW_INSTALL
:
503 return MMSYS_AllowInstallDevice(hDevInfo
, pspDevInfoData
);
504 case DIF_SELECTDEVICE
:
505 return MMSYS_SelectDevice(hDevInfo
, pspDevInfoData
);
507 return MMSYS_DetectDevice(hDevInfo
, pspDevInfoData
);
508 case DIF_SELECTBESTCOMPATDRV
:
509 return MMSYS_SelectBestCompatDRV(hDevInfo
, pspDevInfoData
);
511 return ERROR_DI_DO_DEFAULT
;
516 /* Hardware property page dialog callback */
517 static INT_PTR CALLBACK
518 HardwareDlgProc(HWND hwndDlg
,
523 UNREFERENCED_PARAMETER(lParam
);
524 UNREFERENCED_PARAMETER(wParam
);
530 Guids
[0] = GUID_DEVCLASS_CDROM
;
531 Guids
[1] = GUID_DEVCLASS_MEDIA
;
533 /* create the hardware page */
534 DeviceCreateHardwarePageEx(hwndDlg
,
536 sizeof(Guids
) / sizeof(Guids
[0]),
546 MmSysApplet(HWND hwnd
,
551 PROPSHEETPAGE psp
[5];
552 PROPSHEETHEADER psh
; //= {0};
555 UNREFERENCED_PARAMETER(lParam
);
556 UNREFERENCED_PARAMETER(wParam
);
557 UNREFERENCED_PARAMETER(uMsg
);
562 sizeof(Caption
) / sizeof(TCHAR
));
564 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
565 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
566 psh
.hwndParent
= hwnd
;
567 psh
.hInstance
= hApplet
;
568 psh
.hIcon
= LoadIcon(hApplet
,
569 MAKEINTRESOURCE(IDI_CPLICON
));
570 psh
.pszCaption
= Caption
;
571 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
575 InitPropSheetPage(&psp
[0], IDD_VOLUME
,VolumeDlgProc
);
576 InitPropSheetPage(&psp
[1], IDD_SOUNDS
,SoundsDlgProc
);
577 InitPropSheetPage(&psp
[2], IDD_AUDIO
,AudioDlgProc
);
578 InitPropSheetPage(&psp
[3], IDD_VOICE
,VoiceDlgProc
);
579 InitPropSheetPage(&psp
[4], IDD_HARDWARE
,HardwareDlgProc
);
581 return (LONG
)(PropertySheet(&psh
) != -1);
585 InitPropSheetPage(PROPSHEETPAGE
*psp
,
589 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
590 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
591 psp
->dwFlags
= PSP_DEFAULT
;
592 psp
->hInstance
= hApplet
;
593 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
594 psp
->pfnDlgProc
= DlgProc
;
598 /* Control Panel Callback */
600 CPlApplet(HWND hwndCpl
,
615 CPLINFO
*CPlInfo
= (CPLINFO
*)lParam2
;
616 UINT uAppIndex
= (UINT
)lParam1
;
619 CPlInfo
->idIcon
= Applets
[uAppIndex
].idIcon
;
620 CPlInfo
->idName
= Applets
[uAppIndex
].idName
;
621 CPlInfo
->idInfo
= Applets
[uAppIndex
].idDescription
;
627 UINT uAppIndex
= (UINT
)lParam1
;
628 Applets
[uAppIndex
].AppletProc(hwndCpl
,
641 DllMain(HINSTANCE hinstDLL
,
645 UNREFERENCED_PARAMETER(lpReserved
);
648 case DLL_PROCESS_ATTACH
:
650 DisableThreadLibraryCalls(hinstDLL
);