Show volume in display status output.

This commit is contained in:
rocky
2005-03-14 02:03:33 +00:00
parent 0507f61921
commit fe3e453114

View File

@@ -1,5 +1,5 @@
/* /*
$Id: cdda-player.c,v 1.10 2005/03/13 03:52:15 rocky Exp $ $Id: cdda-player.c,v 1.11 2005/03/14 02:03:33 rocky Exp $
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
@@ -73,6 +73,17 @@ 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);
typedef enum {
PLAY_CD=1,
PLAY_TRACK=2,
STOP_PLAYING=3,
EJECT_CD=4,
CLOSE_CD=5,
LIST_KEYS=6,
LIST_TRACKS=7,
PS_LIST_TRACKS=8
} cd_operation_t;
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;
int b_sig = false; /* set on some signals */ int b_sig = false; /* set on some signals */
@@ -85,36 +96,28 @@ track_t i_last_audio_track;
track_t i_last_display_track = CDIO_INVALID_TRACK; track_t i_last_display_track = CDIO_INVALID_TRACK;
track_t i_tracks; track_t i_tracks;
msf_t toc[CDIO_CDROM_LEADOUT_TRACK+1]; msf_t toc[CDIO_CDROM_LEADOUT_TRACK+1];
cd_operation_t todo; /* operation to do in non-interactive mode */
cdio_subchannel_t sub; /* subchannel last time read */ cdio_subchannel_t sub; /* subchannel last time read */
int data; /* data tracks present ? */ int i_data; /* # of data tracks present ? */
bool b_cd = false;
bool auto_mode = false;
int start_track = 0; int start_track = 0;
int stop_track = 0; int stop_track = 0;
int one_track = 0; int one_track = 0;
int i_vol_port = -1; /* If -1 get retrieve volume port.
Otherwise the port number 0..3
of a working volume port.
*/
bool b_cd = false;
bool auto_mode = false;
bool b_verbose = false; bool b_verbose = false;
bool debug = false; bool debug = false;
bool interactive = true; bool interactive = true;
int todo; /* non-interactive */
bool b_prefer_cdtext = true; bool b_prefer_cdtext = true;
bool b_cddb = false; /* cddb datebase present */ bool b_cddb = false; /* CDDB database present */
bool b_cddb_l = false; /* local cddb */
bool b_cddb_r = false; /* remote cddb */
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 */
typedef enum {
PLAY_CD=1,
PLAY_TRACK=2,
STOP_PLAYING=3,
EJECT_CD=4,
CLOSE_CD=5,
LIST_KEYS=6,
LIST_TRACKS=7,
PS_LIST_TRACKS=8
} cd_operation_t;
char *psz_device=NULL; char *psz_device=NULL;
char *psz_program; char *psz_program;
@@ -141,6 +144,7 @@ bool b_cdtext_title; /* true if from CD-Text, false if from CDDB */
bool b_cdtext_artist; /* true if from CD-Text, false if from CDDB */ bool b_cdtext_artist; /* true if from CD-Text, false if from CDDB */
bool b_cdtext_genre; /* true if from CD-Text, false if from CDDB */ bool b_cdtext_genre; /* true if from CD-Text, false if from CDDB */
bool b_cdtext_category; /* true if from CD-Text, false if from CDDB */ bool b_cdtext_category; /* true if from CD-Text, false if from CDDB */
bool b_cdtext_year; /* true if from CD-Text, false if from CDDB */
#ifdef HAVE_CDDB #ifdef HAVE_CDDB
cddb_conn_t *p_conn = NULL; cddb_conn_t *p_conn = NULL;
@@ -152,13 +156,13 @@ int i_cddb_matches = 0;
const char key_bindings[][MAX_KEY_STR] = { const char key_bindings[][MAX_KEY_STR] = {
" right play / next track", " right play / next track",
" left previous track", " left previous track",
" up 10 sec forward", " up/down 10 sec forward / back",
" down 10 sec back",
" 1-9 jump to track 1-9", " 1-9 jump to track 1-9",
" 0 jump to track 10", " 0 jump to track 10",
" 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",
" e eject", " e eject",
" c close tray", " c close tray",
" p, space pause / resume", " p, space pause / resume",
@@ -267,7 +271,8 @@ xperror(const char *psz_msg)
if (b_verbose) { if (b_verbose) {
sprintf(line,"%s: %s", psz_msg, strerror(errno)); sprintf(line,"%s: %s", psz_msg, strerror(errno));
mvprintw(LINE_ACTION, 0, (char *) "error : %-70s", line); mvprintw(LINE_ACTION, 0, (char *) "error : %s", line);
clrtoeol();
refresh(); refresh();
select_wait(3); select_wait(3);
action(NULL); action(NULL);
@@ -279,6 +284,7 @@ oops(const char *psz_msg, int rc)
{ {
if (interactive) { if (interactive) {
mvprintw(LINE_LAST, 0, (char *) "%s, exiting...\n", psz_msg); mvprintw(LINE_LAST, 0, (char *) "%s, exiting...\n", psz_msg);
clrtoeol();
refresh(); refresh();
} }
tty_restore(); tty_restore();
@@ -354,8 +360,10 @@ read_subchannel(CdIo_t *p_cdio)
} }
#define add_cddb_disc_info(format_str, field) \ #define add_cddb_disc_info(format_str, field) \
if (p_cddb_disc->field && !strlen(field)) \ if (p_cddb_disc->field && !strlen(field)) { \
snprintf(field, sizeof(field), format_str, p_cddb_disc->field); snprintf(field, sizeof(field), format_str, p_cddb_disc->field); \
b_cdtext_ ## field = false; \
}
static void static void
get_cddb_disc_info(CdIo_t *p_cdio) get_cddb_disc_info(CdIo_t *p_cdio)
@@ -377,6 +385,7 @@ get_cddb_disc_info(CdIo_t *p_cdio)
if (p_cdtext->field[FIELD] && !strlen(info_field)) { \ if (p_cdtext->field[FIELD] && !strlen(info_field)) { \
snprintf(info_field, sizeof(info_field), format_str, \ snprintf(info_field, sizeof(info_field), format_str, \
p_cdtext->field[FIELD]); \ p_cdtext->field[FIELD]); \
b_cdtext_ ## info_field = true; \
} }
static void static void
@@ -422,6 +431,18 @@ read_toc(CdIo_t *p_cdio)
i_first_audio_track = i_first_track; i_first_audio_track = i_first_track;
i_last_audio_track = i_last_track; i_last_audio_track = i_last_track;
if ( DRIVER_OP_SUCCESS == cdio_audio_get_volume(p_cdio, NULL) ) {
for (i_vol_port=0; i_vol_port<4; i_vol_port++) {
if (i_vol_port > 0) break;
}
if (4 == i_vol_port)
/* Didn't find a non-zero volume level, maybe we've got everthing muted.
Set port to 0 to distinguis from -1 (driver can't get volume).
*/
i_vol_port = 0;
}
if ( CDIO_INVALID_TRACK == i_first_track || if ( CDIO_INVALID_TRACK == i_first_track ||
CDIO_INVALID_TRACK == i_last_track ) { CDIO_INVALID_TRACK == i_last_track ) {
xperror("read toc header"); xperror("read toc header");
@@ -430,7 +451,7 @@ read_toc(CdIo_t *p_cdio)
i_last_display_track = CDIO_INVALID_TRACK; i_last_display_track = CDIO_INVALID_TRACK;
} else { } else {
b_cd = true; b_cd = true;
data = 0; i_data = 0;
get_disc_info(p_cdio); get_disc_info(p_cdio);
for (i = i_first_track; i <= i_last_track+1; i++) { for (i = i_first_track; i <= i_last_track+1; i++) {
int s; int s;
@@ -452,7 +473,7 @@ read_toc(CdIo_t *p_cdio)
} }
} else { } else {
if ((i != i_last_track+1) ) { if ((i != i_last_track+1) ) {
data++; i_data++;
if (i == i_first_track) { if (i == i_first_track) {
if (i == i_last_track) if (i == i_last_track)
i_first_audio_track = CDIO_CDROM_LEADOUT_TRACK; i_first_audio_track = CDIO_CDROM_LEADOUT_TRACK;
@@ -542,8 +563,11 @@ toggle_pause()
} }
} }
/*! Update windows with status and possibly track info. This used in
interactive playing not batch mode.
*/
static void static void
display_status() display_status(bool b_status_only)
{ {
char line[80]; char line[80];
@@ -557,7 +581,24 @@ display_status()
} else if (sub.audio_status == CDIO_MMC_READ_SUB_ST_PAUSED || } else if (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) {
sprintf(line,"track %2d - %02d:%02d of %s (%02d:%02d abs) %-10s", cdio_audio_volume_t audio_volume;
if (i_vol_port > 0 &&
DRIVER_OP_SUCCESS == cdio_audio_get_volume(p_cdio, &audio_volume) )
{
uint8_t i_level = audio_volume.level[i_vol_port];
sprintf(line,
"track %2d - %02d:%02d of %s (%02d:%02d abs) %s volume: %d",
sub.track,
sub.rel_addr.msf.m,
sub.rel_addr.msf.s,
cd_info[sub.track].length,
sub.abs_addr.msf.m,
sub.abs_addr.msf.s,
mmc_audio_state2str(sub.audio_status),
(i_level*100+128) / 256 );
} else
sprintf(line,"track %2d - %02d:%02d of %s (%02d:%02d abs) %s",
sub.track, sub.track,
sub.rel_addr.msf.m, sub.rel_addr.msf.m,
sub.rel_addr.msf.s, sub.rel_addr.msf.s,
@@ -572,7 +613,7 @@ display_status()
mvprintw(LINE_STATUS, 0, (char *) "status%s: %s",auto_mode ? "*" : " ", line); mvprintw(LINE_STATUS, 0, (char *) "status%s: %s",auto_mode ? "*" : " ", line);
clrtoeol(); clrtoeol();
if (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 ) {
@@ -676,8 +717,12 @@ get_track_info(track_t i_track)
} }
#define display_line(LINE_NO, COL_NO, format_str, field) \ #define display_line(LINE_NO, COL_NO, format_str, field) \
if (field && field[0]) \ if (field && field[0]) { \
mvprintw(LINE_NO, COL_NO, (char *) format_str, field); mvprintw(LINE_NO, COL_NO, (char *) format_str " [%s]", \
field, \
b_cdtext_ ## field ? "CD-Text": "CDDB"); \
clrtoeol(); \
}
static void static void
display_cdinfo(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) display_cdinfo(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track)
@@ -692,14 +737,14 @@ display_cdinfo(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track)
len = sprintf(line, "%2u tracks (%02x:%02x min)", len = sprintf(line, "%2u tracks (%02x:%02x min)",
(unsigned int) i_last_track, (unsigned int) i_last_track,
toc[i_last_track+1].m, toc[i_last_track+1].s); toc[i_last_track+1].m, toc[i_last_track+1].s);
if (data && i_first_track != CDIO_CDROM_LEADOUT_TRACK) if (i_data && i_first_track != CDIO_CDROM_LEADOUT_TRACK)
sprintf(line+len,", audio=%u-%u", (unsigned int) i_first_audio_track, sprintf(line+len,", audio=%u-%u", (unsigned int) i_first_audio_track,
(unsigned int) i_last_audio_track); (unsigned int) i_last_audio_track);
display_line(LINE_ARTIST, 0, "CD Artist : %-70s", artist); display_line(LINE_ARTIST, 0, "CD Artist : %s", artist);
display_line(LINE_CDNAME, 0, "CD Title : %-70s", title); display_line(LINE_CDNAME, 0, "CD Title : %s", title);
display_line(LINE_GENRE, 0, "CD Genre : %-40s", genre); display_line(LINE_GENRE, 0, "CD Genre : %s", genre);
display_line(LINE_YEAR, 0, "CD Year : %4s", year); display_line(LINE_YEAR, 0, "CD Year : %s", year);
} }
mvprintw(LINE_CDINFO, 0, (char *) "CD info: %0s", line); mvprintw(LINE_CDINFO, 0, (char *) "CD info: %0s", line);
@@ -714,8 +759,8 @@ usage(char *prog)
{ {
fprintf(stderr, fprintf(stderr,
"%s is a simple curses CD player. It can pick up artist,\n" "%s is a simple curses CD player. It can pick up artist,\n"
"CD name and song title from a workman database file or\n" "CD name and song title from CD-Text info on the CD or\n"
"via cddb.\n" "via CDDB.\n"
"\n" "\n"
"usage: %s [options] [device]\n" "usage: %s [options] [device]\n"
"\n" "\n"
@@ -730,6 +775,8 @@ usage(char *prog)
"for non-interactive use (only one of them):\n" "for non-interactive use (only one of them):\n"
" -l list tracks\n" " -l list tracks\n"
" -c print cover (PostScript to stdout)\n" " -c print cover (PostScript to stdout)\n"
" -C close CD-ROM tray. If you use this option,\n"
" a CD-ROM device name must be specified.\n"
" -p play the whole CD\n" " -p play the whole CD\n"
" -t n play track >n<\n" " -t n play track >n<\n"
" -t a-b play all tracks between a and b (inclusive)\n" " -t a-b play all tracks between a and b (inclusive)\n"
@@ -741,11 +788,6 @@ usage(char *prog)
"to play it, and when it is done it ejects the CD. Start it that\n" "to play it, and when it is done it ejects the CD. Start it that\n"
"way on a spare console and forget about it...\n" "way on a spare console and forget about it...\n"
"\n" "\n"
"Title database access:\n"
" workman: checks $HOME/.workmandb\n"
" cddb remote: disabled by default, set CDDB_SERVER to \"server:port\"\n"
" to enable it.\n"
"\n"
"(c) 1997,98 Gerd Knorr <kraxel@goldbach.in-berlin.de>\n" "(c) 1997,98 Gerd Knorr <kraxel@goldbach.in-berlin.de>\n"
"(c) 2005 Rocky Bernstein <rocky@panix.com>\n" "(c) 2005 Rocky Bernstein <rocky@panix.com>\n"
, prog, prog); , prog, prog);
@@ -759,6 +801,22 @@ print_keys()
fprintf(stderr, "%s\n", key_bindings[i]); fprintf(stderr, "%s\n", key_bindings[i]);
} }
static void
keypress_wait(CdIo_t *p_cdio)
{
int key;
action("press any key to continue");
while (1 != select_wait(b_cd ? 1 : 5)) {
read_subchannel(p_cdio);
display_status(true);
}
key = getch();
clrtobot();
action(NULL);
display_cdinfo(p_cdio, i_tracks, i_first_track);
i_last_display_track = CDIO_INVALID_TRACK;
}
static void static void
list_keys() list_keys()
{ {
@@ -767,14 +825,7 @@ list_keys()
mvprintw(LINE_TRACK_PREV+i, 0, (char *) "%s", key_bindings[i]); mvprintw(LINE_TRACK_PREV+i, 0, (char *) "%s", key_bindings[i]);
clrtoeol(); clrtoeol();
} }
{ keypress_wait(p_cdio);
int key;
action("press any key to continue");
key = getch();
clrtobot();
action(NULL);
i_last_display_track = CDIO_INVALID_TRACK;
}
} }
static void static void
@@ -785,7 +836,7 @@ list_tracks(void)
int s; int s;
if (b_record) { if (b_record) {
i_line=LINE_TRACK_PREV; i_line=LINE_TRACK_PREV - 1;
for (i = i_first_track; i <= i_last_track; i++) { for (i = i_first_track; i <= i_last_track; i++) {
char line[80]; char line[80];
s = cdio_audio_get_msf_seconds(&toc[i+1]) s = cdio_audio_get_msf_seconds(&toc[i+1])
@@ -806,14 +857,7 @@ list_tracks(void)
mvprintw(i_line++, 0, line); mvprintw(i_line++, 0, line);
clrtoeol(); clrtoeol();
} }
{ keypress_wait(p_cdio);
int key;
action("press any key to continue");
switch (key = getch());
i_last_display_track = CDIO_INVALID_TRACK;
clrtobot();
action(NULL);
}
} }
} }
@@ -1298,6 +1342,12 @@ main(int argc, char *argv[])
printf("%s / %s\n", artist, title); printf("%s / %s\n", artist, title);
play_track(1,CDIO_CDROM_LEADOUT_TRACK); play_track(1,CDIO_CDROM_LEADOUT_TRACK);
break; break;
case CLOSE_CD:
cdio_close_tray(psz_device, NULL);
break;
case LIST_KEYS:
case LIST_TRACKS:
break;
} }
else { else {
fprintf(stderr,"no CD in drive (%s)\n", psz_device); fprintf(stderr,"no CD in drive (%s)\n", psz_device);
@@ -1309,7 +1359,7 @@ main(int argc, char *argv[])
int key; int key;
if (!b_cd) read_toc(p_cdio); if (!b_cd) read_toc(p_cdio);
read_subchannel(p_cdio); read_subchannel(p_cdio);
display_status(); display_status(false);
if (1 == select_wait(b_cd ? 1 : 5)) { if (1 == select_wait(b_cd ? 1 : 5)) {
switch (key = getch()) { switch (key = getch()) {
@@ -1320,7 +1370,7 @@ main(int argc, char *argv[])
case 'X': case 'X':
case 'x': case 'x':
nostop=1; nostop=1;
/* fall */ /* fall through */
case 'Q': case 'Q':
case 'q': case 'q':
b_sig = true; b_sig = true;