📄 hslab.c
字号:
case DELETE_OP: undo.lab = *p; break; case CHANGE_OP: undo.ptr = p; undo.lab = *p; break; default: break; } undo.op = op; undo.lset = labSet; undoEmpty = FALSE;}/* UndoOp: use the information stored in undo to undo the last operation */void UndoOp(void){ Label p; char sbuf[256]; if (undoEmpty) return; if (undo.lset!=labSet) { sprintf(sbuf, "Undo operation applies to label set [%d]", undo.lset); PrintMsg(&io_Win, sbuf); return; } switch (undo.op) { case CREATE_OP: undo.op = DELETE_OP; undo.lab = *(undo.ptr); DeleteLabObj(llist, undo.ptr); break; case DELETE_OP: undo.op = CREATE_OP; undo.ptr = CreateLabObj(llist, undo.lab.labid, (long) undo.lab.start, (long) undo.lab.end); break; case CHANGE_OP: p = *(undo.ptr); *(undo.ptr) = undo.lab; undo.lab = p; break; default: break; } labsModified = TRUE; PlotLabWin();}/* ---------------------------- Button Commands -------------------------- */#define FIXLABSTR sprintf(levStr, "Set [%d]", labSet);/* DoZoomOut: zoom out of the current view */Boolean DoZoomOut(void){ if (zoomLev==0){ /* nothing to zoom out from */ return FALSE; } /* decrement zoomLev, restore previous view (not affected by any scrolls) */ zoomLev--; sStart = zoomRec[zoomLev].st; sEnd = zoomRec[zoomLev].en; PreparePlot(&waveWin, data, sStart, sEnd); markA = zoomRec[zoomLev].regA; markB = zoomRec[zoomLev].regB; /* plot the wave form */ PlotWaveWin(); PlotLabWin(); /* re-display the marked region */ regnMarked = FALSE; InvertRegion(&waveWin, markA, markB); return TRUE;}/* DoZoomIn: zoom into a region */Boolean DoZoomIn(void){ int zoomA, zoomB; int s_st, s_en; if (zoomLev==MAX_ZOOM || samplesPt <= 1.0){ /* too many zooms so exit */ PrintMsg(&io_Win, "Maximum zoom level reached."); return FALSE; } if (!GetRegionAB(&zoomA, &zoomB)){ PrintMsg(&io_Win, "Zoom In aborted."); return FALSE; } /* record the current zoom level start and end samples */ zoomRec[zoomLev].st = sStart; zoomRec[zoomLev].en = sEnd; zoomRec[zoomLev].regA = zoomA; zoomRec[zoomLev].regB = zoomB; zoomLev++; /* compute the new start and end samples */ s_st = Point2Sample(&waveWin, zoomA); s_en = Point2Sample(&waveWin, zoomB); sStart = s_st; sEnd = s_en; AdjustBounds(&waveWin); PreparePlot(&waveWin, data, sStart, sEnd); /* plot the wave form */ PlotWaveWin(); PlotLabWin(); return TRUE;}/* DoMark: mark a region */Boolean DoMark(int *markA, int *markB){ /* check if region marked, if so unmark */ if (regnMarked) InvertRegion(&waveWin, *markA, *markB); if (!GetRegionAB(markA, markB)){ PrintMsg(&io_Win, "Mark region aborted."); return FALSE; } InvertRegion(&waveWin, *markA, *markB); return TRUE;}/* DoUnMark: unmark marked region */void DoUnMark(int markA, int markB){ if (regnMarked) InvertRegion(&waveWin, markA, markB);}/* DoRestore: restore to full view, unmark any regions */void DoRestore(void){ DrawRectWin(&waveWin); wavePtrOn=FALSE; HSetColour(BLACK); sStart = 0; sEnd = T; zoomLev = 0; PreparePlot(&waveWin, data, sStart, sEnd); PlotWaveWin(); PlotLabWin(); regnMarked = FALSE;}/* DoScrollRight: scroll right thru the waveform */void DoScrollRight(void){ int x, y, w, h; int sShift, ScrollPt; /* check if already at the end sample, if so exit */ if (sEnd==T){ PrintMsg(&io_Win, "Last sample reached"); return; } /* unmark any marked regions */ if (regnMarked) InvertRegion(&waveWin, markA, markB); sShift = (int) (SCROLL_PT*samplesPt); /* adjust the new start and end points */ if (sEnd + sShift > T){ sShift = T - sEnd; ScrollPt = (int) (sShift / samplesPt); } else ScrollPt = SCROLL_PT; WPtrOff(); x = waveWin.x + 1; y = waveWin.y + 1; w = waveWin.w - 1; h = waveWin.h - 1; HCopyArea(x + ScrollPt, y, w - ScrollPt, h, x, y); HSetColour(waveWin.bg); HFillRectangle(x + w - ScrollPt, y, x + w, y + h); HSetColour(waveWin.fg); sStart += sShift; sEnd += sShift; PreparePlot(&waveWin, data, sStart, sEnd); wavePtrOn=FALSE; HSetColour(BLACK); PlotWaveForm(&waveWin, w - ScrollPt, w); PlotLabWin();}/* DoScrollLeft: scroll left thru the waveform */void DoScrollLeft(void){ int x, y, w, h; int sShift, ScrollPt; /* check if already at the first sample, if so exit */ if (sStart==0){ PrintMsg(&io_Win, "First sample reached"); return; } /* unmark region */ if (regnMarked) InvertRegion(&waveWin, markA, markB); sShift = (int) (SCROLL_PT*samplesPt); if (sStart - sShift < 0){ sShift = sStart; ScrollPt = (int) (sShift / samplesPt); } else ScrollPt = SCROLL_PT; WPtrOff(); x = waveWin.x + 1; y = waveWin.y + 1; w = waveWin.w - 1; h = waveWin.h - 1; HCopyArea(x, y, w - ScrollPt, h, x + ScrollPt, y); HSetColour(waveWin.bg); HFillRectangle(x, y, x + ScrollPt, y + h); HSetColour(waveWin.fg); sStart -= sShift; sEnd -= sShift; PreparePlot(&waveWin, data, sStart, sEnd); wavePtrOn=FALSE; HSetColour(BLACK); PlotWaveForm(&waveWin, 1, ScrollPt+1); PlotLabWin();}/* DoIncScale: increment the waveform scale factor */void DoIncScale(void){ Boolean was; was = regnMarked; scIndex = (scIndex + 1) % NUM_OF_SCALES; scale_btn->str = scString[scIndex]; RedrawHButton(scale_btn); PreparePlot(&waveWin, data, sStart, sEnd); PlotWaveWin(); if (was){ regnMarked = FALSE; InvertRegion(&waveWin, markA, markB); } PlotLabWin();}/* DoIncVolume: increment the playback volume */void DoIncVolume(void){ playVol = (playVol + 1) % VOLUME_STEPS; sprintf(volStr, "Vol %d", playVol); vol_btn->str = volStr; RedrawHButton(vol_btn);}/* DoIncLabSet: select the next alternative transcription */void DoIncLabSet(void){ if (numSet==1) return; if (++labSet < numSet) { llist = llist->next; } else { labSet = 0; llist = trans->head; } if (llist==NULL) HError(1590,"DoIncLabSet: Label set/count mismatch error"); FIXLABSTR; RedrawHButton(lev_btn); PlotLabWin();}/* DoNewLabSet: create a new alternative transcription */void DoNewLabSet(void){ LabList *ll; int c; for (c=0, ll=trans->head; ll!=NULL; ll=ll->next, c++) if (CountLabs(ll)==0) break; if (ll==NULL) { ll = CreateLabelList(&labStack, 10); AddLabelList(ll, trans); numSet = trans->numLists; } llist = ll; labSet=c; FIXLABSTR; RedrawHButton(lev_btn); PlotLabWin();}/* DoPlay: play a marked region or the waveform visible */void DoPlay(void){ long playA, playB; if (regnMarked) { /* if region marked already then use markA and markB */ playA = (long) (sStart + (markA - waveWin.x)*samplesPt); playB = (long) (sStart + (markB - waveWin.x)*samplesPt); } else { playA = sStart; playB = sEnd; } Playback(wave, playA, playB, playVol, (int )scValues[scIndex], &newData);}/* DoSpecial: execute external command if environment variable set */ void DoSpecial(void){ char strbuf[256]; char cmdstr[256]; char cmdfn[256]; if (CommandSet(HSLabCmd, cmdstr)){ strcpy(cmdfn, PathOf(spfn, strbuf)); strcat(cmdfn, BaseOf(spfn, strbuf)); while (strchr(cmdstr, '$')!=NULL) SubstFName(cmdfn, cmdstr); PrintMsg(&io_Win, cmdstr); system(cmdstr); }}void CheckForSave(void);/* DoRecord: record from audio device */void DoRecord(short *data){ HButton *btn; static int fnkey = 0; /* key appended to the file name */ char bfn[SLEN], xfn[SLEN]; /* change button state */ SetActive(btnList, FALSE); btn = FindButton(btnList, BT_REC); btn->str = "stop"; btn->active = TRUE; btn = FindButton(btnList, BT_PAUSE); btn->active = TRUE; RedrawHButtonList(btnList); /* wipe out any labels */ CheckForSave(); /* record from audio device */ wave = Record(&nSamples, &sampPeriod); T = nSamples; /* restore original button state */ SetActive(btnList, TRUE); btn = FindButton(btnList, BT_REC); btn->str = "rec"; btn = FindButton(btnList, BT_PAUSE); btn->active = FALSE; /* redraw buttons, save data file and reload */ PrintMsg(&io_Win, "Saving data..."); RedrawHButtonList(btnList); BaseOf(ospfn, bfn); ExtnOf(ospfn, xfn); sprintf(spfn, "%s_%d.%s", bfn, fnkey, xfn); fnkey = (fnkey+1) % 2; MakeFN(spfn, labDir, labExt, labfn); if(CloseWaveOutput(wave, wfmt, spfn)<SUCCESS) HError(1514,"DoRecord: CloseWaveOutput failed"); LoadData(); hRedrawWindow();}/* DoPause: pause recording */BtnId DoPause(void){ HEventRec hev; BtnId btn_id; HButton *btn_pause; btn_pause = FindButton(btnList, BT_PAUSE); SetButtonLit(btn_pause, TRUE); do { do hev = HGetEvent(FALSE, NULL); while (hev.event!=HMOUSEDOWN); btn_id = (BtnId) TrackButtons(btnList, hev); } while ((btn_id!=BT_PAUSE) && (btn_id!=BT_REC)); SetButtonLit(btn_pause, FALSE); return btn_id;}/* DoChangeLabStr: change the global string used for labelling */void DoChangeLabStr(void){ char sbuf[LAB_BUF_LEN], *prompt = "New label string: "; strcpy(sbuf, prompt); strcat(sbuf, labstr); GetString(&io_Win, sbuf, strlen(prompt), MAX_LAB_LEN); strcpy(labstr, sbuf + strlen(prompt)); RedrawHButton(labstr_btn);}/* IncLabStr: increment numeric component of the global string */void IncLabStr(void){ char sbuf[LAB_BUF_LEN], nbuf[LAB_BUF_LEN],*p,*q; Boolean isNum = FALSE; int num; strcpy(sbuf,labstr); for (p=sbuf; *p != '\0'; p++) if (isdigit((int) *p)){ isNum = TRUE; break; } if (isNum){ for (q=p+1; *q != '\0'; q++) if (!isdigit((int) *q)) break; num = atoi(p) +1; sprintf(nbuf,"%d",num); *p = '\0'; strcpy(labstr,sbuf); strcat(labstr,nbuf); strcat(labstr,q); RedrawHButton(labstr_btn); }}/* DoDelLab: delete a label */Boolean DoDelLab(void){ LLink p; HTime t; if (llist==NULL) return FALSE; PrintMsg(&io_Win, "Select label to delete..."); if (!GetWavePtrPos()){ PrintMsg(&io_Win, "Delete label aborted."); return FALSE; } PrintMsg(&io_Win, NULL); t = Point2Sample(&waveWin, thisWpos); if ((p = GetLabT(llist, (long) t)) == NULL) return FALSE; RecordOp(DELETE_OP, p); DeleteLabObj(llist, p); PlotLabWin(); labsModified = TRUE; return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -