📄 wavemain.cpp
字号:
//-----------------------------------------------------------------------------
// Copyright (c) Wolfson Microelectronics plc. All rights reserved.
//
// This software as well as any related documentation is furnished under
// license and may only be used or copied in accordance with the terms of the
// license. The information in this file is furnished for informational use
// only, is subject to change without notice, and should not be construed as
// a commitment by Wolfson Microelectronics plc. Wolfson Microelectronics plc
// assumes no responsibility or liability for any errors or inaccuracies that
// may appear in this document or any software that may be provided in
// association with this document.
//
// Except as permitted by such license, no part of this document may be
// reproduced, stored in a retrieval system, or transmitted in any form or by
// any means without the express written consent of Wolfson Microelectronics plc.
//
// $Id: wavemain.cpp 3178 2006-05-02 10:24:00Z ian $
//
// This file contains the main entry points for the WaveDev2 driver for
// Wolfson codecs.
//
// Warning:
// This driver is specifically written for Wolfson Audio Codecs. It is
// not a general audio CODEC device driver.
//-----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
// -----------------------------------------------------------------------------
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// -----------------------------------------------------------------------------
//
// Include files
//
#include "wavemain.h"
//
// Global definitions
//
#ifdef DEBUG
DBGPARAM dpCurSettings =
{
TEXT("WaveDriver"),
{
TEXT("Test"), // 0
TEXT("Params"), // 1
TEXT("Verbose"), // 2
TEXT("Interrupt"), // 3
TEXT("WODM"), // 4
TEXT("WIDM"), // 5
TEXT("DMA"), // 6
TEXT("Streaming"), // 7
TEXT("Regs"), // 8
TEXT("Misc"), // 9
TEXT("Init"), // 10
TEXT("IOcontrol"), // 11
TEXT("Alloc"), // 12
TEXT("Function"), // 13
TEXT("Warning"), // 14
TEXT("Error"), // 15
},
(1 << 15) // Errors
| (1 << 14) // Warnings
};
#endif
//
// Class data
//
//
// Function prototypes
//
//-----------------------------------------------------------------------------
// Function: DllMain
//
// This is the main entry point for the WaveDev2 DLL. It handles being loaded
// and unloaded.
//
// Parameters:
// hDLL instance handle
// dwReason reason this has been called - one of DLL_PROCESS_ATTACH,
// DLL_THREAD_ATTACH, DLL_THREAD_DETACH or DLL_PROCESS_DETACH
// lpvReserved unused
//
// Returns: BOOL
// TRUE = success
// FALSE = failure
//-----------------------------------------------------------------------------
BOOL CALLBACK DllMain(HANDLE hDLL,
DWORD dwReason,
LPVOID lpvReserved)
{
if ( dwReason==DLL_PROCESS_ATTACH )
{
DEBUGREGISTER((HMODULE)hDLL);
}
return TRUE;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @topic WAV Device Interface | Implements the WAVEDEV.DLL device
// interface. These functions are required for the device to
// be loaded by DEVICE.EXE.
//
// @xref <nl>
// <f WAV_Init>, <nl>
// <f WAV_Deinit>, <nl>
// <f WAV_Open>, <nl>
// <f WAV_Close>, <nl>
// <f WAV_Read>, <nl>
// <f WAV_Write>, <nl>
// <f WAV_Seek>, <nl>
// <f WAV_PowerUp>, <nl>
// <f WAV_PowerDown>, <nl>
// <f WAV_IOControl> <nl>
//
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @topic Designing a Waveform Audio Driver |
// A waveform audio driver is responsible for processing messages
// from the Wave API Manager (WAVEAPI.DLL) to playback and record
// waveform audio. Waveform audio drivers are implemented as
// dynamic link libraries that are loaded by DEVICE.EXE The
// default waveform audio driver is named WAVEDEV.DLL (see figure).
// The messages passed to the audio driver are similar to those
// passed to a user-mode Windows NT audio driver (such as mmdrv.dll).
//
// <bmp blk1_bmp>
//
// Like all device drivers loaded by DEVICE.EXE, the waveform
// audio driver must export the standard device functions,
// XXX_Init, XXX_Deinit, XXX_IoControl, etc (see
// <t WAV Device Interface>). The Waveform Audio Drivers
// have a device prefix of "WAV".
//
// Driver loading and unloading is handled by DEVICE.EXE and
// WAVEAPI.DLL. Calls are made to <f WAV_Init> and <f WAV_Deinit>.
// When the driver is opened by WAVEAPI.DLL calls are made to
// <f WAV_Open> and <f WAV_Close>. On system power up and power down
// calls are made to <f WAV_PowerUp> and <f WAV_PowerDown>. All
// other communication between WAVEAPI.DLL and WAVEDEV.DLL is
// done by calls to <f WAV_IOControl>. The other WAV_xxx functions
// are not used.
//
// @xref <nl>
// <t Designing a Waveform Audio PDD> <nl>
// <t WAV Device Interface> <nl>
// <t Wave Input Driver Messages> <nl>
// <t Wave Output Driver Messages> <nl>
//
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func PVOID | WAV_Init | Device initialization routine
//
// @parm DWORD | dwInfo | info passed to RegisterDevice
//
// @rdesc Returns a DWORD which will be passed to Open & Deinit or NULL if
// unable to initialize the device.
//
// -----------------------------------------------------------------------------
DWORD WAV_Init(DWORD Index)
{
return (DWORD)HardwareContext::CreateHWContext(Index);
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func PVOID | WAV_Deinit | Device deinitialization routine
//
// @parm DWORD | dwOpenData | value returned from WAV_Init call
//
// @rdesc Returns TRUE for success, FALSE for failure.
//
// -----------------------------------------------------------------------------
BOOL WAV_Deinit(DWORD dwOpenData)
{
return g_pHWContext->Deinit();
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func PVOID | WAV_Open | Device open routine
//
// @parm DWORD | dwData | Value returned from WAV_Init call (ignored)
//
// @parm DWORD | dwAccess | Requested access (combination of GENERIC_READ
// and GENERIC_WRITE) (ignored)
//
// @parm DWORD | dwShareMode | Requested share mode (combination of
// FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
//
// @rdesc Returns a DWORD which will be passed to Read, Write, etc or NULL if
// unable to open device.
//
// -----------------------------------------------------------------------------
DWORD WAV_Open( DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode)
{
return 4;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func BOOL | WAV_Close | Device close routine
//
// @parm DWORD | dwOpenData | Value returned from WAV_Open call
//
// @rdesc Returns TRUE for success, FALSE for failure
//
// -----------------------------------------------------------------------------
BOOL WAV_Close(DWORD dwOpenData)
{
return TRUE;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func DWORD | WAV_Read | Device read routine
//
// @parm DWORD | dwOpenData | Value returned from WAV_Open call (ignored)
//
// @parm LPVOID | pBuf | Buffer to receive data (ignored)
//
// @parm DWORD | len | Maximum length to read (ignored)
//
// @rdesc Returns 0 always. WAV_Read should never get called and does
// nothing. Required DEVICE.EXE function, but all data communication
// is handled by <f WAV_IOControl>.
//
// -----------------------------------------------------------------------------
DWORD WAV_Read(DWORD dwOpenData,
LPVOID pBuf,
DWORD Len)
{
// Return length read
return 0;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func DWORD | WAV_Write | Device write routine
//
// @parm DWORD | dwOpenData | Value returned from WAV_Open call (ignored)
//
// @parm LPCVOID | pBuf | Buffer containing data (ignored)
//
// @parm DWORD | len | Maximum length to write (ignored)
//
// @rdesc Returns 0 always. WAV_Write should never get called and does
// nothing. Required DEVICE.EXE function, but all data communication
// is handled by <f WAV_IOControl>.
//
// -----------------------------------------------------------------------------
DWORD WAV_Write(DWORD dwOpenData,
LPCVOID pBuf,
DWORD Len)
{
// return number of bytes written (or -1 for error)
return 0;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func DWORD | WAV_Seek | Device seek routine
//
// @parm DWORD | dwOpenData | Value returned from WAV_Open call (ignored)
//
// @parm long | pos | Position to seek to (relative to type) (ignored)
//
// @parm DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
//
// @rdesc Returns -1 always. WAV_Seek should never get called and does
// nothing. Required DEVICE.EXE function, but all data communication
// is handled by <f WAV_IOControl>.
//
// -----------------------------------------------------------------------------
DWORD WAV_Seek(DWORD dwOpenData,
long pos,
DWORD type)
{
// return an error
return (DWORD)-1;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func void | WAV_PowerUp | Device powerup routine
//
// @comm Called to restore device from suspend mode. Cannot call any
// routines aside from those in the dll in this call.
//
// -----------------------------------------------------------------------------
VOID WAV_PowerUp(VOID)
{
g_pHWContext->PowerUp();
return;
}
// -----------------------------------------------------------------------------
//
// @doc WDEV_EXT
//
// @func void | WAV_PowerDown | Device powerdown routine
//
// @comm Called to suspend device. Cannot call any routines aside from
// those in the dll in this call.
//
// -----------------------------------------------------------------------------
VOID WAV_PowerDown(VOID)
{
g_pHWContext->PowerDown();
return;
}
// -----------------------------------------------------------------------------
//
// HandleWaveMessage
//
// Handles IOCTL_WAV_MESSAGE IOCTLs.
//
// Always returns TRUE. Result value is passed back via pdwResult.
//
// -----------------------------------------------------------------------------
BOOL HandleWaveMessage(PMMDRV_MESSAGE_PARAMS pParams, DWORD *pdwResult)
{
// set the error code to be no error first
SetLastError(MMSYSERR_NOERROR);
UINT uMsg = pParams->uMsg;
UINT uDeviceId = pParams->uDeviceId;
DWORD dwParam1 = pParams->dwParam1;
DWORD dwParam2 = pParams->dwParam2;
DWORD dwUser = pParams->dwUser;
StreamContext *pStreamContext = (StreamContext *)dwUser;
DWORD dwRet;
g_pHWContext->Lock();
// This message can cause a performance loss so be careful usng it.
// DEBUGMSG(ZONE_FUNCTION, (TEXT("+HandleWaveMessage\r\n")));
switch (uMsg)
{
case WODM_GETNUMDEVS:
{
dwRet = g_pHWContext->GetNumOutputDevices();
break;
}
case WIDM_GETNUMDEVS:
{
dwRet = g_pHWContext->GetNumInputDevices();
break;
}
case WODM_GETDEVCAPS:
{
DeviceContext *pDeviceContext;
UINT NumDevs = g_pHWContext->GetNumOutputDevices();
if (pStreamContext)
{
pDeviceContext=pStreamContext->GetDeviceContext();
}
else
{
pDeviceContext = g_pHWContext->GetOutputDeviceContext(uDeviceId);
}
//
// Is there support for this output (both hardware and software) ?
//
if ( pDeviceContext )
{
dwRet = pDeviceContext->GetDevCaps((PVOID)dwParam1,dwParam2);
}
else
{
dwRet = MMSYSERR_BADDEVICEID;
}
break;
}
case WIDM_GETDEVCAPS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -