hey everyone!
I've been facing some problems with this piece of
code.
It extracts and puts ID3v1 Tags into mp3 files.
The problem is that when i use it to get tags from
individual mp3s it works, but when i put it into a
while loop reading directory entries, it exits after
reading just one file's tags.
I am sure that the problem lies here coz when i
comment out the call to this function in the loop, the
loop completes and reads all the entries.
Please help.
====================CODE==========================
#include<fcntl.h>
#include<string.h>
#include<malloc.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
typedef struct ID3v1Tag_{
char Tagmarker[3];
char Title[31];
char Artist[31];
char Album[31];
char Year[5];
char Comments[31];
char Genre;
}ID3v1Tag;
/* Theres an extra byte to store \0 */
int gettags(const char *, ID3v1Tag *);
/* Pass it the filename of the mp3 with path.
* Returns the status of the operation, 0 if
successful, negative if failed.
* See source for actual failure return values.
*/
int puttags(const char *, ID3v1Tag *);
/* Pass it the filename of the mp3 file with path.
* Returns the status of the operation, 0 if
successful, negative if failed.
* See source for actual failure return values.
*/
int gettags(const char *fname, ID3v1Tag *tag) {
int fd;
off_t filelen;
if(tag==NULL)
return -1;
if((access(fname,R_OK))<0)
return -2; /* Permission denied: No read access. */
if((fd=open(fname,O_RDONLY))<0) {
tag=NULL;
return -3; /* Could not open file. */
}
filelen=lseek(fd,0,SEEK_END);
lseek(fd,filelen-128,SEEK_SET);
if((read(fd,tag->Tagmarker,3))<3) {
close(fd);
return -4;
}
if(strncmp(tag->Tagmarker,"TAG",3)!=0) {
close(fd);
return -5; /* No tags were present in the file.*/
}
if((read(fd,tag->Title,30))<30) {
close(fd);
return -4;
}
strcpy(&tag->Title[30],"\0");
if((read(fd,tag->Artist,30))<30) {
close(fd);
return -4;
}
strcpy(&tag->Artist[30],"\0");
if((read(fd,tag->Album,30))<30) {
close(fd);
return -4;
}
strcpy(&tag->Album[30],"\0");
if((read(fd,tag->Year,4))<4) {
close(fd);
return -4;
}
strcpy(&tag->Year[4],"\0");
if((read(fd,tag->Comments,30))<30) {
close(fd);
return -4;
}
strcpy(&tag->Comments[30],"\0");
if((read(fd,&tag->Genre,1))<1) {
close(fd);
return -4;
}
if((close(fd))<0)
fprintf(stderr,"Error closing file.\n");
return 0;
}
int puttags(const char *fname, ID3v1Tag *tag) {
int fd;
off_t filelen;
if(tag==NULL)
return -1;
if((access(fname,W_OK))<0)
return -2;
if((fd=open(fname,O_WRONLY | O_SYNC))<0)
return -3;
filelen=lseek(fd,0,SEEK_END);
lseek(fd,filelen-128,SEEK_SET);
memcpy(tag->Tagmarker,"TAG",3);
if((write(fd,tag->Tagmarker,3))<3) {
close(fd);
return -4;
}
if((write(fd,tag->Title,30))<30) {
close(fd);
return -4;
}
if((write(fd,tag->Artist,30))<30) {
close(fd);
return -4;
}
if((write(fd,tag->Album,30))<30) {
close(fd);
return -4;
}
if((write(fd,tag->Year,4))<4) {
close(fd);
return -4;
}
if((write(fd,tag->Comments,30))<30) {
close(fd);
return -4;
}
if((write(fd,&tag->Genre,1))<1) {
close(fd);
return -4;
}
close(fd);
return 0;
}
====================CODE======================
This whole thing was in two parts one a header with
the function protos and the definition of the ID3v1TAg
struct, i 've combined it for this list.
Thanks
Shehjar
__________________________________________________
Do you Yahoo!?
Yahoo! Platinum - Watch CBS' NCAA March Madness, live on your desktop!
http://platinum.yahoo.com
================================================
To unsubscribe, send email to [EMAIL PROTECTED] with unsubscribe in subject header.
Check archives at http://www.mail-archive.com/ilugd%40wpaa.org