3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Audio Service
5 * COPYRIGHT: Copyright 2007 Andrew Greenwood
13 SERVICE_STATUS_HANDLE service_status_handle
;
14 SERVICE_STATUS service_status
;
17 /* This is for testing only! */
19 InitializeFakeDevice(VOID
)
21 PnP_AudioDevice
* list_node
;
23 list_node
= CreateDeviceDescriptor(L
"ThisDeviceDoesNotReallyExist", TRUE
);
24 AppendAudioDeviceToList(list_node
);
25 DestroyDeviceDescriptor(list_node
);
29 ServiceControlHandler(
37 case SERVICE_CONTROL_INTERROGATE
:
39 DPRINT("* Interrogation\n");
43 case SERVICE_CONTROL_STOP
:
44 case SERVICE_CONTROL_SHUTDOWN
:
46 DPRINT("* Service Stop/Shutdown request received\n");
48 DPRINT("Unregistering device notifications\n");
49 UnregisterDeviceNotifications();
51 DPRINT("Destroying audio device list\n");
52 DestroyAudioDeviceList();
54 service_status
.dwCurrentState
= SERVICE_STOP_PENDING
;
55 SetServiceStatus(service_status_handle
, &service_status
);
57 service_status
.dwWin32ExitCode
= 0;
58 service_status
.dwCurrentState
= SERVICE_STOPPED
;
60 SetServiceStatus(service_status_handle
, &service_status
);
62 DPRINT("* Service stopped\n");
67 case SERVICE_CONTROL_DEVICEEVENT
:
69 DPRINT("* Device Event\n");
70 return HandleDeviceEvent(dwEventType
, lpEventData
);
74 return ERROR_CALL_NOT_IMPLEMENTED
;
77 /*SetServiceStatus(service_status_handle, &service_status);*/
81 ServiceMain(DWORD argc
, LPWSTR argv
)
83 DPRINT("* Service starting\n");
84 DPRINT("Registering service control handler\n");
85 service_status_handle
= RegisterServiceCtrlHandlerExW(SERVICE_NAME
,
86 ServiceControlHandler
,
89 DPRINT("Service status handle %d\n", service_status_handle
);
90 if (!service_status_handle
)
92 DPRINT("Failed to register service control handler\n");
93 /* FIXME - we should fail */
96 /* Set these to defaults */
97 service_status
.dwServiceType
= SERVICE_WIN32_OWN_PROCESS
;
98 service_status
.dwServiceSpecificExitCode
= 0;
99 service_status
.dwWin32ExitCode
= NO_ERROR
;
100 service_status
.dwWaitHint
= 0;
101 service_status
.dwControlsAccepted
= 0;
102 service_status
.dwCheckPoint
= 0;
104 /* Tell SCM we're starting */
105 service_status
.dwCurrentState
= SERVICE_START_PENDING
;
106 SetServiceStatus(service_status_handle
, &service_status
);
108 DPRINT("Creating audio device list\n");
109 /* This creates the audio device list and mutex */
110 if (!CreateAudioDeviceList(AUDIO_LIST_MAX_SIZE
))
112 DPRINT("Failed to create audio device list\n");
113 service_status
.dwCurrentState
= SERVICE_STOPPED
;
114 service_status
.dwWin32ExitCode
= -1;
115 SetServiceStatus(service_status_handle
, &service_status
);
119 DPRINT("Registering for device notifications\n");
120 /* We want to know when devices are added/removed */
121 if (!RegisterForDeviceNotifications())
123 /* FIXME: This is not fatal at present as ROS does not support this */
124 DPRINT("Failed to register for device notifications\n");
126 DestroyAudioDeviceList();
128 service_status.dwCurrentState = SERVICE_STOPPED;
129 service_status.dwWin32ExitCode = -1;
130 SetServiceStatus(service_status_handle, &service_status);
134 /* start system audio services */
135 StartSystemAudioServices();
137 InitializeFakeDevice();
139 DPRINT("Processing existing devices\n");
140 /* Now find any devices that already exist on the system */
141 if (!ProcessExistingDevices())
143 DPRINT("Could not process existing devices\n");
144 UnregisterDeviceNotifications();
145 DestroyAudioDeviceList();
147 service_status
.dwCurrentState
= SERVICE_STOPPED
;
148 service_status
.dwWin32ExitCode
= -1;
149 SetServiceStatus(service_status_handle
, &service_status
);
153 DPRINT("* Service started\n");
154 /* Tell SCM we are now running, and we may be stopped */
155 service_status
.dwCurrentState
= SERVICE_RUNNING
;
156 service_status
.dwControlsAccepted
= SERVICE_ACCEPT_STOP
;
157 SetServiceStatus(service_status_handle
, &service_status
);
162 SERVICE_TABLE_ENTRYW service_table
[] =
164 { SERVICE_NAME
, (LPSERVICE_MAIN_FUNCTIONW
) ServiceMain
},
168 DPRINT("Audio Service main()\n");
169 if (!StartServiceCtrlDispatcherW(service_table
))
170 DPRINT("StartServiceCtrlDispatcher failed\n");