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>
23 HWPD_STANDARDLIST
= 0,
25 HWPD_MAX
= HWPD_LARGELIST
26 } HWPAGE_DISPLAYMODE
, *PHWPAGE_DISPLAYMODE
;
43 static EVENT_LABEL_ITEM EventLabels
[] =
65 static SYSTEM_SCHEME_ITEM SystemSchemes
[] =
70 IDS_REACTOS_DEFAULT_SCHEME
85 DeviceCreateHardwarePageEx(HWND hWndParent
,
88 HWPAGE_DISPLAYMODE DisplayMode
);
90 #define NUM_APPLETS (1)
93 HINSTANCE hApplet
= 0;
96 const APPLET Applets
[NUM_APPLETS
] =
98 {IDI_CPLICON
, IDS_CPLNAME
, IDS_CPLDESCRIPTION
, MmSysApplet
},
103 DllCanUnloadNow(VOID
)
105 DPRINT1("DllCanUnloadNow() stubs\n");
110 DllGetClassObject(REFCLSID rclsid
,
114 DPRINT1("DllGetClassObject() stubs\n");
120 ShowDriverSettingsAfterForkW(HWND hwnd
,
125 DPRINT1("ShowDriverSettingsAfterForkW() stubs\n");
129 ShowDriverSettingsAfterForkA(HWND hwnd
,
134 DPRINT1("ShowDriverSettingsAfterForkA() stubs\n");
138 ShowDriverSettingsAfterFork(HWND hwnd
,
143 DPRINT1("ShowDriverSettingsAfterFork() stubs\n");
147 ShowMMCPLPropertySheet(HWND hwnd
,
152 DPRINT1("ShowMMCPLPropertySheet() stubs\n");
157 ShowAudioPropertySheet(HWND hwnd
,
162 DPRINT1("ShowAudioPropertySheet() stubs\n");
166 mmseRunOnceW(HWND hwnd
,
171 DPRINT1("mmseRunOnceW() stubs\n");
175 mmseRunOnceA(HWND hwnd
,
180 DPRINT1("mmseRunOnceA() stubs\n");
184 mmseRunOnce(HWND hwnd
,
189 DPRINT1("mmseRunOnce() stubs\n");
193 MediaPropPageProvider(LPVOID Info
,
194 LPFNADDPROPSHEETPAGE PropSheetPage
,
197 DPRINT1("MediaPropPageProvider() stubs\n");
202 ShowFullControlPanel(HWND hwnd
,
207 DPRINT1("ShowFullControlPanel() stubs\n");
211 InstallSystemSoundLabels(HKEY hKey
)
219 if (RegCreateKeyExW(hKey
, EventLabels
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
221 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)EventLabels
[i
].DefaultName
, (wcslen(EventLabels
[i
].DefaultName
)+1) * sizeof(WCHAR
));
222 swprintf(Buffer
, L
"@mmsys.cpl,-%u", EventLabels
[i
].LocalizedResId
);
223 RegSetValueExW(hSubKey
, L
"DispFileName", 0, REG_SZ
, (LPBYTE
)Buffer
, (wcslen(Buffer
)+1) * sizeof(WCHAR
));
225 RegCloseKey(hSubKey
);
228 }while(EventLabels
[i
].LabelName
);
232 InstallSystemSoundSchemeNames(HKEY hKey
)
239 if (RegCreateKeyExW(hKey
, SystemSchemes
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
241 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)SystemSchemes
[i
].DefaultName
, (wcslen(SystemSchemes
[i
].DefaultName
)+1) * sizeof(WCHAR
));
242 RegCloseKey(hSubKey
);
245 }while(SystemSchemes
[i
].LabelName
);
249 InstallDefaultSystemSoundScheme(HKEY hRootKey
)
252 WCHAR Path
[MAX_PATH
];
255 if (RegCreateKeyExW(hRootKey
, L
".Default", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
258 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (LPBYTE
)SystemSchemes
[0].DefaultName
, (wcslen(SystemSchemes
[0].DefaultName
)+1) * sizeof(WCHAR
));
259 swprintf(Path
, L
"@mmsys.cpl,-%u", SystemSchemes
[0].IconId
);
260 RegSetValueExW(hKey
, L
"DispFileName", 0, REG_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
264 if (RegCreateKeyExW(hKey
, EventLabels
[i
].LabelName
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
268 swprintf(Path
, L
"%%SystemRoot%%\\media\\%s", EventLabels
[i
].FileName
);
269 if (RegCreateKeyExW(hSubKey
, L
".Current", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hScheme
, NULL
) == ERROR_SUCCESS
)
271 RegSetValueExW(hScheme
, NULL
, 0, REG_EXPAND_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
272 RegCloseKey(hScheme
);
275 if (RegCreateKeyExW(hSubKey
, L
".Default", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hScheme
, NULL
) == ERROR_SUCCESS
)
277 RegSetValueExW(hScheme
, NULL
, 0, REG_EXPAND_SZ
, (LPBYTE
)Path
, (wcslen(Path
)+1) * sizeof(WCHAR
));
278 RegCloseKey(hScheme
);
280 RegCloseKey(hSubKey
);
283 }while(EventLabels
[i
].LabelName
);
290 InstallSystemSoundScheme()
295 if (RegCreateKeyExW(HKEY_CURRENT_USER
, L
"AppEvents", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
298 if (RegCreateKeyExW(hKey
, L
"EventLabels", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, NULL
) == ERROR_SUCCESS
)
300 InstallSystemSoundLabels(hSubKey
);
301 RegCloseKey(hSubKey
);
304 if (RegCreateKeyExW(hKey
, L
"Schemes", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hSubKey
, &dwDisposition
) == ERROR_SUCCESS
)
308 if (RegCreateKeyExW(hSubKey
, L
"Names", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hNames
, NULL
) == ERROR_SUCCESS
)
310 InstallSystemSoundSchemeNames(hNames
);
314 if (RegCreateKeyExW(hSubKey
, L
"Apps", 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_ALL_ACCESS
, NULL
, &hNames
, NULL
) == ERROR_SUCCESS
)
316 InstallDefaultSystemSoundScheme(hNames
);
318 if (dwDisposition
& REG_CREATED_NEW_KEY
)
321 RegSetValueExW(hSubKey
, NULL
, 0, REG_SZ
, (LPBYTE
)L
".Default", (wcslen(L
".Default")+1) * sizeof(WCHAR
));
325 RegCloseKey(hSubKey
);
333 MMSYS_InstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
337 WCHAR szBuffer
[MAX_PATH
];
341 SC_HANDLE hSCManager
, hService
;
347 if (!IsEqualIID(&pspDevInfoData
->ClassGuid
, &GUID_DEVCLASS_SOUND
) &&
348 !IsEqualIID(&pspDevInfoData
->ClassGuid
, &GUID_DEVCLASS_MEDIA
))
349 return ERROR_DI_DO_DEFAULT
;
351 Length
= GetWindowsDirectoryW(szBuffer
, MAX_PATH
);
352 if (!Length
|| Length
>= MAX_PATH
- 14)
354 return ERROR_GEN_FAILURE
;
357 pBuffer
= PathAddBackslashW(szBuffer
);
360 return ERROR_GEN_FAILURE
;
363 wcscpy(pBuffer
, L
"inf\\audio.inf");
365 hInf
= SetupOpenInfFileW(szBuffer
,
370 if (hInf
== INVALID_HANDLE_VALUE
)
372 return ERROR_GEN_FAILURE
;
375 Context
= SetupInitDefaultQueueCallback(NULL
);
378 SetupCloseInfFile(hInf
);
379 return ERROR_GEN_FAILURE
;
382 Result
= SetupInstallFromInfSectionW(NULL
,
389 SetupDefaultQueueCallbackW
,
396 Result
= SetupInstallServicesFromInfSectionW(hInf
,
397 L
"Audio_Inst.NT.Services",
401 SetupTermDefaultQueueCallback(Context
);
402 SetupCloseInfFile(hInf
);
406 hSCManager
= OpenSCManager(NULL
, NULL
, SC_MANAGER_CONNECT
);
409 return ERROR_DI_DO_DEFAULT
;
412 hService
= OpenService(hSCManager
, L
"RosAudioSrv", SERVICE_ALL_ACCESS
);
415 /* Make RosAudioSrv start automatically */
416 ChangeServiceConfig(hService
, SERVICE_NO_CHANGE
, SERVICE_AUTO_START
, SERVICE_NO_CHANGE
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
);
418 StartService(hService
, 0, NULL
);
419 CloseServiceHandle(hService
);
421 CloseServiceHandle(hSCManager
);
423 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0, GENERIC_READ
| GENERIC_WRITE
, &hKey
) == ERROR_SUCCESS
)
425 szBuffer
[Length
] = '\0';
426 pBuffer
= PathAddBackslashW(szBuffer
);
427 wcscpy(pBuffer
, L
"system32\\wdmaud.drv");
429 for(Index
= 1; Index
<= 4; Index
++)
431 swprintf(WaveName
, L
"wave%u", Index
);
432 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, NULL
, &BufferSize
) != ERROR_MORE_DATA
)
434 /* Store new audio driver entry */
435 RegSetValueExW(hKey
, WaveName
, 0, REG_SZ
, (LPBYTE
)szBuffer
, (wcslen(szBuffer
)+1) * sizeof(WCHAR
));
440 WCHAR Buffer
[MAX_PATH
];
441 BufferSize
= sizeof(Buffer
);
443 if (RegQueryValueExW(hKey
, WaveName
, 0, NULL
, (LPBYTE
)Buffer
, &BufferSize
) == ERROR_SUCCESS
)
445 /* Make sure the buffer is zero terminated */
446 Buffer
[MAX_PATH
-1] = L
'\0';
448 if (!wcsicmp(Buffer
, szBuffer
))
450 /* An entry already exists */
458 InstallSystemSoundScheme();
460 return ERROR_DI_DO_DEFAULT
;
465 MMSYS_RemoveDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
467 return ERROR_DI_DO_DEFAULT
;
471 MMSYS_AllowInstallDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
473 return ERROR_DI_DO_DEFAULT
;
477 MMSYS_SelectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
479 return ERROR_DI_DO_DEFAULT
;
483 MMSYS_DetectDevice(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
485 return ERROR_DI_DO_DEFAULT
;
489 MMSYS_SelectBestCompatDRV(HDEVINFO hDevInfo
, PSP_DEVINFO_DATA pspDevInfoData
)
491 return ERROR_DI_DO_DEFAULT
;
495 MediaClassInstaller(IN DI_FUNCTION diFunction
,
496 IN HDEVINFO hDevInfo
,
497 IN PSP_DEVINFO_DATA pspDevInfoData OPTIONAL
)
501 case DIF_INSTALLDEVICE
:
502 return MMSYS_InstallDevice(hDevInfo
, pspDevInfoData
);
504 return MMSYS_RemoveDevice(hDevInfo
, pspDevInfoData
);
505 case DIF_ALLOW_INSTALL
:
506 return MMSYS_AllowInstallDevice(hDevInfo
, pspDevInfoData
);
507 case DIF_SELECTDEVICE
:
508 return MMSYS_SelectDevice(hDevInfo
, pspDevInfoData
);
510 return MMSYS_DetectDevice(hDevInfo
, pspDevInfoData
);
511 case DIF_SELECTBESTCOMPATDRV
:
512 return MMSYS_SelectBestCompatDRV(hDevInfo
, pspDevInfoData
);
514 return ERROR_DI_DO_DEFAULT
;
519 /* Hardware property page dialog callback */
520 static INT_PTR CALLBACK
521 HardwareDlgProc(HWND hwndDlg
,
526 UNREFERENCED_PARAMETER(lParam
);
527 UNREFERENCED_PARAMETER(wParam
);
533 Guids
[0] = GUID_DEVCLASS_CDROM
;
534 Guids
[1] = GUID_DEVCLASS_MEDIA
;
536 /* Create the hardware page */
537 DeviceCreateHardwarePageEx(hwndDlg
,
539 sizeof(Guids
) / sizeof(Guids
[0]),
549 MmSysApplet(HWND hwnd
,
554 PROPSHEETPAGE psp
[5];
555 PROPSHEETHEADER psh
; // = { 0 };
558 UNREFERENCED_PARAMETER(lParam
);
559 UNREFERENCED_PARAMETER(wParam
);
560 UNREFERENCED_PARAMETER(uMsg
);
565 sizeof(Caption
) / sizeof(TCHAR
));
567 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
568 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
569 psh
.hwndParent
= hwnd
;
570 psh
.hInstance
= hApplet
;
571 psh
.hIcon
= LoadIcon(hApplet
,
572 MAKEINTRESOURCE(IDI_CPLICON
));
573 psh
.pszCaption
= Caption
;
574 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
578 InitPropSheetPage(&psp
[0], IDD_VOLUME
,VolumeDlgProc
);
579 InitPropSheetPage(&psp
[1], IDD_SOUNDS
,SoundsDlgProc
);
580 InitPropSheetPage(&psp
[2], IDD_AUDIO
,AudioDlgProc
);
581 InitPropSheetPage(&psp
[3], IDD_VOICE
,VoiceDlgProc
);
582 InitPropSheetPage(&psp
[4], IDD_HARDWARE
,HardwareDlgProc
);
584 return (LONG
)(PropertySheet(&psh
) != -1);
588 InitPropSheetPage(PROPSHEETPAGE
*psp
,
592 ZeroMemory(psp
, sizeof(PROPSHEETPAGE
));
593 psp
->dwSize
= sizeof(PROPSHEETPAGE
);
594 psp
->dwFlags
= PSP_DEFAULT
;
595 psp
->hInstance
= hApplet
;
596 psp
->pszTemplate
= MAKEINTRESOURCE(idDlg
);
597 psp
->pfnDlgProc
= DlgProc
;
601 /* Control Panel Callback */
603 CPlApplet(HWND hwndCpl
,
618 CPLINFO
*CPlInfo
= (CPLINFO
*)lParam2
;
619 UINT uAppIndex
= (UINT
)lParam1
;
622 CPlInfo
->idIcon
= Applets
[uAppIndex
].idIcon
;
623 CPlInfo
->idName
= Applets
[uAppIndex
].idName
;
624 CPlInfo
->idInfo
= Applets
[uAppIndex
].idDescription
;
630 UINT uAppIndex
= (UINT
)lParam1
;
631 Applets
[uAppIndex
].AppletProc(hwndCpl
,
644 DllMain(HINSTANCE hinstDLL
,
648 UNREFERENCED_PARAMETER(lpReserved
);
651 case DLL_PROCESS_ATTACH
:
653 DisableThreadLibraryCalls(hinstDLL
);