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.
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
+ }