3 Replies - 456 Views - Last Post: 10 February 2013 - 04:26 AM Rate Topic: -----

#1 Thanos_1983  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 13
  • Joined: 05-February 13

Read mp3 tags id3_v2 C no output

Posted 09 February 2013 - 03:21 PM

Hello everyone,

Well I just finished my code based on some guidance that I found on internet. Unfortunately the output is not the one that I was expecting. Initially I had some warnings about the pointers that I am using, I thought I fixed them by using (char*) as suggests Ubuntu man page.

Maybe this is the problem but because I am a beginner in programming, I can not find the problem. Any one can help me? I have attached the code and the file that I am trying to read.

Is there any way to go step by step the code through any program and see mistakes?
I tried to upload the file but it gives me a continuous error.

Thanks advance for your time and for your help.

Best Regards,
Thanos
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>

typedef struct{
   unsigned char header_id[3]; /* We indicate that this mp3 file is ID3 format 3 bytes */
   uint8_t major_version; /* We set the size and type of unsigned integer of length 8 bits to the Major Version, unsigned int minimum value is 0 */
   uint8_t revision_number; /* We set the size and type of unsigned integer of length 8 bits to the Revision Number, unsigned int minimum value is 0 */
   unsigned char flags; /* We indicate two flag bytes, we use unsigned characters so they can take values 0 - 255 and not -128 up to 127*/
   uint32_t size; /* We the size is indicated by 4 bytes = 32 bits */
}mp3_Header;

typedef struct{
	uint32_t extended_size;
	unsigned char number_flags;
	unsigned char extended_flags;	
}mp3_Extended_Header;

typedef struct{
	unsigned char frame_id[4]; 
	uint32_t frame_size;
	unsigned char frame_flags[2];	
}mp3_Frame;

 int main (int argc, char *argv[])
   {
	   char a[] = "silence.mp3";
	   if ( argc != 1 )  /* Input from user argc should be 1 for correct
						  *	execution. The argument count variable
						  * stores the number of arguments plus one. */ 
		{
			 /*We print argv[0], if the program that user has chosen for
			  * execution it is not correct as input if has more inputs*/ 
			printf( "Please choose one file: %s  <silence.mp3> \n", argv[0] );
		}
		else 
		{
			mp3_Header first;
			mp3_Extended_Header second;
			mp3_Frame third;
			
			unsigned char header_id[4], memory[4], new_flagg[2], characters;
			int i,b=1;
			unsigned long length_of_data = 0;
						
			FILE *file; /* A file pointer is a variable of type FILE, 
						 * we declare a file pointer.*/
						 
			file = fopen("silence.mp3", "rb");  /* Open the file
												 * silence.mp3 in
												 * "reading" mode "r". */
												 
			if (file == NULL) {
					/* If the file could not open for a variety of reasons
					*  the program should inform us by print the document
					*  and exit.*/ 
					printf( "I couldn't open: %s for reading.\n", a );
					exit(0);
				}
			
			else 
			{
				
				/*Set the pointer at the possition at the beggining of the file, 
				 * if the procedure is correct it will return 0 if not it will return -1. */
				if (fseek(file, 0 , SEEK_SET) == -1)
					{
						fprintf(stderr, "Not able to fseek");
						return EXIT_FAILURE;
					}

				/* The  function  fread() will read 4 bytes of data, each of them in size
				 * of 1 byte long and they will be stored in memory (givven name) . */
				if ( (size_t) fread( memory , (size_t) 4 , (size_t) 1 , file) !=1)
				
					{
						printf("Could not read the file\n");
						exit (0);
					}
				
				/* I will copy the string from location (memory) to the destination tag_id from first typedef stuct */
				strncpy( (char *) first.header_id , (char *) memory , (size_t) 4);
								
				if ( (size_t) fread( &first.major_version , (size_t) 1 , (size_t) 1 , file) != 1) 

					{
						printf("Could not read the major_version\n");
						exit (0);
					}
				
				if ( (size_t) fread( &first.revision_number , (size_t) 1, (size_t) 1 , file) != 1) 

					{
						printf("Could not read the revision_number\n");
						exit (0);
					}
				
				/* Read the total size of the header */				
				if ( (size_t) fread(memory , (size_t) sizeof(first.size) , (size_t) 1 , file) != 1) 

					{
						printf("Could not read memory\n");
						exit (0);
					}
				
					/* We break down the packet in bytes and allocate the bytes in memory in a sequence. 
					* After the first sequence is stored for the rest we have to shift them by one possition.
					* Because the first bit determines the sign on the character/ intiger and we have set it to possitive. 
					* We shift the possition every 7 bits because 1 byte has 8 bits - 1 the sign ( + , - ). */
					first.size = (memory[3] & 0xFF) |
								((memory[2] & 0xFF) << 7 ) |
								((memory[1] & 0xFF) << 14 ) |
								((memory[0] & 0xFF) << 21 );
				
					/* Store temporarilly the length of the data */
					length_of_data = first.size;
				
					/* Print the data that we have collect so far */
					fprintf( stdout , "%s version %d . %d\t Size %d\n", first.header_id , first. major_version , first.revision_number , first.size);
				
				/* At this point we want to make sure that the whole header has been executed correctly */
				if (( first.flags & (01000000) ) == 01000000 )
					
					{	
						/* Extended Header 6 Bytes */
					if ( (size_t) fread( memory , (size_t) sizeof(second.extended_size) , 1 , file ) != 1);
						
						{
							printf("Could not read Memory\n");
							exit (0);
						}
						
						/* Break down the packet in pieces and extrac the data */
						second.extended_size = (memory[3] & 0xFF) |
											  ((memory[2] & 0xFF) << 7 ) |
											  ((memory[1] & 0xFF) << 14 ) |
											  ((memory[0] & 0xFF) << 21 );
					if ( (size_t) fread( &second.number_flags , 1 , 1 , file ) !=1);
					
						{
							printf("Could not read Number of Flags\n");
							exit (0);
						}
						
					if ( (size_t) fread( &second.extended_flags , 1 , 1 , file ) !=1);
					
						{
							printf("Could not read Extended Flags\n");
							exit (0);
						}
						
						fprintf(stdout,"Extended header size: %d\n", second.extended_size);
						/* From the stored value we substract the Extended Header */
						length_of_data = length_of_data - second.extended_size;
						/* Reposition the seek pointer after the Extended Header */
						fseek ( file , second.extended_size + 10 , SEEK_SET );
					}
					
				else
					{
						/* If process has been executed correclty proceed and place reader after Extended Header (10 bytes) */
						fseek ( file , 10 , SEEK_SET );
					}
						
				while(b!=0) /* Read until the end of file */
						{
							if ( (size_t) fread( header_id , (size_t) 4 , 1 , file ) !=1);
							
							{
								printf("Could not read Header_id_1 \n");
								exit (0);
							}
							
							strncpy( (char *) third.frame_id , (char *) header_id , (size_t) 4 );
							
							if ( (size_t) fread( memory , (size_t) sizeof(third.frame_size) , 1 , file ) !=1);
							
							{
								printf("Could not read Memory\n");
								exit (0);
							}
							
							/* Extract data and store them */
							third.frame_size = (memory[3] & 0xFF) |
											   ((memory[2] & 0xFF) << 7 ) |
											   ((memory[1] & 0xFF) << 14 ) |
											   ((memory[0] & 0xFF) << 21 );
							if ( (size_t) fread( new_flagg , (size_t) 2 , 1 , file ) !=1);
							
							{
								printf("Could not read Memory\n");
								exit (0);
							}
							
							strncpy( (char *) third.frame_flags , (char *) new_flagg , (size_t) 2 );
							/* Print inforamtion of Frames */
							printf("Third Part Frame id : %s Frame Size : %d Flags : ", third.frame_id , third.frame_size );	  
							
							/* Compare the strings */
							if ( strncmp( (char *) third.frame_id , "TPE1" , (size_t) 4 ) == 0 )  
								{
									for ( i = 1; i <= third.frame_size; i++ )
										{
											characters = fgetc(file);
											printf( "Number of characters: %c" , characters );
										}
								printf("\n");
								}
								
							else if ( strncmp( (char *) third.frame_id , "TALB" , (size_t) 4 ) == 0 )
								{
									for ( i=1 ; i <= third.frame_size; i++ )
										{
											characters = fgetc(file);
											printf( "Number of characters: %c" , characters );
										}
								printf("\n");
								}
								
							else if ( strncmp ( (char *) third.frame_id , "TYER" , (size_t) 4 ) == 0 )
								{
									for ( i = 1; i <= third.frame_size; i++ )
										{
											characters = fgetc(file);
											printf( "Number of characters: %c" , characters );
										}
								printf("\n");
								}
								
							else if ( strncmp ( (char *) third.frame_id , "TCON" , (size_t) 4 ) == 0 )
								{
									for ( i = 1; i <= third.frame_size; i++ )
										{
											characters = fgetc(file);
											printf( "Number of characters: %c" , characters );
										}
								printf("\n");
								}
							
							else if ( strncmp ( (char *) third.frame_id , "TRCK" , (size_t) 4 ) == 0 )
								{
									for ( i = 1; i <= third.frame_size; i++ )
										{
											characters = fgetc(file);
											printf( "Number of characters: %c" , characters );
										}
								printf("\n");
								}
								
							else if ( strncmp ( (char *) third.frame_id , "TIT2" , (size_t) 4 ) == 0 )
								{
									for ( i = 1; i <= third.frame_size; i++ )
										{
											characters = fgetc(file);
											printf( "Number of characters: %c" , characters );
										}
								printf("\n");
								}
							
							else
								{
									printf("\n"); b=0;
								}
						}
					
					printf("Finished Reading, Clossing silence.mp3 file! Goodbye!\n");

			fclose(file);
			return 0;

			}
		}
	}



Is This A Good Question/Topic? 0
  • +

Replies To: Read mp3 tags id3_v2 C no output

#2 Adak  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 331
  • View blog
  • Posts: 1,168
  • Joined: 01-April 11

Re: Read mp3 tags id3_v2 C no output

Posted 09 February 2013 - 08:11 PM

If you are working with bits, it can be important to make your data type *unsigned*, to remove the sign bit problem. Seems you were aware of that problem, from reading the notes in the program.

If you step through the code while it's running using a debugger, you can watch several variables to see what's going on. Most C/C++ IDE's have a debugger included. Simple editors will not have one though.

This post has been edited by Adak: 09 February 2013 - 08:11 PM

Was This Post Helpful? 1
  • +
  • -

#3 Thanos_1983  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 13
  • Joined: 05-February 13

Re: Read mp3 tags id3_v2 C no output

Posted 10 February 2013 - 03:36 AM

I will download a debugger to see in further analysis what is my problem.

Thanks for your time and advice.
Was This Post Helpful? 0
  • +
  • -

#4 Thanos_1983  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 13
  • Joined: 05-February 13

Re: Read mp3 tags id3_v2 C no output

Posted 10 February 2013 - 04:26 AM

I just noticed a huge mistake that I have made, in most if conditions that I used in my code I put at the end (;). By removing the semicolon it executes the code, if I am not mistaken by putting semicolon it tells to the program to execute this line even if the condition is not met.

Thanks for any assistance I am in the process of learning.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1