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
8 * Copyright (c) 2005 Nathan Keynes.
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.
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.
22 #define dream_gdrom_H 1
27 #define MAX_SECTOR_SIZE 2352
29 typedef uint16_t gdrom_error_t;
33 uint32_t first, last, leadout;
36 #define GDROM_PREGAP 150 /* Sectors */
38 extern uint32_t gdrom_sector_size[];
39 #define GDROM_SECTOR_SIZE(x) gdrom_sector_size[x]
50 /* The disc register indicates the current contents of the drive. When open
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 */
76 typedef struct gdrom_disc {
78 * Read a single sector from the disc at the specified logical address.
79 * @param disc pointer to the disc structure
80 * @param lba logical address to read from
81 * @param mode mode field from the read command
82 * @param buf buffer to receive data (at least MAX_SECTOR_SIZE bytes)
83 * @param length unsigned int to receive the number of bytes actually read.
84 * @return PKT_ERR_OK on success, or another PKT_ERR_* code on failure.
86 gdrom_error_t (*read_sector)( struct gdrom_disc *disc,
87 uint32_t lba, int mode,
88 unsigned char *buf, uint32_t *length );
91 * Read the TOC from the disc and write it into the specified buffer.
92 * The method is responsible for returning the data in gd-rom
94 * @param disc pointer to the disc structure
95 * @param buf buffer to receive data (0x198 bytes long)
97 gdrom_error_t (*read_toc)(struct gdrom_disc *disc, unsigned char *buf);
100 * Read the information for the specified sector and return it in the
102 * @param disc pointer to the disc structure
103 * @param session of interest. If 0, return end of disc information.
104 * @param buf buffer to receive data (6 bytes)
106 gdrom_error_t (*read_session)(struct gdrom_disc *disc, int session, unsigned char *buf);
109 * Read the position information (subchannel) for the specified sector
110 * and return it in the supplied buffer. This method does not need to
111 * write the first 4 bytes of the buffer.
112 * @param disc pointer to the disc structure
113 * @param lba sector to get position information for
114 * @param buf buffer to receive data (14 bytes)
116 gdrom_error_t (*read_position)(struct gdrom_disc *disc, uint32_t lba, unsigned char *buf);
119 * Return the current disc status, expressed as a combination of the
120 * IDE_DISC_* flags above.
121 * @param disc pointer to the disc structure
122 * @return an integer status value.
124 int (*drive_status)(struct gdrom_disc *disc);
127 * Begin playing audio from the given lba address on the disc.
129 gdrom_error_t (*play_audio)(struct gdrom_disc *disc, uint32_t lba, uint32_t endlba);
132 * Executed once per time slice to perform house-keeping operations
133 * (checking disc status, media changed, etc).
135 uint32_t (*run_time_slice)( struct gdrom_disc *disc, uint32_t nanosecs );
138 * Close the disc and release any storage or resources allocated including
139 * the disc structure itself.
141 void (*close)( struct gdrom_disc *disc );
142 const gchar *name; /* Device name / Image filename */
146 typedef struct gdrom_image {
147 struct gdrom_disc disc;
150 struct gdrom_track track[99];
151 gchar mcn[14]; /* Media catalogue number */
152 FILE *file; /* Open file stream */
158 typedef struct gdrom_image_class {
160 const gchar *extension;
161 gboolean (*is_valid_file)(FILE *f);
162 gdrom_disc_t (*open_image_file)(const gchar *filename, FILE *f);
163 } *gdrom_image_class_t;
165 extern struct gdrom_image_class nrg_image_class;
166 extern struct gdrom_image_class cdi_image_class;
167 extern struct gdrom_image_class gdi_image_class;
168 extern struct gdrom_image_class cdrom_device_class;
171 * Construct a new image file using the default methods.
173 gdrom_disc_t gdrom_image_new( const gchar *filename, FILE *f );
178 gdrom_disc_t gdrom_image_open( const gchar *filename );
183 void gdrom_image_dump_info( gdrom_disc_t d );
186 * Destroy an image data structure without closing the file
187 * (Intended for use from image loaders only)
189 void gdrom_image_destroy_no_close( gdrom_disc_t d );
192 * Retrieve the disc table of contents, and write it into the buffer in the
193 * format expected by the DC.
194 * @return 0 on success, error code on failure (eg no disc mounted)
196 gdrom_error_t gdrom_get_toc( unsigned char *buf );
199 * Retrieve the short (6-byte) session info, and write it into the buffer.
200 * @return 0 on success, error code on failure.
202 gdrom_error_t gdrom_get_info( unsigned char *buf, int session );
204 gdrom_track_t gdrom_get_track( int track_no );
206 uint8_t gdrom_get_track_no_by_lba( uint32_t lba );
209 * Shortcut to open and mount an image file
210 * @return true on success
212 gboolean gdrom_mount_image( const gchar *filename );
214 void gdrom_mount_disc( gdrom_disc_t disc );
216 void gdrom_unmount_disc( void );
218 gboolean gdrom_is_mounted( void );
220 gdrom_disc_t gdrom_get_current_disc();
222 GList *gdrom_get_native_devices();
224 uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count,
225 int mode, unsigned char *buf, uint32_t *length );
228 * Given a base filename (eg for a .cue file), generate the path for the given
229 * find_name relative to the original file.
230 * @return a newly allocated string.
232 gchar *gdrom_get_relative_filename( const gchar *base_name, const gchar *find_name );
.