1 #ifndef WM_STRUCT_H
2 #define WM_STRUCT_H
3 /*
4  * This file is part of WorkMan, the civilized CD player library
5  * Copyright (C) 1991-1997 by Steven Grimm <koreth@midwinter.com>
6  * Copyright (C) by Dirk Försterling <milliByte@DeathsDoor.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the Free
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  */
23 
24 #include "wm_platform.h"
25 
26 #define WM_STR_GENVENDOR "Generic"
27 #define WM_STR_GENMODEL  "drive"
28 #define WM_STR_GENREV    "type"
29 
30 struct wm_drive;
31 
32 /*
33  * Structure for a single track.  This is pretty much self-explanatory --
34  * one of these exists for each track on the current CD.
35  */
36 struct wm_trackinfo
37 {
38 	int	length;		/* Length of track in seconds or Kbytes */
39 	int	start;		/* Starting position (f+s*75+m*60*75) */
40 	int	track;		/* Physical track number */
41 	int	data;		/* Flag: data track */
42 };
43 
44 struct wm_cdinfo
45 {
46 	int	ntracks;	/* Number of tracks on the disc */
47 	int curtrack;
48 	int curtracklen;
49 	int cur_cdmode;
50 	int cur_index;	 /* Current index mark */
51 	int cur_pos_rel; /* Current track-relative position in seconds */
52 	int cur_pos_abs; /* Current absolute position in seconds */
53 	int cur_frame;   /* Current frame number */
54 	int	length;		/* Total running time in seconds */
55 	int cd_cur_balance;
56 	struct wm_trackinfo *trk;	/* struct wm_trackinfo[ntracks] */
57 };
58 
59 /*
60  * Each platform has to define generic functions, so may as well declare
61  * them all here to save space.
62  * These functions should never be seen outside libworkman. So I don't care
63  * about the wm_ naming convention here.
64  */
65 struct wm_drive_proto
66 {
67 	int (*open)(struct wm_drive *d);
68 	int (*close)(struct wm_drive *d);
69 	int (*get_trackcount)(struct wm_drive *d, int *tracks);
70 	int (*get_cdlen)(struct wm_drive *d, int *frames);
71 	int (*get_trackinfo)(struct wm_drive *d, int track, int *data, int *startframe);
72 	int (*get_drive_status)(struct wm_drive *d, int oldmode, int *mode, int *pos, int *track, int *ind);
73 	int (*pause)(struct wm_drive *d);
74 	int (*resume)(struct wm_drive *d);
75 	int (*stop)(struct wm_drive *d);
76 	int (*play)(struct wm_drive *d, int start, int end);
77 	int (*eject)(struct wm_drive *d);
78 	int (*closetray)(struct wm_drive *d);
79 	int (*scsi)(struct wm_drive *d, unsigned char *cdb, int cdb_len, void *ret_buf, int ret_buflen, int get_reply);
80 	int (*set_volume)(struct wm_drive *d, int left, int right);
81 	int (*get_volume)(struct wm_drive *d, int *left, int *right);
82 	int (*scale_volume)(int *left, int *right);
83 	int (*unscale_volume)(int *left, int *right);
84 };
85 
86 /* forward declaration */
87 int gen_init(struct wm_drive *d);
88 int gen_open(struct wm_drive *d);
89 int gen_close(struct wm_drive *d);
90 int gen_get_trackcount(struct wm_drive *d, int *tracks);
91 int gen_get_cdlen(struct wm_drive *d, int *frames);
92 int gen_get_trackinfo(struct wm_drive *d, int track, int *data, int *startframe);
93 int gen_get_drive_status(struct wm_drive *d, int oldmode, int *mode, int *pos, int *track, int *ind);
94 int gen_pause(struct wm_drive *d);
95 int gen_resume(struct wm_drive *d);
96 int gen_stop(struct wm_drive *d);
97 int gen_play(struct wm_drive *d, int start, int end);
98 int gen_eject(struct wm_drive *d);
99 int gen_closetray(struct wm_drive *d);
100 int gen_scsi(struct wm_drive *d, unsigned char *cdb, int cdb_len, void *ret_buf, int ret_buflen, int get_reply);
101 int gen_set_volume(struct wm_drive *d, int left, int right);
102 int gen_get_volume(struct wm_drive *d, int *left, int *right);
103 int gen_scale_volume(int *left, int *right);
104 int gen_unscale_volume(int *left, int *right);
105 
106 /*
107  * Information about a particular block of CDDA data.
108  */
109 struct wm_cdda_block
110 {
111     unsigned char status;
112     unsigned char track;
113     unsigned char index;
114     unsigned char reserved;
115 
116     int   frame;
117     char *buf;
118     long  buflen;
119 };
120 
121 #ifdef WMLIB_CDDA_BUILD
122 int gen_cdda_init(struct wm_drive *d);
123 int gen_cdda_open(struct wm_drive* d);
124 int gen_cdda_read(struct wm_drive* d, struct wm_cdda_block *block);
125 int gen_cdda_close(struct wm_drive* d);
126 #else
127 	#define gen_cdda_init(x) (-1)
128 	#define gen_cdda_open(x) (-1)
129 	#define gen_cdda_read(x, y) (-1)
130 	#define gen_cdda_close(x) (-1)
131 #endif
132 
133 
134 /*
135  * Drive descriptor structure.  Used for access to low-level routines.
136  */
137 struct wm_drive
138 {
139 	int  cdda;            /* cdda 1, cdin 0 */
140 
141 	/* common section */
142 	char *cd_device;
143 	char *soundsystem;
144 	char *sounddevice;
145 	char *ctldevice;
146 
147 	char  vendor[9];      /* Vendor name */
148 	char  model[17];      /* Drive model */
149 	char  revision[5];    /* Revision of the drive */
150 	void  *aux;           /* Pointer to optional platform-specific info */
151 
152 	struct wm_cdinfo thiscd;
153     int cur_cdmode;
154 
155 	/* cdin section */
156 	int    fd;            /* file descriptor */
157 	void  *daux;          /* Pointer to optional drive-specific info etc. */
158 	struct wm_drive_proto proto;
159 
160 	/* cdda section */
161     unsigned char status;
162     unsigned char track;
163     unsigned char index;
164     unsigned char command;
165 
166 	int current_position;
167 	int ending_position;
168 
169     int frame;
170     int frames_at_once;
171 
172     struct wm_cdda_block *blocks;
173     int numblocks;
174   	void  *cddax;         /* Pointer to optional drive-specific info  etc. */
175   	int oldmode;
176 };
177 
178 int toshiba_fixup(struct wm_drive *d);
179 int sony_fixup(struct wm_drive *d);
180 
181 struct cdtext_info* get_glob_cdtext(struct wm_drive*, int);
182 void free_cdtext(void);
183 
184 int wm_cdda_init(struct wm_drive *d);
185 int wm_cdda_destroy(struct wm_drive *d);
186 
187 #endif /* WM_STRUCT_H */
188