shithub: riscv

ref: 41383ad0120630edd42c5c897a287e2f9d9161b4
dir: /acme/bin/source/acd/acd.h/

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <disk.h>
#include <auth.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>

/* acme */
typedef struct Event Event;
typedef struct Window Window;

enum
{
	STACK		= 16384,
	EVENTSIZE	= 256,
	NEVENT		= 5,
};

struct Event
{
	int	c1;
	int	c2;
	int	q0;
	int	q1;
	int	flag;
	int	nb;
	int	nr;
	char	b[EVENTSIZE*UTFmax+1];
	Rune	r[EVENTSIZE+1];
};

struct Window
{
	/* file descriptors */
	int		ctl;
	int		event;
	int		addr;
	int		data;
	Biobuf	*body;

	/* event input */
	char		buf[512];
	char		*bufp;
	int		nbuf;
	Event	e[NEVENT];

	int		id;
	int		open;
	Channel	*cevent;	/* chan(Event*) */
};

extern	Window*	newwindow(void);
extern	int		winopenfile(Window*, char*);
extern	void		winopenbody(Window*, int);
extern	void		winclosebody(Window*);
extern	void		wintagwrite(Window*, char*, int);
extern	void		winname(Window*, char*);
extern	void		winwriteevent(Window*, Event*);
extern	void		winread(Window*, uint, uint, char*);
extern	int		windel(Window*, int);
extern	void		wingetevent(Window*, Event*);
extern	void		wineventproc(void*);
extern	void		winwritebody(Window*, char*, int);
extern	void		winclean(Window*);
extern	int		winselect(Window*, char*, int);
extern	int		winsetaddr(Window*, char*, int);
extern	char*	winreadbody(Window*, int*);
extern	void		windormant(Window*);
extern	void		winsetdump(Window*, char*, char*);

extern	char*	readfile(char*, char*, int*);
extern	void		ctlprint(int, char*, ...);
extern	void*	emalloc(uint);
extern	char*	estrdup(char*);
extern	char*	estrstrdup(char*, char*);
extern	char*	egrow(char*, char*, char*);
extern	char*	eappend(char*, char*, char*);
extern	void		error(char*, ...);
extern	int		tokenizec(char*, char**, int, char*);

/* cd stuff */
typedef struct Msf Msf;	/* minute, second, frame */
struct Msf {
	int m;
	int s;
	int f;
};

typedef struct Track Track;
struct Track {
	Msf start;
	Msf end;
	ulong bstart;
	ulong bend;
	char *title;
};

enum {
	MTRACK = 64,
};
typedef struct Toc Toc;
struct Toc {
	int ntrack;
	int nchange;
	int changetime;
	int track0;
	Track track[MTRACK];
	char *title;
};

extern int msfconv(Fmt*);

#pragma	varargck	argpos	error	1
#pragma	varargck	argpos	ctlprint	2
#pragma	varargck	type		"M"	Msf

enum {	/* state */
	Sunknown,
	Splaying,
	Spaused,
	Scompleted,
	Serror,
};

typedef struct Cdstatus Cdstatus;
struct Cdstatus {
	int state;
	int track;
	int index;
	Msf abs;
	Msf rel;
};

typedef struct Drive Drive;
struct Drive {
	Window *w;
	Channel *cstatus;	/* chan(Cdstatus) */
	Channel *ctocdisp;	/* chan(Toc) */
	Channel *cdbreq;	/* chan(Toc) */
	Channel *cdbreply; /* chan(Toc) */
	Scsi *scsi;
	Toc toc;
	Cdstatus status;
};

int gettoc(Scsi*, Toc*);
void drawtoc(Window*, Drive*, Toc*);
void redrawtoc(Window*, Toc*);
void tocproc(void*);	/* Drive* */
void cddbproc(void*);	/* Drive* */
void cdstatusproc(void*);	/* Drive* */

extern int debug;

#define DPRINT if(debug)fprint
void acmeevent(Drive*, Window*, Event*);

int playtrack(Drive*, int, int);
int pause(Drive*);
int resume(Drive*);
int stop(Drive*);
int eject(Drive*);
int ingest(Drive*);

int markplay(Window*, ulong);
int setplaytime(Window*, char*);
void advancetrack(Drive*, Window*);