filename | src/gdrom/gdrom.h |
changeset | 468:3a49695e081a |
prev | 464:8e099fad42a6 |
next | 489:45c8ddcf52cb |
author | nkeynes |
date | Sun Oct 28 07:23:46 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Fix CDI with multiple tracks/session Fix file being closed too early |
view | annotate | diff | log | raw |
1 /**
2 * $Id: gdrom.h,v 1.14 2007-10-28 07:23:46 nkeynes Exp $
3 *
4 * This file defines the structures and functions used by the GD-Rom
5 * disc driver. (ie, the modules that supply a CD image to be used by the
6 * system).
7 *
8 * Copyright (c) 2005 Nathan Keynes.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 */
21 #ifndef dream_gdrom_H
22 #define dream_gdrom_H 1
24 #include "dream.h"
25 #include <glib.h>
27 #define MAX_SECTOR_SIZE 2352
29 typedef uint16_t gdrom_error_t;
31 struct gdrom_toc {
32 uint32_t track[99];
33 uint32_t first, last, leadout;
34 };
36 #define GDROM_PREGAP 150 /* Sectors */
38 extern uint32_t gdrom_sector_size[];
39 #define GDROM_SECTOR_SIZE(x) gdrom_sector_size[x]
40 typedef enum {
41 GDROM_MODE1,
42 GDROM_MODE2,
43 GDROM_MODE2_XA1,
44 GDROM_MODE2_XA2,
45 GDROM_CDDA,
46 GDROM_GD,
47 GDROM_RAW
48 } gdrom_track_mode_t;
50 /* The disc register indicates the current contents of the drive. When open
51 * contains 0x06.
52 */
53 #define IDE_DISC_AUDIO 0x00
54 #define IDE_DISC_NONE 0x06
55 #define IDE_DISC_CDROM 0x20
56 #define IDE_DISC_GDROM 0x80
57 #define IDE_DISC_READY 0x01 /* ored with above */
58 #define IDE_DISC_IDLE 0x02 /* ie spun-down */
60 #define TRACK_PRE_EMPHASIS 0x10
61 #define TRACK_COPY_PERMITTED 0x20
62 #define TRACK_DATA 0x40
63 #define TRACK_FOUR_CHANNEL 0x80
65 typedef struct gdrom_track {
66 gdrom_track_mode_t mode;
67 uint8_t flags; /* Track flags */
68 int session; /* session # containing this track */
69 uint32_t lba; /* start sector address */
70 uint32_t sector_size; /* For convenience, determined by mode */
71 uint32_t sector_count;
72 uint32_t offset; /* File offset of start of track - image files only */
73 } *gdrom_track_t;
75 typedef struct gdrom_disc {
76 /**
77 * Read a single sector from the disc at the specified logical address.
78 * @param disc pointer to the disc structure
79 * @param lba logical address to read from
80 * @param mode mode field from the read command
81 * @param buf buffer to receive data (at least MAX_SECTOR_SIZE bytes)
82 * @param length unsigned int to receive the number of bytes actually read.
83 * @return PKT_ERR_OK on success, or another PKT_ERR_* code on failure.
84 */
85 gdrom_error_t (*read_sector)( struct gdrom_disc *disc,
86 uint32_t lba, int mode,
87 unsigned char *buf, uint32_t *length );
89 /**
90 * Read the TOC from the disc and write it into the specified buffer.
91 * The method is responsible for returning the data in gd-rom
92 * format.
93 * @param disc pointer to the disc structure
94 * @param buf buffer to receive data (0x198 bytes long)
95 */
96 gdrom_error_t (*read_toc)(struct gdrom_disc *disc, unsigned char *buf);
98 /**
99 * Read the information for the specified sector and return it in the
100 * supplied buffer.
101 * @param disc pointer to the disc structure
102 * @param session of interest. If 0, return end of disc information.
103 * @param buf buffer to receive data (6 bytes)
104 */
105 gdrom_error_t (*read_session)(struct gdrom_disc *disc, int session, unsigned char *buf);
107 /**
108 * Read the position information (subchannel) for the specified sector
109 * and return it in the supplied buffer. This method does not need to
110 * write the first 4 bytes of the buffer.
111 * @param disc pointer to the disc structure
112 * @param lba sector to get position information for
113 * @param buf buffer to receive data (14 bytes)
114 */
115 gdrom_error_t (*read_position)(struct gdrom_disc *disc, uint32_t lba, unsigned char *buf);
117 /**
118 * Return the current disc status, expressed as a combination of the
119 * IDE_DISC_* flags above.
120 * @param disc pointer to the disc structure
121 * @return an integer status value.
122 */
123 int (*drive_status)(struct gdrom_disc *disc);
125 /**
126 * Begin playing audio from the given lba address on the disc.
127 */
128 gdrom_error_t (*play_audio)(struct gdrom_disc *disc, uint32_t lba, uint32_t endlba);
130 /**
131 * Executed once per time slice to perform house-keeping operations
132 * (checking disc status, media changed, etc).
133 */
134 uint32_t (*run_time_slice)( struct gdrom_disc *disc, uint32_t nanosecs );
136 /**
137 * Close the disc and release any storage or resources allocated including
138 * the disc structure itself.
139 */
140 void (*close)( struct gdrom_disc *disc );
141 const gchar *name; /* Device name / Image filename */
142 } *gdrom_disc_t;
145 typedef struct gdrom_image {
146 struct gdrom_disc disc;
147 int disc_type;
148 int track_count;
149 struct gdrom_track track[99];
150 gchar mcn[14]; /* Media catalogue number */
151 FILE *file; /* Open file stream */
152 } *gdrom_image_t;
154 /**
155 *
156 */
157 typedef struct gdrom_image_class {
158 const gchar *name;
159 const gchar *extension;
160 gboolean (*is_valid_file)(FILE *f);
161 gdrom_disc_t (*open_image_file)(const gchar *filename, FILE *f);
162 } *gdrom_image_class_t;
164 extern struct gdrom_image_class nrg_image_class;
165 extern struct gdrom_image_class cdi_image_class;
166 extern struct gdrom_image_class linux_device_class;
168 /**
169 * Construct a new image file using the default methods.
170 */
171 gdrom_disc_t gdrom_image_new( const gchar *filename, FILE *f );
173 /**
174 * Open an image file
175 */
176 gdrom_disc_t gdrom_image_open( const gchar *filename );
178 /**
179 * Dump image info
180 */
181 void gdrom_image_dump_info( gdrom_disc_t d );
183 /**
184 * Destroy an image data structure without closing the file
185 * (Intended for use from image loaders only)
186 */
187 void gdrom_image_destroy_no_close( gdrom_disc_t d );
189 /**
190 * Retrieve the disc table of contents, and write it into the buffer in the
191 * format expected by the DC.
192 * @return 0 on success, error code on failure (eg no disc mounted)
193 */
194 gdrom_error_t gdrom_get_toc( unsigned char *buf );
196 /**
197 * Retrieve the short (6-byte) session info, and write it into the buffer.
198 * @return 0 on success, error code on failure.
199 */
200 gdrom_error_t gdrom_get_info( unsigned char *buf, int session );
202 gdrom_track_t gdrom_get_track( int track_no );
204 uint8_t gdrom_get_track_no_by_lba( uint32_t lba );
206 /**
207 * Shortcut to open and mount an image file
208 * @return true on success
209 */
210 gboolean gdrom_mount_image( const gchar *filename );
212 void gdrom_mount_disc( gdrom_disc_t disc );
214 void gdrom_unmount_disc( void );
216 gboolean gdrom_is_mounted( void );
218 gdrom_disc_t gdrom_get_current_disc();
220 GList *gdrom_get_native_devices();
222 uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count,
223 int mode, unsigned char *buf, uint32_t *length );
225 #endif
.