diff options
-rw-r--r-- | toolame.c | 104 | ||||
-rw-r--r-- | toolame.h | 2 | ||||
-rw-r--r-- | xpad.c | 70 | ||||
-rw-r--r-- | xpad.h | 22 |
4 files changed, 149 insertions, 49 deletions
@@ -29,6 +29,8 @@ Bit_stream_struc bs; char *programName; char toolameversion[] = "0.2l-opendigitalradio"; +const int FPAD_LENGTH=2; + void global_init (void) { glopts.usepsy = TRUE; @@ -122,6 +124,8 @@ int main (int argc, char **argv) int lg_frame; int i; + char* mot_file = NULL; + /* Used to keep the SNR values for the fast/quick psy models */ static FLOAT smrdef[2][32]; @@ -161,9 +165,30 @@ int main (int argc, char **argv) short_usage (); else parse_args (argc, argv, &frame, &model, &num_samples, original_file_name, - encoded_file_name); + encoded_file_name, &mot_file); print_config (&frame, &model, original_file_name, encoded_file_name); + uint8_t* xpad_data = NULL; + if (mot_file != NULL) { + if (header.dab_length <= 0 || + header.dab_length > 58) { + fprintf(stderr, "Invalid XPAD length specified\n"); + return 1; + } + + int err = xpad_init(mot_file, header.dab_length); + if (err == -1) { + fprintf(stderr, "XPAD reader initialisation failed\n"); + return 1; + } + + xpad_data = malloc(header.dab_length); + } + int xpad_len = xpad_read_len(xpad_data, header.dab_length); + if (xpad_len == -1) { + return 1; + } + /* this will load the alloc tables and do some other stuff */ hdr_to_frps (&frame); nch = frame.nch; @@ -171,8 +196,19 @@ int main (int argc, char **argv) while (get_audio (musicin, buffer, num_samples, nch, &header) > 0) { if (glopts.verbosity > 1) - if (++frameNum % 10 == 0) - fprintf (stderr, "[%4u]\r", frameNum); + if (++frameNum % 10 == 0) { + if (mot_file) { + fprintf (stderr, "[%4u %s ]\r", + frameNum, + xpad_len > 0 ? "p" : " " + ); + } + else { + fprintf (stderr, "[%4u]\r", + frameNum); + } + } + fflush (stderr); win_buf[0] = &buffer[0][0]; win_buf[1] = &buffer[1][0]; @@ -397,24 +433,24 @@ int main (int argc, char **argv) for (i = 0; i < adb; i++) put1bit (&bs, 0); - uint8_t xpadbyte; if (header.dab_extension) { - if (xpad_len()) { + if (xpad_len) { /* Reserve some bytes for X-PAD in DAB mode */ - /* always fill it entirely - for (i=header.dab_length-xpad_len(); i>0; i--) { + assert(xpad_len > 2); + + for (i=header.dab_length-xpad_len+FPAD_LENGTH; i>0; i--) { putbits(&bs, 0, 8); } - */ - for (i = 0; i < header.dab_length; i++) { - xpadbyte = xpad_byte(); - putbits (&bs, xpadbyte, 8); + for (i = 0; i < xpad_len-FPAD_LENGTH; i++) { + putbits (&bs, xpad_data[i], 8); } } else { - fprintf(stderr, "error getting xpad!\n"); + for (i=header.dab_length; i>0; i--) { + putbits(&bs, 0, 8); + } } for (i = header.dab_extension - 1; i >= 0; i--) { @@ -425,13 +461,35 @@ int main (int argc, char **argv) /* reserved 2 bytes for F-PAD in DAB mode */ putbits (&bs, crc, 8); } - xpadbyte = xpad_byte(); - putbits (&bs, xpadbyte, 8); - xpadbyte = xpad_byte(); - putbits (&bs, xpadbyte, 8); - //header.dab_length = xpad_len(); // set xpad-length for next frame + if (xpad_len) { + /* The F-PAD is also given us by mot-encoder */ + putbits (&bs, xpad_data[xpad_len-2], 8); + putbits (&bs, xpad_data[xpad_len-1], 8); + } + else { + putbits (&bs, 0, 16); // FPAD is all-zero + } + + /* Check if we have new PAD data for the next frame + */ + if (mot_file) { + /* set xpad-length for next frame */ + int new_xpad_len = xpad_read_len(xpad_data, header.dab_length); + if (new_xpad_len == -1) { + fprintf(stderr, "Error reading XPAD data\n"); + xpad_len = 0; + } + else if (new_xpad_len == 0 || + new_xpad_len == header.dab_length) { + xpad_len = new_xpad_len; + } + else { + fprintf(stderr, "new xpad length=%d\n", new_xpad_len); + abort(); + } + } } frameBits = sstell (&bs) - sentBits; @@ -653,7 +711,7 @@ void short_usage (void) void parse_args (int argc, char **argv, frame_info * frame, int *psy, unsigned long *num_samples, char inPath[MAX_NAME_SIZE], - char outPath[MAX_NAME_SIZE]) + char outPath[MAX_NAME_SIZE], char **mot_file) { FLOAT srate; int brate; @@ -794,11 +852,11 @@ void parse_args (int argc, char **argv, frame_info * frame, int *psy, break; case 'P': argUsed = 1; + *mot_file = arg; break; case 'p': argUsed = 1; - const int fpad_len = 2; - header->dab_length = atoi(arg) - fpad_len; + header->dab_length = atoi(arg); break; case 'c': header->copyright = 1; @@ -809,12 +867,6 @@ void parse_args (int argc, char **argv, frame_info * frame, int *psy, case 'e': header->error_protection = TRUE; break; - case 'f': - *psy = 0; - /* this switch is deprecated? FIXME get rid of glopts.usepsy - instead us psymodel 0, i.e. "-y 0" */ - glopts.usepsy = FALSE; - break; case 'r': glopts.usepadbit = FALSE; header->padding = 0; @@ -6,7 +6,7 @@ void short_usage (void); void obtain_parameters (frame_info *, int *, unsigned long *, char[MAX_NAME_SIZE], char[MAX_NAME_SIZE]); void parse_args (int, char **, frame_info *, int *, unsigned long *, - char[MAX_NAME_SIZE], char[MAX_NAME_SIZE]); + char[MAX_NAME_SIZE], char[MAX_NAME_SIZE], char**); void print_config (frame_info *, int *, char[MAX_NAME_SIZE], char[MAX_NAME_SIZE]); void usage (void); @@ -6,6 +6,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <assert.h> +#include <errno.h> #include "xpad.h" @@ -22,31 +23,66 @@ static int xpad_fd = 0; it generates */ -int xpad_len() { - if (xpad_fd == 0) { - xpad_fd = open("/home/bram/dab/mot-slideshow.file", O_RDONLY); - if (xpad_fd < 0) { - perror("Failed to open xpad file"); - exit(1); +/* Create and open the desired PAD input fifo + */ +int xpad_init(char* pad_fifo, int pad_len) +{ + if (mkfifo(pad_fifo, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH) != 0) { + if (errno != EEXIST) { + fprintf(stderr, "Can't create pad file: %d!\n", errno); + return -1; } } - return 1; -} -uint8_t xpad_byte(void) { - uint8_t dat; + xpad_fd = open(pad_fifo, O_RDONLY | O_NONBLOCK); + if (xpad_fd == -1) { + fprintf(stderr, "Can't open pad file!\n"); + return -1; + } + + int flags = fcntl(xpad_fd, F_GETFL, 0); + if (fcntl(xpad_fd, F_SETFL, flags | O_NONBLOCK)) { + fprintf(stderr, "Can't set non-blocking mode in pad file!\n"); + return -1; + } + + return 0; +} +int xpad_read_len(uint8_t* buf, int len) +{ assert(xpad_fd != 0); - ssize_t num_read = read(xpad_fd, &dat, 1); - if (num_read == 0) { - fprintf(stderr, "xpad rewind\n"); - lseek(xpad_fd, 0, SEEK_SET); - num_read = read(xpad_fd, &dat, 1); + ssize_t num_read = 0; + + while (num_read < len) { + ssize_t r = read(xpad_fd, buf, len); + + if(r < 0) { + if (errno == EAGAIN) { + return 0; + } + else { + perror("PAD input read error"); + return -1; + } + } + else if (r == 0) { + // reached end of data + return 0; + } + + num_read += r; + } - assert(num_read == 1); +#if XPAD_DEBUG + int i; + for (i = 0; i < len; i++) { + fprintf(stderr, "%02x ", buf[i]); } + fprintf(stderr, "\n"); +#endif - return dat; + return num_read; } @@ -3,14 +3,26 @@ #include <stdint.h> -/* Return the number of bytes of x-pad data - * we have ready +/* Initialise the xpad reader + * + * pad_fifo is the filename of the FIFO that will be created, and + * can be used with mot-encoder. + * + * pad_len is the XPAD length, that also has to be given + * to mot-encoder. + * + * returns 0 on success + * -1 on failure */ -int xpad_len(void); +int xpad_init(char* pad_fifo, int pad_len); -/* Get one x-pad byte +/* Get len bytes of x-pad data, write into buf + * returns either + * - len if the read was sucessful + * - 0 if there was no data + * - -1 if there was an error (errno will be set) */ -uint8_t xpad_byte(void); +int xpad_read_len(uint8_t* buf, int len); #endif |