/** * call-seq: * put(first_track, sectors, offsets) * * Set the TOC information directly instead of reading it from a device. * * Use this instead of read if the TOC information was already read elsewhere * and you want to recalculate the ID. * Throws an _Exception_ if the CD's TOC can not be read. * * <b>Parameters:</b> * [first_track] The number of the first track on the disc (usually 1). * [sectors] The total number of sectors on the disc. * [offsets] Array of all track offsets. The number of tracks must not exceed 99. * * Raises:: Exception */ static VALUE mb_discid_put(VALUE self, VALUE first_track, VALUE sectors, VALUE offsets) { DiscId *disc; /* Pointer to the disc struct */ long length = RARRAY_LEN(offsets); /* length of the offsets array */ int cfirst = NUM2INT(first_track); /* number of the first track */ int clast = length + 1 - cfirst; /* number of the last track */ int coffsets[100]; /* C array to hold the offsets */ int i = 1; /* Counter for iterating over coffsets*/ Data_Get_Struct(self, DiscId, disc); /* Convert the Ruby array to an C array of integers. discid_puts expects always an offsets array with exactly 100 elements. */ coffsets[0] = NUM2INT(sectors); /* 0 is always the leadout track */ while (i <= length && i < 100) { coffsets[i] = NUM2INT(rb_ary_entry(offsets, i - 1)); i++; } /* Mark the disc id as unread in case something goes wrong. */ rb_iv_set(self, "@read", Qfalse); /* Read the discid */ if (discid_put(disc, cfirst, clast, coffsets) == 0) rb_raise(rb_eException, "%s", discid_get_error_msg(disc)); else /* Remember that we already read the ID. */ rb_iv_set(self, "@read", Qtrue); return Qnil; }