Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
670 lines (611 loc) · 18.4 KB

SDL_syscdrom.c

File metadata and controls

670 lines (611 loc) · 18.4 KB
 
Apr 26, 2001
Apr 26, 2001
1
/*
Feb 1, 2006
Feb 1, 2006
2
3
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library 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
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
20
21
22
23
Carsten Griwodz
griff@kom.tu-darmstadt.de
based on linux/SDL_syscdrom.c by Sam Lantinga
*/
Feb 21, 2006
Feb 21, 2006
24
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
25
Apr 14, 2006
Apr 14, 2006
26
27
#ifdef SDL_CDROM_AIX
Apr 26, 2001
Apr 26, 2001
28
29
/* Functions for system-level CD-ROM audio control */
Feb 16, 2006
Feb 16, 2006
30
/*#define DEBUG_CDROM 1*/
Apr 26, 2001
Apr 26, 2001
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/devinfo.h>
#include <sys/mntctl.h>
#include <sys/statfs.h>
#include <sys/vmount.h>
#include <fstab.h>
#include <sys/scdisk.h>
#include "SDL_cdrom.h"
Feb 16, 2006
Feb 16, 2006
47
#include "../SDL_syscdrom.h"
Apr 26, 2001
Apr 26, 2001
48
49
/* The maximum number of CD-ROM drives we'll detect */
May 28, 2006
May 28, 2006
50
#define MAX_DRIVES 16
Apr 26, 2001
Apr 26, 2001
51
52
53
54
55
56
/* A list of available CD-ROM drives */
static char *SDL_cdlist[MAX_DRIVES];
static dev_t SDL_cdmode[MAX_DRIVES];
/* The system-dependent CD control functions */
May 29, 2006
May 29, 2006
57
58
59
60
61
62
63
64
65
66
67
static const char *SDL_SYS_CDName(int drive);
static int SDL_SYS_CDOpen(int drive);
static int SDL_SYS_CDGetTOC(SDL_CD * cdrom);
static CDstatus SDL_SYS_CDStatus(SDL_CD * cdrom, int *position);
static int SDL_SYS_CDPlay(SDL_CD * cdrom, int start, int length);
static int SDL_SYS_CDPause(SDL_CD * cdrom);
static int SDL_SYS_CDResume(SDL_CD * cdrom);
static int SDL_SYS_CDStop(SDL_CD * cdrom);
static int SDL_SYS_CDEject(SDL_CD * cdrom);
static void SDL_SYS_CDClose(SDL_CD * cdrom);
static int SDL_SYS_CDioctl(int id, int command, void *arg);
Apr 26, 2001
Apr 26, 2001
68
69
/* Check a drive to see if it is a CD-ROM */
May 28, 2006
May 28, 2006
70
static int
May 29, 2006
May 29, 2006
71
CheckDrive(char *drive, struct stat *stbuf)
Apr 26, 2001
Apr 26, 2001
72
73
74
75
76
77
78
{
int is_cd;
int cdfd;
int ret;
struct devinfo info;
/* If it doesn't exist, return -1 */
May 29, 2006
May 29, 2006
79
if (stat(drive, stbuf) < 0) {
Apr 26, 2001
Apr 26, 2001
80
81
82
83
84
return -1;
}
/* If it does exist, verify that it's an available CD-ROM */
is_cd = 0;
May 29, 2006
May 29, 2006
85
86
if (S_ISCHR(stbuf->st_mode) || S_ISBLK(stbuf->st_mode)) {
cdfd = open(drive, (O_RDONLY | O_EXCL | O_NONBLOCK), 0);
May 28, 2006
May 28, 2006
87
if (cdfd >= 0) {
May 29, 2006
May 29, 2006
88
ret = SDL_SYS_CDioctl(cdfd, IOCINFO, &info);
May 28, 2006
May 28, 2006
89
90
91
92
93
94
95
96
97
98
if (ret < 0) {
/* Some kind of error */
is_cd = 0;
} else {
if (info.devtype == DD_CDROM) {
is_cd = 1;
} else {
is_cd = 0;
}
}
May 29, 2006
May 29, 2006
99
close(cdfd);
May 28, 2006
May 28, 2006
100
}
Apr 26, 2001
Apr 26, 2001
101
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 2006
102
else {
May 29, 2006
May 29, 2006
103
104
fprintf(stderr, "Could not open drive %s (%s)\n", drive,
strerror(errno));
May 28, 2006
May 28, 2006
105
}
Apr 26, 2001
Apr 26, 2001
106
107
108
109
110
111
#endif
}
return is_cd;
}
/* Add a CD-ROM drive to our list of valid drives */
May 28, 2006
May 28, 2006
112
static void
May 29, 2006
May 29, 2006
113
AddDrive(char *drive, struct stat *stbuf)
Apr 26, 2001
Apr 26, 2001
114
{
May 28, 2006
May 28, 2006
115
116
117
118
119
120
121
122
int i;
if (SDL_numcds < MAX_DRIVES) {
/* Check to make sure it's not already in our list.
This can happen when we see a drive via symbolic link.
*/
for (i = 0; i < SDL_numcds; ++i) {
if (stbuf->st_rdev == SDL_cdmode[i]) {
Apr 26, 2001
Apr 26, 2001
123
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
124
125
fprintf(stderr, "Duplicate drive detected: %s == %s\n",
drive, SDL_cdlist[i]);
Apr 26, 2001
Apr 26, 2001
126
#endif
May 28, 2006
May 28, 2006
127
128
129
130
131
132
return;
}
}
/* Add this drive to our list */
i = SDL_numcds;
May 29, 2006
May 29, 2006
133
SDL_cdlist[i] = SDL_strdup(drive);
May 28, 2006
May 28, 2006
134
if (SDL_cdlist[i] == NULL) {
May 29, 2006
May 29, 2006
135
SDL_OutOfMemory();
May 28, 2006
May 28, 2006
136
137
138
139
return;
}
SDL_cdmode[i] = stbuf->st_rdev;
++SDL_numcds;
Apr 26, 2001
Apr 26, 2001
140
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
141
fprintf(stderr, "Added CD-ROM drive: %s\n", drive);
Apr 26, 2001
Apr 26, 2001
142
#endif
May 28, 2006
May 28, 2006
143
}
Apr 26, 2001
Apr 26, 2001
144
145
}
May 28, 2006
May 28, 2006
146
static void
May 29, 2006
May 29, 2006
147
CheckMounts()
Apr 26, 2001
Apr 26, 2001
148
{
May 28, 2006
May 28, 2006
149
150
151
152
153
char *buffer;
int bufsz;
struct vmount *ptr;
int ret;
May 29, 2006
May 29, 2006
154
buffer = (char *) SDL_malloc(10);
May 28, 2006
May 28, 2006
155
156
bufsz = 10;
if (buffer == NULL) {
May 29, 2006
May 29, 2006
157
158
159
fprintf(stderr,
"Could not allocate 10 bytes in aix/SDL_syscdrom.c:CheckMounts\n");
exit(-10);
Apr 26, 2001
Apr 26, 2001
160
161
}
May 28, 2006
May 28, 2006
162
163
do {
/* mntctrl() returns an array of all mounted filesystems */
May 29, 2006
May 29, 2006
164
ret = mntctl(MCTL_QUERY, bufsz, buffer);
May 28, 2006
May 28, 2006
165
166
167
168
169
if (ret == 0) {
/* Buffer was too small, realloc. */
bufsz = *(int *) buffer; /* Required size is in first word. */
/* (whatever a word is in AIX 4.3.3) */
/* int seems to be OK in 32bit mode. */
May 29, 2006
May 29, 2006
170
171
SDL_free(buffer);
buffer = (char *) SDL_malloc(bufsz);
May 28, 2006
May 28, 2006
172
if (buffer == NULL) {
May 29, 2006
May 29, 2006
173
174
175
176
fprintf(stderr,
"Could not allocate %d bytes in aix/SDL_syscdrom.c:CheckMounts\n",
bufsz);
exit(-10);
Apr 26, 2001
Apr 26, 2001
177
}
May 28, 2006
May 28, 2006
178
} else if (ret < 0) {
Apr 26, 2001
Apr 26, 2001
179
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
180
fprintf(stderr, "Error reading vmount structures\n");
Apr 26, 2001
Apr 26, 2001
181
#endif
May 28, 2006
May 28, 2006
182
183
return;
}
Apr 26, 2001
Apr 26, 2001
184
}
May 28, 2006
May 28, 2006
185
while (ret == 0);
Apr 26, 2001
Apr 26, 2001
186
187
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
188
fprintf(stderr, "Read %d vmount structures\n", ret);
Apr 26, 2001
Apr 26, 2001
189
#endif
May 28, 2006
May 28, 2006
190
191
192
193
ptr = (struct vmount *) buffer;
do {
switch (ptr->vmt_gfstype) {
case MNT_CDROM:
Apr 26, 2001
Apr 26, 2001
194
{
May 28, 2006
May 28, 2006
195
196
struct stat stbuf;
char *text;
Apr 26, 2001
Apr 26, 2001
197
May 28, 2006
May 28, 2006
198
text = (char *) ptr + ptr->vmt_data[VMT_OBJECT].vmt_off;
Apr 26, 2001
Apr 26, 2001
199
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
200
201
202
fprintf(stderr,
"Checking mount path: %s mounted on %s\n", text,
(char *) ptr + ptr->vmt_data[VMT_STUB].vmt_off);
Apr 26, 2001
Apr 26, 2001
203
#endif
May 29, 2006
May 29, 2006
204
205
if (CheckDrive(text, &stbuf) > 0) {
AddDrive(text, &stbuf);
Apr 26, 2001
Apr 26, 2001
206
207
}
}
May 28, 2006
May 28, 2006
208
209
210
211
212
213
break;
default:
break;
}
ptr = (struct vmount *) ((char *) ptr + ptr->vmt_length);
ret--;
Apr 26, 2001
Apr 26, 2001
214
}
May 28, 2006
May 28, 2006
215
while (ret > 0);
Apr 26, 2001
Apr 26, 2001
216
May 29, 2006
May 29, 2006
217
free(buffer);
Apr 26, 2001
Apr 26, 2001
218
219
}
May 28, 2006
May 28, 2006
220
static int
May 29, 2006
May 29, 2006
221
CheckNonmounts()
Apr 26, 2001
Apr 26, 2001
222
223
{
#ifdef _THREAD_SAFE
May 28, 2006
May 28, 2006
224
225
226
AFILE_t fsFile = NULL;
int passNo = 0;
int ret;
Apr 26, 2001
Apr 26, 2001
227
struct fstab entry;
May 28, 2006
May 28, 2006
228
229
struct stat stbuf;
May 29, 2006
May 29, 2006
230
ret = setfsent_r(&fsFile, &passNo);
May 28, 2006
May 28, 2006
231
232
233
if (ret != 0)
return -1;
do {
May 29, 2006
May 29, 2006
234
ret = getfsent_r(&entry, &fsFile, &passNo);
May 28, 2006
May 28, 2006
235
if (ret == 0) {
May 29, 2006
May 29, 2006
236
char *l = SDL_strrchr(entry.fs_spec, '/');
May 28, 2006
May 28, 2006
237
if (l != NULL) {
May 29, 2006
May 29, 2006
238
if (!SDL_strncmp("cd", ++l, 2)) {
Apr 26, 2001
Apr 26, 2001
239
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
240
241
242
fprintf(stderr,
"Found unmounted CD ROM drive with device name %s\n",
entry.fs_spec);
Apr 26, 2001
Apr 26, 2001
243
#endif
May 29, 2006
May 29, 2006
244
245
if (CheckDrive(entry.fs_spec, &stbuf) > 0) {
AddDrive(entry.fs_spec, &stbuf);
May 28, 2006
May 28, 2006
246
}
Apr 26, 2001
Apr 26, 2001
247
248
249
250
}
}
}
}
May 28, 2006
May 28, 2006
251
while (ret == 0);
May 29, 2006
May 29, 2006
252
ret = endfsent_r(&fsFile);
May 28, 2006
May 28, 2006
253
254
if (ret != 0)
return -1;
Apr 26, 2001
Apr 26, 2001
255
256
return 0;
#else
May 28, 2006
May 28, 2006
257
258
259
struct fstab *entry;
struct stat stbuf;
May 29, 2006
May 29, 2006
260
setfsent();
May 28, 2006
May 28, 2006
261
do {
May 29, 2006
May 29, 2006
262
entry = getfsent();
May 28, 2006
May 28, 2006
263
if (entry != NULL) {
May 29, 2006
May 29, 2006
264
char *l = SDL_strrchr(entry->fs_spec, '/');
May 28, 2006
May 28, 2006
265
if (l != NULL) {
May 29, 2006
May 29, 2006
266
if (!SDL_strncmp("cd", ++l, 2)) {
Apr 26, 2001
Apr 26, 2001
267
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
268
269
270
fprintf(stderr,
"Found unmounted CD ROM drive with device name %s",
entry->fs_spec);
Apr 26, 2001
Apr 26, 2001
271
#endif
May 29, 2006
May 29, 2006
272
273
if (CheckDrive(entry->fs_spec, &stbuf) > 0) {
AddDrive(entry->fs_spec, &stbuf);
May 28, 2006
May 28, 2006
274
}
Apr 26, 2001
Apr 26, 2001
275
276
277
278
}
}
}
}
May 28, 2006
May 28, 2006
279
while (entry != NULL);
May 29, 2006
May 29, 2006
280
endfsent();
Apr 26, 2001
Apr 26, 2001
281
282
283
#endif
}
May 28, 2006
May 28, 2006
284
int
May 29, 2006
May 29, 2006
285
SDL_SYS_CDInit(void)
Apr 26, 2001
Apr 26, 2001
286
{
May 28, 2006
May 28, 2006
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
char *SDLcdrom;
struct stat stbuf;
/* Fill in our driver capabilities */
SDL_CDcaps.Name = SDL_SYS_CDName;
SDL_CDcaps.Open = SDL_SYS_CDOpen;
SDL_CDcaps.GetTOC = SDL_SYS_CDGetTOC;
SDL_CDcaps.Status = SDL_SYS_CDStatus;
SDL_CDcaps.Play = SDL_SYS_CDPlay;
SDL_CDcaps.Pause = SDL_SYS_CDPause;
SDL_CDcaps.Resume = SDL_SYS_CDResume;
SDL_CDcaps.Stop = SDL_SYS_CDStop;
SDL_CDcaps.Eject = SDL_SYS_CDEject;
SDL_CDcaps.Close = SDL_SYS_CDClose;
/* Look in the environment for our CD-ROM drive list */
May 29, 2006
May 29, 2006
303
SDLcdrom = SDL_getenv("SDL_CDROM"); /* ':' separated list of devices */
May 28, 2006
May 28, 2006
304
305
if (SDLcdrom != NULL) {
char *cdpath, *delim;
May 29, 2006
May 29, 2006
306
307
size_t len = SDL_strlen(SDLcdrom) + 1;
cdpath = SDL_stack_alloc(char, len);
May 28, 2006
May 28, 2006
308
if (cdpath != NULL) {
May 29, 2006
May 29, 2006
309
SDL_strlcpy(cdpath, SDLcdrom, len);
May 28, 2006
May 28, 2006
310
311
SDLcdrom = cdpath;
do {
May 29, 2006
May 29, 2006
312
delim = SDL_strchr(SDLcdrom, ':');
May 28, 2006
May 28, 2006
313
314
315
if (delim) {
*delim++ = '\0';
}
Apr 26, 2001
Apr 26, 2001
316
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
317
318
319
fprintf(stderr,
"Checking CD-ROM drive from SDL_CDROM: %s\n",
SDLcdrom);
Apr 26, 2001
Apr 26, 2001
320
#endif
May 29, 2006
May 29, 2006
321
322
if (CheckDrive(SDLcdrom, &stbuf) > 0) {
AddDrive(SDLcdrom, &stbuf);
May 28, 2006
May 28, 2006
323
324
325
326
327
328
329
330
}
if (delim) {
SDLcdrom = delim;
} else {
SDLcdrom = NULL;
}
}
while (SDLcdrom);
May 29, 2006
May 29, 2006
331
SDL_stack_free(cdpath);
May 28, 2006
May 28, 2006
332
333
334
335
336
337
338
339
}
/* If we found our drives, there's nothing left to do */
if (SDL_numcds > 0) {
return (0);
}
}
May 29, 2006
May 29, 2006
340
341
CheckMounts();
CheckNonmounts();
May 28, 2006
May 28, 2006
342
343
return 0;
Apr 26, 2001
Apr 26, 2001
344
345
346
}
/* General ioctl() CD-ROM command function */
May 28, 2006
May 28, 2006
347
static int
May 29, 2006
May 29, 2006
348
SDL_SYS_CDioctl(int id, int command, void *arg)
Apr 26, 2001
Apr 26, 2001
349
350
351
{
int retval;
May 29, 2006
May 29, 2006
352
retval = ioctl(id, command, arg);
May 28, 2006
May 28, 2006
353
if (retval < 0) {
May 29, 2006
May 29, 2006
354
SDL_SetError("ioctl() error: %s", strerror(errno));
Apr 26, 2001
Apr 26, 2001
355
356
357
358
}
return retval;
}
May 28, 2006
May 28, 2006
359
static const char *
May 29, 2006
May 29, 2006
360
SDL_SYS_CDName(int drive)
Apr 26, 2001
Apr 26, 2001
361
{
May 28, 2006
May 28, 2006
362
return (SDL_cdlist[drive]);
Apr 26, 2001
Apr 26, 2001
363
364
}
May 28, 2006
May 28, 2006
365
static int
May 29, 2006
May 29, 2006
366
SDL_SYS_CDOpen(int drive)
Apr 26, 2001
Apr 26, 2001
367
{
May 28, 2006
May 28, 2006
368
369
370
int fd;
char *lastsl;
char *cdromname;
Feb 19, 2006
Feb 19, 2006
371
size_t len;
Apr 26, 2001
Apr 26, 2001
372
373
374
375
376
/*
* We found /dev/cd? drives and that is in our list. But we can
* open only the /dev/rcd? versions of those devices for Audio CD.
*/
May 29, 2006
May 29, 2006
377
378
379
380
len = SDL_strlen(SDL_cdlist[drive]) + 2;
cdromname = (char *) SDL_malloc(len);
SDL_strlcpy(cdromname, SDL_cdlist[drive], len);
lastsl = SDL_strrchr(cdromname, '/');
Apr 26, 2001
Apr 26, 2001
381
if (lastsl) {
May 28, 2006
May 28, 2006
382
*lastsl = 0;
May 29, 2006
May 29, 2006
383
384
SDL_strlcat(cdromname, "/r", len);
lastsl = SDL_strrchr(SDL_cdlist[drive], '/');
May 28, 2006
May 28, 2006
385
386
if (lastsl) {
lastsl++;
May 29, 2006
May 29, 2006
387
SDL_strlcat(cdromname, lastsl, len);
May 28, 2006
May 28, 2006
388
}
Apr 26, 2001
Apr 26, 2001
389
390
}
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
391
392
fprintf(stderr, "Should open drive %s, opening %s\n", SDL_cdlist[drive],
cdromname);
Apr 26, 2001
Apr 26, 2001
393
394
395
396
397
398
399
#endif
/*
* Use exclusive access. Don't use SC_DIAGNOSTICS as xmcd does because they
* require root priviledges, and we don't want that. SC_SINGLE provides
* exclusive access with less trouble.
*/
May 29, 2006
May 29, 2006
400
fd = openx(cdromname, O_RDONLY, NULL, SC_SINGLE);
May 28, 2006
May 28, 2006
401
if (fd < 0) {
Apr 26, 2001
Apr 26, 2001
402
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
403
404
fprintf(stderr, "Could not open drive %s (%s)\n", cdromname,
strerror(errno));
Apr 26, 2001
Apr 26, 2001
405
#endif
May 28, 2006
May 28, 2006
406
407
408
} else {
struct mode_form_op cdMode;
int ret;
Apr 26, 2001
Apr 26, 2001
409
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 2006
410
cdMode.action = CD_GET_MODE;
May 29, 2006
May 29, 2006
411
ret = SDL_SYS_CDioctl(fd, DK_CD_MODE, &cdMode);
May 28, 2006
May 28, 2006
412
if (ret < 0) {
May 29, 2006
May 29, 2006
413
414
415
fprintf(stderr,
"Could not get drive mode for %s (%s)\n",
cdromname, strerror(errno));
May 28, 2006
May 28, 2006
416
417
418
} else {
switch (cdMode.cd_mode_form) {
case CD_MODE1:
May 29, 2006
May 29, 2006
419
420
421
fprintf(stderr,
"Drive mode for %s is %s\n",
cdromname, "CD-ROM Data Mode 1");
May 28, 2006
May 28, 2006
422
423
break;
case CD_MODE2_FORM1:
May 29, 2006
May 29, 2006
424
425
426
fprintf(stderr,
"Drive mode for %s is %s\n",
cdromname, "CD-ROM XA Data Mode 2 Form 1");
May 28, 2006
May 28, 2006
427
428
break;
case CD_MODE2_FORM2:
May 29, 2006
May 29, 2006
429
430
431
fprintf(stderr,
"Drive mode for %s is %s\n",
cdromname, "CD-ROM XA Data Mode 2 Form 2");
May 28, 2006
May 28, 2006
432
433
break;
case CD_DA:
May 29, 2006
May 29, 2006
434
435
fprintf(stderr,
"Drive mode for %s is %s\n", cdromname, "CD-DA");
May 28, 2006
May 28, 2006
436
437
break;
default:
May 29, 2006
May 29, 2006
438
439
fprintf(stderr,
"Drive mode for %s is %s\n", cdromname, "unknown");
May 28, 2006
May 28, 2006
440
441
442
break;
}
}
Apr 26, 2001
Apr 26, 2001
443
444
#endif
May 28, 2006
May 28, 2006
445
446
cdMode.action = CD_CHG_MODE;
cdMode.cd_mode_form = CD_DA;
May 29, 2006
May 29, 2006
447
ret = SDL_SYS_CDioctl(fd, DK_CD_MODE, &cdMode);
May 28, 2006
May 28, 2006
448
if (ret < 0) {
Apr 26, 2001
Apr 26, 2001
449
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
450
451
452
fprintf(stderr,
"Could not set drive mode for %s (%s)\n",
cdromname, strerror(errno));
Apr 26, 2001
Apr 26, 2001
453
#endif
May 28, 2006
May 28, 2006
454
455
SDL_SetError
("ioctl() error: Could not set CD drive mode, %s",
May 29, 2006
May 29, 2006
456
strerror(errno));
May 28, 2006
May 28, 2006
457
} else {
Apr 26, 2001
Apr 26, 2001
458
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
459
fprintf(stderr, "Drive mode for %s set to CD_DA\n", cdromname);
Apr 26, 2001
Apr 26, 2001
460
#endif
May 28, 2006
May 28, 2006
461
}
Apr 26, 2001
Apr 26, 2001
462
}
May 29, 2006
May 29, 2006
463
SDL_free(cdromname);
Apr 26, 2001
Apr 26, 2001
464
465
466
return fd;
}
May 28, 2006
May 28, 2006
467
static int
May 29, 2006
May 29, 2006
468
SDL_SYS_CDGetTOC(SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
469
470
471
{
struct cd_audio_cmd cmd;
struct cd_audio_cmd entry;
May 28, 2006
May 28, 2006
472
473
int i;
int okay;
Apr 26, 2001
Apr 26, 2001
474
475
cmd.audio_cmds = CD_TRK_INFO_AUDIO;
May 28, 2006
May 28, 2006
476
cmd.msf_flag = FALSE;
May 29, 2006
May 29, 2006
477
if (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &cmd) < 0) {
May 28, 2006
May 28, 2006
478
return -1;
Apr 26, 2001
Apr 26, 2001
479
480
481
482
}
okay = 0;
cdrom->numtracks = cmd.indexing.track_index.last_track
May 28, 2006
May 28, 2006
483
484
- cmd.indexing.track_index.first_track + 1;
if (cdrom->numtracks > SDL_MAX_TRACKS) {
Apr 26, 2001
Apr 26, 2001
485
486
487
488
cdrom->numtracks = SDL_MAX_TRACKS;
}
/* Read all the track TOC entries */
May 28, 2006
May 28, 2006
489
490
for (i = 0; i <= cdrom->numtracks; ++i) {
if (i == cdrom->numtracks) {
Apr 26, 2001
Apr 26, 2001
491
492
cdrom->track[i].id = 0xAA;;
} else {
May 28, 2006
May 28, 2006
493
cdrom->track[i].id = cmd.indexing.track_index.first_track + i;
Apr 26, 2001
Apr 26, 2001
494
}
May 28, 2006
May 28, 2006
495
496
entry.audio_cmds = CD_GET_TRK_MSF;
entry.indexing.track_msf.track = cdrom->track[i].id;
May 29, 2006
May 29, 2006
497
if (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &entry) < 0) {
Apr 26, 2001
Apr 26, 2001
498
499
break;
} else {
May 28, 2006
May 28, 2006
500
501
cdrom->track[i].type = 0; /* don't know how to detect 0x04 data track */
cdrom->track[i].offset =
May 29, 2006
May 29, 2006
502
503
504
MSF_TO_FRAMES(entry.indexing.track_msf.mins,
entry.indexing.track_msf.secs,
entry.indexing.track_msf.frames);
Apr 26, 2001
Apr 26, 2001
505
cdrom->track[i].length = 0;
May 28, 2006
May 28, 2006
506
507
508
if (i > 0) {
cdrom->track[i - 1].length = cdrom->track[i].offset
- cdrom->track[i - 1].offset;
Apr 26, 2001
Apr 26, 2001
509
510
511
}
}
}
May 28, 2006
May 28, 2006
512
if (i == (cdrom->numtracks + 1)) {
Apr 26, 2001
Apr 26, 2001
513
514
okay = 1;
}
May 28, 2006
May 28, 2006
515
return (okay ? 0 : -1);
Apr 26, 2001
Apr 26, 2001
516
517
518
}
/* Get CD-ROM status */
May 28, 2006
May 28, 2006
519
static CDstatus
May 29, 2006
May 29, 2006
520
SDL_SYS_CDStatus(SDL_CD * cdrom, int *position)
Apr 26, 2001
Apr 26, 2001
521
{
May 28, 2006
May 28, 2006
522
CDstatus status;
Apr 26, 2001
Apr 26, 2001
523
524
525
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_INFO_AUDIO;
May 29, 2006
May 29, 2006
526
if (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &cmd) < 0) {
Apr 26, 2001
Apr 26, 2001
527
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
528
529
fprintf(stderr, "ioctl failed in SDL_SYS_CDStatus (%s)\n",
SDL_GetError());
Apr 26, 2001
Apr 26, 2001
530
531
532
533
#endif
status = CD_ERROR;
} else {
switch (cmd.status) {
May 28, 2006
May 28, 2006
534
535
536
537
538
539
540
541
542
543
544
case CD_NO_AUDIO:
case CD_COMPLETED:
status = CD_STOPPED;
break;
case CD_PLAY_AUDIO:
status = CD_PLAYING;
break;
case CD_PAUSE_AUDIO:
status = CD_PAUSED;
break;
case CD_NOT_VALID:
Apr 26, 2001
Apr 26, 2001
545
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
546
fprintf(stderr, "cdStatus failed with CD_NOT_VALID\n");
Apr 26, 2001
Apr 26, 2001
547
#endif
May 28, 2006
May 28, 2006
548
549
550
status = CD_ERROR;
break;
case CD_STATUS_ERROR:
Apr 26, 2001
Apr 26, 2001
551
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
552
fprintf(stderr, "cdStatus failed with CD_STATUS_ERROR\n");
Apr 26, 2001
Apr 26, 2001
553
#endif
May 28, 2006
May 28, 2006
554
555
556
status = CD_ERROR;
break;
default:
Apr 26, 2001
Apr 26, 2001
557
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
558
fprintf(stderr, "cdStatus failed with unknown error\n");
Apr 26, 2001
Apr 26, 2001
559
#endif
May 28, 2006
May 28, 2006
560
561
status = CD_ERROR;
break;
Apr 26, 2001
Apr 26, 2001
562
563
}
}
May 28, 2006
May 28, 2006
564
565
566
if (position) {
if (status == CD_PLAYING || (status == CD_PAUSED)) {
*position =
May 29, 2006
May 29, 2006
567
568
569
MSF_TO_FRAMES(cmd.indexing.info_audio.current_mins,
cmd.indexing.info_audio.current_secs,
cmd.indexing.info_audio.current_frames);
Apr 26, 2001
Apr 26, 2001
570
571
572
573
574
575
576
577
} else {
*position = 0;
}
}
return status;
}
/* Start play */
May 28, 2006
May 28, 2006
578
static int
May 29, 2006
May 29, 2006
579
SDL_SYS_CDPlay(SDL_CD * cdrom, int start, int length)
Apr 26, 2001
Apr 26, 2001
580
581
582
583
584
585
586
587
588
{
struct cd_audio_cmd cmd;
/*
* My CD Rom is muted by default. I think I read that this is new with
* AIX 4.3. SDL does not change the volume, so I need a kludge. Maybe
* its better to do this elsewhere?
*/
cmd.audio_cmds = CD_PLAY_AUDIO | CD_SET_VOLUME;
May 28, 2006
May 28, 2006
589
cmd.msf_flag = TRUE;
May 29, 2006
May 29, 2006
590
591
592
593
594
595
596
FRAMES_TO_MSF(start,
&cmd.indexing.msf.first_mins,
&cmd.indexing.msf.first_secs,
&cmd.indexing.msf.first_frames);
FRAMES_TO_MSF(start + length,
&cmd.indexing.msf.last_mins,
&cmd.indexing.msf.last_secs, &cmd.indexing.msf.last_frames);
May 28, 2006
May 28, 2006
597
598
599
600
601
602
cmd.volume_type = CD_VOLUME_ALL;
cmd.all_channel_vol = 255; /* This is a uchar. What is a good value? No docu! */
cmd.out_port_0_sel = CD_AUDIO_CHNL_0;
cmd.out_port_1_sel = CD_AUDIO_CHNL_1;
cmd.out_port_2_sel = CD_AUDIO_CHNL_2;
cmd.out_port_3_sel = CD_AUDIO_CHNL_3;
Apr 26, 2001
Apr 26, 2001
603
604
#ifdef DEBUG_CDROM
May 29, 2006
May 29, 2006
605
606
607
608
609
610
fprintf(stderr, "Trying to play from %d:%d:%d to %d:%d:%d\n",
cmd.indexing.msf.first_mins,
cmd.indexing.msf.first_secs,
cmd.indexing.msf.first_frames,
cmd.indexing.msf.last_mins,
cmd.indexing.msf.last_secs, cmd.indexing.msf.last_frames);
Apr 26, 2001
Apr 26, 2001
611
#endif
May 29, 2006
May 29, 2006
612
return (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
613
614
615
}
/* Pause play */
May 28, 2006
May 28, 2006
616
static int
May 29, 2006
May 29, 2006
617
SDL_SYS_CDPause(SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
618
619
620
{
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_PAUSE_AUDIO;
May 29, 2006
May 29, 2006
621
return (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
622
623
624
}
/* Resume play */
May 28, 2006
May 28, 2006
625
static int
May 29, 2006
May 29, 2006
626
SDL_SYS_CDResume(SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
627
628
629
{
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_RESUME_AUDIO;
May 29, 2006
May 29, 2006
630
return (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
631
632
633
}
/* Stop play */
May 28, 2006
May 28, 2006
634
static int
May 29, 2006
May 29, 2006
635
SDL_SYS_CDStop(SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
636
637
638
{
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_STOP_AUDIO;
May 29, 2006
May 29, 2006
639
return (SDL_SYS_CDioctl(cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
640
641
642
}
/* Eject the CD-ROM */
May 28, 2006
May 28, 2006
643
static int
May 29, 2006
May 29, 2006
644
SDL_SYS_CDEject(SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
645
{
May 29, 2006
May 29, 2006
646
return (SDL_SYS_CDioctl(cdrom->id, DKEJECT, 0));
Apr 26, 2001
Apr 26, 2001
647
648
649
}
/* Close the CD-ROM handle */
May 28, 2006
May 28, 2006
650
static void
May 29, 2006
May 29, 2006
651
SDL_SYS_CDClose(SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
652
{
May 29, 2006
May 29, 2006
653
close(cdrom->id);
Apr 26, 2001
Apr 26, 2001
654
655
}
May 28, 2006
May 28, 2006
656
void
May 29, 2006
May 29, 2006
657
SDL_SYS_CDQuit(void)
Apr 26, 2001
Apr 26, 2001
658
{
May 28, 2006
May 28, 2006
659
660
661
662
int i;
if (SDL_numcds > 0) {
for (i = 0; i < SDL_numcds; ++i) {
May 29, 2006
May 29, 2006
663
SDL_free(SDL_cdlist[i]);
May 28, 2006
May 28, 2006
664
665
666
}
SDL_numcds = 0;
}
Apr 26, 2001
Apr 26, 2001
667
668
}
Apr 14, 2006
Apr 14, 2006
669
#endif /* SDL_CDROM_AIX */
May 28, 2006
May 28, 2006
670
/* vi: set ts=4 sw=4 expandtab: */