Author: janderwald Date: Tue Aug 11 12:37:40 2009 New Revision: 42611
URL: http://svn.reactos.org/svn/reactos?rev=42611&view=rev Log: - Check if allocation succeeded - Wait untill each audio service has been started - May now fix randomly playing logon sound
Modified: trunk/reactos/base/services/audiosrv/pnp.c trunk/reactos/base/services/audiosrv/services.c
Modified: trunk/reactos/base/services/audiosrv/pnp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/audiosrv/pnp.... ============================================================================== --- trunk/reactos/base/services/audiosrv/pnp.c [iso-8859-1] (original) +++ trunk/reactos/base/services/audiosrv/pnp.c [iso-8859-1] Tue Aug 11 12:37:40 2009 @@ -60,6 +60,12 @@ (PSP_DEVICE_INTERFACE_DETAIL_DATA_W)HeapAlloc(GetProcessHeap(), 0, length); + + if ( ! detail_data ) + { + logmsg("ProcessExistingDevices() failed to allocate detail_data\n"); + return TRUE; + }
while ( SetupDiEnumDeviceInterfaces(dev_info,
Modified: trunk/reactos/base/services/audiosrv/services.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/services/audiosrv/serv... ============================================================================== --- trunk/reactos/base/services/audiosrv/services.c [iso-8859-1] (original) +++ trunk/reactos/base/services/audiosrv/services.c [iso-8859-1] Tue Aug 11 12:37:40 2009 @@ -17,51 +17,86 @@ #include <audiosrv/audiosrv.h> #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;