diff --git a/reactos/base/services/audiosrv/pnp.c b/reactos/base/services/audiosrv/pnp.c index f087058d7d0..af1c4fce219 100644 --- a/reactos/base/services/audiosrv/pnp.c +++ b/reactos/base/services/audiosrv/pnp.c @@ -61,6 +61,12 @@ ProcessExistingDevices() 0, length); + if ( ! detail_data ) + { + logmsg("ProcessExistingDevices() failed to allocate detail_data\n"); + return TRUE; + } + while ( SetupDiEnumDeviceInterfaces(dev_info, NULL, diff --git a/reactos/base/services/audiosrv/services.c b/reactos/base/services/audiosrv/services.c index 233828a16b9..34dd2e285b9 100644 --- a/reactos/base/services/audiosrv/services.c +++ b/reactos/base/services/audiosrv/services.c @@ -17,51 +17,86 @@ #include #include "audiosrv.h" +BOOL +WaitForService( + SC_HANDLE hService, + ULONG RetryCount) +{ + ULONG Index = 0; + DWORD dwSize; + SERVICE_STATUS_PROCESS Info; + + do + { + if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize)) + { + logmsg("QueryServiceStatusEx failed %x\n", GetLastError()); + break; + } + + if (Info.dwCurrentState == SERVICE_RUNNING) + return TRUE; + + Sleep(1000); + + }while(Index++ < RetryCount); + + logmsg("Timeout while waiting for service to become ready %p\n", hService); + + return FALSE; +} + +BOOL +StartAudioService( + SC_HANDLE hSCManager, + LPWSTR ServiceName, + ULONG RetryCount) +{ + SC_HANDLE hService; + BOOL ret; + + hService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS); + + if (!hService) + { + logmsg("Failed to open service %S %x\n", ServiceName, GetLastError()); + return FALSE; + } + + if (!StartService(hService, 0, NULL)) + { + logmsg("Failed to start service %S %x\n", ServiceName, GetLastError()); + CloseServiceHandle(hService); + return FALSE; + } + + ret = WaitForService(hService, RetryCount); + + CloseServiceHandle(hService); + return ret; +} + + + BOOL StartSystemAudioServices() { - SC_HANDLE hSCManager, hService; + SC_HANDLE hSCManager; logmsg("Starting system audio services\n"); hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (!hSCManager) { - logmsg("Failed to open service manager\n"); + logmsg("Failed to open service manager %x\n", GetLastError()); return FALSE; } - hService = OpenService(hSCManager, L"sysaudio", SERVICE_ALL_ACCESS); - if (hService) - { - if (!StartService(hService, 0, NULL)) - { - logmsg("Failed to start sysaudio service\n"); - CloseServiceHandle(hService); - CloseServiceHandle(hSCManager); - return FALSE; - } - CloseServiceHandle(hService); - logmsg("Sysaudio service started\n"); - // FIXME - // wait untill service is started - } - - hService = OpenService(hSCManager, L"wdmaud", SERVICE_ALL_ACCESS); - if (hService) - { - if (!StartService(hService, 0, NULL)) - { - logmsg("Failed to start sysaudio service\n"); - CloseServiceHandle(hService); - CloseServiceHandle(hSCManager); - return FALSE; - } - CloseServiceHandle(hService); - logmsg("Wdmaud service started\n"); - } - + logmsg("Starting sysaudio service\n"); + StartAudioService(hSCManager, L"sysaudio", 20); + logmsg("Starting wdmaud service\n"); + StartAudioService(hSCManager, L"wdmaud", 20); CloseServiceHandle(hSCManager); return TRUE;