guint cdda_calculate_track_length(cdda_disc_toc_t *toc, int track) { if (track == toc->last_track) return (LBA(toc->leadout) - LBA(toc->track[track])); else return (LBA(toc->track[track + 1]) - LBA(toc->track[track])); }
bool TTPAttack::run( const TTPTuple& d ) { Word original_z = d.z; // Convert the tuples vector<ThLeftNormalForm> theTuple( d.WL.size()+d.WR.size() ); for ( int i=0;i<d.WL.size();i++) { theTuple[i] = ThLeftNormalForm( BraidGroup( N ) , d.WL[i] ); theTuple[i].setPower( theTuple[i].getPower() % 2 ); } for ( int i=0;i<d.WR.size();i++) { theTuple[i+d.WL.size()] = ThLeftNormalForm( BraidGroup( N ) , d.WR[i] ); theTuple[i+d.WL.size()].setPower( theTuple[i+d.WL.size()].getPower() % 2 ); } // execute attack // run LBA to restore delta values reduceDeltaLBA( theTuple ); // Test LBA bool DelatLBA_succ = true; for ( int i=0;i<d.WL.size();i++) { if ( shortenBraid(N,theTuple[i].getWord()*-d.WL[i]).length() > 0) DelatLBA_succ = false; // cout << "F"; // else // cout << "S"; } for ( int i=0;i<d.WR.size();i++) { if ( shortenBraid(N,theTuple[i+d.WL.size()].getWord()*-d.WR[i]).length() > 0) DelatLBA_succ = false; // cout << "F"; // else // cout << "S"; } if ( !DelatLBA_succ ) cout << "WARN!!! Delta LBA FAILED!" << endl; // return oneOfSSSReps( d.WL.size(), d.WR.size(), theTuple ); // TTPTuple red_T; //return simpleLBA(d.WL.size(), d.WR.size(), theTuple, original_z ); return LBA(d.WL.size(), d.WR.size(), theTuple, original_z ); }
static int get_current_frame(void) { struct cdrom_subchnl subchnl; subchnl.cdsc_format = CDROM_MSF; if (ioctl(cdda_playing.fd, CDROMSUBCHNL, &subchnl) < 0) return -1; switch (subchnl.cdsc_audiostatus) { case CDROM_AUDIO_COMPLETED: case CDROM_AUDIO_ERROR: return -1; } return (LBA(subchnl.cdsc_absaddr.msf)); }
static int get_current_frame(void) { struct ioc_read_subchannel subchnl; struct cd_sub_channel_info subinfo; subchnl.address_format = CD_MSF_FORMAT; subchnl.data_format = CD_CURRENT_POSITION; subchnl.track = 0; subchnl.data_len = sizeof(subinfo); subchnl.data = &subinfo; if (ioctl(cdda_playing.fd, CDIOCREADSUBCHANNEL, &subchnl) < 0) return -1; #ifdef XMMS_CDROM_BSD_DARWIN return ((subchnl.data->what.position.absaddr[1] * 60 subchnl.data->what.position.absaddr[2]) * 75 + subchnl.data->what.position.absaddr[3]); #else return (LBA(subchnl.data->what.position.absaddr.msf)); #endif }
static int get_time_analog(void) { int frame, start_frame, length; int track = cdda_playing.track; if (is_paused && pause_time != -1) return pause_time; frame = get_current_frame(); if (frame == -1) return -1; start_frame = LBA(cdda_playing.cd_toc.track[track]); length = cdda_calculate_track_length(&cdda_playing.cd_toc, track); if (frame - start_frame >= length - 20) /* 20 seems to work better */ return -1; return ((frame - start_frame) * 1000) / 75; }
static void *dae_play_loop(void *arg) { char *buffer = g_malloc(CD_FRAMESIZE_RAW * CDDA_DAE_FRAMES); int pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track]); int end, frames; if (cdda_playing.track == cdda_playing.cd_toc.last_track) end = LBA(cdda_playing.cd_toc.leadout); else end = LBA(cdda_playing.cd_toc.track[cdda_playing.track + 1]); while (cdda_playing.playing) { int left; char *data; if (dae_data.seek != -1) { cdda_ip.output->flush(dae_data.seek * 1000); pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track]) + dae_data.seek * 75; dae_data.seek = -1; dae_data.eof = FALSE; } frames = MIN(CDDA_DAE_FRAMES, end - pos); if (frames == 0) dae_data.eof = TRUE; if (dae_data.eof) { xmms_usleep(30000); continue; } frames = read_audio_data(cdda_playing.fd, pos, frames, buffer); if (frames <= 0) { int err = -frames; if (err == EOPNOTSUPP) dae_data.eof = TRUE; else { /* * If the read failed, skip ahead to * avoid getting stuck on scratches * and such. */ g_message("read_audio_data() failed: %s (%d)", strerror(err), err); pos += MIN(CDDA_DAE_FRAMES, end - pos); } continue; } left = frames * CD_FRAMESIZE_RAW; data = buffer; while (cdda_playing.playing && left > 0 && dae_data.seek == -1) { int cur = MIN(512 * 2 * 2, left); cdda_ip.add_vis_pcm(cdda_ip.output->written_time(), FMT_S16_LE, 2, cur, data); while (cdda_ip.output->buffer_free() < cur && cdda_playing.playing && dae_data.seek == -1) xmms_usleep(30000); if (cdda_playing.playing && dae_data.seek == -1) cdda_ip.output->write_audio(data, cur); left -= cur; data += cur; } pos += frames; } cdda_ip.output->buffer_free(); cdda_ip.output->buffer_free(); g_free(buffer); return NULL; }
static void configurewin_check_drive(GtkButton *w, gpointer data) { struct driveconfig *drive = data; GtkWidget *window, *vbox, *label, *bbox, *closeb; char *device, *directory; int fd, dae_track = -1; GString *str = g_string_new(""); struct stat stbuf; device = gtk_entry_get_text(GTK_ENTRY(drive->device)); directory = gtk_entry_get_text(GTK_ENTRY(drive->directory)); if ((fd = open(device, CDOPENFLAGS)) < 0) g_string_sprintfa(str, _("Failed to open device %s\n" "Error: %s\n\n"), device, strerror(errno)); else { cdda_disc_toc_t toc; if (!cdda_get_toc(&toc, device)) g_string_append(str, _("Failed to read \"Table of Contents\"" "\nMaybe no disc in the drive?\n\n")); else { int i, data = 0; g_string_sprintfa(str, _("Device %s OK.\n" "Disc has %d tracks"), device, toc.last_track - toc.first_track + 1); for (i = toc.first_track; i <= toc.last_track; i++) if (toc.track[i].flags.data_track) data++; else if (dae_track < 0) dae_track = i; if (data > 0) g_string_sprintfa(str, _(" (%d data tracks)"), data); g_string_sprintfa(str, _("\nTotal length: %d:%.2d\n"), toc.leadout.minute, toc.leadout.second); #ifdef CDDA_HAS_READAUDIO if (dae_track == -1) g_string_sprintfa(str, _("Digital audio extraction " "not tested as the disc has " "no audio tracks\n")); else { int start, end, fr; char buffer[CD_FRAMESIZE_RAW]; start = LBA(toc.track[dae_track]); if (dae_track == toc.last_track) end = LBA(toc.leadout); else end = LBA(toc.track[dae_track + 1]); fr = read_audio_data(fd, start + (end - start) / 2, 1, buffer); if (fr > 0) g_string_sprintfa(str, _("Digital audio extraction " "test: OK\n\n")); else g_string_sprintfa(str, _("Digital audio extraction " "test failed: %s\n\n"), strerror(-fr)); } #else g_string_sprintfa(str, "\n"); #endif } close(fd); } if (stat(directory, &stbuf) < 0) { g_string_sprintfa(str, _("Failed to check directory %s\n" "Error: %s"), directory, strerror(errno)); } else { if (!S_ISDIR(stbuf.st_mode)) g_string_sprintfa(str, _("Error: %s exists, but is not a directory"), directory); else { if (!access(directory, R_OK)) g_string_sprintfa(str, _("Directory %s OK."), directory); else g_string_sprintfa(str, _("Directory %s exists, but " "you do not have permission " "to access it."), directory); } } window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(cdda_configure_win)); gtk_container_set_border_width(GTK_CONTAINER(window), 10); vbox = gtk_vbox_new(FALSE, 10); gtk_container_add(GTK_CONTAINER(window), vbox); label = gtk_label_new(str->str); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); bbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); closeb = gtk_button_new_with_label("Close"); GTK_WIDGET_SET_FLAGS(closeb, GTK_CAN_DEFAULT); gtk_signal_connect_object(GTK_OBJECT(closeb), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(window)); gtk_box_pack_start(GTK_BOX(bbox), closeb, TRUE, TRUE, 0); gtk_widget_grab_default(closeb); g_string_free(str, TRUE); gtk_widget_show_all(window); }