/* * Class: com_farcore_playerservice_MediaPlayer * Method: closeMediaId * Signature: (I)I */ JNIEXPORT jint JNICALL Java_com_farcore_playerservice_AmPlayer_close (JNIEnv *env, jobject obj, jint pid){ if(pid>=0) player_exit(pid); //if(gMplayerClazz != NULL) // (*env)->DeleteGlobalRef(env,gMplayerClazz); return 0; }
/* * Class: com_farcore_playerservice_MediaPlayer * Method: uninit * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_farcore_playerservice_AmPlayer_native_uninit (JNIEnv *env, jclass clazz){ //int ret = -1; //ret = amadec_thread_exit(); pid_info_t alive_pids; int i =-1; player_list_allpid(&alive_pids); for(i=0;i<alive_pids.num;i++){ if(check_pid_valid(alive_pids.pid[i])) player_exit(alive_pids.pid[i]); } if(_plCtrl.file_name !=NULL){ LOGI("collect memory for player para\n"); free(_plCtrl.file_name); _plCtrl.file_name = NULL; } LOGI("player uninit ok"); return 0; }
static void signal_handler(int sig) { int ret = 0; printf(" Aborted by signal Interrupt...\n"); { fsl_player_s8 *gts_log = getenv("GAT_LOG"); if (gts_log != NULL) { if (strstr (gts_log, "gplay") != NULL) { if ((SIGILL == sig) || (SIGFPE == sig) || (SIGSEGV == sig)) { ret = sig; kill(getppid(), sig); } } } } if(g_pplayer != NULL) player_exit(g_pplayer); exit(ret); }
int main(int argc,char *argv[]) { fsl_player_s8 sCommand[128]; fsl_player_s8 uri_buffer[500]; fsl_player_thread_t display_thread; fsl_player_thread_t msg_thread; fsl_player_ret_val ret_val = FSL_PLAYER_SUCCESS; fsl_player_handle player_handle = NULL; fsl_player* pplayer = NULL; fsl_player_drm_format drm_format; fsl_player_config config; fsl_player_s32 ret; fsl_player_s32 volume = 1; signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); signal(SIGABRT, signal_handler); signal(SIGILL, signal_handler); signal(SIGFPE, signal_handler); signal(SIGSEGV, signal_handler); if( argc < 2 ) { printf("Usage of command line player:\n"); printf(" %s file_list\n", argv[0]); goto bail; } /* Initialisation */ gst_init (&argc, &argv); // Default playbin. memset(&config, 0, sizeof(fsl_player_config)); config.playbin_version = 2; config.api_version = GPLAYCORE_API_VERSION; config.features = (GPLAYCORE_FEATURE_AUTO_BUFFERING|GPLAYCORE_FEATURE_AUTO_REDIRECT_URI); config.timeout_second = GPLAYCORE_DEFAULT_TIMEOUT_SECOND; opt->info_interval_in_sec = 1; ret = parse_options(&config, opt, argc, argv); if( ret ) { return -1; } fsl_player_element_property property[1]; property[0].type = ELEMENT_TYPE_PLAYBIN; property[0].property_type = ELEMENT_PROPERTY_TYPE_INT; property[0].property_name = "flags"; if (opt->enable_visual){ property[0].value_int = 0x7f; /* default+native_video+buffering+visual */ }else{ property[0].value_int = 0x77; /* default+native_video+buffering */ } property[0].next = NULL; config.ele_properties = property; if ((config.playbin_version==1)&&(config.video_sink_name==NULL)){ config.video_sink_name = "autovideosink"; } char *p; p = strrchr(opt->current->name, '.'); PRINT("p=%s\n",p); if(p&&!strncmp(p,".wav",4)){ player_handle = fsl_player_initwav(&config,opt->current->name); } else player_handle = fsl_player_init(&config); if( NULL == player_handle ) { PRINT("Failed: player_handle == NULL returned by fsl_player_init().\n"); goto bail; } pplayer = (fsl_player*)player_handle; g_pplayer = pplayer; if (opt->info_interval_in_sec){ FSL_PLAYER_CREATE_THREAD( &display_thread, display_thread_fun, player_handle ); } FSL_PLAYER_CREATE_THREAD( &msg_thread, msg_thread_fun, player_handle ); // Play the multimedia file directory after starting command line player. pplayer->klass->set_media_location(pplayer, opt->current->name, &drm_format); pplayer->klass->play(pplayer); // Print the help menu to let user know the operation. print_help(player_handle); kb_set_raw_term(STDIN_FILENO); while( FSL_PLAYER_FALSE == gbexit_main ) { sCommand[0] = ' '; errno = 0; scanf("%s", sCommand); //read(STDIN_FILENO, sCommand, 1); if( EINTR == errno ) { //printf("Timed out: EINTR == %d", errno); } switch( sCommand[0] ) { case 'h': // display the operation Help. print_help(player_handle); break; case 'p': // Play. fsl_player_set_media_location(player_handle, filename2uri(uri_buffer,argv[1]), &drm_format); //pplayer->klass->set_media_location(pplayer, opt->current->name, &drm_format); pplayer->klass->play(pplayer); break; case 's': // Stop. pplayer->klass->stop(pplayer); break; case 'a': // pAuse when playing, play when paused. pplayer->klass->pause(pplayer); break; case 'e': // sEek. { #if 0 fsl_player_u32 seek_point_sec = 0; fsl_player_u64 duration_ns = 0; fsl_player_u32 duration_sec = 0; pplayer->klass->get_property(pplayer, FSL_PLAYER_PROPERTY_DURATION, (void*)(&duration_ns)); duration_sec = duration_ns / 1000000000; PRINT("Set seek point between [0,%u] seconds:", duration_sec); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%s",sCommand); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); seek_point_sec = atoi(sCommand); if( seek_point_sec<0 || seek_point_sec>duration_sec ) { printf("Invalid seek point!\n"); break; } pplayer->klass->seek(pplayer, seek_point_sec*1000); break; #else fsl_player_u32 seek_point_sec = 0; fsl_player_u64 duration_ns = 0; fsl_player_u32 duration_sec = 0; fsl_player_u32 seek_portion = 0; fsl_player_u32 seek_mode = 0; fsl_player_u32 flags = 0; pplayer->klass->get_property(pplayer, FSL_PLAYER_PROPERTY_DURATION, (void*)(&duration_ns)); duration_sec = duration_ns / 1000000000; kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; PRINT("Select seek mode[Fast seek:0,Accurate seek:1]:"); scanf("%s",sCommand); seek_mode = atoi(sCommand); if( seek_mode<0 || seek_mode>1 ) { printf("Invalid seek mode!\n"); break; }else{ if (seek_mode){ flags |= FSL_PLAYER_FLAG_SEEK_ACCURATE; } } PRINT("%s seek to percentage[0:100] or second [t?]:", seek_mode?"Accurate":"Normal"); scanf("%s",sCommand); if (sCommand[0]=='t'){ seek_point_sec = atoi(&sCommand[1]); }else{ seek_portion = atoi(sCommand); if( seek_portion<0 || seek_portion>100 ) { printf("Invalid seek point!\n"); break; } seek_point_sec = (fsl_player_u32)(seek_portion * duration_sec / 100); } gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); pplayer->klass->seek(pplayer, seek_point_sec*1000, flags); break; #endif } case 'v': // Volume { double volume; PRINT("Set volume[0-1.0]:"); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%lf",&volume); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); pplayer->klass->set_volume(pplayer, (volume)); break; } case 'm': // Switch to mute or not pplayer->klass->mute(pplayer); break; case '>': // Play next file printf("next\n"); if (playlist_next(pplayer, opt)==NULL){ player_exit(pplayer); } break; case '<': // Play previous file printf("previous\n"); playlist_previous(pplayer, opt); break; case 'r': // Switch to repeated mode or not { fsl_player_s32 repeated_mode; PRINT("input repeated mode[0 for no repeated,1 for play list repeated,2 for current file repeated]:"); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%d",&repeated_mode); if( repeated_mode<0 || repeated_mode>2 ) { printf("Invalid repeated mode!\n"); } else { opt->repeat = repeated_mode; } gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); //pplayer->klass->repeat(pplayer); break; } #if 1 case 'n': // Get the current video snapshot while playing //pplayer->klass->snapshot(pplayer); break; case 'o': // Set video output mode(LCD,NTSC,PAL,LCD&NTSC,LCD&PAL) { fsl_player_s32 mode = 0; PRINT("Set video output mode(LCD:0,NTSC:1,PAL:2,LCD&NTSC:3,LCD&PAL:4):"); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%d",&mode); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); if( mode < 0 || mode >4 ) { printf("Invalid video output mode!\n"); break; } pplayer->klass->set_video_output(pplayer, mode); break; } case 'd': // Select the audio track { #if 1 fsl_player_s32 audio_track_no = 0; fsl_player_s32 total_audio_no = 0; pplayer->klass->get_property(pplayer, FSL_PLAYER_PROPERTY_TOTAL_AUDIO_NO, (void*)(&total_audio_no)); PRINT("input audio track number[0,%d]:",total_audio_no-1); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%d",&audio_track_no); if( audio_track_no < 0 || audio_track_no > total_audio_no-1 ) { printf("Invalid audio track!\n"); } else { pplayer->klass->select_audio_track(pplayer, audio_track_no); } gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); #endif break; } case 'b': // Select the subtitle { #if 1 fsl_player_s32 subtitle_no = 0; fsl_player_s32 total_subtitle_no = 0; pplayer->klass->get_property(pplayer, FSL_PLAYER_PROPERTY_TOTAL_SUBTITLE_NO, (void*)(&total_subtitle_no)); PRINT("input subtitle number[0,%d]:",total_subtitle_no-1); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%d",&subtitle_no); if( subtitle_no < 0 || subtitle_no > total_subtitle_no-1 ) { printf("Invalid audio track!\n"); } else { pplayer->klass->select_subtitle(pplayer, subtitle_no); } gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); #endif break; } #endif case 'f': // Set full screen or not pplayer->klass->full_screen(pplayer); break; case 'y': // Set display screen mode { fsl_player_s32 display_screen_mode = 0; PRINT("Input screen mode[Normal:0,FullScreen:1,Zoom:2]:"); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%d",&display_screen_mode); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); if( display_screen_mode < 0 || display_screen_mode > 2 ) { printf("Invalid display screen mode!\n"); break; } pplayer->klass->display_screen_mode(pplayer, display_screen_mode); break; } case 'z': // resize the width and height { #if 0 fsl_player_display_parameter display_parameter; fsl_player_s32 width = 720; fsl_player_s32 height = 576; static fsl_player_s32 resize_index = 0; static float width_height_table[] = {0.25, 0.5, 0.75, 1, 2, 3, 4}; static fsl_player_s32 offset_x_y_table[] = {600, 500, 400, 300, 200, 100, 0}; if ((++resize_index)==6) resize_index = 0; display_parameter.offsetx = 0;//offset_x_y_table[resize_index]; display_parameter.offsety = 0;//offset_x_y_table[resize_index]; display_parameter.disp_width = width_height_table[resize_index]*width; display_parameter.disp_height = width_height_table[resize_index]*height; pplayer->klass->resize(pplayer, display_parameter); break; #else fsl_player_display_parameter display_parameter; fsl_player_s8 sCommand_x[128]; fsl_player_s8 sCommand_y[128]; fsl_player_s8 sCommand_width[128]; fsl_player_s8 sCommand_height[128]; PRINT("Input [x,y,width,height]:"); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%s %s %s %s",sCommand_x,sCommand_y,sCommand_width,sCommand_height); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); display_parameter.offsetx = atoi(sCommand_x);//offset_x_y_table[resize_index]; display_parameter.offsety = atoi(sCommand_y);//offset_x_y_table[resize_index]; display_parameter.disp_width = atoi(sCommand_width); display_parameter.disp_height = atoi(sCommand_height); if( display_parameter.offsetx < 0 || display_parameter.offsety < 0 || display_parameter.disp_width <= 0 || display_parameter.disp_height <= 0 ) { printf("Invalid resize parameters!\n"); break; } pplayer->klass->resize(pplayer, display_parameter); break; #endif } case 't': // Rotate 90 degree every time { fsl_player_rotation rotate_value; PRINT("Set rotation between 0, 90, 180, 270: "); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%s",sCommand); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); rotate_value = (fsl_player_rotation)atoi(sCommand); if( (fsl_player_s32)rotate_value != 0 && (fsl_player_s32)rotate_value != 90 && (fsl_player_s32)rotate_value != 180 && (fsl_player_s32)rotate_value != 270 ) { printf("Invalid rotation value=%d, rotation value should be between [0, 90, 180, 270]\n", rotate_value); break; } pplayer->klass->rotate(player_handle, rotate_value); break; } case 'c': // playing direction and speed Control. { double playback_rate; PRINT("Set playing speed[-8,-4,-2,0.125,0.25,0.5,1,2,4,8]:"); kb_restore_term(STDIN_FILENO); gbdisplay = FSL_PLAYER_FALSE; scanf("%lf",&playback_rate); gbdisplay = FSL_PLAYER_TRUE; kb_set_raw_term(STDIN_FILENO); pplayer->klass->set_playback_rate(pplayer, playback_rate); break; } case 'i': // Display Metadata Information { print_metadata(player_handle); break; } case 'x': // eXit { //pplayer->klass->stop(pplayer); //pplayer->klass->exit_message_loop(pplayer); // flush all messages left in the message queue. //pplayer->klass->send_message_exit(pplayer); // send a exit message. //gbexit_main = FSL_PLAYER_TRUE; pplayer->klass->send_message_exit(pplayer); player_exit(pplayer); break; } case '*': // Sleep 5 seconds { FSL_PLAYER_SLEEP(5000); break; } case '#': // Sleep 10 seconds { FSL_PLAYER_SLEEP(10000); break; } case 'P': //Property { char prop_name[64] = {0}; PRINT("Please input property name:"); scanf("%s",prop_name); prop_name[63] = '\0'; if(FSL_PLAYER_SUCCESS != pplayer->klass->property(pplayer, prop_name)){ PRINT("Invalid property parameter\n"); } break; } default: //printf("Default: Nothing has been done!\n"); break; } } kb_restore_term (STDIN_FILENO); gbexit_display_thread = FSL_PLAYER_TRUE; if (opt->info_interval_in_sec){ FSL_PLAYER_THREAD_JOIN(display_thread); } FSL_PLAYER_THREAD_JOIN(msg_thread); fsl_player_deinit(player_handle); bail: destroyPlayList(opt->pl); return 0; }
fsl_player_s32 msg_thread_fun(fsl_player_handle handle) { fsl_player* pplayer = (fsl_player*)handle; fsl_player_ui_msg * msg; while(1) { if( FSL_PLAYER_TRUE == gbexit_msg_thread ) { return 0; } msg = NULL; if( FSL_PLAYER_SUCCESS == pplayer->klass->wait_message( handle, &msg, FSL_PLAYER_FOREVER) ) { switch( msg->msg_id ) { case FSL_PLAYER_UI_MSG_EOS: { printf("FSL_PLAYER_UI_MSG_EOS\n"); pplayer->klass->stop(handle); // Wait until eos message has been processed completely. Fix the bug of play/stop hang problem. pplayer->klass->post_eos_semaphore(handle); //printf("\nmsg_thread_fun:=======================================================\n"); if (playlist_next(handle, opt)==NULL){ player_exit(handle); } fsl_player_ui_msg_free(msg); break; } case FSL_PLAYER_UI_MSG_EXIT: { printf("FSL_PLAYER_UI_MSG_EXIT\n"); fsl_player_ui_msg_free(msg); return 0; } case FSL_PLAYER_UI_MSG_INTERNAL_ERROR: { printf("FSL_PLAYER_UI_MSG_INTERNAL_ERROR: internal error message received.\n"); fsl_player_ui_msg_free(msg); player_exit(handle); return 0; } case FSL_PLAYER_UI_MSG_BUFFERING: { fsl_player_ui_msg_body_buffering * pbody = (fsl_player_ui_msg_body_buffering *)(msg->msg_body); if (opt->handle_buffering){ if (pbody->percent==0){ pplayer->klass->pause(pplayer); }else if (pbody->percent>=100){ pplayer->klass->pause(pplayer); } } fsl_player_ui_msg_free(msg); break; } default: { fsl_player_ui_msg_free(msg); break; } } } } return 0; }
/* * Non-blocking getchar * Returns the character if one is available, else it returns -1. */ static int nbgetchar(void) { struct timeval tv = { .tv_sec = 0, .tv_usec = 0 }; fd_set fds; int nr; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv); if (FD_ISSET(STDIN_FILENO, &fds)) nr = getchar(); else nr = -1; return nr; } static void play(const char *url, int cflag) { struct mix *mix = NULL; char *playtoken; int mixid; settermios(); player_init(); playtoken = getplaytoken(); if (playtoken == NULL) { printf("Could not get a playtoken\n"); goto end; } mix = mix_getbyurl(url); if (mix == NULL) { printf("Mix not found.\n"); goto end; } start: printf("%s by %s\n", mix->name, mix->user); playmix(mix->id, playtoken); if (cflag && !quitflag) { mixid = mix->id; mix_free(mix); mix = mix_getbysimilar(mixid, playtoken); if (mix == NULL) printf("Could not get the next mix.\n"); else goto start; } end: mix_free(mix); free(playtoken); player_exit(); resettermios(); } static void playmix(int mixid, const char *playtoken) { struct track *track; int cmd, i; track = track_getfirst(mixid, playtoken); if (track == NULL) { printf("Could not load the playlist.\n"); return; } for (i = 1; track != NULL; ++i) { printf("%02d. %s - %s\n", i, track->performer, track->name); cmd = playtrack(mixid, track, playtoken); track_free(track); if (quitflag) break; if (cmd == NEXT) track = track_getnext(mixid, playtoken); else if (cmd == SKIP) track = track_getskip(mixid, playtoken); else if (cmd == SKIPMIX) break; } } /* * Playtrack plays the track and checks for user input. It returns a * suggestion on what to do next. It can return NEXT to suggest that the track * has finished without user interruption and it is ready for the next track, * or it can return SKIP or SKIPMIX. */ static int playtrack(int mixid, struct track *track, const char *playtoken) { struct timespec tm = { .tv_sec = 0, .tv_nsec = 50000000 }; int ch, cmd = NEXT, reportflag = 0; player_play(track->url); while (player_getstatus() != STOPPED) { if (quitflag) { player_stop(); goto end; } printtime(); ch = nbgetchar(); switch (ch) { case 'q': printf("Quitting...\n"); player_stop(); quitflag = 1; goto end; case '\n': case '\r': printf("Skipping...\n"); if (!track->skipallowedflag) { printf("Skip not allowed.\n"); } else { player_stop(); cmd = SKIP; goto end; } break; case '>': printf("Skipping mix...\n"); player_stop(); cmd = SKIPMIX; goto end; case 'p': case ' ': player_togglepause(); break; default: break; } if (!reportflag && player_getposition() > 30) { report(track->id, mixid, playtoken); reportflag = 1; } nanosleep(&tm, NULL); } end: return cmd; } static void printshortmix(struct mix *mix) { printf("%s\n", mix->url + 1); /* skip first character */ printf("\t%s\n", mix->tags); if (mix->certification != NULL) printf("\tcert: %s\n", mix->certification); if (mix->duration < 0) { printf("\tplays: %d\tlikes: %d\t(%d tracks)\n", mix->playscount, mix->likescount, mix->trackscount); } else { printf("\tplays: %d\t likes: %d\t%d min (%d tracks)\n", mix->playscount, mix->likescount, mix->duration / 60, mix->trackscount); } } static void query(const char *url) { struct mix *mix; mix = mix_getbyurl(url); if (mix == NULL) { printf("Mix not found.\n"); goto end; } printf("Mix name:\t%s ", mix->name); printf("(id: %d)\n", mix->id); printf("Created by:\t%s ", mix->user); printf("(id: %d)\n", mix->userid); printf("Description:\n%s\n", mix->description); printf("Tags:\t%s\n", mix->tags); if (mix->certification) printf("Certification:\t%s\n", mix->certification); printf("Plays: %d\t likes: %d\t%d min (%d tracks)\n", mix->playscount, mix->likescount, mix->duration / 60, mix->trackscount); end: mix_free(mix); } static void printtime(void) { int duration, position; if (player_getstatus() == PAUSED) { printf("(paused) \r"); } else { duration = player_getduration(); position = player_getposition(); printf("%02d:%02d/%02d:%02d\r", position / 60, position % 60, duration / 60, duration % 60); } fflush(stdout); }
int main(int argc,char *argv[]) { play_control_t *pCtrl = NULL; int pid; int pos = 0; int speed = 0; int tmpneedexit = 0; int ret = -1; media_info_t minfo; char tmpcommand[TMP_COMMAND_MAX]; EMU_STEP tmpstep = EMU_STEP_MENU; pCtrl = (play_control_t*)malloc(sizeof(play_control_t)); memset(pCtrl,0,sizeof(play_control_t)); memset(&minfo,0,sizeof(media_info_t)); if(argc<2) { printf("usage:player file\n"); return -1; } player_init(); set_display_axis(0); //move osd out of screen to set video layer out player_register_update_callback(&pCtrl->callback_fn,&update_player_info,1000); printf("player callback register....\n"); pCtrl->file_name = strdup(argv[1]); //pCtrl->nosound = 1; // if disable audio...,must call this api pCtrl->video_index = -1;// MUST pCtrl->audio_index = -1;// MUST pCtrl->sub_index = -1;/// MUST pCtrl->hassub = 1; // enable subtitle //just open a buffer,just for p2p,http,etc... //pCtrl->auto_buffing_enable = 1; // pCtrl->buffing_min = 0.001; // pCtrl->buffing_middle = 0.02; // pCtrl->buffing_max = 0.9; pCtrl->t_pos = -1; // start position, if live streaming, need set to -1 pCtrl->need_start = 0; // if 0,you can omit player_start_play API.just play video/audio immediately. if 1,need call "player_start_play" API; pid=player_start(pCtrl,0); if(pid<0) { printf("player start failed!error=%d\n",pid); return -1; } signal(SIGSEGV, signal_handler); //SYS_disable_osd0(); while((!tmpneedexit)&&(!PLAYER_THREAD_IS_STOPPED(player_get_state(pid)))){ switch (tmpstep) { case EMU_STEP_PAUSE: player_pause(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_RESUME: player_resume(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_SEEK: printf("will seek position:100\n"); pos = 100; player_timesearch(pid,pos); tmpstep = EMU_STEP_MENU; break; break; case EMU_STEP_STOP: player_stop(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_FF: printf("please input fastforward speed:\n"); speed = 1; player_forward(pid,speed); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_RR: printf("please input fastrewind speed:"); speed = 1; player_backward(pid,speed); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_SETLOOP: player_loop(pid); tmpstep = EMU_STEP_MENU; break; case EMU_STEP_EXIT: player_exit(pid); tmpneedexit = 1; break; case EMU_STEP_START: player_start_play(pid); //SYS_set_tsync_enable(0);///< f no sound,can set to be 0 tmpstep = EMU_STEP_MENU; break; case EMU_STEP_GETAVMEDIAINFO: if(pid>=0){ if(player_get_state(pid) > PLAYER_INITOK) { ret = player_get_media_info(pid,&minfo); if(ret==0) _media_info_dump(&minfo); } } tmpstep = EMU_STEP_MENU; break; case EMU_STEP_MENU: do { printf(SCREEN_SPLITER); printf(" player benchmark tool for android v2.0\n"); printf(SCREEN_SPLITER); printf("* Please choose one option *\r\n"); printf("* 0 show main menu *\r\n"); printf("* a start play *\r\n"); printf("* s get media info *\r\n"); printf("* 1 Pause play *\r\n"); printf("* 2 Resume play *\r\n"); printf("* 3 Stop play *\r\n"); printf("* 4 Fastforward *\r\n"); printf("* 5 Fastrewind *\r\n"); printf("* 6 Seek *\r\n"); printf("* 7 Set repeat *\r\n"); printf("* 8 Quit tools *\r\n"); printf(SCREEN_SPLITER); printf("please input you choice:"); memset(tmpcommand,0,TMP_COMMAND_MAX); scanf ("%s",tmpcommand); if (strcmp(tmpcommand,"1")==0){ tmpstep = EMU_STEP_PAUSE; } if (strcmp(tmpcommand,"0")==0){ sleep(1); tmpstep = EMU_STEP_MENU; } else if (strcmp(tmpcommand,"2")==0){ tmpstep = EMU_STEP_RESUME; } else if (strcmp(tmpcommand,"3")==0){ tmpstep = EMU_STEP_STOP; } else if (strcmp(tmpcommand,"4")==0){ tmpstep = EMU_STEP_FF; } else if (strcmp(tmpcommand,"5")==0){ tmpstep = EMU_STEP_RR; } else if (strcmp(tmpcommand,"6")==0) { tmpstep = EMU_STEP_SEEK; } else if (strcmp(tmpcommand,"7")==0) { tmpstep = EMU_STEP_SETLOOP; } else if (strcmp(tmpcommand,"8")==0) { tmpstep = EMU_STEP_EXIT; } else if (strcmp(tmpcommand,"a")==0) { tmpstep = EMU_STEP_START; } else if (strcmp(tmpcommand,"s")==0){ tmpstep = EMU_STEP_GETAVMEDIAINFO; } }while (0); break; } usleep(100*1000); signal(SIGCHLD, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGHUP, signal_handler); signal(SIGTERM, signal_handler); signal(SIGSEGV, signal_handler); signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); } set_display_axis(1); //recover osd free(pCtrl->file_name); free(pCtrl); printf("...........player exit,~,byeybe...........\n"); return 0; }