#include #include #define ARTISTLEN 60 #define ALBUMLEN 64 #define SONGLEN 120 #define GENRELEN 28 #define FILELEN 176 #define SONGARRAYLEN 715 #define ALBUMARRAYLEN 186 #define BE32(_x_) (((_x_ & 0xff000000) >> 24) | \ ((_x_ & 0x00ff0000) >> 8) | \ ((_x_ & 0x0000ff00) << 8) | \ ((_x_ & 0x000000ff) << 24)) #define BE16(_x_) ( ((_x_&0xff00) >> 8) | ((_x_&0xff)<<8)) struct header { int version; int artiststart; int albumstart; int songstart; int filestart; int artistcount; int albumcount; int songcount; int filecount; int artistlen; int albumlen; int songlen; int genrelen; int filelen; int songarraylen; int albumarraylen; int rundbdirty; } header; struct FileEntry { char name[FILELEN]; int hash; int tagoffset; int rundboffset; } FileEntry; struct SongEntry { char name[SONGLEN]; int artist; int album; int file; char genre[GENRELEN]; short bitrate; short year; } SongEntry; struct ArtistEntry { char name[ARTISTLEN]; int album[ALBUMARRAYLEN]; } ArtistEntry; struct AlbumEntry { char name[ALBUMLEN]; int artist; int song[SONGARRAYLEN]; } AlbumEntry; struct RundbHeader { int version; int entrycount; } RundbHeader; struct RundbEntry { int file; int hash; short rating; short voladj; int playcount; int lastplayed; } RundbEntry; FILE *fp,*fp2; void showsong(int offset) { fseek(fp,offset,SEEK_SET); fread(&SongEntry,sizeof(struct SongEntry),1,fp); SongEntry.artist=BE32(SongEntry.artist); SongEntry.album=BE32(SongEntry.album); SongEntry.file=BE32(SongEntry.file); SongEntry.year=BE16(SongEntry.year); SongEntry.bitrate=BE16(SongEntry.bitrate); printf("Offset: 0x%x\nName: %s\nArtist: 0x%x\nAlbum: 0x%x\nFile: 0x%x\nGenre: %s\nBitrate: %d\nYear: %d\n\n",offset,SongEntry.name,SongEntry.artist,SongEntry.album,SongEntry.file,SongEntry.genre,SongEntry.bitrate,SongEntry.year); } void showalbum(int offset) { int i; fseek(fp,offset,SEEK_SET); fread(&AlbumEntry,sizeof(struct AlbumEntry),1,fp); AlbumEntry.artist=BE32(AlbumEntry.artist); printf("Offset: 0x%x\nAlbum: %s\nArtist: 0x%x\n",offset,AlbumEntry.name,AlbumEntry.artist); for(i=0;i=0) { fread(&RundbHeader,sizeof(RundbHeader),1,fp2); p=&RundbHeader; for(i=0;i<2;i++) { *p=BE32(*p); p++; } } printf("db version : 0x%x\n",header.version&0xFF); printf("Artist start : 0x%x\n",header.artiststart); printf("Album start : 0x%x\n",header.albumstart); printf("Song start : 0x%x\n",header.songstart); printf("File start : 0x%x\n",header.filestart); printf("Artist count : %d\n",header.artistcount); printf("Album count : %d\n",header.albumcount); printf("Song count : %d\n",header.songcount); printf("File count : %d\n",header.filecount); printf("Artist len : %d\n",header.artistlen); printf("Album len : %d\n",header.albumlen); printf("Song len : %d\n",header.songlen); printf("Genre len : %d\n",header.genrelen); printf("File len : %d\n",header.filelen); printf("Songarraylen : %d\n",header.songarraylen); printf("Albumarraylen : %d\n",header.albumarraylen); printf("Rundb dirty : %d\n",header.rundbdirty); if(fp2>=0) { printf("Rundb version : 0x%x\n",RundbHeader.version&0xFF); printf("Rundb entrys : %d\n",RundbHeader.entrycount); } if( sizeof(struct SongEntry)!=(header.songlen+header.genrelen+16)) { printf("Song Entry Size mismatch.. update the code to correct size.\n"); return; } if(sizeof(struct AlbumEntry)!=(header.albumlen+4+header.songarraylen*4)) { printf("Album Entry Size mismatch.. update the code to correct size.\n"); return; } if(sizeof(struct ArtistEntry)!=(header.artistlen+header.albumarraylen*4)) { printf("Artist Entry Size mismatch.. update the code to correct size.\n"); return; } if(sizeof(struct FileEntry)!=(header.filelen+12)) { printf("File Entry Size mismatch.. update the code to correct size.\n"); return; } do { printf("\n\nShow artist(1)/album(2)/song(3)/file(4)"); if(fp2>=0) printf("/rundb(5)"); printf(" ? "); fflush(stdout); temp=temp2=temp3=0; scanf("%d",&temp); printf("Record (-1 for offset) ? "); fflush(stdout); scanf("%d",&temp2); if(temp2==-1) { printf("Offset ? 0x"); fflush(stdout); scanf("%x",&temp3); } switch(temp) { case 1: if(temp2==-1) showartist(temp3); else showartist(header.artiststart + temp2*sizeof(struct ArtistEntry)); break; case 2: if(temp2==-1) showalbum(temp3); else showalbum(header.albumstart + temp2*sizeof(struct AlbumEntry)); break; case 3: if(temp2==-1) showsong(temp3); else showsong(header.songstart + temp2*sizeof(struct SongEntry)); break; case 4: if(temp2==-1) showfile(temp3); else showfile(header.filestart + temp2*sizeof(struct FileEntry)); break; case 5: if(temp2==-1) showrundb(temp3); else showrundb(8+temp2*sizeof(struct RundbEntry)); break; default: return; break; } } while(1); fclose(fp); }