int open_drive_by_id(char *id) { struct drive_info *drive; for(drive=drives;drive->id[0]!='\0';drive++) { if(strcmp(id,drive->id)==0) return open_drive(drive); } return 1; }
int CDRipMain::start_loop() { // get CD parameters int result = 0; //printf("CDRipMain::start_loop 1\n"); result = get_toc(); FRAME = 4; // 2 bytes 2 channels previewing = 3; // defeat bug in hardware fragment_length = PluginClient::in_buffer_size * FRAME; fragment_length /= NFRAMES * FRAMESIZE; fragment_length *= NFRAMES * FRAMESIZE; total_length = (endlba - startlba) * FRAMESIZE / fragment_length + previewing + 1; result = open_drive(); //printf("CDRipMain::start_loop 1 %d\n", interactive); // thread out progress if(interactive) { char string[BCTEXTLEN]; sprintf(string, "%s...", plugin_title()); progress = start_progress(string, total_length); } //printf("CDRipMain::start_loop 1\n"); // get still more CD parameters endofselection = 0; currentlength = 0; startlba_fragment = startlba - fragment_length * previewing / FRAMESIZE; buffer = new char[fragment_length]; arg.addr.lba = startlba_fragment; arg.addr_format = CDROM_LBA; arg.nframes = NFRAMES; //printf("CDRipMain::start_loop 2\n"); return result; }
int CDRipMain::get_toc() { // test CD int result = 0, i, tracks; struct cdrom_tochdr hdr; struct cdrom_tocentry entry[100]; BC_DisplayInfo info; result = open_drive(); if(ioctl(cdrom, CDROMREADTOCHDR, &hdr) < 0) { close(cdrom); ErrorBox window(PROGRAM_NAME ": CD Ripper", info.get_abs_cursor_x(), info.get_abs_cursor_y()); window.create_objects(_("Can't get total from table of contents.")); window.run_window(); result = 1; } for(i = 0; i < hdr.cdth_trk1; i++) { entry[i].cdte_track = 1 + i; entry[i].cdte_format = CDROM_LBA; if(ioctl(cdrom, CDROMREADTOCENTRY, &entry[i]) < 0) { ioctl(cdrom, CDROMSTOP); close(cdrom); ErrorBox window(PROGRAM_NAME ": CD Ripper", info.get_abs_cursor_x(), info.get_abs_cursor_y()); window.create_objects(_("Can't get table of contents entry.")); window.run_window(); result = 1; break; } } entry[i].cdte_track = CDROM_LEADOUT; entry[i].cdte_format = CDROM_LBA; if(ioctl(cdrom, CDROMREADTOCENTRY, &entry[i]) < 0) { ioctl(cdrom, CDROMSTOP); close(cdrom); ErrorBox window(PROGRAM_NAME ": CD Ripper", info.get_abs_cursor_x(), info.get_abs_cursor_y()); window.create_objects(_("Can't get table of contents leadout.")); window.run_window(); result = 1; } tracks = hdr.cdth_trk1+1; if(track1 <= 0 || track1 > tracks) { ioctl(cdrom, CDROMSTOP); close(cdrom); ErrorBox window(PROGRAM_NAME ": CD Ripper", info.get_abs_cursor_x(), info.get_abs_cursor_y()); window.create_objects(_("Start track is out of range.")); window.run_window(); result = 1; } // Clamp to highest track if(track2 > tracks) { track2 = tracks; } if(track2 < track1 || track2 <= 0) { ioctl(cdrom, CDROMSTOP); close(cdrom); ErrorBox window(PROGRAM_NAME ": CD Ripper", info.get_abs_cursor_x(), info.get_abs_cursor_y()); window.create_objects(_("End track is out of range.")); window.run_window(); result = 1; } if(track1 == track2 && min2 == 0 && sec2 == 0) { ioctl(cdrom, CDROMSTOP); close(cdrom); ErrorBox window(PROGRAM_NAME ": CD Ripper", info.get_abs_cursor_x(), info.get_abs_cursor_y()); window.create_objects(_("End position is out of range.")); window.run_window(); result = 1; } startlba = endlba = 0; if(!result) { startlba = entry[track1 - 1].cdte_addr.lba; startlba += (min1 * 44100 * 4 * 60 + sec1 * 44100 * 4) / FRAMESIZE; endlba = entry[track2 - 1].cdte_addr.lba; if(track2 < tracks) { endlba += (min2 * 44100 * 4 * 60 + sec2 * 44100 * 4) / FRAMESIZE; } } //printf("CDRipMain::get_toc %ld %ld\n", startlba, endlba); close_drive(); return result; }
char *open_default_drive(void) { if(open_drive(drives)!=0) return NULL; return drives->id; }