This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_syscdrom.c
187 lines (157 loc) · 4.38 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 2.1 of the License, or (at your option) any later version.
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
13
Lesser General Public License for more details.
14
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
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
22
#include "SDL_config.h"
23
24
25
#ifdef SDL_CDROM_DC
26
27
28
29
30
31
/* Functions for system-level CD-ROM audio control */
#include <dc/cdrom.h>
#include <dc/spu.h>
#include "SDL_cdrom.h"
32
#include "../SDL_syscdrom.h"
33
34
35
36
/* The system-dependent CD control functions */
static const char *SDL_SYS_CDName(int drive);
static int SDL_SYS_CDOpen(int drive);
37
38
39
40
41
42
43
44
45
46
47
48
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);
int
SDL_SYS_CDInit(void)
49
{
50
51
52
53
54
55
56
57
58
59
60
61
62
/* 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;
return (0);
63
64
}
65
66
static const char *
SDL_SYS_CDName(int drive)
67
{
68
return "/cd";
69
70
}
71
72
static int
SDL_SYS_CDOpen(int drive)
73
{
74
return (drive);
75
76
77
}
#define TRACK_CDDA 0
78
79
static int
SDL_SYS_CDGetTOC(SDL_CD * cdrom)
80
{
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
CDROM_TOC toc;
int ret, i;
ret = cdrom_read_toc(&toc, 0);
if (ret != ERR_OK) {
return -1;
}
cdrom->numtracks = TOC_TRACK(toc.last) - TOC_TRACK(toc.first) + 1;
for (i = 0; i < cdrom->numtracks; i++) {
unsigned long entry = toc.entry[i];
cdrom->track[i].id = i + 1;
cdrom->track[i].type =
(TOC_CTRL(toc.entry[i]) ==
TRACK_CDDA) ? SDL_AUDIO_TRACK : SDL_DATA_TRACK;
cdrom->track[i].offset = TOC_LBA(entry) - 150;
cdrom->track[i].length =
TOC_LBA((i + 1 <
toc.last) ? toc.entry[i + 1] : toc.leadout_sector) -
TOC_LBA(entry);
}
return 0;
104
105
106
}
/* Get CD-ROM status */
107
108
static CDstatus
SDL_SYS_CDStatus(SDL_CD * cdrom, int *position)
109
{
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
int ret, dc_status, disc_type;
ret = cdrom_get_status(&dc_status, &disc_type);
if (ret != ERR_OK)
return CD_ERROR;
switch (dc_status) {
// case CD_STATUS_BUSY:
case CD_STATUS_PAUSED:
return CD_PAUSED;
case CD_STATUS_STANDBY:
return CD_STOPPED;
case CD_STATUS_PLAYING:
return CD_PLAYING;
// case CD_STATUS_SEEKING:
// case CD_STATUS_SCANING:
case CD_STATUS_OPEN:
case CD_STATUS_NO_DISC:
return CD_TRAYEMPTY;
default:
return CD_ERROR;
}
132
133
134
}
/* Start play */
135
136
static int
SDL_SYS_CDPlay(SDL_CD * cdrom, int start, int length)
137
{
138
139
140
int ret =
cdrom_cdda_play(start - 150, start - 150 + length, 1, CDDA_SECTORS);
return ret == ERR_OK ? 0 : -1;
141
142
143
}
/* Pause play */
144
145
static int
SDL_SYS_CDPause(SDL_CD * cdrom)
146
{
147
148
int ret = cdrom_cdda_pause();
return ret == ERR_OK ? 0 : -1;
149
150
151
}
/* Resume play */
152
153
static int
SDL_SYS_CDResume(SDL_CD * cdrom)
154
{
155
156
int ret = cdrom_cdda_resume();
return ret == ERR_OK ? 0 : -1;
157
158
159
}
/* Stop play */
160
161
static int
SDL_SYS_CDStop(SDL_CD * cdrom)
162
{
163
164
int ret = cdrom_spin_down();
return ret == ERR_OK ? 0 : -1;
165
166
167
}
/* Eject the CD-ROM */
168
169
static int
SDL_SYS_CDEject(SDL_CD * cdrom)
170
{
171
return -1;
172
173
174
}
/* Close the CD-ROM handle */
175
176
static void
SDL_SYS_CDClose(SDL_CD * cdrom)
177
178
179
{
}
180
181
void
SDL_SYS_CDQuit(void)
182
183
184
{
}
185
186
#endif /* SDL_CDROM_DC */
187
/* vi: set ts=4 sw=4 expandtab: */