2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/port_wavertstream.c
5 * PURPOSE: WaveRTStream helper object
6 * PROGRAMMER: Johannes Anderwald
13 IPortWaveRTStreamInitVtbl
*lpVtbl
;
16 }IPortWaveRTStreamImpl
;
24 IPortWaveRTStreamInit_fnQueryInterface(
25 IPortWaveRTStreamInit
* iface
,
29 IPortWaveRTStreamImpl
* This
= (IPortWaveRTStreamImpl
*)iface
;
31 DPRINT("IPortWaveRTStream_fnQueryInterface entered\n");
33 if (IsEqualGUIDAligned(refiid
, &IID_IPortWaveRTStream
) ||
34 IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
36 *Output
= &This
->lpVtbl
;
37 InterlockedIncrement(&This
->ref
);
38 return STATUS_SUCCESS
;
40 return STATUS_UNSUCCESSFUL
;
49 IPortWaveRTStreamInit_fnAddRef(
50 IPortWaveRTStreamInit
* iface
)
52 IPortWaveRTStreamImpl
* This
= (IPortWaveRTStreamImpl
*)iface
;
53 DPRINT("IPortWaveRTStream_fnAddRef entered\n");
55 return InterlockedIncrement(&This
->ref
);
64 IPortWaveRTStreamInit_fnRelease(
65 IPortWaveRTStreamInit
* iface
)
67 IPortWaveRTStreamImpl
* This
= (IPortWaveRTStreamImpl
*)iface
;
69 InterlockedDecrement(&This
->ref
);
71 DPRINT("IPortWaveRTStream_fnRelease entered %u\n", This
->ref
);
75 FreeItem(This
, TAG_PORTCLASS
);
78 /* Return new reference count */
88 IPortWaveRTStreamInit_fnAllocatePagesForMdl(
89 IN IPortWaveRTStreamInit
* iface
,
90 IN PHYSICAL_ADDRESS HighAddress
,
93 return MmAllocatePagesForMdl(RtlConvertUlongToLargeInteger(0), HighAddress
, RtlConvertUlongToLargeInteger(0), TotalBytes
);
102 IPortWaveRTStreamInit_fnAllocateContiguousPagesForMdl(
103 IN IPortWaveRTStreamInit
* iface
,
104 IN PHYSICAL_ADDRESS LowAddress
,
105 IN PHYSICAL_ADDRESS HighAddress
,
106 IN SIZE_T TotalBytes
)
110 PHYSICAL_ADDRESS Address
;
112 Buffer
= MmAllocateContiguousMemorySpecifyCache(TotalBytes
, LowAddress
, HighAddress
, RtlConvertUlongToLargeInteger(0), MmNonCached
);
115 DPRINT1("MmAllocateContiguousMemorySpecifyCache failed\n");
119 Address
= MmGetPhysicalAddress(Buffer
);
121 MmFreeContiguousMemorySpecifyCache(Buffer
, TotalBytes
, MmNonCached
);
123 Mdl
= MmAllocatePagesForMdl(Address
, HighAddress
, RtlConvertUlongToLargeInteger(0), TotalBytes
);
126 DPRINT1("MmAllocatePagesForMdl failed\n");
130 if (MmGetMdlByteCount(Mdl
) < TotalBytes
)
132 DPRINT1("ByteCount %u Required %u\n", MmGetMdlByteCount(Mdl
), TotalBytes
);
133 MmFreePagesFromMdl(Mdl
);
138 DPRINT("Result %p\n", Mdl
);
148 IPortWaveRTStreamInit_fnMapAllocatedPages(
149 IN IPortWaveRTStreamInit
* iface
,
150 IN PMDL MemoryDescriptorList
,
151 IN MEMORY_CACHING_TYPE CacheType
)
153 return MmMapLockedPagesSpecifyCache(MemoryDescriptorList
, KernelMode
, CacheType
, NULL
, 0, NormalPagePriority
);
162 IPortWaveRTStreamInit_fnUnmapAllocatedPages(
163 IN IPortWaveRTStreamInit
* iface
,
164 IN PVOID BaseAddress
,
165 IN PMDL MemoryDescriptorList
)
167 MmUnmapLockedPages(BaseAddress
, MemoryDescriptorList
);
176 IPortWaveRTStreamInit_fnFreePagesFromMdl(
177 IN IPortWaveRTStreamInit
* iface
,
178 IN PMDL MemoryDescriptorList
)
180 MmFreePagesFromMdl(MemoryDescriptorList
);
181 ExFreePool(MemoryDescriptorList
);
190 IPortWaveRTStreamInit_fnGetPhysicalPagesCount(
191 IN IPortWaveRTStreamInit
* iface
,
192 IN PMDL MemoryDescriptorList
)
194 return ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList
));
203 IPortWaveRTStreamInit_fnGetPhysicalPageAddress(
204 IN IPortWaveRTStreamInit
* iface
,
205 IN PPHYSICAL_ADDRESS Address
,
206 IN PMDL MemoryDescriptorList
,
211 PHYSICAL_ADDRESS Result
, Addr
;
213 Pages
= ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList
));
216 DPRINT1("OutOfBounds: Pages %u Index %u\n", Pages
, Index
);
217 return RtlConvertUlongToLargeInteger(0);
220 Buffer
= UlongToPtr(PtrToUlong(MmGetSystemAddressForMdl(MemoryDescriptorList
)) + Index
* PAGE_SIZE
);
222 Addr
= MmGetPhysicalAddress(Buffer
);
223 Address
->QuadPart
= Addr
.QuadPart
;
224 Result
.QuadPart
= (PtrToUlong(Address
));
229 static IPortWaveRTStreamInitVtbl vt_PortWaveRTStream
=
231 IPortWaveRTStreamInit_fnQueryInterface
,
232 IPortWaveRTStreamInit_fnAddRef
,
233 IPortWaveRTStreamInit_fnRelease
,
234 IPortWaveRTStreamInit_fnAllocatePagesForMdl
,
235 IPortWaveRTStreamInit_fnAllocateContiguousPagesForMdl
,
236 IPortWaveRTStreamInit_fnMapAllocatedPages
,
237 IPortWaveRTStreamInit_fnUnmapAllocatedPages
,
238 IPortWaveRTStreamInit_fnFreePagesFromMdl
,
239 IPortWaveRTStreamInit_fnGetPhysicalPagesCount
,
240 IPortWaveRTStreamInit_fnGetPhysicalPageAddress
245 PPORTWAVERTSTREAM
*OutStream
)
247 IPortWaveRTStreamImpl
* This
= AllocateItem(NonPagedPool
, sizeof(IPortWaveRTStreamImpl
), TAG_PORTCLASS
);
249 return STATUS_INSUFFICIENT_RESOURCES
;
252 This
->lpVtbl
= &vt_PortWaveRTStream
;
254 *OutStream
= (PPORTWAVERTSTREAM
)&This
->lpVtbl
;
255 return STATUS_SUCCESS
;