static PyObject* CDImage_length_in_seconds(cdio_CDImage* self) { msf_t first_track; msf_t leadout; int length; cdio_get_track_msf(self->image, 1, &first_track); cdio_get_track_msf(self->image, CDIO_CDROM_LEADOUT_TRACK, &leadout); length = cdio_audio_get_msf_seconds(&leadout) - cdio_audio_get_msf_seconds(&first_track); return Py_BuildValue("i", length); }
/* Compute the CDDB disk ID for an Audio disk. This is a funny checksum consisting of the concatenation of 3 things: the sum of the decimal digits of sizes of all tracks, the total length of the disk, and the number of tracks. */ static unsigned long cddb_discid(CdIo_t *p_cdio, int i_tracks) { int i,t,n=0; msf_t start_msf; msf_t msf; for (i = 1; i <= i_tracks; i++) { cdio_get_track_msf(p_cdio, i, &msf); n += cddb_dec_digit_sum(msf_seconds(&msf)); } cdio_get_track_msf(p_cdio, 1, &start_msf); cdio_get_track_msf(p_cdio, CDIO_CDROM_LEADOUT_TRACK, &msf); t = msf_seconds(&msf) - msf_seconds(&start_msf); return ((n % 0xff) << 24 | t << 8 | i_tracks); }
/*! Return the starting LSN for track number i_track in cdio. Tracks numbers start at 1. The "leadout" track is specified either by using i_track LEADOUT_TRACK or the total tracks+1. CDIO_INVALID_LBA is returned on error. */ lsn_t cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track) { if (p_cdio == NULL) return CDIO_INVALID_LSN; if (p_cdio->op.get_track_lba) { return cdio_lba_to_lsn(p_cdio->op.get_track_lba (p_cdio->env, i_track)); } else { msf_t msf; if (cdio_get_track_msf(p_cdio, i_track, &msf)) return cdio_msf_to_lsn(&msf); return CDIO_INVALID_LSN; } }
/*! Return the starting LSN for track number track_num in cdio. Tracks numbers start at 1. The "leadout" track is specified either by using track_num LEADOUT_TRACK or the total tracks+1. CDIO_INVALID_LBA is returned on error. */ lsn_t cdio_get_track_lsn(const CdIo *cdio, track_t track_num) { if (cdio == NULL) return CDIO_INVALID_LBA; if (cdio->op.get_track_lba) { return cdio_lba_to_lsn(cdio->op.get_track_lba (cdio->env, track_num)); } else { msf_t msf; if (cdio_get_track_msf(cdio, track_num, &msf)) return cdio_msf_to_lsn(&msf); return CDIO_INVALID_LSN; } }
/*! Return the starting LBA for track number track_num in cdio. Tracks numbers start at 1. The "leadout" track is specified either by using track_num LEADOUT_TRACK or the total tracks+1. CDIO_INVALID_LBA is returned on error. */ lba_t cdio_get_track_lba(const CdIo_t *p_cdio, track_t i_track) { if (!p_cdio) return CDIO_INVALID_LBA; if (p_cdio->op.get_track_lba) { return p_cdio->op.get_track_lba (p_cdio->env, i_track); } else { msf_t msf; if (p_cdio->op.get_track_msf) if (cdio_get_track_msf(p_cdio, i_track, &msf)) return cdio_msf_to_lba(&msf); return CDIO_INVALID_LBA; } }
static Cddb::Toc& GetToc(CdIo_t *cdio, Cddb::Toc& toc) { // Get lead-in const track_t firstTrack = cdio_get_first_track_num(cdio); lsn_t lsn0 = 0; msf_t msf; if (cdio_get_track_msf(cdio, firstTrack, &msf)) lsn0 = (msf.m * 60 + msf.s) * CDIO_CD_FRAMES_PER_SEC + msf.f; const track_t lastTrack = cdio_get_last_track_num(cdio); for (track_t t = firstTrack; t <= lastTrack + 1; ++t) { #if 0 // This would be better but the msf's returned are way off in libcdio 0.81 if (!cdio_get_track_msf(cdio, t, &msf)) break; #else lsn_t lsn = cdio_get_track_lsn(cdio, t); if (s_lastAudioLsn && lsn > s_lastAudioLsn) lsn = s_lastAudioLsn; lsn += lsn0; // lead-in std::div_t d = std::div(lsn, CDIO_CD_FRAMES_PER_SEC); msf.f = d.rem; d = std::div(d.quot, 60); msf.s = d.rem; msf.m = d.quot; #endif //LOG(VB_MEDIA, LOG_INFO, QString("Track %1 msf: %2:%3:%4"). // arg(t,2).arg(msf.m,2).arg(msf.s,2).arg(msf.f,2) ); toc.push_back(Cddb::Msf(msf.m, msf.s, msf.f)); if (TRACK_FORMAT_AUDIO != cdio_get_track_format(cdio, t)) break; } return toc; }
/*! Read CD TOC and set CD information. */ static void read_toc(CdIo_t *p_cdio) { track_t i; i_first_track = cdio_get_first_track_num(p_cdio); i_last_track = cdio_get_last_track_num(p_cdio); i_tracks = cdio_get_num_tracks(p_cdio); i_first_audio_track = i_first_track; i_last_audio_track = i_last_track; if ( CDIO_INVALID_TRACK == i_first_track || CDIO_INVALID_TRACK == i_last_track ) { xperror("read toc header"); b_cd = false; b_record = false; } else { b_cd = true; i_data = 0; for (i = i_first_track; i <= i_last_track+1; i++) { if ( !cdio_get_track_msf(p_cdio, i, &(toc[i])) ) { xperror("read toc entry"); b_cd = false; return; } if ( TRACK_FORMAT_AUDIO != cdio_get_track_format(p_cdio, i) ) { if ((i != i_last_track+1) ) { i_data++; if (i == i_first_track) { if (i == i_last_track) i_first_audio_track = CDIO_CDROM_LEADOUT_TRACK; else i_first_audio_track++; } } } } b_record = true; read_subchannel(p_cdio); if (auto_mode && sub.audio_status != CDIO_MMC_READ_SUB_ST_PLAY) play_track(1, CDIO_CDROM_LEADOUT_TRACK); } }
/** Read CD TOC and set CD information. */ static void read_toc(CdIo_t *p_cdio) { track_t i; action("read toc..."); memset(cd_info, 0, sizeof(cd_info)); title[0] = artist[0] = genre[0] = category[0] = year[0] = '\0'; i_first_track = cdio_get_first_track_num(p_cdio); i_last_track = cdio_get_last_track_num(p_cdio); i_tracks = cdio_get_num_tracks(p_cdio); i_first_audio_track = i_first_track; i_last_audio_track = i_last_track; cdio_audio_get_volume(p_cdio, &audio_volume); for (i_vol_port=0; i_vol_port<4; i_vol_port++) { if (audio_volume.level[i_vol_port] > 0) break; } if ( CDIO_INVALID_TRACK == i_first_track || CDIO_INVALID_TRACK == i_last_track ) { xperror("read toc header"); b_cd = false; b_record = false; i_last_display_track = CDIO_INVALID_TRACK; } else { b_cd = true; i_data = 0; get_disc_info(p_cdio); for (i = i_first_track; i <= i_last_track+1; i++) { int s; if ( !cdio_get_track_msf(p_cdio, i, &(toc[i])) ) { xperror("read toc entry"); b_cd = false; return; } if ( TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i) ) { if (i != i_first_track) { s = cdio_audio_get_msf_seconds(&toc[i]) - cdio_audio_get_msf_seconds(&toc[i-1]); snprintf(cd_info[i-1].length, sizeof(cd_info[0].length), "%02d:%02d", s / CDIO_CD_SECS_PER_MIN, s % CDIO_CD_SECS_PER_MIN); } } else { if ((i != i_last_track+1) ) { i_data++; if (i == i_first_track) { if (i == i_last_track) i_first_audio_track = CDIO_CDROM_LEADOUT_TRACK; else i_first_audio_track++; } } } get_track_info(i); } b_record = true; read_subchannel(p_cdio); if (auto_mode && sub.audio_status != CDIO_MMC_READ_SUB_ST_PLAY) play_track(1, CDIO_CDROM_LEADOUT_TRACK); } action(""); if (!b_all_tracks) display_cdinfo(p_cdio, i_tracks, i_first_track); }
/*! Return the starting MSF (minutes/secs/frames) for track number i_track in p_cdio. @return true if things worked or false if there is no track entry. */ bool getMsf(/*out*/ msf_t &msf) { return cdio_get_track_msf(p_cdio, i_track,/*out*/ &msf); }