⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdmaud.h

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
 *
 * COPYRIGHT:            See COPYING in the top level directory
 * PROJECT:              ReactOS Multimedia
 * FILE:                 lib/wdmaud/wdmaud.h
 * PURPOSE:              WDM Audio Support - Common header
 * PROGRAMMER:           Andrew Greenwood
 * UPDATE HISTORY:
 *                       Nov 12, 2005: Declarations for debugging + interface
 */

#ifndef __WDMAUD_PRIVATE_H__
#define __WDMAUD_PRIVATE_H__

/* Debugging */


/*
	Some of this stuff belongs in ksmedia.h or other such global includes.
*/

#include <stdio.h>

#include <debug.h>
#include <ntddk.h>

#include <windows.h>
#include <mmsystem.h>
#include <mmddk.h>

/* HACK! */
#define DbgPrint printf


/*
    Handy macros
*/

#define REPORT_MM_RESULT(message, success) \
    DPRINT("%s %s\n", message, success == MMSYSERR_NOERROR ? "succeeded" : "failed")

#define MM_SUCCESS(value) \
    ( value == MMSYSERR_NOERROR )

#define MM_FAILURE(value) \
    ( value != MMSYSERR_NOERROR )


#define GOBAL_CALLBACKS_PATH L"Global\\WDMAUD_Callbacks"


/*
	Private IOCTLs shared between wdmaud.sys and wdmaud.drv
    
    TO ADD/MODIFY:
        IOCTL_WDMAUD_OPEN_PIN
        IOCTL_WDMAUD_WAVE_OUT_WRITE_PIN
        IOCTL_WDMAUD_WAVE_IN_READ_PIN
        IOCTL_WDMAUD_MIXER_CLOSE
        IOCTL_WDMAUD_MIXER_OPEN
        IOCTL_WDMAUD_MIDI_IN_READ_PIN
        IOCTL_WDMAUD_MIXER_GETLINEINFO
        IOCTL_WDMAUD_MIXER_GETHARDWAREEVENTDATA
        IOCTL_WDMAUD_MIXER_SETCONTROLDETAILS
        IOCTL_WDMAUD_MIXER_GETCONTROLDETAILS
        IOCTL_WDMAUD_MIXER_GETLINECONTROLS
*/

/* 0x1d8000 */
#define IOCTL_WDMAUD_HELLO \
	CTL_CODE(FILE_DEVICE_SOUND, 0x0000, METHOD_BUFFERED, FILE_WRITE_ACCESS)

#define IOCTL_WDMAUD_ADD_DEVICE         0x1d8004
#define IOCTL_WDMAUD_REMOVE_DEVICE      0x1d8008
#define IOCTL_WDMAUD_GET_CAPABILITIES   0x1d800c
#define IOCTL_WDMAUD_GET_DEVICE_COUNT   0x1d8010
#define IOCTL_WDMAUD_OPEN_DEVICE        0x1d8014
#define IOCTL_WDMAUD_CLOSE_DEVICE       0x1d8018
#define IOCTL_WDMAUD_AUX_GET_VOLUME     0x1d801c
#define IOCTL_WDMAUD_AUX_SET_VOLUME     0x1d8020

/* 0x1d8024 */
#define IOCTL_WDMAUD_GOODBYE \
	CTL_CODE(FILE_DEVICE_SOUND, 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)

#define IOCTL_WDMAUD_SET_PREFERRED      0x1d8028

#define IOCTL_WDMAUD_WAVE_OUT_STOP      0x1d8100
#define IOCTL_WDMAUD_WAVE_OUT_START     0x1d8104
#define IOCTL_WDMAUD_WAVE_OUT_RESET     0x1d8108
#define IOCTL_WDMAUD_BREAK_LOOP         0x1d810c

#define IOCTL_WDMAUD_GET_WAVE_OUT_POS   0x1d8110	/* Does something funky */
#define IOCTL_WDMAUD_SET_VOLUME         0x1d8114	/* Already been covered? */
#define IOCTL_WDMAUD_UNKNOWN1           0x1d8118	/* Not used by wdmaud.drv */
#define IOCTL_WDMAUD_SUBMIT_WAVE_OUT_HDR 0x1d811c

#define IOCTL_WDMAUD_WAVE_IN_STOP       0x1d8140
#define IOCTL_WDMAUD_WAVE_IN_START      0x1d8144
#define IOCTL_WDMAUD_WAVE_IN_RESET      0x1d8148

#define IOCTL_WDMAUD_SUBMIT_WAVE_IN_HDR 0x1d8150    /* FIXME: Unsure about this */

#define IOCTL_WDMAUD_MIDI_OUT_SHORT_MESSAGE \
                                        0x1d8204	/* Wrong description? */

#define IOCTL_WDMAUD_UNKNOWN2           0x1d8208

#define IOCTL_WDMAUD_MIDI_OUT_LONG_MESSAGE \
                                        0x1d820c

#define IOCTL_WDMAUD_SUBMIT_MIDI_HDR    0x1d8210

#define IOCTL_WDMAUD_MIDI_IN_STOP       0x1d8240
#define IOCTL_WDMAUD_MIDI_IN_START      0x1d8244
#define IOCTL_WDMAUD_MIDI_IN_RESET      0x1d8248

#define IOCTL_WDMAUD_READ_MIDI_DATA     0x1d824c
#define IOCTL_WDMAUD_MIDI_MESSAGE       0x1d8300	/* Wrong description? */

#define IOCTL_WDMAUD_MIXER_UNKNOWN1     0x1d8310
#define IOCTL_WDMAUD_MIXER_UNKNOWN2     0x1d8314
#define IOCTL_WDMAUD_MIXER_UNKNOWN3     0x1d8318


/*
	Device Types
*/

enum
{
    WDMAUD_WAVE_IN = 0,
	WDMAUD_WAVE_OUT,

	WDMAUD_MIDI_IN,
	WDMAUD_MIDI_OUT,

    WDMAUD_MIXER,

	WDMAUD_AUX,

    /* For range checking */
    WDMAUD_MIN_DEVICE_TYPE = WDMAUD_WAVE_IN,
    WDMAUD_MAX_DEVICE_TYPE = WDMAUD_AUX
};

/*
    Some macros for device type matching and checking
*/

#define IsWaveInDeviceType(device_type)     (device_type == WDMAUD_WAVE_IN)
#define IsWaveOutDeviceType(device_type)    (device_type == WDMAUD_WAVE_OUT)
#define IsMidiInDeviceType(device_type)     (device_type == WDMAUD_MIDI_IN)
#define IsMidiOutDeviceType(device_type)    (device_type == WDMAUD_MIDI_OUT)
#define IsMixerDeviceType(device_type)      (device_type == WDMAUD_MIXER)
#define IsAuxDeviceType(device_type)        (device_type == WDMAUD_AUX)

#define IsWaveDeviceType(device_type) \
    (IsWaveInDeviceType(device_type) || IsWaveOutDeviceType(device_type))
#define IsMidiDeviceType(device_type) \
    (IsMidiInDeviceType(device_type) || IsMidiOutDeviceType(device_type))
    
#define IsValidDeviceType(device_type) \
    (device_type >= WDMAUD_MIN_DEVICE_TYPE && \
     device_type <= WDMAUD_MAX_DEVICE_TYPE)

/*
    The various "caps" (capabilities) structures begin with the same members,
    so a generic structure is defined here which can be accessed independently
    of a device type.
*/

/*
    This is used as a general-purpose structure to retrieve capabilities
    from the driver.
*/
typedef struct
{
    DWORD cbSize;
    LPVOID pCaps;
} MDEVICECAPSEX, *LPMDEVICECAPSEX;

/* Abstraction */
typedef LPVOID PWDMAUD_HEADER;

/*
    There are also various "opendesc" structures, but these don't have any
    common members. Regardless, this typedef simply serves as a placeholder
    to indicate that to access the members, it should be cast accordingly.

    TODO: Maybe have a generic OPEN routine that uses this?
*/
typedef struct OPENDESC *LPOPENDESC;

typedef struct
{
    DWORD sample_size;
    HANDLE thread;
    DWORD thread_id;

    union
    {
        LPWAVEHDR current_wave_header;
        LPMIDIHDR current_midi_header;
    };

    DWORD unknown_10;   /* pointer to something */
    DWORD unknown_14;

    LPCRITICAL_SECTION device_queue_guard;
    HANDLE queue_event;
    HANDLE exit_thread_event;

    DWORD unknown_24;

    DWORD is_paused;
    DWORD is_running;

    DWORD unknown_30;
    LPVOID midi_buffer;  /* for output ? */
    DWORD running_status;

    char signature[4];
} WDMAUD_DEVICE_STATE, *PWDMAUD_DEVICE_STATE;

typedef struct
{
    DWORD next_device;

    DWORD id;
    DWORD type;

    HWAVE handle;

    DWORD client_instance;
    DWORD client_callback;

    DWORD unknown_18;

    DWORD flags;
    DWORD ioctl_param2;
    DWORD ioctl_param1;
    DWORD with_critical_section;
    DWORD string_2c;

    DWORD unknown_30;

    DWORD playing_notes;

    DWORD unknown_38;
    DWORD unknown_3c;
    DWORD unknown_40;
    DWORD unknown_44;
    DWORD unknown_48;
    DWORD unknown_4C;
    DWORD unknown_50;

    DWORD beef;
    PWDMAUD_DEVICE_STATE state;
    char signature[4];
    WCHAR path[1];
} WDMAUD_DEVICE_INFO, *PWDMAUD_DEVICE_INFO;

typedef struct
{
    PWDMAUD_DEVICE_INFO offspring;  /* not sure about this */
    LPOVERLAPPED overlapped;
    char signature[4];
} WDMAUD_WAVE_PREPARATION_DATA, *PWDMAUD_WAVE_PREPARATION_DATA;

/* Ugh... */

typedef struct
{
    DWORD cbSize;   /* Maybe? */
    
} WDMAUD_CAPS, *PWDMAUD_CAPS;

/*
    Not quite sure what these are/do yet
*/

#define MAGIC_42    0x42424242  /* Queue critical section */
#define MAGIC_43    0x43434343  /* Queue critical section */
#define MAGIC_48    0x48484848  /* Exit-thread event */

#define IsQueueMagic(test_value) \
    ( ( (DWORD)test_value == MAGIC_42 ) || ( (DWORD)test_value == MAGIC_43) )


/*
    This should eventually be removed, but is used so we can be nosey and see
    what the kernel-mode wdmaud.sys is doing with our structures!
*/

#ifdef DUMP_WDMAUD_STRUCTURES

#define DUMP_MEMBER(struct, member) \
    DPRINT("%s : %d [0x%x]\n", #member, (int) struct->member, (int) struct->member);

#define DUMP_WDMAUD_DEVICE_INFO(info) \
    { \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -