Search
lxdream.org :: lxdream/src/drivers/cdrom/cdimpl.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/drivers/cdrom/cdimpl.h
changeset 1097:d4807997e450
author nkeynes
date Tue Feb 28 18:22:52 2012 +1000 (12 years ago)
permissions -rw-r--r--
last change Add a GL-only video driver for android usage (since the Java code is
responsible for creating the context)
file annotate diff log raw
nkeynes@1097
     1
/**
nkeynes@1097
     2
 * $Id$
nkeynes@1097
     3
 *
nkeynes@1097
     4
 * Copyright (c) 2009 Nathan Keynes.
nkeynes@1097
     5
 *
nkeynes@1097
     6
 * Internal CD-ROM implementation header
nkeynes@1097
     7
 *
nkeynes@1097
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@1097
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@1097
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@1097
    11
 * (at your option) any later version.
nkeynes@1097
    12
 *
nkeynes@1097
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@1097
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@1097
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@1097
    16
 * GNU General Public License for more details.
nkeynes@1097
    17
 */
nkeynes@1097
    18
nkeynes@1097
    19
#ifndef cdrom_cdimpl_H
nkeynes@1097
    20
#define cdrom_cdimpl_H 1
nkeynes@1097
    21
nkeynes@1097
    22
#include "drivers/cdrom/cdrom.h"
nkeynes@1097
    23
#include "drivers/cdrom/drive.h"
nkeynes@1097
    24
#include <stdio.h>
nkeynes@1097
    25
nkeynes@1097
    26
#ifdef __cplusplus
nkeynes@1097
    27
extern "C" {
nkeynes@1097
    28
#endif
nkeynes@1097
    29
nkeynes@1097
    30
/**
nkeynes@1097
    31
 * Disc factory implementation, to construct cdrom_disc_t objects from a file
nkeynes@1097
    32
 * (if possible).
nkeynes@1097
    33
 */
nkeynes@1097
    34
typedef struct cdrom_disc_factory {
nkeynes@1097
    35
    /* Human-readable name for the discs constructed by the factory */
nkeynes@1097
    36
    const char *display_name;
nkeynes@1097
    37
    /* Default file extension for supported discs */
nkeynes@1097
    38
    const char *extension;
nkeynes@1097
    39
nkeynes@1097
    40
    /* Test if the given file is facially valid for the factory
nkeynes@1097
    41
     * (that is, it passes all file magic etc checks)
nkeynes@1097
    42
     */
nkeynes@1097
    43
    gboolean (*is_valid_file)(FILE *f);
nkeynes@1097
    44
nkeynes@1097
    45
    /* Perform any additional initialization needed for the disc type
nkeynes@1097
    46
     * (run after the default initialization). May be NULL if no init
nkeynes@1097
    47
     * is needed
nkeynes@1097
    48
     * @return TRUE on success, FALSE on error.
nkeynes@1097
    49
     */ 
nkeynes@1097
    50
    gboolean (*init)(cdrom_disc_t disc, ERROR *err);
nkeynes@1097
    51
    
nkeynes@1097
    52
    /* Read the table of contents from the given file, and update the disc
nkeynes@1097
    53
     * accordingly. On error, set the err message and return FALSE.
nkeynes@1097
    54
     */
nkeynes@1097
    55
    gboolean (*read_toc)(cdrom_disc_t disc, ERROR *err);
nkeynes@1097
    56
nkeynes@1097
    57
} *cdrom_disc_factory_t;
nkeynes@1097
    58
nkeynes@1097
    59
/**
nkeynes@1097
    60
 * Low-level SCSI transport provided to the main SCSI/MMC driver. When used
nkeynes@1097
    61
 * this will be set as the disc->impl_data field.
nkeynes@1097
    62
 * Note: For symmetry there should be a packet_write variant, but we don't
nkeynes@1097
    63
 * currently need it for anything. YAGNI, etc.
nkeynes@1097
    64
 */
nkeynes@1097
    65
typedef struct cdrom_scsi_transport {
nkeynes@1097
    66
        /* Execute a read command (ie a command that returns a block of data in
nkeynes@1097
    67
         * response, not necessarily a CD read).
nkeynes@1097
    68
         * @param disc The disc to execute the command
nkeynes@1097
    69
         * @param cmd  The 12-byte command packet
nkeynes@1097
    70
         * @param buf  The buffer to receive the read results
nkeynes@1097
    71
         * @param length On entry, the size of buf. Modified on exit to the number
nkeynes@1097
    72
         *        of bytes actually read.
nkeynes@1097
    73
         * @return PKT_ERR_OK on success, otherwise the host error code.
nkeynes@1097
    74
         */
nkeynes@1097
    75
        cdrom_error_t (*packet_read)( struct cdrom_disc *disc,
nkeynes@1097
    76
                                      char *cmd, unsigned char *buf,
nkeynes@1097
    77
                                      unsigned int *length );
nkeynes@1097
    78
nkeynes@1097
    79
        /* Execute a generic command that does not write or return any data.
nkeynes@1097
    80
         * (eg play audio).
nkeynes@1097
    81
         * @param scsi The disc to execute the command
nkeynes@1097
    82
         * @param cmd  The 12-byte command packet
nkeynes@1097
    83
         * @return PKT_ERR_OK on success, otherwise the host error code.
nkeynes@1097
    84
         */
nkeynes@1097
    85
        cdrom_error_t (*packet_cmd)( struct cdrom_disc *disc,
nkeynes@1097
    86
                                     char *cmd );
nkeynes@1097
    87
nkeynes@1097
    88
        /* Return TRUE if the media has changed since the last call, otherwise
nkeynes@1097
    89
         * FALSE. This method is used to implement the disc-level check_status
nkeynes@1097
    90
         * and should have no side-effects.
nkeynes@1097
    91
         */
nkeynes@1097
    92
        gboolean (*media_changed)( struct cdrom_disc *disc );
nkeynes@1097
    93
} *cdrom_scsi_transport_t;
nkeynes@1097
    94
nkeynes@1097
    95
#define SCSI_TRANSPORT(disc)  ((cdrom_scsi_transport_t)disc->impl_data)
nkeynes@1097
    96
nkeynes@1097
    97
/**
nkeynes@1097
    98
 * Initialize a previously allocated cdrom_disc_t.
nkeynes@1097
    99
 */
nkeynes@1097
   100
cdrom_disc_t cdrom_disc_init( cdrom_disc_t disc, const char *filename );
nkeynes@1097
   101
nkeynes@1097
   102
/**
nkeynes@1097
   103
 * Allocate and initialize a new cdrom_disc_t with the defaults for image files
nkeynes@1097
   104
 */
nkeynes@1097
   105
cdrom_disc_t cdrom_disc_new( const char *name, ERROR *err );
nkeynes@1097
   106
nkeynes@1097
   107
/**
nkeynes@1097
   108
 * Read the table of contents from a scsi disc.
nkeynes@1097
   109
 */
nkeynes@1097
   110
gboolean cdrom_disc_scsi_read_toc( cdrom_disc_t disc, ERROR *err );
nkeynes@1097
   111
nkeynes@1097
   112
/**
nkeynes@1097
   113
 * Allocate and initialize a new cdrom_disc_t using a scsi transport.
nkeynes@1097
   114
 */
nkeynes@1097
   115
cdrom_disc_t cdrom_disc_scsi_new( const char *name, cdrom_scsi_transport_t transport, ERROR *err );
nkeynes@1097
   116
nkeynes@1097
   117
/**
nkeynes@1097
   118
 * Allocate and initialize a new cdrom_disc_t using a scsi transport and an
nkeynes@1097
   119
 * open file
nkeynes@1097
   120
 */
nkeynes@1097
   121
cdrom_disc_t cdrom_disc_scsi_new_file( FILE *f, const char *filename, cdrom_scsi_transport_t transport, ERROR *err );
nkeynes@1097
   122
nkeynes@1097
   123
nkeynes@1097
   124
void cdrom_disc_scsi_init( cdrom_disc_t disc, cdrom_scsi_transport_t scsi );
nkeynes@1097
   125
nkeynes@1097
   126
/**
nkeynes@1097
   127
 * Compute derived values for the TOC where they have not already been set
nkeynes@1097
   128
 *   - Determine disc leadout from end of the last track
nkeynes@1097
   129
 *   - Set the disc type to the based on the track types present.
nkeynes@1097
   130
 */
nkeynes@1097
   131
void cdrom_disc_finalize_toc( cdrom_disc_t disc );
nkeynes@1097
   132
nkeynes@1097
   133
/**
nkeynes@1097
   134
 * Clear all TOC values in preparation for replacing with a new TOC
nkeynes@1097
   135
 */
nkeynes@1097
   136
void cdrom_disc_clear_toc( cdrom_disc_t disc );
nkeynes@1097
   137
nkeynes@1097
   138
/**
nkeynes@1097
   139
 * Re-read the table of contents of the disc
nkeynes@1097
   140
 */
nkeynes@1097
   141
gboolean cdrom_disc_read_toc( cdrom_disc_t disc, ERROR *err );
nkeynes@1097
   142
nkeynes@1097
   143
/**
nkeynes@1097
   144
 * track source for a host CD-ROM device, for use by host implementations
nkeynes@1097
   145
 */
nkeynes@1097
   146
sector_source_t track_sector_source_new( cdrom_disc_t disc, sector_mode_t mode, cdrom_lba_t lba, cdrom_count_t count );
nkeynes@1097
   147
nkeynes@1097
   148
/**
nkeynes@1097
   149
 * Get the base file used by the cdrom, or NULL if there is no such file.
nkeynes@1097
   150
 */
nkeynes@1097
   151
FILE *cdrom_disc_get_base_file( cdrom_disc_t disc );
nkeynes@1097
   152
nkeynes@1097
   153
#define cdrom_disc_get_base_fd(disc) fileno(cdrom_disc_get_base_file(disc))
nkeynes@1097
   154
nkeynes@1097
   155
/**
nkeynes@1097
   156
 * Default disc destructor method
nkeynes@1097
   157
 */
nkeynes@1097
   158
void default_cdrom_disc_destroy( sector_source_t device );
nkeynes@1097
   159
nkeynes@1097
   160
/******************** Physical drive support *********************/
nkeynes@1097
   161
nkeynes@1097
   162
/**
nkeynes@1097
   163
 * Add a physical drive to the list.
nkeynes@1097
   164
 * @return the new cdrom_drive_t entry. If the drive was already in the list,
nkeynes@1097
   165
 * returns the existing entry instead and does not add a new one.
nkeynes@1097
   166
 */
nkeynes@1097
   167
cdrom_drive_t cdrom_drive_add( const char *name, const char *display_name, cdrom_drive_open_fn_t open_fn );
nkeynes@1097
   168
nkeynes@1097
   169
/**
nkeynes@1097
   170
 * Remove a physical drive from the list, specified by name.
nkeynes@1097
   171
 * @return TRUE if the drive was removed, FALSE if the drive was not in the list.
nkeynes@1097
   172
 */
nkeynes@1097
   173
gboolean cdrom_drive_remove( const char *name );
nkeynes@1097
   174
nkeynes@1097
   175
/**
nkeynes@1097
   176
 * Clear the cdrom drive list.
nkeynes@1097
   177
 */
nkeynes@1097
   178
void cdrom_drive_remove_all();
nkeynes@1097
   179
nkeynes@1097
   180
/************************* MMC support ***************************/
nkeynes@1097
   181
nkeynes@1097
   182
/**
nkeynes@1097
   183
 * Parse a standard MMC format-2 TOC into the disc structure.
nkeynes@1097
   184
 */
nkeynes@1097
   185
void mmc_parse_toc2( cdrom_disc_t disc, unsigned char *buf );
nkeynes@1097
   186
nkeynes@1097
   187
/**
nkeynes@1097
   188
 * Read a standard MMC inquiry response, returning a newly allocated string
nkeynes@1097
   189
 * of the form "<vendor> <product> <revision>"
nkeynes@1097
   190
 */
nkeynes@1097
   191
const char *mmc_parse_inquiry( unsigned char *buf );
nkeynes@1097
   192
nkeynes@1097
   193
nkeynes@1097
   194
nkeynes@1097
   195
#ifdef __cplusplus
nkeynes@1097
   196
}
nkeynes@1097
   197
#endif
nkeynes@1097
   198
nkeynes@1097
   199
#endif /* !cdrom_cdimpl_H */
.