⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 term.c

📁 mpeg 2 source code for video compression
💻 C
字号:
/*	term: terminal control	copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1	see COPYING and AUTHORS files in distribution or http://mpg123.de	initially written by Michael Hipp*/#include "config.h"#ifdef HAVE_TERMIOS#include <termios.h>#include <unistd.h>#include <ctype.h>#include <sys/time.h>#include <sys/types.h>#include "debug.h"#include "mpg123.h"#include "buffer.h"#include "term.h"#include "common.h"extern int buffer_pid;static int term_enable = 0;static struct termios old_tio;/* initialze terminal */void term_init(void){  struct termios tio;  debug("term_init");  term_enable = 0;  if(tcgetattr(0,&tio) < 0) {    fprintf(stderr,"Can't get terminal attributes\n");    return;  }  old_tio=tio;  tio.c_lflag &= ~(ICANON|ECHO);   tio.c_cc[VMIN] = 1;  tio.c_cc[VTIME] = 0;  if(tcsetattr(0,TCSANOW,&tio) < 0) {    fprintf(stderr,"Can't set terminal attributes\n");    return;  }  term_enable = 1; }static long term_handle_input(struct frame *,int);static int stopped = 0;static int paused = 0;static int pause_cycle;long term_control(struct frame *fr){   long offset = 0;	  if(!term_enable)    return 0;  if(paused) {  	if(!--pause_cycle) {		pause_cycle=(int)(LOOP_CYCLES/compute_tpf(fr));		offset-=pause_cycle;				if(param.usebuffer) {			while(paused && xfermem_get_usedspace(buffermem)) {								buffer_ignore_lowmem();				offset += term_handle_input(fr, TRUE);			}			if(!paused)				offset += pause_cycle;		}	}  }    do {	  offset += term_handle_input(fr, stopped);	    } while (stopped);   return offset;  }static long term_handle_input(struct frame *fr, int do_delay){  int n = 1;  long offset = 0;  extern struct audio_info_struct ai;    while(n > 0) {    fd_set r;    struct timeval t;    char val;    t.tv_sec=0;    t.tv_usec=(do_delay) ? 1000 : 0;        FD_ZERO(&r);    FD_SET(0,&r);    n = select(1,&r,NULL,NULL,&t);    if(n > 0 && FD_ISSET(0,&r)) {      if(read(0,&val,1) <= 0)        break;      switch(tolower(val)) {	case BACK_KEY:        if(!param.usebuffer) audio_queueflush(&ai);	  /*	   * NOTE: rd->rewind() calls buffer_resync() that blocks until	   * buffer process returns ACK. If buffer process is stopped, we	   * end up in a deadlock. The only acceptable workaround was to	   * resume playing as soon as BACK_KEY is pressed. This is not	   * necessary when running non-buffered but I chose to remain	   * compatible. [dk]	   */	  if(stopped) {		  stopped = 0;		  if(param.usebuffer)		  	buffer_start();		  fprintf(stderr, "%s", EMPTY_STRING);	  }	  if(paused)		  pause_cycle=(int)(LOOP_CYCLES/compute_tpf(fr));          rd->rewind(rd);          fr->num=0;          break;	case NEXT_KEY:		if(!param.usebuffer) audio_queueflush(&ai);	  if (buffer_pid)		  kill(buffer_pid, SIGINT);	  next_track();	  break;	case QUIT_KEY:	  if (buffer_pid)		  kill(buffer_pid, SIGTERM);	  kill(getpid(), SIGTERM);	  break;	case PAUSE_KEY:  	  paused=1-paused;	  if(paused) {		  pause_cycle=(int)(LOOP_CYCLES/compute_tpf(fr));		  offset -= pause_cycle;	  }	  if(stopped) {		stopped=0;		if(param.usebuffer)			buffer_start();	  }	  fprintf(stderr, "%s", (paused) ? PAUSED_STRING : EMPTY_STRING);	  break;	case STOP_KEY:	case ' ':	  stopped=1-stopped;	  if(paused) {		  paused=0;		  offset -= pause_cycle;	  }	  if(param.usebuffer) 		  (stopped) ? buffer_stop() : buffer_start();	  fprintf(stderr, "%s", (stopped) ? STOPPED_STRING : EMPTY_STRING);	  break;	case FINE_REWIND_KEY:	  offset--;	  break;	case FINE_FORWARD_KEY:	  offset++;	  break;	case REWIND_KEY:  	  offset-=10;	  break;	case FORWARD_KEY:	  offset+=10;	  break;	case FAST_REWIND_KEY:	  offset-=50;	  break;	case FAST_FORWARD_KEY:	  offset+=50;	  break;	case HELP_KEY:	  fprintf(stderr,"\n\n -= terminal control keys =-\n[%c] or space bar\t interrupt/restart playback (i.e. 'pause')\n[%c]\t next track\n[%c]\t back to beginning of track\n[%c]\t pause while looping current sound chunk\n[%c]\t forward\n[%c]\t rewind\n[%c]\t fast forward\n[%c]\t fast rewind\n[%c]\t fine forward\n[%c]\t fine rewind\n[%c]\t this help\n[%c]\t quit\n\n",		        STOP_KEY, NEXT_KEY, BACK_KEY, PAUSE_KEY, FORWARD_KEY, REWIND_KEY, FAST_FORWARD_KEY, FAST_REWIND_KEY, FINE_FORWARD_KEY, FINE_REWIND_KEY, HELP_KEY, QUIT_KEY);	break;	case FRAME_INDEX_KEY:		print_frame_index(stderr);	break;	default:	  ;      }    }  }  return offset;}void term_restore(void){    if(!term_enable)    return;  tcsetattr(0,TCSAFLUSH,&old_tio);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -