|
Packit |
dd8086 |
/* -*- C -*-
|
|
Packit |
dd8086 |
Copyright (C) 2004, 2006, 2008, 2010, 2011, 2012, 2017
|
|
Packit |
dd8086 |
Rocky Bernstein <rocky@gnu.org>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
dd8086 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
dd8086 |
the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
dd8086 |
(at your option) any later version.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
dd8086 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
dd8086 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
dd8086 |
GNU General Public License for more details.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
You should have received a copy of the GNU General Public License
|
|
Packit |
dd8086 |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/*
|
|
Packit |
dd8086 |
Example demonstrating the parsing of raw CD-Text files
|
|
Packit |
dd8086 |
Output adapted from cd-info.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
dd8086 |
#include "config.h"
|
|
Packit |
dd8086 |
#define __CDIO_CONFIG_H__ 1
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifdef HAVE_STDIO_H
|
|
Packit |
dd8086 |
#include <stdio.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_STDLIB_H
|
|
Packit |
dd8086 |
#include <stdlib.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#include <cdio/cdio.h>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#define CDTEXT_LEN_BINARY_MAX 9216
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
static void
|
|
Packit |
dd8086 |
print_cdtext_track_info(cdtext_t *p_cdtext, track_t i_track, const char *psz_msg) {
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (NULL != p_cdtext) {
|
|
Packit |
dd8086 |
cdtext_field_t i;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
printf("%s\n", psz_msg);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
for (i=0; i < MAX_CDTEXT_FIELDS; i++) {
|
|
Packit |
dd8086 |
if (cdtext_get_const(p_cdtext, i, i_track)) {
|
|
Packit |
dd8086 |
printf("\t%s: %s\n", cdtext_field2str(i), cdtext_get_const(p_cdtext, i, i_track));
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
static void
|
|
Packit |
dd8086 |
print_cdtext_info(cdtext_t *p_cdtext) {
|
|
Packit |
dd8086 |
track_t i_first_track = 0;
|
|
Packit |
dd8086 |
track_t i_last_track = 0;
|
|
Packit |
dd8086 |
cdtext_lang_t *languages;
|
|
Packit |
dd8086 |
cdtext_genre_t genre;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
int i, j;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
languages = cdtext_list_languages(p_cdtext);
|
|
Packit |
dd8086 |
for(i=0; i<8; i++)
|
|
Packit |
dd8086 |
if ( CDTEXT_LANGUAGE_UNKNOWN != languages[i]
|
|
Packit |
dd8086 |
&& cdtext_select_language(p_cdtext, languages[i]))
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
printf("\nLanguage %d '%s':\n", i, cdtext_lang2str(languages[i]));
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
print_cdtext_track_info(p_cdtext, 0, "CD-TEXT for Disc:");
|
|
Packit |
dd8086 |
genre = cdtext_get_genre(p_cdtext);
|
|
Packit |
dd8086 |
if ( CDTEXT_GENRE_UNUSED != genre)
|
|
Packit |
dd8086 |
printf("\tGENRE_CODE: %d (%s)\n", genre, cdtext_genre2str(genre));
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
i_first_track = cdtext_get_first_track(p_cdtext);
|
|
Packit |
dd8086 |
i_last_track = cdtext_get_last_track(p_cdtext);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
for ( j = i_first_track ; j <= i_last_track; j++ ) {
|
|
Packit |
dd8086 |
char msg[50];
|
|
Packit |
dd8086 |
sprintf(msg, "CD-TEXT for Track %2d:", j);
|
|
Packit |
dd8086 |
print_cdtext_track_info(p_cdtext, j, msg);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
static cdtext_t *
|
|
Packit |
dd8086 |
read_cdtext(const char *path) {
|
|
Packit |
dd8086 |
FILE *fp;
|
|
Packit |
dd8086 |
size_t size;
|
|
Packit |
dd8086 |
uint8_t cdt_data[CDTEXT_LEN_BINARY_MAX+4];
|
|
Packit |
dd8086 |
cdtext_t *cdt;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
fp = fopen(path, "rb");
|
|
Packit |
dd8086 |
if (NULL == fp) {
|
|
Packit |
dd8086 |
fprintf(stderr, "could not open file `%s'\n", path);
|
|
Packit |
dd8086 |
exit(3);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
size = fread(cdt_data, sizeof(uint8_t), sizeof(cdt_data), fp);
|
|
Packit |
dd8086 |
fclose(fp);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (size < 5) {
|
|
Packit |
dd8086 |
fprintf(stderr, "file `%s' is too small to contain CD-TEXT\n", path);
|
|
Packit |
dd8086 |
exit(1);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* Truncate header when it is too large. The standard is ambiguous here*/
|
|
Packit |
dd8086 |
if (cdt_data[0] > 0x80) {
|
|
Packit |
dd8086 |
size -= 4;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* ignore trailing 0 */
|
|
Packit |
dd8086 |
if (1 == size % 18)
|
|
Packit |
dd8086 |
size -= 1;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* init cdtext */
|
|
Packit |
dd8086 |
cdt = cdtext_init ();
|
|
Packit |
dd8086 |
if(0 != cdtext_data_init(cdt, cdt_data, size)) {
|
|
Packit |
dd8086 |
fprintf(stderr, "failed to parse CD-Text file `%s'\n", path);
|
|
Packit |
dd8086 |
free(cdt);
|
|
Packit |
dd8086 |
exit(2);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
return cdt;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
int
|
|
Packit |
dd8086 |
main(int argc, const char *argv[]) {
|
|
Packit |
dd8086 |
cdtext_t *cdt;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
char *cdt_path = NULL;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (argc > 1) {
|
|
Packit |
dd8086 |
cdt_path = (char *) argv[1];
|
|
Packit |
dd8086 |
}else{
|
|
Packit |
dd8086 |
fprintf(stderr, "no CD-Text file given\n");
|
|
Packit |
dd8086 |
exit(77);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
cdt = read_cdtext(cdt_path);
|
|
Packit |
dd8086 |
print_cdtext_info(cdt);
|
|
Packit |
dd8086 |
free(cdt);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
return 0;
|
|
Packit |
dd8086 |
}
|