mirror of
https://github.com/reactos/reactos.git
synced 2024-11-18 21:13:52 +00:00
339 lines
5.6 KiB
C
339 lines
5.6 KiB
C
/*
|
|
*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS Multimedia
|
|
* FILE: dll/win32/mmdrv/mmdrv.h
|
|
* PURPOSE: Multimedia User Mode Driver (header)
|
|
* PROGRAMMER: Andrew Greenwood
|
|
* Aleksey Bragin
|
|
* UPDATE HISTORY:
|
|
* Jan 30, 2004: Imported into ReactOS tree
|
|
* Jan 10, 2007: Rewritten and tidied up
|
|
*/
|
|
|
|
#ifndef MMDRV_H
|
|
#define MMDRV_H
|
|
|
|
#include <stdarg.h>
|
|
|
|
#define WIN32_NO_STATUS
|
|
#include <windef.h>
|
|
#include <winbase.h>
|
|
#include <winioctl.h>
|
|
|
|
#include "mmioctl.h"
|
|
#include "mmddk.h"
|
|
|
|
/* Need to check these */
|
|
#define MAX_DEVICES 256
|
|
#define MAX_DEVICE_NAME_LENGTH 256
|
|
#define MAX_BUFFER_SIZE 1048576
|
|
#define MAX_WAVE_BYTES 1048576
|
|
|
|
/* Custom flag set when overlapped I/O is done */
|
|
#define WHDR_COMPLETE 0x80000000
|
|
|
|
|
|
/*
|
|
The kinds of devices which MMSYSTEM/WINMM may request from us.
|
|
*/
|
|
|
|
typedef enum
|
|
{
|
|
WaveOutDevice,
|
|
WaveInDevice,
|
|
MidiOutDevice,
|
|
MidiInDevice,
|
|
AuxDevice
|
|
} DeviceType;
|
|
|
|
#define IsWaveDevice(devicetype) \
|
|
( ( devicetype == WaveOutDevice ) || ( devicetype == WaveInDevice ) )
|
|
|
|
#define IsMidiDevice(devicetype) \
|
|
( ( devicetype == MidiOutDevice ) || ( devicetype == MidiInDevice ) )
|
|
|
|
#define IsAuxDevice(devicetype) \
|
|
( devicetype == AuxDevice )
|
|
|
|
|
|
/*
|
|
We use these structures to store information regarding open devices. Since
|
|
the main structure gets destroyed when a device is closed, I call this a
|
|
"session".
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
OVERLAPPED overlap;
|
|
LPWAVEHDR header;
|
|
} WaveOverlapInfo;
|
|
|
|
/*
|
|
typedef enum
|
|
{
|
|
WaveAddBuffer,
|
|
WaveClose,
|
|
WaveReset,
|
|
WaveRestart,
|
|
SessionThreadTerminate,
|
|
InvalidFunction
|
|
} ThreadFunction;
|
|
*/
|
|
|
|
/* Our own values, used with the session threads */
|
|
typedef DWORD ThreadFunction;
|
|
#define DRVM_TERMINATE 0xFFFFFFFE
|
|
#define DRVM_INVALID 0xFFFFFFFF
|
|
|
|
typedef enum
|
|
{
|
|
WavePlaying,
|
|
WaveStopped,
|
|
WaveReset,
|
|
WaveRestart
|
|
} WaveState;
|
|
|
|
typedef union
|
|
{
|
|
PWAVEHDR wave_header;
|
|
PMIDIHDR midi_header;
|
|
} MediaHeader;
|
|
|
|
/*
|
|
typedef union
|
|
{
|
|
MediaHeader header;
|
|
} ThreadParameter;
|
|
*/
|
|
|
|
typedef struct _ThreadInfo
|
|
{
|
|
HANDLE handle;
|
|
HANDLE ready_event;
|
|
HANDLE go_event;
|
|
|
|
/*ThreadFunction function;*/
|
|
DWORD function;
|
|
PVOID parameter;
|
|
|
|
MMRESULT result;
|
|
} ThreadInfo;
|
|
|
|
typedef struct _LoopInfo
|
|
{
|
|
PWAVEHDR head;
|
|
DWORD iterations;
|
|
} LoopInfo;
|
|
|
|
typedef struct _SessionInfo
|
|
{
|
|
struct _SessionInfo* next;
|
|
|
|
DeviceType device_type;
|
|
UINT device_id;
|
|
|
|
HANDLE kernel_device_handle;
|
|
|
|
/* These are all the same */
|
|
union
|
|
{
|
|
HDRVR mme_handle;
|
|
HWAVE mme_wave_handle;
|
|
HMIDI mme_midi_handle;
|
|
};
|
|
|
|
/* If playback is paused or not */
|
|
BOOL is_paused;
|
|
|
|
/* Stuff passed to us from winmm */
|
|
DWORD_PTR app_user_data;
|
|
DWORD_PTR callback;
|
|
|
|
DWORD flags;
|
|
|
|
/* Can only be one or the other */
|
|
union
|
|
{
|
|
PWAVEHDR wave_queue;
|
|
PMIDIHDR midi_queue;
|
|
};
|
|
|
|
/* Current playback point */
|
|
//PWAVEHDR next_buffer;
|
|
|
|
/* Where in the current buffer we are */
|
|
DWORD buffer_position;
|
|
|
|
// DWORD remaining_bytes;
|
|
|
|
LoopInfo loop;
|
|
|
|
ThreadInfo thread;
|
|
} SessionInfo;
|
|
|
|
#undef ASSERT
|
|
#define ASSERT(condition) \
|
|
if ( ! (condition) ) \
|
|
DPRINT("ASSERT FAILED: %s\n", #condition);
|
|
|
|
/*
|
|
MME interface
|
|
*/
|
|
|
|
BOOL
|
|
NotifyClient(
|
|
SessionInfo* session_info,
|
|
DWORD message,
|
|
DWORD_PTR parameter1,
|
|
DWORD_PTR parameter2);
|
|
|
|
|
|
/*
|
|
Helpers
|
|
*/
|
|
|
|
MMRESULT
|
|
ErrorToMmResult(UINT error_code);
|
|
|
|
|
|
/* Kernel interface */
|
|
|
|
MMRESULT
|
|
CobbleDeviceName(
|
|
DeviceType device_type,
|
|
UINT device_id,
|
|
PWCHAR out_device_name);
|
|
|
|
MMRESULT
|
|
OpenKernelDevice(
|
|
DeviceType device_type,
|
|
UINT device_id,
|
|
DWORD access,
|
|
HANDLE* handle);
|
|
|
|
VOID
|
|
CloseKernelDevice(HANDLE device_handle);
|
|
|
|
MMRESULT
|
|
SetDeviceData(
|
|
HANDLE device_handle,
|
|
DWORD ioctl,
|
|
PBYTE input_buffer,
|
|
DWORD buffer_size);
|
|
|
|
MMRESULT
|
|
GetDeviceData(
|
|
HANDLE device_handle,
|
|
DWORD ioctl,
|
|
PBYTE output_buffer,
|
|
DWORD buffer_size);
|
|
|
|
|
|
/* Session management */
|
|
|
|
MMRESULT
|
|
CreateSession(
|
|
DeviceType device_type,
|
|
UINT device_id,
|
|
SessionInfo** session_info);
|
|
|
|
VOID
|
|
DestroySession(SessionInfo* session);
|
|
|
|
SessionInfo*
|
|
GetSession(
|
|
DeviceType device_type,
|
|
UINT device_id);
|
|
|
|
MMRESULT
|
|
StartSessionThread(SessionInfo* session_info);
|
|
|
|
MMRESULT
|
|
CallSessionThread(
|
|
SessionInfo* session_info,
|
|
ThreadFunction function,
|
|
PVOID thread_parameter);
|
|
|
|
DWORD
|
|
HandleBySessionThread(
|
|
DWORD_PTR private_handle,
|
|
DWORD_PTR message,
|
|
DWORD_PTR parameter);
|
|
|
|
|
|
/* General */
|
|
|
|
DWORD
|
|
GetDeviceCount(DeviceType device_type);
|
|
|
|
DWORD
|
|
GetDeviceCapabilities(
|
|
DeviceType device_type,
|
|
UINT device_id,
|
|
DWORD_PTR capabilities,
|
|
DWORD capabilities_size);
|
|
|
|
DWORD
|
|
OpenDevice(
|
|
DeviceType device_type,
|
|
UINT device_id,
|
|
PVOID open_descriptor,
|
|
DWORD flags,
|
|
DWORD_PTR private_handle);
|
|
|
|
DWORD
|
|
CloseDevice(
|
|
DWORD_PTR private_handle);
|
|
|
|
DWORD
|
|
PauseDevice(
|
|
DWORD private_handle);
|
|
|
|
DWORD
|
|
RestartDevice(
|
|
DWORD private_handle);
|
|
|
|
DWORD
|
|
ResetDevice(
|
|
DWORD private_handle);
|
|
|
|
DWORD
|
|
GetPosition(
|
|
DWORD private_handle,
|
|
PMMTIME time,
|
|
DWORD time_size);
|
|
|
|
DWORD
|
|
BreakLoop(DWORD private_handle);
|
|
|
|
DWORD
|
|
QueryWaveFormat(
|
|
DeviceType device_type,
|
|
PVOID lpFormat);
|
|
|
|
DWORD
|
|
WriteWaveBuffer(
|
|
DWORD_PTR private_handle,
|
|
PWAVEHDR wave_header,
|
|
DWORD wave_header_size);
|
|
|
|
|
|
|
|
|
|
|
|
/* wave thread */
|
|
|
|
DWORD
|
|
WaveThread(LPVOID parameter);
|
|
|
|
|
|
/* Wave I/O */
|
|
|
|
VOID
|
|
PerformWaveIO(SessionInfo* session_info);
|
|
|
|
|
|
extern CRITICAL_SECTION critical_section;
|
|
|
|
#endif /* MMDRV_H */
|