📄 mono.c
字号:
break; case eAudioFormat_UNKNOWN: audio_type_string = "Unknown"; break; } prop.lineWidth = 0; prop.fgColor = MONO_DEFAULT_RECT_FORGROUND_COLOR; RMFRTKDrawRect(mono_opt.rtk, &mono_opt.osd_rect, &prop); point.x = 64; point.y = 90; RMFRTKDrawString(mono_opt.rtk, "Now playing file:", &point, &info_face, NULL); point.y += info_face.scale; RMFRTKDrawString(mono_opt.rtk, basename, &point, &data_face, NULL); point.y += data_face.scale; RMFRTKDrawString(mono_opt.rtk, "Audio Type:", &point, &info_face, NULL); point.y += info_face.scale; RMFRTKDrawString(mono_opt.rtk, audio_type_string, &point, &data_face, NULL); point.y += data_face.scale; /* for mp3, try to display the id3 tag fields */ if((stream_info->system_type == RM_SYSTEM_ELEMENTARY_AUDIO) && (stream_info->audio_type == eAudioFormat_MPEG1_LAYER3)){ RMID3v1Tag id3_tag; RMuint8 buf[1024]; RMuint32 count; RMfile file; struct stream_options_s stream_options; init_stream_options(&stream_options); file = open_stream(filename, RM_FILE_OPEN_READ, &stream_options); if (file == NULL) { RMDBGLOG((ENABLE, "Cannot open file %s\n", filename)); return RM_ERROR; } if (RMSeekFile(file, -512, RM_FILE_SEEK_END) != RM_OK) { RMDBGLOG((ENABLE, "seeking file to the last 1Kb\n")); return RM_ERROR; } err = RMReadFile(file, buf, 512, &count); if(RMFAILED(err)){ RMDBGLOG((ENABLE, "Cannot read form file\n")); return RM_ERROR; } RMCloseFile(file); err = RMReadID3v1(buf, 512, &id3_tag); if(err == RM_OK){ RMFRTKDrawString(mono_opt.rtk, "Song Title:", &point, &info_face, NULL); point.y += info_face.scale; RMFRTKDrawString(mono_opt.rtk, id3_tag.Title, &point, &data_face, NULL); point.y += data_face.scale; RMFRTKDrawString(mono_opt.rtk, "Artist:", &point, &info_face, NULL); point.y += info_face.scale; RMFRTKDrawString(mono_opt.rtk, id3_tag.Artist, &point, &data_face, NULL); point.y += data_face.scale; RMFRTKDrawString(mono_opt.rtk, "Album:", &point, &info_face, NULL); point.y += info_face.scale; RMFRTKDrawString(mono_opt.rtk, id3_tag.Album, &point, &data_face, NULL); point.y += data_face.scale; RMFRTKDrawString(mono_opt.rtk, "Comment:", &point, &info_face, NULL); point.y += info_face.scale; RMFRTKDrawString(mono_opt.rtk, id3_tag.Comment, &point, &data_face, NULL); point.y += data_face.scale; } if(err == RM_OK){ fprintf(stderr, "title %s\nartist %s\nalbum %s\ntrack %d\nyear %s\ngenre %d\ncomment %s\n", id3_tag.Title, id3_tag.Artist, id3_tag.Album, id3_tag.Track, id3_tag.Year, id3_tag.Genre, id3_tag.Comment); } } return RM_OK;} static inline void gui_show_filename(){ RtkPoint point; RtkProp prop; RMascii filename_copy[256], *basename, *tmp; /* erase last filename */ prop.lineWidth = 0; prop.fgColor = MONO_DEFAULT_RECT_FORGROUND_COLOR; RMFRTKDrawRect(mono_opt.rtk, &mono_opt.osd_rect, &prop); RMCopyAscii(filename_copy, play_opt.filename); /* if too long, will need to be modified */ basename = filename_copy; while(RMFindAsciiCharacter (basename, '/', &tmp)) basename = ++tmp; if(RMasciiLength(basename)>30){ basename[27] = '\0'; RMAppendAscii (basename, "..."); } point.x = 64; point.y = 300; RMFRTKDrawString(mono_opt.rtk , basename, &point, &data_face, NULL); RMDBGLOG((MONODBG, "-----> about to play %s\n", basename)); point.x = 64; point.y = 256; RMFRTKDrawString(mono_opt.rtk , "Press q to quit, N to skip, p to play:", &point, &info_face, NULL);}static inline RMstatus gui_init_osd(){ Rtk86Handle handle; RMstatus err; struct osd_picture_info osd_picture = {0}; osd_picture.scaler = 0; osd_picture.route = DCCRoute_Main; osd_picture.enable = TRUE; osd_picture.filename = "mono.bmp"; osd_picture.dramblock = 0; osd_picture.alpha = 128; osd_picture.alpha_merge = FALSE; osd_picture.zoom = FALSE; osd_picture.color_space = EMhwlibColorSpace_None; osd_picture.orientation = FRTop_FCLeft; set_default_out_window(&(osd_picture.source_window)); set_default_out_window(&(osd_picture.output_window)); err = DCCGetScalerModuleID(dcc_info.pDCC, osd_picture.route, DCCSurface_OSD, osd_picture.scaler, &(mono_opt.osd_scaler)); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Cannot get surface to display OSD source %d\n", err)); return err; } err = apply_osd_picture(&dcc_info, &osd_picture, NULL, &(mono_opt.osd_source)); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Cannot open osd source %s\n", RMstatusToString(err))); return err; } handle.pOSDSource = mono_opt.osd_source; handle.pRUA = dcc_info.pRUA; mono_opt.rtk = RMFRTKOpen(&handle); { RMnonAscii *naname = RMnonAsciiFromAscii("Vera.ttf"); err = RMFRTKLoadFontFile( mono_opt.rtk, naname); RMFreeNonAscii(naname); if (RMFAILED(err)) { fprintf(stderr, "Cannot load font file \'Vera.ttf\': %s\n", RMstatusToString(err)); return err; } } mono_opt.osd_rect.x = 50; mono_opt.osd_rect.y = 90; mono_opt.osd_rect.width = 620; mono_opt.osd_rect.height = 350; osd_enabled = TRUE; return RM_OK;}static inline RMstatus init_dcc_info(){ RMstatus err; err = RUACreateInstance(&(dcc_info.pRUA), play_opt.chip_num); if (RMFAILED(err)) { RMDBGLOG((MONODBG, "Error creating RUA instance! %d\n", err)); return err; } err = DCCOpen(dcc_info.pRUA, &(dcc_info.pDCC)); if (RMFAILED(err)) { RMDBGLOG((MONODBG, "Error Opening DCC! %d\n", err)); return err; } if (!play_opt.noucode) { err = DCCInitMicroCodeEx(dcc_info.pDCC, disp_opt.init_mode); if (RMFAILED(err)) { RMDBGLOG((MONODBG, "Cannot initialize microcode %d\n", err)); return err; } } dcc_info.chip_num = play_opt.chip_num; dcc_info.route = DCCRoute_Main; // comment the following line to compile this file under em8620branch disp_opt.dh_info->pDH = NULL; return RM_OK;}static void show_usage(char *progname){ fprintf(stderr, "MONO OPTIONS\n" "\t-forceSD: SD profile used instead of HD\n" "\t-R: If filename is a directory, play its sub-directories recursively\n" "\t-nogui: don't display the GUI (defaut is yes)\n" "\t-demux <soft|hard|auto>: Set demuxing method (default is auto)\n" "\t-jpeg <soft|hard|auto>: Set jpeg decompression method (default is auto)\n" "\t-cc <tv|soft|608soft|708soft>: Selects the closed caption display mode.\n" "\t-sat: send audio while in trickmode (default is not to send it)\n" "\t-displayerror <threshold>: sets display error threshold [0]\n" "\t-err_prop_threshold <threshold> : sets anchor error propagation threshold\n" "\t-err_prop_length <length> : sets anchor error propagation length\n" ); show_playback_options(); show_display_options(); fprintf(stderr, "------------------------------------------------m-0-n-o-----\n"); fprintf(stderr, "Minimum cmd line: %s filename [remote control device (Ex: /dev/ttyS0)] \n", progname); fprintf(stderr, "------------------------------------------------------------\n"); exit(1);}static void parse_cmdline(int argc, char *argv[], struct mono_info *opts){ int i; RMstatus err; // FIXME: temp soln to "internal error--unrecognizable insn" // moved 'app_params.noDolby = FALSE' from main() to here opts->noDolby = FALSE; if (argc < 2) show_usage(argv[0]); i = 1; while ((argc > i)) { /* RMDBGLOG((ENABLE,"Arg %d : %s\n", i, argv[i])); */ err = RM_OK; if (argv[i][0] != '-') { if (filename == NULL) { filename = argv[i]; i++; } else if (remote_dev == NULL) { remote_dev = argv[i]; i++; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-R")) { mono_opt.recurse_dirs = TRUE; i++; } else if ( ! strcmp(argv[i], "-nogui")) { mono_opt.use_gui = FALSE; i++; } else if ( ! strcmp(argv[i], "-automode")) { setMonoAuto(); // set to auto mode i++; } else if ( ! strcmp(argv[i], "-use_multiple_audio")) { if (argc > i+1) { RMuint32 instances; RMasciiToUInt32(argv[i+1], &instances); i += 2; if ((instances > MAX_AUDIO_DECODER_INSTANCES) || (instances <= 0)) show_usage(argv[0]); mono_opt.audio_instances = instances; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-demux")) { if (argc > i+1) { if( ! strcmp(argv[i+1], "soft")) { mono_opt.demux_decode = mono_decode_soft; } else if( ! strcmp(argv[i+1], "hard")) { mono_opt.demux_decode = mono_decode_hard; } else if( ! strcmp(argv[i+1], "auto")) { mono_opt.demux_decode = mono_decode_auto; } else{ show_usage(argv[0]); } i+=2; } } else if ( ! strcmp(argv[i], "-jpeg")) { RMDBGLOG((ENABLE, "jpeg, and next is %s\n", argv[i+1])); if (argc > i+1) { if( ! strcmp(argv[i+1], "soft")) { mono_opt.jpeg_decode = mono_decode_soft; } else if( ! strcmp(argv[i+1], "hard")) { mono_opt.jpeg_decode = mono_decode_hard; } else if( ! strcmp(argv[i+1], "auto")) { mono_opt.jpeg_decode = mono_decode_auto; } else{ show_usage(argv[0]); } i+=2; } else{ show_usage(argv[0]); } } else if ( ! strcmp(argv[i], "-sw")) { mono_opt.demux_decode = mono_decode_soft; i++; } else if ( ! strcmp(argv[i], "-forceSD")) { mono_opt.force_sd = TRUE; i++; } else if (! strcmp(argv[i], "-nodolby")) { opts->noDolby = TRUE; i++; } else if ( ! strcmp(argv[i], "-past")) { opts->play_opt->require_video_audio = FALSE; i++; } else if ( ! strcmp(argv[i], "-disk_control")) { /* from bug #4005 comment #18: for disk_ctrl_low_level i assume that i takes about 1 second to resume the harddisk, which gives 16 blocks at a blocksize of 128 kb at 2 mb/s stream. */ opts->play_opt->disk_ctrl_state = DISK_CONTROL_STATE_RUNNING; opts->play_opt->disk_ctrl_low_level = 16; opts->play_opt->prebuf_max = 1024 * 1024; fprintf(stderr, ">> disk control enabled, low level is %lu, prebuf_max is %lu bytes\n", opts->play_opt->disk_ctrl_low_level, opts->play_opt->prebuf_max); i++; } else if ( ! strcmp(argv[i], "-max_mem")) { if (argc > i+1) { RMasciiToUInt32(argv[i+1], &(opts->play_opt->disk_ctrl_max_mem)); opts->play_opt->disk_ctrl_max_mem *= 1024; i += 2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-max_usable_RUA_mem")) { if (argc > i+1) { RMasciiToUInt32(argv[i+1], &(opts->play_opt->max_usable_RUA_mem)); opts->play_opt->max_usable_RUA_mem *= 1024; i += 2; } else show_usage(argv[0]); } else if ( ! strcmp(argv[i], "-block_size")) { if (argc > i+1) { RMasciiToUInt32(argv[i+1], &(opts->play_opt->disk_ctrl_log2_block_size)); i += 2; } else show_usage(argv[0]); } else if (! strcmp(argv[i], "-cc")) { if (argc > i+1) { if (RMCompareAscii(argv[i+1], "tv")) { mono_opt.display_cc = TRUE; mono_opt.use_soft_cc_decoder = 0; } else if (RMCompareAscii(argv[i+1], "soft") || RMCompareAscii(argv[i+1], "608soft") || RMCompareAscii(argv[i+1], "cc1")) { mono_opt.display_cc = TRUE; mono_opt.use_soft_cc_decoder = 1; mono_opt.cc_select = EMhwlibCCSelect_CC1; } else if(RMCompareAscii(argv[i+1], "cc2") ){ mono_opt.display_cc = TRUE; mono_opt.use_soft_cc_decoder = 1; mono_opt.cc_select = EMhwlibCCSelect_CC2; } else if(RMCompareAscii(argv[i+1], "cc3") ){ mono_opt.display_cc = TRUE; mono_opt.use_soft_cc_decoder = 1; mono_opt.cc_select = EMhwlibCCSelect_CC3; } else if(RMCompareAscii(argv[i+1], "cc4") ){ mono_opt.display_cc = TRUE; mono_opt.use_soft_cc_decoder = 1; mono_opt.cc_select = EMhwlibCCSelect_CC4; } else if(RMCompareAscii(argv[i+1], "708soft")) { mono_opt.display_cc = TRUE; mono_opt.use_soft_cc_decoder = 2; } else if(RMCompareAscii(argv[i+1], "off")) { mono_opt.display_cc = FALSE; } else { show_usage(argv[0]); } i += 2; } else show_usage(argv[0]); } else if (!strcmp(argv[i], "-displayerror")) { if (argc > i+1) { RMasciiToUInt32(argv[i+1], &(mono_opt.display_error_threshold)); i += 2; } else show_usage(argv[0]); } else if (!strcmp(argv[i], "-err_prop_threshold")) { if (argc > i+1) { RMasciiToUInt32(argv[i+1], &(mono_opt.AnchorErrPropagationThreshold)); i += 2; } else show_usage(argv[0]); } else if (!strcmp(argv[i], "-err_prop_length")) { if (argc > i+1) { RMasciiToUInt32(argv[i+1], &(mono_opt.AnchorErrPropagationLength)); i += 2; } else show_usage(argv[0]); } else { err = parse_playback_cmdline(argc, argv, &i, &play_opt); if (err == RM_ERROR) show_usage(argv[0]); if (err != RM_PENDING) continue; err = parse_display_cmdline(argc, argv, &i, &disp_opt); if (err == RM_ERROR) show_usage(argv[0]); if (err != RM_PENDING) continue; err = parse_video_cmdline(argc, argv, &i, &video_opt); if (err == RM_ERROR) show_usage(argv[0]); if (err != RM_PENDING) continue; } if (err == RM_PENDING) show_usage(argv[0]); } if (filename == NULL){ show_usage(argv[0]); } if (opts->play_opt->disk_ctrl_low_level) { if ((!opts->play_opt->disk_ctrl_max_mem) || (!opts->play_opt->disk_ctrl_log2_block_size)) { fprintf(stderr, "**** disk control enabled, but not all required parameters where specified!\n\n\n\n"); show_usage(argv[0]); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -