210 lines
6.8 KiB
C
210 lines
6.8 KiB
C
|
/****************************************************************************
|
||
|
|
||
|
Task State : MCIAVI has a separate background task for every open
|
||
|
instance of mciavi. The task handle and task state are stored in
|
||
|
the per-instance data structure. The task can be in one of four
|
||
|
states.
|
||
|
|
||
|
TASKABORT : Set by the AVI task when it fails to open the requested
|
||
|
file during initialisation.
|
||
|
|
||
|
|
||
|
N.B. TASKINIT is no longer used
|
||
|
TASKINIT : This is the initial task state set when the
|
||
|
instance data structure is initialized in mwOpenDevice()
|
||
|
before the actual task is created by mmTaskCreate().
|
||
|
After the task is created, mwOpenDevice() waits until
|
||
|
the task state changes to TASKIDLE before returning
|
||
|
success so that the background task is definitely initialized
|
||
|
after an open call.
|
||
|
|
||
|
TASKIDLE : The task sets the state to TASKIDLE and blocks whenever
|
||
|
there is nothing to do. When the task wakes, the state is either
|
||
|
TASKCLOSE if the instance is being closed or else TASKBUSY
|
||
|
if the task is to begin recording or playback of the file.
|
||
|
|
||
|
TASKCLOSE : mwCloseDevice() stops playback or recording which forces
|
||
|
the task state to TASKIDLE and then sets the state to TASKCLOSE and
|
||
|
wakes the task so that the task will destroy itself.
|
||
|
|
||
|
TASKSTARTING: The task is in this state when it is initializing for
|
||
|
playback, but hasn't started yet. This is used so that the calling
|
||
|
task can wait for play to start before returning "no error" as the
|
||
|
result of an MCI play command.
|
||
|
|
||
|
TASKCUEING: The task is in this state when it is reading extra
|
||
|
records and buffering up audio before actually starting to play.
|
||
|
|
||
|
TASKPAUSED: The task is in this state while it is paused.
|
||
|
TASKPLAYING: The task is in this state during playback
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
#define TASKABORT 0
|
||
|
//#define TASKBEINGCREATED 1
|
||
|
//#define TASKINIT 2
|
||
|
#define TASKIDLE 3
|
||
|
#define TASKSTARTING 4
|
||
|
#define TASKCUEING 5
|
||
|
#define TASKPLAYING 6
|
||
|
#define TASKPAUSED 7
|
||
|
#define TASKCLOSE 8
|
||
|
// 9
|
||
|
// 10
|
||
|
//#define TASKREADINDEX 11
|
||
|
//#define TASKRELOAD 12
|
||
|
|
||
|
|
||
|
|
||
|
// inter-thread requests - from user to worker
|
||
|
#define AVI_CLOSE 1
|
||
|
#define AVI_PLAY 2
|
||
|
#define AVI_STOP 3
|
||
|
#define AVI_REALIZE 4
|
||
|
#define AVI_UPDATE 5
|
||
|
#define AVI_PAUSE 6
|
||
|
#define AVI_CUE 7
|
||
|
#define AVI_SEEK 8
|
||
|
#define AVI_WINDOW 9
|
||
|
#define AVI_SETSPEED 10
|
||
|
#define AVI_MUTE 11
|
||
|
#define AVI_SETVOLUME 12
|
||
|
#define AVI_AUDIOSTREAM 13
|
||
|
#define AVI_VIDEOSTREAM 14
|
||
|
#define AVI_PUT 15
|
||
|
#define AVI_PALETTE 16
|
||
|
#define AVI_RESUME 17
|
||
|
#define AVI_GETVOLUME 18
|
||
|
#define AVI_WAVESTEAL 19
|
||
|
#define AVI_WAVERETURN 20
|
||
|
#define AVI_PALETTECOLOR 21
|
||
|
|
||
|
|
||
|
/* A function back in device.c */
|
||
|
void NEAR PASCAL ShowStage(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
//
|
||
|
// call this to RTL to AVIFile.
|
||
|
//
|
||
|
BOOL FAR InitAVIFile(NPMCIGRAPHIC npMCI);
|
||
|
BOOL FAR FreeAVIFile(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
/* Functions in avitask.c */
|
||
|
void FAR PASCAL _LOADDS mciaviTask(DWORD_PTR dwInst);
|
||
|
void FAR PASCAL mciaviTaskCleanup(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
/* Functions in aviplay.c */
|
||
|
UINT NEAR PASCAL mciaviPlayFile(NPMCIGRAPHIC npMCI, BOOL bSetEvent);
|
||
|
|
||
|
/* Functions in avidraw.c */
|
||
|
/* !!! Should this be externally visible? */
|
||
|
BOOL NEAR PASCAL DoStreamUpdate(NPMCIGRAPHIC npMCI, BOOL fPaint);
|
||
|
void NEAR PASCAL StreamInvalidate(NPMCIGRAPHIC npMCI, LPRECT prc);
|
||
|
|
||
|
UINT NEAR PASCAL PrepareDC(NPMCIGRAPHIC npMCI);
|
||
|
void NEAR PASCAL UnprepareDC(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
BOOL FAR PASCAL DrawBegin(NPMCIGRAPHIC npMCI, BOOL FAR *fRestart);
|
||
|
void NEAR PASCAL DrawEnd(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
BOOL NEAR PASCAL DisplayVideoFrame(NPMCIGRAPHIC npMCI, BOOL fHurryUp);
|
||
|
BOOL NEAR PASCAL ProcessPaletteChange(NPMCIGRAPHIC npMCI, DWORD cksize);
|
||
|
|
||
|
|
||
|
/* Functions in avisound.c */
|
||
|
BOOL NEAR PASCAL PlayRecordAudio(NPMCIGRAPHIC npMCI, BOOL FAR *pfHurryUp,
|
||
|
BOOL FAR *pfPlayedAudio);
|
||
|
BOOL NEAR PASCAL KeepPlayingAudio(NPMCIGRAPHIC npMCI);
|
||
|
BOOL NEAR PASCAL HandleAudioChunk(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
DWORD FAR PASCAL SetUpAudio(NPMCIGRAPHIC npMCI, BOOL fPlaying);
|
||
|
DWORD FAR PASCAL CleanUpAudio(NPMCIGRAPHIC npMCI);
|
||
|
void FAR PASCAL BuildVolumeTable(NPMCIGRAPHIC npMCI);
|
||
|
BOOL FAR PASCAL StealWaveDevice(NPMCIGRAPHIC npMCI);
|
||
|
BOOL FAR PASCAL GiveWaveDevice(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
/* Functions in aviopen.c */
|
||
|
BOOL FAR PASCAL mciaviCloseFile(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
// now called on app thread
|
||
|
BOOL FAR PASCAL mciaviOpenFile(NPMCIGRAPHIC npMCI);
|
||
|
// called on worker thread to complete
|
||
|
BOOL NEAR PASCAL OpenFileInit(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
|
||
|
/* Messages used to control switching of audio between (and within)
|
||
|
* applications. These messages are POSTED, hence audio switching will
|
||
|
* be asynchronous. The timing depends on various factors: machine load,
|
||
|
* video speed, etc.. We should probably do this via RegisterWindowMessage
|
||
|
*/
|
||
|
#define WM_AUDIO_ON WM_USER+100
|
||
|
#define WM_AUDIO_OFF WM_USER+101
|
||
|
|
||
|
// messages sent to winproc thread - set up using RegisterWindowMessage
|
||
|
// in drvproc.c
|
||
|
#define AVIM_DESTROY (WM_USER+103)
|
||
|
#define AVIM_SHOWSTAGE (WM_USER+104)
|
||
|
|
||
|
//#define AVIM_DESTROY (mAVIM_DESTROY)
|
||
|
//#define AVIM_SHOWSTAGE (mAVIM_SHOWSTAGE)
|
||
|
//extern UINT mAVIM_DESTROY;
|
||
|
//extern UINT mAVIM_SHOWSTAGE;
|
||
|
|
||
|
|
||
|
// in hmemcpy.asm
|
||
|
#ifndef _WIN32
|
||
|
LPVOID FAR PASCAL MemCopy(LPVOID dest, LPVOID source, LONG count);
|
||
|
#else
|
||
|
#define MemCopy memmove
|
||
|
#endif // WIN16
|
||
|
|
||
|
#define GET_BYTE() (*((BYTE _huge *) (npMCI->lp))++)
|
||
|
#ifdef _WIN32
|
||
|
#define GET_WORD() (*((UNALIGNED WORD _huge *) (npMCI->lp))++)
|
||
|
#define GET_DWORD() (*((UNALIGNED DWORD _huge *) (npMCI->lp))++)
|
||
|
#define PEEK_DWORD() (*((UNALIGNED DWORD _huge *) (npMCI->lp)))
|
||
|
#else
|
||
|
#define GET_WORD() (*((WORD _huge *) (npMCI->lp))++)
|
||
|
#define GET_DWORD() (*((DWORD _huge *) (npMCI->lp))++)
|
||
|
#define PEEK_DWORD() (*((DWORD _huge *) (npMCI->lp)))
|
||
|
#endif
|
||
|
#define SKIP_BYTES(nBytes) ((npMCI->lp) += (nBytes))
|
||
|
|
||
|
#define Now() (timeGetTime())
|
||
|
|
||
|
void NEAR PASCAL aviTaskCheckRequests(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
BOOL FAR PASCAL ReadIndex(NPMCIGRAPHIC npMCI);
|
||
|
|
||
|
LONG NEAR PASCAL FindPrevKeyFrame(NPMCIGRAPHIC npMCI, STREAMINFO *psi, LONG lFrame);
|
||
|
LONG NEAR PASCAL FindNextKeyFrame(NPMCIGRAPHIC npMCI, STREAMINFO *psi, LONG lFrame);
|
||
|
|
||
|
//
|
||
|
// try to set the dest or source rect without stopping play.
|
||
|
// called both at stop time and at play time
|
||
|
//
|
||
|
// returns TRUE if stop needed, or else FALSE if all handled.
|
||
|
// lpdwErr is set to a non-zero error if any error occured (in which case
|
||
|
// FALSE will be returned.
|
||
|
//
|
||
|
BOOL TryPutRect(NPMCIGRAPHIC npMCI, DWORD dwFlags, LPRECT lprc, LPDWORD lpdwErr);
|
||
|
|
||
|
// called on worker thread only
|
||
|
DWORD InternalSetVolume(NPMCIGRAPHIC npMCI, DWORD dwVolume);
|
||
|
DWORD InternalGetVolume(NPMCIGRAPHIC npMCI);
|
||
|
DWORD Internal_Update(NPMCIGRAPHIC npMCI, DWORD dwFlags, HDC hdc, LPRECT lprc);
|
||
|
|
||
|
// called on winproc or worker thread
|
||
|
DWORD InternalRealize(NPMCIGRAPHIC npMCI);
|
||
|
BOOL TryStreamUpdate(
|
||
|
NPMCIGRAPHIC npMCI,
|
||
|
DWORD dwFlags,
|
||
|
HDC hdc,
|
||
|
LPRECT lprc
|
||
|
);
|
||
|
|
||
|
|
||
|
// called to release the synchronous portion of a command
|
||
|
void TaskReturns(NPMCIGRAPHIC npMCI, DWORD dwErr);
|
||
|
|