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
,
400 Result
= SetupInstallServicesFromInfSectionW(hInf
,
401 L
"Audio_Inst.NT.Services",
405 SetupTermDefaultQueueCallback(Context
);
406 SetupCloseInfFile(hInf
);
410 hSCManager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_CONNECT
);
413 return ERROR_DI_DO_DEFAULT
;
416 hService
= OpenService(hSCManager
, L
"RosAudioSrv", SERVICE_ALL_ACCESS
);
419 /* make RosAudioSrv start automatically */
420 ChangeServiceConfig(hService
, SERVICE_NO_CHANGE
, SERVICE_AUTO_START
, SERVICE_NO_CHANGE
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
422 StartService(hService
, 0, NULL
);
423 CloseServiceHandle(hService
);
425 CloseServiceHandle(hSCManager
);
427 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0, GENERIC_READ
| GENERIC_WRITE
, &hKey
) == ERROR_SUCCESS
)
429 szBuffer
[Length
] = '\0';
430 pBuffer
= PathAddBackslashW(szBuffer
);
431 wcscpy(pBuffer
, L
"system32\\wdmaud.drv");
433 for(Index
= 1; Index
<= 4; Index
++)
435 swprintf(WaveName
, L
"wave%u", Index
);
436 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, NULL
, &BufferSize
) != ERROR_MORE_DATA
)
438 RegSetValueExW(hKey
, WaveName
, 0, REG_SZ
, (LPBYTE
)szBuffer
, (wcslen(szBuffer
)+1) * sizeof(WCHAR
));
443 InstallSystemSoundScheme();
445 return ERROR_DI_DO_DEFAULT
;
450 MMSYS_RemoveDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
452 return ERROR_DI_DO_DEFAULT
;
456 MMSYS_AllowInstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
458 return ERROR_DI_DO_DEFAULT
;
462 MMSYS_SelectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
464 return ERROR_DI_DO_DEFAULT
;
468 MMSYS_DetectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
470 return ERROR_DI_DO_DEFAULT
;
474 MMSYS_SelectBestCompatDRV(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
476 return ERROR_DI_DO_DEFAULT
;
480 MediaClassInstaller(IN DI_FUNCTION diFunction
,
481 IN HDEVINFO hDevInfo
,
482 IN PSP_DEVINFO_DATA pspDevInfoData OPTIONAL
)
486 case DIF_INSTALLDEVICE
:
487 return MMSYS_InstallDevice(hDevInfo
, pspDevInfoData
);
489 return MMSYS_RemoveDevice(hDevInfo
, pspDevInfoData
);
490 case DIF_ALLOW_INSTALL
:
491 return MMSYS_AllowInstallDevice(hDevInfo
, pspDevInfoData
);
492 case DIF_SELECTDEVICE
:
493 return MMSYS_SelectDevice(hDevInfo
, pspDevInfoData
);
495 return MMSYS_DetectDevice(hDevInfo
, pspDevInfoData
);
496 case DIF_SELECTBESTCOMPATDRV
:
497 return MMSYS_SelectBestCompatDRV(hDevInfo
, pspDevInfoData
);
499 return ERROR_DI_DO_DEFAULT
;
504 /* Hardware property page dialog callback */
505 static INT_PTR CALLBACK
506 HardwareDlgProc(HWND hwndDlg
,
511 UNREFERENCED_PARAMETER(lParam
);
512 UNREFERENCED_PARAMETER(wParam
);
518 Guids
[0] = GUID_DEVCLASS_CDROM
;
519 Guids
[1] = GUID_DEVCLASS_MEDIA
;
521 /* create the hardware page */
522 DeviceCreateHardwarePageEx(hwndDlg
,
524 sizeof(Guids
) / sizeof(Guids
[0]),
534 MmSysApplet(HWND hwnd
,
539 PROPSHEETPAGE psp
[5];
540 PROPSHEETHEADER psh
; //= {0};
543 UNREFERENCED_PARAMETER(lParam
);
544 UNREFERENCED_PARAMETER(wParam
);
545 UNREFERENCED_PARAMETER(uMsg
);
550 sizeof(Caption
) / sizeof(TCHAR
));
552 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
553 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
554 psh
.hwndParent
= hwnd
;
555 psh
.hInstance
= hApplet
;
556 psh
.hIcon
= LoadIcon(hApplet
,
557 MAKEINTRESOURCE(IDI_CPLICON
));
558 psh
.pszCaption
= Caption
;
559 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
563 InitPropSheetPage(&psp
[0], IDD_VOLUME
,VolumeDlgProc
);
564 InitPropSheetPage(&psp
[1], IDD_SOUNDS
,SoundsDlgProc
);
565 InitPropSheetPage(&psp
[2], IDD_AUDIO
,AudioDlgProc
);
566 InitPropSheetPage(&psp
[3], IDD_VOICE
,VoiceDlgProc
);
567 InitPropSheetPage(&psp
[4], IDD_HARDWARE
,HardwareDlgProc
);
569 return (LONG
)(PropertySheet(&psh
) != -1);
573 InitPropSheetPage(PROPSHEETPAGE
*psp
,
577 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
578 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
579 psp
->dwFlags
= PSP_DEFAULT
;
580 psp
->hInstance
= hApplet
;
581 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
582 psp
->pfnDlgProc
= DlgProc
;
586 /* Control Panel Callback */
588 CPlApplet(HWND hwndCpl
,
603 CPLINFO
*CPlInfo
= (CPLINFO
*)lParam2
;
604 UINT uAppIndex
= (UINT
)lParam1
;
607 CPlInfo
->idIcon
= Applets
[uAppIndex
].idIcon
;
608 CPlInfo
->idName
= Applets
[uAppIndex
].idName
;
609 CPlInfo
->idInfo
= Applets
[uAppIndex
].idDescription
;
615 UINT uAppIndex
= (UINT
)lParam1
;
616 Applets
[uAppIndex
].AppletProc(hwndCpl
,
629 DllMain(HINSTANCE hinstDLL
,
633 UNREFERENCED_PARAMETER(lpReserved
);
636 case DLL_PROCESS_ATTACH
:
638 DisableThreadLibraryCalls(hinstDLL
);