rb_cdio 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/CdIo.c +132 -0
- data/ext/CdIo.h +108 -0
- data/ext/CdIo.o +0 -0
- data/ext/CdIo_Cd.c +345 -0
- data/ext/CdIo_Cd.o +0 -0
- data/ext/CdIo_Common.c +84 -0
- data/ext/CdIo_Common.o +0 -0
- data/ext/CdIo_Modulo.c +226 -0
- data/ext/CdIo_Modulo.o +0 -0
- data/ext/CdIo_Track.c +91 -0
- data/ext/CdIo_Track.o +0 -0
- data/ext/CdIo_TrackIso9660.c +78 -0
- data/ext/CdIo_TrackIso9660.o +0 -0
- data/ext/Makefile +127 -0
- data/ext/extconf.rb +4 -0
- data/ext/mkmf.log +26 -0
- data/lib/rb_cdio_read.rb +39 -0
- data/test/data/Makefile +677 -0
- data/test/data/Makefile.am +78 -0
- data/test/data/Makefile.in +677 -0
- data/test/data/bad-cat1.cue +9 -0
- data/test/data/bad-cat1.toc +8 -0
- data/test/data/bad-cat2.cue +9 -0
- data/test/data/bad-cat2.toc +8 -0
- data/test/data/bad-cat3.cue +9 -0
- data/test/data/bad-cat3.toc +8 -0
- data/test/data/bad-mode1.cue +7 -0
- data/test/data/bad-mode1.toc +5 -0
- data/test/data/bad-msf-1.cue +7 -0
- data/test/data/bad-msf-1.toc +6 -0
- data/test/data/bad-msf-2.cue +7 -0
- data/test/data/bad-msf-2.toc +6 -0
- data/test/data/bad-msf-3.cue +7 -0
- data/test/data/bad-msf-3.toc +6 -0
- data/test/data/cdda-read.right +148 -0
- data/test/data/cdda.bin +0 -0
- data/test/data/cdda.cue +6 -0
- data/test/data/cdda.right +44 -0
- data/test/data/cdda.toc +13 -0
- data/test/data/cdtext.toc +48 -0
- data/test/data/check_cd_read.sh +53 -0
- data/test/data/check_common_fn +186 -0
- data/test/data/check_common_fn.in +186 -0
- data/test/data/check_cue.sh +102 -0
- data/test/data/check_cue.sh.in +102 -0
- data/test/data/check_iso.sh +32 -0
- data/test/data/check_iso.sh.in +32 -0
- data/test/data/check_nrg.sh +68 -0
- data/test/data/check_nrg.sh.in +68 -0
- data/test/data/check_opts.sh +33 -0
- data/test/data/check_opts0.right +40 -0
- data/test/data/check_opts1.right +40 -0
- data/test/data/check_opts2.right +34 -0
- data/test/data/check_opts3.right +34 -0
- data/test/data/check_opts4.right +44 -0
- data/test/data/check_opts5.right +44 -0
- data/test/data/check_opts6.right +44 -0
- data/test/data/check_opts7.right +44 -0
- data/test/data/check_sizeof +117 -0
- data/test/data/check_sizeof.c +77 -0
- data/test/data/copying.iso +0 -0
- data/test/data/copying.right +10 -0
- data/test/data/data1.toc +8 -0
- data/test/data/data2.toc +13 -0
- data/test/data/data5.toc +13 -0
- data/test/data/data6.toc +8 -0
- data/test/data/data7.toc +13 -0
- data/test/data/isofs-m1-read.right +258 -0
- data/test/data/isofs-m1.bin +0 -0
- data/test/data/isofs-m1.cue +3 -0
- data/test/data/isofs-m1.right +57 -0
- data/test/data/isofs-m1.toc +4 -0
- data/test/data/t1.toc +5 -0
- data/test/data/t2.toc +6 -0
- data/test/data/t3.toc +11 -0
- data/test/data/t4.toc +8 -0
- data/test/data/t5.toc +8 -0
- data/test/data/t6.toc +7 -0
- data/test/data/t7.toc +12 -0
- data/test/data/t8.toc +14 -0
- data/test/data/t9.toc +31 -0
- data/test/data/testassert +117 -0
- data/test/data/testassert.c +36 -0
- data/test/data/testbincue +117 -0
- data/test/data/testbincue.c +88 -0
- data/test/data/testdefault +117 -0
- data/test/data/testdefault.c +196 -0
- data/test/data/testischar +117 -0
- data/test/data/testischar.c +71 -0
- data/test/data/testiso9660 +117 -0
- data/test/data/testiso9660.c +153 -0
- data/test/data/testtoc +117 -0
- data/test/data/testtoc.c +101 -0
- data/test/data/vcd_demo.right +116 -0
- data/test/data/videocd.nrg +0 -0
- data/test/data/videocd.right +92 -0
- data/test/testall.rb +4 -0
- data/test/testbincue.rb +30 -0
- data/test/testtoc.rb +45 -0
- metadata +141 -0
data/ext/CdIo.c
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2005 Claudio Bustos <clbustos@gmail.com>
|
|
3
|
+
* This code is hereby licensed for public consumption under the
|
|
4
|
+
* GNU GPL v2.
|
|
5
|
+
* You should have received a copy of the GNU General Public License
|
|
6
|
+
* along with this program; if not, write to the Free Software
|
|
7
|
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include "CdIo.h"
|
|
11
|
+
|
|
12
|
+
Init_rb_cdio()
|
|
13
|
+
{
|
|
14
|
+
/** module CdIo */
|
|
15
|
+
mCdIo = rb_define_module("CdIo");
|
|
16
|
+
rb_define_module_function(mCdIo, "get_devices", rb_cdio_get_devices,
|
|
17
|
+
-1);
|
|
18
|
+
rb_define_module_function(mCdIo, "get_default_device",
|
|
19
|
+
rb_cdio_get_default_device, -1);
|
|
20
|
+
rb_define_module_function(mCdIo, "get_drive_cap_dev",
|
|
21
|
+
rb_cdio_get_drive_cap_dev, 1);
|
|
22
|
+
rb_define_module_function(mCdIo, "discmode_describe",
|
|
23
|
+
rb_cdio_discmode_describe, 1);
|
|
24
|
+
rb_define_module_function(mCdIo, "driver_describe",
|
|
25
|
+
rb_cdio_driver_describe, 1);
|
|
26
|
+
rb_define_module_function(mCdIo, "track_format_describe",
|
|
27
|
+
rb_cdio_track_format_describe, 1);
|
|
28
|
+
rb_define_module_function(mCdIo, "track_type_describe",
|
|
29
|
+
rb_cdio_track_type_describe, 1);
|
|
30
|
+
|
|
31
|
+
rb_define_module_function(mCdIo, "open", rb_cdio_open, -1);
|
|
32
|
+
// is
|
|
33
|
+
rb_define_module_function(mCdIo, "is_binfile", rb_cdio_is_binfile, 1);
|
|
34
|
+
rb_define_module_function(mCdIo, "is_cuefile", rb_cdio_is_cuefile, 1);
|
|
35
|
+
rb_define_module_function(mCdIo, "is_nrg", rb_cdio_is_nrg, 1);
|
|
36
|
+
rb_define_module_function(mCdIo, "is_tocfile", rb_cdio_is_tocfile, 1);
|
|
37
|
+
rb_define_module_function(mCdIo, "is_device",rb_cdio_is_device,-1);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* class CdIo::Cd
|
|
41
|
+
*/
|
|
42
|
+
cCdIoCd = rb_define_class_under(mCdIo, "Cd", rb_cObject);
|
|
43
|
+
rb_define_singleton_method(cCdIoCd, "new", rb_cdio_cd_new, -1);
|
|
44
|
+
rb_define_method(cCdIoCd, "initialize", rb_cdio_cd_init, 2);
|
|
45
|
+
int i;
|
|
46
|
+
#define CDIO_ATTR 9
|
|
47
|
+
const char *attr[CDIO_ATTR] =
|
|
48
|
+
{ "device", "mcn", "driver_name", "driver_id", "first_track_num",
|
|
49
|
+
"discmode", "num_tracks", "stat_size", "cddb_id"
|
|
50
|
+
};
|
|
51
|
+
for (i = 0; i < CDIO_ATTR; i++) {
|
|
52
|
+
rb_define_attr(cCdIoCd, attr[i], 1, 0);
|
|
53
|
+
}
|
|
54
|
+
rb_define_method(cCdIoCd, "get_tracks", rb_cdio_cd_get_tracks, 0);
|
|
55
|
+
rb_define_method(cCdIoCd, "get_first_track",
|
|
56
|
+
rb_cdio_cd_get_first_track, 0);
|
|
57
|
+
rb_define_method(cCdIoCd, "get_arg", rb_cdio_cd_get_arg, 1);
|
|
58
|
+
|
|
59
|
+
rb_define_method(cCdIoCd, "is_cd?", rb_cdio_cd_is_cd, 0);
|
|
60
|
+
rb_define_method(cCdIoCd, "is_dvd?", rb_cdio_cd_is_dvd, 0);
|
|
61
|
+
rb_define_method(cCdIoCd, "get_freedb", rb_cdio_cd_get_freedb, 0);
|
|
62
|
+
rb_define_method(cCdIoCd, "get_cdtext", rb_cdio_cd_get_cdtext, 0);
|
|
63
|
+
// device methods
|
|
64
|
+
rb_define_method(cCdIoCd, "get_drive_cap", rb_cdio_cd_get_drive_cap,
|
|
65
|
+
0);
|
|
66
|
+
rb_define_method(cCdIoCd, "get_hwinfo", rb_cdio_cd_get_hwinfo, 0);
|
|
67
|
+
rb_define_method(cCdIoCd, "close", rb_cdio_cd_close, 0);
|
|
68
|
+
/** class CdIo::Track */
|
|
69
|
+
cCdIoTrack = rb_define_class_under(mCdIo, "Track", rb_cObject);
|
|
70
|
+
rb_define_method(cCdIoTrack, "initialize", rb_cdio_track_init, 2);
|
|
71
|
+
rb_define_method(cCdIoTrack, "green?", rb_cdio_track_green, 0);
|
|
72
|
+
rb_define_method(cCdIoTrack, "get_cdtext", rb_cdio_track_get_cdtext, 0);
|
|
73
|
+
/** :cd :number :format, :green, :lba,:lsn,min,sec,frames,:sec_count*/
|
|
74
|
+
char attr2[11][32] =
|
|
75
|
+
{ "cd", "number", "format", "lba", "lsn", "min", "sec", "frames",
|
|
76
|
+
"msf", "sec_count", "track_type"
|
|
77
|
+
};
|
|
78
|
+
for (i = 0; i < 11; i++) {
|
|
79
|
+
rb_define_attr(cCdIoTrack, attr2[i], 1, 0);
|
|
80
|
+
}
|
|
81
|
+
/** class CdIo::TrackIso9660 < CdIo::Track */
|
|
82
|
+
|
|
83
|
+
cCdIoTrackIso9660 =
|
|
84
|
+
rb_define_class_under(mCdIo, "TrackIso9660", cCdIoTrack);
|
|
85
|
+
char attr3[6][32] =
|
|
86
|
+
{ "system_id", "volume_id", "volumeset_id", "preparer_id",
|
|
87
|
+
"publisher_id", "application_id"
|
|
88
|
+
};
|
|
89
|
+
for (i = 0; i < 6; i++) {
|
|
90
|
+
rb_define_attr(cCdIoTrackIso9660, attr3[i], 1, 0);
|
|
91
|
+
}
|
|
92
|
+
rb_define_method(cCdIoTrackIso9660, "initialize",
|
|
93
|
+
rb_cdio_trackiso9660_init, 2);
|
|
94
|
+
// const for DRIVER
|
|
95
|
+
rb_define_const(mCdIo, "DRIVER_UNKNOWN", INT2FIX(DRIVER_UNKNOWN));
|
|
96
|
+
rb_define_const(mCdIo, "DRIVER_FREEBSD", INT2FIX(DRIVER_FREEBSD));
|
|
97
|
+
rb_define_const(mCdIo, "DRIVER_LINUX", INT2FIX(DRIVER_LINUX));
|
|
98
|
+
rb_define_const(mCdIo, "DRIVER_SOLARIS", INT2FIX(DRIVER_SOLARIS));
|
|
99
|
+
rb_define_const(mCdIo, "DRIVER_OSX", INT2FIX(DRIVER_OSX));
|
|
100
|
+
rb_define_const(mCdIo, "DRIVER_WIN32", INT2FIX(DRIVER_WIN32));
|
|
101
|
+
rb_define_const(mCdIo, "DRIVER_CDRDAO", INT2FIX(DRIVER_CDRDAO));
|
|
102
|
+
rb_define_const(mCdIo, "DRIVER_BINCUE", INT2FIX(DRIVER_BINCUE));
|
|
103
|
+
rb_define_const(mCdIo, "DRIVER_NRG", INT2FIX(DRIVER_NRG));
|
|
104
|
+
rb_define_const(mCdIo, "DRIVER_DEVICE", INT2FIX(DRIVER_DEVICE));
|
|
105
|
+
// const for CD types
|
|
106
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_CD_DA",
|
|
107
|
+
INT2FIX(CDIO_DISC_MODE_CD_DA));
|
|
108
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_CD_DATA",
|
|
109
|
+
INT2FIX(CDIO_DISC_MODE_CD_DATA));
|
|
110
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_CD_XA",
|
|
111
|
+
INT2FIX(CDIO_DISC_MODE_CD_XA));
|
|
112
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_CD_MIXED",
|
|
113
|
+
INT2FIX(CDIO_DISC_MODE_CD_MIXED));
|
|
114
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_ROM",
|
|
115
|
+
INT2FIX(CDIO_DISC_MODE_DVD_ROM));
|
|
116
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_RAM",
|
|
117
|
+
INT2FIX(CDIO_DISC_MODE_DVD_RAM));
|
|
118
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_R",
|
|
119
|
+
INT2FIX(CDIO_DISC_MODE_DVD_R));
|
|
120
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_RW",
|
|
121
|
+
INT2FIX(CDIO_DISC_MODE_DVD_RW));
|
|
122
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_PR",
|
|
123
|
+
INT2FIX(CDIO_DISC_MODE_DVD_PR));
|
|
124
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_PRW",
|
|
125
|
+
INT2FIX(CDIO_DISC_MODE_DVD_PRW));
|
|
126
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_DVD_OTHER",
|
|
127
|
+
INT2FIX(CDIO_DISC_MODE_DVD_OTHER));
|
|
128
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_NO_INFO",
|
|
129
|
+
INT2FIX(CDIO_DISC_MODE_NO_INFO));
|
|
130
|
+
rb_define_const(mCdIo, "CDIO_DISC_MODE_ERROR",
|
|
131
|
+
INT2FIX(CDIO_DISC_MODE_ERROR));
|
|
132
|
+
}
|
data/ext/CdIo.h
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2005 Claudio Bustos <clbustos@gmail.com>
|
|
3
|
+
* This code is hereby licensed for public consumption under the
|
|
4
|
+
* GNU GPL v2.
|
|
5
|
+
* You should have received a copy of the GNU General Public License
|
|
6
|
+
* along with this program; if not, write to the Free Software
|
|
7
|
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Archivo de cabecera para la extensi�n rb_cdio
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
#ifndef __RUBY_CDIO_H__
|
|
15
|
+
#define __RUBY_CDIO_H__
|
|
16
|
+
|
|
17
|
+
#include <stdio.h>
|
|
18
|
+
#include <stdlib.h>
|
|
19
|
+
#include <fcntl.h>
|
|
20
|
+
#include <sys/ioctl.h>
|
|
21
|
+
#include <string.h>
|
|
22
|
+
#include <cdio/iso9660.h>
|
|
23
|
+
#include <cdio/cdtext.h>
|
|
24
|
+
#include <cdio/cd_types.h>
|
|
25
|
+
#include <ruby.h>
|
|
26
|
+
|
|
27
|
+
#define GET_CDIO(self,p) \
|
|
28
|
+
CdIo* p; \
|
|
29
|
+
Data_Get_Struct(self, CdIo, p); \
|
|
30
|
+
if(NULL==p) {rb_raise(rb_eException,"No pointer to CdIo");}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
#undef CDIO_DRIVE_CAP_WRITE_DVD
|
|
34
|
+
#define CDIO_DRIVE_CAP_WRITE_DVD ( \
|
|
35
|
+
CDIO_DRIVE_CAP_WRITE_DVD_R \
|
|
36
|
+
| CDIO_DRIVE_CAP_WRITE_DVD_PR \
|
|
37
|
+
| CDIO_DRIVE_CAP_WRITE_DVD_RAM \
|
|
38
|
+
| CDIO_DRIVE_CAP_WRITE_DVD_RW \
|
|
39
|
+
| CDIO_DRIVE_CAP_WRITE_DVD_RPW \
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
VALUE mCdIo;
|
|
43
|
+
VALUE cCdIoCd;
|
|
44
|
+
VALUE cCdIoTrack;
|
|
45
|
+
VALUE cCdIoTrackIso9660;
|
|
46
|
+
int Init_CdIo();
|
|
47
|
+
// Metodos para el m�dulo CdIo
|
|
48
|
+
|
|
49
|
+
VALUE rb_cdio_open(int argc, VALUE * argv, VALUE module);
|
|
50
|
+
VALUE rb_cdio_get_devices(int argc, VALUE * argv, VALUE module); // ok
|
|
51
|
+
VALUE rb_cdio_get_default_device(int argc, VALUE * argv, VALUE module); // ok,
|
|
52
|
+
// con
|
|
53
|
+
// cero
|
|
54
|
+
// argumentos
|
|
55
|
+
VALUE rb_cdio_get_drive_cap_dev(VALUE module, VALUE device);
|
|
56
|
+
VALUE rb_cdio_driver_describe(VALUE module, VALUE driver);
|
|
57
|
+
VALUE rb_cdio_track_format_describe(VALUE module, VALUE track_format); // creado
|
|
58
|
+
// por
|
|
59
|
+
// mi
|
|
60
|
+
VALUE rb_cdio_track_type_describe(VALUE module, VALUE track_type); // creada
|
|
61
|
+
// por
|
|
62
|
+
// mi
|
|
63
|
+
VALUE rb_cdio_discmode_describe(VALUE module, VALUE discmode); // creada
|
|
64
|
+
// por
|
|
65
|
+
// mi
|
|
66
|
+
|
|
67
|
+
VALUE rb_cdio_is_binfile(VALUE module, VALUE name);
|
|
68
|
+
VALUE rb_cdio_is_cuefile(VALUE module, VALUE name);
|
|
69
|
+
VALUE rb_cdio_is_nrg(VALUE module, VALUE name);
|
|
70
|
+
VALUE rb_cdio_is_tocfile(VALUE module, VALUE name);
|
|
71
|
+
VALUE rb_cdio_is_device(int argc, VALUE * argv, VALUE module);
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
* M�todos para clase CdIo::Cd
|
|
76
|
+
*/
|
|
77
|
+
VALUE rb_cdio_cd_new(int argc, VALUE * argv, VALUE class); // ok
|
|
78
|
+
VALUE rb_cdio_cd_init(VALUE class, VALUE device, VALUE driver); // ok
|
|
79
|
+
VALUE rb_cdio_cd_get_tracks(VALUE class); // ok
|
|
80
|
+
VALUE rb_cdio_cd_get_first_track(VALUE class); // ok
|
|
81
|
+
VALUE rb_cdio_cd_get_arg(VALUE obj, VALUE arg);
|
|
82
|
+
|
|
83
|
+
VALUE rb_cdio_cd_is_cd(VALUE obj);
|
|
84
|
+
VALUE rb_cdio_cd_is_dvd(VALUE obj);
|
|
85
|
+
VALUE rb_cdio_cd_get_freedb(VALUE obj);
|
|
86
|
+
VALUE rb_cdio_cd_get_drive_cap(VALUE obj);
|
|
87
|
+
VALUE rb_cdio_cd_get_hwinfo(VALUE obj);
|
|
88
|
+
VALUE rb_cdio_cd_close(VALUE obj);
|
|
89
|
+
VALUE rb_cdio_cd_get_cdtext(VALUE obj);
|
|
90
|
+
/*
|
|
91
|
+
* M�todos para la clase CdIo::Track
|
|
92
|
+
*/
|
|
93
|
+
VALUE rb_cdio_track_new(VALUE cd, int track);
|
|
94
|
+
VALUE rb_cdio_track_init(VALUE obj, VALUE oCd, VALUE i_track); // ok
|
|
95
|
+
VALUE rb_cdio_track_green(VALUE obj); // ok
|
|
96
|
+
VALUE rb_cdio_track_get_cdtext(VALUE obj);
|
|
97
|
+
|
|
98
|
+
/* TrackIso9660*/
|
|
99
|
+
VALUE rb_cdio_trackiso9660_new(VALUE cd, int track);
|
|
100
|
+
VALUE rb_cdio_trackiso9660_init(VALUE obj, VALUE oCd, VALUE i_track);
|
|
101
|
+
/*
|
|
102
|
+
* M�todos comunes
|
|
103
|
+
*/
|
|
104
|
+
VALUE get_cap(cdio_drive_read_cap_t * read_cap,
|
|
105
|
+
cdio_drive_write_cap_t * write_cap,
|
|
106
|
+
cdio_drive_misc_cap_t * misc_cap);
|
|
107
|
+
VALUE get_cdtext(const cdtext_t *cdtext);
|
|
108
|
+
#endif
|
data/ext/CdIo.o
ADDED
|
Binary file
|
data/ext/CdIo_Cd.c
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2005 Claudio Bustos <clbustos@gmail.com>
|
|
3
|
+
* This code is hereby licensed for public consumption under the
|
|
4
|
+
* GNU GPL v2.
|
|
5
|
+
* You should have received a copy of the GNU General Public License
|
|
6
|
+
* along with this program; if not, write to the Free Software
|
|
7
|
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Definici?n de funciones para CdIo::Cd
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
#include "CdIo.h"
|
|
15
|
+
// Libera el puntero al objeto CdIo creado en Cd.new
|
|
16
|
+
static void
|
|
17
|
+
_cdio_cd_destroy(void *p)
|
|
18
|
+
{
|
|
19
|
+
/*
|
|
20
|
+
static int i;
|
|
21
|
+
printf("\nDestruyendo cdio %d\n",i++);
|
|
22
|
+
*/
|
|
23
|
+
cdio_destroy(p);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// lanza true si el tipo de disco es un ISO9660
|
|
27
|
+
|
|
28
|
+
static bool
|
|
29
|
+
_cdio_cd_is_iso(CdIo * p_cdio, track_t track)
|
|
30
|
+
{
|
|
31
|
+
cdio_fs_anal_t fs;
|
|
32
|
+
cdio_iso_analysis_t iso_analysis;
|
|
33
|
+
fs = cdio_guess_cd_type(p_cdio, 0, track, &iso_analysis);
|
|
34
|
+
switch (CDIO_FSTYPE(fs)) {
|
|
35
|
+
case CDIO_FS_ISO_9660:
|
|
36
|
+
case CDIO_FS_ISO_9660_INTERACTIVE:
|
|
37
|
+
case CDIO_FS_ISO_HFS:
|
|
38
|
+
case CDIO_FS_ISO_UDF:
|
|
39
|
+
return true;
|
|
40
|
+
default:
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Devuelve un objeto CdIo::Track o de una subclase, a partir de un objeto
|
|
47
|
+
* Cd y un n?mero de pista
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
static VALUE
|
|
51
|
+
_track_by_type(VALUE obj, track_t i)
|
|
52
|
+
{
|
|
53
|
+
GET_CDIO(obj, p_cdio);
|
|
54
|
+
VALUE track;
|
|
55
|
+
if (_cdio_cd_is_iso(p_cdio, i)) {
|
|
56
|
+
track = rb_cdio_trackiso9660_new(obj, i);
|
|
57
|
+
} else {
|
|
58
|
+
track = rb_cdio_track_new(obj, i);
|
|
59
|
+
}
|
|
60
|
+
return track;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* CDDB
|
|
65
|
+
* Extraido desde cd-info.
|
|
66
|
+
**/
|
|
67
|
+
|
|
68
|
+
static int
|
|
69
|
+
cddb_dec_digit_sum(int n)
|
|
70
|
+
{
|
|
71
|
+
int ret = 0;
|
|
72
|
+
|
|
73
|
+
for (;;) {
|
|
74
|
+
ret += n % 10;
|
|
75
|
+
n = n / 10;
|
|
76
|
+
if (!n)
|
|
77
|
+
return ret;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* Return the number of seconds (discarding frame portion) of an MSF
|
|
83
|
+
*/
|
|
84
|
+
static inline unsigned int
|
|
85
|
+
msf_seconds(msf_t * msf)
|
|
86
|
+
{
|
|
87
|
+
return from_bcd8(msf->m) * 60 + from_bcd8(msf->s);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static unsigned long
|
|
91
|
+
cddb_discid(CdIo * p_cdio, int i_tracks)
|
|
92
|
+
{
|
|
93
|
+
int i,
|
|
94
|
+
t,
|
|
95
|
+
n = 0;
|
|
96
|
+
msf_t start_msf;
|
|
97
|
+
msf_t msf;
|
|
98
|
+
|
|
99
|
+
for (i = 1; i <= i_tracks; i++) {
|
|
100
|
+
cdio_get_track_msf(p_cdio, i, &msf);
|
|
101
|
+
n += cddb_dec_digit_sum(msf_seconds(&msf));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
cdio_get_track_msf(p_cdio, 1, &start_msf);
|
|
105
|
+
cdio_get_track_msf(p_cdio, CDIO_CDROM_LEADOUT_TRACK, &msf);
|
|
106
|
+
|
|
107
|
+
t = msf_seconds(&msf) - msf_seconds(&start_msf);
|
|
108
|
+
|
|
109
|
+
return ((n % 0xff) << 24 | t << 8 | i_tracks);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Constructor
|
|
114
|
+
* CdIo::Cd.new
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
VALUE
|
|
118
|
+
rb_cdio_cd_new(int argc, VALUE * argv, VALUE class)
|
|
119
|
+
{
|
|
120
|
+
CdIo *p_cdio;
|
|
121
|
+
char *device;
|
|
122
|
+
driver_id_t driver = DRIVER_UNKNOWN;
|
|
123
|
+
VALUE source,
|
|
124
|
+
driver_fix;
|
|
125
|
+
rb_scan_args(argc, argv, "02", &source, &driver_fix);
|
|
126
|
+
// source=DEFAULT, driver=DEFAULT
|
|
127
|
+
if (driver_fix != Qnil) {
|
|
128
|
+
FIXNUM_P(driver_fix);
|
|
129
|
+
driver = FIX2INT(driver_fix);
|
|
130
|
+
}
|
|
131
|
+
if (source != Qnil) {
|
|
132
|
+
Check_Type(source, T_STRING);
|
|
133
|
+
SafeStringValue(source);
|
|
134
|
+
device = StringValuePtr(source);
|
|
135
|
+
} else {
|
|
136
|
+
device = cdio_get_default_device(NULL);
|
|
137
|
+
if (NULL == device) {
|
|
138
|
+
rb_raise(rb_eException, "I can't find a default device");
|
|
139
|
+
return Qnil;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
p_cdio = cdio_open(device, driver);
|
|
143
|
+
|
|
144
|
+
if (p_cdio == NULL) {
|
|
145
|
+
rb_raise(rb_eException, "I can't create a pointer");
|
|
146
|
+
return Qnil;
|
|
147
|
+
} else {
|
|
148
|
+
VALUE c_argv[2];
|
|
149
|
+
VALUE tdata =
|
|
150
|
+
Data_Wrap_Struct(class, 0, _cdio_cd_destroy, p_cdio);
|
|
151
|
+
c_argv[0] = rb_str_new2(device);
|
|
152
|
+
c_argv[1] = INT2FIX(driver);
|
|
153
|
+
rb_obj_call_init(tdata, 2, c_argv);
|
|
154
|
+
return tdata;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* CdIo::Cd.initialize
|
|
160
|
+
*/
|
|
161
|
+
VALUE
|
|
162
|
+
rb_cdio_cd_init(VALUE self, VALUE device, VALUE driver)
|
|
163
|
+
{
|
|
164
|
+
|
|
165
|
+
track_t nt;
|
|
166
|
+
discmode_t discmode;
|
|
167
|
+
Check_Type(device, T_STRING);
|
|
168
|
+
FIXNUM_P(driver);
|
|
169
|
+
GET_CDIO(self, p_cdio);
|
|
170
|
+
rb_iv_set(self, "@device", device);
|
|
171
|
+
rb_iv_set(self, "@driver_name",
|
|
172
|
+
rb_str_new2(cdio_get_driver_name(p_cdio)));
|
|
173
|
+
rb_iv_set(self, "@driver_id", INT2FIX(cdio_get_driver_id(p_cdio)));
|
|
174
|
+
discmode = cdio_get_discmode(p_cdio);
|
|
175
|
+
rb_iv_set(self, "@discmode", INT2FIX(discmode));
|
|
176
|
+
|
|
177
|
+
nt = cdio_get_first_track_num(p_cdio);
|
|
178
|
+
rb_iv_set(self, "@first_track_num",
|
|
179
|
+
(nt != CDIO_INVALID_TRACK) ? INT2FIX(nt) : Qnil);
|
|
180
|
+
nt = cdio_get_num_tracks(p_cdio);
|
|
181
|
+
rb_iv_set(self, "@num_tracks",
|
|
182
|
+
(nt != CDIO_INVALID_TRACK) ? INT2FIX(nt) : Qnil);
|
|
183
|
+
|
|
184
|
+
// mcn
|
|
185
|
+
if (cdio_is_discmode_cdrom(discmode)) {
|
|
186
|
+
char *mcn;
|
|
187
|
+
mcn = cdio_get_mcn(p_cdio);
|
|
188
|
+
if (NULL != mcn) {
|
|
189
|
+
rb_iv_set(self, "@mcn", rb_str_new2(mcn));
|
|
190
|
+
free(mcn);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// stat_size
|
|
194
|
+
rb_iv_set(self, "@stat_size", INT2NUM(cdio_stat_size(p_cdio)));
|
|
195
|
+
// si es un disco de audio, calculo su cddb
|
|
196
|
+
if (CDIO_DISC_MODE_CD_DA == discmode) {
|
|
197
|
+
char cddb[8];
|
|
198
|
+
sprintf(cddb, "%08lx", cddb_discid(p_cdio, nt));
|
|
199
|
+
rb_iv_set(self, "@cddb_id", rb_str_new2(cddb));
|
|
200
|
+
}
|
|
201
|
+
return self;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* CdIo::Cd.get_tracks
|
|
206
|
+
*/
|
|
207
|
+
VALUE
|
|
208
|
+
rb_cdio_cd_get_tracks(VALUE self)
|
|
209
|
+
{
|
|
210
|
+
VALUE aTracks;
|
|
211
|
+
aTracks = rb_ary_new();
|
|
212
|
+
GET_CDIO(self, p_cdio);
|
|
213
|
+
track_t first_track_num;
|
|
214
|
+
track_t num_tracks;
|
|
215
|
+
first_track_num = cdio_get_first_track_num(p_cdio);
|
|
216
|
+
num_tracks = cdio_get_num_tracks(p_cdio);
|
|
217
|
+
// printf("C->Primera pista: %d\n",first_track_num);
|
|
218
|
+
// printf("C->Numero pistas: %d\n",num_tracks);
|
|
219
|
+
int j,
|
|
220
|
+
i = first_track_num;
|
|
221
|
+
for (j = 0; j < num_tracks; i++, j++) {
|
|
222
|
+
rb_ary_push(aTracks, _track_by_type(self, i));
|
|
223
|
+
}
|
|
224
|
+
return aTracks;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* CdIo::Cd.get_first_track
|
|
229
|
+
*/
|
|
230
|
+
VALUE
|
|
231
|
+
rb_cdio_cd_get_first_track(VALUE self)
|
|
232
|
+
{
|
|
233
|
+
GET_CDIO(self, p_cdio);
|
|
234
|
+
track_t first_track_num = cdio_get_first_track_num(p_cdio);
|
|
235
|
+
return _track_by_type(self, first_track_num);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* CdIo::Cd.get_arg
|
|
240
|
+
*/
|
|
241
|
+
VALUE
|
|
242
|
+
rb_cdio_cd_get_arg(VALUE obj, VALUE arg)
|
|
243
|
+
{
|
|
244
|
+
rb_notimplement();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* CdIo::Cd.is_cd?
|
|
249
|
+
*/
|
|
250
|
+
VALUE
|
|
251
|
+
rb_cdio_cd_is_cd(VALUE obj)
|
|
252
|
+
{
|
|
253
|
+
GET_CDIO(obj, p_cdio);
|
|
254
|
+
return (discmode_is_cd(cdio_get_discmode(p_cdio))) ? Qtrue : Qfalse;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* CdIo::Cd.is_dvd?
|
|
259
|
+
*/
|
|
260
|
+
VALUE
|
|
261
|
+
rb_cdio_cd_is_dvd(VALUE obj)
|
|
262
|
+
{
|
|
263
|
+
GET_CDIO(obj, p_cdio);
|
|
264
|
+
return (discmode_is_dvd(cdio_get_discmode(p_cdio))) ? Qtrue : Qfalse;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
static VALUE
|
|
268
|
+
_get_freedb(VALUE obj)
|
|
269
|
+
{
|
|
270
|
+
rb_require("freedb");
|
|
271
|
+
VALUE cFreeDb =
|
|
272
|
+
rb_const_get(rb_mKernel, rb_intern("Freedb"));
|
|
273
|
+
return rb_funcall(cFreeDb, rb_intern("new"), 1,
|
|
274
|
+
rb_iv_get(obj, "@device"));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
static VALUE
|
|
278
|
+
_get_freedb_error(VALUE obj, VALUE error_info)
|
|
279
|
+
{
|
|
280
|
+
rb_raise(rb_eLoadError,
|
|
281
|
+
"Please, install ruby-freedb to use this function");
|
|
282
|
+
return Qnil;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* CdIo::Cd.get_freedb
|
|
287
|
+
*/
|
|
288
|
+
VALUE
|
|
289
|
+
rb_cdio_cd_get_freedb(VALUE obj)
|
|
290
|
+
{
|
|
291
|
+
VALUE retorno =
|
|
292
|
+
rb_rescue2(_get_freedb, obj, _get_freedb_error, obj, rb_eLoadError,
|
|
293
|
+
0);
|
|
294
|
+
return retorno;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
VALUE
|
|
298
|
+
rb_cdio_cd_get_drive_cap(VALUE obj)
|
|
299
|
+
{
|
|
300
|
+
GET_CDIO(obj, p_cdio);
|
|
301
|
+
cdio_drive_read_cap_t read_cap;
|
|
302
|
+
cdio_drive_write_cap_t write_cap;
|
|
303
|
+
cdio_drive_misc_cap_t misc_cap;
|
|
304
|
+
cdio_get_drive_cap(p_cdio, &read_cap, &write_cap, &misc_cap);
|
|
305
|
+
// Error?
|
|
306
|
+
return get_cap(&read_cap, &write_cap, &misc_cap);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
VALUE
|
|
310
|
+
rb_cdio_cd_get_hwinfo(VALUE obj)
|
|
311
|
+
{
|
|
312
|
+
GET_CDIO(obj, p_cdio);
|
|
313
|
+
cdio_hwinfo_t hw_info;
|
|
314
|
+
if (!cdio_get_hwinfo(p_cdio, &hw_info)) {
|
|
315
|
+
rb_raise(rb_eException, "Error on retrieving hardware info");
|
|
316
|
+
return Qnil;
|
|
317
|
+
} else {
|
|
318
|
+
VALUE ret;
|
|
319
|
+
ret = rb_hash_new();
|
|
320
|
+
rb_hash_aset(ret, rb_str_new2("vendor"),
|
|
321
|
+
rb_str_new2(hw_info.psz_vendor));
|
|
322
|
+
rb_hash_aset(ret, rb_str_new2("model"),
|
|
323
|
+
rb_str_new2(hw_info.psz_model));
|
|
324
|
+
rb_hash_aset(ret, rb_str_new2("revision"),
|
|
325
|
+
rb_str_new2(hw_info.psz_revision));
|
|
326
|
+
return ret;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
VALUE
|
|
332
|
+
rb_cdio_cd_close(VALUE obj)
|
|
333
|
+
{
|
|
334
|
+
/*
|
|
335
|
+
* Nothing to do
|
|
336
|
+
*/
|
|
337
|
+
return Qnil;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
VALUE rb_cdio_cd_get_cdtext(VALUE obj) {
|
|
342
|
+
GET_CDIO(obj,p_cdio);
|
|
343
|
+
const cdtext_t *cdtext = cdio_get_cdtext(p_cdio, 0);
|
|
344
|
+
return get_cdtext(cdtext);
|
|
345
|
+
}
|