mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.2 KiB
113 lines
2.2 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
position.c
|
|
|
|
Abstract:
|
|
|
|
This module contains code for returning position information
|
|
|
|
Author:
|
|
|
|
Nigel Thompson (nigelt) 7-March-1991
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
Updated by Robin Speed (RobinSp) 10-Jan-1992 for new design
|
|
|
|
Sameer Dekate ([email protected]) 19-Aug-1992
|
|
-Changes to support the MIPS sound board
|
|
|
|
--*/
|
|
|
|
#include "sound.h"
|
|
|
|
|
|
NTSTATUS
|
|
sndIoctlGetPosition(
|
|
IN PLOCAL_DEVICE_INFO pLDI,
|
|
IN PIRP pIrp,
|
|
IN PIO_STACK_LOCATION IrpStack
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
IOCTL get wave position
|
|
|
|
Arguments:
|
|
|
|
pLDI - Local device data
|
|
pIrp - IO request packet
|
|
IrpStack - current Irp stack location
|
|
|
|
Return Value:
|
|
|
|
Irp status
|
|
|
|
--*/
|
|
{
|
|
PWAVE_DD_POSITION pPosition;
|
|
NTSTATUS status = STATUS_SUCCESS;
|
|
|
|
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength <
|
|
sizeof(WAVE_DD_POSITION)) {
|
|
dprintf1("Supplied buffer to small for requested data");
|
|
return STATUS_BUFFER_TOO_SMALL;
|
|
}
|
|
|
|
//
|
|
// say how much we're sending back
|
|
//
|
|
|
|
pIrp->IoStatus.Information = sizeof(WAVE_DD_POSITION);
|
|
|
|
//
|
|
// cast the buffer address to the pointer type we want
|
|
//
|
|
|
|
pPosition = (PWAVE_DD_POSITION)pIrp->AssociatedIrp.SystemBuffer;
|
|
|
|
//
|
|
// For wave out don't include bytes in the buffer about to be sent
|
|
//
|
|
|
|
if (pLDI->DeviceType == WAVE_OUT) {
|
|
pPosition->ByteCount =
|
|
pLDI->SampleNumber -
|
|
pLDI->pGlobalInfo->DMABuffer[
|
|
UpperHalf + LowerHalf - pLDI->pGlobalInfo->NextHalf].nBytes;
|
|
} else {
|
|
pPosition->ByteCount = pLDI->SampleNumber;
|
|
}
|
|
|
|
//
|
|
// Currently we only support 1 byte per sample
|
|
//
|
|
|
|
if (pLDI->pGlobalInfo->BytesPerSample > 1) {
|
|
pPosition->SampleCount =
|
|
pPosition->ByteCount / pLDI->pGlobalInfo->BytesPerSample;
|
|
} else {
|
|
pPosition->SampleCount = pPosition->ByteCount;
|
|
}
|
|
|
|
//
|
|
// If we are in stereo mode then adjust sample count for that
|
|
//
|
|
|
|
if (pLDI->pGlobalInfo->Channels > 1) {
|
|
pPosition->SampleCount =
|
|
pPosition->SampleCount / pLDI->pGlobalInfo->Channels;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|