📄 slang_c.c
字号:
static void ctl_close(void){ if (ctl.opened) { SLsmg_normal(); SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); SLsmg_refresh(); SLsmg_reset_smg(); SLang_reset_tty(); ctl.opened=0; }}static int ctl_read(int32 *valp){ int c; if (!SLang_input_pending(0)) return RC_NONE; c=SLang_getkey(); switch(c) { case 'h': case '?': ctl_help_mode(); return RC_NONE; case 'V': *valp=10; return RC_CHANGE_VOLUME; case 'v': *valp=-10; return RC_CHANGE_VOLUME; case 'q': return RC_QUIT; case 'n': return RC_NEXT; case 'p': return RC_REALLY_PREVIOUS; case 'r': return RC_RESTART; case 'f': *valp=play_mode->rate; return RC_FORWARD; case 'b': *valp=play_mode->rate; return RC_BACK; case 's': return RC_TOGGLE_PAUSE; } return RC_NONE;}/*ARGSUSED*/static void ctl_lyric(int lyricid){ char *lyric; lyric = event2string(lyricid); if(lyric != NULL) { if(*lyric == ME_KARAOKE_LYRIC) { if(lyric[1] == '/') { display_lyric("\n", LYRIC_WORD_NOSEP); display_lyric(lyric + 2, LYRIC_WORD_NOSEP); } else if(lyric[1] == '\\') { display_lyric("\r", LYRIC_WORD_NOSEP); display_lyric(lyric + 2, LYRIC_WORD_NOSEP); } else if(lyric[1] == '@' && lyric[2] == 'T') { if(ctl.trace_playing) { display_lyric("\n", LYRIC_WORD_NOSEP); display_lyric(lyric + 3, LYRIC_WORD_SEP); } else display_title(lyric + 3); } else if(lyric[1] == '@' && lyric[2] == 'L') { init_lyric(lyric + 3); } else display_lyric(lyric + 1, LYRIC_WORD_NOSEP); } else { if(*lyric == ME_CHORUS_TEXT || *lyric == ME_INSERT_TEXT) display_lyric("\r", LYRIC_WORD_SEP); display_lyric(lyric + 1, LYRIC_WORD_SEP); } }}static int cmsg(int type, int verbosity_level, char *fmt, ...){ va_list ap; char p[1000]; if ((type==CMSG_TEXT || type==CMSG_INFO || type==CMSG_WARNING) && ctl.verbosity<verbosity_level) return 0; va_start(ap, fmt); if (!ctl.opened) { vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); } else if (ctl.trace_playing) { switch(type) { /* Pretty pointless to only have one line for messages, but... */ case CMSG_WARNING: case CMSG_ERROR: case CMSG_FATAL: SLsmg_gotorc(2,0); SLsmg_erase_eol(); SLsmg_bold(); vsnprintf(p, sizeof(p), fmt, ap); SLsmg_write_string(p); SLsmg_normal(); _ctl_refresh(); if (type==CMSG_WARNING) sleep(1); /* Don't you just _HATE_ it when programs do this... */ else sleep(2); SLsmg_gotorc(2,0); SLsmg_erase_eol(); _ctl_refresh(); break; } } else { SLsmg_gotorc(msg_row++,0); if(msg_row==SLtt_Screen_Rows){ int i; msg_row=6; for(i=6;i<=SLtt_Screen_Rows;i++){ SLsmg_gotorc(i,0); SLsmg_erase_eol(); } } switch(type) { default: vsnprintf(p, sizeof(p), fmt, ap); SLsmg_write_string(p); _ctl_refresh(); break; case CMSG_WARNING: SLsmg_bold(); vsnprintf(p, sizeof(p), fmt, ap); SLsmg_write_string(p); SLsmg_normal(); _ctl_refresh(); break; case CMSG_ERROR: case CMSG_FATAL: SLsmg_bold(); vsnprintf(p, sizeof(p), fmt, ap); SLsmg_write_string(p); SLsmg_normal(); _ctl_refresh(); if (type==CMSG_FATAL) sleep(2); break; } } va_end(ap); return 0;}/* Indicator */static void reset_indicator(void){ int i; memset(comment_indicator_buffer, ' ', indicator_width - 1); comment_indicator_buffer[indicator_width - 1] = '\0'; next_indicator_chan = -1; indicator_last_update = get_current_calender_time(); indicator_mode = INDICATOR_DEFAULT; indicator_msgptr = NULL; for(i = 0; i < MAX_CHANNELS; i++) { instr_comment[i].last_note_on = 0.0; instr_comment[i].comm = channel_instrum_name(i); }}static void update_indicator(void){ double t; int i; char c; t = get_current_calender_time(); if(indicator_mode != INDICATOR_DEFAULT) { int save_chan; if(indicator_last_update + SCRMODE_OUT_THRESHOLD > t) return; save_chan = next_indicator_chan; reset_indicator(); next_indicator_chan = save_chan; } else { if(indicator_last_update + INDICATOR_UPDATE_TIME > t) return; } indicator_last_update = t; if(indicator_msgptr != NULL && *indicator_msgptr == '\0') indicator_msgptr = NULL; if(indicator_msgptr == NULL) { if(next_indicator_chan >= 0 && instr_comment[next_indicator_chan].comm != NULL && *instr_comment[next_indicator_chan].comm) { current_indicator_chan = next_indicator_chan; } else { int prog; prog = instr_comment[current_indicator_chan].prog; for(i = 0; i < MAX_CHANNELS; i++) { current_indicator_chan++; if(current_indicator_chan == MAX_CHANNELS) current_indicator_chan = 0; if(instr_comment[current_indicator_chan].comm != NULL && *instr_comment[current_indicator_chan].comm && instr_comment[current_indicator_chan].prog != prog && (instr_comment[current_indicator_chan].last_note_on + CHECK_NOTE_SLEEP_TIME > t || instr_comment[current_indicator_chan].disp_cnt == 0)) break; } if(i == MAX_CHANNELS) return; } next_indicator_chan = -1; if(instr_comment[current_indicator_chan].comm == NULL || *instr_comment[current_indicator_chan].comm == '\0') return; snprintf(current_indicator_message, indicator_width, "%03d:%s ", instr_comment[current_indicator_chan].prog, instr_comment[current_indicator_chan].comm); instr_comment[current_indicator_chan].disp_cnt++; indicator_msgptr = current_indicator_message; } c = *indicator_msgptr++; for(i = 0; i < indicator_width - 2; i++) comment_indicator_buffer[i] = comment_indicator_buffer[i + 1]; comment_indicator_buffer[indicator_width - 2] = c; SLsmg_printfrc(2,0,comment_indicator_buffer); ctl_refresh();}static void display_lyric(char *lyric, int sep){ char *p; int len, idlen, sepoffset; static int crflag = 0; if(lyric == NULL) { indicator_last_update = get_current_calender_time(); crflag = 0; return; } if(indicator_mode != INDICATOR_LYRIC || crflag) { memset(comment_indicator_buffer, 0, indicator_width); SLsmg_gotorc(lyric_row,0); SLsmg_erase_eol(); ctl_refresh(); indicator_mode = INDICATOR_LYRIC; crflag = 0; } if(*lyric == '\0') { indicator_last_update = get_current_calender_time(); return; } else if(*lyric == '\n') { if(!ctl.trace_playing) { crflag = 1; lyric_row++; SLsmg_gotorc(0,lyric_row); return; } else lyric = " / "; } if(strchr(lyric, '\r') != NULL) { crflag = 1; if(!ctl.trace_playing) { int i; for(i = title_row+1; i <= lyric_row; i++) { SLsmg_gotorc(i,0); SLsmg_erase_eol(); } lyric_row = title_row+1; } if(lyric[0] == '\r' && lyric[1] == '\0') { indicator_last_update = get_current_calender_time(); return; } } idlen = strlen(comment_indicator_buffer); len = strlen(lyric); if(sep) { while(idlen > 0 && comment_indicator_buffer[idlen - 1] == ' ') comment_indicator_buffer[--idlen] = '\0'; while(len > 0 && lyric[len - 1] == ' ') len--; } if(len == 0) { /* update time stamp */ indicator_last_update = get_current_calender_time(); reuse_mblock(&tmpbuffer); return; } sepoffset = (sep != 0); if(len >= indicator_width - 2) { memcpy(comment_indicator_buffer, lyric, indicator_width - 1); comment_indicator_buffer[indicator_width - 1] = '\0'; } else if(idlen == 0) { memcpy(comment_indicator_buffer, lyric, len); comment_indicator_buffer[len] = '\0'; } else if(len + idlen + 2 < indicator_width) { if(sep) comment_indicator_buffer[idlen] = sep; memcpy(comment_indicator_buffer + idlen + sepoffset, lyric, len); comment_indicator_buffer[idlen + sepoffset + len] = '\0'; } else { int spaces; p = comment_indicator_buffer; spaces = indicator_width - idlen - 2; while(spaces < len) { char *q; /* skip one word */ if((q = strchr(p, ' ')) == NULL) { p = NULL; break; } do q++; while(*q == ' '); spaces += (q - p); p = q; } if(p == NULL) { SLsmg_gotorc(lyric_row,0); SLsmg_erase_eol(); memcpy(comment_indicator_buffer, lyric, len); comment_indicator_buffer[len] = '\0'; } else { int d, l, r, i, j; d = (p - comment_indicator_buffer); l = strlen(p); r = len - (indicator_width - 2 - l - d); j = d - r; for(i = 0; i < j; i++) comment_indicator_buffer[i] = ' '; for(i = 0; i < l; i++) comment_indicator_buffer[j + i] = comment_indicator_buffer[d + i]; if(sep) comment_indicator_buffer[j + i] = sep; memcpy(comment_indicator_buffer + j + i + sepoffset, lyric, len); comment_indicator_buffer[j + i + sepoffset + len] = '\0'; } } SLsmg_printfrc(lyric_row,0,"%s",comment_indicator_buffer); ctl_refresh(); reuse_mblock(&tmpbuffer); indicator_last_update = get_current_calender_time();}static void display_title(char *title){ SLsmg_printfrc(title_row,0,"Title:"); SLsmg_bold(); SLsmg_printfrc(title_row++,7,"%s", title); SLsmg_normal(); lyric_row = title_row + 1;}static void init_lyric(char *lang){ int i; if(ctl.trace_playing) return; for(i=6;i<=SLtt_Screen_Rows;i++){ SLsmg_gotorc(i,0); SLsmg_erase_eol(); }}static void ctl_event(CtlEvent *e){ switch(e->type) { case CTLE_NOW_LOADING: ctl_file_name((char *)e->v1); break; case CTLE_LOADING_DONE: break; case CTLE_PLAY_START: ctl_total_time((int)e->v1); break; case CTLE_PLAY_END: break; case CTLE_TEMPO: break; case CTLE_METRONOME: /* update_indicator(); */ break; case CTLE_CURRENT_TIME: ctl_current_time((int)e->v1, (int)e->v2); break; case CTLE_NOTE: ctl_note((int)e->v1, (int)e->v2, (int)e->v3, (int)e->v4); break; case CTLE_MASTER_VOLUME: ctl_master_volume((int)e->v1); break; case CTLE_PROGRAM: ctl_program((int)e->v1, (int)e->v2); break; case CTLE_VOLUME: ctl_volume((int)e->v1, (int)e->v2); break; case CTLE_EXPRESSION: ctl_expression((int)e->v1, (int)e->v2); break; case CTLE_PANNING: ctl_panning((int)e->v1, (int)e->v2); break; case CTLE_SUSTAIN: ctl_sustain((int)e->v1, (int)e->v2); break; case CTLE_PITCH_BEND: ctl_pitch_bend((int)e->v1, (int)e->v2); break; case CTLE_MOD_WHEEL: ctl_pitch_bend((int)e->v1, e->v2 ? -1 : 0x2000); break; case CTLE_CHORUS_EFFECT: break; case CTLE_REVERB_EFFECT: break; case CTLE_LYRIC: ctl_lyric((int)e->v1); break; case CTLE_REFRESH: ctl_refresh(); break; case CTLE_RESET: ctl_reset(); break; }}/* * interface_<id>_loader(); */ControlMode *interface_s_loader(void){ return &ctl;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -