/***************************************************************************** * FUNCTION * daf_parse_data_info * DESCRIPTION * * PARAMETERS * info_p [?] * input_stream [?] * id3_tag [?] * RETURNS * void *****************************************************************************/ void daf_parse_data_info(aud_info_struct *info_p, audio_input_stream_struct *input_stream, id3_tag_struct *id3_tag) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_int32 data_size; kal_uint32 offset; kal_bool v2_result = KAL_FALSE; kal_bool v1_result = KAL_FALSE; kal_bool daf_parse_result; daf_data_info_struct daf_data_info; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ /* zero all info_p */ memset(info_p, 0, sizeof(aud_info_struct)); /* init id3 tag data structure */ id3_tag_init(id3_tag); audio_input_stream_seek(input_stream, 0); /* * check id3v2 magic word -- "ID3" * and parse & save data to frames */ v2_result = id3_tag_parse_v2_tag(input_stream, id3_tag); /* * parse daf frame to get duration, bitrate, samplerate, channel_num */ if (v2_result) { /* skip id3v2 tag */ offset = id3_tag->v2_size + 10; if (id3_tag->v2_footer) { offset += 10; } } else { offset = 0; } audio_input_stream_seek(input_stream, offset); daf_parse_result = daf_parse(input_stream, &offset, &daf_data_info); /* * parse id3v1 tag */ if ((data_size = audio_input_stream_get_data_size(input_stream)) >= 128) { /* move to last 128 bytes before file end for checking id3v1 tag */ audio_input_stream_seek(input_stream, data_size - 128); /* * check id3v1 magic word -- "TAG" * and parse & save data to frames */ v1_result = id3_tag_parse_v1_tag(input_stream, id3_tag); } else { v1_result = KAL_FALSE; } /* copy title to info_p */ if (id3_tag->frames[ID3_FRAME_TITLE].text != NULL) { kal_wstrncpy( (kal_wchar*) info_p->title, (const kal_wchar*)id3_tag->frames[ID3_FRAME_TITLE].text, MAX_ID3_TITLE_LEN); } /* copy artist to info_p */ if (id3_tag->frames[ID3_FRAME_ARTIST].text != NULL) { kal_wstrncpy( (kal_wchar*) info_p->artist, (const kal_wchar*)id3_tag->frames[ID3_FRAME_ARTIST].text, MAX_ID3_ARTIST_LEN); } /* copy album to info_p */ if (id3_tag->frames[ID3_FRAME_ALBUM].text != NULL) { kal_wstrncpy( (kal_wchar*) info_p->album, (const kal_wchar*)id3_tag->frames[ID3_FRAME_ALBUM].text, MAX_ID3_ALBUM_LEN); } /* copy genre to info_p */ if (id3_tag->frames[ID3_FRAME_GENRE].text != NULL) { kal_wstrncpy( (kal_wchar*) info_p->genre, (const kal_wchar*)id3_tag->frames[ID3_FRAME_GENRE].text, MAX_ID3_GENRE_LEN); } /* copy year to info_p */ if (id3_tag->frames[ID3_FRAME_YEAR].text != NULL) { kal_wstrncpy( (kal_wchar*) info_p->year, (const kal_wchar*)id3_tag->frames[ID3_FRAME_YEAR].text, MAX_ID3_YEAR_LEN); } if (daf_parse_result) { daf_set_data_info( info_p, daf_data_info.channel_num, daf_data_info.duration, data_size, daf_data_info.bitrate, daf_data_info.samplerate); } }
/***************************************************************************** * FUNCTION * daf_parse_data_info * DESCRIPTION * * IMPACT * * PARAMETERS * aud_info_struct *info_p * audio_input_stream_struct* input_stream * id3_tag_struct* id3_tag * RETURNS * void * GLOBALS AFFECTED * *****************************************************************************/ void daf_parse_data_info( aud_info_struct *info_p, audio_input_stream_struct* input_stream, id3_tag_struct* lid3_tag ) { kal_int32 data_size; kal_uint32 offset; kal_bool v2_result = KAL_FALSE; kal_bool v1_result = KAL_FALSE; kal_bool daf_parse_result; daf_data_info_struct daf_data_info; // init id3 tag data structure id3_tag_init( lid3_tag ); audio_input_stream_seek( input_stream, 0 ); /* * check id3v2 magic word -- "ID3" * and parse & save data to frames */ v2_result = id3_tag_parse_v2_tag( input_stream, lid3_tag ); mmi_trace(1,"chenhe,daf_parse_data_info,v2_result is %d",v2_result); /* * parse daf frame to get duration, bitrate, samplerate, channel_num */ if( v2_result ) { // skip id3v2 tag offset = lid3_tag->v2_size + 10; if( lid3_tag->v2_footer ) offset += 10; } else offset = 0; audio_input_stream_seek( input_stream, offset ); daf_parse_result = daf_parse( input_stream, &offset, &daf_data_info ); /* * parse id3v1 tag */ if( (data_size = audio_input_stream_get_data_size( input_stream )) >= 128 ) { // move to last 128 bytes before file end for checking id3v1 tag audio_input_stream_seek( input_stream, data_size - 128 ); /* * check id3v1 magic word -- "TAG" * and parse & save data to frames */ v1_result = id3_tag_parse_v1_tag( input_stream, lid3_tag ); } else v1_result = KAL_FALSE; mmi_trace(1,"chenhe,daf_parse_data_info,v1_result is %d",v1_result); // copy title to info_p if( lid3_tag->frames[ID3_FRAME_TITLE].text != NULL ) kal_wstrncpy( (kal_wchar*)info_p->title, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_TITLE].text, MAX_ID3_TITLE_LEN ); // copy artist to info_p if( lid3_tag->frames[ID3_FRAME_ARTIST].text != NULL ) kal_wstrncpy( (kal_wchar*)info_p->artist, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_ARTIST].text, MAX_ID3_ARTIST_LEN ); // copy album to info_p if( lid3_tag->frames[ID3_FRAME_ALBUM].text != NULL ) kal_wstrncpy( (kal_wchar*)info_p->album, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_ALBUM].text, MAX_ID3_ALBUM_LEN ); // copy genre to info_p if( lid3_tag->frames[ID3_FRAME_GENRE].text != NULL ) kal_wstrncpy( (kal_wchar*)info_p->genre, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_GENRE].text, MAX_ID3_GENRE_LEN ); // copy year to info_p if( lid3_tag->frames[ID3_FRAME_YEAR].text != NULL ) kal_wstrncpy( (kal_wchar*)info_p->year, (const kal_wchar*)lid3_tag->frames[ID3_FRAME_YEAR].text, MAX_ID3_YEAR_LEN ); mmi_trace(1,"chenhe,daf_parse_data_info,daf_parse_result is %d",daf_parse_result); if( daf_parse_result ) daf_set_data_info( info_p, daf_data_info.channel_num, daf_data_info.duration, data_size, daf_data_info.bitrate, daf_data_info.samplerate ); }