Search
lxdream.org :: lxdream/src/gdrom/gddriver.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/gdrom/gddriver.h
changeset 678:35eb00945316
next709:18c39a8e504c
author nkeynes
date Sat Jun 14 11:54:15 2008 +0000 (15 years ago)
permissions -rw-r--r--
last change Change colour params to float
Convert background processing over to scene structure (fixes some depth issues as well)
Add color unclamp when supported
file annotate diff log raw
nkeynes@678
     1
/**
nkeynes@678
     2
 * $Id: gdrom.h 662 2008-03-02 11:38:08Z nkeynes $
nkeynes@678
     3
 *
nkeynes@678
     4
 * This file defines the structures and functions used by the GD-Rom
nkeynes@678
     5
 * disc drivers. (ie, the modules that supply a CD image to be used by the
nkeynes@678
     6
 * system).
nkeynes@678
     7
 *
nkeynes@678
     8
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@678
     9
 *
nkeynes@678
    10
 * This program is free software; you can redistribute it and/or modify
nkeynes@678
    11
 * it under the terms of the GNU General Public License as published by
nkeynes@678
    12
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@678
    13
 * (at your option) any later version.
nkeynes@678
    14
 *
nkeynes@678
    15
 * This program is distributed in the hope that it will be useful,
nkeynes@678
    16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@678
    17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@678
    18
 * GNU General Public License for more details.
nkeynes@678
    19
 */
nkeynes@678
    20
nkeynes@678
    21
#ifndef lxdream_gdrom_driver_H
nkeynes@678
    22
#define lxdream_gdrom_driver_H 1
nkeynes@678
    23
nkeynes@678
    24
#include <stdio.h>
nkeynes@678
    25
#include "lxdream.h"
nkeynes@678
    26
#include "gdrom/gdrom.h"
nkeynes@678
    27
#include <glib/gstrfuncs.h>
nkeynes@678
    28
nkeynes@678
    29
#define MAX_SECTOR_SIZE 2352
nkeynes@678
    30
nkeynes@678
    31
struct gdrom_toc {
nkeynes@678
    32
    uint32_t track[99];
nkeynes@678
    33
    uint32_t first, last, leadout;
nkeynes@678
    34
};
nkeynes@678
    35
nkeynes@678
    36
#define GDROM_PREGAP 150  /* Sectors */
nkeynes@678
    37
nkeynes@678
    38
extern uint32_t gdrom_sector_size[];
nkeynes@678
    39
#define GDROM_SECTOR_SIZE(x) gdrom_sector_size[x]
nkeynes@678
    40
/**
nkeynes@678
    41
 * Track data type enumeration for cd images and devices. This somewhat
nkeynes@678
    42
 * conflates the real track mode with the format of the image file, but
nkeynes@678
    43
 * it manages to make sense so far.
nkeynes@678
    44
 */
nkeynes@678
    45
typedef enum {
nkeynes@678
    46
    GDROM_MODE0,          // Mode 0 - should never actually see this
nkeynes@678
    47
/* Data-only modes (image file contains only the user data) */
nkeynes@678
    48
    GDROM_MODE1,          // Standard CD-Rom Mode 1 data track
nkeynes@678
    49
    GDROM_MODE2_FORMLESS, // Mode 2 data track with no sub-structure (rare)
nkeynes@678
    50
    GDROM_MODE2_FORM1,    // Mode 2/Form 1 data track (standard for multisession)
nkeynes@678
    51
    GDROM_MODE2_FORM2,    // Mode 2/Form 2 data track (also fairly uncommon).
nkeynes@678
    52
    GDROM_CDDA,           // Standard audio track
nkeynes@678
    53
nkeynes@678
    54
/* This one is somewhat special - the image file contains the 2336 bytes of
nkeynes@678
    55
 * "extended user data", which in turn contains either a form 1 or form 2
nkeynes@678
    56
 * sector. In other words it's a raw mode2 XA sector without the 16-byte header.
nkeynes@678
    57
 */
nkeynes@678
    58
    GDROM_SEMIRAW_MODE2,
nkeynes@678
    59
/* Raw modes (image contains the full 2352-byte sector). Split into XA/Non-XA
nkeynes@678
    60
 * here for convenience, although it's really a session level flag. */
nkeynes@678
    61
    GDROM_RAW_XA,
nkeynes@678
    62
    GDROM_RAW_NONXA,
nkeynes@678
    63
} gdrom_track_mode_t;
nkeynes@678
    64
nkeynes@678
    65
/* The disc register indicates the current contents of the drive. When open
nkeynes@678
    66
 * contains 0x06.
nkeynes@678
    67
 */
nkeynes@678
    68
#define IDE_DISC_READY 0x01 /* ored with above */
nkeynes@678
    69
#define IDE_DISC_IDLE  0x02 /* ie spun-down */
nkeynes@678
    70
#define IDE_DISC_NONE  0x06
nkeynes@678
    71
nkeynes@678
    72
#define IDE_DISC_AUDIO   0x00
nkeynes@678
    73
#define IDE_DISC_CDROM   0x10
nkeynes@678
    74
#define IDE_DISC_CDROMXA 0x20
nkeynes@678
    75
#define IDE_DISC_GDROM   0x80
nkeynes@678
    76
nkeynes@678
    77
#define TRACK_PRE_EMPHASIS   0x10
nkeynes@678
    78
#define TRACK_COPY_PERMITTED 0x20
nkeynes@678
    79
#define TRACK_DATA           0x40
nkeynes@678
    80
#define TRACK_FOUR_CHANNEL   0x80
nkeynes@678
    81
nkeynes@678
    82
typedef struct gdrom_track {
nkeynes@678
    83
    gdrom_track_mode_t mode;
nkeynes@678
    84
    uint8_t flags;        /* Track flags */
nkeynes@678
    85
    int      session;     /* session # containing this track */
nkeynes@678
    86
    uint32_t lba;         /* start sector address */
nkeynes@678
    87
    uint32_t sector_size; /* For convenience, determined by mode */
nkeynes@678
    88
    uint32_t sector_count;
nkeynes@678
    89
    uint32_t offset; /* File offset of start of track - image files only */
nkeynes@678
    90
    FILE *file;
nkeynes@678
    91
} *gdrom_track_t;
nkeynes@678
    92
nkeynes@678
    93
struct gdrom_disc {
nkeynes@678
    94
    /**
nkeynes@678
    95
     * Read a single sector from the disc at the specified logical address.
nkeynes@678
    96
     * @param disc pointer to the disc structure
nkeynes@678
    97
     * @param lba logical address to read from
nkeynes@678
    98
     * @param mode mode field from the read command
nkeynes@678
    99
     * @param buf buffer to receive data (at least MAX_SECTOR_SIZE bytes)
nkeynes@678
   100
     * @param length unsigned int to receive the number of bytes actually read.
nkeynes@678
   101
     * @return PKT_ERR_OK on success, or another PKT_ERR_* code on failure.
nkeynes@678
   102
     */
nkeynes@678
   103
    gdrom_error_t (*read_sector)( struct gdrom_disc *disc,
nkeynes@678
   104
                  uint32_t lba, int mode, 
nkeynes@678
   105
                  unsigned char *buf, uint32_t *length );
nkeynes@678
   106
    
nkeynes@678
   107
    /**
nkeynes@678
   108
     * Read the TOC from the disc and write it into the specified buffer.
nkeynes@678
   109
     * The method is responsible for returning the data in gd-rom
nkeynes@678
   110
     * format.
nkeynes@678
   111
     * @param disc pointer to the disc structure
nkeynes@678
   112
     * @param buf buffer to receive data (0x198 bytes long)
nkeynes@678
   113
     */
nkeynes@678
   114
    gdrom_error_t (*read_toc)(struct gdrom_disc *disc, unsigned char *buf);
nkeynes@678
   115
nkeynes@678
   116
    /**
nkeynes@678
   117
     * Read the information for the specified sector and return it in the
nkeynes@678
   118
     * supplied buffer. 
nkeynes@678
   119
     * @param disc pointer to the disc structure
nkeynes@678
   120
     * @param session of interest. If 0, return end of disc information.
nkeynes@678
   121
     * @param buf buffer to receive data (6 bytes)
nkeynes@678
   122
     */
nkeynes@678
   123
    gdrom_error_t (*read_session)(struct gdrom_disc *disc, int session, unsigned char *buf);
nkeynes@678
   124
nkeynes@678
   125
    /**
nkeynes@678
   126
     * Read the position information (subchannel) for the specified sector
nkeynes@678
   127
     * and return it in the supplied buffer. This method does not need to
nkeynes@678
   128
     * write the first 4 bytes of the buffer.
nkeynes@678
   129
     * @param disc pointer to the disc structure
nkeynes@678
   130
     * @param lba sector to get position information for
nkeynes@678
   131
     * @param buf buffer to receive data (14 bytes)
nkeynes@678
   132
     */
nkeynes@678
   133
    gdrom_error_t (*read_position)(struct gdrom_disc *disc, uint32_t lba, unsigned char *buf);
nkeynes@678
   134
nkeynes@678
   135
    /**
nkeynes@678
   136
     * Return the current disc status, expressed as a combination of the 
nkeynes@678
   137
     * IDE_DISC_* flags above.
nkeynes@678
   138
     * @param disc pointer to the disc structure
nkeynes@678
   139
     * @return an integer status value.
nkeynes@678
   140
     */
nkeynes@678
   141
    int (*drive_status)(struct gdrom_disc *disc);
nkeynes@678
   142
nkeynes@678
   143
    /**
nkeynes@678
   144
     * Begin playing audio from the given lba address on the disc.
nkeynes@678
   145
     */
nkeynes@678
   146
    gdrom_error_t (*play_audio)(struct gdrom_disc *disc, uint32_t lba, uint32_t endlba);
nkeynes@678
   147
nkeynes@678
   148
    /**
nkeynes@678
   149
     * Executed once per time slice to perform house-keeping operations 
nkeynes@678
   150
     * (checking disc status, media changed, etc).
nkeynes@678
   151
     */
nkeynes@678
   152
    uint32_t (*run_time_slice)( struct gdrom_disc *disc, uint32_t nanosecs );
nkeynes@678
   153
nkeynes@678
   154
    /**
nkeynes@678
   155
     * Close the disc and release any storage or resources allocated including
nkeynes@678
   156
     * the disc structure itself.
nkeynes@678
   157
     */
nkeynes@678
   158
    void (*close)( struct gdrom_disc *disc );
nkeynes@678
   159
    const gchar *name; /* Device name / Image filename */
nkeynes@678
   160
};
nkeynes@678
   161
nkeynes@678
   162
typedef struct gdrom_image {
nkeynes@678
   163
    struct gdrom_disc disc;
nkeynes@678
   164
    int disc_type;
nkeynes@678
   165
    int track_count;
nkeynes@678
   166
    struct gdrom_track track[99];
nkeynes@678
   167
    gchar mcn[14]; /* Media catalogue number */
nkeynes@678
   168
    FILE *file; /* Open file stream */
nkeynes@678
   169
} *gdrom_image_t;
nkeynes@678
   170
nkeynes@678
   171
/**
nkeynes@678
   172
 *
nkeynes@678
   173
 */
nkeynes@678
   174
typedef struct gdrom_image_class {
nkeynes@678
   175
    const gchar *name;
nkeynes@678
   176
    const gchar *extension;
nkeynes@678
   177
    gboolean (*is_valid_file)(FILE *f);
nkeynes@678
   178
    gdrom_disc_t (*open_image_file)(const gchar *filename, FILE *f);
nkeynes@678
   179
} *gdrom_image_class_t;
nkeynes@678
   180
nkeynes@678
   181
extern struct gdrom_image_class nrg_image_class;
nkeynes@678
   182
extern struct gdrom_image_class cdi_image_class;
nkeynes@678
   183
extern struct gdrom_image_class gdi_image_class;
nkeynes@678
   184
extern struct gdrom_image_class cdrom_device_class;
nkeynes@678
   185
nkeynes@678
   186
/**
nkeynes@678
   187
 * Construct a new image file using the default methods.
nkeynes@678
   188
 */
nkeynes@678
   189
gdrom_disc_t gdrom_image_new( const gchar *filename, FILE *f );
nkeynes@678
   190
nkeynes@678
   191
/**
nkeynes@678
   192
 * Destroy an image data structure without closing the file
nkeynes@678
   193
 * (Intended for use from image loaders only)
nkeynes@678
   194
 */
nkeynes@678
   195
void gdrom_image_destroy_no_close( gdrom_disc_t d );
nkeynes@678
   196
nkeynes@678
   197
nkeynes@678
   198
/**
nkeynes@678
   199
 * Given a base filename (eg for a .cue file), generate the path for the given
nkeynes@678
   200
 * find_name relative to the original file. 
nkeynes@678
   201
 * @return a newly allocated string.
nkeynes@678
   202
 */
nkeynes@678
   203
gchar *gdrom_get_relative_filename( const gchar *base_name, const gchar *find_name );
nkeynes@678
   204
nkeynes@678
   205
#endif
.