summaryrefslogtreecommitdiff
path: root/include/cdio/read.h
blob: 81e5148a35c74d541e9bbb86d23c6a6aba4b9ec5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/*
    $Id: read.h,v 1.15 2008/03/25 15:59:09 karl Exp $

    Copyright (C) 2005, 2006, 2007, 2008 Rocky Bernstein <rocky@gnu.org>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/** \file read.h 
 *
 *  \brief The top-level header for sector (block, frame)-related
 *  libcdio calls. 
 */

#ifndef __CDIO_READ_H__
#define __CDIO_READ_H__

#ifndef EXTERNAL_LIBCDIO_CONFIG_H
#define EXTERNAL_LIBCDIO_CONFIG_H
/* Need for HAVE_SYS_TYPES_H */
#include <cdio/cdio_config.h>
#endif

#ifdef HAVE_SYS_TYPES_H
/* Some systems need this for off_t and ssize. */
#include <sys/types.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

  /** All the different ways a block/sector can be read. */
  typedef enum {
    CDIO_READ_MODE_AUDIO,  /**< CD-DA, audio, Red Book */
    CDIO_READ_MODE_M1F1,   /**< Mode 1 Form 1 */
    CDIO_READ_MODE_M1F2,   /**< Mode 1 Form 2 */
    CDIO_READ_MODE_M2F1,   /**< Mode 2 Form 1 */
    CDIO_READ_MODE_M2F2    /**< Mode 2 Form 2 */
  } cdio_read_mode_t;
  
  /*!
    Reposition read offset
    Similar to (if not the same as) libc's fseek()

    @param p_cdio object which gets adjusted
    @param offset amount to seek
    @param whence  like corresponding parameter in libc's fseek, e.g. 
                   SEEK_SET or SEEK_END.
    @return (off_t) -1 on error. 
  */

  off_t cdio_lseek(const CdIo_t *p_cdio, off_t offset, int whence);
    
  /*!  Reads into buf the next size bytes.  Similar to (if not the
    same as) libc's read(). This is a "cooked" read, or one handled by
    the OS. It probably won't work on audio data. For that use
    cdio_read_audio_sector(s).

    @param p_cdio object to read from
    @param p_buf place to read data into. The caller should make sure
                 this location can store at least i_size bytes.
    @param i_size number of bytes to read

    @return (ssize_t) -1 on error. 
  */
  ssize_t cdio_read(const CdIo_t *p_cdio, void *p_buf, size_t i_size);
    
  /*!
    Read an audio sector

    @param p_cdio object to read from
    @param p_buf place to read data into. The caller should make sure
                 this location can store at least CDIO_FRAMESIZE_RAW
		 bytes.
    @param i_lsn sector to read
  */
  driver_return_code_t cdio_read_audio_sector (const CdIo_t *p_cdio, 
					       void *p_buf, lsn_t i_lsn);

  /*!
    Reads audio sectors

    @param p_cdio object to read from
    @param p_buf place to read data into. The caller should make sure
                 this location can store at least CDIO_FRAMESIZE_RAW
		 * i_blocks bytes.
    @param i_lsn sector to read
    @param i_blocks number of sectors to read
  */
  driver_return_code_t cdio_read_audio_sectors (const CdIo_t *p_cdio, 
						void *p_buf, lsn_t i_lsn,
						uint32_t i_blocks);

  /*!
    Read data sectors

    @param p_cdio object to read from
    @param p_buf place to read data into.  The caller should make sure
                 this location can store at least ISO_BLOCKSIZE, 
		 M2RAW_SECTOR_SIZE, or M2F2_SECTOR_SIZE depending
		 on the kind of sector getting read. If you don't 
		 know whether you have a Mode 1/2, Form 1/ Form 2/Formless
		 sector best to reserve space for the maximum, 
		 M2RAW_SECTOR_SIZE.
    @param i_lsn sector to read
    @param i_blocksize size of block. Should be either CDIO_CD_FRAMESIZE, 
    M2RAW_SECTOR_SIZE, or M2F2_SECTOR_SIZE. See comment above under p_buf.

    @param i_blocks number of blocks to read
  */
  driver_return_code_t cdio_read_data_sectors ( const CdIo_t *p_cdio, 
						void *p_buf, lsn_t i_lsn,
						uint16_t i_blocksize,
						uint32_t i_blocks );
  /*!
    Reads a mode 1 sector

    @param p_cdio object to read from
    @param p_buf place to read data into.
    @param i_lsn sector to read
    @param b_form2 true for reading mode 1 form 2 sectors or false for 
    mode 1 form 1 sectors.
  */
  driver_return_code_t cdio_read_mode1_sector (const CdIo_t *p_cdio, 
					       void *p_buf, lsn_t i_lsn, 
					       bool b_form2);
  /*!
    Reads mode 1 sectors

    @param p_cdio object to read from
    @param p_buf place to read data into
    @param i_lsn sector to read
    @param b_form2 true for reading mode 1 form 2 sectors or false for 
    mode 1 form 1 sectors.
    @param i_blocks number of sectors to read
  */
  driver_return_code_t cdio_read_mode1_sectors (const CdIo_t *p_cdio, 
						void *p_buf, lsn_t i_lsn, 
						bool b_form2, 
						uint32_t i_blocks);
  /*!
    Reads a mode 2 sector

    @param p_cdio object to read from
    @param p_buf place to read data into. The caller should make sure
                 this location can store at least 
		 M2RAW_SECTOR_SIZE (for form 1) or CDIO_CD_FRAMESIZE (for 
		 form 2) bytes.
    @param i_lsn sector to read
    @param b_form2 true for reading mode 2 form 2 sectors or false for 
    mode 2 form 1 sectors.

    @return 0 if no error, nonzero otherwise.
  */
  driver_return_code_t cdio_read_mode2_sector (const CdIo_t *p_cdio, 
					       void *p_buf, lsn_t i_lsn, 
					       bool b_form2);
  
  /** The special case of reading a single block is a common one so we
      provide a routine for that as a convenience.
  */
  driver_return_code_t cdio_read_sector(const CdIo_t *p_cdio, void *p_buf, 
					lsn_t i_lsn, 
					cdio_read_mode_t read_mode);
  /*!
    Reads mode 2 sectors

    @param p_cdio object to read from
    @param p_buf place to read data into. The caller should make sure
                 this location can store at least 
		 M2RAW_SECTOR_SIZE (for form 1) or CDIO_CD_FRAMESIZE (for 
		 form 2) * i_blocks bytes.
    @param i_lsn sector to read
    @param b_form2 true for reading mode2 form 2 sectors or false for 
           mode 2  form 1 sectors.
    @param i_blocks number of sectors to read

    @return 0 if no error, nonzero otherwise.
  */
  driver_return_code_t cdio_read_mode2_sectors (const CdIo_t *p_cdio, 
						void *p_buf, lsn_t i_lsn, 
						bool b_form2, 
						uint32_t i_blocks);
  
  /*!
    Reads a number of sectors (AKA blocks).

    @param p_cdio cdio object
    @param p_buf place to read data into. The caller should make sure
    this location is large enough. See below for size information.
    @param read_mode the kind of "mode" to use in reading.
    @param i_lsn sector to read
    @param i_blocks number of sectors to read
    @return DRIVER_OP_SUCCESS (0) if no error, other (negative) enumerations
    are returned on error.

    If read_mode is CDIO_MODE_AUDIO,
      *p_buf should hold at least CDIO_FRAMESIZE_RAW * i_blocks bytes.

    If read_mode is CDIO_MODE_DATA,
      *p_buf should hold at least i_blocks times either ISO_BLOCKSIZE, 
      M1RAW_SECTOR_SIZE or M2F2_SECTOR_SIZE depending on the kind of 
      sector getting read. If you don't know whether you have a Mode 1/2, 
    Form 1/ Form 2/Formless sector best to reserve space for the maximum
    which is M2RAW_SECTOR_SIZE.

    If read_mode is CDIO_MODE_M2F1,
    *p_buf should hold at least M2RAW_SECTOR_SIZE * i_blocks bytes.
    
    If read_mode is CDIO_MODE_M2F2,
    *p_buf should hold at least CDIO_CD_FRAMESIZE * i_blocks bytes.
    
  */
  driver_return_code_t cdio_read_sectors(const CdIo_t *p_cdio, void *p_buf, 
					 lsn_t i_lsn, 
					 cdio_read_mode_t read_mode,
					 uint32_t i_blocks);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __CDIO_TRACK_H__ */