Author: silverblade Date: Sat Jan 31 16:13:30 2009 New Revision: 39253
URL: http://svn.reactos.org/svn/reactos?rev=39253&view=rev Log: Various headers needed to compile the sound support libraries.
Added: trunk/reactos/include/ddk/ntddsnd.h (with props) trunk/reactos/include/reactos/libs/sound/ trunk/reactos/include/reactos/libs/sound/devname.h (with props) trunk/reactos/include/reactos/libs/sound/hardware.h (with props) trunk/reactos/include/reactos/libs/sound/midi.h (with props) trunk/reactos/include/reactos/libs/sound/midiuart.h (with props) trunk/reactos/include/reactos/libs/sound/mmebuddy.h (with props) trunk/reactos/include/reactos/libs/sound/mment4.h (with props) trunk/reactos/include/reactos/libs/sound/sbdsp.h (with props) trunk/reactos/include/reactos/libs/sound/time.h (with props)
Added: trunk/reactos/include/ddk/ntddsnd.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ddk/ntddsnd.h?rev=3... ============================================================================== --- trunk/reactos/include/ddk/ntddsnd.h (added) +++ trunk/reactos/include/ddk/ntddsnd.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,396 @@ +/* + ReactOS Sound System + NT4 Multimedia Audio Support (ntddsnd.h) + + Author: + Andrew Greenwood (andrew.greenwood@silverblade.co.uk) + + History: + 24 May 2008 - Created + 2 July 2008 - Added device names as seen from user-mode + 5 July 2008 - Added macros for checking device type + + This file contains definitions and structures for Windows NT4 style + multimedia drivers. The NT4 DDK has these split across multiple header + files: NTDDSND.H, NTDDWAVE.H, NTDDMIDI.H, NTDDMIX.H and NTDDAUX.H + + Should you have an unstoppable urge to build an NT4 multimedia driver + against these headers, just create the other files listed above and make + them #include this one. + + There are also a number of additional enhancements within this file + not found in the originals (such as DOS device name strings and device + type IDs). +*/ + +#ifndef NTDDWAVE +#define NTDDWAVE + +#define SOUND_MAX_DEVICES 100 + + +/* + Device types + + Not part of the original DDK header, but based on the values stored in + registry by sndblst +*/ + +#define WAVE_IN_DEVICE_TYPE 1 +#define WAVE_OUT_DEVICE_TYPE 2 +#define MIDI_IN_DEVICE_TYPE 3 +#define MIDI_OUT_DEVICE_TYPE 4 +#define AUX_DEVICE_TYPE 5 +#define MIXER_DEVICE_TYPE 6 + +#define MIN_SOUND_DEVICE_TYPE WAVE_IN_DEVICE_TYPE +#define MAX_SOUND_DEVICE_TYPE MIXER_DEVICE_TYPE +#define SOUND_DEVICE_TYPES 6 + +#define IS_VALID_SOUND_DEVICE_TYPE(x) \ + ( ( x >= MIN_SOUND_DEVICE_TYPE ) && ( x <= MAX_SOUND_DEVICE_TYPE ) ) + +#define IS_WAVE_DEVICE_TYPE(x) \ + ( ( x == WAVE_IN_DEVICE_TYPE ) || ( x == WAVE_OUT_DEVICE_TYPE ) ) + +#define IS_MIDI_DEVICE_TYPE(x) \ + ( ( x == MIDI_IN_DEVICE_TYPE ) || ( x == MIDI_OUT_DEVICE_TYPE ) ) + +#define IS_AUX_DEVICE_TYPE(x) \ + ( x == AUX_DEVICE_TYPE ) + +#define IS_MIXER_DEVICE_TYPE(x) \ + ( x == MIXER_DEVICE_TYPE ) + + +/* + Base device names + + Each device name should be given a numerical suffix identifying that + unique device, eg: + + \Device\WaveOut0 - First wave output device + \Device\WaveOut1 - Second wave output device +*/ + +#define SOUND_MAX_DEVICE_NAME 80 + +#define DD_WAVE_IN_DEVICE_NAME "\Device\WaveIn" +#define DD_WAVE_IN_DEVICE_NAME_U L"\Device\WaveIn" +#define DD_WAVE_IN_DOS_DEVICE_NAME "\DosDevices\WaveIn" +#define DD_WAVE_IN_DOS_DEVICE_NAME_U L"\DosDevices\WaveIn" +#define DD_WAVE_IN_WIN32_DEVICE_NAME "\\.\WaveIn" +#define DD_WAVE_IN_WIN32_DEVICE_NAME_U L"\\.\WaveIn" + +#define DD_WAVE_OUT_DEVICE_NAME "\Device\WaveOut" +#define DD_WAVE_OUT_DEVICE_NAME_U L"\Device\WaveOut" +#define DD_WAVE_OUT_DOS_DEVICE_NAME "\DosDevices\WaveOut" +#define DD_WAVE_OUT_DOS_DEVICE_NAME_U L"\DosDevices\WaveOut" +#define DD_WAVE_OUT_WIN32_DEVICE_NAME "\\.\WaveOut" +#define DD_WAVE_OUT_WIN32_DEVICE_NAME_U L"\\.\WaveOut" + +#define DD_MIDI_IN_DEVICE_NAME "\Device\MidiIn" +#define DD_MIDI_IN_DEVICE_NAME_U L"\Device\MidiIn" +#define DD_MIDI_IN_DOS_DEVICE_NAME "\DosDevices\MidiIn" +#define DD_MIDI_IN_DOS_DEVICE_NAME_U L"\DosDevices\MidiIn" +#define DD_MIDI_IN_WIN32_DEVICE_NAME "\\.\MidiIn" +#define DD_MIDI_IN_WIN32_DEVICE_NAME_U L"\\.\MidiIn" + +#define DD_MIDI_OUT_DEVICE_NAME "\Device\MidiOut" +#define DD_MIDI_OUT_DEVICE_NAME_U L"\Device\MidiOut" +#define DD_MIDI_OUT_DOS_DEVICE_NAME "\DosDevices\MidiOut" +#define DD_MIDI_OUT_DOS_DEVICE_NAME_U L"\DosDevices\MidiOut" +#define DD_MIDI_OUT_WIN32_DEVICE_NAME "\\.\MidiOut" +#define DD_MIDI_OUT_WIN32_DEVICE_NAME_U L"\\.\MidiOut" + +#define DD_MIX_DEVICE_NAME "\Device\MMMix" +#define DD_MIX_DEVICE_NAME_U L"\Device\MMMix" +#define DD_MIX_DOS_DEVICE_NAME "\DosDevices\MMMix" +#define DD_MIX_DOS_DEVICE_NAME_U L"\DosDevices\MMMix" +#define DD_MIX_WIN32_DEVICE_NAME "\\.\MMMix" +#define DD_MIX_WIN32_DEVICE_NAME_U L"\\.\MMMix" + +#define DD_AUX_DEVICE_NAME "\Device\MMAux" +#define DD_AUX_DEVICE_NAME_U L"\Device\MMAux" +#define DD_AUX_DOS_DEVICE_NAME "\DosDevices\MMAux" +#define DD_AUX_DOS_DEVICE_NAME_U L"\DosDevices\MMAux" +#define DD_AUX_WIN32_DEVICE_NAME "\\.\MMAux" +#define DD_AUX_WIN32_DEVICE_NAME_U L"\\.\MMAux" + +/* + Registry keys +*/ + +#define REG_SERVICES_KEY_NAME_U L"System\CurrentControlSet\Services" +#define REG_PARAMETERS_KEY_NAME_U L"Parameters" +#define REG_DEVICE_KEY_NAME_U L"Device" +#define REG_DEVICES_KEY_NAME_U L"Devices" + + +/* + Base control codes +*/ + +#define IOCTL_SOUND_BASE FILE_DEVICE_SOUND +#define IOCTL_WAVE_BASE 0x0000 +#define IOCTL_MIDI_BASE 0x0080 +#define IOCTL_AUX_BASE 0x0100 +#define IOCTL_MIX_BASE 0x0180 + + +/* + Helper macros for defining control codes +*/ + +#define WAVE_CTL_CODE(subcode, iomethod, access) \ + CTL_CODE(FILE_DEVICE_SOUND, IOCTL_WAVE_BASE + subcode, iomethod, access) + +#define MIDI_CTL_CODE(subcode, iomethod, access) \ + CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIDI_BASE + subcode, iomethod, access) + +#define MIX_CTL_CODE(subcode, iomethod, access) \ + CTL_CODE(FILE_DEVICE_SOUND, IOCTL_MIX_BASE + subcode, iomethod, access) + +#define AUX_CTL_CODE(subcode, iomethod, access) \ + CTL_CODE(FILE_DEVICE_SOUND, IOCTL_AUX_BASE + subcode, iomethod, access) + + +/* + Wave device control codes +*/ + +#define IOCTL_WAVE_QUERY_FORMAT \ + WAVE_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_WAVE_SET_FORMAT \ + WAVE_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_GET_CAPABILITIES \ + WAVE_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_WAVE_SET_STATE \ + WAVE_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_GET_STATE \ + WAVE_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_GET_POSITION \ + WAVE_CTL_CODE(0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_SET_VOLUME \ + WAVE_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_WAVE_GET_VOLUME \ + WAVE_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_WAVE_SET_PITCH \ + WAVE_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_GET_PITCH \ + WAVE_CTL_CODE(0x000A, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_SET_PLAYBACK_RATE \ + WAVE_CTL_CODE(0x000B, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_GET_PLAYBACK_RATE \ + WAVE_CTL_CODE(0x000C, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_PLAY \ + WAVE_CTL_CODE(0x000D, METHOD_IN_DIRECT, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_RECORD \ + WAVE_CTL_CODE(0x000E, METHOD_OUT_DIRECT, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_BREAK_LOOP \ + WAVE_CTL_CODE(0x000F, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_WAVE_SET_LOW_PRIORITY \ + WAVE_CTL_CODE(0x0010, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#if DBG + /* Debug-only control code */ + #define IOCTL_WAVE_SET_DEBUG_LEVEL \ + WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS) +#endif + + +/* + MIDI device control codes +*/ + +#define IOCTL_MIDI_GET_CAPABILITIES \ + MIDI_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MIDI_SET_STATE \ + MIDI_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_MIDI_GET_STATE \ + MIDI_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_MIDI_SET_VOLUME \ + MIDI_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MIDI_GET_VOLUME \ + MIDI_CTL_CODE(0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MIDI_PLAY \ + MIDI_CTL_CODE(0x0006, METHOD_NEITHER, FILE_WRITE_ACCESS) + +#define IOCTL_MIDI_RECORD \ + MIDI_CTL_CODE(0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_MIDI_CACHE_PATCHES \ + MIDI_CTL_CODE(0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_MIDI_CACHE_DRUM_PATCHES \ + MIDI_CTL_CODE(0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#if DBG + /* Debug-only control code */ + #define IOCTL_MIDI_SET_DEBUG_LEVEL \ + WAVE_CTL_CODE(0x0040, METHOD_BUFFERED, FILE_READ_ACCESS) +#endif + + +/* + Mixer device control codes +*/ + +#define IOCTL_MIX_GET_CONFIGURATION \ + MIX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MIX_GET_CONTROL_DATA \ + MIX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MIX_GET_LINE_DATA \ + MIX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_MIX_REQUEST_NOTIFY \ + MIX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) + + +/* + Auxiliary device control codes +*/ + +#define IOCTL_AUX_GET_CAPABILITIES \ + AUX_CTL_CODE(0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_AUX_SET_VOLUME \ + AUX_CTL_CODE(0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_AUX_GET_VOLUME \ + AUX_CTL_CODE(0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_SOUND_GET_CHANGED_VOLUME \ + AUX_CTL_CODE(0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) + + +/* + Wave structures & states +*/ + +#define WAVE_DD_MAX_VOLUME 0xFFFFFFFF + +typedef struct _WAVE_DD_VOLUME +{ + ULONG Left; + ULONG Right; +} WAVE_DD_VOLUME, *PWAVE_DD_VOLUME; + +typedef struct _WAVE_DD_PITCH +{ + ULONG Pitch; +} WAVE_DD_PITCH, *PWAVE_DD_PITCH; + +typedef struct _WAVE_DD_PLAYBACK_RATE +{ + ULONG Rate; +} WAVE_DD_PLAYBACK_RATE, *PWAVE_DD_PLAYBACK_RATE; + +/* IOCTL_WAVE_SET_STATE commands */ +#define WAVE_DD_STOP 0x0001 +#define WAVE_DD_PLAY 0x0002 +#define WAVE_DD_RECORD 0x0003 +#define WAVE_DD_RESET 0x0004 + +/* IOCTL_WAVE_GET_STATE responses */ +#define WAVE_DD_IDLE 0x0000 +#define WAVE_DD_STOPPED 0x0001 +#define WAVE_DD_PLAYING 0x0002 +#define WAVE_DD_RECORDING 0x0003 + + +/* + MIDI structures & states +*/ + +typedef struct _MIDI_DD_INPUT_DATA +{ + LARGE_INTEGER Time; + UCHAR Data[sizeof(ULONG)]; +} MIDI_DD_INPUT_DATA, *PMIDI_DD_INPUT_DATA; + +typedef struct _MIDI_DD_VOLUME +{ + ULONG Left; + ULONG Right; +} MIDI_DD_VOLUME, *PMIDI_DD_VOLUME; + +typedef struct _MIDI_DD_CACHE_PATCHES +{ + ULONG Bank; + ULONG Flags; + ULONG Patches[128]; +} MIDI_DD_CACHE_PATCHES, *PMIDI_DD_CACHE_PATCHES; + +typedef struct _MIDI_DD_CACHE_DRUM_PATCHES +{ + ULONG Patch; + ULONG Flags; + ULONG DrumPatches[128]; +} MIDI_DD_CACHE_DRUM_PATCHES, *PMIDI_DD_CACHE_DRUM_PATCHES; + +/* IOCTL_MIDI_SET_STATE commands */ +#define MIDI_DD_STOP 0x0001 +#define MIDI_DD_PLAY 0x0002 +#define MIDI_DD_RECORD 0x0003 +#define MIDI_DD_RESET 0x0004 + +/* IOCTL_MIDI_GET_STATE responses */ +#define MIDI_DD_IDLE 0x0000 +#define MIDI_DD_STOPPED 0x0001 +#define MIDI_DD_PLAYING 0x0002 +#define MIDI_DD_RECORDING 0x0003 + + +/* + Mixer structures + TODO: This is incomplete (see NTDDMIX.H in NT4 DDK) +*/ + +typedef struct _MIXER_DD_READ_DATA +{ + ULONG Id; +} MIXER_DD_READ_DATA, *PMIXER_DD_READ_DATA; + +typedef struct _MIXER_DD_LINE_DATA +{ + ULONG fdwLine; +} MIXER_DD_LINE_DATA, *PMIXER_DD_LINE_DATA; + + +/* + Auxiliary structures +*/ + +#define AUX_DD_MAX_VOLUME 0xFFFFFFFF + +typedef struct _AUX_DD_VOLUME +{ + ULONG Left; + ULONG Right; +} AUX_DD_VOLUME, *PAUX_DD_VOLUME; + + +#endif
Propchange: trunk/reactos/include/ddk/ntddsnd.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/devname.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/devname.h (added) +++ trunk/reactos/include/reactos/libs/sound/devname.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,138 @@ +/* + ReactOS Sound System + Device naming & creation helper routines + + Author: + Andrew Greenwood (silverblade@reactos.org) + + History: + 25 May 2008 - Created +*/ + +#ifndef ROS_DEVNAME +#define ROS_DEVNAME + +/* + ConstructDeviceName + + This takes a wide-character string containing the device name body (for + example, "\Device\WaveOut") and appends the device index, forming a + string like "\Device\WaveOut0", and so on. + + The resulting device name is a unicode string. +*/ + +NTSTATUS +ConstructDeviceName( + IN PCWSTR Path, + IN UCHAR Index, + OUT PUNICODE_STRING DeviceName); + + +/* + FreeUnicodeStringBuffer + + A small helper routine to free a unicode string buffer, nullify the + buffer and reset the lengths to zero. +*/ + +VOID +FreeUnicodeStringBuffer(IN PUNICODE_STRING String); + + +/* + GetDefaultSoundDeviceNameBodies + + Simply accesses the SoundDeviceNameBodies struct defined earlier and + fills the DeviceNameBody and DosDeviceNameBody parameters accordingly. + + Basically a "safe" way to access the array and perform two assignments + with one call, as this will assign the name and DOS name if a valid + DeviceType is passed, otherwise it will fail with STATUS_INVALID_PARAMETER. +*/ + +NTSTATUS +GetDefaultSoundDeviceNameBodies( + IN UCHAR DeviceType, + OUT PCWSTR* DeviceNameBody, + OUT PCWSTR* DosDeviceNameBody); + + +/* + ConstructSoundDeviceNames + + Given two wide-character strings and a device index, convert these into + two unicode strings with the index appended to the end. + + This is intended for converting a device name and a DOS device name at + the same time. +*/ + +NTSTATUS +ConstructSoundDeviceNames( + IN PCWSTR DeviceNameBody, + IN PCWSTR DosDeviceNameBody, + IN UCHAR Index, + OUT PUNICODE_STRING FullDeviceName, + OUT PUNICODE_STRING FullDosDeviceName); + + +/* + CreateSoundDevice + + Creates a device and symbolically-links a DOS device to this. Use this + when you want to specify alternative device names to the defaults + (eg: "\Device\MySoundDev" rather than "\Device\WaveOut") +*/ + +NTSTATUS +CreateSoundDevice( + IN PDRIVER_OBJECT DriverObject, + IN PCWSTR WideDeviceName, + IN PCWSTR WideDosDeviceName, + IN UCHAR Index, + IN ULONG ExtensionSize, + OUT PDEVICE_OBJECT* DeviceObject); + + +/* + CreateSoundDeviceWithDefaultName + + Similar to CreateSoundDevice, except this uses the default device names + ("\Device\WaveOut" etc.) based on the DeviceType parameter. +*/ + +NTSTATUS +CreateSoundDeviceWithDefaultName( + IN PDRIVER_OBJECT DriverObject, + IN UCHAR DeviceType, + IN UCHAR Index, + IN ULONG ExtensionSize, + OUT PDEVICE_OBJECT* DeviceObject); + + +/* + DestroySoundDevice + + Destroy a device and its symbolic link +*/ +NTSTATUS +DestroySoundDevice( + IN PDEVICE_OBJECT DeviceObject, + IN PCWSTR WideDosDeviceName, + IN UCHAR Index); + + +/* + DestroySoundDeviceWithDefaultName + + Similar to DestroySoundDevice, but operating on one of the + default device names. +*/ +NTSTATUS +DestroySoundDeviceWithDefaultName( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR DeviceType, + IN UCHAR Index); + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/devname.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/hardware.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/hardware.h (added) +++ trunk/reactos/include/reactos/libs/sound/hardware.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,23 @@ +/* + ReactOS Sound System + Legacy support + Hardware interaction helper + + Author: + Andrew Greenwood (silverblade@reactos.org) + + History: + 2 July 2008 - Created +*/ + +#ifndef ROS_AUDIOLEG_HARDWARE_H +#define ROS_AUDIOLEG_HARDWARE_H + +NTSTATUS +LegacyAttachInterrupt( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR Irq, + IN PKSERVICE_ROUTINE ServiceRoutine, + OUT PKINTERRUPT* InterruptObject); + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/hardware.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/midi.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/midi.h (added) +++ trunk/reactos/include/reactos/libs/sound/midi.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,39 @@ +/* + ReactOS Sound System + MIDI constants + + Author: + Andrew Greenwood (silverblade@reactos.org) + + History: + 26 May 2008 - Created +*/ + +#ifndef ROS_MIDI +#define ROS_MIDI + +/* Channel-based MIDI status bytes */ +#define MIDI_NOTE_OFF 0x80 +#define MIDI_NOTE_ON 0x90 +#define MIDI_KEY_PRESSURE 0xA0 +#define MIDI_CONTROL_CHANGE 0xB0 +#define MIDI_PROGRAM_CHANGE 0xC0 +#define MIDI_CHANNEL_PRESSURE 0xD0 +#define MIDI_PITCH_BEND 0xE0 + +/* System MIDI status bytes */ +#define MIDI_SYSEX_START 0xF0 +#define MIDI_QUARTER_FRAME 0xF1 +#define MIDI_SONG_POSITION 0xF2 +#define MIDI_SONG_SELECT 0xF3 +#define MIDI_TUNE_REQUEST 0xF6 +#define MIDI_SYSEX_END 0xF7 +#define MIDI_CLOCK 0xF8 +#define MIDI_TICK 0xF9 +#define MIDI_START 0xFA +#define MIDI_CONTINUE 0xFB +#define MIDI_STOP 0xFC +#define MIDI_ACTIVE_SENSE 0xFE +#define MIDI_RESET 0xFF + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/midi.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/midiuart.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/midiuart.h (added) +++ trunk/reactos/include/reactos/libs/sound/midiuart.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,111 @@ +/* + ReactOS Sound System + MIDI UART support + + Author: + Andrew Greenwood (silverblade@reactos.org) + + History: + 26 May 2008 - Created + + Notes: + MIDI UART is fairly simple. There are two ports - one is a data + port and is read/write, the other is a command/status port where + you can write commands, and read status. + + We use a subset of the functionality offered by the original MPU-401 + hardware, which is pretty much the only part implemented in sound + cards these days, known as "MIDI UART" mode. +*/ + +#ifndef ROS_MIDIUART +#define ROS_MIDIUART + +/* Port read/write abstraction (no wait) */ +#define WRITE_MIDIUART_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp, x) +#define READ_MIDIUART_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp) +#define WRITE_MIDIUART_COMMAND(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+1, x) +#define READ_MIDIUART_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+1) + +/* Status flags */ +#define MIDIUART_STATUS_DTR 0x40 +#define MIDIUART_STATUS_CTS 0x80 + + +/* + WaitForMidiUartStatus + + A universal routine for waiting for one or more bits to be set on the + MIDI UART command/status port. (Not a particularly efficient wait as + this polls the port until it's ready!) + + If the timeout is reached, the function returns FALSE. Otherwise, when + the specified flag(s) become set, the function returns TRUE. +*/ + +BOOLEAN +WaitForMidiUartStatus( + IN PUCHAR UartBasePort, + IN UCHAR StatusFlags, + IN ULONG Timeout); + +/* Waits for the CTS status bit to be set */ +#define WaitForMidiUartCTS(UartBasePort, Timeout) \ + WaitForMidiUartStatus(UartBasePort, MIDIUART_STATUS_CTS, Timeout) + +/* Waits for the DTR status bit to be set */ +#define WaitForMidiUartDTR(UartBasePort, Timeout) \ + WaitForMidiUartStatus(UartBasePort, MIDIUART_STATUS_DTR, Timeout) + +/* + WriteMidiUartByte + + Wait for the CTS bit to be set on the command/status port, before + writing to the data port. If CTS does not get set within the timeout + period, returns FALSE. Otherwise, returns TRUE. +*/ + +BOOLEAN +WriteMidiUartByte( + IN PUCHAR UartBasePort, + IN UCHAR Data, + IN ULONG Timeout); + + +/* + WriteMidiUartMulti + + Write multiple bytes to the MIDI UART data port. The timeout applies on a + per-byte basis. If it is reached for any byte, the function will return + FALSE. + + All data is written "as-is" - there are no checks made as to the validity + of the data. +*/ + +BOOLEAN +WriteMidiUartMulti( + IN PUCHAR UartBasePort, + IN PUCHAR Data, + IN ULONG DataLength, + IN ULONG Timeout); + + +/* + ReadMidiUartByte + + Wait for the DTR bit to be set on the command/status port, before + reading from the data port. If DTR does not get set within the + timeout period, returns FALSE. Otherwise, returns TRUE. + + On success, the read data is stored in the location specified by + the Data parameter. +*/ + +BOOLEAN +ReadMidiUartByte( + IN PUCHAR UartBasePort, + OUT UCHAR* Data, + IN ULONG Timeout); + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/midiuart.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/mmebuddy.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/mmebuddy.h (added) +++ trunk/reactos/include/reactos/libs/sound/mmebuddy.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,741 @@ +/* + * PROJECT: ReactOS Sound System "MME Buddy" Library + * LICENSE: GPL - See COPYING in the top level directory + * FILE: include/reactos/libs/sound/mmebuddy.h + * + * PURPOSE: Header for the "MME Buddy" helper library (located in + * lib/drivers/sound/mmebuddy) + * + * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org) + * + * HISTORY: 4 July 2008 - Created + * 31 Dec 2008 - Split off NT4-specific code into a separate library + * + * NOTES: MME Buddy was the best name I could come up with... + * The structures etc. here should be treated as internal to the + * library so should not be directly accessed elsewhere. +*/ + +#ifndef ROS_AUDIO_MMEBUDDY_H +#define ROS_AUDIO_MMEBUDDY_H + +/* + Hacky debug macro +*/ + +#define POPUP(...) \ + { \ + WCHAR dbg_popup_msg[1024], dbg_popup_title[256]; \ + wsprintf(dbg_popup_title, L"%hS(%d)", __FILE__, __LINE__); \ + wsprintf(dbg_popup_msg, __VA_ARGS__); \ + MessageBox(0, dbg_popup_msg, dbg_popup_title, MB_OK | MB_TASKMODAL); \ + } + +#ifdef DEBUG_NT4 + #define SND_ERR(...) \ + { \ + WCHAR dbg_popup_msg[1024]; \ + wsprintf(dbg_popup_msg, __VA_ARGS__); \ + OutputDebugString(dbg_popup_msg); \ + } + #define SND_WARN(...) \ + { \ + WCHAR dbg_popup_msg[1024]; \ + wsprintf(dbg_popup_msg, __VA_ARGS__); \ + OutputDebugString(dbg_popup_msg); \ + } + #define SND_TRACE(...) \ + { \ + WCHAR dbg_popup_msg[1024]; \ + wsprintf(dbg_popup_msg, __VA_ARGS__); \ + OutputDebugString(dbg_popup_msg); \ + } + + #define SND_ASSERT(condition) \ + { \ + if ( ! ( condition ) ) \ + { \ + SND_ERR(L"ASSERT FAILED: %hS\n", #condition); \ + POPUP(L"ASSERT FAILED: %hS\n", #condition); \ + ExitProcess(1); \ + } \ + } + +#else + #define SND_ERR(...) while ( 0 ) do {} + #define SND_WARN(...) while ( 0 ) do {} + #define SND_TRACE(...) while ( 0 ) do {} + #define SND_ASSERT(condition) while ( 0 ) do {} +#endif + +/* + Some memory allocation helper macros +*/ + +#define AllocateStruct(thing) \ + (thing*) AllocateMemory(sizeof(thing)) + +#define StringLengthToBytes(chartype, string_length) \ + ( ( string_length + 1 ) * sizeof(chartype) ) + +#define AllocateWideString(string_length) \ + (PWSTR) AllocateMemory(StringLengthToBytes(WCHAR, string_length)) + +#define ZeroWideString(string) \ + ZeroMemory(string, StringLengthToBytes(WCHAR, wcslen(string))) + +#define CopyWideString(dest, source) \ + CopyMemory(dest, source, StringLengthToBytes(WCHAR, wcslen(source))) + + +/* + Helps find the minimum/maximum of two values +*/ + +#define MinimumOf(value_a, value_b) \ + ( value_a < value_b ? value_a : value_b ) + +#define MaximumOf(value_a, value_b) \ + ( value_a > value_b ? value_a : value_b ) + + +/* + Convert a device type into a zero-based array index +*/ + +#define SOUND_DEVICE_TYPE_TO_INDEX(x) \ + ( x - MIN_SOUND_DEVICE_TYPE ) + +#define INDEX_TO_SOUND_DEVICE_TYPE(x) \ + ( x + MIN_SOUND_DEVICE_TYPE ) + + +/* + Validation +*/ + +#define IsValidSoundDeviceType IS_VALID_SOUND_DEVICE_TYPE + +#define VALIDATE_MMSYS_PARAMETER(parameter_condition) \ + { \ + if ( ! (parameter_condition) ) \ + { \ + SND_ERR(L"FAILED parameter check: %hS\n", #parameter_condition); \ + return MMSYSERR_INVALPARAM; \ + } \ + } + +#define MMSUCCESS(result) \ + ( result == MMSYSERR_NOERROR ) + + +/* + Types and Structures +*/ + +typedef UCHAR MMDEVICE_TYPE, *PMMDEVICE_TYPE; +struct _SOUND_DEVICE; +struct _SOUND_DEVICE_INSTANCE; + + +#define DEFINE_GETCAPS_FUNCTYPE(func_typename, caps_type) \ + typedef MMRESULT (*func_typename)( \ + IN struct _SOUND_DEVICE* SoundDevice, \ + OUT caps_type Capabilities, \ + IN DWORD CapabilitiesSize); + +/* This one is for those of us who don't care */ +DEFINE_GETCAPS_FUNCTYPE(MMGETCAPS_FUNC, PVOID); + +/* These are for those of us that do */ +DEFINE_GETCAPS_FUNCTYPE(MMGETWAVEOUTCAPS_FUNC, LPWAVEOUTCAPS); +DEFINE_GETCAPS_FUNCTYPE(MMGETWAVEINCAPS_FUNC, LPWAVEINCAPS ); +DEFINE_GETCAPS_FUNCTYPE(MMGETMIDIOUTCAPS_FUNC, LPMIDIOUTCAPS); +DEFINE_GETCAPS_FUNCTYPE(MMGETMIDIINCAPS_FUNC, LPMIDIINCAPS ); + +struct _SOUND_DEVICE; +struct _SOUND_DEVICE_INSTANCE; + +typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)( + IN struct _SOUND_DEVICE* Device, + IN PWAVEFORMATEX WaveFormat, + IN DWORD WaveFormatSize); + +typedef MMRESULT (*MMWAVESETFORMAT_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* Instance, + IN PWAVEFORMATEX WaveFormat, + IN DWORD WaveFormatSize); + +typedef MMRESULT (*MMOPEN_FUNC)( + IN struct _SOUND_DEVICE* SoundDevice, + OUT PVOID* Handle); + +typedef MMRESULT (*MMCLOSE_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance, + IN PVOID Handle); /* not sure about this */ + +typedef MMRESULT (*MMWAVEHEADER_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance, + IN PWAVEHDR WaveHeader); + +typedef struct _MMFUNCTION_TABLE +{ + union + { + MMGETCAPS_FUNC GetCapabilities; + MMGETWAVEOUTCAPS_FUNC GetWaveOutCapabilities; + MMGETWAVEINCAPS_FUNC GetWaveInCapabilities; + MMGETMIDIOUTCAPS_FUNC GetMidiOutCapabilities; + MMGETMIDIINCAPS_FUNC GetMidiInCapabilities; + }; + + MMOPEN_FUNC Open; + MMCLOSE_FUNC Close; + + MMWAVEQUERYFORMATSUPPORT_FUNC QueryWaveFormatSupport; + MMWAVESETFORMAT_FUNC SetWaveFormat; + + MMWAVEHEADER_FUNC PrepareWaveHeader; + MMWAVEHEADER_FUNC UnprepareWaveHeader; + MMWAVEHEADER_FUNC SubmitWaveHeader; +} MMFUNCTION_TABLE, *PMMFUNCTION_TABLE; + +typedef MMRESULT (*SOUND_THREAD_REQUEST_HANDLER)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance, + IN PVOID Parameter); + +typedef struct _SOUND_THREAD +{ + HANDLE Handle; + BOOL Running; + + struct + { + HANDLE Ready; + HANDLE Request; + HANDLE Done; + } Events; + + struct + { + SOUND_THREAD_REQUEST_HANDLER Handler; + struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance; + PVOID Parameter; + MMRESULT Result; + } Request; +} SOUND_THREAD, *PSOUND_THREAD; + +typedef struct _SOUND_DEVICE +{ + struct _SOUND_DEVICE* Next; + struct _SOUND_DEVICE_INSTANCE* HeadInstance; + struct _SOUND_DEVICE_INSTANCE* TailInstance; + MMDEVICE_TYPE Type; + PVOID Identifier; /* Path for NT4 drivers */ + /*PWSTR Path;*/ + MMFUNCTION_TABLE FunctionTable; +} SOUND_DEVICE, *PSOUND_DEVICE; + +typedef struct _SOUND_DEVICE_INSTANCE +{ + struct _SOUND_DEVICE_INSTANCE* Next; + struct _SOUND_DEVICE* Device; + PVOID Handle; + struct _SOUND_THREAD* Thread; + + /* Stuff generously donated to us from WinMM */ + struct + { + HDRVR Handle; + DWORD Flags; + DWORD ClientCallback; + DWORD ClientCallbackInstanceData; + } WinMM; +} SOUND_DEVICE_INSTANCE, *PSOUND_DEVICE_INSTANCE; + +/* + reentrancy.c +*/ + +MMRESULT +InitEntrypointMutexes(); + +VOID +CleanupEntrypointMutexes(); + +VOID +AcquireEntrypointMutex( + IN MMDEVICE_TYPE DeviceType); + +VOID +ReleaseEntrypointMutex( + IN MMDEVICE_TYPE DeviceType); + + +/* + mme.c +*/ + +VOID +NotifyMmeClient( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN DWORD Message, + IN DWORD Parameter); + +MMRESULT +MmeGetSoundDeviceCapabilities( + IN MMDEVICE_TYPE DeviceType, + IN DWORD DeviceId, + IN PVOID Capabilities, + IN DWORD CapabilitiesSize); + +MMRESULT +MmeOpenWaveDevice( + IN MMDEVICE_TYPE DeviceType, + IN DWORD DeviceId, + IN LPWAVEOPENDESC OpenParameters, + IN DWORD Flags, + OUT DWORD* PrivateHandle); + +MMRESULT +MmeCloseDevice( + IN DWORD PrivateHandle); + +#define MmePrepareWaveHeader(private_handle, header) \ + PrepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header) + +#define MmeUnprepareWaveHeader(private_handle, header) \ + UnprepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header) + +#define MmeSubmitWaveHeader(private_handle, header) \ + SubmitWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header) + + +/* + capabilities.c +*/ + +MMRESULT +GetSoundDeviceCapabilities( + IN PSOUND_DEVICE SoundDevice, + OUT PVOID Capabilities, + IN DWORD CapabilitiesSize); + + +/* + devicelist.c +*/ + +ULONG +GetSoundDeviceCount( + IN MMDEVICE_TYPE DeviceType); + +BOOLEAN +IsValidSoundDevice( + IN PSOUND_DEVICE SoundDevice); + +MMRESULT +ListSoundDevice( + IN MMDEVICE_TYPE DeviceType, + IN PVOID Identifier OPTIONAL, + OUT PSOUND_DEVICE* SoundDevice OPTIONAL); + +MMRESULT +UnlistSoundDevice( + IN MMDEVICE_TYPE DeviceType, + IN PSOUND_DEVICE SoundDevice); + +MMRESULT +UnlistSoundDevices( + IN MMDEVICE_TYPE DeviceType); + +VOID +UnlistAllSoundDevices(); + +MMRESULT +GetSoundDevice( + IN MMDEVICE_TYPE DeviceType, + IN DWORD DeviceIndex, + OUT PSOUND_DEVICE* Device); + +MMRESULT +GetSoundDeviceIdentifier( + IN PSOUND_DEVICE SoundDevice, + OUT PVOID* Identifier); + +MMRESULT +GetSoundDeviceType( + IN PSOUND_DEVICE SoundDevice, + OUT PMMDEVICE_TYPE DeviceType); + + +/* + functiontable.c +*/ + +MMRESULT +SetSoundDeviceFunctionTable( + IN PSOUND_DEVICE SoundDevice, + IN PMMFUNCTION_TABLE FunctionTable OPTIONAL); + +MMRESULT +GetSoundDeviceFunctionTable( + IN PSOUND_DEVICE SoundDevice, + OUT PMMFUNCTION_TABLE* FunctionTable); + + +/* + deviceinstance.c +*/ + +BOOLEAN +IsValidSoundDeviceInstance( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance); + +MMRESULT +CreateSoundDeviceInstance( + IN PSOUND_DEVICE SoundDevice, + OUT PSOUND_DEVICE_INSTANCE* SoundDeviceInstance); + +MMRESULT +DestroySoundDeviceInstance( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance); + +MMRESULT +DestroyAllSoundDeviceInstances( + IN PSOUND_DEVICE SoundDevice); + +MMRESULT +GetSoundDeviceFromInstance( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + OUT PSOUND_DEVICE* SoundDevice); + +MMRESULT +GetSoundDeviceInstanceHandle( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + OUT PVOID* Handle); + +MMRESULT +SetSoundDeviceInstanceMmeData( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN HDRVR MmeHandle, + IN DWORD ClientCallback, + IN DWORD ClientCallbackData, + IN DWORD Flags); + + +/* + thread.c +*/ + +MMRESULT +CreateSoundThread( + OUT PSOUND_THREAD* Thread); + +MMRESULT +DestroySoundThread( + IN PSOUND_THREAD Thread); + +MMRESULT +CallSoundThread( + IN PSOUND_THREAD Thread, + IN SOUND_THREAD_REQUEST_HANDLER RequestHandler, + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance OPTIONAL, + IN PVOID Parameter OPTIONAL); + + +/* + utility.c +*/ + +PVOID +AllocateMemory( + IN UINT Size); + +VOID +FreeMemory( + IN PVOID Pointer); + +UINT +GetMemoryAllocationCount(); + +UINT +GetDigitCount( + IN UINT Number); + +MMRESULT +Win32ErrorToMmResult( + IN UINT ErrorCode); + +MMRESULT +TranslateInternalMmResult( + IN MMRESULT Result); + + +/* + wave/format.c +*/ + +MMRESULT +QueryWaveDeviceFormatSupport( + IN PSOUND_DEVICE SoundDevice, + IN LPWAVEFORMATEX Format, + IN DWORD FormatSize); + +MMRESULT +SetWaveDeviceFormat( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN LPWAVEFORMATEX Format, + IN DWORD FormatSize); + + +/* + wave/header.c +*/ + +MMRESULT +PrepareWaveHeader( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN PWAVEHDR Header); + +MMRESULT +UnprepareWaveHeader( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN PWAVEHDR Header); + +MMRESULT +SubmitWaveHeader( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN PWAVEHDR Header); + + +/* + kernel.c +*/ + +#if 0 +#define QueryDevice(h, ctl, o, o_size, xfer, ovl) \ + Win32ErrorToMmResult( \ + DeviceIoControl(h, ctl, NULL, 0, o, o_size, xfer, ovl) != 0 \ + ? ERROR_SUCCESS : GetLastError() \ + ) + +#define ControlDevice(h, ctl, i, i_size, xfer, ovl) \ + Win32ErrorToMmResult( \ + DeviceIoControl(h, ctl, i, i_size, NULL, 0, xfer, ovl) != 0 \ + ? ERROR_SUCCESS : GetLastError() \ + ) + +#define QuerySoundDevice(sd, ctl, o, o_size, xfer) \ + SoundDeviceIoControl(sd, ctl, NULL, 0, o, o_size, xfer) + +#define ControlSoundDevice(sd, ctl, i, i_size, xfer) \ + SoundDeviceIoControl(sd, ctl, i, i_size, NULL, 0, xfer) +#endif + +MMRESULT +OpenKernelSoundDeviceByName( + IN PWSTR DevicePath, + IN BOOLEAN ReadOnly, + OUT PHANDLE Handle); + +MMRESULT +OpenKernelSoundDevice( + IN PSOUND_DEVICE SoundDevice, + IN BOOLEAN ReadOnly, + OUT PHANDLE Handle); + +MMRESULT +CloseKernelSoundDevice( + IN HANDLE Handle); + +MMRESULT +SyncOverlappedDeviceIoControl( + IN HANDLE SoundDeviceInstance, + IN DWORD IoControlCode, + IN LPVOID InBuffer, + IN DWORD InBufferSize, + OUT LPVOID OutBuffer, + IN DWORD OutBufferSize, + OUT LPDWORD BytesTransferred OPTIONAL); + + +#if 0 + +typedef UCHAR MMDEVICE_TYPE, *PMMDEVICE_TYPE; + +struct _SOUND_DEVICE; +struct _SOUND_DEVICE_INSTANCE; + + +/* + Rather than pass caps structures around as a PVOID, this can be + used instead. +*/ + +typedef union _UNIVERSAL_CAPS +{ + WAVEOUTCAPS WaveOut; + WAVEINCAPS WaveIn; + MIDIOUTCAPS MidiOut; + MIDIINCAPS MidiIn; +} UNIVERSAL_CAPS, *PUNIVERSAL_CAPS; + + + +/* New sound thread code */ + +typedef MMRESULT (*SOUND_THREAD_REQUEST_HANDLER)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance, + IN OPTIONAL PVOID Parameter); + +typedef struct _SOUND_THREAD_REQUEST +{ + /* The sound device instance this request relates to */ + struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance; + /* What function to call */ + SOUND_THREAD_REQUEST_HANDLER RequestHandler; + /* Caller-defined parameter */ + PVOID Parameter; + /* This will contain the return code of the request function */ + MMRESULT ReturnValue; +} SOUND_THREAD_REQUEST, *PSOUND_THREAD_REQUEST; + +typedef VOID (*SOUND_THREAD_IO_COMPLETION_HANDLER)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance, + IN PVOID Parameter OPTIONAL, + IN DWORD BytesWritten); + +typedef struct _SOUND_THREAD_COMPLETED_IO +{ + struct _SOUND_THREAD_COMPLETED_IO* Previous; + struct _SOUND_THREAD_COMPLETED_IO* Next; + + struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance; + SOUND_THREAD_IO_COMPLETION_HANDLER CompletionHandler; + PVOID Parameter; + DWORD BytesTransferred; +} SOUND_THREAD_COMPLETED_IO, *PSOUND_THREAD_COMPLETED_IO; + +typedef struct _SOUND_THREAD_OVERLAPPED +{ + OVERLAPPED General; + + /* Pointer to structure to fill with completion data */ + PSOUND_THREAD_COMPLETED_IO CompletionData; +} SOUND_THREAD_OVERLAPPED, *PSOUND_THREAD_OVERLAPPED; + +/* + Audio device function table +*/ + +typedef MMRESULT (*MMCREATEINSTANCE_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance); + +typedef VOID (*MMDESTROYINSTANCE_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance); + +typedef MMRESULT (*MMGETCAPS_FUNC)( + IN struct _SOUND_DEVICE* Device, + OUT PUNIVERSAL_CAPS Capabilities); + +typedef MMRESULT (*MMWAVEQUERYFORMAT_FUNC)( + IN struct _SOUND_DEVICE* Device, + IN PWAVEFORMATEX WaveFormat, + IN DWORD WaveFormatSize); + +typedef MMRESULT (*MMWAVESETFORMAT_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* Instance, + IN PWAVEFORMATEX WaveFormat, + IN DWORD WaveFormatSize); + +typedef MMRESULT (*MMWAVEQUEUEBUFFER_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* Instance, + IN PWAVEHDR WaveHeader); + +typedef MMRESULT (*MMGETWAVESTATE_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* Instance, + OUT PULONG State); + +typedef MMRESULT (*MMSETWAVESTATE_FUNC)( + IN struct _SOUND_DEVICE_INSTANCE* Instance); + +typedef struct _MMFUNCTION_TABLE +{ + MMCREATEINSTANCE_FUNC Constructor; + MMDESTROYINSTANCE_FUNC Destructor; + MMGETCAPS_FUNC GetCapabilities; + + MMWAVEQUERYFORMAT_FUNC QueryWaveFormat; + MMWAVESETFORMAT_FUNC SetWaveFormat; + MMWAVEQUEUEBUFFER_FUNC QueueWaveBuffer; + + MMGETWAVESTATE_FUNC GetWaveDeviceState; + MMSETWAVESTATE_FUNC PauseWaveDevice; + MMSETWAVESTATE_FUNC RestartWaveDevice; + MMSETWAVESTATE_FUNC ResetWaveDevice; + MMSETWAVESTATE_FUNC BreakWaveDeviceLoop; +} MMFUNCTION_TABLE, *PMMFUNCTION_TABLE; + + +/* + Represents an audio device +*/ + +#define SOUND_DEVICE_TAG "SndD" + +typedef struct _SOUND_DEVICE +{ + struct _SOUND_DEVICE* Next; + struct _SOUND_DEVICE_INSTANCE* FirstInstance; + UCHAR DeviceType; + LPWSTR DevicePath; + MMFUNCTION_TABLE Functions; +} SOUND_DEVICE, *PSOUND_DEVICE; + + +/* + Represents an individual instance of an audio device +*/ + +#define WAVE_STREAM_INFO_TAG "WavS" + +typedef struct _WAVE_STREAM_INFO +{ + /* Buffer queue head and tail */ + PWAVEHDR BufferQueueHead; + PWAVEHDR BufferQueueTail; + /* The buffer currently being processed */ + PWAVEHDR CurrentBuffer; + /* How far into the current buffer we've gone */ + DWORD BufferOffset; + /* How many I/O operations have been submitted */ + DWORD BuffersOutstanding; + /* Looping */ + PWAVEHDR LoopHead; + DWORD LoopsRemaining; +} WAVE_STREAM_INFO, *PWAVE_STREAM_INFO; + + +#define SOUND_DEVICE_INSTANCE_TAG "SndI" + +typedef struct _SOUND_DEVICE_INSTANCE +{ + struct _SOUND_DEVICE_INSTANCE* Next; + PSOUND_DEVICE Device; + + /* The currently opened handle to the device */ + HANDLE Handle; +/* PSOUND_THREAD Thread;*/ + + + /* Device-specific parameters */ + union + { + WAVE_STREAM_INFO Wave; + } Streaming; +} SOUND_DEVICE_INSTANCE, *PSOUND_DEVICE_INSTANCE; + +#endif + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/mmebuddy.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/mment4.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/mment4.h (added) +++ trunk/reactos/include/reactos/libs/sound/mment4.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,89 @@ +/* + * PROJECT: ReactOS Sound System "MME Buddy" Library (NT4 Helpers) + * LICENSE: GPL - See COPYING in the top level directory + * FILE: include/reactos/libs/sound/mment4.h + * + * PURPOSE: Header for the NT4 part of the "MME Buddy" helper library + * (located in lib/drivers/sound/mment4) + * + * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org) + * + * 31 Dec 2008 - Created + * + * NOTES: This is intended for use in building NT4 compatible audio device + * drivers. Include mmebuddy.h first. +*/ + +#ifndef ROS_AUDIO_MMENT4_H +#define ROS_AUDIO_MMENT4_H + +/* + detect.c +*/ + +typedef BOOLEAN (*SOUND_DEVICE_DETECTED_PROC)( + UCHAR DeviceType, + PWSTR DevicePath); + +MMRESULT +EnumerateNt4ServiceSoundDevices( + IN LPWSTR ServiceName, + IN MMDEVICE_TYPE DeviceType, + IN SOUND_DEVICE_DETECTED_PROC SoundDeviceDetectedProc); + +MMRESULT +DetectNt4SoundDevices( + IN MMDEVICE_TYPE DeviceType, + IN PWSTR BaseDeviceName, + IN SOUND_DEVICE_DETECTED_PROC SoundDeviceDetectedProc); + + +/* + registry.c +*/ + +MMRESULT +OpenSoundDriverParametersRegKey( + IN LPWSTR ServiceName, + OUT PHKEY KeyHandle); + +MMRESULT +OpenSoundDeviceRegKey( + IN LPWSTR ServiceName, + IN DWORD DeviceIndex, + OUT PHKEY KeyHandle); + + +/* + general.c - UNSORTED +*/ + +MMRESULT +GetNt4SoundDeviceCapabilities( + IN PSOUND_DEVICE SoundDevice, + OUT PVOID Capabilities, + IN DWORD CapabilitiesSize); + +MMRESULT +QueryNt4WaveDeviceFormatSupport( + IN PSOUND_DEVICE SoundDevice, + IN LPWAVEFORMATEX Format, + IN DWORD FormatSize); + +MMRESULT +SetNt4WaveDeviceFormat( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN LPWAVEFORMATEX Format, + IN DWORD FormatSize); + +MMRESULT +OpenNt4SoundDevice( + IN PSOUND_DEVICE SoundDevice, + OUT PVOID* Handle); + +MMRESULT +CloseNt4SoundDevice( + IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, + IN PVOID Handle); + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/mment4.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/sbdsp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/sbdsp.h (added) +++ trunk/reactos/include/reactos/libs/sound/sbdsp.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,324 @@ +/* + ReactOS Sound System + Sound Blaster DSP support + + Author: + Andrew Greenwood (silverblade@reactos.org) + + History: + 26 May 2008 - Created + + Notes: + Where timeouts are concerned, a value of 0 is interpreted as "forever". +*/ + +#ifndef ROS_SOUND_SBDSP_H +#define ROS_SOUND_SBDSP_H + +/* + Product versions + DSP 1.0, 1.5, 2.0, 2.01 correspond with respective Sound Blaster versions. + DSP 3.xx is Sound Blaster Pro + DSP 4.xx is Sound Blaster 16 +*/ + +#define SOUND_BLASTER_1_0 L"Sound Blaster 1.0" +#define SOUND_BLASTER_1_5 L"Sound Blaster 1.5" +#define SOUND_BLASTER_2_0 L"Sound Blaster 2.0" +#define SOUND_BLASTER_PRO L"Sound Blaster Pro" +#define SOUND_BLASTER_16 L"Sound Blaster 16" + + +/* + Sound Blaster ports I/O +*/ +#define READ_SB_FM1_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp) +#define WRITE_SB_FM1_REGISTER(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp, x) +#define WRITE_SB_FM1_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x01, x) + +#define READ_SB_AFM_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+0x02) +#define WRITE_SB_AFM_REGISTER(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x02, x) +#define WRITE_SB_AFM_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x03, x) + +#define WRITE_SB_MIXER_REGISTER(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x04, x) +#define READ_SB_MIXER_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp+0x05) +#define WRITE_SB_MIXER_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x05, x) + +#define WRITE_SB_DSP_RESET(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x06, x) + +#define READ_SB_FM2_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+0x08) +#define WRITE_SB_FM2_REGISTER(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x08, x) +#define WRITE_SB_FM2_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x09, x) + +#define READ_SB_DSP_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp+0x0A) +#define WRITE_SB_DSP_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x0C, x) +#define WRITE_SB_DSP_COMMAND(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x0C, x) + +/* Clear to send */ +#define SB_DSP_CLEAR_TO_SEND(bp) \ + ( ! (READ_PORT_UCHAR((PUCHAR) bp+0x0C) & 0x80 ) ) + +/* Data available for reading */ +#define SB_DSP_DATA_AVAILABLE(bp) \ + ( READ_PORT_UCHAR((PUCHAR) bp+0x0E) & 0x80 ) + + +#define SB_DSP_READY 0xAA + +/* + Sound Blaster DSP commands + (partial list) +*/ +#define SB_DSP_OUTPUT_RATE 0x41 +#define SB_DSP_INPUT_RATE 0x42 +#define SB_DSP_BLOCK_SIZE 0x48 +#define SB_DSP_SPEAKER_ON 0xD1 +#define SB_DSP_SPEAKER_OFF 0xD3 +#define SB_DSP_SPEAKER_STATUS 0xD8 +#define SB_DSP_VERSION 0xE1 + +/* + Mixer lines (legacy) +*/ +#define SB_MIX_VOC_LEVEL 0x04 +#define SB_MIX_LEGACY_MIC_LEVEL 0x0A +#define SB_MIX_MASTER_LEVEL 0x22 +#define SB_MIX_FM_LEVEL 0x26 +#define SB_MIX_CD_LEVEL 0x28 +#define SB_MIX_LINE_LEVEL 0x2E + +/* + Mixer lines +*/ +#define SB_MIX_RESET 0x00 +#define SB_MIX_MASTER_LEFT_LEVEL 0x30 +#define SB_MIX_MASTER_RIGHT_LEVEL 0x31 +#define SB_MIX_VOC_LEFT_LEVEL 0x32 +#define SB_MIX_VOC_RIGHT_LEVEL 0x33 +#define SB_MIX_MIDI_LEFT_LEVEL 0x34 +#define SB_MIX_MIDI_RIGHT_LEVEL 0x35 +#define SB_MIX_CD_LEFT_LEVEL 0x36 +#define SB_MIX_CD_RIGHT_LEVEL 0x37 +#define SB_MIX_LINE_LEFT_LEVEL 0x38 +#define SB_MIX_LINE_RIGHT_LEVEL 0x39 +#define SB_MIX_MIC_LEVEL 0x3A +#define SB_MIX_PC_SPEAKER_LEVEL 0x3B +#define SB_MIX_OUTPUT_SWITCHES 0x3C +#define SB_MIX_INPUT_LEFT_SWITCHES 0x3D +#define SB_MIX_INPUT_RIGHT_SWITCHES 0x3E +#define SB_MIX_INPUT_LEFT_GAIN 0x3F +#define SB_MIX_INPUT_RIGHT_GAIN 0x40 +#define SB_MIX_OUTPUT_LEFT_GAIN 0x41 +#define SB_MIX_OUTPUT_RIGHT_GAIN 0x42 +#define SB_MIX_AGC 0x43 +#define SB_MIX_TREBLE_LEFT_LEVEL 0x44 +#define SB_MIX_TREBLE_RIGHT_LEVEL 0x45 +#define SB_MIX_BASS_LEFT_LEVEL 0x46 +#define SB_MIX_BASS_RIGHT_LEVEL 0x47 + +/* + Mixer switches + (are these correct?) +*/ +#define SB_MIX_MIDI_LEFT_SWITCH 0x01 +#define SB_MIX_MIDI_RIGHT_SWITCH 0x02 +#define SB_MIX_LINE_LEFT_SWITCH 0x04 +#define SB_MIX_LINE_RIGHT_SWITCH 0x08 +#define SB_MIX_CD_LEFT_SWITCH 0x10 +#define SB_MIX_CD_RIGHT_SWITCH 0x20 +#define SB_MIX_MIC_SWITCH 0x40 + + +/* + Reset the Sound Blaster DSP. +*/ +NTSTATUS +SbDspReset( + IN PUCHAR BasePort, + IN ULONG Timeout); + +/* + Wait for the Sound Blaster DSP to be ready for data to be written to it. +*/ +NTSTATUS +SbDspWaitToWrite( + IN PUCHAR BasePort, + IN ULONG Timeout); + +/* + Wait for data to be ready for reading from the Sound Blaster DSP. +*/ +NTSTATUS +SbDspWaitToRead( + IN PUCHAR BasePort, + IN ULONG Timeout); + +/* + Wait for the Sound Blaster DSP to be ready for data to be written to it, + then (providing it becomes ready within the timeout period), write the + data to it. +*/ +NTSTATUS +SbDspWrite( + IN PUCHAR BasePort, + IN UCHAR DataByte, + IN ULONG Timeout); + +/* + Wait for the Sound Blaster DSP to be ready for data to be read from it, + then read the data from it into the pointer supplied as DataByte. If + the timeout is exceeded, DataByte will not be modified. +*/ +NTSTATUS +SbDspRead( + IN PUCHAR BasePort, + OUT PUCHAR DataByte, + IN ULONG Timeout); + +/* + This can only be called immediately after a reset has been issued. The + major version and minor version are returned in MajorVersion and + MinorVersion, respectively. + + The timeout applies to each DSP read/write performed. Note that the + data pointed to by MajorVersion may still fail if the retrieval of + MinorVersion times out. +*/ +NTSTATUS +SbDspGetVersion( + IN PUCHAR BasePort, + OUT PUCHAR MajorVersion, + OUT PUCHAR MinorVersion, + IN ULONG Timeout); + +/* + Turn the speaker on. +*/ +NTSTATUS +SbDspEnableSpeaker( + IN PUCHAR BasePort, + IN ULONG Timeout); + +/* + Turn the speaker off. +*/ +NTSTATUS +SbDspDisableSpeaker( + IN PUCHAR BasePort, + IN ULONG Timeout); + +/* + Obtains the speaker status, storing the result in IsEnabled. This will be + TRUE if the speaker is enabled, otherwise FALSE. +*/ +NTSTATUS +SbDspIsSpeakerEnabled( + IN PUCHAR BasePort, + OUT PBOOLEAN IsEnabled, + IN ULONG Timeout); + +/* + Validate the input sample rate. The major and minor versions are required + to determine the capabilities of the card. +*/ +BOOLEAN +SbDspIsValidInputRate( + IN UCHAR MajorVersion, + IN UCHAR MinorVersion, + IN USHORT Rate, + IN BOOLEAN Stereo); + +/* + Validate the output sample rate. The major and minor versions are required + to determine the capabilities of the card. +*/ +BOOLEAN +SbDspIsValidOutputRate( + IN UCHAR MajorVersion, + IN UCHAR MinorVersion, + IN USHORT Rate, + IN BOOLEAN Stereo); + +/* + Set the output/playback rate + * DSP 4.xx only +*/ +NTSTATUS +SbDsp4SetOutputRate( + IN PUCHAR BasePort, + IN USHORT Rate, + IN ULONG Timeout); + +/* + Set the input/record rate + * DSP 4.xx only +*/ +NTSTATUS +SbDsp4SetInputRate( + IN PUCHAR BasePort, + IN USHORT Rate, + IN ULONG Timeout); + + +/* + Reset the mixer +*/ +VOID +SbMixerReset(IN PUCHAR BasePort); + +/* + Pack mixer level data +*/ +NTSTATUS +SbMixerPackLevelData( + IN UCHAR Line, + IN UCHAR Level, + OUT PUCHAR PackedLevel); + +/* + Unpack mixer level data +*/ +NTSTATUS +SbMixerUnpackLevelData( + IN UCHAR Line, + IN UCHAR PackedLevel, + OUT PUCHAR Level); + +/* + Set a mixer line level +*/ +NTSTATUS +SbMixerSetLevel( + IN PUCHAR BasePort, + IN UCHAR Line, + IN UCHAR Level); + +/* + Get a mixer line level +*/ +NTSTATUS +SbMixerGetLevel( + IN PUCHAR BasePort, + IN UCHAR Line, + OUT PUCHAR Level); + +/* + Enable automatic gain control +*/ +VOID +SbMixerEnableAGC(IN PUCHAR BasePort); + +/* + Disable automatic gain control +*/ +VOID +SbMixerDisableAGC(IN PUCHAR BasePort); + +/* + Retrieve the current state of the automatic gain control +*/ +BOOLEAN +SbMixerIsAGCEnabled(IN PUCHAR BasePort); + + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/sbdsp.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/include/reactos/libs/sound/time.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/sound/... ============================================================================== --- trunk/reactos/include/reactos/libs/sound/time.h (added) +++ trunk/reactos/include/reactos/libs/sound/time.h [iso-8859-1] Sat Jan 31 16:13:30 2009 @@ -1,0 +1,21 @@ +/* + ReactOS Sound System + Timing helper + + Author: + Andrew Greenwood (silverblade@reactos.org) + + History: + 1 July 2008 - Created +*/ + +#ifndef ROS_SOUND_TIME_H +#define ROS_SOUND_TIME_H + +VOID +SleepMs(ULONG Milliseconds); + +ULONG +QuerySystemTimeMs(); + +#endif
Propchange: trunk/reactos/include/reactos/libs/sound/time.h ------------------------------------------------------------------------------ svn:eol-style = native