diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 4d0c8188..57df8223 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.66 2004/07/17 02:43:41 rocky Exp $ + $Id: _cdio_linux.c,v 1.67 2004/07/17 08:59:44 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.66 2004/07/17 02:43:41 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.67 2004/07/17 08:59:44 rocky Exp $"; #include @@ -681,16 +681,22 @@ _cdio_read_toc (_img_private_t *env) return true; } -#if 1 +static void +set_cdtext_field_linux(void *user_data, track_t i_track, + track_t i_first_track, + cdtext_field_t e_field, const char *psz_value) +{ + char **pp_field; + _img_private_t *env = user_data; + + if( i_track == 0 ) + pp_field = &(env->cdtext.field[e_field]); + + else + pp_field = &(env->cdtext_track[i_track-i_first_track].field[e_field]); -#define set_cdtext_field(FIELD) \ - if( i_track == 0 ) \ - env->cdtext.field[FIELD] = strdup(buffer); \ - else \ - env->cdtext_track[i_track-1].field[FIELD] \ - = strdup(buffer); \ - i_track++; \ - idx = 0; + *pp_field = strdup(psz_value); +} /* Read cdtext information for a CdIo object . @@ -724,68 +730,9 @@ _init_cdtext_linux (_img_private_t *env) cdio_warn ("CDTEXT reading failed: %s\n", strerror(errno)); return false; } else { - - CDText_data_t *pdata; - int i; - int j; - char buffer[256]; - int idx; - int i_track; - - printf("READ CDTEXT!\n"); - memset( buffer, 0x00, sizeof(buffer) ); - idx = 0; - - pdata = (CDText_data_t *) (&scsi_cmd.wdata[4]); - for( i=0; i < CDIO_CDTEXT_MAX_PACK_DATA; i++ ) { - if( pdata->seq != i ) - break; - - if( (pdata->type >= 0x80) - && (pdata->type <= 0x85) && (pdata->block == 0) ) { - i_track = pdata->i_track; - - for( j=0; j < CDIO_CDTEXT_MAX_TEXT_DATA; j++ ) { - if( pdata->text[j] == 0x00 ) - { - switch( pdata->type) { - case CDIO_CDTEXT_TITLE: - set_cdtext_field(CDTEXT_TITLE); - break; - case CDIO_CDTEXT_PERFORMER: - set_cdtext_field(CDTEXT_PERFORMER); - break; - case CDIO_CDTEXT_SONGWRITER: - set_cdtext_field(CDTEXT_SONGWRITER); - break; - case CDIO_CDTEXT_COMPOSER: - set_cdtext_field(CDTEXT_COMPOSER); - break; - case CDIO_CDTEXT_ARRANGER: - set_cdtext_field(CDTEXT_ARRANGER); - break; - case CDIO_CDTEXT_MESSAGE: - set_cdtext_field(CDTEXT_MESSAGE); - break; - case CDIO_CDTEXT_DISCID: - set_cdtext_field(CDTEXT_DISCID); - break; - case CDIO_CDTEXT_GENRE: - set_cdtext_field(CDTEXT_GENRE); - break; - } - } - else { - buffer[idx++] = pdata->text[j]; - } - buffer[idx] = 0x00; - } - } - pdata++; - } + return cdtext_data_init(env, FIRST_TRACK_NUM, scsi_cmd.wdata, + set_cdtext_field_linux); } - - return true; } /*! @@ -815,8 +762,6 @@ _get_cdtext_linux (void *user_data, track_t i_track) } -#endif - /* * Eject using SCSI commands. Return 1 if successful, 0 otherwise. */ diff --git a/lib/cdtext.c b/lib/cdtext.c index 07155aea..30baac73 100644 --- a/lib/cdtext.c +++ b/lib/cdtext.c @@ -1,5 +1,5 @@ /* - $Id: cdtext.c,v 1.5 2004/07/16 21:29:25 rocky Exp $ + $Id: cdtext.c,v 1.6 2004/07/17 08:59:44 rocky Exp $ Copyright (C) 2004 Rocky Bernstein toc reading routine adapted from cuetools @@ -26,6 +26,7 @@ #include #include +#include "cdtext_private.h" #ifdef HAVE_STDLIB_H #include @@ -130,7 +131,8 @@ cdtext_is_keyword (const char *key) /*! sets cdtext's keyword entry to field. */ -void cdtext_set (cdtext_field_t key, const char *value, cdtext_t *cdtext) +void +cdtext_set (cdtext_field_t key, const char *value, cdtext_t *cdtext) { if (NULL == value || key == CDTEXT_INVALID) return; @@ -139,3 +141,77 @@ void cdtext_set (cdtext_field_t key, const char *value, cdtext_t *cdtext) } +#define SET_CDTEXT_FIELD(FIELD) \ + (*set_cdtext_field_fn)(user_data, i_track, i_first_track, FIELD, buffer); + +bool +cdtext_data_init(void *user_data, track_t i_first_track, + const unsigned char *wdata, + set_cdtext_field_fn_t set_cdtext_field_fn) +{ + CDText_data_t *pdata; + int i; + int j; + char buffer[256]; + int idx; + int i_track; + bool b_ret = false; + + memset( buffer, 0x00, sizeof(buffer) ); + idx = 0; + + pdata = (CDText_data_t *) (&wdata[4]); + for( i=0; i < CDIO_CDTEXT_MAX_PACK_DATA; i++ ) { + if( pdata->seq != i ) + break; + + if( (pdata->type >= 0x80) + && (pdata->type <= 0x85) && (pdata->block == 0) ) { + i_track = pdata->i_track; + + for( j=0; j < CDIO_CDTEXT_MAX_TEXT_DATA; j++ ) { + if( pdata->text[j] == 0x00 ) { + bool b_field_set=true; + switch( pdata->type) { + case CDIO_CDTEXT_TITLE: + SET_CDTEXT_FIELD(CDTEXT_TITLE); + break; + case CDIO_CDTEXT_PERFORMER: + SET_CDTEXT_FIELD(CDTEXT_PERFORMER); + break; + case CDIO_CDTEXT_SONGWRITER: + SET_CDTEXT_FIELD(CDTEXT_SONGWRITER); + break; + case CDIO_CDTEXT_COMPOSER: + SET_CDTEXT_FIELD(CDTEXT_COMPOSER); + break; + case CDIO_CDTEXT_ARRANGER: + SET_CDTEXT_FIELD(CDTEXT_ARRANGER); + break; + case CDIO_CDTEXT_MESSAGE: + SET_CDTEXT_FIELD(CDTEXT_MESSAGE); + break; + case CDIO_CDTEXT_DISCID: + SET_CDTEXT_FIELD(CDTEXT_DISCID); + break; + case CDIO_CDTEXT_GENRE: + SET_CDTEXT_FIELD(CDTEXT_GENRE); + break; + default : b_field_set = false; + } + if (b_field_set) { + b_ret = true; + i_track++; + idx = 0; + } + } else { + buffer[idx++] = pdata->text[j]; + } + buffer[idx] = 0x00; + } + } + pdata++; + } + return b_ret; +} + diff --git a/lib/cdtext_private.h b/lib/cdtext_private.h index 4bf747be..6ab25db9 100644 --- a/lib/cdtext_private.h +++ b/lib/cdtext_private.h @@ -1,5 +1,5 @@ /* - $Id: cdtext_private.h,v 1.1 2004/07/09 01:05:32 rocky Exp $ + $Id: cdtext_private.h,v 1.2 2004/07/17 08:59:44 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -37,10 +37,6 @@ PRAGMA_BEGIN_PACKED -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - struct CDText_data { uint8_t type; @@ -57,6 +53,19 @@ PRAGMA_END_PACKED typedef struct CDText_data CDText_data_t; +typedef void (*set_cdtext_field_fn_t) (void *user_data, track_t i_track, + track_t i_first_track, + cdtext_field_t field, + const char *buffer); + +/* + Internal routine to parse all CD-TEXT data retrieved. +*/ +bool cdtext_data_init(void *user_data, track_t i_first_track, + const unsigned char *wdata, + set_cdtext_field_fn_t set_cdtext_field_fn); + + #endif /* __CDIO_CDTEXT_PRIVATE_H__ */ /*