Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenentry.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/wdm/audio/legacy/wdmaud/main.c 00005 * PURPOSE: System Audio graph builder 00006 * PROGRAMMER: Andrew Greenwood 00007 * Johannes Anderwald 00008 */ 00009 #include "wdmaud.h" 00010 00011 const GUID KSCATEGORY_SYSAUDIO = {0xA7C7A5B1L, 0x5AF3, 0x11D1, {0x9C, 0xED, 0x00, 0xA0, 0x24, 0xBF, 0x04, 0x07}}; 00012 const GUID KSCATEGORY_WDMAUD = {0x3E227E76L, 0x690D, 0x11D2, {0x81, 0x61, 0x00, 0x00, 0xF8, 0x77, 0x5B, 0xF1}}; 00013 00014 NTSTATUS 00015 NTAPI 00016 WdmAudInstallDevice( 00017 IN PDRIVER_OBJECT DriverObject) 00018 { 00019 UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\wdmaud"); 00020 UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\DosDevices\\wdmaud"); 00021 PDEVICE_OBJECT DeviceObject; 00022 NTSTATUS Status; 00023 PWDMAUD_DEVICE_EXTENSION DeviceExtension; 00024 00025 DPRINT("WdmAudInstallDevice called\n"); 00026 00027 Status = IoCreateDevice(DriverObject, 00028 sizeof(WDMAUD_DEVICE_EXTENSION), 00029 &DeviceName, 00030 FILE_DEVICE_KS, 00031 0, 00032 FALSE, 00033 &DeviceObject); 00034 00035 if (!NT_SUCCESS(Status)) 00036 { 00037 DPRINT1("IoCreateDevice failed with %x\n", Status); 00038 return Status; 00039 } 00040 00041 /* clear device extension */ 00042 DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 00043 RtlZeroMemory(DeviceExtension, sizeof(WDMAUD_DEVICE_EXTENSION)); 00044 00045 /* register device interfaces */ 00046 Status = WdmAudRegisterDeviceInterface(DeviceObject, DeviceExtension); 00047 if (!NT_SUCCESS(Status)) 00048 { 00049 DPRINT1("WdmRegisterDeviceInterface failed with %x\n", Status); 00050 IoDeleteDevice(DeviceObject); 00051 return Status; 00052 } 00053 00054 /* initialize sysaudio device list */ 00055 InitializeListHead(&DeviceExtension->SysAudioDeviceList); 00056 00057 /* initialize client context device list */ 00058 InitializeListHead(&DeviceExtension->WdmAudClientList); 00059 00060 /* initialize spinlock */ 00061 KeInitializeSpinLock(&DeviceExtension->Lock); 00062 00063 /* find available sysaudio devices */ 00064 Status = WdmAudOpenSysAudioDevices(DeviceObject, DeviceExtension); 00065 if (!NT_SUCCESS(Status)) 00066 { 00067 DPRINT1("WdmAudOpenSysAudioDevices failed with %x\n", Status); 00068 IoDeleteSymbolicLink(&SymlinkName); 00069 IoDeleteDevice(DeviceObject); 00070 return Status; 00071 } 00072 /* allocate ks device header */ 00073 Status = KsAllocateDeviceHeader(&DeviceExtension->DeviceHeader, 0, NULL); 00074 if (!NT_SUCCESS(Status)) 00075 { 00076 DPRINT1("KsAllocateDeviceHeader failed with %x\n", Status); 00077 IoDeleteSymbolicLink(&SymlinkName); 00078 IoDeleteDevice(DeviceObject); 00079 return Status; 00080 } 00081 00082 Status = WdmAudMixerInitialize(DeviceObject); 00083 DPRINT("WdmAudMixerInitialize Status %x WaveIn %lu WaveOut %lu Mixer %lu\n", Status, WdmAudGetWaveInDeviceCount(), WdmAudGetWaveOutDeviceCount(), WdmAudGetMixerDeviceCount()); 00084 00085 DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; 00086 DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING; 00087 00088 return STATUS_SUCCESS; 00089 } 00090 00091 VOID 00092 NTAPI 00093 WdmAudUnload( 00094 IN PDRIVER_OBJECT driver) 00095 { 00096 DPRINT("WdmAudUnload called\n"); 00097 } 00098 00099 NTSTATUS 00100 NTAPI 00101 WdmAudPnp( 00102 IN PDEVICE_OBJECT DeviceObject, 00103 IN PIRP Irp) 00104 { 00105 PIO_STACK_LOCATION IrpStack; 00106 00107 DPRINT("WdmAudPnp called\n"); 00108 00109 IrpStack = IoGetCurrentIrpStackLocation(Irp); 00110 00111 if (IrpStack->MinorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE) 00112 { 00113 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE; 00114 return KsDefaultDispatchPnp(DeviceObject, Irp); 00115 } 00116 return KsDefaultDispatchPnp(DeviceObject, Irp); 00117 } 00118 00119 00120 NTSTATUS 00121 NTAPI 00122 WdmAudCreate( 00123 IN PDEVICE_OBJECT DeviceObject, 00124 IN PIRP Irp) 00125 { 00126 NTSTATUS Status; 00127 PIO_STACK_LOCATION IoStack; 00128 PWDMAUD_CLIENT pClient; 00129 //PWDMAUD_DEVICE_EXTENSION DeviceExtension; 00130 00131 /* get device extension */ 00132 //DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 00133 00134 #if KS_IMPLEMENTED 00135 Status = KsReferenceSoftwareBusObject((KSDEVICE_HEADER)DeviceObject->DeviceExtension); 00136 if (!NT_SUCCESS(Status)) 00137 { 00138 DPRINT1("KsReferenceSoftwareBusObject failed with %x\n", Status); 00139 return Status; 00140 } 00141 #endif 00142 00143 Status = WdmAudOpenSysaudio(DeviceObject, &pClient); 00144 if (!NT_SUCCESS(Status)) 00145 { 00146 DPRINT1("Failed to open sysaudio!\n"); 00147 00148 /* complete and forget */ 00149 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; 00150 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00151 /* done */ 00152 return STATUS_UNSUCCESSFUL; 00153 } 00154 00155 IoStack = IoGetCurrentIrpStackLocation(Irp); 00156 ASSERT(IoStack->FileObject); 00157 00158 /* store client context in file object */ 00159 IoStack->FileObject->FsContext = pClient; 00160 Status = STATUS_SUCCESS; 00161 00162 Irp->IoStatus.Status = Status; 00163 Irp->IoStatus.Information = 0; 00164 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00165 00166 return Status; 00167 } 00168 00169 NTSTATUS 00170 NTAPI 00171 WdmAudClose( 00172 IN PDEVICE_OBJECT DeviceObject, 00173 IN PIRP Irp) 00174 { 00175 /* nothing to do complete request */ 00176 #if KS_IMPLEMENTED 00177 Status = KsDereferenceSoftwareBusObject(DeviceExtension->DeviceHeader); 00178 00179 if (NT_SUCCESS(Status)) 00180 { 00181 if (DeviceExtension->SysAudioNotification) 00182 Status = IoUnregisterPlugPlayNotification(DeviceExtension->SysAudioNotification); 00183 } 00184 #endif 00185 00186 Irp->IoStatus.Status = STATUS_SUCCESS; 00187 Irp->IoStatus.Information = 0; 00188 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00189 00190 /* done */ 00191 return STATUS_SUCCESS; 00192 } 00193 00194 NTSTATUS 00195 NTAPI 00196 WdmAudCleanup( 00197 IN PDEVICE_OBJECT DeviceObject, 00198 IN PIRP Irp) 00199 { 00200 PIO_STACK_LOCATION IoStack; 00201 PWDMAUD_CLIENT pClient; 00202 PWDMAUD_DEVICE_EXTENSION DeviceExtension; 00203 ULONG Index; 00204 KIRQL OldIrql; 00205 00206 /* get device extension */ 00207 DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; 00208 00209 /* get current irp stack location */ 00210 IoStack = IoGetCurrentIrpStackLocation(Irp); 00211 00212 /* sanity check */ 00213 ASSERT(IoStack->FileObject); 00214 00215 /* get client context struct */ 00216 pClient = (PWDMAUD_CLIENT)IoStack->FileObject->FsContext; 00217 00218 /* sanity check */ 00219 ASSERT(pClient); 00220 00221 /* acquire client context list lock */ 00222 KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); 00223 00224 /* remove entry */ 00225 RemoveEntryList(&pClient->Entry); 00226 00227 /* release lock */ 00228 KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); 00229 00230 /* check if all audio pins have been closed */ 00231 for (Index = 0; Index < pClient->NumPins; Index++) 00232 { 00233 DPRINT("Index %u Pin %p Type %x\n", Index, pClient->hPins[Index].Handle, pClient->hPins[Index].Type); 00234 if (pClient->hPins[Index].Handle && pClient->hPins[Index].Type != MIXER_DEVICE_TYPE) 00235 { 00236 /* found an still open audio pin */ 00237 ZwClose(pClient->hPins[Index].Handle); 00238 } 00239 } 00240 00241 /* free pin array */ 00242 if (pClient->hPins) 00243 FreeItem(pClient->hPins); 00244 00245 /* free client context struct */ 00246 FreeItem(pClient); 00247 00248 /* clear old client pointer */ 00249 IoStack->FileObject->FsContext = NULL; 00250 00251 /* complete request */ 00252 Irp->IoStatus.Status = STATUS_SUCCESS; 00253 Irp->IoStatus.Information = 0; 00254 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00255 00256 /* done */ 00257 return STATUS_SUCCESS; 00258 } 00259 00260 NTSTATUS 00261 NTAPI 00262 DriverEntry( 00263 IN PDRIVER_OBJECT Driver, 00264 IN PUNICODE_STRING Registry_path 00265 ) 00266 { 00267 DPRINT("Wdmaud.sys loaded\n"); 00268 00269 Driver->DriverUnload = WdmAudUnload; 00270 00271 Driver->MajorFunction[IRP_MJ_CREATE] = WdmAudCreate; 00272 Driver->MajorFunction[IRP_MJ_CLOSE] = WdmAudClose; 00273 Driver->MajorFunction[IRP_MJ_PNP] = WdmAudPnp; 00274 Driver->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp; 00275 Driver->MajorFunction[IRP_MJ_CLEANUP] = WdmAudCleanup; 00276 Driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = WdmAudDeviceControl; 00277 Driver->MajorFunction[IRP_MJ_WRITE] = WdmAudReadWrite; 00278 Driver->MajorFunction[IRP_MJ_READ] = WdmAudReadWrite; 00279 Driver->MajorFunction[IRP_MJ_POWER] = KsDefaultDispatchPower; 00280 00281 return WdmAudInstallDevice(Driver); 00282 } Generated on Sun May 27 2012 04:24:41 for ReactOS by
1.7.6.1
|