2 * $Id: gdrom.h,v 1.13 2007-10-27 05:44:54 nkeynes Exp $
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 */
75 typedef struct gdrom_disc {
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.
85 gdrom_error_t (*read_sector)( struct gdrom_disc *disc,
86 uint32_t lba, int mode,
87 unsigned char *buf, uint32_t *length );
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
93 * @param disc pointer to the disc structure
94 * @param buf buffer to receive data (0x198 bytes long)
96 gdrom_error_t (*read_toc)(struct gdrom_disc *disc, unsigned char *buf);
99 * Read the information for the specified sector and return it in the
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)
105 gdrom_error_t (*read_session)(struct gdrom_disc *disc, int session, unsigned char *buf);
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)
115 gdrom_error_t (*read_position)(struct gdrom_disc *disc, uint32_t lba, unsigned char *buf);
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.
123 int (*drive_status)(struct gdrom_disc *disc);
126 * Begin playing audio from the given lba address on the disc.
128 gdrom_error_t (*play_audio)(struct gdrom_disc *disc, uint32_t lba, uint32_t endlba);
131 * Executed once per time slice to perform house-keeping operations
132 * (checking disc status, media changed, etc).
134 uint32_t (*run_time_slice)( struct gdrom_disc *disc, uint32_t nanosecs );
137 * Close the disc and release any storage or resources allocated including
138 * the disc structure itself.
140 void (*close)( struct gdrom_disc *disc );
141 const gchar *name; /* Device name / Image filename */
145 typedef struct gdrom_image {
146 struct gdrom_disc disc;
149 struct gdrom_track track[99];
150 gchar mcn[14]; /* Media catalogue number */
151 FILE *file; /* Open file stream */
157 typedef struct gdrom_image_class {
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;
169 * Construct a new image file using the default methods.
171 gdrom_disc_t gdrom_image_new( const gchar *filename, FILE *f );
176 gdrom_disc_t gdrom_image_open( const gchar *filename );
181 void gdrom_image_dump_info( gdrom_disc_t d );
184 * Retrieve the disc table of contents, and write it into the buffer in the
185 * format expected by the DC.
186 * @return 0 on success, error code on failure (eg no disc mounted)
188 gdrom_error_t gdrom_get_toc( unsigned char *buf );
191 * Retrieve the short (6-byte) session info, and write it into the buffer.
192 * @return 0 on success, error code on failure.
194 gdrom_error_t gdrom_get_info( unsigned char *buf, int session );
196 gdrom_track_t gdrom_get_track( int track_no );
198 uint8_t gdrom_get_track_no_by_lba( uint32_t lba );
201 * Shortcut to open and mount an image file
202 * @return true on success
204 gboolean gdrom_mount_image( const gchar *filename );
206 void gdrom_mount_disc( gdrom_disc_t disc );
208 void gdrom_unmount_disc( void );
210 gboolean gdrom_is_mounted( void );
212 gdrom_disc_t gdrom_get_current_disc();
214 GList *gdrom_get_native_devices();
216 uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count,
217 int mode, unsigned char *buf, uint32_t *length );
.