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