Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 1
/*
2
  Some of this may not work. I'm not overly familiar with SDL, I just sort
3
  of podged this together from the SDL headers, and the other cd-rom code.
4
 
5
  Mark Baker 
6
*/
7
 
8
#include 
9
 
10
#include "quakedef.h"
11
 
12
static qboolean cdValid = false;
13
static qboolean initialized = false;
14
static qboolean enabled = true;
15
static qboolean playLooping = false;
16
static SDL_CD *cd_id;
17
static float cdvolume = 1.0;
18
 
19
static void CD_f();
20
 
21
static void CDAudio_Eject()
22
{
23
	if(!cd_id || !enabled) return;
24
 
25
	if(SDL_CDEject(cd_id))
26
		Con_DPrintf("Unable to eject CD-ROM tray.\n");
27
}
28
 
29
void CDAudio_Play(byte track, qboolean looping)
30
{
31
	CDstatus cd_stat;
32
	if(!cd_id || !enabled) return;
33
 
34
	if(!cdValid)
35
	{
36
		if(!CD_INDRIVE(cd_stat=SDL_CDStatus(cd_id)) ||(!cd_id->numtracks)) return;
37
		cdValid = true;
38
	}
39
 
40
	if((track < 1) || (track >= cd_id->numtracks))
41
	{
42
		Con_DPrintf("CDAudio: Bad track number: %d\n",track);
43
		return;
44
	}
45
	track--; /* Convert track from person to SDL value */
46
	if(cd_stat == CD_PLAYING)
47
	{
48
		if(cd_id->cur_track == track) return;
49
		CDAudio_Stop();
50
	}
51
 
52
	if(SDL_CDPlay(cd_id,cd_id->track[track].offset,
53
			  cd_id->track[track].length))
54
	{
55
		Con_DPrintf("CDAudio_Play: Unable to play track: %d\n",track+1);
56
		return;
57
	}
58
	playLooping = looping;
59
}
60
 
61
 
62
void CDAudio_Stop()
63
{
64
	int cdstate;
65
	if(!cd_id || !enabled) return;
66
	cdstate = SDL_CDStatus(cd_id);
67
	if((cdstate != CD_PLAYING) && (cdstate != CD_PAUSED)) return;
68
 
69
	if(SDL_CDStop(cd_id))
70
		Con_DPrintf("CDAudio_Stop: Failed to stop track.\n");
71
}
72
 
73
void CDAudio_Pause()
74
{
75
	if(!cd_id || !enabled) return;
76
	if(SDL_CDStatus(cd_id) != CD_PLAYING) return;
77
 
78
	if(SDL_CDPause(cd_id))
79
		Con_DPrintf("CDAudio_Pause: Failed to pause track.\n");
80
}
81
 
82
 
83
void CDAudio_Resume()
84
{
85
	if(!cd_id || !enabled) return;
86
	if(SDL_CDStatus(cd_id) != CD_PAUSED) return;
87
 
88
	if(SDL_CDResume(cd_id))
89
		Con_DPrintf("CDAudio_Resume: Failed tp resume track.\n");
90
}
91
 
92
void CDAudio_Update()
93
{
94
	if(!cd_id || !enabled) return;
95
	if(bgmvolume.value != cdvolume)
96
	{
97
		if(cdvolume)
98
		{
99
			Cvar_SetValue("bgmvolume",0.0);
100
			CDAudio_Pause();
101
		}
102
		else
103
		{
104
			Cvar_SetValue("bgmvolume",1.0);
105
			CDAudio_Resume();
106
		}
107
		cdvolume = bgmvolume.value;
108
		return;
109
	}
110
	if(playLooping && (SDL_CDStatus(cd_id) != CD_PLAYING)
111
		 && (SDL_CDStatus(cd_id) != CD_PAUSED))
112
		CDAudio_Play(cd_id->cur_track+1,true);
113
}
114
 
115
int CDAudio_Init()
116
{
117
	if((cls.state == ca_dedicated) || COM_CheckParm("-nocdaudio"))
118
		return -1;
119
 
120
	cd_id = SDL_CDOpen(0);
121
	if(!cd_id)
122
	{
123
		Con_Printf("CDAudio_Init: Unable to open default CD-ROM drive: %s\n",
124
			SDL_GetError());
125
		return -1;
126
	}
127
 
128
	initialized = true;
129
	enabled = true;
130
	cdValid = true;
131
 
132
	if(!CD_INDRIVE(SDL_CDStatus(cd_id)))
133
	{
134
		Con_Printf("CDAudio_Init: No CD in drive.\n");
135
		cdValid = false;
136
	}
137
	if(!cd_id->numtracks)
138
	{
139
		Con_Printf("CDAudio_Init: CD contains no audio tracks.\n");
140
		cdValid = false;
141
	}
142
	Cmd_AddCommand("cd",CD_f);
143
	Con_Printf("CD Audio Initialized.\n");
144
	return 0;
145
}
146
 
147
 
148
void CDAudio_Shutdown()
149
{
150
	if(!cd_id) return;
151
	CDAudio_Stop();
152
	SDL_CDClose(cd_id);
153
	cd_id = NULL;
154
}
155
 
156
static void CD_f()
157
{
158
	char *command;
159
	int cdstate;
160
	if(Cmd_Argc() < 2) return;
161
 
162
	command = Cmd_Argv(1);
163
	if(!Q_strcasecmp(command,"on"))
164
	{
165
		enabled = true;
166
	}
167
	if(!Q_strcasecmp(command,"off"))
168
	{
169
		if(!cd_id) return;
170
		cdstate = SDL_CDStatus(cd_id);
171
		if((cdstate == CD_PLAYING) || (cdstate == CD_PAUSED))
172
			CDAudio_Stop();
173
		enabled = false;
174
		return;
175
	}
176
	if(!Q_strcasecmp(command,"play"))
177
	{
178
		CDAudio_Play(Q_atoi(Cmd_Argv(2)),false);
179
		return;
180
	}
181
	if(!Q_strcasecmp(command,"loop"))
182
	{
183
		CDAudio_Play(Q_atoi(Cmd_Argv(2)),true);
184
		return;
185
	}
186
	if(!Q_strcasecmp(command,"stop"))
187
	{
188
		CDAudio_Stop();
189
		return;
190
	}
191
	if(!Q_strcasecmp(command,"pause"))
192
	{
193
		CDAudio_Pause();
194
		return;
195
	}
196
	if(!Q_strcasecmp(command,"resume"))
197
	{
198
		CDAudio_Resume();
199
		return;
200
	}
201
	if(!Q_strcasecmp(command,"eject"))
202
	{
203
		CDAudio_Eject();
204
		return;
205
	}
206
	if(!Q_strcasecmp(command,"info"))
207
	{
208
		if(!cd_id) return;
209
		cdstate = SDL_CDStatus(cd_id);
210
		Con_Printf("%d tracks\n",cd_id->numtracks);
211
		if(cdstate == CD_PLAYING)
212
			Con_Printf("Currently %s track %d\n",
213
				playLooping ? "looping" : "playing",
214
				cd_id->cur_track+1);
215
		else
216
		if(cdstate == CD_PAUSED)
217
			Con_Printf("Paused %s track %d\n",
218
				playLooping ? "looping" : "playing",
219
				cd_id->cur_track+1);
220
		return;
221
	}
222
}
223