1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include "cdaudio.h"
6 #include "cddb_lookup.h"
7
8 typedef struct disc_info * Audio__CD__Info;
9 typedef struct track_info * Audio__CD__Info__Track;
10 typedef struct disc_data * Audio__CD__Data;
11 typedef struct track_data * Audio__CD__Track;
12 typedef struct disc_volume * Audio__CD__Volume;
13 typedef struct __volume * Audio__CD__VolumeRL;
14
15 typedef int Audio__CD;
16 typedef int Audio__CDDB;
17
18 #define CD_Info_present(info) info->disc_present
19 #define CD_Info_mode(info) info->disc_mode
20 #define CD_Info_current_frame(info) info->disc_current_frame
21 #define CD_Info_current_track(info) info->disc_current_track
22 #define CD_Info_first_track(info) info->disc_first_track
23 #define CD_Info_total_tracks(info) info->disc_total_tracks
24 #define CD_Info_timeval(timeval) \
25 SP -= items; \
26 XPUSHs(sv_2mortal(newSViv(timeval.minutes))); \
27 XPUSHs(sv_2mortal(newSViv(timeval.seconds))); \
28 PUTBACK; return
29
30 #define CD_Info_track_time(info) \
31 CD_Info_timeval(info->disc_track_time)
32 #define CD_Info_time(info) \
33 CD_Info_timeval(info->disc_time)
34 #define CD_Info_length(info) \
35 CD_Info_timeval(info->disc_length)
36
37 #define CD_Info_Track_length(tinfo) CD_Info_timeval(tinfo->track_length)
38 #define CD_Info_Track_pos(tinfo) CD_Info_timeval(tinfo->track_pos)
39 #define CD_Info_Track_type(tinfo) tinfo->track_type
40 #define CD_Info_Track_is_audio(tinfo) \
41 (tinfo->track_type == CDAUDIO_TRACK_AUDIO)
42 #define CD_Info_Track_is_data(tinfo) \
43 (tinfo->track_type == CDAUDIO_TRACK_DATA)
44
45 #define CD_Data_title(data) data->data_title
46 #define CD_Data_artist(data) data->data_artist
47 #define CD_Data_extended(data) data->data_extended
48 #define CD_Data_genre(data) cddb_genre(data->data_genre)
49
50 #define CD_Track_name(track) track->track_name
51 #define CD_Track_artist(track) track->track_artist
52 #define CD_Track_extended(track) track->track_extended
53
54 #define CD_Volume_front(vol) &vol->vol_front
55 #define CD_Volume_back(vol) &vol->vol_back
56 #define CD_VolumeRL_right(volrl, val) \
57 (val >= 0 ? volrl->right = val : volrl->right)
58 #define CD_VolumeRL_left(volrl, val) \
59 (val >= 0 ? volrl->left = val : volrl->left)
60
61 static Audio__CD cd_init(SV *sv_class, char *device)
main(int argc,char * argv[])62 {
63 int id = cd_init_device(device);
64 if (id < 0) {
65 return 0;
66 }
67 return id;
68 }
69
70 static SV *CD_Data_track_new(struct track_data *td)
71 {
72 SV *sv = newSV(0);
73 #if 0
74 struct track_data *new_td = (struct track_data *)safemalloc(sizeof(*new_td));
75 Copy(td, new_td, 1, struct track_data);
76 #endif
77 sv_setref_pv(sv, "Audio::CD::Track", (void*)td);
78 return sv;
79 }
80
81
82 static SV *CD_Info_track_new(struct track_info *ti)
83 {
84 SV *sv = newSV(0);
85 sv_setref_pv(sv, "Audio::CD::Info::Track", (void*)ti);
86 return sv;
87 }
88
89
90 static void boot_Audio__CD_constants(void)
91 {
92 HV *stash = gv_stashpv("Audio::CD", TRUE);
93 newCONSTSUB(stash, "PLAYING", newSViv(CDAUDIO_PLAYING));
94 newCONSTSUB(stash, "PAUSED", newSViv(CDAUDIO_PAUSED));
95 newCONSTSUB(stash, "COMPLETED", newSViv(CDAUDIO_COMPLETED));
96 newCONSTSUB(stash, "NOSTATUS", newSViv(CDAUDIO_NOSTATUS));
97 newCONSTSUB(stash, "TRACK_AUDIO", newSViv(CDAUDIO_TRACK_AUDIO));
98 newCONSTSUB(stash, "TRACK_DATA", newSViv(CDAUDIO_TRACK_DATA));
99 }
100
101 /* XXX */
102 static int inexact_select_func(void)
103 {
104 return 1;
105 }
106
107 MODULE = Audio::CD PACKAGE = Audio::CD PREFIX = cd_
108
109 BOOT:
110 boot_Audio__CD_constants();
111 cddb_inexact_selection_set(inexact_select_func);
112
113 Audio::CD
114 cd_init(sv_class, device="/dev/cdrom")
115 SV *sv_class
116 char *device
117
118 void
119 DESTROY(cd_desc)
120 Audio::CD cd_desc
121
122 CODE:
123 close(cd_desc);
124
125 Audio::CDDB
126 cddb(cd_desc)
127 Audio::CD cd_desc
128
129 CODE:
130 RETVAL = cd_desc;
131
132 OUTPUT:
133 RETVAL
134
135 int
136 cd_play(cd_desc, track=1)
137 Audio::CD cd_desc
138 int track
139
140 int
141 cd_stop(cd_desc)
142 Audio::CD cd_desc
143
144 int
145 cd_pause(cd_desc)
146 Audio::CD cd_desc
147
148 int
149 cd_resume(cd_desc)
150 Audio::CD cd_desc
151
152 int
153 cd_eject(cd_desc)
154 Audio::CD cd_desc
155
156 int
157 cd_close(cd_desc)
158 Audio::CD cd_desc
159
160 Audio::CD::Info
161 cd_stat(cd_desc)
162 Audio::CD cd_desc
163
164 CODE:
changed(int m,int p)165 RETVAL = (Audio__CD__Info)safemalloc(sizeof(*RETVAL));
166 cd_stat(cd_desc, RETVAL);
167
168 OUTPUT:
169 RETVAL
170
171 int
172 cd_play_frames(cd_desc, startframe, endframe)
173 Audio::CD cd_desc
174 int startframe
175 int endframe
init_bars(void)176
177 int
178 cd_play_track_pos(cd_desc, starttrack, endtrack, startpos)
179 Audio::CD cd_desc
180 int starttrack
181 int endtrack
182 int startpos
183
184 int
185 cd_play_track(cd_desc, starttrack, endtrack)
186 Audio::CD cd_desc
187 int starttrack
188 int endtrack
189
190 int
191 cd_play_pos(cd_desc, track, startpos)
192 Audio::CD cd_desc
193 int track
194 int startpos
195
196 int
197 cd_track_advance(cd_desc, endtrack, minutes, seconds=0)
198 Audio::CD cd_desc
199 int endtrack
200 int minutes
201 int seconds
202
203 PREINIT:
204 struct disc_timeval time;
205
206 CODE:
207 time.minutes = minutes;
208 time.seconds = seconds;
209 RETVAL = cd_track_advance(cd_desc, endtrack, time);
210
211 OUTPUT:
212 RETVAL
213
214 int
215 cd_advance(cd_desc, minutes, seconds=0)
volume_read(void * v)216 Audio::CD cd_desc
217 int minutes
218 int seconds
219
220 PREINIT:
221 struct disc_timeval time;
222
223 CODE:
224 time.minutes = minutes;
225 time.seconds = seconds;
226 RETVAL = cd_advance(cd_desc, time);
227
228 OUTPUT:
229 RETVAL
230
231 Audio::CD::Volume
232 cd_get_volume(cd_desc)
233 Audio::CD cd_desc
234
235 CODE:
236 RETVAL = (struct disc_volume *)safemalloc(sizeof(*RETVAL));
237 cd_get_volume(cd_desc, RETVAL);
238
239 OUTPUT:
240 RETVAL
241
242 int
243 cd_set_volume(cd_desc, vol)
244 Audio::CD cd_desc
245 Audio::CD::Volume vol
246
247 CODE:
248 RETVAL = cd_set_volume(cd_desc, *vol);
249
250 OUTPUT:
251 RETVAL
252
253 MODULE = Audio::CD PACKAGE = Audio::CD::Info PREFIX = CD_Info_
254
255 int
256 CD_Info_present(info)
257 Audio::CD::Info info
258
259 int
260 CD_Info_mode(info)
261 Audio::CD::Info info
262
263 int
264 CD_Info_total_tracks(info)
265 Audio::CD::Info info
266
267 void
268 CD_Info_track_time(info)
269 Audio::CD::Info info
270
271 void
272 CD_Info_time(info)
273 Audio::CD::Info info
274
275 void
276 CD_Info_length(info)
277 Audio::CD::Info info
278
279 AV *
280 CD_Info_tracks(info)
281 Audio::CD::Info info
282
283 PREINIT:
284 int track;
285
286 CODE:
287 RETVAL = newAV();
288 for(track = 0; track < info->disc_total_tracks; track++) {
289 av_push(RETVAL, CD_Info_track_new(&info->disc_track[track]));
290 }
291
292 OUTPUT:
293 RETVAL
294
295 void
296 DESTROY(info)
297 Audio::CD::Info info
298
299 CODE:
300 safefree(info);
301
302 MODULE = Audio::CD PACKAGE = Audio::CD::Info::Track PREFIX = CD_Info_Track_
303
304 void
305 CD_Info_Track_length(tinfo)
306 Audio::CD::Info::Track tinfo
307
308 void
309 CD_Info_Track_pos(tinfo)
310 Audio::CD::Info::Track tinfo
311
312 int
313 CD_Info_Track_type(tinfo)
314 Audio::CD::Info::Track tinfo
315
316 int
317 CD_Info_Track_is_audio(tinfo)
318 Audio::CD::Info::Track tinfo
319
320 int
321 CD_Info_Track_is_data(tinfo)
322 Audio::CD::Info::Track tinfo
323
324
325 MODULE = Audio::CD PACKAGE = Audio::CD::Data PREFIX = CD_Data_
326
327 char *
328 CD_Data_title(data)
329 Audio::CD::Data data
330
331 char *
332 CD_Data_artist(data)
333 Audio::CD::Data data
334
335 char *
336 CD_Data_extended(data)
337 Audio::CD::Data data
338
339 char *
340 CD_Data_genre(data)
341 Audio::CD::Data data
342
343 AV *
344 CD_Data_tracks(data, disc)
345 Audio::CD::Data data
346 Audio::CD::Info disc
347
348 PREINIT:
349 int track;
350
351 CODE:
352 RETVAL = newAV();
353 for(track = 0; track < disc->disc_total_tracks; track++) {
354 av_push(RETVAL, CD_Data_track_new(&data->data_track[track]));
355 }
356
357 OUTPUT:
358 RETVAL
359
360 void
361 DESTROY(data)
362 Audio::CD::Data data
363
364 CODE:
365 safefree(data);
366
367 MODULE = Audio::CD PACKAGE = Audio::CD::Track PREFIX = CD_Track_
368
369 char *
370 CD_Track_name(track)
371 Audio::CD::Track track
372
373 char *
374 CD_Track_artist(track)
375 Audio::CD::Track track
376
377 char *
378 CD_Track_extended(track)
379 Audio::CD::Track track
380
381 MODULE = Audio::CD PACKAGE = Audio::CDDB PREFIX = cddb_
382
383 PROTOTYPES: disable
384
385 void
386 cddb_verbose(sv, flag)
387 SV *sv
388 int flag
389
390 unsigned long
391 cddb_discid(h)
392 Audio::CDDB h
393
394 Audio::CD::Data
395 cddb_lookup(cd_desc)
396 Audio::CDDB cd_desc
397
398 CODE:
399 RETVAL = (Audio__CD__Data)safemalloc(sizeof(*RETVAL));
400 cddb_lookup(cd_desc, RETVAL);
401
402 OUTPUT:
403 RETVAL
404
405 MODULE = Audio::CD PACKAGE = Audio::CD::Volume PREFIX = CD_Volume_
406
407 void
408 DESTROY(vol)
409 Audio::CD::Volume vol
410
411 CODE:
412 safefree(vol);
413
414 Audio::CD::VolumeRL
415 CD_Volume_front(vol)
416 Audio::CD::Volume vol
417
418 Audio::CD::VolumeRL
419 CD_Volume_back(vol)
420 Audio::CD::Volume vol
421
422 MODULE = Audio::CD PACKAGE = Audio::CD::VolumeRL PREFIX = CD_VolumeRL_
423
424 int
425 CD_VolumeRL_left(volrl, val=-1)
426 Audio::CD::VolumeRL volrl
427 int val
428
429 int
430 CD_VolumeRL_right(volrl, val=-1)
431 Audio::CD::VolumeRL volrl
432 int val
433