Audio播放完毕后设置时间无法正确获取

  Java播放audio,当播放完毕(EOM)后,尝试set audio time,此后若做get audio time的动作,读取到的仍然是EOM的时间,而非之前设置的时间。
该问题通常出现在一些audio test case中,该行为是我司原本的设计,若需要修改以配合test case的通过,可以参考如下方法。

修改"Jma_audio_player.c",请关注如下代码中//time begin…//end之间的修改。
1、
//time begin
kal_uint64 last_set_media_time[JAVA_NO_OF_PLAYER];
//end
2、
jma_mvm_audio_player_open()
...
        if (audio_player->state == JAVA_MEDIA_STATE_NULL)
        {
            if (MMA_TYPE_MIDI == mma_type)
            {
                jma_midi_player_init(audio_player);
                if (NULL == data && NULL == filename)
                {
                    audio_player->is_midi_device = KAL_TRUE;
                }
            }
            memset((kal_uint8 *)&(audio_player->player), 0, sizeof(mma_player_struct));
            audio_player->player.handler = (med_handler) &jma_audio_event_hdlr;
            audio_player->player.media_type = mma_type;
            audio_player->player.repeats = 1;
 
         //time begin
                     last_set_media_time[native_player] = -1;
            //end
...
3、
jma_mvm_audio_player_play()
...
        /* Reset play finish time for the play of this time */
        audio_player->play_finish_time = 0;
 
        //time begin
        last_set_media_time[native_player] = -1;
        //end
... 
4、
jma_mvm_audio_player_close()
...
    if (native_player != INVALID_NPLAYER_ID)   
    {
        audio_player = &mma_audio_player[native_player];
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_NPLAYER_STATE, native_player, audio_player->state);
 
        jma_deregister_device(audio_player->device_type, vm_id, audio_player->id);
 
        //time begin
        last_set_media_time[native_player] = -1;
        //end
... 
5、
jma_mvm_audio_player_set_media_time()
...
        /* seek time should be bound in duration */
        if (audio_player->duration != -1 &&
            now > audio_player->duration)
        {
            now = audio_player->duration;           
        }
       
        //time begin
        if(audio_player->state == JAVA_MEDIA_STATE_READY)
        {
            last_set_media_time[native_player] = now;
        }
        //end
...
6、
jma_mvm_audio_player_get_media_time()
...
        /* If not at Playing state, return kept-value */
        if (audio_player->state == JAVA_MEDIA_STATE_PLAYING)
        {
            current_time = media_mma_aud_get_current_time(JMA_MOD_ID, audio_player->handle, (kal_uint8) mma_type);
            audio_player->current_time = current_time;
        }
        //time begin
        else if ((audio_player->play_finish_time != 0) && (audio_player->state == JAVA_MEDIA_STATE_READY))
        {
            if (last_set_media_time[native_player] != -1)//time has been set
            {
                current_time = last_set_media_time[native_player];
            }
            else//time has not been set
            {
                current_time = audio_player->play_finish_time;
            }
        }
        //end
        else if (audio_player->play_finish_time != 0) /* for play finish */
        {
            current_time = audio_player->play_finish_time;
        }
        else
        {
            current_time = audio_player->current_time;
        }
...



猜你喜欢

转载自blog.csdn.net/sergeycao/article/details/8232987