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

Latest commit

 

History

History
671 lines (612 loc) · 18.6 KB

SDL_syscdrom.c

File metadata and controls

671 lines (612 loc) · 18.6 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 28, 2006
May 28, 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
71
static int
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 28, 2006
May 28, 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 28, 2006
May 28, 2006
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
if (S_ISCHR (stbuf->st_mode) || S_ISBLK (stbuf->st_mode)) {
cdfd = open (drive, (O_RDONLY | O_EXCL | O_NONBLOCK), 0);
if (cdfd >= 0) {
ret = SDL_SYS_CDioctl (cdfd, IOCINFO, &info);
if (ret < 0) {
/* Some kind of error */
is_cd = 0;
} else {
if (info.devtype == DD_CDROM) {
is_cd = 1;
} else {
is_cd = 0;
}
}
close (cdfd);
}
Apr 26, 2001
Apr 26, 2001
101
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 2006
102
103
104
105
else {
fprintf (stderr, "Could not open drive %s (%s)\n", drive,
strerror (errno));
}
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
113
static void
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 28, 2006
May 28, 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
133
134
135
136
137
138
139
return;
}
}
/* Add this drive to our list */
i = SDL_numcds;
SDL_cdlist[i] = SDL_strdup (drive);
if (SDL_cdlist[i] == NULL) {
SDL_OutOfMemory ();
return;
}
SDL_cdmode[i] = stbuf->st_rdev;
++SDL_numcds;
Apr 26, 2001
Apr 26, 2001
140
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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
147
static void
CheckMounts ()
Apr 26, 2001
Apr 26, 2001
148
{
May 28, 2006
May 28, 2006
149
150
151
152
153
154
155
156
157
158
159
char *buffer;
int bufsz;
struct vmount *ptr;
int ret;
buffer = (char *) SDL_malloc (10);
bufsz = 10;
if (buffer == NULL) {
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
164
165
166
167
168
169
170
171
172
173
174
175
176
do {
/* mntctrl() returns an array of all mounted filesystems */
ret = mntctl (MCTL_QUERY, bufsz, buffer);
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. */
SDL_free (buffer);
buffer = (char *) SDL_malloc (bufsz);
if (buffer == NULL) {
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 28, 2006
May 28, 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 28, 2006
May 28, 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 28, 2006
May 28, 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 28, 2006
May 28, 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 28, 2006
May 28, 2006
217
free (buffer);
Apr 26, 2001
Apr 26, 2001
218
219
}
May 28, 2006
May 28, 2006
220
221
static int
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
230
231
232
233
234
235
236
237
238
struct stat stbuf;
ret = setfsent_r (&fsFile, &passNo);
if (ret != 0)
return -1;
do {
ret = getfsent_r (&entry, &fsFile, &passNo);
if (ret == 0) {
char *l = SDL_strrchr (entry.fs_spec, '/');
if (l != NULL) {
if (!SDL_strncmp ("cd", ++l, 2)) {
Apr 26, 2001
Apr 26, 2001
239
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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 28, 2006
May 28, 2006
244
245
246
if (CheckDrive (entry.fs_spec, &stbuf) > 0) {
AddDrive (entry.fs_spec, &stbuf);
}
Apr 26, 2001
Apr 26, 2001
247
248
249
250
}
}
}
}
May 28, 2006
May 28, 2006
251
252
253
254
while (ret == 0);
ret = endfsent_r (&fsFile);
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
260
261
262
263
264
265
266
struct fstab *entry;
struct stat stbuf;
setfsent ();
do {
entry = getfsent ();
if (entry != NULL) {
char *l = SDL_strrchr (entry->fs_spec, '/');
if (l != NULL) {
if (!SDL_strncmp ("cd", ++l, 2)) {
Apr 26, 2001
Apr 26, 2001
267
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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 28, 2006
May 28, 2006
272
273
274
if (CheckDrive (entry->fs_spec, &stbuf) > 0) {
AddDrive (entry->fs_spec, &stbuf);
}
Apr 26, 2001
Apr 26, 2001
275
276
277
278
}
}
}
}
May 28, 2006
May 28, 2006
279
280
while (entry != NULL);
endfsent ();
Apr 26, 2001
Apr 26, 2001
281
282
283
#endif
}
May 28, 2006
May 28, 2006
284
285
int
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
303
304
305
306
307
308
309
310
311
312
313
314
315
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 */
SDLcdrom = SDL_getenv ("SDL_CDROM"); /* ':' separated list of devices */
if (SDLcdrom != NULL) {
char *cdpath, *delim;
size_t len = SDL_strlen (SDLcdrom) + 1;
cdpath = SDL_stack_alloc (char, len);
if (cdpath != NULL) {
SDL_strlcpy (cdpath, SDLcdrom, len);
SDLcdrom = cdpath;
do {
delim = SDL_strchr (SDLcdrom, ':');
if (delim) {
*delim++ = '\0';
}
Apr 26, 2001
Apr 26, 2001
316
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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 28, 2006
May 28, 2006
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
if (CheckDrive (SDLcdrom, &stbuf) > 0) {
AddDrive (SDLcdrom, &stbuf);
}
if (delim) {
SDLcdrom = delim;
} else {
SDLcdrom = NULL;
}
}
while (SDLcdrom);
SDL_stack_free (cdpath);
}
/* If we found our drives, there's nothing left to do */
if (SDL_numcds > 0) {
return (0);
}
}
CheckMounts ();
CheckNonmounts ();
return 0;
Apr 26, 2001
Apr 26, 2001
344
345
346
}
/* General ioctl() CD-ROM command function */
May 28, 2006
May 28, 2006
347
348
static int
SDL_SYS_CDioctl (int id, int command, void *arg)
Apr 26, 2001
Apr 26, 2001
349
350
351
{
int retval;
May 28, 2006
May 28, 2006
352
353
354
retval = ioctl (id, command, arg);
if (retval < 0) {
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
360
static const char *
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
366
static int
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 28, 2006
May 28, 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
383
384
385
386
387
388
*lastsl = 0;
SDL_strlcat (cdromname, "/r", len);
lastsl = SDL_strrchr (SDL_cdlist[drive], '/');
if (lastsl) {
lastsl++;
SDL_strlcat (cdromname, lastsl, len);
}
Apr 26, 2001
Apr 26, 2001
389
390
}
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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 28, 2006
May 28, 2006
400
401
fd = openx (cdromname, O_RDONLY, NULL, SC_SINGLE);
if (fd < 0) {
Apr 26, 2001
Apr 26, 2001
402
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
cdMode.action = CD_GET_MODE;
ret = SDL_SYS_CDioctl (fd, DK_CD_MODE, &cdMode);
if (ret < 0) {
fprintf (stderr,
"Could not get drive mode for %s (%s)\n",
cdromname, strerror (errno));
} else {
switch (cdMode.cd_mode_form) {
case CD_MODE1:
fprintf (stderr,
"Drive mode for %s is %s\n",
cdromname, "CD-ROM Data Mode 1");
break;
case CD_MODE2_FORM1:
fprintf (stderr,
"Drive mode for %s is %s\n",
cdromname, "CD-ROM XA Data Mode 2 Form 1");
break;
case CD_MODE2_FORM2:
fprintf (stderr,
"Drive mode for %s is %s\n",
cdromname, "CD-ROM XA Data Mode 2 Form 2");
break;
case CD_DA:
fprintf (stderr,
"Drive mode for %s is %s\n", cdromname, "CD-DA");
break;
default:
fprintf (stderr,
"Drive mode for %s is %s\n", cdromname, "unknown");
break;
}
}
Apr 26, 2001
Apr 26, 2001
443
444
#endif
May 28, 2006
May 28, 2006
445
446
447
448
cdMode.action = CD_CHG_MODE;
cdMode.cd_mode_form = CD_DA;
ret = SDL_SYS_CDioctl (fd, DK_CD_MODE, &cdMode);
if (ret < 0) {
Apr 26, 2001
Apr 26, 2001
449
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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
456
457
SDL_SetError
("ioctl() error: Could not set CD drive mode, %s",
strerror (errno));
} else {
Apr 26, 2001
Apr 26, 2001
458
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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 28, 2006
May 28, 2006
463
SDL_free (cdromname);
Apr 26, 2001
Apr 26, 2001
464
465
466
return fd;
}
May 28, 2006
May 28, 2006
467
468
static int
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
477
478
cmd.msf_flag = FALSE;
if (SDL_SYS_CDioctl (cdrom->id, DKAUDIO, &cmd) < 0) {
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
497
entry.audio_cmds = CD_GET_TRK_MSF;
entry.indexing.track_msf.track = cdrom->track[i].id;
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
502
503
504
cdrom->track[i].type = 0; /* don't know how to detect 0x04 data track */
cdrom->track[i].offset =
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
520
static CDstatus
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 28, 2006
May 28, 2006
526
if (SDL_SYS_CDioctl (cdrom->id, DKAUDIO, &cmd) < 0) {
Apr 26, 2001
Apr 26, 2001
527
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 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 28, 2006
May 28, 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 28, 2006
May 28, 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 28, 2006
May 28, 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
567
568
569
if (position) {
if (status == CD_PLAYING || (status == CD_PAUSED)) {
*position =
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
579
static int
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
590
591
592
593
594
595
596
597
598
599
600
601
602
603
cmd.msf_flag = TRUE;
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);
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
604
605
#ifdef DEBUG_CDROM
May 28, 2006
May 28, 2006
606
607
608
609
610
611
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
612
#endif
May 28, 2006
May 28, 2006
613
return (SDL_SYS_CDioctl (cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
614
615
616
}
/* Pause play */
May 28, 2006
May 28, 2006
617
618
static int
SDL_SYS_CDPause (SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
619
620
621
{
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_PAUSE_AUDIO;
May 28, 2006
May 28, 2006
622
return (SDL_SYS_CDioctl (cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
623
624
625
}
/* Resume play */
May 28, 2006
May 28, 2006
626
627
static int
SDL_SYS_CDResume (SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
628
629
630
{
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_RESUME_AUDIO;
May 28, 2006
May 28, 2006
631
return (SDL_SYS_CDioctl (cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
632
633
634
}
/* Stop play */
May 28, 2006
May 28, 2006
635
636
static int
SDL_SYS_CDStop (SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
637
638
639
{
struct cd_audio_cmd cmd;
cmd.audio_cmds = CD_STOP_AUDIO;
May 28, 2006
May 28, 2006
640
return (SDL_SYS_CDioctl (cdrom->id, DKAUDIO, &cmd));
Apr 26, 2001
Apr 26, 2001
641
642
643
}
/* Eject the CD-ROM */
May 28, 2006
May 28, 2006
644
645
static int
SDL_SYS_CDEject (SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
646
{
May 28, 2006
May 28, 2006
647
return (SDL_SYS_CDioctl (cdrom->id, DKEJECT, 0));
Apr 26, 2001
Apr 26, 2001
648
649
650
}
/* Close the CD-ROM handle */
May 28, 2006
May 28, 2006
651
652
static void
SDL_SYS_CDClose (SDL_CD * cdrom)
Apr 26, 2001
Apr 26, 2001
653
{
May 28, 2006
May 28, 2006
654
close (cdrom->id);
Apr 26, 2001
Apr 26, 2001
655
656
}
May 28, 2006
May 28, 2006
657
658
void
SDL_SYS_CDQuit (void)
Apr 26, 2001
Apr 26, 2001
659
{
May 28, 2006
May 28, 2006
660
661
662
663
664
665
666
667
int i;
if (SDL_numcds > 0) {
for (i = 0; i < SDL_numcds; ++i) {
SDL_free (SDL_cdlist[i]);
}
SDL_numcds = 0;
}
Apr 26, 2001
Apr 26, 2001
668
669
}
Apr 14, 2006
Apr 14, 2006
670
#endif /* SDL_CDROM_AIX */
May 28, 2006
May 28, 2006
671
/* vi: set ts=4 sw=4 expandtab: */