rb_cdio 0.1.0 → 0.1.1

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 (101) hide show
  1. data/ChangeLog.txt +26 -0
  2. data/LICENSE +340 -0
  3. data/README.EXT +1051 -0
  4. data/README.txt +16 -0
  5. data/VERSION +1 -0
  6. data/doc/classes/CdIo.html +523 -0
  7. data/doc/classes/CdIo.src/M000001.html +17 -0
  8. data/doc/classes/CdIo.src/M000002.html +17 -0
  9. data/doc/classes/CdIo.src/M000003.html +17 -0
  10. data/doc/classes/CdIo.src/M000004.html +17 -0
  11. data/doc/classes/CdIo.src/M000005.html +17 -0
  12. data/doc/classes/CdIo.src/M000006.html +17 -0
  13. data/doc/classes/CdIo.src/M000007.html +17 -0
  14. data/doc/classes/CdIo.src/M000008.html +17 -0
  15. data/doc/classes/CdIo.src/M000009.html +17 -0
  16. data/doc/classes/CdIo.src/M000010.html +17 -0
  17. data/doc/classes/CdIo.src/M000011.html +17 -0
  18. data/doc/classes/CdIo.src/M000012.html +17 -0
  19. data/doc/classes/CdIo.src/M000013.html +17 -0
  20. data/doc/classes/CdIo.src/M000014.html +17 -0
  21. data/doc/classes/CdIo.src/M000015.html +17 -0
  22. data/doc/classes/CdIo.src/M000016.html +17 -0
  23. data/doc/classes/CdIo/Cd.html +348 -0
  24. data/doc/classes/CdIo/Cd.src/M000011.html +17 -0
  25. data/doc/classes/CdIo/Cd.src/M000012.html +17 -0
  26. data/doc/classes/CdIo/Cd.src/M000013.html +17 -0
  27. data/doc/classes/CdIo/Cd.src/M000014.html +17 -0
  28. data/doc/classes/CdIo/Cd.src/M000015.html +17 -0
  29. data/doc/classes/CdIo/Cd.src/M000016.html +17 -0
  30. data/doc/classes/CdIo/Cd.src/M000017.html +17 -0
  31. data/doc/classes/CdIo/Cd.src/M000018.html +17 -0
  32. data/doc/classes/CdIo/Cd.src/M000019.html +17 -0
  33. data/doc/classes/CdIo/Cd.src/M000021.html +17 -0
  34. data/doc/classes/CdIo/Cd.src/M000022.html +17 -0
  35. data/doc/classes/CdIo/Cd.src/M000023.html +17 -0
  36. data/doc/classes/CdIo/Cd.src/M000024.html +17 -0
  37. data/doc/classes/CdIo/Cd.src/M000025.html +17 -0
  38. data/doc/classes/CdIo/Cd.src/M000026.html +17 -0
  39. data/doc/classes/CdIo/Cd.src/M000027.html +17 -0
  40. data/doc/classes/CdIo/Cd.src/M000028.html +17 -0
  41. data/doc/classes/CdIo/Cd.src/M000029.html +17 -0
  42. data/doc/classes/CdIo/Cd.src/M000030.html +17 -0
  43. data/doc/classes/CdIo/Cd.src/M000031.html +17 -0
  44. data/doc/classes/CdIo/Cd.src/M000032.html +17 -0
  45. data/doc/classes/CdIo/Cd.src/M000033.html +17 -0
  46. data/doc/classes/CdIo/Cd.src/M000034.html +17 -0
  47. data/doc/classes/CdIo/Cd.src/M000035.html +17 -0
  48. data/doc/classes/CdIo/Cd.src/M000036.html +17 -0
  49. data/doc/classes/CdIo/CdText.html +111 -0
  50. data/doc/classes/CdIo/Device.html +111 -0
  51. data/doc/classes/CdIo/Track.html +246 -0
  52. data/doc/classes/CdIo/Track.src/M000009.html +17 -0
  53. data/doc/classes/CdIo/Track.src/M000010.html +17 -0
  54. data/doc/classes/CdIo/Track.src/M000011.html +17 -0
  55. data/doc/classes/CdIo/Track.src/M000017.html +17 -0
  56. data/doc/classes/CdIo/Track.src/M000018.html +17 -0
  57. data/doc/classes/CdIo/Track.src/M000019.html +17 -0
  58. data/doc/classes/CdIo/Track.src/M000020.html +17 -0
  59. data/doc/classes/CdIo/TrackIso9660.html +159 -0
  60. data/doc/classes/CdIo/Tracks.html +199 -0
  61. data/doc/classes/CdIo/Tracks.src/M000020.html +17 -0
  62. data/doc/classes/CdIo/Tracks.src/M000021.html +17 -0
  63. data/doc/classes/CdIo/Tracks.src/M000022.html +17 -0
  64. data/doc/created.rid +1 -0
  65. data/doc/files/rb_cdio_def_rb.html +169 -0
  66. data/doc/files/test/testall_rb.html +110 -0
  67. data/doc/fr_class_index.html +31 -0
  68. data/doc/fr_file_index.html +27 -0
  69. data/doc/fr_method_index.html +48 -0
  70. data/doc/index.html +24 -0
  71. data/ext/CdIo.c +41 -20
  72. data/ext/CdIo.h +19 -9
  73. data/ext/CdIo_Cd.c +35 -52
  74. data/ext/CdIo_Common.c +56 -12
  75. data/ext/CdIo_Modulo.c +54 -34
  76. data/ext/CdIo_Track.c +24 -7
  77. data/ext/CdIo_TrackIso9660.c +1 -1
  78. data/ext/CdIo_Tracks.c +66 -0
  79. data/mkmf.log +26 -0
  80. data/rb_cdio.def.rb +187 -0
  81. data/svn-commit.tmp +5 -0
  82. data/tags +47 -0
  83. data/test/testclose.rb +19 -0
  84. data/test/testmethods.rb +28 -0
  85. metadata +253 -20
  86. data/ext/CdIo.o +0 -0
  87. data/ext/CdIo_Cd.o +0 -0
  88. data/ext/CdIo_Common.o +0 -0
  89. data/ext/CdIo_Modulo.o +0 -0
  90. data/ext/CdIo_Track.o +0 -0
  91. data/ext/CdIo_TrackIso9660.o +0 -0
  92. data/ext/Makefile +0 -127
  93. data/test/data/Makefile +0 -677
  94. data/test/data/Makefile.am +0 -78
  95. data/test/data/Makefile.in +0 -677
  96. data/test/data/testassert +0 -117
  97. data/test/data/testbincue +0 -117
  98. data/test/data/testdefault +0 -117
  99. data/test/data/testischar +0 -117
  100. data/test/data/testiso9660 +0 -117
  101. data/test/data/testtoc +0 -117
data/doc/index.html ADDED
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
5
+
6
+ <!--
7
+
8
+ RDoc Documentation
9
+
10
+ -->
11
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
+ <head>
13
+ <title>RDoc Documentation</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
15
+ </head>
16
+ <frameset rows="20%, 80%">
17
+ <frameset cols="25%,35%,45%">
18
+ <frame src="fr_file_index.html" title="Files" name="Files" />
19
+ <frame src="fr_class_index.html" name="Classes" />
20
+ <frame src="fr_method_index.html" name="Methods" />
21
+ </frameset>
22
+ <frame src="files/rb_cdio_def_rb.html" name="docwin" />
23
+ </frameset>
24
+ </html>
data/ext/CdIo.c CHANGED
@@ -13,11 +13,10 @@ Init_rb_cdio()
13
13
  {
14
14
  /** module CdIo */
15
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",
16
+ rb_define_module_function(mCdIo, "devices", rb_cdio_get_devices, -1);
17
+ rb_define_module_function(mCdIo, "default_device",
19
18
  rb_cdio_get_default_device, -1);
20
- rb_define_module_function(mCdIo, "get_drive_cap_dev",
19
+ rb_define_module_function(mCdIo, "drive_cap_dev",
21
20
  rb_cdio_get_drive_cap_dev, 1);
22
21
  rb_define_module_function(mCdIo, "discmode_describe",
23
22
  rb_cdio_discmode_describe, 1);
@@ -34,7 +33,7 @@ Init_rb_cdio()
34
33
  rb_define_module_function(mCdIo, "is_cuefile", rb_cdio_is_cuefile, 1);
35
34
  rb_define_module_function(mCdIo, "is_nrg", rb_cdio_is_nrg, 1);
36
35
  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);
36
+ rb_define_module_function(mCdIo, "is_device", rb_cdio_is_device, -1);
38
37
 
39
38
  /**
40
39
  * class CdIo::Cd
@@ -43,39 +42,48 @@ Init_rb_cdio()
43
42
  rb_define_singleton_method(cCdIoCd, "new", rb_cdio_cd_new, -1);
44
43
  rb_define_method(cCdIoCd, "initialize", rb_cdio_cd_init, 2);
45
44
  int i;
46
- #define CDIO_ATTR 9
47
- const char *attr[CDIO_ATTR] =
45
+ #define CDIO_ATTR 9
46
+ const char *attr[CDIO_ATTR] =
48
47
  { "device", "mcn", "driver_name", "driver_id", "first_track_num",
49
48
  "discmode", "num_tracks", "stat_size", "cddb_id"
50
49
  };
51
50
  for (i = 0; i < CDIO_ATTR; i++) {
52
51
  rb_define_attr(cCdIoCd, attr[i], 1, 0);
53
52
  }
54
- rb_define_method(cCdIoCd, "get_tracks", rb_cdio_cd_get_tracks, 0);
55
- rb_define_method(cCdIoCd, "get_first_track",
53
+ rb_define_method(cCdIoCd, "tracks", rb_cdio_cd_get_tracks, 0);
54
+ rb_define_method(cCdIoCd, "first_track",
56
55
  rb_cdio_cd_get_first_track, 0);
57
56
  rb_define_method(cCdIoCd, "get_arg", rb_cdio_cd_get_arg, 1);
58
57
 
59
58
  rb_define_method(cCdIoCd, "is_cd?", rb_cdio_cd_is_cd, 0);
60
59
  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);
60
+ rb_define_method(cCdIoCd, "freedb", rb_cdio_cd_get_freedb, 0);
61
+ rb_define_method(cCdIoCd, "cdtext", rb_cdio_cd_get_cdtext, 0);
63
62
  // 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);
63
+ rb_define_method(cCdIoCd, "drive_cap", rb_cdio_cd_get_drive_cap, 0);
64
+ rb_define_method(cCdIoCd, "hwinfo", rb_cdio_cd_get_hwinfo, 0);
67
65
  rb_define_method(cCdIoCd, "close", rb_cdio_cd_close, 0);
66
+ /** class CdIo::Tracks */
67
+ cCdIoTracks = rb_define_class_under(mCdIo, "Tracks", rb_cObject);
68
+ rb_include_module(cCdIoTracks, rb_mEnumerable);
69
+ rb_define_method(cCdIoTracks, "initialize", rb_cdio_tracks_init, 1);
70
+ rb_define_method(cCdIoTracks, "each", rb_cdio_tracks_each, -1);
71
+ rb_define_method(cCdIoTracks, "<=>", rb_cdio_tracks_diff, 2);
72
+ rb_define_method(cCdIoTracks, "[]", rb_cdio_tracks_index, 1);
73
+ rb_define_attr(cCdIoTracks, "cd", 1, 0);
74
+ rb_define_attr(cCdIoTracks, "tracks", 1, 0);
68
75
  /** class CdIo::Track */
69
76
  cCdIoTrack = rb_define_class_under(mCdIo, "Track", rb_cObject);
70
77
  rb_define_method(cCdIoTrack, "initialize", rb_cdio_track_init, 2);
71
78
  rb_define_method(cCdIoTrack, "green?", rb_cdio_track_green, 0);
72
- rb_define_method(cCdIoTrack, "get_cdtext", rb_cdio_track_get_cdtext, 0);
79
+ rb_define_method(cCdIoTrack, "cdtext", rb_cdio_track_get_cdtext, 0);
73
80
  /** :cd :number :format, :green, :lba,:lsn,min,sec,frames,:sec_count*/
74
- char attr2[11][32] =
81
+ #define CDIO_TRACK_ATTR 12
82
+ const char *attr2[CDIO_TRACK_ATTR] =
75
83
  { "cd", "number", "format", "lba", "lsn", "min", "sec", "frames",
76
- "msf", "sec_count", "track_type"
84
+ "msf", "sec_count", "track_type", "leadout"
77
85
  };
78
- for (i = 0; i < 11; i++) {
86
+ for (i = 0; i < CDIO_TRACK_ATTR; i++) {
79
87
  rb_define_attr(cCdIoTrack, attr2[i], 1, 0);
80
88
  }
81
89
  /** class CdIo::TrackIso9660 < CdIo::Track */
@@ -91,7 +99,7 @@ Init_rb_cdio()
91
99
  }
92
100
  rb_define_method(cCdIoTrackIso9660, "initialize",
93
101
  rb_cdio_trackiso9660_init, 2);
94
- // const for DRIVER
102
+ // const for DRIVER
95
103
  rb_define_const(mCdIo, "DRIVER_UNKNOWN", INT2FIX(DRIVER_UNKNOWN));
96
104
  rb_define_const(mCdIo, "DRIVER_FREEBSD", INT2FIX(DRIVER_FREEBSD));
97
105
  rb_define_const(mCdIo, "DRIVER_LINUX", INT2FIX(DRIVER_LINUX));
@@ -102,7 +110,7 @@ Init_rb_cdio()
102
110
  rb_define_const(mCdIo, "DRIVER_BINCUE", INT2FIX(DRIVER_BINCUE));
103
111
  rb_define_const(mCdIo, "DRIVER_NRG", INT2FIX(DRIVER_NRG));
104
112
  rb_define_const(mCdIo, "DRIVER_DEVICE", INT2FIX(DRIVER_DEVICE));
105
- // const for CD types
113
+ // const for CD types
106
114
  rb_define_const(mCdIo, "CDIO_DISC_MODE_CD_DA",
107
115
  INT2FIX(CDIO_DISC_MODE_CD_DA));
108
116
  rb_define_const(mCdIo, "CDIO_DISC_MODE_CD_DATA",
@@ -129,4 +137,17 @@ Init_rb_cdio()
129
137
  INT2FIX(CDIO_DISC_MODE_NO_INFO));
130
138
  rb_define_const(mCdIo, "CDIO_DISC_MODE_ERROR",
131
139
  INT2FIX(CDIO_DISC_MODE_ERROR));
140
+ rb_define_const(mCdIo, "TRACK_FORMAT_AUDIO",
141
+ INT2FIX(TRACK_FORMAT_AUDIO));
142
+ rb_define_const(mCdIo, "TRACK_FORMAT_CDI", INT2FIX(TRACK_FORMAT_CDI));
143
+ /**< CD-i. How this is different from DATA below? */
144
+ rb_define_const(mCdIo, "TRACK_FORMAT_XA", INT2FIX(TRACK_FORMAT_XA));
145
+ /**< Mode2 of some sort */
146
+ rb_define_const(mCdIo, "TRACK_FORMAT_DATA",
147
+ INT2FIX(TRACK_FORMAT_DATA));
148
+ /**< Mode1 of some sort */
149
+ rb_define_const(mCdIo, "TRACK_FORMAT_PSX", INT2FIX(TRACK_FORMAT_PSX));
150
+ rb_define_const(mCdIo, "TRACK_FORMAT_ERROR", INT2FIX(TRACK_FORMAT_ERROR)); /**< Dunno what is, or some other error. */
151
+ rb_define_const(mCdIo, "CDIO_CDROM_LEADOUT_TRACK",
152
+ INT2FIX(CDIO_CDROM_LEADOUT_TRACK));
132
153
  }
data/ext/CdIo.h CHANGED
@@ -43,6 +43,7 @@ VALUE mCdIo;
43
43
  VALUE cCdIoCd;
44
44
  VALUE cCdIoTrack;
45
45
  VALUE cCdIoTrackIso9660;
46
+ VALUE cCdIoTracks;
46
47
  int Init_CdIo();
47
48
  // Metodos para el m�dulo CdIo
48
49
 
@@ -64,13 +65,13 @@ VALUE rb_cdio_discmode_describe(VALUE module, VALUE discmode); // creada
64
65
  // por
65
66
  // mi
66
67
 
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);
68
+ VALUE rb_cdio_is_binfile(VALUE module, VALUE name);
69
+ VALUE rb_cdio_is_cuefile(VALUE module, VALUE name);
70
+ VALUE rb_cdio_is_nrg(VALUE module, VALUE name);
71
+ VALUE rb_cdio_is_tocfile(VALUE module, VALUE name);
72
+ VALUE rb_cdio_is_device(int argc, VALUE * argv, VALUE module);
73
+
72
74
 
73
-
74
75
  /*
75
76
  * M�todos para clase CdIo::Cd
76
77
  */
@@ -87,16 +88,24 @@ VALUE rb_cdio_cd_get_drive_cap(VALUE obj);
87
88
  VALUE rb_cdio_cd_get_hwinfo(VALUE obj);
88
89
  VALUE rb_cdio_cd_close(VALUE obj);
89
90
  VALUE rb_cdio_cd_get_cdtext(VALUE obj);
91
+ /**
92
+ * M�todos para la clase CdIo::Tracks
93
+ */
94
+
95
+ VALUE rb_cdio_tracks_init(VALUE obj, VALUE cd);
96
+ VALUE rb_cdio_tracks_each(int argc, VALUE * argv, VALUE obj);
97
+ VALUE rb_cdio_tracks_diff(VALUE obj, VALUE a, VALUE b);
98
+ VALUE rb_cdio_tracks_index(VALUE obj, VALUE index);
90
99
  /*
91
100
  * M�todos para la clase CdIo::Track
92
101
  */
93
- VALUE rb_cdio_track_new(VALUE cd, int track);
102
+
94
103
  VALUE rb_cdio_track_init(VALUE obj, VALUE oCd, VALUE i_track); // ok
95
104
  VALUE rb_cdio_track_green(VALUE obj); // ok
96
105
  VALUE rb_cdio_track_get_cdtext(VALUE obj);
97
106
 
98
107
  /* TrackIso9660*/
99
- VALUE rb_cdio_trackiso9660_new(VALUE cd, int track);
108
+
100
109
  VALUE rb_cdio_trackiso9660_init(VALUE obj, VALUE oCd, VALUE i_track);
101
110
  /*
102
111
  * M�todos comunes
@@ -104,5 +113,6 @@ VALUE rb_cdio_trackiso9660_init(VALUE obj, VALUE oCd, VALUE i_track);
104
113
  VALUE get_cap(cdio_drive_read_cap_t * read_cap,
105
114
  cdio_drive_write_cap_t * write_cap,
106
115
  cdio_drive_misc_cap_t * misc_cap);
107
- VALUE get_cdtext(const cdtext_t *cdtext);
116
+ VALUE get_cdtext(const cdtext_t * cdtext);
117
+ VALUE get_track(VALUE obj, track_t i);
108
118
  #endif
data/ext/CdIo_Cd.c CHANGED
@@ -8,57 +8,28 @@
8
8
  */
9
9
 
10
10
  /**
11
- * Definici?n de funciones para CdIo::Cd
11
+ * Implementation of CdIo::Cd
12
12
  */
13
13
 
14
14
  #include "CdIo.h"
15
15
  // Libera el puntero al objeto CdIo creado en Cd.new
16
+ /**
17
+ * Free resources for CdIo* in CdIo::Cd
18
+ */
16
19
  static void
17
20
  _cdio_cd_destroy(void *p)
18
21
  {
22
+
19
23
  /*
20
- static int i;
21
- printf("\nDestruyendo cdio %d\n",i++);
22
- */
24
+ * static int i; printf("\nDestruyendo cdio %d\n",i++);
25
+ */
23
26
  cdio_destroy(p);
24
27
  }
25
28
 
26
- // lanza true si el tipo de disco es un ISO9660
27
29
 
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
30
 
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
31
 
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
- }
32
+
62
33
 
63
34
  /**
64
35
  * CDDB
@@ -110,8 +81,12 @@ cddb_discid(CdIo * p_cdio, int i_tracks)
110
81
  }
111
82
 
112
83
  /**
113
- * Constructor
114
- * CdIo::Cd.new
84
+ Create a new Cd::CdIo object.
85
+ The first argument is an String for a device or a cue/bin/toc/nrg file
86
+ The seconf argument is the constant for a Driver (default CdIo::DRIVER_UNKNOWN)
87
+ * CdIo::Cd.new()
88
+ * CdIo::Cd.new("/dev/cdrom")
89
+ * CdIo::Cd.new("/dev/cdrom", CdIo::DRIVER_UNKNOWN)
115
90
  */
116
91
 
117
92
  VALUE
@@ -142,7 +117,7 @@ rb_cdio_cd_new(int argc, VALUE * argv, VALUE class)
142
117
  p_cdio = cdio_open(device, driver);
143
118
 
144
119
  if (p_cdio == NULL) {
145
- rb_raise(rb_eException, "I can't create a pointer");
120
+ rb_raise(rb_eException, "I can't create a pointer");
146
121
  return Qnil;
147
122
  } else {
148
123
  VALUE c_argv[2];
@@ -156,7 +131,10 @@ rb_cdio_cd_new(int argc, VALUE * argv, VALUE class)
156
131
  }
157
132
 
158
133
  /**
159
- * CdIo::Cd.initialize
134
+ CdIo::Cd.initialize
135
+ Initialize the CdIo::Cd object
136
+ The first argument is an String for a device or a cue/bin/toc/nrg file
137
+ The seconf argument is the constant for a driver
160
138
  */
161
139
  VALUE
162
140
  rb_cdio_cd_init(VALUE self, VALUE device, VALUE driver)
@@ -202,11 +180,15 @@ rb_cdio_cd_init(VALUE self, VALUE device, VALUE driver)
202
180
  }
203
181
 
204
182
  /**
205
- * CdIo::Cd.get_tracks
183
+ * Returns an array with the tracks of the cd
184
+ * cd.get_tracks #=> [<CdIo::Track>,<CdIo::Track>]
206
185
  */
207
186
  VALUE
208
187
  rb_cdio_cd_get_tracks(VALUE self)
209
188
  {
189
+ VALUE argv[1];
190
+ argv[0] = self;
191
+ return rb_class_new_instance(1, argv, cCdIoTracks);
210
192
  VALUE aTracks;
211
193
  aTracks = rb_ary_new();
212
194
  GET_CDIO(self, p_cdio);
@@ -219,7 +201,7 @@ rb_cdio_cd_get_tracks(VALUE self)
219
201
  int j,
220
202
  i = first_track_num;
221
203
  for (j = 0; j < num_tracks; i++, j++) {
222
- rb_ary_push(aTracks, _track_by_type(self, i));
204
+ rb_ary_push(aTracks, get_track(self, i));
223
205
  }
224
206
  return aTracks;
225
207
  }
@@ -232,7 +214,7 @@ rb_cdio_cd_get_first_track(VALUE self)
232
214
  {
233
215
  GET_CDIO(self, p_cdio);
234
216
  track_t first_track_num = cdio_get_first_track_num(p_cdio);
235
- return _track_by_type(self, first_track_num);
217
+ return get_track(self, first_track_num);
236
218
  }
237
219
 
238
220
  /**
@@ -264,7 +246,7 @@ rb_cdio_cd_is_dvd(VALUE obj)
264
246
  return (discmode_is_dvd(cdio_get_discmode(p_cdio))) ? Qtrue : Qfalse;
265
247
  }
266
248
 
267
- static VALUE
249
+ static VALUE
268
250
  _get_freedb(VALUE obj)
269
251
  {
270
252
  rb_require("freedb");
@@ -274,7 +256,7 @@ _get_freedb(VALUE obj)
274
256
  rb_iv_get(obj, "@device"));
275
257
  }
276
258
 
277
- static VALUE
259
+ static VALUE
278
260
  _get_freedb_error(VALUE obj, VALUE error_info)
279
261
  {
280
262
  rb_raise(rb_eLoadError,
@@ -331,15 +313,16 @@ rb_cdio_cd_get_hwinfo(VALUE obj)
331
313
  VALUE
332
314
  rb_cdio_cd_close(VALUE obj)
333
315
  {
334
- /*
335
- * Nothing to do
336
- */
316
+ rb_gc_start();
317
+ obj = Qnil;
337
318
  return Qnil;
338
319
  }
339
320
 
340
321
 
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);
322
+ VALUE
323
+ rb_cdio_cd_get_cdtext(VALUE obj)
324
+ {
325
+ GET_CDIO(obj, p_cdio);
326
+ const cdtext_t *cdtext = cdio_get_cdtext(p_cdio, 0);
344
327
  return get_cdtext(cdtext);
345
328
  }
data/ext/CdIo_Common.c CHANGED
@@ -67,18 +67,62 @@ get_cap(cdio_drive_read_cap_t * read_cap,
67
67
  #undef CAP
68
68
 
69
69
 
70
- VALUE get_cdtext(const cdtext_t *cdtext) {
71
- if(NULL==cdtext) {
72
- return Qnil;
70
+ VALUE
71
+ get_cdtext(const cdtext_t * cdtext)
72
+ {
73
+ if (NULL == cdtext) {
74
+ return Qnil;
75
+ } else {
76
+ VALUE ret;
77
+ ret = rb_hash_new();
78
+ int i;
79
+ for (i = 0; i < MAX_CDTEXT_FIELDS; i++) {
80
+ if (cdtext->field[i]) {
81
+ rb_hash_aset(ret, rb_str_new2(cdtext_field2str(i)),
82
+ rb_str_new2(cdtext->field[i]));
83
+ }
84
+ }
85
+ return ret;
86
+ }
87
+ }
88
+
89
+ /**
90
+ * true if track is iso
91
+ */
92
+ bool
93
+ _cdio_cd_is_iso(CdIo * p_cdio, track_t track)
94
+ {
95
+ cdio_fs_anal_t fs;
96
+ cdio_iso_analysis_t iso_analysis;
97
+ fs = cdio_guess_cd_type(p_cdio, 0, track, &iso_analysis);
98
+ switch (CDIO_FSTYPE(fs)) {
99
+ case CDIO_FS_ISO_9660:
100
+ case CDIO_FS_ISO_9660_INTERACTIVE:
101
+ case CDIO_FS_ISO_HFS:
102
+ case CDIO_FS_ISO_UDF:
103
+ return true;
104
+ default:
105
+ return false;
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Returns an object CdIo::Track or a subclass, with an object CdIo::Cd and
111
+ * a track number
112
+ * @param CdIo::Cd object
113
+ * @param track
114
+ * @return CdIo::Track
115
+ */
116
+
117
+ VALUE
118
+ get_track(VALUE obj, track_t i)
119
+ {
120
+ GET_CDIO(obj, p_cdio);
121
+ VALUE track;
122
+ if (_cdio_cd_is_iso(p_cdio, i)) {
123
+ track = rb_cdio_trackiso9660_new(obj, i);
73
124
  } else {
74
- VALUE ret;
75
- ret=rb_hash_new();
76
- int i;
77
- for (i=0;i < MAX_CDTEXT_FIELDS;i++) {
78
- if(cdtext->field[i]) {
79
- rb_hash_aset(ret,rb_str_new2(cdtext_field2str(i)), rb_str_new2(cdtext->field[i]));
80
- }
81
- }
82
- return ret;
125
+ track = rb_cdio_track_new(obj, i);
83
126
  }
127
+ return track;
84
128
  }