1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <ctype.h>
6 #include <string.h>
7 
8 /* plugin for musepack encoder mppenc version 1.16 */
9 
10 #define MUSE_OUTPUT_BUF_LENGTH  2048
11 #define PRINTOUT_INTERVAL       1
12 /* mppenc updates screen at 1 cpu usage second, so use longer
l3enc_read_stat(unsigned int * percent)13 PRINTOUT_INTERVAL to help prevent reading partial lines */
14 
15 
16 int
17 mppenc_read_stat (float *current)
18 {
19 	char temp[MUSE_OUTPUT_BUF_LENGTH];
20 	char string[MUSE_OUTPUT_BUF_LENGTH];
21 	int bytes_read;
22 	int bytes_left;
23 	char *kbps = "kbps";
24 	char *string_ptr;
25 	char *temp_ptr;
26 
27 	temp_ptr = temp;
28 	/* Grab new output from 'mppenc'  */
29 	bytes_read = read (0, (void *) temp, sizeof (temp));
30 	if (bytes_read) {
31 		temp[bytes_read]='\0';
32 		string_ptr = strstr (temp_ptr, kbps);
33 		bytes_left = string_ptr - temp_ptr;
34 		if ( (bytes_left < 20) && (bytes_left > 8) ) { /*discard the long initial header or fragments*/
35 			if ( temp[0] == '\015' ) {
36 				temp_ptr = temp;
37 				temp_ptr++;
38 				strcpy( string , temp_ptr );
39 			}
40 			else {
41 				strcpy( string , temp);
42 			}
43 			sscanf (string, "%f", current);   /*pickup the first number in the string = % done */
44 			if (!(*current > 100 || *current <= 0 ))  /*just in case bad value */
45 			return (0);
46 
47 		}
48 	}
49 	return (-1);
50 }
51 
52 int
53 main (int argc, char **argv)
54 {
55 	float current = 0.0;
56 
57 	printf ("[P 0.00]\n");
58 	while (1) {
59 		if (mppenc_read_stat (&current) == 0)
60 			/* print message in form [P 0.xxxxx]\n */
61 			printf ("[P %f]\n", current / 100.0);
62 		usleep (PRINTOUT_INTERVAL * 1000000);
63 	}
64 }
65