From 569a662445414b07604bece8e149c207ee25297a Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 29 Nov 2015 11:42:34 -0500 Subject: [PATCH] v2_03_48_src Former-commit-id: 121914fac2392a3162b0f39ea628417458af3dcd --- Include/dxwnd.h | 8 +- Include/qmixer.h | 1429 +++++++++++++++++ build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 64 - build/exports/Age of Empires.dxw | 6 +- build/exports/Croc 2.dxw | 5 +- build/exports/Dark Colony.dxw | 6 +- .../Dark Planet Battle for Natrolis.dxw | 7 +- build/exports/Dark Vengeance.dxw | 4 + build/exports/Darkened Skye.dxw | 9 +- build/exports/DeathSpank The Baconing.dxw | 10 +- build/exports/Dracula Twins.dxw | 10 +- build/exports/Dune 2000.dxw | 3 +- build/exports/Earthworm Jim 3D.dxw | 7 +- build/exports/Echelon.dxw | 3 +- build/exports/Ed Hunter.dxw | 3 +- build/exports/Hexplore.dxw | 6 +- build/exports/House of the Dead 2.dxw | 3 +- build/exports/Hydro Thunder.dxw | 3 +- build/exports/Jazz Jackrabbit 2.dxw | 10 +- build/exports/Jeff Gordon XS Racing demo.dxw | 5 +- build/exports/KKND Xtreme.dxw | 7 +- build/readme-relnotes.txt | 7 + dll/ddblit.cpp | 13 +- dll/ddraw.cpp | 85 +- dll/dxhook.cpp | 4 +- dll/dxwcore.cpp | 11 + dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 211968 -> 214528 bytes dll/dxwnd.vs2008.vcproj | 6 +- dll/hd3d7.cpp | 7 + host/TabDirectX.cpp | 1 + host/TargetDlg.cpp | 5 +- host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 162320 -> 162156 bytes host/dxwndhost.rc | Bin 107496 -> 107698 bytes host/dxwndhost.vs2008.suo | Bin 45568 -> 46080 bytes .../dxwndhost.vs2008.vcproj.User-PC.User.user | 65 + host/dxwndhostView.cpp | 2 + host/resource | Bin 38004 -> 38092 bytes 42 files changed, 1694 insertions(+), 132 deletions(-) create mode 100644 Include/qmixer.h delete mode 100644 build/dxwnd.ini create mode 100644 host/dxwndhost.vs2008.vcproj.User-PC.User.user diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 0b1519f..ecca996 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -20,7 +20,7 @@ #define HANDLEEXCEPTIONS 0x00000040 // Handles exceptions: Div by 0 .... #define SAVELOAD 0x00000080 #define EMULATEBUFFER 0x00000100 -// #define AUTOMATIC 0x00000200 +#define HOOKDI8 0x00000200 #define BLITFROMBACKBUFFER 0x00000400 #define SUPPRESSCLIPPING 0x00000800 #define AUTOREFRESH 0x00001000 @@ -92,7 +92,7 @@ #define EMULATEREGISTRY 0x00000400 // Emulate registry api to read extra keys #define CDROMDRIVETYPE 0x00000800 // Pretends that GetDriveType() always returns DRIVE_CDROM #define NOWINDOWMOVE 0x00001000 // Do not try to update window position & size on D3D rendering -//#define DISABLEHAL 0x00002000 // Disable HAL support (IID_IDirect3DHALDevice) - no longer used +#define FORCECLIPPER 0x00002000 // Set ddraw clipping for real primary surface and primary window - but FastBlt cannot be used! #define LOCKSYSCOLORS 0x00004000 // Lock Sys Colors changes by SetSysColors() call #define GDIEMULATEDC 0x00008000 // Map GDI/user32 calls to primary to a memory surface to be stretch-blitted to the primary #define FULLSCREENONLY 0x00010000 // assume that the program is always in fullscreen mode @@ -210,8 +210,8 @@ #define SYNCPALETTE 0x04000000 // Syncronize GDI to DDRAW palette #define VIRTUALJOYSTICK 0x08000000 // Enables the DxWnd virtual joystick #define UNACQUIRE 0x10000000 // Unacquire DirectInput devices when losing focus and acquire back when gaining focus -#define HOOKGOGLIBS 0x20000000 -#define BYPASSGOGLIBS 0x40000000 +#define HOOKGOGLIBS 0x20000000 // Hook additional libraries provided by GOG with different names but same functionalities as system ones +#define BYPASSGOGLIBS 0x40000000 // Bypass GOG proxy system libraries loading directly the system libraries from the system folder // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/Include/qmixer.h b/Include/qmixer.h new file mode 100644 index 0000000..7158651 --- /dev/null +++ b/Include/qmixer.h @@ -0,0 +1,1429 @@ +// +// QMixer for Windows and Macintosh. +// Copyright (c) 1995-1998 QSound Labs, Inc. All Rights Reserved. +// Version 4.13, July 26, 1998. +// +// Based on Microsoft's WaveMix API. +// Copyright (c) 1993, 1994 Microsoft Corporation. All Rights Reserved. +// + + +#ifndef QMIXER_H +#define QMIXER_H + +#if !defined(_QMIXIMP) + #define _QMIXIMP __declspec(dllimport) +#endif + +DECLARE_HANDLE(HQMIXER); + +// +// Constants for qprocessing +// +#define Q_PAN_MIN 0 +#define Q_PAN_MAX 60 +#define Q_PAN_DEFAULT 15 +#define Q_VOLUME_DEFAULT 10000 + +// +// Flags for channel functions. +// +#define QMIX_ALL 0x0001 // apply to all channels +#define QMIX_NOREMIX 0x0002 // don't remix +#define QMIX_CONTROL_NOREMIX 0x0004 // don't remix + + +typedef +struct QSVECTOR { + float x; // meters + float y; // meters + float z; // meters +} QSVECTOR, *LPQSVECTOR; + + +typedef +struct QSPOLAR { + float azimuth; // degrees + float range; // meters + float elevation; // degrees +} QSPOLAR, *LPQSPOLAR; + + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef +struct QMIXINFO { + DWORD dwSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; +} +QMIXINFO, FAR* LPQMIXINFO; + +_QMIXIMP +DWORD +WINAPI +QSWaveMixGetInfoEx( + LPQMIXINFO lpInfo + ); + + +// +// Error handling functions. +// + +typedef UINT QMIX_RESULT; + +_QMIXIMP +QMIX_RESULT +WINAPI +QSWaveMixGetLastError( + void + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetErrorText( + QMIX_RESULT qmrError, + LPSTR pszText, + UINT cchText + ); + + +// +// Initialization functions. +// + +_QMIXIMP +HQMIXER +WINAPI +QSWaveMixInit( + void + ); + +#define QMIX_CONFIG_USEPRIMARY 0x0001 +#define QMIX_CONFIG_NOTHREAD 0x0002 +#define QMIX_CONFIG_PLAYSILENCE 0x0004 +#define QMIX_CONFIG_LEFTCOORDS 0x0008 +#define QMIX_CONFIG_RIGHTCOORDS 0x0000 +#define QMIX_CONFIG_GLOBALROLLOFF 0x0010 + +#define QMIX_CONFIG_OUTPUT_DETECT 0 +#define QMIX_CONFIG_OUTPUT_WAVEOUT 1 +#define QMIX_CONFIG_OUTPUT_DIRECTSOUND 2 + +#define QMIX_CONFIG_MATH_DETECT 0 +#define QMIX_CONFIG_MATH_INTEGER 1 +#define QMIX_CONFIG_MATH_FLOAT 2 +#define QMIX_CONFIG_MATH_MMX 3 + +typedef +struct QMIXCONFIG { + DWORD dwSize; + DWORD dwFlags; + DWORD dwSamplingRate; // 11025, 22050, or 44100 Hz; if 0 uses 22050 + LPVOID lpIDirectSound; + const GUID FAR* lpGuid; + int iChannels; // if 0, uses default of 8 + int iOutput; // if 0, uses best output device + int iLatency; // (in ms) if 0, uses default for output device + int iMath; // style of math + HWND hwnd; // handle used when initializing DirectSound + // (if 0, QMixer will find main window) + int iChannels3dHw; // number of 3d hardware channels + int iChannels3dQS; // number of 3d QSound software channels + int iChannels3dSw; // number of 3d software channels + int iChannels2dHw; // number of 2d hardware channels + int iChannels2dQS; // number of 2d QSound software channels + int iChannels2dSw; // number of 2d software channels +} +QMIXCONFIG, FAR* LPQMIXCONFIG; + + +_QMIXIMP +HQMIXER +WINAPI +QSWaveMixInitEx( + LPQMIXCONFIG lpConfig + ); + + +// +// Choose between speakers or headphones. +// +#define QMIX_SPEAKERS_STEREO 0 +#define QMIX_SPEAKERS_HEADPHONES 1 +#define QMIX_SPEAKERS_MONO 2 +#define QMIX_SPEAKERS_QUAD 3 + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetSpeakerPlacement( + HQMIXER hQMixer, + int placement + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetSpeakerPlacement( + HQMIXER hQMixer, + LPDWORD lpdwPlacement + ); + + +// +// The following function turns on and off various options +// in the mixer. Turning off features can save CPU cycles. +// +#define QMIX_OPTIONS_REAR 1 // improved rear effect +#define QMIX_OPTIONS_CROSSOVER 2 // improved frequency response +#define QMIX_OPTIONS_FLIPOUTPUT 4 // flip output channels +#define QMIX_OPTIONS_DOPPLER 8 // calculate listener velocity using position updates +#define QMIX_OPTIONS_ALL 0xffffffff + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetOptions( + HQMIXER hQMixer, + DWORD dwFlags, + DWORD dwMask + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetOptions( + HQMIXER hQMixer, + LPDWORD lpdwFlags + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetMixerOption( + HQMIXER hQMixer, + DWORD dwFlags, + LPVOID lpvOptions + ); + + +// +// QSWaveMixOpenChannel flags +// +#define QMIX_OPENSINGLE 0 // open the single channel specified by iChannel +#define QMIX_OPENALL 1 // opens all the channels, iChannel ignored +#define QMIX_OPENCOUNT 2 // open iChannel Channels (eg. if iChannel = 4 will create channels 0-3) +#define QMIX_OPENAVAILABLE 3 // open the first unopened channel, and return channel number + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixOpenChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags + ); + + +// +// Comprehensive channel parameters. Used in the functions +// - QSWaveMixGetChannelParams +// - QSWaveMixSetChannelParams +// - QSWaveMixCalculateChannelParams +// - QSWaveMixFindChannel +// - QSWaveMixPlayEx +// +// The first set of parameters shouldn't be modified, the second set +// can be altered for QSWaveMixSetChannelParams, and the third set +// are calculated by QMixer. +// +typedef +struct QMIX_CHANNEL_PARAMS { + DWORD dwSize; // size of this structure + DWORD dwChannelType; // combination of QMIX_CHANNELTYPE_ flags + LPWAVEFORMATEX lpwfxFormat; // channel format (overrides default mixer output) + DWORD dwMixerFlags; // reserved + + QSVECTOR vPosition; // 3d position (Cartesian coordinates) + QSVECTOR vVelocity; // 3d velocity (Cartesian coordinates) + QSVECTOR vOrientation; // 3d orientation (Cartesian coordinates) + float flInnerConeAngle; // inner cone angle (degrees) + float flOuterConeAngle; // outer cone angle (degrees) + float flOuterConeAtten; // attenuation outside cone (db) + float flMinDistance; // minimum distance (m) + float flMaxDistance; // maximum distance (m) + float flRolloff; // rolloff factor (0..10, default=1.0) + float flVolume; // scale + LONG lFrequency; // playback frequency + LONG lPanRate; // time in which a change is completed (ms) + LONG lPriority; // user-defined priority + DWORD dwModes; // combination of QSWaveMixEnableChannel flags + long unused[16]; // reserved for future expansion (set to zero) + + LONG lTimePlaying; // current time playing current sound (ms) + LONG lTimeRemaining; // current time left to play (ms) + float flDistance; // current distance to listener (m) + float flAzimuth; // current azimuth (degrees) + float flElevation; // current elevation (degrees) + float flConeScale; // amount that volume is scaled for cone effect + float flRolloffScale; // amount that volume is scaled for rolloff effect + float flAppliedVolume; // volume applied to sound, including rolloff & cone effects (scale) + float flDopplerSpeedup; // speedup due to Doppler shift + QSVECTOR vHeadPosition; // position relative to listener (left-handed coordinates) + QSVECTOR vHeadVelocity; // velocity relative to listener (left-handed coordinates) +} QMIX_CHANNEL_PARAMS; + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetChannelParams( + HQMIXER hQMixer, + int iChannel, + QMIX_CHANNEL_PARAMS* params + ); + + +_QMIXIMP MMRESULT WINAPI +QSWaveMixSetChannelParams( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QMIX_CHANNEL_PARAMS* params + ); + + +_QMIXIMP MMRESULT WINAPI +QSWaveMixCalculateChannelParams( + HQMIXER hQMixer, + QMIX_CHANNEL_PARAMS* params, + DWORD dwFlags + ); + + +// +// Channel types. These flags are used in: +// QSWaveMixConfigureChannel, +// QSWaveMixFindChannel. +// They also appear in the dwChannelType field in QMIX_CHANNEL_PARAMS. +// +#define QMIX_CHANNELTYPE_QSOUND 0x00010000 // uses QSound software mixer +#define QMIX_CHANNELTYPE_STREAMING 0x00020000 // uses hardware streaming DirectSoundBuffer +#define QMIX_CHANNELTYPE_STATIC 0x00040000 // uses hardware static DirectSoundBuffer +#define QMIX_CHANNELTYPE_SOFTWARE 0x00080000 // uses software DirectSoundBuffer +#define QMIX_CHANNELTYPE_DSOUND \ + (QMIX_CHANNELTYPE_STREAMING|QMIX_CHANNELTYPE_STATIC|QMIX_CHANNELTYPE_SOFTWARE) +#define QMIX_CHANNELTYPE_ANYMIXER 0x00ff0000 + +#define QMIX_CHANNELTYPE_2D 0x01000000 // stereo only +#define QMIX_CHANNELTYPE_3D 0x02000000 // supports full 3d features +#define QMIX_CHANNELTYPE_ANYFEATURE 0x7f000000 + +#define QMIX_CHANNELTYPE_ALL (QMIX_CHANNELTYPE_ANYMIXER|QMIX_CHANNELTYPE_ANYFEATURE) + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixConfigureChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, // type of channel + LPCWAVEFORMATEX format, // format of channel (optional) + LPVOID lpvOptions // options (reserved, set to zero) + ); + + +// +// Find a channel using one of the QMIX_FINDCHANNEL_ priority schemes. +// +// The type of channel can be restricted to one of the types given by +// a combination of the QMIX_CHANNELTYPE_ flags. +// +// Normally the channel will be excluded from subsequent calls to +// QSWaveMixFindChannel until a sound is played on the channel. This is +// to allow the setting up of several sounds to be played at the same +// instant. This reservation can be disabled by setting the +// QMIX_FINDCHANNEL_NORESERVE flag. +// + +#define QMIX_FINDCHANNEL_SORTMETHOD 0x0000000f // mask for sort method +#define QMIX_FINDCHANNEL_BEGINTIME 0x00000000 // sort by time from beginning (least-recently used) +#define QMIX_FINDCHANNEL_ENDTIME 0x00000001 // sort by time to end (most-recently available) +#define QMIX_FINDCHANNEL_VOLUME 0x00000002 // sort by applied volume +#define QMIX_FINDCHANNEL_DISTANCE 0x00000003 // sort by distance from listener +#define QMIX_FINDCHANNEL_PRIORITY 0x00000004 // sort by user priority + +#define QMIX_FINDCHANNEL_TOPLAY 0x00000000 // pick a playing or ready (idle) channel for playing another +#define QMIX_FINDCHANNEL_TOPAUSE 0x00000010 // pick a playing channel for pausing +#define QMIX_FINDCHANNEL_TORESTART 0x00000020 // pick a paused channel for restarting +#define QMIX_FINDCHANNEL_FORMAT 0x00000080 // channel must match lpParams->lpwfxFormat +#define QMIX_FINDCHANNEL_NORESERVE 0x80000000 // don't exclude from subsequent searches + +#define QMIX_FINDCHANNEL_LRU QMIX_FINDCHANNEL_BEGINTIME +#define QMIX_FINDCHANNEL_MRA QMIX_FINDCHANNEL_ENDTIME + +_QMIXIMP +int +WINAPI +QSWaveMixFindChannel( + HQMIXER hQMixer, + DWORD dwFlags, + const QMIX_CHANNEL_PARAMS* lpParams // compare with these parameters + ); + + +// +// Turn on QMixer's dynamic scheduling. The lpChannelTypes array gives the +// channel type (one of QMIX_CHANNELTYPE_ANYMIXER and one of +// QMIX_CHANNELTYPE_ANYFEATURE) and the maximum number of desired channels of +// that type that should play at any time. A count of -1 channels specifies +// that as many channels as possible should be played. An entry with +// dwChannelType ends the list. If lpChannelTypes is null, the current type +// settings are used. If QMIX_PRIORITIZE_NONE is used, scheduling is turned +// off. +// +typedef +struct QMIX_CHANNELTYPES { + DWORD dwChannelType; // type of channel + int iMaxChannels; // maximum number of channels of that type to play +} QMIX_CHANNELTYPES, *LPQMIX_CHANNELTYPES; + + +#define QMIX_PRIORITIZE_NONE 0x0000000f + +_QMIXIMP MMRESULT WINAPI +QSWaveMixPrioritizeChannels( + HQMIXER hQMixer, + LPQMIX_CHANNELTYPES lpChannelTypes, + DWORD dwFlags, + LPVOID lpvParams + ); + + +// +// Structure describing wave data; returned by QSWaveMixOpenWave and +// QSWaveMixOpenWaveEx. +// +#define MAXFILENAME 15 + +typedef struct MIXWAVE { + PCMWAVEFORMAT pcm; // data format + WAVEHDR wh; // location and length of data + char szWaveFilename[MAXFILENAME+1]; // truncated version of name + LPWAVEFORMATEX pwf; // data format; needed for MSACM wave files +#if defined(MACINTOSH) + CmpSoundHeader format; // Mac version of sound info +#endif +} +MIXWAVE, FAR* LPMIXWAVE; +typedef const MIXWAVE FAR* LPCMIXWAVE; + +// Input streaming callback function. Return TRUE to continue to play, return +// FALSE to stop playing. +typedef BOOL (CALLBACK *LPQMIXINPUTCALLBACK)(void* buffer, DWORD bytes, void* user); + +// +// QSWaveMixOpenWave and QSWaveMixOpenWaveEx flags. +// +#define QMIX_FILE 0x0001 // load from file +#define QMIX_RESOURCE 0x0002 // load from resource +#define QMIX_MEMORY 0x0004 // load using MMIOINFO supplied by user +#define QMIX_RESIDENT 0x0008 // use memory-resident data +#define QMIX_FILESTREAM 0x0010 // stream from file +#define QMIX_INPUTSTREAM 0x0011 // stream from input buffer +#define QMIX_FILESPEC 0x0012 // Macintosh file specification + +typedef union { + const char* FileName; // Name of RIFF file (e.g. "*.wav") with wave. + struct { // Wave stored in resource. + const char* Name; // Name of resource. + HINSTANCE hInstance; // Handle of module where resource is located. + } Resource; + LPMMIOINFO lpMmioInfo; // Read from file already opened by mmioOpen. + struct { // Memory resident wave. + LPCWAVEFORMATEX Format; // Format of wave; can be compressed. + HPSTR Data; // Pointer to memory resident audio samples. + DWORD Bytes; // Length of Data, in bytes. + DWORD Samples; // Number of wave samples; needed if compressed. + DWORD Tag; // User-defined id. + } Resident; + struct { // Input streaming using user callback. + LPCWAVEFORMATEX Format; // Format of data (must be uncompressed). + DWORD BlockBytes; // Preferred length of block. + LPQMIXINPUTCALLBACK Callback; // User-defined callback function. + LPVOID User; // Data to be provided to callback. + DWORD Tag; // User-defined id. + } Stream; +#if defined(MACINTOSH) + FSSpec* FileSpec; // Macintosh file specifier. +#endif +} QMIXWAVEPARAMS, *LPQMIXWAVEPARAMS; + + +_QMIXIMP +LPMIXWAVE +WINAPI +QSWaveMixOpenWaveEx( + HQMIXER hQMixer, + LPQMIXWAVEPARAMS lpWaveParams, + DWORD dwFlags + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixActivate( + HQMIXER hQMixer, + BOOL fActivate + ); + + +// +// Options for dwFlags parameter in QSWaveMixPlayEx. +// +// Note: the QMIX_USELRUCHANNEL flag has two functions. When QMIX_CLEARQUEUE +// is also set, the channel that has been playing the longest (least-recently- +// used) is cleared and the buffer played. When QMIX_QUEUEWAVE is set, the +// channel that will first finish playing will be selected and the buffer +// queued to play. Of course, if an unused channel is found, it will be +// selected instead. If QMIX_WAIT has not been specified, then the channel +// number will be returned in the iChannel field. +// +#define QMIX_QUEUEWAVE 0x0000 // queue on channel +#define QMIX_CLEARQUEUE 0x0001 // clear queue on channel +#define QMIX_USELRUCHANNEL 0x0002 // see note above +#define QMIX_HIPRIORITY 0x0004 +#define QMIX_HIGHPRIORITY QMIX_HIPRIORITY +#define QMIX_WAIT 0x0008 // queue to be played with other sounds +#define QMIX_IMMEDIATE 0x0020 // apply volume/pan changes without interpolation + +#define QMIX_PLAY_SETEVENT 0x0100 // call SetEvent((HANDLE)callback) on completion +#define QMIX_PLAY_PULSEEVENT 0x0200 // call PulseEvent((HANDLE)callback) on completion +#define QMIX_PLAY_NOTIFYSTOP 0x0400 // do callback even when stopping or flushing sound + +typedef void (CALLBACK *LPQMIXDONECALLBACK)(int iChannel, LPMIXWAVE lpWave, DWORD dwUser); + +typedef struct QMIXPLAYPARAMS { + DWORD dwSize; // this must be set + LPMIXWAVE lpImage; // additional preprocessed audio for high performance + HWND hwndNotify; // if set, WOM_OPEN and WOM_DONE notification messages sent here + LPQMIXDONECALLBACK callback; + DWORD dwUser; // user data accompanying callback + LONG lStart; + LONG lStartLoop; + LONG lEndLoop; + LONG lEnd; + const QMIX_CHANNEL_PARAMS* lpChannelParams; // initialize with these parameters +} +QMIXPLAYPARAMS, *LPQMIXPLAYPARAMS; + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixPlayEx( + HQMIXER hQMixer, // the mixer handle + int iChannel, // channel number to be played on + DWORD dwFlags, + LPMIXWAVE lpMixWave, // sound to be played + int iLoops, // number of loops to be played (-1 = forever) + LPQMIXPLAYPARAMS lpParams // if NULL, defaults will be used + ); + + +// +// Functions for controlling channels. +// +// The flag QMIX_WAIT can be used in the dwFlags argument of the +// channel parameter functions to defer the use of the new parameter +// until the next sound is played with QSWaveMixPlayEx. This allows +// us synchronize the changing of channel parameters with the beginning +// of a sound. +// +// The flag QMIX_USEONCE can be used to use the parameter only for the +// remainder of the current sound; afterwards the parameter reverts +// back to the channel's defaults. If no sound is playing, the +// parameter is used for the entire duration of the next sound. +// If both QMIX_USEONCE and QMIX_WAIT are used, then the property takes +// effect for the entire duration of the following sound. +// +// These flags can be used with the following functions: +// - QSWaveMixEnableChannel +// - QSWaveMixSetChannelParams +// - QSWaveMixSetChannelPriority +// - QSWaveMixSetDistanceMapping +// - QSWaveMixSetFrequency +// - QSWaveMixSetPan +// - QSWaveMixSetPanRate +// - QSWaveMixSetPolarPosition +// - QSWaveMixSetPosition +// - QSWaveMixSetSourceCone +// - QSWaveMixSetSourceCone2 +// - QSWaveMixSetSourcePosition +// - QSWaveMixSetSourceVelocity +// - QSWaveMixSetVolume +// +#define QMIX_USEONCE 0x10 // settings are temporary + + +// +// Set the amount of time, in milliseconds, to effect a change in +// a channel property (e.g. volume, position). Non-zero values smooth +// out changes. +// +// Use QSWaveMixSetPanRate(hQMixer, iChannel, QMIX_WAIT|QMIX_USEONCE, 0) +// to implement sudden changes for the next sound without losing the +// smoothing function. Using QMIX_IMMEDIATE with QSWaveMixPlayEx also +// causes immediate changes while preserving subsequent pan interpolations. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetPanRate( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + DWORD dwRate + ); + +// +// The pan value can be set to values from 0 to 60: +// 0 = full left, +// 15 = straight ahead (mono), +// 30 = full right, +// 45 = behind. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetPan( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + int pan + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetVolume( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + int volume + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetPolarPosition( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QSPOLAR* lpQPosition + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetFrequency( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + DWORD dwFrequency + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixPauseChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixRestartChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags + ); + + +#define QMIX_STOP_FINISHLASTLOOP 0x1000 + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixStopChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags + ); + + +// +// QSWaveMixEnableChannel: if mode==0, use conventional, high-performance +// stereo mixer. Non-zero modes imply some form of additional processing. +// +#define QMIX_CHANNEL_STEREO 0x0000 // perform stereo mixing +#define QMIX_CHANNEL_QSOUND 0x0001 // perform QSound localization (default) +#define QMIX_CHANNEL_DOPPLER 0x0002 // calculate velocity using position updates +#define QMIX_CHANNEL_RANGE 0x0004 // do range effects +#define QMIX_CHANNEL_ELEVATION 0x0008 // do elevation effects +#define QMIX_CHANNEL_NODOPPLERPITCH 0x0010 // disable Doppler pitch shift for this channel +#define QMIX_CHANNEL_PITCH_COPY 0x0000 // pitch shifting using copying (fastest) +#define QMIX_CHANNEL_PITCH_LINEAR 0x0100 // pitch shifting using linear interpolation (better but slower) +#define QMIX_CHANNEL_PITCH_SPLINE 0x0200 // pitch shifting using spline interpolation (better yet, but much slower) +#define QMIX_CHANNEL_PITCH_FILTER 0x0300 // pitch shifting using FIR filter (best, but slowest) +#define QMIX_CHANNEL_PITCH_MASK 0x0700 // bits reserved for pitch types + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixEnableChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + int mode + ); + + +// +// QSWaveMixEnable is equivalent to +// QSWaveMixEnableChannel(hQMixer, 0, QMIX_ALL, mode). +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixEnable( + HQMIXER hQMixer, + int mode + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetChannelPriority( + HQMIXER hQMixer, + int iChannel, + LONG lPriority, + DWORD dwFlags + ); + + +// +// Status functions. +// + +// +// Return a pointer to the internal DirectSound object. Handy for creating +// additional secondary buffers (but only if QMIX_CONFIG_USEPRIMARY was not +// set in QSWaveMixConfigureInit). +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetDirectSound( + HQMIXER hQMixer, + LPVOID FAR* lplpIDirectSound + ); + + +// +// Return a pointer to the internal DirectSoundBuffer object. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetDirectSoundBuffer( + HQMIXER hQMixer, + int iChannel, + LPVOID FAR* lplpIDirectSoundBuffer +); + + +// +// Return TRUE if there are no more buffers playing or queued on the channel. +// This is an alternative to waiting for a WOM_DONE message to be sent to a +// window. +// +_QMIXIMP +BOOL +WINAPI +QSWaveMixIsChannelDone( + HQMIXER hQMixer, + int iChannel + ); + + +#define QMIX_CHANNELSTATUS_OPEN 0x01 // channel is open +#define QMIX_CHANNELSTATUS_QUEUED 0x02 // channel has a play request queued on it +#define QMIX_CHANNELSTATUS_PAUSED 0x04 // channel is paused +#define QMIX_CHANNELSTATUS_PLAYING 0x08 // channel is playing a sound +#define QMIX_CHANNELSTATUS_RESERVED 0x10 // channel is reserved from FindChannel for playing + +_QMIXIMP DWORD WINAPI +QSWaveMixGetChannelStatus( + HQMIXER hQMixer, + int iChannel + ); + + +#define QMIX_POSITION_BYTES 0 +#define QMIX_POSITION_SAMPLES 1 +#define QMIX_POSITION_MS 2 + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetPlayPosition( + HQMIXER hQMixer, + int iChannel, + LPMIXWAVE* lplpWave, + LPDWORD lpdwPosition, + DWORD dwFlags + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetPan( + HQMIXER hQMixer, + int iChannel, + LPDWORD lpdwPan + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetVolume( + HQMIXER hQMixer, + int iChannel, + LPDWORD lpdwVolume + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetPanRate( + HQMIXER hQMixer, + int iChannel, + LPDWORD lpdwRate + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetFrequency( + HQMIXER hQMixer, + int iChannel, + LPDWORD lpdwFrequency + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetPolarPosition( + HQMIXER hQMixer, + int iChannel, + QSPOLAR* lpQPosition + ); + + +//********************************************************************** +// Interface for 3d Cartesian Coordinate system. +// +// All measurements are in S.I. units, e.g. coordinates and room size are +// meters, velocity and speed of sound in m/s. +// + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetRoomSize( + HQMIXER hQMixer, + float roomSize, + DWORD dwFlags + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetSpeedOfSound( + HQMIXER hQMixer, + float speed, + DWORD dwFlags + ); + + +typedef struct QMIX_DISTANCES { + UINT cbSize; // size of structure (needed for future versions) + float minDistance; // sounds are at full volume if closer than this + float maxDistance; // sounds are muted if further away than this + float scale; // relative amount to adjust rolloff by +} QMIX_DISTANCES, *LPQMIX_DISTANCES; + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetDistanceMapping( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const LPQMIX_DISTANCES lpDistances + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetRoomSize( + HQMIXER hQMixer, + float* pfRoomSize + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetSpeedOfSound( + HQMIXER hQMixer, + float* pfSpeed + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetDistanceMapping( + HQMIXER hQMixer, + int iChannel, + LPQMIX_DISTANCES lpDistances + ); + +// +// Listener parameters. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetListenerPosition( + HQMIXER hQMixer, + const QSVECTOR* position, + DWORD dwFlags + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetListenerOrientation( + HQMIXER hQMixer, + const QSVECTOR* direction, + const QSVECTOR* up, + DWORD dwFlags + ); + +// +// Velocity is used solely to set Doppler shift. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetListenerVelocity( + HQMIXER hQMixer, + const QSVECTOR* velocity, + DWORD dwFlags + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetListenerRolloff( + HQMIXER hQMixer, + float rolloff, + DWORD dwFlags + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetListenerPosition( + HQMIXER hQMixer, + QSVECTOR* position + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetListenerOrientation( + HQMIXER hQMixer, + QSVECTOR* direction, + QSVECTOR* up + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetListenerVelocity( + HQMIXER hQMixer, + QSVECTOR* velocity + ); + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetSourcePosition( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QSVECTOR* position + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetSourceVelocity( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QSVECTOR* velocity + ); + +// +// Listener will hear full volume if inside source's cone, given by +// orientation and angle. If outside, source will be attenuated by +// additional attenuation. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetSourceCone( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QSVECTOR* orientation, + float coneAngle, + float ambient_db + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetSourceCone2( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QSVECTOR* orientation, + float innerConeAngle, + float outerConeAngle, + float ambient_db + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetSourcePosition( + HQMIXER hQMixer, + int iChannel, + QSVECTOR* position + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetSourceVelocity( + HQMIXER hQMixer, + int iChannel, + QSVECTOR* velocity + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetSourceCone( + HQMIXER hQMixer, + int iChannel, + QSVECTOR* orientation, + float* pfAngle, + float* ambient_db + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetSourceCone2( + HQMIXER hQMixer, + int iChannel, + QSVECTOR* orientation, + float* pfInnerAngle, + float* pfOuterAngle, + float* ambient_db + ); + + +//********************************************************************** +// Profiling functions. +// +typedef struct QMIX_PROFILE { + DWORD dwCalls; // number of times mixer thread was called + DWORD dwMixing; // time spent mixing + DWORD dwAudioDriver; // time spent calling audio driver (e.g. DirectSound) + DWORD dwTotal; // total time in mixer thread + DWORD dwDuration; // time during test +} QMIX_PROFILE, *LPQMIX_PROFILE; + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixStartProfile( + HQMIXER hQMixer + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixStopProfile( + HQMIXER hQMixer, + LPQMIX_PROFILE lpProfile, + UINT cbProfile + ); + + +//********************************************************************** +// Call QSWaveMixPump to force more mixing. Essential if mixer was +// configured with QMIX_CONFIG_NOTHREAD. +// +_QMIXIMP +void +WINAPI +QSWaveMixPump( + void); + + +//********************************************************************** +// Functions to shut down mixer. +// +// Note that, in versions 2.10 and later, that QSWaveMixFreeWave can be +// called with a null hQMixer if QSWaveMixCloseSession has been called. +// +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixFlushChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixCloseChannel( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixFreeWave( + HQMIXER hQMixer, + LPMIXWAVE lpMixWave + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixCloseSession( + HQMIXER hQMixer + ); + + +// +// Diagnostic codes available from QSWaveMixGetLastError. Equivalent strings +// can be recalled using QSWaveMixGetErrorText. +// +#define ERROR_QMIX_OK 0 // OK, no error. +#define ERROR_QMIX_CONFIGMISSING 1 // Can't find configuration (.ini) file. +#define ERROR_QMIX_MIXERHANDLE 2 // Mixer handle is null or invalid. +#define ERROR_QMIX_RESULTUNKNOWN 3 // Unknown error code. +#define ERROR_QMIX_MEMORY 4 // Out of memory. +#define ERROR_QMIX_EXCEPTIONUNKNOWN 5 // Unknown error. +#define ERROR_QMIX_WAVEOUTNONE 6 // No wave output devices. +#define ERROR_QMIX_DLLNAME 7 // Name of QMixer library is unavailable or invalid. +#define ERROR_QMIX_WAVEOUTINCOMPATIBLE 8 // The wave output device is incompatible with QMixer. +#define ERROR_QMIX_ACTIVATED 9 // Can't activate two QMixer sessions. +#define ERROR_QMIX_CHANNELINVALID 10 // Channel number is invalid. +#define ERROR_QMIX_OPENCHANNELFLAG 11 // Invalid flag for opening channel. +#define ERROR_QMIX_PANINVALID 12 // Invalid pan value. +#define ERROR_QMIX_NOTACTIVATED 13 // Mixer has not been activated. +#define ERROR_QMIX_CHANNELUNAVAILABLE 14 // No channels are available for playing this sound. +#define ERROR_QMIX_WAVERESOURCE 15 // Couldn't find or load resource containing wave data. +#define ERROR_QMIX_WAVEOPEN 16 // Couldn't open wave file. +#define ERROR_QMIX_WAVEFORMAT 17 // Format of wave data is corrupted. +#define ERROR_QMIX_ACMINVALID 18 // The ACM wave format couldn't be translated. +#define ERROR_QMIX_DSOUNDMISSING 19 // The DirectSound library dsound.dll could not be found. +#define ERROR_QMIX_DSOUNDCREATEADDR 20 // Could not find DirectSoundCreate function in dsound.dll. +#define ERROR_QMIX_DSOUNDCREATE 21 // Couldn't create DirectSound object. +#define ERROR_QMIX_DSOUNDCOOPERATIVE 22 // The cooperative level for DirectSound could not be set. +#define ERROR_QMIX_DSOUNDCAPS 23 // Couldn't determine DirectSound capabilities. +#define ERROR_QMIX_DSOUNDPRIMARY 24 // Couldn't create DirectSound primary buffer. +#define ERROR_QMIX_DSOUNDPRIMARYCAPS 25 // Couldn't determine DirectSound primary buffer capabilities. +#define ERROR_QMIX_DSOUNDFORMAT 26 // Couldn't set format of DirectSound output. +#define ERROR_QMIX_DSOUNDSECONDARY 27 // Couldn't create DirectSound secondary buffer. +#define ERROR_QMIX_DSOUNDPLAY 28 // Couldn't play DirectSound buffer. +#define ERROR_QMIX_WAVEOUTOPEN 29 // Wave output error while opening device. +#define ERROR_QMIX_WAVEOUTWRITE 30 // Wave output error while writing to device. +#define ERROR_QMIX_WAVEOUTCLOSE 31 // Wave output error while closing device. +#define ERROR_QMIX_PARAMPTR 32 // Parameter points to invalid location. +#define ERROR_QMIX_NOTIMPLEMENTED 33 // Feature is not implemented. +#define ERROR_QMIX_DSOUNDNODRIVER 34 // No DirectSound driver is available for use. +#define ERROR_QMIX_SMALLPRIMARY 35 // DirectSound primary buffer is too small. +#define ERROR_QMIX_UNKNOWNFORMAT 36 // Unknown sound file format. +#define ERROR_QMIX_DRIVENOTREADY 37 // Drive is not ready. +#define ERROR_QMIX_READERROR 38 // Error reading sound file. +#define ERROR_QMIX_UNKNOWNAIFC 39 // Unknown format of AIFF-C file. +#define ERROR_QMIX_MACRESOURCE 40 // Unable to obtain sampled sound data from resource. +#define ERROR_QMIX_SCINVALID 41 // The sound data format couldn't be translated. +#define ERROR_QMIX_MACSOUNDCAPS 42 // Couldn't retrieve Macintosh sound output capabilities. +#define ERROR_QMIX_MACCHANNEL 43 // Couldn't create sound channel. +#define ERROR_QMIX_MACCLEAR 44 // Couldn't clear sound channel. +#define ERROR_QMIX_MACPAUSE 45 // Couldn't pause sound channel. +#define ERROR_QMIX_MACQUEUE 46 // Couldn't queue data on sound channel. +#define ERROR_QMIX_MACRESUME 47 // Couldn't resume paused sound channel. +#define ERROR_QMIX_CATCH 48 // Caught unknown error. +#define ERROR_QMIX_HOLD 49 // Unable to prevent virtual memory from being paged. +#define ERROR_QMIX_INVALIDPARAM 50 // Invalid parameter. +#define ERROR_QMIX_DSB_STATUS 51 // Couldn't get DirectSound buffer status. +#define ERROR_QMIX_DSB_POSITION 52 // Couldn't get DirectSound buffer position. +#define ERROR_QMIX_DSOUNDMIXPRIMARY 53 // Can't mix into primary buffer (DirectSound driver is probably emulated). + + +/* set to byte packing so Win16 and Win32 structures will be the same */ +#pragma pack(1) + +typedef struct WAVEMIXINFO { + WORD wSize; + BYTE bVersionMajor; + BYTE bVersionMinor; + char szDate[12]; /* Mmm dd yyyy */ + DWORD dwFormats; /* see waveOutGetDevCaps (wavemix requires synchronous device) */ +} +WAVEMIXINFO, *PWAVEMIXINFO, FAR * LPWAVEMIXINFO; + +_QMIXIMP +WORD +WINAPI +QSWaveMixGetInfo( + LPWAVEMIXINFO lpWaveMixInfo + ); + + +// +// Constants, structure, and declaration for obsolete configuration function. +// + +#define WMIX_CONFIG_CHANNELS 0x0001 +#define WMIX_CONFIG_SAMPLINGRATE 0x0002 +#define WMIX_CONFIG_DIRECTSOUND 0x0004 +#define WMIX_CONFIG_USEPRIMARY 0x0008 +#define WMIX_CONFIG_INPUTCHANNELS 0x0010 +#define WMIX_CONFIG_OUTPUT 0x0020 +#define WMIX_CONFIG_LATENCY 0x0040 +#define WMIX_CONFIG_NOTHREAD 0x0080 + +#define WMIX_OUTPUT_WAVEOUT 0 +#define WMIX_OUTPUT_DIRECTSOUND 1 +#define WMIX_OUTPUT_NATIVEAUDIO 2 // not implemented + +typedef struct MIXCONFIG { + WORD wSize; + DWORD dwFlags; + WORD wChannels; // 1=MONO, 2=STEREO + WORD wSamplingRate; // 11=11025, 22=22050, 44=44100 Hz + LPVOID lpIDirectSound; + WORD wInputChannels; + WORD wOutput; + WORD wLatency; +} +MIXCONFIG, *PMIXCONFIG, FAR * LPMIXCONFIG; + +_QMIXIMP +HQMIXER +WINAPI +QSWaveMixConfigureInit( + LPMIXCONFIG lpConfig + ); + + +// +// Obsolete wave opening function. +// + +// +// Structure for opening waves that are already residing in memory. +// Note that the dwSamples parameter is a new field needed for using +// compressed data. To keep backwards compatibility, it is only used +// when QSWaveMixOpenWave is used with the QMIX_RESIDENT_COMPRESSED +// parameter. +// +#define QMIX_RESIDENT_COMPRESSED 0x0009 // QMIX_RESIDENT with valid dwSample parameter + +typedef struct QMEMRESIDENT { + PCMWAVEFORMAT* pcm; // format; LPWAVEFORMATEX works here too + HPSTR lpData; // pointer to memory resident audio samples + DWORD dwDataSize; // length of data, in bytes + WORD tag; // user-defined id (used in MIXWAVE.szWaveFilename) + DWORD dwSamples; // number of samples in compressed wave +} +QMEMRESIDENT, * PQMEMRESIDENT, FAR * LPQMEMRESIDENT; + +// +// Structure for a wave that will get audio from user callback function. +// +#if defined(_WIN32) + typedef void (__cdecl* LPQMIXSTREAMCALLBACK)(void* buffer, DWORD bytes, void* user); +#endif +#if defined(MACINTOSH) + typedef void (* LPQMIXSTREAMCALLBACK)(void* buffer, DWORD bytes, void* user); +#endif +typedef struct QINPUTSTREAM { + PCMWAVEFORMAT* pcm; // format of input data: must be in PCM + DWORD dwBlockLength; // preferred block length (bytes) + LPQMIXSTREAMCALLBACK callback; + // callback called when more data needed + void *user; // user data sent to callback + WORD tag; +} +QINPUTSTREAM, *PQINPUTSTREAM, FAR* LPQINPUTSTREAM; + +// +// Open wave file. The szWaveFilename parameter is one of the +// following: +// - name of file (QMIX_FILE and QMIX_FILESTREAM flags), +// - name of resource (also need to set hInst) (QMIX_RESOURCE flag), +// - LPQMEMRESIDENT pointer cast to LPSTR (QMIX_RESIDENT flag), +// - LPQINPUTSTREAM pointer cast to LPSTR (QMIX_INPUTSTREAM flag), +// - LPMMIOINFO pointer cast to LPSTR (QMIX_MEMORY flag), +// - FSSpec* pointer cast to LPSTR (on Macintosh) (QMIX_FILESPEC flag), +// +_QMIXIMP +LPMIXWAVE +WINAPI +QSWaveMixOpenWave( + HQMIXER hQMixer, + LPSTR szWaveFilename, // see notes above + HINSTANCE hInst, // only required when QMIX_RESOURCE flag set + DWORD dwFlags + ); + + +typedef struct QPOSITION { + int azimuth; // degrees; 0 is straight ahead, 90 is to the right + int range; // 0 to 32767; 0 is closest + int elevation; // -90 to 90 degrees +} QPOSITION, FAR* LPQPOSITION; + + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixSetPosition( + HQMIXER hQMixer, + int iChannel, + DWORD dwFlags, + const QPOSITION* lpQPosition + ); + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixGetPosition( + HQMIXER hQMixer, + int iChannel, + LPQPOSITION lpQPosition + ); + +// +// Obsolete play function. +// + +#define QMIX_USEPOSITION 0x10 // use the MIXPLAYPARAMS.position field + +typedef struct MIXPLAYPARAMS { + WORD wSize; // this must be set + HQMIXER hMixSession; // value returned by QSWaveMixInit or QSWaveMixConfigureInit + int iChannel; // channel number + LPMIXWAVE lpMixWave; // pointer returned by QSWaveMixOpenWave + HWND hWndNotify; // if set, WOM_OPEN and WOM_DONE notification messages sent here + DWORD dwFlags; + WORD wLoops; // 0xFFFF means loop forever + int qVolume; // initial volume; set to -1 to use default + int qPanPos; // initial pan position; set to -1 to use default + LPMIXWAVE lpImage; // set to preprocessed data for high performance + QPOSITION position; // initial position (used only if QMIX_USEPOSITION set) +} +MIXPLAYPARAMS, * PMIXPLAYPARAM, FAR* LPMIXPLAYPARAMS; + +_QMIXIMP +MMRESULT +WINAPI +QSWaveMixPlay( + LPMIXPLAYPARAMS lpMixPlayParams + ); + + +/* return to default packing */ +#pragma pack() + +// +// Obsolete constants. +// +#define WMIX_ALL QMIX_ALL +#define WMIX_NOREMIX QMIX_NOREMIX +#define WMIX_CONTROL_NOREMIX QMIX_CONTROL_NOREMIX + +#define WMIX_OPENSINGLE QMIX_OPENSINGLE +#define WMIX_OPENALL QMIX_OPENALL +#define WMIX_OPENCOUNT QMIX_OPENCOUNT +#define WMIX_OPENAVAILABLE QMIX_OPENAVAILABLE + +#define WMIX_FILE QMIX_FILE +#define WMIX_RESOURCE QMIX_RESOURCE +#define WMIX_MEMORY QMIX_MEMORY +#define WMIX_RESIDENT QMIX_RESIDENT +#define WMIX_FILESTREAM QMIX_FILESTREAM +#define WMIX_INPUTSTREAM QMIX_INPUTSTREAM + +#define WMIX_QUEUEWAVE QMIX_QUEUEWAVE +#define WMIX_CLEARQUEUE QMIX_CLEARQUEUE +#define WMIX_USELRUCHANNEL QMIX_USELRUCHANNEL +#define WMIX_HIPRIORITY QMIX_HIPRIORITY +#define WMIX_HIGHPRIORITY QMIX_HIGHPRIORITY +#define WMIX_WAIT QMIX_WAIT +#define WMIX_USEPOSITION QMIX_USEPOSITION + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 9a87d37..80d28ca 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4ba9b297fe64848f5b2fc2ec464edf523c15537cec300708587e072b69b6d175 -size 622080 +oid sha256:b4a56c750b4f879d9a6bf014e56fa028e80775f98c19db9213fcbf8567169193 +size 622592 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 89e6f9f..f250f67 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd5ee4d4d589d7580de254177665f34b2c8ead891982d3700123f29cecc90cc3 -size 546304 +oid sha256:b1fae4424d81cb9fc6c32e8a30525dc678480e1bc9c40784d2b528a6d736f9bb +size 546816 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index 5d59aee..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,64 +0,0 @@ -[window] -posx=1313 -posy=581 -sizx=320 -sizy=200 -lang=default -exepath=D:\Games\Kasbrik\ -;lang=automatic -;updatepaths=1 -;debug=1 -;multiprocesshook=0 -;checkadmin=0 -[texture] -MinTexX=16 -MaxTexX=0 -MinTexY=16 -MaxTexY=0 -[keymapping] -timetoggle=0x72 -altf4=0x73 -timeslow=0x74 -timefast=0x75 -cliptoggle= -refresh= -logtoggle= -plocktoggle= -fpstoggle= -printscreen=0x7B -corner=0x7A -freezetime=0x79 - - -[target] -title0=Kasbrik 3D -path0=D:\Games\Kasbrik\Kasbrik.exe -launchpath0= -module0= -opengllib0= -notes0= -registry0= -ver0=8 -coord0=0 -flag0=136314914 -flagg0=1207959552 -flagh0=20 -flagi0=138412036 -flagj0=4224 -flagk0=327680 -tflag0=0 -initx0=0 -inity0=0 -minx0=0 -miny0=0 -maxx0=0 -maxy0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=-1 -swapeffect0=0 diff --git a/build/exports/Age of Empires.dxw b/build/exports/Age of Empires.dxw index b8e909f..7b47328 100644 --- a/build/exports/Age of Empires.dxw +++ b/build/exports/Age of Empires.dxw @@ -6,7 +6,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -26,3 +26,7 @@ initts0=0 winver0=0 maxres0=-1 flagj0=128 +notes0= +registry0= +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Croc 2.dxw b/build/exports/Croc 2.dxw index d24154e..ec5b60c 100644 --- a/build/exports/Croc 2.dxw +++ b/build/exports/Croc 2.dxw @@ -6,7 +6,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1207959552 flagh0=20 flagi0=138412036 @@ -27,3 +27,6 @@ winver0=0 maxres0=-1 notes0= flagj0=128 +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Dark Colony.dxw b/build/exports/Dark Colony.dxw index 31fed2d..f23cefd 100644 --- a/build/exports/Dark Colony.dxw +++ b/build/exports/Dark Colony.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134218272 +flag0=134218274 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -26,3 +26,7 @@ winver0=0 maxres0=-1 launchpath0= flagj0=128 +notes0= +registry0= +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Dark Planet Battle for Natrolis.dxw b/build/exports/Dark Planet Battle for Natrolis.dxw index 8094d4a..3cc87aa 100644 --- a/build/exports/Dark Planet Battle for Natrolis.dxw +++ b/build/exports/Dark Planet Battle for Natrolis.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=671088675 -flagg0=1208025088 +flagg0=1207959552 flagh0=20 -flagi0=4194316 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -27,5 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/Dark Vengeance.dxw b/build/exports/Dark Vengeance.dxw index 5e8c151..307d6ea 100644 --- a/build/exports/Dark Vengeance.dxw +++ b/build/exports/Dark Vengeance.dxw @@ -26,3 +26,7 @@ winver0=0 maxres0=-1 launchpath0= flagj0=128 +notes0= +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/Darkened Skye.dxw b/build/exports/Darkened Skye.dxw index a7c1926..1fa83fe 100644 --- a/build/exports/Darkened Skye.dxw +++ b/build/exports/Darkened Skye.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=679493666 +flag0=679493682 flagg0=1207959552 flagh0=65556 flagi0=69206020 @@ -14,8 +14,8 @@ initx0=0 inity0=0 minx0=0 miny0=0 -maxx0=0 -maxy0=0 +maxx0=800 +maxy0=600 posx0=50 posy0=50 sizx0=800 @@ -27,5 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/DeathSpank The Baconing.dxw b/build/exports/DeathSpank The Baconing.dxw index 854119a..c94cdeb 100644 --- a/build/exports/DeathSpank The Baconing.dxw +++ b/build/exports/DeathSpank The Baconing.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=9 coord0=0 -flag0=134218272 +flag0=-2013265376 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,9 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +registry0= +flagj0=0 +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Dracula Twins.dxw b/build/exports/Dracula Twins.dxw index f3774e5..66785bb 100644 --- a/build/exports/Dracula Twins.dxw +++ b/build/exports/Dracula Twins.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,11 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +notes0= +registry0= +flagj0=128 +flagk0=0 +winver0=0 +maxres0=0 +swapeffect0=0 diff --git a/build/exports/Dune 2000.dxw b/build/exports/Dune 2000.dxw index 328d89a..84115c1 100644 --- a/build/exports/Dune 2000.dxw +++ b/build/exports/Dune 2000.dxw @@ -12,7 +12,7 @@ flagg0=1207959568 flagh0=20 flagi0=4194308 flagj0=128 -flagk0=0 +flagk0=32768 tflag0=0 initx0=0 inity0=0 @@ -29,3 +29,4 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +registry0= diff --git a/build/exports/Earthworm Jim 3D.dxw b/build/exports/Earthworm Jim 3D.dxw index cdc01c8..430093f 100644 --- a/build/exports/Earthworm Jim 3D.dxw +++ b/build/exports/Earthworm Jim 3D.dxw @@ -6,10 +6,10 @@ opengllib0= ver0=0 coord0=0 flag0=134217762 -flagg0=1212153856 +flagg0=1213202432 flagh0=65556 flagi0=4194308 -tflag0=6147 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,5 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/Echelon.dxw b/build/exports/Echelon.dxw index f978d4a..8537efb 100644 --- a/build/exports/Echelon.dxw +++ b/build/exports/Echelon.dxw @@ -27,5 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/Ed Hunter.dxw b/build/exports/Ed Hunter.dxw index 743b133..a3a58a1 100644 --- a/build/exports/Ed Hunter.dxw +++ b/build/exports/Ed Hunter.dxw @@ -27,5 +27,6 @@ maxres0=-1 launchpath0= notes0= flagj0=128 -flagk0=0 +flagk0=98304 swapeffect0=0 +registry0= diff --git a/build/exports/Hexplore.dxw b/build/exports/Hexplore.dxw index eb0303f..c973580 100644 --- a/build/exports/Hexplore.dxw +++ b/build/exports/Hexplore.dxw @@ -6,7 +6,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134234146 +flag0=134236194 flagg0=1207959552 flagh0=20 flagi0=138412036 @@ -26,3 +26,7 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +notes0= +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/House of the Dead 2.dxw b/build/exports/House of the Dead 2.dxw index c022a51..d416ca6 100644 --- a/build/exports/House of the Dead 2.dxw +++ b/build/exports/House of the Dead 2.dxw @@ -6,7 +6,7 @@ opengllib0= ver0=0 coord0=0 flag0=738197538 -flagg0=1207959552 +flagg0=1744830464 flagh0=20 flagi0=4194308 tflag0=0 @@ -29,3 +29,4 @@ notes0= flagj0=128 flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/Hydro Thunder.dxw b/build/exports/Hydro Thunder.dxw index d952464..26cb925 100644 --- a/build/exports/Hydro Thunder.dxw +++ b/build/exports/Hydro Thunder.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=704643106 +flag0=706740258 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -29,3 +29,4 @@ notes0= flagj0=128 flagk0=65536 swapeffect0=0 +registry0= diff --git a/build/exports/Jazz Jackrabbit 2.dxw b/build/exports/Jazz Jackrabbit 2.dxw index a01a21a..fda43f3 100644 --- a/build/exports/Jazz Jackrabbit 2.dxw +++ b/build/exports/Jazz Jackrabbit 2.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=671097376 +flag0=671097378 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,9 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +registry0= +flagj0=0 +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Jeff Gordon XS Racing demo.dxw b/build/exports/Jeff Gordon XS Racing demo.dxw index 1c4b335..aea3e5e 100644 --- a/build/exports/Jeff Gordon XS Racing demo.dxw +++ b/build/exports/Jeff Gordon XS Racing demo.dxw @@ -7,7 +7,7 @@ opengllib0= notes0= ver0=0 coord0=0 -flag0=671088928 +flag0=740294690 flagg0=1476395008 flagh0=20 flagi0=138412036 @@ -27,3 +27,6 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/exports/KKND Xtreme.dxw b/build/exports/KKND Xtreme.dxw index 385b289..919a720 100644 --- a/build/exports/KKND Xtreme.dxw +++ b/build/exports/KKND Xtreme.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=402669600 +flag0=402669602 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -26,4 +26,7 @@ winver0=0 maxres0=-1 launchpath0= notes0= -flagj0=8388736 +flagj0=128 +registry0= +flagk0=65536 +swapeffect0=0 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 539309d..ab8f15a 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -981,3 +981,10 @@ fix: completely revised directinput hooking to manage multiple devices acquire/u fix: added some dinput error codes to log messages fix: increased time freeze toggle key hysteresis time to 1 sec to avoid multiple activations +v2.03.48 +fix: set proper surface capabilities for 3DDEVICE surfaces, according to VIDEOMEMORY capability. +add: "force clipper" flag to redirect clipper definition to main window and primary surface +fix: better handling of surfaces on minimize / restore events, mainly on WinXP +fix: proper default values for"Share ddraw and GDI DC" and "Lock/Unlock Pitch Fix" flags + + diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index fb390c1..423214d 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -8,7 +8,8 @@ #include "hddraw.h" #include "dxhelper.h" -//extern LPDIRECTDRAWSURFACE lpDDSBack; +#define FIXBIGGERRECT 1 + extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim; extern LPDIRECTDRAW lpPrimaryDD; extern Blt_Type pBlt; @@ -37,8 +38,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest //extern PrimaryBlt_Type pPrimaryBlt; //CkArg arg; - //FromScreen=dxwss.IsAPrimarySurface(lpddssrc) && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 - FromScreen=dxwss.IsAPrimarySurface(lpddssrc); // ghogho + FromScreen=dxwss.IsAPrimarySurface(lpddssrc); // make a working copy of srcrect if not NULL if (lpsrcrect){ @@ -136,7 +136,6 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest } #endif -#define FIXBIGGERRECT 1 #if FIXBIGGERRECT if(lpdestrect){ if((DWORD)lpdestrect->top < 0) lpdestrect->top = 0; @@ -163,6 +162,12 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest destrect.left, destrect.top, destrect.right, destrect.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); + // v2.03.48: on WinXP it may happen (reported by Cloudstr) that alt tabbing produces + // bad blit attempts where the client coordinates get the (-32000,-32000) - (-32000,-32000) + // value. In such cases, it's adviseable to simulate an OK return code without attempting + // any blit operation! + if(destrect.left == -32000) return DD_OK; // no blit on invisible window + if(!lpddssrc) { if (isFlipping){ // handle the flipping chain ... diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 5754549..62ce43b 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1093,6 +1093,8 @@ static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) SetHook((void *)(**(DWORD **)lplpDDClipper + 8), extReleaseC, (void **)&pReleaseC, "Release(C)"); // IDirectDrawClipper::GetClipList SetHook((void *)(**(DWORD **)lplpDDClipper + 12), extGetClipList, (void **)&pGetClipList, "GetClipList(C)"); + // IDirectDrawClipper::SetHWnd + SetHook((void *)(**(DWORD **)lplpDDClipper + 32), extSetHWndProxy, (void **)&pSetHWnd, "SetHWnd(C)"); if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; // Just proxed ... @@ -1109,8 +1111,6 @@ static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) SetHook((void *)(**(DWORD **)lplpDDClipper + 24), extIsClipListChangedProxy, (void **)&pIsClipListChanged, "IsClipListChanged(C)"); // IDirectDrawClipper::SetClipList SetHook((void *)(**(DWORD **)lplpDDClipper + 28), extSetClipListProxy, (void **)&pSetClipList, "SetClipList(C)"); - // IDirectDrawClipper::SetHWnd - SetHook((void *)(**(DWORD **)lplpDDClipper + 32), extSetHWndProxy, (void **)&pSetHWnd, "SetHWnd(C)"); return; } @@ -2203,12 +2203,19 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) lpddsd->ddsCaps.dwCaps = DDSCAPS_ZBUFFER; return; } - - if((lpddsd->dwFlags & DDSD_CAPS) && - (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) // v2.02.90: added for "Zoo Tycoon" textures - { // 3DDEVICE no TEXTURE: enforce PIXELFORMAT on MEMORY + + // 3DDEVICE no TEXTURE: enforce PIXELFORMAT + // v2.02.90: added for "Zoo Tycoon" textures + // v2.03.48 - there are two situations + // "Arx fatalis" asks for DDSCAPS_3DDEVICE+DDSCAPS_OFFSCREENPLAIN capability and needs no DDSCAPS_SYSTEMMEMORY capability + // "Bunnies must die" asks for DDSCAPS_3DDEVICE+DDSCAPS_OFFSCREENPLAIN+DDSCAPS_VIDEOMEMORY capability and requires DDSCAPS_SYSTEMMEMORY capability + // we try to manage them by checking for the DDSCAPS_VIDEOMEMORY capability ... + if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)){ lpddsd->dwFlags |= DDSD_PIXELFORMAT; - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE); + if(lpddsd->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) + lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY); // good for "Bunnies must die", NO "Arx Fatalis" + else + lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE); // good for "Arx Fatalis", NO "Bunnies must die" GetPixFmt(lpddsd); return; } @@ -3207,12 +3214,24 @@ HRESULT WINAPI PrimaryBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECT HRESULT WINAPI PrimaryFastBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) { + HRESULT res; RECT client; int iXOffset, iYOffset; // offsets to center surface area to window (*pGetClientRect)(dxw.GethWnd(), &client); iXOffset = (client.right - dxw.GetScreenWidth()) >> 1; iYOffset = (client.bottom - dxw.GetScreenHeight()) >> 1; - return (*pBltFast)(lpdds, iXOffset + lpdestrect->left, iYOffset + lpdestrect->top, lpddssrc, lpsrcrect, DDBLTFAST_WAIT); + if(dxw.dwFlags3 & FORCECLIPPER){ + RECT destrect; + destrect.left = iXOffset + lpdestrect->left; + destrect.right = iXOffset + lpdestrect->right; + destrect.top = iYOffset + lpdestrect->top; + destrect.bottom = iYOffset + lpdestrect->bottom; + res = (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, DDBLT_WAIT, 0); + } + else { + res= (*pBltFast)(lpdds, iXOffset + lpdestrect->left, iYOffset + lpdestrect->top, lpddssrc, lpsrcrect, DDBLTFAST_WAIT); + } + return res; } HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) @@ -3270,8 +3289,14 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L } else { // fast-blit to primary - res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); - if(res) OutTraceE("PrimaryStretchBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(dxw.dwFlags3 & FORCECLIPPER){ + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); + if(res) OutTraceE("PrimaryStretchBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } + else{ + res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); + if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } } (*pReleaseS)(lpddsTmp); return res; @@ -3423,8 +3448,14 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, // fast-blit to primary (*pUnlockMethod(lpddssrc))(lpddssrc, NULL); (*pUnlockMethod(lpddsTmp))(lpddsTmp, NULL); - res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); - if(res) OutTraceE("PrimaryBilinearBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(dxw.dwFlags3 & FORCECLIPPER) { + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); + if(res) OutTraceE("PrimaryBilinearBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } + else { + res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); + if(res) OutTraceE("PrimaryBilinearBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } (*pReleaseS)(lpddsTmp); if(lpddsCopy) (*pReleaseS)(lpddsCopy); return res; @@ -3850,16 +3881,30 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd if(dxw.dwFlags1 & SUPPRESSCLIPPING) return 0; if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ - if ((isPrim && lpDDSEmu_Prim) || - (dxwss.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ - OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); - res=0; + if (dxw.dwFlags3 & FORCECLIPPER){ + // v2.03.48: FORCECLIPPER ensures that a valid clipper is issued on the real primary surface + // and on the main game window. Then, you won't be able to BltFast any longer.... + if ((isPrim || dxwss.IsABackBufferSurface(lpdds)) && lpDDSEmu_Prim){ + OutTraceDW("SetClipper: redirect surface to primary hwnd=%x lpdds=%x%s->%x\n", + dxw.GethWnd(), lpdds, isPrim?"(PRIM)":"", lpDDSEmu_Prim); + res=(*pSetHWnd)(lpddc, 0, dxw.GethWnd()); + //res=lpddc->SetHWnd(0, dxw.GethWnd()); + if (res) OutTraceE("SetClipper: SetHWnd ERROR res=%x(%s)\n", res, ExplainDDError(res)); + res=(*pSetClipper)(lpDDSEmu_Prim, lpddc); + if (res) OutTraceE("SetClipper: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + return res; + } + } + else { + if ((isPrim && lpDDSEmu_Prim) || + (dxwss.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ + OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); + return 0; + } } - else - res=(*pSetClipper)(lpdds, lpddc); } - else - res=(*pSetClipper)(lpdds, lpddc); + + res=(*pSetClipper)(lpdds, lpddc); if (res) OutTraceE("SetClipper: ERROR res=%x(%s)\n", res, ExplainDDError(res)); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 4a90362..dd565e2 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -55,7 +55,7 @@ CRITICAL_SECTION TraceCS; static char *FlagNames[32]={ "UNNOTIFY", "EMULATESURFACE", "CLIPCURSOR", "RESETPRIMARY", "HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD", - "EMULATEBUFFER", "--AUTOMATIC--", "BLITFROMBACKBUFFER", "SUPPRESSCLIPPING", + "EMULATEBUFFER", "HOOKDI8", "BLITFROMBACKBUFFER", "SUPPRESSCLIPPING", "AUTOREFRESH", "FIXWINFRAME", "HIDEHWCURSOR", "SLOWDOWN", "ENABLECLIPPING", "LOCKWINSTYLE", "MAPGDITOPRIMARY", "FIXTEXTOUT", "KEEPCURSORWITHIN", "USERGB565", "SUPPRESSDXERRORS", "PREVENTMAXIMIZE", @@ -866,7 +866,7 @@ void HookModule(HMODULE base, int dxversion) HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for? HookAVIFil32(base); //HookSmackW32(base); - //if (HOOKDIRECTSOUND) HookDirectSound(base); + //if (HOOKDIRECTSOUND) HookDirectSound(base); //HookComDlg32(base); } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index a98ff3d..483f90f 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -674,6 +674,17 @@ void dxwCore::MapClient(LPPOINT lppoint) lppoint->y= ((lppoint->y * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; } +//void dxwCore::MapClient(float *SX, float *SY) +//{ +// RECT client; +// int w, h; +// if(!(*pGetClientRect)(hWnd, &client)) return; +// w = client.right ? client.right : iSizX; +// h = client.bottom ? client.bottom : iSizY; +// *SX= (*SX * (float)w) / (float)dwScreenWidth; +// *SY= (*SY * (float)h) / (float)dwScreenHeight; +//} + void dxwCore::MapClient(int *nXDest, int *nYDest) { RECT client; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 8fe2003..f576e69 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -69,6 +69,7 @@ public: // methods void MapClient(LPRECT); void MapClient(int *, int *, int *, int *); void MapClient(int *, int *); + //void MapClient(float *, float *); void UnmapClient(LPPOINT); void UnmapClient(int *, int *); void UnmapClient(LPRECT); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index ed97561..e2fb9d6 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.47" +#define VERSION "2.03.48" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 10a43ca07ef0fc8c532bf2381e924a144d360ffc..98895f4a3a7b96f1e601869d77a9325690c564ab 100644 GIT binary patch delta 28010 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 z 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 - - diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index d5cea72..476052a 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -860,6 +860,12 @@ HRESULT WINAPI extSetViewport(void *lpvp, LPD3DVIEWPORT vpd) OutTraceD3D("SetViewport: viewport=%x viewportd=%x size=%d pos=(%d,%d) dim=(%dx%d) scale=(%fx%f) maxXYZ=(%f,%f,%f) minZ=%f\n", lpvp, vpd, vpd->dwSize, vpd->dwX, vpd->dwY, vpd->dwWidth, vpd->dwHeight, vpd->dvScaleX, vpd->dvScaleY, vpd->dvMaxX, vpd->dvMaxY, vpd->dvMaxZ, vpd->dvMinZ); + + // v2.03.48: scaled dvScaleX/Y fields. Fixes "Dark Vengeance" viewport size when using D3D interface. + // no.... see Forsaken + //dxw.MapClient(&vpd->dvScaleX, &vpd->dvScaleY); + //OutTraceDW("SetViewport: FIXED scale=(%fx%f)\n", vpd->dvScaleX, vpd->dvScaleY); + res=(*pSetViewport)(lpvp, vpd); if(res) OutTraceE("SetViewport ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("SetViewport: OK\n"); @@ -872,6 +878,7 @@ HRESULT WINAPI extGetViewport(void *lpvp, LPD3DVIEWPORT vpd) OutTraceD3D("GetViewport: viewport=%x viewportd=%x\n", lpvp, vpd); res=(*pGetViewport)(lpvp, vpd); + // v2.03.48: should the dvScaleX/Y fields be unscaled? if(res) OutTraceE("GetViewport ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("GetViewport: OK size=%d pos=(%d,%d) dim=(%dx%d) scale=(%fx%f) maxXYZ=(%f,%f,%f) minZ=%f\n", vpd->dwSize, vpd->dwX, vpd->dwY, vpd->dwWidth, vpd->dwHeight, vpd->dvScaleX, vpd->dvScaleY, diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index b859a5c..63781ac 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -30,6 +30,7 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Radio(pDX, IDC_NOEMULATESURFACE, cTarget->m_DxEmulationMode); DDX_Radio(pDX, IDC_DDRAWFILTER, cTarget->m_DxFilterMode); DDX_Check(pDX, IDC_SUPPRESSCLIPPING, cTarget->m_SuppressClipping); + DDX_Check(pDX, IDC_FORCECLIPPER, cTarget->m_ForceClipper); DDX_Check(pDX, IDC_BLITFROMBACKBUFFER, cTarget->m_BlitFromBackBuffer); DDX_Check(pDX, IDC_AUTOREFRESH, cTarget->m_AutoRefresh); DDX_Check(pDX, IDC_TEXTUREFORMAT, cTarget->m_TextureFormat); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index e0f2a19..c0d6bd4 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -93,6 +93,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_FreezeInjectedSon = FALSE; m_StressResources = FALSE; m_DisableFogging = FALSE; + m_Power2Width = FALSE; + m_FixPitch = FALSE, m_NoPower2Fix = FALSE; m_NoPerfCounter = FALSE; m_UnNotify = FALSE; @@ -120,6 +122,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_BlitFromBackBuffer = FALSE; m_NoFlipEmulation = FALSE; m_SuppressClipping = FALSE; + m_ForceClipper = FALSE; m_DisableGammaRamp = FALSE; m_AutoRefresh = FALSE; m_TextureFormat = FALSE; @@ -128,7 +131,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_CursorClipping = FALSE; m_VideoToSystemMem = FALSE; m_FixTextOut = FALSE; - m_SharedDC = TRUE; // seems better ..... + m_SharedDC = FALSE; m_HookGlide = FALSE; m_RemapMCI = TRUE; m_NoMovies = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index fffb53f..b6f6983 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -84,6 +84,7 @@ public: BOOL m_BlitFromBackBuffer; BOOL m_NoFlipEmulation; BOOL m_SuppressClipping; + BOOL m_ForceClipper; BOOL m_DisableGammaRamp; BOOL m_AutoRefresh; BOOL m_TextureFormat; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 629abd5c15f3f0981f2b5791066634effff9d6c4..4fbf6db92e83bf61a15af5bb881dc21de10afee8 100644 GIT binary patch delta 3652 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 LW+$YVXruv3gvJ)K diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index bb425085d42c0c8051f8c136fe8fa263749e0a5a..c077dc7787def4ea19aa05759b9899d79ba23e5f 100644 GIT binary patch delta 1428 zcmd5*QEXFH7(V~)J>BhAwzh1u;M(4`z0lxR#)eB#mW{EgtnFwP5~pl31&Ju?#F}(w zaaRQO$*lc&8j~0wa4|EW*C%4IQy%0^2#Ln{fQb)2AtspMgUtWluAM&lWa7EG=l(=*D1tc19;wMuwPFdOPuR9nTMIkoulH`PT3XY?guVWLob(M!`?wow?00K=>w@`mFhs;yU{GGvadV&L&30Lt=vGf_PlKWUaOi zlas8aO6iU=ol1B;xR0ypD{Z;S)!|WU4_%}oSC`AG_jxM`*A}q$lv*K0pvUp9L z5Qo{;#UtXFIPRbhNoAT{FF-va3f)*q8%Tz_q@78}wWU7fG68%$6QB)vC43Oyw{fD5mrdj2fC1jkJ*iEWWSf(xOj3$D{^|`XQ9Jj$vL` z(HyozTWfUZ+dp^cW@Bx*TnNYnM~q`nPg?fyag)|u{A!T8tD0K*zD&L6u$bnDe-8Mw z2D1e|d`zJ{_QYD0h`<{&M_e%>tho^)+*pd@W+qrY6T+FM;BUpzocb!FWtdNs>jHmUUSAU%(j>=TZ9 zovfa*mU}aKFnRVE%16g&GyXg^Nn3GB)@T4V47?_Qv(0%a=rh2=u<-!kt0T3R; ALI3~& delta 1114 zcmd5)T}V?=96#so-s?X6*axj?Ynz+O2r*}2%M!nqlujLCA||+Mfs~fS2=zg4W*<-C z_LIPw8W!S8D7?`_L=5r4pa&75mk5P|p27zUd&$l%HX#an?7+GA{Qm#n|Lb>-^of%` za8JD|zKIZmqbdg$#ZV+z8RfeL|HtPmE?nVP)OzOJW(#*DHxgi-CORkUlruEN>h(HLK$6I-tIT5UnfEw zUCNnDVIndQWlUL}b%csEjX_PSL|7jX1ZK%dSvK`esL@wo$WSdPlWTW8hJaAQxVof8 z4jY>(HKpLDX@paC{$boF=Bf-9NG_8L?5p&$Z9YbY8U}VHqeUk}R|)zpCs1Q3k7h3_ z;?PF + + + + + + + + + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 2983e35..906054b 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -321,6 +321,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_BlitFromBackBuffer) t->flags |= BLITFROMBACKBUFFER; if(dlg->m_NoFlipEmulation) t->flags4 |= NOFLIPEMULATION; if(dlg->m_SuppressClipping) t->flags |= SUPPRESSCLIPPING; + if(dlg->m_ForceClipper) t->flags3 |= FORCECLIPPER; if(dlg->m_DisableGammaRamp) t->flags2 |= DISABLEGAMMARAMP; if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH; if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT; @@ -567,6 +568,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0; dlg->m_NoFlipEmulation = t->flags4 & NOFLIPEMULATION ? 1 : 0; dlg->m_SuppressClipping = t->flags & SUPPRESSCLIPPING ? 1 : 0; + dlg->m_ForceClipper = t->flags3 & FORCECLIPPER ? 1 : 0; dlg->m_DisableGammaRamp = t->flags2 & DISABLEGAMMARAMP ? 1 : 0; dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0; dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 1 : 0; diff --git a/host/resource b/host/resource index e023a091352cc479231e8747a426789b6174dede..1e6ee5683acce2d264c861560d8810702360cd3b 100644 GIT binary patch delta 40 ycmV+@0N4NYr~=HX0m2PKmrYX+0zZydAAZK@_K`3{i) delta 18 acmX@JlIhC|rVSf%CoAPkZC1)#r3L_276>!|