int main(int argc, char **argv) { char *line = NULL; size_t len = 0; ssize_t read = 0; bool flush_at_end = false; int n = 0; while (n >= 0) { n = getopt_long(argc, argv, "hfV", options, NULL); if (n < 0) continue; switch (n) { case 'f': flush_at_end = true; break; case 'V': fprintf(stdout, "%s\n\n%s\n", version_string, authors); exit(EXIT_SUCCESS); case 'h': usage_msg(stdout); exit(EXIT_SUCCESS); case '?': usage_msg(stderr); exit(EXIT_FAILURE); } } struct sigaction new_action; memset(&new_action, 0, sizeof(new_action)); new_action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &new_action, 0); if(optind == argc - 1) { long s = 0; char *end = NULL; s = strtol(argv[optind], &end, 10); if(end && *end == 0) { buffer_count = s; } } if(buffer_count < 0) { usage_msg(stderr); exit(EXIT_FAILURE); } else if(buffer_count == 0) { // Don't buffer anything, just write each line as it appears while((read = getline(&line, &len, stdin)) != -1) { buffer_write(line, len); } exit(EXIT_SUCCESS); } buffers.resize(buffer_count); while((read = getline(&line, &len, stdin)) != -1) { char *prev = buffers[next_buffer].data; size_t prev_length = buffers[next_buffer].length; size_t prev_buffer_length = buffers[next_buffer].buffer_length; if(prev) { buffer_write(prev, prev_length); } buffers[next_buffer].data = line; buffers[next_buffer].length = read; buffers[next_buffer].buffer_length = len; //re-use spent buffers line = prev; len = prev_buffer_length; advance_buffer(); } if(flush_at_end) { for(size_t i = 0; i < buffers.size(); i++) { if(buffers[next_buffer].data) { buffer_write(buffers[next_buffer].data, buffers[next_buffer].length); } advance_buffer(); } } exit(EXIT_SUCCESS); }
int main(int argc, char *argv[]) { int fd, fd_dec; int res, datasize,i; int nb_frames = 0; #ifdef DUMP_RAW_FRAMES char filename[15]; int fd_out; #endif int32_t outbuf[2048]; uint16_t fs,sps,h; uint32_t packet_count; COOKContext q; RMContext rmctx; RMPacket pkt; memset(&q,0,sizeof(COOKContext)); memset(&rmctx,0,sizeof(RMContext)); memset(&pkt,0,sizeof(RMPacket)); if (argc != 2) { DEBUGF("Incorrect number of arguments\n"); return -1; } fd = open(argv[1],O_RDONLY); if (fd < 0) { DEBUGF("Error opening file %s\n", argv[1]); return -1; } /* copy the input rm file to a memory buffer */ uint8_t * filebuf = (uint8_t *)calloc((int)filesize(fd),sizeof(uint8_t)); res = read(fd,filebuf,filesize(fd)); fd_dec = open_wav("output.wav"); if (fd_dec < 0) { DEBUGF("Error creating output file\n"); return -1; } res = real_parse_header(fd, &rmctx); packet_count = rmctx.nb_packets; rmctx.audio_framesize = rmctx.block_align; rmctx.block_align = rmctx.sub_packet_size; fs = rmctx.audio_framesize; sps= rmctx.block_align; h = rmctx.sub_packet_h; cook_decode_init(&rmctx,&q); /* change the buffer pointer to point at the first audio frame */ advance_buffer(&filebuf, rmctx.data_offset+ DATA_HEADER_SIZE); while(packet_count) { rm_get_packet(&filebuf, &rmctx, &pkt); //DEBUGF("total frames = %d packet count = %d output counter = %d \n",rmctx.audio_pkt_cnt*(fs/sps), packet_count,rmctx.audio_pkt_cnt); for(i = 0; i < rmctx.audio_pkt_cnt*(fs/sps) ; i++) { /* output raw audio frames that are sent to the decoder into separate files */ #ifdef DUMP_RAW_FRAMES snprintf(filename,sizeof(filename),"dump%d.raw",++x); fd_out = open(filename,O_WRONLY|O_CREAT|O_APPEND, 0666); write(fd_out,pkt.frames[i],sps); close(fd_out); #endif nb_frames = cook_decode_frame(&rmctx,&q, outbuf, &datasize, pkt.frames[i] , rmctx.block_align); rmctx.frame_number++; res = write(fd_dec,outbuf,datasize); } packet_count -= rmctx.audio_pkt_cnt; rmctx.audio_pkt_cnt = 0; } close_wav(fd_dec, &rmctx, &q); close(fd); return 0; }