/***************************************************************************** * FUNCTION * daf_seek * DESCRIPTION * * PARAMETERS * input_stream [?] * offset [?] * aud_info_struct *info_p(?) * RETURNS * kal_bool *****************************************************************************/ kal_bool daf_seek(audio_input_stream_struct *input_stream, kal_uint32 *offset) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_int32 v2_tag_size; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ if (*offset == 0) { /* skip id3v2 tag */ if (audio_input_stream_read(input_stream, 10) != 10) { return KAL_FALSE; } if ((v2_tag_size = id3_tag_parse_v2_tag_size(input_stream->ptr)) > 0) { *offset = v2_tag_size; } } audio_input_stream_seek(input_stream, (kal_int32) * offset); if (!daf_parse(input_stream, offset, NULL)) { return KAL_FALSE; } audio_input_stream_seek(input_stream, (kal_int32) * offset); return KAL_TRUE; }
/***************************************************************************** * FUNCTION * daf_seek * DESCRIPTION * * IMPACT * * PARAMETERS * aud_info_struct *info_p * kal_uint32* offset * RETURNS * kal_bool * GLOBALS AFFECTED * *****************************************************************************/ kal_bool daf_seek( audio_input_stream_struct *input_stream, kal_uint32* offset ) { kal_int32 v2_tag_size; if( *offset == 0 ) { // skip id3v2 tag if( audio_input_stream_read( input_stream, 10 ) != 10 ) return KAL_FALSE; if( ( v2_tag_size = id3_tag_parse_v2_tag_size( input_stream->ptr )) > 0 ) *offset = v2_tag_size; } audio_input_stream_seek( input_stream, (kal_int32) *offset ); if( !daf_parse( input_stream, offset, NULL ) ) return KAL_FALSE; audio_input_stream_seek( input_stream, (kal_int32) *offset ); return KAL_TRUE; }
/***************************************************************************** * 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 * DESCRIPTION * * PARAMETERS * input_stream [?] * offset [?] * info_p [?] * FILE* file(?) * RETURNS * kal_bool *****************************************************************************/ kal_bool daf_parse(audio_input_stream_struct *input_stream, kal_uint32 *offset, daf_data_info_struct *info_p) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ kal_uint8 result, sync_count; kal_uint8 slot_bytes, frame_slots; kal_int32 cur_pos, min_next_pos, max_next_pos, next_pos; kal_uint32 data_size, movement; daf_header_struct header; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ input_stream->skip = *offset; data_size = (kal_uint32) audio_input_stream_get_data_size(input_stream); /* find the first frame with 2 consecutive frames */ for (movement = 0;; input_stream->free_bitrate = 0, movement = 1) { /* find the first frame */ if (!daf_find_next_frame(input_stream, &header, movement)) { return KAL_FALSE; /* not found */ } /* calculate current frame position */ cur_pos = input_stream->total_load - (input_stream->tail - input_stream->ptr); /* calculate next frame position because we need to find 2 consecutive frames */ min_next_pos = cur_pos + header.min_frame_size; max_next_pos = cur_pos + header.max_frame_size; /* check if next frame position reference to a valid frame */ result = daf_check_next_frame(input_stream, &header, min_next_pos, max_next_pos, &next_pos); if (result == DAF_CHECK_FRAME_EOF) { break; } else if (result == DAF_CHECK_FRAME_TRUE) { /* calculate the offset of the first found frame position */ *offset = (kal_uint32) cur_pos; /* calc frame_size */ header.frame_size = next_pos - cur_pos; /* check 2 consecutive frames */ for (sync_count = 0; sync_count < 2; sync_count++) { /* move to next frame */ input_stream->ptr += header.frame_size; ASSERT(input_stream->ptr < input_stream->tail); /* decode frame header */ daf_parse_frame_header(input_stream->ptr, &header); /* calculate frame length for free bitrate */ if (header.bitrate == 0) { /* if it's a free bitrate frame but the first frame is not, it's false */ if (input_stream->free_bitrate == 0) { break; } header.bitrate = input_stream->free_bitrate; slot_bytes = 1; if (header.layer == DAF_LAYER_I) { frame_slots = 12; slot_bytes = 4; } else if ((header.layer == DAF_LAYER_III) && (header.version == DAF_VERSION_2 || header.version == DAF_VERSION_2_5)) { frame_slots = 72; } else { frame_slots = 144; } header.min_frame_size = (frame_slots * header.bitrate / header.sample_rate) * slot_bytes; header.max_frame_size = header.min_frame_size + slot_bytes; } /* calculate current frame position */ cur_pos = input_stream->total_load - (input_stream->tail - input_stream->ptr); /* calculate next frame position because we need to find 2 consecutive frames */ min_next_pos = cur_pos + header.min_frame_size; max_next_pos = cur_pos + header.max_frame_size; /* check if next frame position reference to a valid frame */ result = daf_check_next_frame(input_stream, &header, min_next_pos, max_next_pos, &next_pos); if (result != DAF_CHECK_FRAME_TRUE) { break; } /* calc frame_size */ header.frame_size = next_pos - cur_pos; } if (result == DAF_CHECK_FRAME_EOF || sync_count == 2) { break; } else { audio_input_stream_seek(input_stream, (kal_int32) * offset); } } } if (info_p != NULL) { info_p->bitrate = header.bitrate; info_p->duration = (data_size - *offset) * 8 / header.bitrate; info_p->samplerate = header.sample_rate; info_p->channel_num = header.channel_num; } return KAL_TRUE; }
/***************************************************************************** * 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 ); }