#37088 - 24/08/2001 10:28
How big is yours?
|
old hand
Registered: 30/07/2001
Posts: 1115
Loc: Lochcarron and Edinburgh
|
Today, I put my first program onto my empeg. It's called "hello world" and you can guess what it does.
I also put my second program onto it. It's a bit more useful. It's designed to answer the question everybody asks you: how much music is there on your empeg? It only works on single-drive machines at present, but I include source so you can see how to fix that.
To use, just install it on $PATH in your player (e.g. in /empeg/bin) and run it with no arguments to see how long it would take to play your root playlist, or with a list of FIDs to measure those.
Here's the code (binary is attached):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/limits.h>
#define FID_ROOTPLAYLIST 0x100
#define FIDS_DIR "/drive0/fids"
#define FIDS_FILE0_FORMAT FIDS_DIR"/%x0"
#define FIDS_FILE1_FORMAT FIDS_DIR"/%x1"
#define LINESZ 512
#define TYPE_TUNE 1
#define TYPE_PLAYLIST 2
#if 0
#define DEBUG0(s) fprintf(stderr, s);
#define DEBUG1(s, x) fprintf(stderr, s, x);
#endif
int measure_item(int playlist);
int measure_playlist(int playlist);
int main(int argc, char **argv) {
int playlist;
int duration; /* in milliseconds */
int total = 0;
int i;
char *numend;
if (argc <= 1) {
/* argument not supplied - measure root playlist */
total = duration = measure_item(FID_ROOTPLAYLIST);
printf("Root playlist: %d.%03d", duration/1000, duration%1000);
} else {
for (i = 1; i < argc; i++) {
/* Parse argument as hexadecimal FID */
playlist = (int)strtol(argv[ i], &numend, 16);
if (*numend) {
fprintf(stderr, "%s: Unrecognised argument %s\n", argv[ 0], argv[ i]);
fprintf(stderr, "Usage: %s [ fid...]\n", argv[ 0]);
exit(EXIT_FAILURE);
}
total += duration = measure_item(playlist);
printf("Playlist %5x: %d.%03d\n", playlist, duration/1000, duration%1000);
}
printf("Total: %d.%03d", total/1000, total%1000);
}
if (duration > 60000) {
int hours, minutes, seconds, millis;
millis = total % 1000;
total /= 1000;
seconds = total % 60;
minutes = total / 60 % 60;
hours = total / 3600;
printf(" (");
if (hours)
printf("%dh", hours);
if (minutes)
printf("%dm", minutes);
printf("%ds", seconds);
printf(")");
}
printf("\n");
return EXIT_SUCCESS;
}
/* Returns length of playlist or tune, in milliseconds. */
int measure_item(int playlist) {
char filename[ PATH_MAX+1];
char line[ LINESZ+1];
int duration = 0;
int type = 0;
FILE *f;
/* First, read the *1 file - is it a tune or a playlist? */
sprintf(filename, FIDS_FILE1_FORMAT, playlist/16);
/*DEBUG1("Opening %s\n", filename);*/
f = fopen(filename, "r");
if (f == NULL) {
perror(filename);
exit(EXIT_FAILURE);
}
while (fgets(line, LINESZ, f)) {
if (!strcmp(line, "type=tune\n")) {
type = TYPE_TUNE;
} else if (!strcmp(line, "type=playlist\n")) {
type = TYPE_PLAYLIST;
} else if (!strncmp(line, "duration=", 9)) {
duration = (int)strtol(line+9, NULL, 10);
}
}
if (ferror(f)) {
/* fgets failed, not at EOF */
perror(filename);
fclose(f);
exit(EXIT_FAILURE);
}
if (fclose(f)) {
perror(filename);
exit(EXIT_FAILURE);
}
switch (type) {
case TYPE_TUNE:
return duration;
case TYPE_PLAYLIST:
return measure_playlist(playlist);
default:
fprintf(stderr, "No type for %s", filename);
exit(EXIT_FAILURE);
}
}
int measure_playlist(int playlist) {
char filename[ PATH_MAX+1];
int fid;
int duration = 0;
FILE *f;
/* First, read the *0 file - this holds the child pointers. */
sprintf(filename, FIDS_FILE0_FORMAT, playlist/16);
f = fopen(filename, "rb");
if (f == NULL) {
perror(filename);
exit(EXIT_FAILURE);
}
while (1 == fread(&fid, 4, 1, f)) {
duration += measure_item(fid);
}
if (ferror(f)){
/* fread failed */
perror(filename);
fclose(f);
exit(EXIT_FAILURE);
}
if (fclose(f)) {
perror(filename);
exit(EXIT_FAILURE);
}
return duration;
}
--
Toby Speight
Attachments
36227-count-time (176 downloads)
_________________________
Toby Speight 030103016 (80GB Mk2a, blue) 030102806 (0GB Mk2a, blue)
|
Top
|
|
|
|
#37089 - 24/08/2001 15:42
Re: How big is yours?
[Re: tms13]
|
stranger
Registered: 14/08/2001
Posts: 29
|
How to install this program on empeg? Using serial link!?
|
Top
|
|
|
|
#37090 - 28/08/2001 02:47
Re: How big is yours?
[Re: arvind_bk]
|
old hand
Registered: 30/07/2001
Posts: 1115
Loc: Lochcarron and Edinburgh
|
Upload the binary using zmodem - I'm assuming that anyone wanting this already knows how to get a shell on the empeg...
--
Toby Speight
_________________________
Toby Speight 030103016 (80GB Mk2a, blue) 030102806 (0GB Mk2a, blue)
|
Top
|
|
|
|
#37092 - 28/08/2001 04:23
Re: How big is yours?
[Re: peter]
|
old hand
Registered: 30/07/2001
Posts: 1115
Loc: Lochcarron and Edinburgh
|
That's great - I did this mainly for my own amusement, and thought I'd share the code. If I were to do it properly, I'd read the database instead of grinding the discs reading fids/*1...
BTW, has anyone reverse-engineered the DB? I can imagine some cool uses...
--
Toby Speight
_________________________
Toby Speight 030103016 (80GB Mk2a, blue) 030102806 (0GB Mk2a, blue)
|
Top
|
|
|
|
#37093 - 28/08/2001 04:44
Re: How big is yours?
[Re: tms13]
|
carpal tunnel
Registered: 13/07/2000
Posts: 4180
Loc: Cambridge, England
|
has anyone reverse-engineered the DB
Well, I hope no-one's gone to the bother of reverse-engineering it... all the code to parse it is in the GPL'd emptool sources. (The emptool/emplode protocol just grabs the entire file, pipes it over the connection, and parses it at the PC end.)
Peter
|
Top
|
|
|
|
#37094 - 28/08/2001 05:40
Re: How big is yours?
[Re: peter]
|
old hand
Registered: 30/07/2001
Posts: 1115
Loc: Lochcarron and Edinburgh
|
Peter wrote:
> Well, I hope no-one's gone to the bother of reverse-engineering it... all the code to parse it is in the GPL'd emptool sources.
I should have looked - I assumed that it was built on the player. --
Toby Speight
_________________________
Toby Speight 030103016 (80GB Mk2a, blue) 030102806 (0GB Mk2a, blue)
|
Top
|
|
|
|
#37095 - 28/08/2001 07:17
Re: How big is yours?
[Re: tms13]
|
carpal tunnel
Registered: 18/01/2000
Posts: 5683
Loc: London, UK
|
It is -- it's built on the player during a sync. But it's parsed in emplode/emptool during a dowload from the player.
Roger - not necessarily speaking for empeg
_________________________
-- roger
|
Top
|
|
|
|
#37096 - 28/08/2001 08:52
Re: How big is yours?
[Re: Roger]
|
old hand
Registered: 12/08/2000
Posts: 702
Loc: Netherlands
|
Cool, just looked into emptool source... This has potential...
Frank van Gestel
_________________________
Frank van Gestel
|
Top
|
|
|
|
#37097 - 28/08/2001 17:06
Re: How big is yours?
[Re: fvgestel]
|
enthusiast
Registered: 29/09/2000
Posts: 313
Loc: Belgium/Holland
|
In reply to:
Cool, just looked into emptool source... This has potential...
Ut oh, Roger now you've done it ... Cheers, Hans Mk2 - Blue & Red - 080000431
_________________________
Mk2
This message will selfdestruct in 5 seconds to prevent reproduction.
|
Top
|
|
|
|
|
|