summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stream/stream_cdda.c68
1 files changed, 51 insertions, 17 deletions
diff --git a/stream/stream_cdda.c b/stream/stream_cdda.c
index a4faa4047c..0fcd3dbc9b 100644
--- a/stream/stream_cdda.c
+++ b/stream/stream_cdda.c
@@ -19,8 +19,11 @@
#include "config.h"
#include <cdio/cdda.h>
#include <cdio/paranoia.h>
+#include <cdio/cdio.h>
+
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include "talloc.h"
@@ -112,6 +115,49 @@ const m_option_t cdda_opts[] = {
{NULL, NULL, 0, 0, 0, 0, NULL}
};
+static const char *cdtext_name[] = {
+ [CDTEXT_ARRANGER] = "Arranger",
+ [CDTEXT_COMPOSER] = "Composer",
+ [CDTEXT_MESSAGE] = "Message",
+ [CDTEXT_ISRC] = "ISRC",
+ [CDTEXT_PERFORMER] = "Performer",
+ [CDTEXT_SONGWRITER] = "Songwriter",
+ [CDTEXT_TITLE] = "Title",
+ [CDTEXT_UPC_EAN] = "UPC_EAN",
+};
+
+static bool print_cdtext(stream_t *s, int track)
+{
+ cdda_priv* p = (cdda_priv*)s->priv;
+ cdtext_t *text = cdio_get_cdtext(p->cd->p_cdio, track);
+ if (text) {
+ mp_msg(MSGT_SEEK, MSGL_INFO, "CD-Text (%s):\n", track ? "track" : "CD");
+ for (int i = 0; i < sizeof(cdtext_name) / sizeof(cdtext_name[0]); i++) {
+ const char *name = cdtext_name[i];
+ const char *value = cdtext_get_const(i, text);
+ if (name && value)
+ mp_msg(MSGT_SEEK, MSGL_INFO, " %s: '%s'\n", name, value);
+ }
+ return true;
+ }
+ return false;
+}
+
+static void print_track_info(stream_t *s, int track)
+{
+ cdda_priv* p = (cdda_priv*)s->priv;
+ cd_track_t *cd_track = cd_info_get_track(p->cd_info, track);
+ if( cd_track!=NULL ) {
+ mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name);
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n",
+ cd_track->track_nb);
+ }
+ if (print_cdtext(s, track)) {
+ // hack for term OSD overwriting the last line of CDTEXT
+ mp_msg(MSGT_SEEK, MSGL_INFO, "\n");
+ }
+}
+
static void cdparanoia_callback(long int inpos, paranoia_cb_mode_t function)
{
}
@@ -119,7 +165,6 @@ static void cdparanoia_callback(long int inpos, paranoia_cb_mode_t function)
static int fill_buffer(stream_t *s, char *buffer, int max_len)
{
cdda_priv *p = (cdda_priv *)s->priv;
- cd_track_t *cd_track;
int16_t *buf;
int i;
@@ -142,12 +187,7 @@ static int fill_buffer(stream_t *s, char *buffer, int max_len)
for (i = 0; i < p->cd->tracks; i++) {
if (p->cd->disc_toc[i].dwStartSector == p->sector - 1) {
- cd_track = cd_info_get_track(p->cd_info, i + 1);
- if (cd_track != NULL) {
- mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name);
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n",
- cd_track->track_nb);
- }
+ print_track_info(s, i + 1);
break;
}
}
@@ -158,7 +198,6 @@ static int fill_buffer(stream_t *s, char *buffer, int max_len)
static int seek(stream_t *s, off_t newpos)
{
cdda_priv *p = (cdda_priv *)s->priv;
- cd_track_t *cd_track;
int sec;
int current_track = 0, seeked_track = 0;
int seek_to_track = 0;
@@ -183,15 +222,8 @@ static int seek(stream_t *s, off_t newpos)
seek_to_track = sec == p->cd->disc_toc[i].dwStartSector;
}
}
- if (current_track != seeked_track && !seek_to_track) {
- cd_track = cd_info_get_track(p->cd_info, seeked_track + 1);
- if (cd_track != NULL) {
- mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name);
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n",
- cd_track->track_nb);
- }
-
- }
+ if (current_track != seeked_track && !seek_to_track)
+ print_track_info(s, seeked_track + 1);
p->sector = sec;
@@ -441,6 +473,8 @@ static int open_cdda(stream_t *st, int m, void *opts, int *file_format)
m_struct_free(&stream_opts, opts);
+ print_cdtext(st, 0);
+
return STREAM_OK;
}