Ability to toggle list display mode.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: cdda-player.c,v 1.24 2005/03/21 09:00:20 rocky Exp $
|
$Id: cdda-player.c,v 1.25 2005/03/22 01:57:22 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ static void display_cdinfo(CdIo_t *p_cdio, track_t i_tracks,
|
|||||||
static void get_cddb_track_info(track_t i_track);
|
static void get_cddb_track_info(track_t i_track);
|
||||||
static void get_cdtext_track_info(track_t i_track);
|
static void get_cdtext_track_info(track_t i_track);
|
||||||
static void get_track_info(track_t i_track);
|
static void get_track_info(track_t i_track);
|
||||||
static void list_tracks(bool b_keypress_wait);
|
static void display_tracks(void);
|
||||||
|
|
||||||
CdIo_t *p_cdio; /* libcdio handle */
|
CdIo_t *p_cdio; /* libcdio handle */
|
||||||
driver_id_t driver_id = DRIVER_DEVICE;
|
driver_id_t driver_id = DRIVER_DEVICE;
|
||||||
@@ -115,6 +115,7 @@ bool b_cddb = false; /* CDDB database present */
|
|||||||
bool b_db = false; /* we have a database at all */
|
bool b_db = false; /* we have a database at all */
|
||||||
bool b_record = false; /* we have a record for
|
bool b_record = false; /* we have a record for
|
||||||
the inserted CD */
|
the inserted CD */
|
||||||
|
bool b_all_tracks = false; /* True if we display all tracks*/
|
||||||
|
|
||||||
char *psz_device=NULL;
|
char *psz_device=NULL;
|
||||||
char *psz_program;
|
char *psz_program;
|
||||||
@@ -160,7 +161,7 @@ const char key_bindings[][MAX_KEY_STR] = {
|
|||||||
" F1-F20 jump to track 11-30",
|
" F1-F20 jump to track 11-30",
|
||||||
" ",
|
" ",
|
||||||
" k, h, ? show this key help",
|
" k, h, ? show this key help",
|
||||||
" l, list tracks",
|
" l, toggle listing all tracks",
|
||||||
" e eject",
|
" e eject",
|
||||||
" c close tray",
|
" c close tray",
|
||||||
" p, space pause / resume",
|
" p, space pause / resume",
|
||||||
@@ -170,24 +171,6 @@ const char key_bindings[][MAX_KEY_STR] = {
|
|||||||
" a toggle auto-mode",
|
" a toggle auto-mode",
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NO_OP=0,
|
|
||||||
PLAY_CD=1,
|
|
||||||
PLAY_TRACK=2,
|
|
||||||
STOP_PLAYING=3,
|
|
||||||
EJECT_CD=4,
|
|
||||||
CLOSE_CD=5,
|
|
||||||
SET_VOLUME=6,
|
|
||||||
LIST_SUBCHANNEL=7,
|
|
||||||
LIST_KEYS=8,
|
|
||||||
LIST_TRACKS=9,
|
|
||||||
PS_LIST_TRACKS=10,
|
|
||||||
TOGGLE_PAUSE=11,
|
|
||||||
EXIT_PROGRAM=12
|
|
||||||
} cd_operation_t;
|
|
||||||
|
|
||||||
cd_operation_t cd_op; /* operation to do in non-interactive mode */
|
|
||||||
|
|
||||||
const unsigned int i_key_bindings = sizeof(key_bindings) / MAX_KEY_STR;
|
const unsigned int i_key_bindings = sizeof(key_bindings) / MAX_KEY_STR;
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@@ -325,6 +308,7 @@ cd_stop(CdIo_t *p_cdio)
|
|||||||
b_ok = DRIVER_OP_SUCCESS == cdio_audio_stop(p_cdio);
|
b_ok = DRIVER_OP_SUCCESS == cdio_audio_stop(p_cdio);
|
||||||
if ( !b_ok )
|
if ( !b_ok )
|
||||||
xperror("stop");
|
xperror("stop");
|
||||||
|
if (b_all_tracks) display_tracks();
|
||||||
}
|
}
|
||||||
return b_ok;
|
return b_ok;
|
||||||
}
|
}
|
||||||
@@ -521,7 +505,8 @@ read_toc(CdIo_t *p_cdio)
|
|||||||
play_track(1, CDIO_CDROM_LEADOUT_TRACK);
|
play_track(1, CDIO_CDROM_LEADOUT_TRACK);
|
||||||
}
|
}
|
||||||
action(NULL);
|
action(NULL);
|
||||||
display_cdinfo(p_cdio, i_tracks, i_first_track);
|
if (!b_all_tracks)
|
||||||
|
display_cdinfo(p_cdio, i_tracks, i_first_track);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Play an audio track. */
|
/*! Play an audio track. */
|
||||||
@@ -647,44 +632,48 @@ display_status(bool b_status_only)
|
|||||||
if ( !b_status_only && b_db && i_last_display_track != sub.track &&
|
if ( !b_status_only && b_db && i_last_display_track != sub.track &&
|
||||||
(sub.audio_status == CDIO_MMC_READ_SUB_ST_PAUSED ||
|
(sub.audio_status == CDIO_MMC_READ_SUB_ST_PAUSED ||
|
||||||
sub.audio_status == CDIO_MMC_READ_SUB_ST_PLAY) &&
|
sub.audio_status == CDIO_MMC_READ_SUB_ST_PLAY) &&
|
||||||
b_cd ) {
|
b_cd) {
|
||||||
const cd_track_info_rec_t *p_cd_info = &cd_info[sub.track];
|
|
||||||
i_last_display_track = sub.track;
|
if (b_all_tracks) display_tracks();
|
||||||
if (i_first_audio_track != sub.track &&
|
else {
|
||||||
strlen(cd_info[sub.track-1].title)) {
|
const cd_track_info_rec_t *p_cd_info = &cd_info[sub.track];
|
||||||
const cd_track_info_rec_t *p_cd_info = &cd_info[sub.track-1];
|
i_last_display_track = sub.track;
|
||||||
mvprintw(LINE_TRACK_PREV, 0, (char *) " track %2d title : %s [%s]",
|
if (i_first_audio_track != sub.track &&
|
||||||
sub.track-1, p_cd_info->title,
|
strlen(cd_info[sub.track-1].title)) {
|
||||||
p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
const cd_track_info_rec_t *p_cd_info = &cd_info[sub.track-1];
|
||||||
clrtoeol();
|
mvprintw(LINE_TRACK_PREV, 0, (char *) " track %2d title : %s [%s]",
|
||||||
} else {
|
sub.track-1, p_cd_info->title,
|
||||||
mvprintw(LINE_TRACK_PREV, 0, (char *) "%s","");
|
p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
||||||
clrtoeol();
|
clrtoeol();
|
||||||
|
} else {
|
||||||
|
mvprintw(LINE_TRACK_PREV, 0, (char *) "%s","");
|
||||||
|
clrtoeol();
|
||||||
|
}
|
||||||
|
if (strlen(p_cd_info->title)) {
|
||||||
|
mvprintw(LINE_TRACK_TITLE, 0, (char *) ">track %2d title : %s [%s]",
|
||||||
|
sub.track, p_cd_info->title,
|
||||||
|
(char *) p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
||||||
|
clrtoeol();
|
||||||
|
}
|
||||||
|
if (strlen(p_cd_info->artist)) {
|
||||||
|
mvprintw(LINE_TRACK_ARTIST, 0, (char *) ">track %2d artist: %s [%s]",
|
||||||
|
sub.track, p_cd_info->artist,
|
||||||
|
p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
||||||
|
clrtoeol();
|
||||||
|
}
|
||||||
|
if (i_last_audio_track != sub.track &&
|
||||||
|
strlen(cd_info[sub.track+1].title)) {
|
||||||
|
const cd_track_info_rec_t *p_cd_info = &cd_info[sub.track+1];
|
||||||
|
mvprintw(LINE_TRACK_NEXT, 0, (char *) " track %2d title : %s [%s]",
|
||||||
|
sub.track+1, p_cd_info->title,
|
||||||
|
p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
||||||
|
clrtoeol();
|
||||||
|
} else {
|
||||||
|
mvprintw(LINE_TRACK_NEXT, 0, (char *) "%s","");
|
||||||
|
clrtoeol();
|
||||||
|
}
|
||||||
|
clrtobot();
|
||||||
}
|
}
|
||||||
if (strlen(p_cd_info->title)) {
|
|
||||||
mvprintw(LINE_TRACK_TITLE, 0, (char *) ">track %2d title : %s [%s]",
|
|
||||||
sub.track, p_cd_info->title,
|
|
||||||
(char *) p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
|
||||||
clrtoeol();
|
|
||||||
}
|
|
||||||
if (strlen(p_cd_info->artist)) {
|
|
||||||
mvprintw(LINE_TRACK_ARTIST, 0, (char *) ">track %2d artist: %s [%s]",
|
|
||||||
sub.track, p_cd_info->artist,
|
|
||||||
p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
|
||||||
clrtoeol();
|
|
||||||
}
|
|
||||||
if (i_last_audio_track != sub.track &&
|
|
||||||
strlen(cd_info[sub.track+1].title)) {
|
|
||||||
const cd_track_info_rec_t *p_cd_info = &cd_info[sub.track+1];
|
|
||||||
mvprintw(LINE_TRACK_NEXT, 0, (char *) " track %2d title : %s [%s]",
|
|
||||||
sub.track+1, p_cd_info->title,
|
|
||||||
p_cd_info->b_cdtext ? "CD-Text" : "CDDB");
|
|
||||||
clrtoeol();
|
|
||||||
} else {
|
|
||||||
mvprintw(LINE_TRACK_NEXT, 0, (char *) "%s","");
|
|
||||||
clrtoeol();
|
|
||||||
}
|
|
||||||
clrtobot();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
@@ -842,13 +831,12 @@ keypress_wait(CdIo_t *p_cdio)
|
|||||||
while (1 != select_wait(b_cd ? 1 : 5)) {
|
while (1 != select_wait(b_cd ? 1 : 5)) {
|
||||||
read_subchannel(p_cdio);
|
read_subchannel(p_cdio);
|
||||||
display_status(true);
|
display_status(true);
|
||||||
if (LIST_TRACKS == cd_op && i_last_display_track != sub.track)
|
|
||||||
list_tracks(false);
|
|
||||||
}
|
}
|
||||||
key = getch();
|
key = getch();
|
||||||
clrtobot();
|
clrtobot();
|
||||||
action(NULL);
|
action(NULL);
|
||||||
display_cdinfo(p_cdio, i_tracks, i_first_track);
|
if (!b_all_tracks)
|
||||||
|
display_cdinfo(p_cdio, i_tracks, i_first_track);
|
||||||
i_last_display_track = CDIO_INVALID_TRACK;
|
i_last_display_track = CDIO_INVALID_TRACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -864,7 +852,7 @@ list_keys()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
list_tracks(bool b_keypress_wait)
|
display_tracks(void)
|
||||||
{
|
{
|
||||||
track_t i;
|
track_t i;
|
||||||
int i_line=0;
|
int i_line=0;
|
||||||
@@ -876,10 +864,12 @@ list_tracks(bool b_keypress_wait)
|
|||||||
char line[80];
|
char line[80];
|
||||||
s = cdio_audio_get_msf_seconds(&toc[i+1])
|
s = cdio_audio_get_msf_seconds(&toc[i+1])
|
||||||
- cdio_audio_get_msf_seconds(&toc[i]);
|
- cdio_audio_get_msf_seconds(&toc[i]);
|
||||||
|
read_subchannel(p_cdio);
|
||||||
sprintf(line, "%2d %02d:%02d %s ", i,
|
sprintf(line, "%2d %02d:%02d %s ", i,
|
||||||
s / CDIO_CD_SECS_PER_MIN, s % CDIO_CD_SECS_PER_MIN,
|
s / CDIO_CD_SECS_PER_MIN, s % CDIO_CD_SECS_PER_MIN,
|
||||||
(sub.audio_status == CDIO_MMC_READ_SUB_ST_PLAY &&
|
( ( sub.audio_status == CDIO_MMC_READ_SUB_ST_PLAY ||
|
||||||
sub.track == i) ? "->" : " |");
|
sub.audio_status == CDIO_MMC_READ_SUB_ST_PAUSED ) &&
|
||||||
|
sub.track == i ) ? "->" : " |");
|
||||||
if (b_record) {
|
if (b_record) {
|
||||||
if ( strlen(cd_info[i].title) )
|
if ( strlen(cd_info[i].title) )
|
||||||
strcat(line, cd_info[i].title);
|
strcat(line, cd_info[i].title);
|
||||||
@@ -892,7 +882,6 @@ list_tracks(bool b_keypress_wait)
|
|||||||
mvprintw(i_line++, 0, line);
|
mvprintw(i_line++, 0, line);
|
||||||
clrtoeol();
|
clrtoeol();
|
||||||
}
|
}
|
||||||
if (b_keypress_wait) keypress_wait(p_cdio);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1213,6 +1202,22 @@ ps_list_tracks(void)
|
|||||||
printf("showpage\n");
|
printf("showpage\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NO_OP=0,
|
||||||
|
PLAY_CD=1,
|
||||||
|
PLAY_TRACK=2,
|
||||||
|
STOP_PLAYING=3,
|
||||||
|
EJECT_CD=4,
|
||||||
|
CLOSE_CD=5,
|
||||||
|
SET_VOLUME=6,
|
||||||
|
LIST_SUBCHANNEL=7,
|
||||||
|
LIST_KEYS=8,
|
||||||
|
LIST_TRACKS=9,
|
||||||
|
PS_LIST_TRACKS=10,
|
||||||
|
TOGGLE_PAUSE=11,
|
||||||
|
EXIT_PROGRAM=12
|
||||||
|
} cd_operation_t;
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -1220,6 +1225,9 @@ main(int argc, char *argv[])
|
|||||||
char *h;
|
char *h;
|
||||||
int i_rc = 0;
|
int i_rc = 0;
|
||||||
int i_volume_level = 0;
|
int i_volume_level = 0;
|
||||||
|
cd_operation_t cd_op; /* operation to do in non-interactive mode */
|
||||||
|
|
||||||
|
|
||||||
psz_program = strrchr(argv[0],'/');
|
psz_program = strrchr(argv[0],'/');
|
||||||
psz_program = psz_program ? psz_program+1 : argv[0];
|
psz_program = psz_program ? psz_program+1 : argv[0];
|
||||||
|
|
||||||
@@ -1447,34 +1455,35 @@ main(int argc, char *argv[])
|
|||||||
/* fall through */
|
/* fall through */
|
||||||
case 'Q':
|
case 'Q':
|
||||||
case 'q':
|
case 'q':
|
||||||
cd_op = EXIT_PROGRAM;
|
|
||||||
b_sig = true;
|
b_sig = true;
|
||||||
break;
|
break;
|
||||||
case 'E':
|
case 'E':
|
||||||
case 'e':
|
case 'e':
|
||||||
cd_op = EJECT_CD;
|
|
||||||
cd_eject();
|
cd_eject();
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
cd_op = STOP_PLAYING;
|
|
||||||
cd_stop(p_cdio);
|
cd_stop(p_cdio);
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
case 'c':
|
case 'c':
|
||||||
cd_op = CLOSE_CD;
|
|
||||||
cd_close(psz_device);
|
cd_close(psz_device);
|
||||||
break;
|
break;
|
||||||
case 'L':
|
case 'L':
|
||||||
case 'l':
|
case 'l':
|
||||||
cd_op = LIST_TRACKS;
|
b_all_tracks = !b_all_tracks;
|
||||||
list_tracks(true);
|
if (b_all_tracks)
|
||||||
|
display_tracks();
|
||||||
|
else {
|
||||||
|
i_last_display_track = CDIO_INVALID_TRACK;
|
||||||
|
display_cdinfo(p_cdio, i_tracks, i_first_track);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'K':
|
case 'K':
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'H':
|
case 'H':
|
||||||
case '?':
|
case '?':
|
||||||
cd_op = LIST_KEYS;
|
|
||||||
list_keys();
|
list_keys();
|
||||||
break;
|
break;
|
||||||
case ' ':
|
case ' ':
|
||||||
|
|||||||
Reference in New Issue
Block a user