/******************************Module*Header*******************************\
* Module Name: cdplayer.h
*
*
*
*
* Created: dd-mm-93
* Author:  Stephen Estrop [StephenE]
*
* Copyright (c) 1993 Microsoft Corporation
\**************************************************************************/
//#ifdef CHICAGO
#include <shellapi.h>
//#endif


/* -------------------------------------------------------------------------
** Replace the WM_MENUSELECT message craker because it contains a bug.
** -------------------------------------------------------------------------
*/
#ifdef HANDLE_WM_MENUSELECT
#undef HANDLE_WM_MENUSELECT
#define HANDLE_WM_MENUSELECT(hwnd, wParam, lParam, fn)                  \
    ((fn)( (hwnd), (HMENU)(lParam),                                     \
           (UINT)LOWORD(wParam), NULL, (UINT)HIWORD(wParam)), 0L)
#endif

#ifndef NUMELEMS
    #define NUMELEMS(a) (sizeof((a))/sizeof((a)[0]))
#endif // NUMELEMS


#define NUM_OF_CONTROLS (IDC_CDPLAYER_LAST - IDC_CDPLAYER_FIRST + 1)
#define NUM_OF_BUTTONS  (IDC_BUTTON8 - IDC_BUTTON1 + 1)

#define INDEX( _x_ )    ((_x_) - IDC_CDPLAYER_FIRST)

#if DBG

void
dprintf(
    char *lpszFormat,
    ...
    );
void CDAssert( LPSTR x, LPSTR file, int line );
#undef ASSERT
#define ASSERT(_x_) if (!(_x_))  CDAssert( #_x_, __FILE__, __LINE__ )

#else

#undef ASSERT
#define ASSERT(_x_)

#endif

#define WM_CDPLAYER_MSG_BASE        (WM_USER + 0x1000)

#define WM_NOTIFY_CDROM_COUNT       (WM_CDPLAYER_MSG_BASE)
#define WM_NOTIFY_TOC_READ          (WM_CDPLAYER_MSG_BASE+1)

#define HEARTBEAT_TIMER_ID          0x3243
#ifdef DAYTONA
#define HEARTBEAT_TIMER_RATE        250         /* 4 times a second */
#else
#define HEARTBEAT_TIMER_RATE        500         /* 2 times a second */
#endif

#define SKIPBEAT_TIMER_ID           0x3245
#define SKIPBEAT_TIMER_RATE         200         /* 5  times a second */
#define SKIPBEAT_TIMER_RATE2        100         /* 10 times a second */
#define SKIPBEAT_TIMER_RATE3        50          /* 20 times a second */
#define SKIP_ACCELERATOR_LIMIT1     5           /* 5  seconds        */
#define SKIP_ACCELERATOR_LIMIT2     20          /* 20 seconds        */


#define FRAMES_PER_SECOND           75
#define FRAMES_PER_MINUTE           (60*FRAMES_PER_SECOND)


#define DISPLAY_UPD_LED             0x00000001
#define DISPLAY_UPD_TITLE_NAME      0x00000002
#define DISPLAY_UPD_TRACK_NAME      0x00000004
#define DISPLAY_UPD_TRACK_TIME      0x00000008
#define DISPLAY_UPD_DISC_TIME       0x00000010
#define DISPLAY_UPD_CDROM_STATE     0x00000020
#define DISPLAY_UPD_LEADOUT_TIME    0x80000000


#define INTRO_LOWER_LEN             5
#define INTRO_DEFAULT_LEN           10
#define INTRO_UPPER_LEN             15


//  Audio Play Files consist completely of this header block.  These
//  files are readable in the root of any audio disc regardless of
//  the capabilities of the drive.
//
//  The "Unique Disk ID Number" is a calculated value consisting of
//  a combination of parameters, including the number of tracks and
//  the starting locations of those tracks.
//
//  Applications interpreting CDDA RIFF files should be advised that
//  additional RIFF file chunks may be added to this header in the
//  future in order to add information, such as the disk and song title.

#define RIFF_RIFF 0x46464952
#define RIFF_CDDA 0x41444443

typedef struct {
    DWORD   dwRIFF;         // 'RIFF'
    DWORD   dwSize;         // Chunk size = (file size - 8)
    DWORD   dwCDDA;         // 'CDDA'
    DWORD   dwFmt;          // 'fmt '
    DWORD   dwCDDASize;     // Chunk size of 'fmt ' = 24
    WORD    wFormat;        // Format tag
    WORD    wTrack;         // Track number
    DWORD   DiscID;         // Unique disk id
    DWORD   lbnTrackStart;  // Track starting sector (LBN)
    DWORD   lbnTrackLength; // Track length (LBN count)
    DWORD   msfTrackStart;  // Track starting sector (MSF)
    DWORD   msfTrackLength; // Track length (MSF)
}   RIFFCDA;


BOOL
InitInstance(
    HANDLE hInstance
    );


BOOL CALLBACK
MainWndProc(
    HWND hwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
    );

BOOL
CDPlay_OnInitDialog(
    HWND hwnd,
    HWND hwndFocus,
    LPARAM lParam
    );

void
CDPlay_OnInitMenuPopup(
    HWND hwnd,
    HMENU hMenu,
    UINT item,
    BOOL fSystemMenu
    );

#ifdef DAYTONA
void
CDPlay_OnPaint(
    HWND hwnd
    );
#endif

void
CDPlay_OnSysColorChange(
    HWND hwnd
    );

void
CDPlay_OnWinIniChange(
    HWND hwnd,
    LPCTSTR lpszSectionName
    );

LRESULT CALLBACK
SubClassedToolTips(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );

LRESULT
CDPlay_OnNotify(
    HWND hwnd,
    int idFrom,
    NMHDR *pnmhdr
    );

void
CDPlay_OnLButtonDown(
    HWND hwnd,
    BOOL fDoubleClick,
    int x,
    int y,
    UINT keyFlags
    );

UINT
CDPlay_OnNCHitTest(
    HWND hwnd,
    int x,
    int y
    );

BOOL
CDPlay_OnCopyData(
    HWND hwnd,
    PCOPYDATASTRUCT lpcpds
    );

BOOL
CDPlay_OnTocRead(
    int iDriveRead
    );

BOOL
CDPlay_OnDeviceChange(
    HWND hwnd,
    WPARAM wParam,
    LPARAM lParam);

void
CDPlay_OnDropFiles(
    HWND hwnd,
    HDROP hdrop
    );

void
CDPlay_OnMenuSelect(
    HWND hwnd,
    HMENU hmenu,
    int item,
    HMENU hmenuPopup,
    UINT flags
    );

BOOL
CDPlay_OnDrawItem(
    HWND hwnd,
    const DRAWITEMSTRUCT *lpdis
    );

void
CDPlay_OnCommand(
    HWND hwnd,
    int id,
    HWND hwndCtl,
    UINT codeNotify
    );

void
CDPlay_OnDestroy(
    HWND hwnd
    );

BOOL
CDPlay_OnClose(
    HWND hwnd,
    BOOL fShuttingDown
    );

void
CDPlay_OnEndSession(
    HWND hwnd,
    BOOL fEnding
    );

void
CDPlay_OnSize(
    HWND hwnd,
    UINT state,
    int cx,
    int cy
    );

void
ShowStatusbar(
    void
    );

void
ShowToolbar(
    void
    );

void
ShowTrackInfo(
    void
    );

BOOL CALLBACK
ChildEnumProc(
    HWND hwndChild,
    LPARAM lp
    );

BOOL
CreateToolbarsAndStatusbar(
    HWND hwnd
    );

void
AdjustChildButtons(
    HWND hwnd
    );

void
FatalApplicationError(
    INT uIdStringResource,
    ...
    );

void
LED_ToggleDisplayFont(
    HWND hwnd,
    BOOL fFont
    );

LPTSTR
IdStr(
    int idResource
    );

void
CheckMenuItemIfTrue(
    HMENU hMenu,
    UINT idItem,
    BOOL flag
    );

void
ReadSettings(
    void
    );

void
UpdateToolbarButtons(
    void
    );

void
UpdateToolbarTimeButtons(
    void
    );

BOOL
LockTableOfContents(
    int cdrom
    );

BOOL
LockALLTableOfContents(
    void
    );

LPVOID
AllocMemory(
    UINT uSize
    );

void
SetPlayButtonsEnableState(
    void
    );

void CALLBACK
HeartBeatTimerProc(
    HWND hwnd,
    UINT uMsg,
    UINT idEvent,
    DWORD dwTime
    );

void CALLBACK
SkipBeatTimerProc(
    HWND hwnd,
    UINT uMsg,
    UINT idEvent,
    DWORD dwTime
    );

void
UpdateDisplay(
    DWORD Flags
    );

HBRUSH
Common_OnCtlColor(
    HWND hwnd,
    HDC hdc,
    HWND hwndChild,
    int type
    );

BOOL
Common_OnMeasureItem(
    HWND hwnd,
    MEASUREITEMSTRUCT *lpMeasureItem
    );

void
DrawTrackItem(
    HDC hdc,
    const RECT *r,
    DWORD item,
    BOOL selected
    );

void
DrawDriveItem(
    HDC   hdc,
    const RECT *r,
    DWORD item,
    BOOL  selected
    );

void
EnableToolTips(
    BOOL    fEnable
    );

void
CdPlayerAlreadyRunning(
    void
    );

void
CdPlayerStartUp(
    void
    );

void
CompleteCdPlayerStartUp(
    void
    );

BOOL
IsPlayOptionGiven(
    LPTSTR lpCmdLine
    );

BOOL
IsUpdateOptionGiven(
    LPTSTR lpCmdLine
    );

/* -------------------------------------------------------------------------
** Public Globals - Most of these should be treated as read only.
** -------------------------------------------------------------------------
*/
#ifndef GLOBAL
#define GLOBAL extern
#endif

GLOBAL HINSTANCE        g_hInst;
GLOBAL HWND             g_hwndApp;
GLOBAL HWND             g_hwndToolbar;
GLOBAL HWND             g_hwndStatusbar;
GLOBAL HWND             g_hwndControls[NUM_OF_CONTROLS];
GLOBAL BOOL             g_fStatusbarVisible;
GLOBAL BOOL             g_fToolbarVisible;
GLOBAL BOOL             g_fSelectedOrder;
GLOBAL BOOL             g_fSingleDisk;
GLOBAL BOOL             g_fIntroPlay;
GLOBAL BOOL             g_fContinuous;
GLOBAL BOOL             g_fSaveOnExit;
GLOBAL BOOL             g_fDisplayT;
GLOBAL BOOL             g_fDisplayTr;
GLOBAL BOOL             g_fDisplayDr;
GLOBAL BOOL             g_fMultiDiskAvailable;
GLOBAL BOOL             g_fIsIconic;
GLOBAL BOOL             g_fSmallLedFont;
GLOBAL BOOL             g_fToolTips;
GLOBAL BOOL             g_fStopCDOnExit;
GLOBAL BOOL             g_fPlay;

GLOBAL int              g_NumCdDevices;
GLOBAL int              g_LastCdrom;
GLOBAL int              g_CurrCdrom;
GLOBAL int              g_IntroPlayLength;

GLOBAL TCHAR            g_szArtistTxt[50];
GLOBAL TCHAR            g_szTitleTxt[50];
GLOBAL TCHAR            g_szUnknownTxt[50];
GLOBAL TCHAR            g_szTrackTxt[50];
GLOBAL TCHAR            g_szEmpty[];

GLOBAL BOOL             g_fFlashLed;

GLOBAL HBITMAP          g_hbmTrack;
GLOBAL HBITMAP          g_hbmInsertPoint;
GLOBAL HBITMAP          g_hbmEditBtns;

GLOBAL HFONT            g_hDlgFont;
GLOBAL HFONT            hLEDFontS;
GLOBAL HFONT            hLEDFontL;
GLOBAL LPSTR            g_lpCmdLine;

extern BOOL             g_fTrackInfoVisible;

GLOBAL CRITICAL_SECTION g_csTOCSerialize;