int CDRipMain::get_parameters() { int result, result2; result = 0; result2 = 1; while(result2 && !result) { { BC_DisplayInfo info; //printf("CDRipMain::get_parameters 1\n"); CDRipWindow window(this, info.get_abs_cursor_x(), info.get_abs_cursor_y()); //printf("CDRipMain::get_parameters 2\n"); window.create_objects(); //printf("CDRipMain::get_parameters 3\n"); result = window.run_window(); //printf("CDRipMain::get_parameters 4\n"); } if(!result) result2 = get_toc(); //printf("CDRipMain::get_parameters 5 %d\n", result); } PluginAClient::sample_rate = 44100; return result; }
static void cdtvcr_4510_reset(uae_u8 v) { cdtvcr_4510_ram[CDTVCR_ID + 0] = 'C'; cdtvcr_4510_ram[CDTVCR_ID + 1] = 'D'; cdtvcr_4510_ram[CDTVCR_ID + 2] = 'T'; cdtvcr_4510_ram[CDTVCR_ID + 3] = 'V'; write_log(_T("4510 reset %d\n"), v); if (v == 3) { sys_command_cd_pause (unitnum, 0); sys_command_cd_stop (unitnum); cdtvcr_4510_ram[CDTVCR_CD_PLAYING] = 0; cdtvcr_4510_ram[CDTVCR_CD_STATE] = 0; return; } else if (v == 2 || v == 1) { cdtvcr_4510_ram[CDTVCR_INTENA] = 0; cdtvcr_4510_ram[CDTVCR_INTREQ] = 0; if (v == 1) { memset(cdtvcr_4510_ram, 0, 4096); } cdtvcr_4510_ram[CDTVCR_INTDISABLE] = 1; cdtvcr_4510_ram[CDTVCR_CD_STATE] = 1; } cdtvcr_4510_ram[CDTVCR_PLAYLIST_TIME_MODE] = 2; uae_sem_wait (&sub_sem); memset (subcodebufferinuse, 0, sizeof subcodebufferinuse); subcodebufferoffsetw = subcodebufferoffset = 0; uae_sem_post (&sub_sem); if (ismedia()) get_toc(); }
/*! Play audio cd; time is in track/index */ static status_t play_track_index(cd_driver_info *info, const scsi_play_track *buf) { scsi_toc generic_toc; scsi_toc_toc *toc; status_t res; int start_track, end_track; scsi_play_position position; TRACE("play_track_index(): %d-%d\n", buf->start_track, buf->end_track); // the corresponding command PLAY AUDIO TRACK/INDEX is deprecated, // so we have to simulate it by converting track to time via TOC res = get_toc(info, &generic_toc); if (res != B_OK) return res; toc = (scsi_toc_toc *)&generic_toc.toc_data[0]; start_track = buf->start_track; end_track = buf->end_track; if (start_track > toc->last_track) return B_BAD_INDEX; if (end_track > toc->last_track) end_track = toc->last_track + 1; if (end_track < toc->last_track + 1) ++end_track; start_track -= toc->first_track; end_track -= toc->first_track; if (start_track < 0 || end_track < 0) return B_BAD_INDEX; position.start_m = toc->tracks[start_track].start.time.minute; position.start_s = toc->tracks[start_track].start.time.second; position.start_f = toc->tracks[start_track].start.time.frame; position.end_m = toc->tracks[end_track].start.time.minute; position.end_s = toc->tracks[end_track].start.time.second; position.end_f = toc->tracks[end_track].start.time.frame; return play_msf(info, &position); }
/** * ReadSubfr1 function. * The function decodes the 1st subframe of the GPS navigation data * according to the IS-GPS-200E section 20.3.3.3.1 Subframe 1 content and * updates the Satellite structure, identified by its pointer. * @param *Sat The pointer of the Satellite structure * @param *data The pointer of the 300 bits */ void ReadSubfr1(Satellite * Sat, char * data) { /* form the subframe * data is a table of 10 words, to form the subframe: - conversion to binary of each words - add the 6 bits parity at the beginning of the words, for each words (if there arent there already) - concatenation of the 10 words - if TLM and/or HOW are deleted, add the 32/64 bits */ (*Sat).weeknb = get_weeknb((*Sat).subfr1); (*Sat).cl2 = get_cl2((*Sat).subfr1); (*Sat).ura = get_ura((*Sat).subfr1); (*Sat).health = get_health((*Sat).subfr1); (*Sat).iodc = get_iodc((*Sat).subfr1); (*Sat).tgd = get_tgd((*Sat).subfr1); (*Sat).toc = get_toc((*Sat).subfr1); (*Sat).af0 = get_af0((*Sat).subfr1); (*Sat).af1 = get_af1((*Sat).subfr1); (*Sat).af2 = get_af2((*Sat).subfr1); }
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; }
static status_t cd_ioctl(void* cookie, uint32 op, void* buffer, size_t length) { cd_handle* handle = (cd_handle*)cookie; cd_driver_info *info = handle->info; TRACE("ioctl(op = %lu)\n", op); switch (op) { case B_GET_DEVICE_SIZE: { status_t status = update_capacity(info); if (status != B_OK) return status; size_t size = info->capacity * info->block_size; return user_memcpy(buffer, &size, sizeof(size_t)); } case B_GET_GEOMETRY: { if (buffer == NULL /*|| length != sizeof(device_geometry)*/) return B_BAD_VALUE; device_geometry geometry; status_t status = get_geometry(handle, &geometry); if (status != B_OK) return status; return user_memcpy(buffer, &geometry, sizeof(device_geometry)); } case B_GET_ICON_NAME: return user_strlcpy((char*)buffer, "devices/drive-optical", B_FILE_NAME_LENGTH); case B_GET_VECTOR_ICON: { device_icon iconData; if (length != sizeof(device_icon)) return B_BAD_VALUE; if (user_memcpy(&iconData, buffer, sizeof(device_icon)) != B_OK) return B_BAD_ADDRESS; if (iconData.icon_size >= (int32)sizeof(kCDIcon)) { if (user_memcpy(iconData.icon_data, kCDIcon, sizeof(kCDIcon)) != B_OK) return B_BAD_ADDRESS; } iconData.icon_size = sizeof(kCDIcon); return user_memcpy(buffer, &iconData, sizeof(device_icon)); } case B_SCSI_GET_TOC: // TODO: we pass a user buffer here! return get_toc(info, (scsi_toc *)buffer); case B_EJECT_DEVICE: case B_SCSI_EJECT: return load_eject(info, false); case B_LOAD_MEDIA: return load_eject(info, true); case B_SCSI_GET_POSITION: { if (buffer == NULL) return B_BAD_VALUE; scsi_position position; status_t status = get_position(info, &position); if (status != B_OK) return status; return user_memcpy(buffer, &position, sizeof(scsi_position)); } case B_SCSI_GET_VOLUME: // TODO: we pass a user buffer here! return get_set_volume(info, (scsi_volume *)buffer, false); case B_SCSI_SET_VOLUME: // TODO: we pass a user buffer here! return get_set_volume(info, (scsi_volume *)buffer, true); case B_SCSI_PLAY_TRACK: { scsi_play_track track; if (user_memcpy(&track, buffer, sizeof(scsi_play_track)) != B_OK) return B_BAD_ADDRESS; return play_track_index(info, &track); } case B_SCSI_PLAY_POSITION: { scsi_play_position position; if (user_memcpy(&position, buffer, sizeof(scsi_play_position)) != B_OK) return B_BAD_ADDRESS; return play_msf(info, &position); } case B_SCSI_STOP_AUDIO: return stop_audio(info); case B_SCSI_PAUSE_AUDIO: return pause_resume(info, false); case B_SCSI_RESUME_AUDIO: return pause_resume(info, true); case B_SCSI_SCAN: { scsi_scan scanBuffer; if (user_memcpy(&scanBuffer, buffer, sizeof(scsi_scan)) != B_OK) return B_BAD_ADDRESS; return scan(info, &scanBuffer); } case B_SCSI_READ_CD: // TODO: we pass a user buffer here! return read_cd(info, (scsi_read_cd *)buffer); default: return sSCSIPeripheral->ioctl(handle->scsi_periph_handle, op, buffer, length); } }
static void cdtvcr_do_cmd(void) { uae_u32 addr, len, start, end, datalen; uae_u32 startlsn, endlsn; uae_u8 starttrack, endtrack; uae_u8 *p = &cdtvcr_4510_ram[CDTVCR_CD_CMD]; cdtvcr_4510_ram[CDTVCR_SYS_STATE] |= 2; cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS] = 2; cdtvcr_4510_ram[CDTVCR_CD_CMD_STATUS2] = 0; write_log(_T("CDTVCR CD command %02x\n"), p[0]); for(int i = 0; i < 14; i++) write_log(_T(".%02x"), p[i]); write_log(_T("\n")); start = (p[1] << 16) | (p[2] << 8) | (p[3] << 0); startlsn = msf2lsn(start); end = (p[4] << 16) | (p[5] << 8) | (p[6] << 0); endlsn = msf2lsn(end); addr = (p[7] << 24) | (p[8] << 16) | (p[9] << 8) | (p[10] << 0); len = (p[4] << 16) | (p[5] << 8) | (p[6] << 0); datalen = (p[11] << 16) | (p[12] << 8) | (p[13] << 0); starttrack = p[1]; endtrack = p[3]; switch(p[0]) { case 2: // start cdtvcr_start(); cdtvcr_cmd_done(); break; case 3: // stop cdtvcr_stop(); cdtvcr_cmd_done(); break; case 4: // toc cdtvcr_stop(); get_toc(); cdtvcr_cmd_done(); break; case 6: // play cdtvcr_stop(); cdtvcr_play(startlsn, endlsn); break; case 7: // play track cdtvcr_stop(); cdtvcr_play_track(starttrack, endtrack); break; case 8: // read cdtvcr_stop(); cdtvcr_read_data(start, addr, datalen); break; case 9: cdtvcr_pause(true); break; case 10: cdtvcr_pause(false); break; case 11: // stop play cdtvcr_stop(); cdtvcr_cmd_done(); break; default: write_log(_T("unsupported command!\n")); break; } }