/*
**	PlayWin.c
**
**	Copyright (C) 1995,96 Bernardo Innocenti
**
**	Play window handling functions.
*/

#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/imageclass.h>
#include <libraries/gadtools.h>
#include <dos/dostags.h>

#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <proto/utility.h>

#include "XModulePriv.h"
#include "Gui.h"
#include "Player.h"
#include "CustomClasses.h"



/*****************************/
/* Local function prototypes */
/*****************************/

static void PlayRewClicked (void);
static void PlayPlayClicked (void);
static void PlayFwdClicked (void);
static void PlayStopClicked (void);
static void PlayVolClicked (void);
static void PlayRstClicked (void);



enum {
	GD_PlayGroup0,
		GD_PlayGroup1,
			GD_PlayGroup2,
				GD_PlayGroup3,
					GD_PlayRew,
					GD_PlayPlay,
					GD_PlayFwd,
					GD_PlayStop,
				GD_PlayVol,
			GD_PlayGroup4,
				GD_PlayPos,
				GD_PlayGroup5,
					GD_PlayTime,
					GD_PlayTimeReset,

	Play_CNT
};



static struct Process *PlayerProc = NULL;
static struct MsgPort *PlayerPort = NULL;



static LONG PlayArgs[] =
{
	HGROUP_KIND, 0,
		VGROUP_KIND, 0,
			HGROUP_KIND, 0,
				IMAGEBUTTON_KIND,	(LONG)PlayRewClicked,	IM_REW,		TAG_DONE,
				IMAGEBUTTON_KIND,	(LONG)PlayPlayClicked,	IM_PLAY,	TAG_DONE,
				IMAGEBUTTON_KIND,	(LONG)PlayFwdClicked,	IM_FWD,		TAG_DONE,
				IMAGEBUTTON_KIND,	(LONG)PlayStopClicked,	IM_STOP,	TAG_DONE,
				ENDGROUP_KIND,
			SLIDER_KIND,	(LONG)PlayVolClicked, MSG_VOL_GAD, 0, 64, (LONG)"%lu", 3, TAG_DONE,
			ENDGROUP_KIND,
		VGROUP_KIND, 0,
			TEXT_KIND,	MSG_POS_GAD,	7,	GTTX_Border,	TRUE,	TAG_DONE,
			HGROUP_KIND, 0,
				TEXT_KIND,		MSG_TIME_GAD,	7,	GTTX_Border,	TRUE,	TAG_DONE,
				BUTTON_KIND,	(LONG)PlayRstClicked,	MSG_RST_GAD,		TAG_DONE,
				ENDGROUP_KIND,
			ENDGROUP_KIND,
		ENDGROUP_KIND,
	ENDGROUP_KIND
};



XDEF LONG PlayWinTags[] =
{
	XMWIN_LayoutArgs,	(LONG)PlayArgs,
	XMWIN_GCount,		Play_CNT,
	XMWIN_Title,		MSG_PLAY_TITLE,
	XMWIN_WindowFlags,	WFLG_CLOSEGADGET,
	XMWIN_IDCMPFlags,	IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|SLIDERIDCMP,
	XMWIN_PostOpenFunc,	(LONG)SetupPlayer,
//	XMWIN_PostOpenFunc,	(LONG)UpdatePlay,
	XMWIN_PostCloseFunc,(LONG)CleanupPlayer,
	XMWIN_HelpNode,		(LONG)"Play",
	TAG_DONE
};



/*************************/
/* Play window functions */
/*************************/


/*
static void UpdatePlay (void)
{

}
*/


GLOBALCALL LONG SetupPlayer (void)
{
	LONG err;
	BPTR PlayerSegList;

	if (PlayerProc) return RETURN_OK;

	if (PlayerPort = CreateMsgPort())
	{
		if (PlayerSegList = NewLoadSeg ("PROGDIR:Players/32Channels.player", NULL))
		{
			if (PlayerProc = CreateNewProcTags (
				NP_Seglist,		PlayerSegList,
				NP_FreeSeglist,	TRUE,
				NP_Name,		"XModule Player",
				NP_Priority,	25,
				NP_WindowPtr,	NULL,
				NP_Input,		NULL,
				NP_Output,		NULL,
				NP_Error,		NULL,
				NP_CopyVars,	FALSE,
				TAG_DONE))
			{
				struct PlayerCmd dummy;

				dummy.pcmd_Message.mn_ReplyPort = PlayerPort;
				dummy.pcmd_ID = PCMD_SETUP;

				PutMsg (&PlayerProc->pr_MsgPort, (struct Message *)&dummy);

				WaitPort (PlayerPort);
				GetMsg (PlayerPort);

				if (!dummy.pcmd_Err)
	 				return RETURN_OK;

				/* Error cleanup */

				ShowRequest (MSG_PLAYER_INIT_ERR, 0, dummy.pcmd_Err);
				CleanupPlayer();
				return dummy.pcmd_Err;
			}
			else
				err = ERROR_NO_FREE_STORE;

			UnLoadSeg (PlayerSegList);
		}
		else
			CantOpenLib ("PROGDIR:Players/32Channels.player", 0);

		DeleteMsgPort (PlayerPort);	PlayerPort = NULL;
	}
	else
		err = ERROR_NO_FREE_STORE;

	return err;
}



void CleanupPlayer (void)
{
	if (PlayerProc)
	{
		/* Signal player process to give up.  dos.library will
		 * automatically UnLoadSeg() its code.
		 */
		Signal ((struct Task *)PlayerProc, SIGBREAKF_CTRL_C);
		PlayerProc = NULL;

		DeleteMsgPort (PlayerPort);	PlayerPort = NULL;
	}
}



/****************/
/* Play Gadgets */
/****************/

static void PlayPlayClicked (void)
{
	ShowRequestStr ("Enjoy the silence...\n\n"
		"Sorry, XModule replay code is still under developement.\n"
		"I'm adapting the DeliTracker 14bit-NotePlayer mixing engine\n"
		"to XModule's internal module format, which will allow\n"
		"upto 32 channels with 14bit stereo output at 56Khz max,\n"
		"provided your machine is fast enough.",
		"Incredible!", NULL);
}



static void PlayRewClicked (void)
{
/*
	struct PlayerCmd cmd;

	cmd.pcmd_Message.mn_ReplyPort = PlayerPort;
	cmd.pcmd_ID = PCMD_INIT;
	cmd.pcmd_Data = songinfo;

	PutMsg (&PlayerProc->pr_MsgPort, (struct Message *)&cmd);

	WaitPort (PlayerPort);
	GetMsg (PlayerPort);

	ShowString ("%ld", &cmd.pcmd_Err);
*/
}


static void PlayFwdClicked (void)
{
/*
	struct PlayerCmd cmd;

	cmd.pcmd_Message.mn_ReplyPort = PlayerPort;
	cmd.pcmd_ID = PCMD_PLAY;
	cmd.pcmd_Data = songinfo;

	PutMsg (&PlayerProc->pr_MsgPort, (struct Message *)&cmd);

	WaitPort (PlayerPort);
	GetMsg (PlayerPort);
*/
}


static void PlayStopClicked (void)
{
}


static void PlayVolClicked (void)
{
}


static void PlayRstClicked (void)
{
}

