From 775eb175b60753632fdbce4a83d931bcb31b77af Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 6 Jan 2012 12:59:20 +0000 Subject: [PATCH] Implemented data extraction from cue sheet FILE type WAVE --- cdrskin/cdrskin.1 | 4 +- cdrskin/cdrskin_timestamp.h | 2 +- doc/cdtext.txt | 6 +-- libburn/libburn.h | 9 ++-- libburn/structure.c | 92 ++++++++++++++++++++++++++++++++----- 5 files changed, 91 insertions(+), 22 deletions(-) diff --git a/cdrskin/cdrskin.1 b/cdrskin/cdrskin.1 index 83c2a02..639bcf8 100644 --- a/cdrskin/cdrskin.1 +++ b/cdrskin/cdrskin.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH CDRSKIN 1 "Jan 04, 2012" +.TH CDRSKIN 1 "Jan 06, 2012" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -509,7 +509,7 @@ present. .br cdrskin currently supports TRACK datatypes AUDIO and MODE1/2048 which may not be mixed. It ignores commands POSTGAP and PREGAP. -Data source may be of FILE type BINARY or MOTOROLA. +Data source may be of FILE type BINARY, MOTOROLA, or WAVE. .br Non-CDRWIN commands ARRANGER, COMPOSER, MESSAGE are supported. .br diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index b4b36a6..9bffd14 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2012.01.05.140927" +#define Cdrskin_timestamP "2012.01.06.125849" diff --git a/doc/cdtext.txt b/doc/cdtext.txt index 516d753..2ae3715 100644 --- a/doc/cdtext.txt +++ b/doc/cdtext.txt @@ -6,8 +6,8 @@ by reading mmc3r10g.pdf from http://www.t10.org/ftp/t10/drafts/mmc3/ by docs and results of cdtext.zip from http://www.sonydadc.com/file/ by reading http://digitalx.org/cue-sheet/syntax by reading source of libcdio from http://www.gnu.org/s/libcdio -which quotes source of cdrecord from ftp://ftp.berlios.de/pub/cdrecord/alpha -by reading man cdrecord from ftp://ftp.berlios.de/pub/cdrecord/alpha + which quotes source of cdrecord from ftp://ftp.berlios.de/pub/cdrecord/alpha +by reading cdrecord.1 from ftp://ftp.berlios.de/pub/cdrecord/alpha Language codes were learned from http://tech.ebu.ch/docs/tech/tech3264.pdf Genre codes were learned from libcdio and confirmed by @@ -673,7 +673,7 @@ TITLE "Joyful Nights" Several restrictions apply in the libburn call burn_session_by_cue_file(): Commands POSTGAP, PREGAP are ignored. -Only FILE types BINARY, MOTOROLA are allowed. +Only FILE types BINARY, MOTOROLA, WAVE are allowed. Only TRACK datatypes AUDIO, MODE1/2048 are allowed. They may not be mixed in the same session. diff --git a/libburn/libburn.h b/libburn/libburn.h index 4ca4b97..812b343 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -1866,16 +1866,14 @@ int burn_disc_remove_session(struct burn_disc *d, struct burn_session *s); http://digitalx.org/cue-sheet/syntax/ >>> fully supported commands: CATALOG CDTEXTFILE FLAGS INDEX ISRC PERFORMER REM >>> SONGWRITER TITLE +>>> supported commands introduced by cdrecord: ARRANGER COMPOSER MESSAGE >>> partly supported commands: FILE TRACK ->>> supported FILE types: BINARY MOTOROLA +>>> supported FILE types: BINARY MOTOROLA WAVE >>> supported TRACK datatypes: AUDIO MODE1/2048 >>> ignored commands: POSTGAP PREGAP >>> not allowed: mixing of ADUIO and MODE1/2048 >>> not allowed: unsupported FILE types >>> not allowed: unsupported TRACK datatypes ->>> ->>> man cdrecord documents further commands: ->>> ARRANGER COMPOSER MESSAGE >>> @param session Session where to attach tracks. It must not yet have tracks or else this call will fail. @@ -3785,7 +3783,8 @@ int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag); @param num_channels e.g. 1=mono, 2=stereo, etc @param sample_rate e.g. 11025, 44100 @param bits_per_sample e.g. 8= 8 bits per sample, 16= 16 bits ... - @param msb_first Byte order of samples: 0=Intel 1=Motorola + @param msb_first Byte order of samples: 0= Intel = Little Endian + 1= Motorola = Big Endian @param flag Bitfield for control purposes (unused yet, submit 0) @return >0 success, <=0 failure @since 0.2.4 diff --git a/libburn/structure.c b/libburn/structure.c index 315a5a2..45fb9a4 100644 --- a/libburn/structure.c +++ b/libburn/structure.c @@ -1277,6 +1277,70 @@ ex: } +/* @param flag bit0-7: desired type : 0=any , 1=.wav +*/ +static int cue_open_audioxtr(char *path, struct burn_cue_file_cursor *crs, + int *fd, int flag) +{ + struct libdax_audioxtr *xtr= NULL; + char *fmt, *fmt_info; + int ret, num_channels, sample_rate, bits_per_sample, msb_first; + char *msg = NULL; + + BURN_ALLOC_MEM(msg, char, 4096); + + /* >>> obtain fd by libdax_audioxtr */; + ret= libdax_audioxtr_new(&xtr, path, 0); + if (ret <= 0) + return ret; + libdax_audioxtr_get_id(xtr, &fmt, &fmt_info, &num_channels, + &sample_rate, &bits_per_sample, &msb_first, 0); + if ((flag & 255) == 1) { + if (strcmp(fmt, ".wav") != 0) { + sprintf(msg, + "In cue sheet: Not recognized as WAVE : FILE '%.4000s'", + path); + libdax_msgs_submit(libdax_messenger, -1, 0x00020193, + LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, + burn_printify(msg), 0, 0); + ret = 0; goto ex; + } + } + ret = libdax_audioxtr_get_size(xtr, &(crs->source_size), 0); + if (ret <= 0) { + sprintf(msg, + "In cue sheet: Cannot get payload size of FILE '%.4000s'", + path); + libdax_msgs_submit(libdax_messenger, -1, 0x00020193, + LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, + burn_printify(msg), 0, 0); + ret = 0; goto ex; + } + ret = libdax_audioxtr_detach_fd(xtr, fd, 0); + if (ret <= 0) { + sprintf(msg, + "In cue sheet: Cannot represent payload as plain fd: FILE '%.4000s'", + path); + libdax_msgs_submit(libdax_messenger, -1, 0x00020193, + LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, + burn_printify(msg), 0, 0); + ret = 0; goto ex; + } + crs->swap_audio_bytes = (msb_first == 1); + + ret = 1; +ex: + if (xtr != NULL) + libdax_audioxtr_destroy(&xtr, 0); + BURN_FREE_MEM(msg); + return ret; +} + + +/* @param flag bit0-7: desired type : 0=any , 1=.wav + bit8= open by libdax_audioxtr functions + +*/ static int cue_create_file_source(char *path, struct burn_cue_file_cursor *crs, int flag) { @@ -1285,13 +1349,21 @@ static int cue_create_file_source(char *path, struct burn_cue_file_cursor *crs, BURN_ALLOC_MEM(msg, char, 4096); - fd = open(path, O_RDONLY); - if (fd == -1) { - sprintf(msg, "In cue sheet: Cannot open FILE '%.4000s'", path); - libdax_msgs_submit(libdax_messenger, -1, 0x00020193, + if (flag & 256) { + ret = cue_open_audioxtr(path, crs, &fd, flag & 255); + if (ret <= 0) + goto ex; + } else { + fd = open(path, O_RDONLY); + if (fd == -1) { + sprintf(msg, + "In cue sheet: Cannot open FILE '%.4000s'", + path); + libdax_msgs_submit(libdax_messenger, -1, 0x00020193, LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH, burn_printify(msg), errno, 0); - ret = 0; goto ex; + ret = 0; goto ex; + } } crs->file_source = burn_fd_source_new(fd, -1, crs->source_size); if (crs->file_source == NULL) { @@ -1309,7 +1381,7 @@ static int cue_interpret_line(struct burn_session *session, char *line, struct burn_cue_file_cursor *crs, int flag) { int ret, mode, index_no, minute, second, frame, file_ba, chunks; - int block_size, step; + int block_size, step, audio_xtr = 0; off_t size; char *cmd, *apt, *msg = NULL, msf[3], *msf_pt, *cpt, *filetype; struct burn_source *src, *inp_src; @@ -1399,10 +1471,8 @@ out_of_mem:; crs->swap_audio_bytes = 0; } else if (strcmp(filetype, "MOTOROLA") == 0) { crs->swap_audio_bytes = 1; - } else if (strcmp(filetype, "WAVE") == 0 && 0 ) { - - /* >>> Use libdax_audioxtr_* functions to extract */; - + } else if (strcmp(filetype, "WAVE") == 0) { + audio_xtr = 0x101; } else { sprintf(msg, "In cue sheet file: Unsupported FILE type '%.4000s'", @@ -1436,7 +1506,7 @@ not_usable_file:; crs->source_file = strdup(apt); if (crs->source_file == NULL) goto out_of_mem; - ret = cue_create_file_source(apt, crs, 0); + ret = cue_create_file_source(apt, crs, audio_xtr); if (ret <= 0) goto ex;