#include <stdio.h>
#include <machine.h>
#include "../inc/getopt.h"

typedef struct {
    char	min;
    char	sec;
    char	frame;
} cdtime;

struct {
    char	mode;
    char	starttrack;
    char	endtrack;
    cdtime	disc;
    cdtime	track[99];
} cdinf;

struct {
    cdtime	start_time;
    cdtime	end_time;
} play;

typedef enum {
    ON = !0, OFF = 0
} flag_t;

flag_t	opt_r = ON, opt_e = OFF;

char	*help_msg[] =
{
    "ＣＤ演奏プログラム ＣＤＰ．ＥＸＥ v1.2\n",
    "                  Y.Tsuzi[" __DATE__ "]\n",
    "    >cdp [-rne] [-hH?] [track]\n",
    "       -hH?   ヘルプ\n",
    "       -r     リピート（デフォルト）\n",
    "       -n     リピートオフ\n",
    "       -e     track から最後まで\n",
    "       track  トラックを指定\n",
    "              （16、８、10進数のどれか）\n",
    NULL
};

int	cdr_cdinfo(void *para);
int	cdr_mtplay(void *para);
int	cdr_rep_play(void *para);
int	cdr_mstop(void);
int	cdr_mphase(void *para);
int	cdr_rmtplay(void *para);

int	cdp(int track);
int	etime(cdtime *a);
int	help(void);

int	main(int argc, char **argv)
{
    int	i, track_num;
    char	*num;
    
    setopt(argc, argv);
    
    while((i = getopt('-', "rnehH?", &num)) >= 0) {
	switch(i) {
	case 'r':
	    opt_r = ON;
	    break;
	case 'n':
	    opt_r = OFF;
	    break;
	case 'e':
	    opt_e = ON;
	    break;
	case 'h':
	case 'H':
	case '?':
	    help();
	    return 1;
	case 0:
	    if(sscanf(num, "%i", &track_num) != 1) {
		printf("unknow track '%s'\n", num);
		printf("トラックを確認してください。\n\n");
		help();
		return 1;
	    }
	    break;
	default:
	    printf("unknow option '-%c'\n", i);
	    printf("オプションを確認してください。\n\n");
	    help();
	    return 2;
	}
    }
    
    /*
      CD のボリュームを設定
      （機能していないようだ。）
    */
    outp(0x04e3, 0x0c);
    outp(0x04e3, 0x0d);
    
    cdr_mstop();
    
    if(argc < 2) return 0;
    
    if(cdp(track_num)) return 1;
    
    return 0;
}

int	cdp(int track)
{
    int		i;
    
    do {
	i = cdr_cdinfo(&cdinf);
    } while(i != 0);
    
    cdinf.track[cdinf.endtrack] = cdinf.disc;
    
    if(track >= cdinf.starttrack &&
       track <= cdinf.endtrack) {
	   play.start_time = cdinf.track[track - 1];
	   if(opt_e == OFF) {
	       play.end_time = cdinf.track[track];
	   } else {
	       play.end_time = cdinf.track[cdinf.endtrack];
	   }
	   if(etime(&(play.end_time))) return 1;
	    if(opt_r == ON) {
	       if(cdr_rep_play(&play) != 0)
		   printf("演奏に失敗しました。\n");
	    } else {
	       if(cdr_mtplay(&play) != 0)
		   printf("演奏に失敗しました。\n");
	   }
       }
    
    return 0;
}

int	help(void)
{
    char **p = help_msg;
    while(*p != NULL) printf("%s", *p++);
    return 0;
}

int	etime(cdtime *a)
{
    if (a->frame-- <= 0) {
	a->frame = 74;
	if (a->sec-- <= 0) {
	    a->sec = 59;
	    if (a->min-- <= 0)
		return 1;
	}
    }
    return 0;
}

