static void parse_cddb (cdda_t *cd) { cddb_disc_t *disc; cddb_conn_t *conn; int res; if (!cd) return; libcddb_init (); conn = cddb_new (); disc = cddb_disc_new (); cddb_disc_set_category_str (disc, "misc"); cddb_disc_set_discid (disc, cd->id); res = cddb_read (conn, disc); if (!res) goto err_cddb_read; cd_get_metadata (cd, disc); cd_get_tracks (cd, disc); err_cddb_read: cddb_disc_destroy (disc); libcddb_shutdown (); }
/* cd_is_audio: * Return 1 if track specified is audio, * zero if it is data, -1 if an error occurs. */ int cd_is_audio(int track) { struct cdrom_tocentry e; if ((cd_get_tracks(0, 0) < 0) || (get_tocentry(track, &e) < 0)) return -1; return (e.cdte_ctrl & CDROM_DATA_TRACK) ? 0 : 1; }
/* cd_play_from: * Play from track to end of disc. Return zero on success. */ int cd_play_from(int track) { int last; if (cd_get_tracks(0, &last) != 0) return -1; return play(track, last); }
static int play(int t1, int t2) { #ifdef USE_PLAYMSF struct cdrom_tocentry e0, e1; struct cdrom_msf msf; int last; if (cd_get_tracks(0, &last) != 0) return -1; /* cdrom.h: The leadout track is always 0xAA, regardless * of # of tracks on disc. */ if (t2 == last) t2 = CDROM_LEADOUT; else t2++; if ((get_tocentry(t1, &e0) != 0) || (get_tocentry(t2, &e1) != 0)) return -1; msf.cdmsf_min0 = e0.cdte_addr.msf.minute; msf.cdmsf_sec0 = e0.cdte_addr.msf.second; msf.cdmsf_frame0 = e0.cdte_addr.msf.frame; msf.cdmsf_min1 = e1.cdte_addr.msf.minute; msf.cdmsf_sec1 = e1.cdte_addr.msf.second; msf.cdmsf_frame1 = e1.cdte_addr.msf.frame; if (ioctl(fd, CDROMPLAYMSF, &msf) < 0) { copy_cd_error(); return -1; } return 0; #else struct cdrom_ti idx; memset(&idx, 0, sizeof(idx)); idx.cdti_trk0 = t1; idx.cdti_trk1 = t2; if (ioctl(fd, CDROMPLAYTRKIND, &idx) < 0) { copy_cd_error(); return -1; } return 0; #endif }
/* * Description: Get First and Last Track number from the CD. * * Returns: true if success, false other wise. */ static int get_track_info( track_info * ptrack_info ) { int rc = false ; int first_track = 0 ; int last_track = 0 ; if ( cd_get_tracks ( &first_track, &last_track ) ) { show_error( INFO, cd_error ) ; } else { ptrack_info->first_track = first_track ; ptrack_info->last_track = last_track ; rc = true ; } return rc ; }
cdda_t * cdda_parse (const char *device) { cdda_t *cd; if (!device) return NULL; cd = cd_identify (device); #ifdef BUILD_LIBCDDB parse_cddb (cd); #else cd_get_tracks (cd); #endif cd_display_info (cd); return cd; }
int main() { char cmd[20]; int done = 0; int ret, trk, a, b; if (cd_init() < 0) { printf("Error initialising libcda (%s)\n", cd_error); return 1; } show_cmds(); do { printf(">>> "); fflush(stdout); scanf("%s", cmd); switch (cmd[0]) { case '?': show_cmds(); break; case 'p': trk = input_int("Track"); ret = cd_play(trk); if (ret != 0) printf("Error occurred (%s)\n", cd_error); break; case 'r': a = input_int("First track"); b = input_int("Last track"); ret = cd_play_range(a, b); if (ret != 0) printf("Error occurred (%s)\n", cd_error); break; case 'f': trk = input_int("Start track"); ret = cd_play_from(trk); if (ret != 0) printf("Error occurred (%s)\n", cd_error); break; case 'P': trk = cd_current_track(); if (trk) printf("Playing track %d\n", trk); else printf("Not playing\n"); break; case 'w': cd_pause(); break; case 'W': cd_resume(); break; case 'S': ret = cd_is_paused(); if (ret) printf("Paused\n"); else printf("Not paused\n"); break; case 's': cd_stop(); break; case 'i': ret = cd_get_tracks(&a, &b); if (ret != 0) printf("Error occurred (%s)\n", cd_error); else printf("First track: %d\nLast track: %d\n", a, b); break; case 'a': trk = input_int("Track"); ret = cd_is_audio(trk); if (ret < 0) printf("Error occurred (%s)\n", cd_error); else printf("Track %d is %s\n", trk, (ret ? "audio" : "data")); break; case 'v': a = input_int("Left (0-255)"); b = input_int("Right (0-255)"); cd_set_volume(a, b); break; case 'V': cd_get_volume(&a, &b); printf("Left volume: %d\nRight volume: %d\n", a, b); break; case 'e': cd_eject(); break; case 'c': cd_close(); break; case 'q': done = 1; break; default: printf("Unrecognised command: `%c'\n", cmd[0]); } } while (!done); cd_exit(); return 0; }