diff --git a/example/C++/OO/cdtext.cpp b/example/C++/OO/cdtext.cpp index 17053294..227aeef0 100644 --- a/example/C++/OO/cdtext.cpp +++ b/example/C++/OO/cdtext.cpp @@ -21,83 +21,93 @@ */ #ifdef HAVE_CONFIG_H #include "config.h" +#define __CDIO_CONFIG_H__ 1 #endif #ifdef HAVE_STDIO_H #include #endif -#ifdef HAVE_SYS_TYPES_H -#include -#endif #include /* Set up a CD-DA image to test on which is in the libcdio distribution. */ -#define CDDA_IMAGE_PATH "../../../test/" -#define CDDA_IMAGE CDDA_IMAGE_PATH "cdda.cue" +#define CDDA_IMAGE "../../../test/data/cdtext.cue" static void -print_cdtext_track_info(CdioDevice *device, track_t i_track, - const char *psz_msg) { - cdtext_t *cdtext = device->getCdtext(); - if (NULL != cdtext) { - cdtext_field_t i; - - printf("%s\n", psz_msg); - - for (i= (cdtext_field_t) MIN_CDTEXT_FIELD; i < MAX_CDTEXT_FIELDS; i++) { - if (cdtext_get_const(i, i_track, cdtext)) { - printf("\t%s: %s\n", cdtext_field2str(i), - cdtext_get_const(i, i_track, cdtext)); - } +print_cdtext_track_info(CdioCDText *cdtext, track_t i_track) { + cdtext_field_t i; + + for (i=(cdtext_field_t) 0; i < MAX_CDTEXT_FIELDS; i++) { + if (cdtext->getConst(i, i_track)) { + printf("\t%s: %s\n", cdtext->field2str(i), + cdtext->getConst(i, i_track)); } } } static void -print_disc_info(CdioDevice *device, track_t i_tracks, track_t i_first_track) { +print_disc_info(CdioDevice *device) +{ + track_t i_first_track = device->getFirstTrackNum(); + track_t i_tracks = device->getNumTracks(); track_t i_last_track = i_first_track+i_tracks; discmode_t cd_discmode = device->getDiscmode(); + CdioCDText *cdtext = device->getCdtext(); + int i; - printf("%s\n", discmode2str[cd_discmode]); - - print_cdtext_track_info(device, 0, "\nCD-Text for Disc:"); - for ( ; i_first_track < i_last_track; i_first_track++ ) { - char psz_msg[50]; - sprintf(psz_msg, "CD-Text for Track %d:", i_first_track); - print_cdtext_track_info(device, i_first_track, psz_msg); + printf("Discmode: %s\n\n", discmode2str[cd_discmode]); + + if (NULL == cdtext) + { + printf("No CD-Text found on Disc.\n"); + return; } + + /* print available languages */ + { + cdtext_lang_t *languages; + + printf("CD-Text available in: "); + + languages = cdtext->listLanguages(); + for(i=0; i<8; i++) + if ( CDTEXT_LANGUAGE_UNKNOWN != languages[i]) + printf("%s ", cdtext->lang2str(languages[i])); + printf("\n"); + } + + printf("CD-Text for Disc:\n"); + print_cdtext_track_info(cdtext, 0); + for (i = i_first_track ; i < i_last_track; i++ ) { + printf("CD-Text for Track %d:\n", i); + print_cdtext_track_info(cdtext, i); + } + + delete cdtext; } int main(int argc, const char *argv[]) { - track_t i_first_track; - track_t i_tracks; CdioDevice *device = new CdioDevice; - const char *psz_drive = NULL; + const char *psz_drive = (const char *) NULL; if (!device->open(CDDA_IMAGE, DRIVER_BINCUE)) { printf("Couldn't open " CDDA_IMAGE " with BIN/CUE driver.\n"); } else { - i_first_track = device->getFirstTrackNum(); - i_tracks = device->getNumTracks(); - print_disc_info(device, i_tracks, i_first_track); + print_disc_info(device); } if (argc > 1) psz_drive = argv[1]; if (!device->open(psz_drive, DRIVER_DEVICE)) { printf("Couldn't find CD\n"); - delete(device); return 1; } else { - i_first_track = device->getFirstTrackNum(); - i_tracks = device->getNumTracks(); - print_disc_info(device, i_tracks, i_first_track); + print_disc_info(device); } - delete(device); + delete device; return 0; } diff --git a/example/cdtext.c b/example/cdtext.c index 01e323e3..ec080f00 100644 --- a/example/cdtext.c +++ b/example/cdtext.c @@ -20,6 +20,7 @@ libcdio. See also corresponding C++ programs of similar names. */ #define EXAMPLE_CUE_FILE "../test/data/cdtext.cue" +#define EXAMPLE_PREF_LANG "German" #ifdef HAVE_CONFIG_H #include "config.h" @@ -29,19 +30,13 @@ #ifdef HAVE_STDIO_H #include #endif -#ifdef HAVE_SYS_TYPES_H -#include -#endif #include -#include static void -print_cdtext_track_info(cdtext_t *cdtext, track_t i_track, const char *psz_msg) { +print_cdtext_track_info(cdtext_t *cdtext, track_t i_track) { cdtext_field_t i; - printf("%s\n", psz_msg); - for (i=0; i < MAX_CDTEXT_FIELDS; i++) { if (cdtext_get_const(cdtext, i, i_track)) { printf("\t%s: %s\n", cdtext_field2str(i), @@ -52,55 +47,55 @@ print_cdtext_track_info(cdtext_t *cdtext, track_t i_track, const char *psz_msg) } static void -print_disc_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) { - track_t i_last_track = i_first_track+i_tracks; - discmode_t cd_discmode = cdio_get_discmode(p_cdio); - cdtext_t *cdtext = cdio_get_cdtext(p_cdio); +print_disc_info(CdIo_t *p_cdio) { + track_t i_first_track = cdio_get_first_track_num (p_cdio); + track_t i_tracks = cdio_get_num_tracks (p_cdio); + track_t i_last_track = i_first_track + i_tracks; + discmode_t cd_discmode = cdio_get_discmode (p_cdio); + cdtext_t *cdtext = cdio_get_cdtext (p_cdio); int i; - printf("Discmode: %s\n", discmode2str[cd_discmode]); + printf("Discmode: %s\n\n", discmode2str[cd_discmode]); if (NULL == cdtext) { - printf("\nNo CD-Text found on Disc."); + printf("No CD-Text found on Disc.\n"); return; } - - /* print available languages */ - { - cdtext_lang_t *languages; - printf("\nCD-Text available in: "); + /* print available languages */ + { + cdtext_lang_t *languages; - languages = cdtext_languages_available(cdtext); - for(i=0; i<8; i++) - if ( CDTEXT_LANGUAGE_UNKNOWN != languages[i]) - printf("%s ", cdtext_lang2str(languages[i])); - printf("\n"); - } + printf("CD-Text available in: "); - /* select language */ - if(cdtext_select_language(cdtext, "German")) { - printf("%s selected.\n", "German"); - } else { - printf("'%s' is not available. Using '%s'\n", "German", - cdtext_lang2str (cdtext_get_language (cdtext))); - } - - /* print cd-text */ - print_cdtext_track_info(cdtext, 0, "CD-Text for Disc:"); - for (i=i_first_track ; i < i_last_track; i++ ) { - char psz_msg[50]; - snprintf(psz_msg, sizeof(psz_msg), "CD-Text for Track %d:", i); - print_cdtext_track_info(cdtext, i, psz_msg); + languages = cdtext_list_languages(cdtext); + for(i=0; i<8; i++) + if ( CDTEXT_LANGUAGE_UNKNOWN != languages[i]) + printf("%s ", cdtext_lang2str(languages[i])); + printf("\n"); + } + + /* select language */ + if(cdtext_select_language(cdtext, EXAMPLE_PREF_LANG)) { + printf("%s selected.\n", EXAMPLE_PREF_LANG); + } else { + printf("'%s' is not available. Using '%s'\n", EXAMPLE_PREF_LANG, + cdtext_lang2str (cdtext_get_language (cdtext))); + } + + /* print cd-text */ + printf("CD-Text for Disc:\n"); + print_cdtext_track_info(cdtext, 0); + for (i=i_first_track ; i < i_last_track; i++ ) { + printf("CD-Text for Track %d\n:", i); + print_cdtext_track_info(cdtext, i); } } int main(int argc, const char *argv[]) { - track_t i_first_track; - track_t i_tracks; CdIo_t *p_cdio; /* read CD-Text from a bin/cue (CDRWIN) image */ @@ -109,9 +104,7 @@ main(int argc, const char *argv[]) printf("Couldn't open %s with BIN/CUE driver.\n", EXAMPLE_CUE_FILE); } else { - i_first_track = cdio_get_first_track_num(p_cdio); - i_tracks = cdio_get_num_tracks(p_cdio); - print_disc_info(p_cdio, i_tracks, i_first_track); + print_disc_info(p_cdio); cdio_destroy(p_cdio); } @@ -121,12 +114,9 @@ main(int argc, const char *argv[]) printf("Couldn't find CD\n"); return 77; } else { - i_first_track = cdio_get_first_track_num(p_cdio); - i_tracks = cdio_get_num_tracks(p_cdio); - print_disc_info(p_cdio, i_tracks, i_first_track); + print_disc_info(p_cdio); + cdio_destroy(p_cdio); } - cdio_destroy(p_cdio); - return 0; } diff --git a/include/cdio++/cdio.hpp b/include/cdio++/cdio.hpp index acb28900..66abc366 100644 --- a/include/cdio++/cdio.hpp +++ b/include/cdio++/cdio.hpp @@ -101,9 +101,12 @@ void possible_throw_device_exception(driver_return_code_t drc); class CdioCDText { public: - CdioCDText() + CdioCDText(cdtext_t *cdtext) { - p_cdtext = cdtext_init(); // make sure we're initialized on the C side + if (NULL == cdtext) + cdtext = cdtext_init(); + + p_cdtext = cdtext; } ~CdioCDText() diff --git a/include/cdio++/cdtext.hpp b/include/cdio++/cdtext.hpp index 93a3fa26..263c2ac9 100644 --- a/include/cdio++/cdtext.hpp +++ b/include/cdio++/cdtext.hpp @@ -52,12 +52,6 @@ char *get (cdtext_field_t key, track_t i_track) return cdtext_get (p_cdtext, key, i_track); } -/*! returns the C cdtext_t pointer associated with this object. */ -cdtext_t *get () -{ - return p_cdtext; -} - /*! returns a const string associated with the given field. NULL is returned if key is CDTEXT_INVALID or the field is not set. @@ -81,6 +75,30 @@ void set (cdtext_field_t key, track_t i_track, const uint8_t *value, const char cdtext_set (p_cdtext, key, value, i_track, charset); } +/*! + returns the selected language +*/ +cdtext_lang_t getLanguage() +{ + return cdtext_get_language(p_cdtext); +} + +/*! + selects a language +*/ +bool selectLanguage(const char *lang) +{ + return cdtext_select_language(p_cdtext, lang); +} + +/*! + returns a list of available languages +*/ +cdtext_lang_t *listLanguages() +{ + return cdtext_list_languages(p_cdtext); +} + /* * Local variables: diff --git a/include/cdio++/disc.hpp b/include/cdio++/disc.hpp index a423e96c..a554522b 100644 --- a/include/cdio++/disc.hpp +++ b/include/cdio++/disc.hpp @@ -170,13 +170,18 @@ bool isDiscmodeDvd (discmode_t discmode) } /*! - * Get CD-Text information for a CdIo_t object. - * - * @return the CD-Text object or NULL if obj is NULL - * or CD-Text information does not exist. - * */ -cdtext_t *getCdtext () + Get CD-Text information for a CdIo_t object. + + @return the CD-Text object or NULL if obj is NULL + or CD-Text information does not exist. + */ +CdioCDText *getCdtext () { - return cdio_get_cdtext (p_cdio); + cdtext_t *cdtext = cdio_get_cdtext (p_cdio); + + if (NULL == cdtext) + return (CdioCDText *) NULL; + else + return new CdioCDText(cdtext); } diff --git a/include/cdio/cdtext.h b/include/cdio/cdtext.h index 42cf9aa1..916eebc1 100644 --- a/include/cdio/cdtext.h +++ b/include/cdio/cdtext.h @@ -286,7 +286,7 @@ bool cdtext_select_language(cdtext_t *p_cdtext, const char *lang); @param p_cdtext the CD-TEXT object */ -cdtext_lang_t *cdtext_languages_available (const cdtext_t *p_cdtext); +cdtext_lang_t *cdtext_list_languages (const cdtext_t *p_cdtext); /*! Sets the given field at the given track to the given value. diff --git a/lib/driver/cdtext.c b/lib/driver/cdtext.c index 1d7ce680..0986bd96 100644 --- a/lib/driver/cdtext.c +++ b/lib/driver/cdtext.c @@ -318,7 +318,7 @@ cdtext_get_language(const cdtext_t *p_cdtext) @param p_cdtext the CD-TEXT object */ cdtext_lang_t -*cdtext_languages_available(const cdtext_t *p_cdtext) +*cdtext_list_languages(const cdtext_t *p_cdtext) { static cdtext_lang_t avail[CDTEXT_NUM_BLOCKS_MAX]; int i, j=0; diff --git a/lib/driver/libcdio.sym b/lib/driver/libcdio.sym index 79dcff28..f2aff961 100644 --- a/lib/driver/libcdio.sym +++ b/lib/driver/libcdio.sym @@ -188,7 +188,7 @@ cdtext_get cdtext_get_const cdtext_get_language cdtext_init -cdtext_languages_available +cdtext_list_languages cdtext_set cdtext_select_language debug_cdio_mmc_feature diff --git a/src/cd-info.c b/src/cd-info.c index 6a3d52f7..a120c8bd 100644 --- a/src/cd-info.c +++ b/src/cd-info.c @@ -442,7 +442,7 @@ print_cdtext_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) { return; } - languages = cdtext_languages_available(p_cdtext); + languages = cdtext_list_languages(p_cdtext); for(i=0; i<8; i++) if ( CDTEXT_LANGUAGE_UNKNOWN != languages[i] && cdtext_select_language(p_cdtext, cdtext_lang2str(languages[i])))