rb_cdio 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/ext/CdIo.c +132 -0
  2. data/ext/CdIo.h +108 -0
  3. data/ext/CdIo.o +0 -0
  4. data/ext/CdIo_Cd.c +345 -0
  5. data/ext/CdIo_Cd.o +0 -0
  6. data/ext/CdIo_Common.c +84 -0
  7. data/ext/CdIo_Common.o +0 -0
  8. data/ext/CdIo_Modulo.c +226 -0
  9. data/ext/CdIo_Modulo.o +0 -0
  10. data/ext/CdIo_Track.c +91 -0
  11. data/ext/CdIo_Track.o +0 -0
  12. data/ext/CdIo_TrackIso9660.c +78 -0
  13. data/ext/CdIo_TrackIso9660.o +0 -0
  14. data/ext/Makefile +127 -0
  15. data/ext/extconf.rb +4 -0
  16. data/ext/mkmf.log +26 -0
  17. data/lib/rb_cdio_read.rb +39 -0
  18. data/test/data/Makefile +677 -0
  19. data/test/data/Makefile.am +78 -0
  20. data/test/data/Makefile.in +677 -0
  21. data/test/data/bad-cat1.cue +9 -0
  22. data/test/data/bad-cat1.toc +8 -0
  23. data/test/data/bad-cat2.cue +9 -0
  24. data/test/data/bad-cat2.toc +8 -0
  25. data/test/data/bad-cat3.cue +9 -0
  26. data/test/data/bad-cat3.toc +8 -0
  27. data/test/data/bad-mode1.cue +7 -0
  28. data/test/data/bad-mode1.toc +5 -0
  29. data/test/data/bad-msf-1.cue +7 -0
  30. data/test/data/bad-msf-1.toc +6 -0
  31. data/test/data/bad-msf-2.cue +7 -0
  32. data/test/data/bad-msf-2.toc +6 -0
  33. data/test/data/bad-msf-3.cue +7 -0
  34. data/test/data/bad-msf-3.toc +6 -0
  35. data/test/data/cdda-read.right +148 -0
  36. data/test/data/cdda.bin +0 -0
  37. data/test/data/cdda.cue +6 -0
  38. data/test/data/cdda.right +44 -0
  39. data/test/data/cdda.toc +13 -0
  40. data/test/data/cdtext.toc +48 -0
  41. data/test/data/check_cd_read.sh +53 -0
  42. data/test/data/check_common_fn +186 -0
  43. data/test/data/check_common_fn.in +186 -0
  44. data/test/data/check_cue.sh +102 -0
  45. data/test/data/check_cue.sh.in +102 -0
  46. data/test/data/check_iso.sh +32 -0
  47. data/test/data/check_iso.sh.in +32 -0
  48. data/test/data/check_nrg.sh +68 -0
  49. data/test/data/check_nrg.sh.in +68 -0
  50. data/test/data/check_opts.sh +33 -0
  51. data/test/data/check_opts0.right +40 -0
  52. data/test/data/check_opts1.right +40 -0
  53. data/test/data/check_opts2.right +34 -0
  54. data/test/data/check_opts3.right +34 -0
  55. data/test/data/check_opts4.right +44 -0
  56. data/test/data/check_opts5.right +44 -0
  57. data/test/data/check_opts6.right +44 -0
  58. data/test/data/check_opts7.right +44 -0
  59. data/test/data/check_sizeof +117 -0
  60. data/test/data/check_sizeof.c +77 -0
  61. data/test/data/copying.iso +0 -0
  62. data/test/data/copying.right +10 -0
  63. data/test/data/data1.toc +8 -0
  64. data/test/data/data2.toc +13 -0
  65. data/test/data/data5.toc +13 -0
  66. data/test/data/data6.toc +8 -0
  67. data/test/data/data7.toc +13 -0
  68. data/test/data/isofs-m1-read.right +258 -0
  69. data/test/data/isofs-m1.bin +0 -0
  70. data/test/data/isofs-m1.cue +3 -0
  71. data/test/data/isofs-m1.right +57 -0
  72. data/test/data/isofs-m1.toc +4 -0
  73. data/test/data/t1.toc +5 -0
  74. data/test/data/t2.toc +6 -0
  75. data/test/data/t3.toc +11 -0
  76. data/test/data/t4.toc +8 -0
  77. data/test/data/t5.toc +8 -0
  78. data/test/data/t6.toc +7 -0
  79. data/test/data/t7.toc +12 -0
  80. data/test/data/t8.toc +14 -0
  81. data/test/data/t9.toc +31 -0
  82. data/test/data/testassert +117 -0
  83. data/test/data/testassert.c +36 -0
  84. data/test/data/testbincue +117 -0
  85. data/test/data/testbincue.c +88 -0
  86. data/test/data/testdefault +117 -0
  87. data/test/data/testdefault.c +196 -0
  88. data/test/data/testischar +117 -0
  89. data/test/data/testischar.c +71 -0
  90. data/test/data/testiso9660 +117 -0
  91. data/test/data/testiso9660.c +153 -0
  92. data/test/data/testtoc +117 -0
  93. data/test/data/testtoc.c +101 -0
  94. data/test/data/vcd_demo.right +116 -0
  95. data/test/data/videocd.nrg +0 -0
  96. data/test/data/videocd.right +92 -0
  97. data/test/testall.rb +4 -0
  98. data/test/testbincue.rb +30 -0
  99. data/test/testtoc.rb +45 -0
  100. metadata +141 -0
@@ -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
+ }
@@ -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
Binary file
@@ -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
+ }