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);
}
Пример #2
0
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;
}