2 * $Id: gdrom.h,v 1.10 2007-01-31 10:58:42 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
26 #define MAX_SECTOR_SIZE 2352
28 typedef uint16_t gdrom_error_t;
32 uint32_t first, last, leadout;
35 #define GDROM_PREGAP 150 /* Sectors */
37 extern uint32_t gdrom_sector_size[];
38 #define GDROM_SECTOR_SIZE(x) gdrom_sector_size[x]
49 /* The disc register indicates the current contents of the drive. When open
52 #define IDE_DISC_AUDIO 0x00
53 #define IDE_DISC_NONE 0x06
54 #define IDE_DISC_CDROM 0x20
55 #define IDE_DISC_GDROM 0x80
56 #define IDE_DISC_READY 0x01 /* ored with above */
57 #define IDE_DISC_IDLE 0x02 /* ie spun-down */
59 #define TRACK_PRE_EMPHASIS 0x10
60 #define TRACK_COPY_PERMITTED 0x20
61 #define TRACK_DATA 0x40
62 #define TRACK_FOUR_CHANNEL 0x80
64 typedef struct gdrom_track {
65 gdrom_track_mode_t mode;
66 uint8_t flags; /* Track flags */
67 int session; /* session # containing this track */
68 uint32_t lba; /* start sector address */
69 uint32_t sector_size; /* For convenience, determined by mode */
70 uint32_t sector_count;
71 uint32_t offset; /* File offset of start of track - image files only */
74 typedef struct gdrom_disc {
76 * Read a single sector from the disc at the specified logical address.
77 * @param disc pointer to the disc structure
78 * @param lba logical address to read from
79 * @param mode mode field from the read command
80 * @param buf buffer to receive data (at least MAX_SECTOR_SIZE bytes)
81 * @param length unsigned int to receive the number of bytes actually read.
82 * @return PKT_ERR_OK on success, or another PKT_ERR_* code on failure.
84 gdrom_error_t (*read_sector)( struct gdrom_disc *disc,
85 uint32_t lba, int mode,
86 char *buf, uint32_t *length );
89 * Read the TOC from the disc and write it into the specified buffer.
90 * The method is responsible for returning the data in gd-rom
92 * @param disc pointer to the disc structure
93 * @param buf buffer to receive data (0x198 bytes long)
95 gdrom_error_t (*read_toc)(struct gdrom_disc *disc, char *buf);
98 * Read the information for the specified sector and return it in the
100 * @param disc pointer to the disc structure
101 * @param session of interest. If 0, return end of disc information.
102 * @param buf buffer to receive data (6 bytes)
104 gdrom_error_t (*read_session)(struct gdrom_disc *disc, int session, char *buf);
107 * Read the position information (subchannel) for the specified sector
108 * and return it in the supplied buffer. This method does not need to
109 * write the first 4 bytes of the buffer.
110 * @param disc pointer to the disc structure
111 * @param lba sector to get position information for
112 * @param buf buffer to receive data (14 bytes)
114 gdrom_error_t (*read_position)(struct gdrom_disc *disc, uint32_t lba, char *buf);
117 * Return the current disc status, expressed as a combination of the
118 * IDE_DISC_* flags above.
119 * @param disc pointer to the disc structure
120 * @return an integer status value.
122 int (*drive_status)(struct gdrom_disc *disc);
125 * Begin playing audio from the given lba address on the disc.
127 gdrom_error_t (*play_audio)(struct gdrom_disc *disc, uint32_t lba);
130 * Executed once per time slice to perform house-keeping operations
131 * (checking disc status, media changed, etc).
133 uint32_t (*run_time_slice)( struct gdrom_disc *disc, uint32_t nanosecs );
136 * Close the disc and release any storage or resources allocated including
137 * the disc structure itself.
139 void (*close)( struct gdrom_disc *disc );
143 typedef struct gdrom_image {
144 struct gdrom_disc disc;
147 struct gdrom_track track[99];
148 gchar mcn[14]; /* Media catalogue number */
149 const gchar *filename; /* Image filename */
150 FILE *file; /* Open file stream */
156 typedef struct gdrom_image_class {
158 const gchar *extension;
159 gboolean (*is_valid_file)(FILE *f);
160 gdrom_disc_t (*open_image_file)(const gchar *filename, FILE *f);
161 } *gdrom_image_class_t;
163 extern struct gdrom_image_class nrg_image_class;
164 extern struct gdrom_image_class cdi_image_class;
165 extern struct gdrom_image_class linux_device_class;
168 * Construct a new image file using the default methods.
170 gdrom_disc_t gdrom_image_new( FILE *file );
175 gdrom_disc_t gdrom_image_open( const gchar *filename );
178 * Retrieve the disc table of contents, and write it into the buffer in the
179 * format expected by the DC.
180 * @return 0 on success, error code on failure (eg no disc mounted)
182 gdrom_error_t gdrom_get_toc( char *buf );
185 * Retrieve the short (6-byte) session info, and write it into the buffer.
186 * @return 0 on success, error code on failure.
188 gdrom_error_t gdrom_get_info( char *buf, int session );
190 gdrom_track_t gdrom_get_track( int track_no );
192 uint8_t gdrom_get_track_no_by_lba( uint32_t lba );
195 * Shortcut to open and mount an image file
197 gdrom_disc_t gdrom_mount_image( const gchar *filename );
199 void gdrom_mount_disc( gdrom_disc_t disc );
201 void gdrom_unmount_disc( void );
203 gboolean gdrom_is_mounted( void );
205 uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count,
206 int mode, char *buf, uint32_t *length );
.