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 (¤t) == 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