void SaveCueBusIniFile(int _confId, const char* _busName, int _type, bool _trTemplate, const char* _trTemplatePath, bool _showRouting, int _soloDefeat, bool _sendToMaster, int* _hwOuts) { if (_confId>=0 && _confId<SNM_MAX_CUE_BUSS_CONFS && _busName && _trTemplatePath && _hwOuts) { char iniSection[64]=""; if (_snprintfStrict(iniSection, sizeof(iniSection), "CueBuss%d", _confId+1) > 0) { char buf[16]="", slot[16]=""; WDL_FastString escapedStr; escapedStr.SetFormatted(256, "\"%s\"", _busName); WritePrivateProfileString(iniSection,"name",escapedStr.Get(),g_SNM_IniFn.Get()); if (_snprintfStrict(buf, sizeof(buf), "%d" ,_type) > 0) WritePrivateProfileString(iniSection,"reatype",buf,g_SNM_IniFn.Get()); WritePrivateProfileString(iniSection,"track_template_enabled",_trTemplate ? "1" : "0",g_SNM_IniFn.Get()); escapedStr.SetFormatted(SNM_MAX_PATH, "\"%s\"", _trTemplatePath); WritePrivateProfileString(iniSection,"track_template_path",escapedStr.Get(),g_SNM_IniFn.Get()); WritePrivateProfileString(iniSection,"show_routing",_showRouting ? "1" : "0",g_SNM_IniFn.Get()); WritePrivateProfileString(iniSection,"send_to_masterparent",_sendToMaster ? "1" : "0",g_SNM_IniFn.Get()); if (_snprintfStrict(buf, sizeof(buf), "%d", _soloDefeat) > 0) WritePrivateProfileString(iniSection,"solo_defeat",buf,g_SNM_IniFn.Get()); for (int i=0; i<SNM_MAX_HW_OUTS; i++) if (_snprintfStrict(slot, sizeof(slot), "hwout%d", i+1) > 0 && _snprintfStrict(buf, sizeof(buf), "%d", _hwOuts[i]) > 0) WritePrivateProfileString(iniSection,slot,_hwOuts[i]?buf:NULL,g_SNM_IniFn.Get()); } } }
void ReadCueBusIniFile(int _confId, char* _busName, int _busNameSz, int* _reaType, bool* _trTemplate, char* _trTemplatePath, int _trTemplatePathSz, bool* _showRouting, int* _soloDefeat, bool* _sendToMaster, int* _hwOuts) { if (_confId>=0 && _confId<SNM_MAX_CUE_BUSS_CONFS && _busName && _reaType && _trTemplate && _trTemplatePath && _showRouting && _soloDefeat && _sendToMaster && _hwOuts) { char iniSection[64]=""; if (_snprintfStrict(iniSection, sizeof(iniSection), "CueBuss%d", _confId+1) > 0) { char buf[16]="", slot[16]=""; GetPrivateProfileString(iniSection,"name","",_busName,_busNameSz,g_SNM_IniFn.Get()); GetPrivateProfileString(iniSection,"reatype","3",buf,16,g_SNM_IniFn.Get()); *_reaType = atoi(buf); // 0 if failed GetPrivateProfileString(iniSection,"track_template_enabled","0",buf,16,g_SNM_IniFn.Get()); *_trTemplate = (atoi(buf) == 1); GetPrivateProfileString(iniSection,"track_template_path","",_trTemplatePath,_trTemplatePathSz,g_SNM_IniFn.Get()); GetPrivateProfileString(iniSection,"show_routing","1",buf,16,g_SNM_IniFn.Get()); *_showRouting = (atoi(buf) == 1); GetPrivateProfileString(iniSection,"send_to_masterparent","0",buf,16,g_SNM_IniFn.Get()); *_sendToMaster = (atoi(buf) == 1); GetPrivateProfileString(iniSection,"solo_defeat","1",buf,16,g_SNM_IniFn.Get()); *_soloDefeat = atoi(buf); for (int i=0; i<SNM_MAX_HW_OUTS; i++) { if (_snprintfStrict(slot, sizeof(slot), "hwout%d", i+1) > 0) GetPrivateProfileString(iniSection,slot,"0",buf,sizeof(buf),g_SNM_IniFn.Get()); else *buf = '\0'; _hwOuts[i] = atoi(buf); } } } }
static void SaveExtensionConfig(ProjectStateContext *ctx, bool isUndo, struct project_config_extension_t *reg) { char line[SNM_MAX_CHUNK_LINE_LENGTH] = ""; if (ctx && g_prjActions.Get()->GetLength()) if (_snprintfStrict(line, sizeof(line), "S&M_PROJACTION %s", g_prjActions.Get()->Get()) > 0) ctx->AddLine("%s", line); }
void MainSetCCLanes(COMMAND_T* _ct) { HWND me = MIDIEditor_GetActive(); MediaItem_Take* tk = me ? MIDIEditor_GetTake(me) : NULL; if (tk) { // recall lanes char laneSlot[SNM_MAX_CC_LANES_LEN], slot[32] = ""; if (_snprintfStrict(slot, sizeof(slot), "cc_lanes_slot%d", (int)_ct->user + 1) > 0) { GetPrivateProfileString("MidiEditor", slot, "", laneSlot, SNM_MAX_CC_LANES_LEN, g_SNM_IniFn.Get()); int i=0; while (laneSlot[i] && i < (SNM_MAX_CC_LANES_LEN-2)) // -2: see string termination { if (laneSlot[i] == '|') laneSlot[i] = '\n'; i++; } laneSlot[i++] = '\n'; laneSlot[i] = 0; if (replaceCCLanes(laneSlot)) Undo_OnStateChangeEx2(NULL, SWS_CMD_SHORTNAME(_ct), UNDO_STATE_ALL, -1); } } }
void RemapMIDIInputChannel(COMMAND_T* _ct) { bool updated = false; int ch = (int)_ct->user; // 0: source channel char pLine[SNM_MAX_CHUNK_LINE_LENGTH] = ""; if (ch && _snprintfStrict(pLine, sizeof(pLine), "MIDI_INPUT_CHANMAP %d\n", ch-1) <= 0) return; for (int i=1; i <= GetNumTracks(); i++) // skip master { MediaTrack* tr = CSurf_TrackFromID(i, false); if (tr && *(int*)GetSetMediaTrackInfo(tr, "I_SELECTED", NULL)) { int in = *(int*)GetSetMediaTrackInfo(tr, "I_RECINPUT", NULL); if ((in & 0x1000) == 0x1000) // midi in? { SNM_ChunkParserPatcher p(tr); char currentCh[3] = ""; int chunkPos = p.Parse(SNM_GET_CHUNK_CHAR, 1, "TRACK", "MIDI_INPUT_CHANMAP", 0, 1, currentCh, NULL, "TRACKID"); if (chunkPos > 0) { if (!ch || atoi(currentCh) != (ch-1)) updated |= p.ReplaceLine(--chunkPos, pLine); // pLine can be "", i.e. remove line } else updated |= p.InsertAfterBefore(0, pLine, "TRACK", "TRACKHEIGHT", 1, 0, "TRACKID"); } } } if (updated) Undo_OnStateChangeEx2(NULL, SWS_CMD_SHORTNAME(_ct), UNDO_STATE_ALL, -1); }
void FindWnd::OnDestroy() { // save prefs char type[4] = ""; if (_snprintfStrict(type, sizeof(type), "%d", m_type) > 0) WritePrivateProfileString(FIND_INI_SEC, "Type", type, g_SNM_IniFn.Get()); WritePrivateProfileString(FIND_INI_SEC, "ZoomScrollToFoundItems", m_zoomSrollItems ? "1" : "0", g_SNM_IniFn.Get()); m_cbType.Empty(); g_notFound = false; // *g_searchStr = 0; }
void MainSaveCCLanes(COMMAND_T* _ct) { HWND me = MIDIEditor_GetActive(); MediaItem_Take* tk = me ? MIDIEditor_GetTake(me) : NULL; if (tk) { MediaItem* item = GetMediaItemTake_Item(tk); int tkIdx = GetTakeIndex(item, tk); // NULL item managed if (tkIdx >= 0) { SNM_TakeParserPatcher p(item, CountTakes(item)); WDL_FastString takeChunk; if (p.GetTakeChunk(tkIdx, &takeChunk)) { SNM_ChunkParserPatcher ptk(&takeChunk, false); // check start/end position of lanes in the chunk int firstPos = 0, lastPos = 0, laneCpt = 0; int pos = ptk.Parse(SNM_GET_CHUNK_CHAR, 1, "SOURCE", "VELLANE", laneCpt, 0); while (pos > 0) { lastPos = pos; if (!firstPos) firstPos = pos; pos = ptk.Parse(SNM_GET_CHUNK_CHAR, 1, "SOURCE", "VELLANE", ++laneCpt, 0); } if (firstPos > 0) { firstPos--; // see SNM_ChunkParserPatcher char laneSlot[SNM_MAX_CC_LANES_LEN] = ""; int eolLastPos = lastPos; const char* pp = ptk.GetChunk()->Get(); //ok 'cause read only while (pp[eolLastPos] && pp[eolLastPos] != '\n') eolLastPos++; int i = firstPos, j=0; while (pp[i] && i<eolLastPos && j < (SNM_MAX_CC_LANES_LEN-1) ) { //-1 see string termination if (pp[i] != '\n') laneSlot[j++] = pp[i]; else laneSlot[j++] = '|'; i++; } laneSlot[j] = 0; // store lanes char slot[32] = ""; if (_snprintfStrict(slot, sizeof(slot), "cc_lanes_slot%d", (int)_ct->user + 1) > 0) WritePrivateProfileString("MidiEditor", slot, laneSlot, g_SNM_IniFn.Get()); } } } } }
void MainCreateCCLane(COMMAND_T* _ct) { bool updated = false; HWND me = MIDIEditor_GetActive(); MediaItem_Take* tk = me ? MIDIEditor_GetTake(me) : NULL; if (tk) { MediaItem* item = GetMediaItemTake_Item(tk); int tkIdx = GetTakeIndex(item, tk); // null item managed there if (tkIdx >= 0) { SNM_TakeParserPatcher p(item, CountTakes(item)); WDL_FastString takeChunk; int tkPos, tklen; if (p.GetTakeChunk(tkIdx, &takeChunk, &tkPos, &tklen)) { SNM_ChunkParserPatcher ptk(&takeChunk, false); // check current lanes bool lanes[SNM_MAX_CC_LANE_ID+1]; int i=0; while(i <= SNM_MAX_CC_LANE_ID) lanes[i++]=false; char lastLaneId[4] = ""; //max in v3.6: "133" int tkFirstPos = 0, laneCpt = 0; int pos = ptk.Parse(SNM_GET_CHUNK_CHAR, 1, "SOURCE", "VELLANE", laneCpt, 1, lastLaneId); while (pos > 0) { if (!tkFirstPos) tkFirstPos = pos; lanes[atoi(lastLaneId)] = true; // atoi: 0 on failure, lane 0 won't be used anyway.. pos = ptk.Parse(SNM_GET_CHUNK_CHAR, 1, "SOURCE", "VELLANE", ++laneCpt, 1, lastLaneId); } if (tkFirstPos > 0) { tkFirstPos--; // see SNM_ChunkParserPatcher // find the first unused index i=1; while(lanes[i] && i <= SNM_MAX_CC_LANE_ID) i++; char newLane[SNM_MAX_CHUNK_LINE_LENGTH] = ""; if (_snprintfStrict(newLane, sizeof(newLane), "VELLANE %d 50 0\n", i) > 0) ptk.GetChunk()->Insert(newLane, tkFirstPos); // "update" take updated = p.ReplaceTake(tkPos, tklen, ptk.GetChunk()); } } } } if (updated) Undo_OnStateChangeEx2(NULL, SWS_CMD_SHORTNAME(_ct), UNDO_STATE_ALL, -1); }
// primitive (no undo point), removes track icon if _fn == "" bool SetTrackIcon(MediaTrack* _tr, const char* _fn) { bool updated = false; if (_tr && _fn && _tr!=GetMasterTrack(NULL)) // exclude master (icon not supported yet, v4.13) { SNM_ChunkParserPatcher p(_tr); // nothing done yet int iconChunkPos = p.Parse(SNM_GET_CHUNK_CHAR, 1, "TRACK", "TRACKIMGFN", 0, 1, NULL, NULL, "TRACKID"); char pIconLine[SNM_MAX_CHUNK_LINE_LENGTH] = ""; if (_snprintfStrict(pIconLine, sizeof(pIconLine), "TRACKIMGFN \"%s\"\n", _fn) > 0) { if (iconChunkPos > 0) updated |= p.ReplaceLine(--iconChunkPos, pIconLine); //JFB!! to update with SNM_ChunkParserPatcher v2 else updated |= p.InsertAfterBefore(0, pIconLine, "TRACK", "FX", 1, 0, "TRACKID"); } } return updated; }
// adds a receive (with vol & pan from source track for pre-fader) // _srcTr: source track (unchanged) // _destTr: destination track // _type: reaper's type // 0=Post-Fader (Post-Pan), 1=Pre-FX, 2=deprecated, 3=Pre-Fader (Post-FX) // _p: for multi-patch optimization, current destination track's SNM_SendPatcher bool AddReceiveWithVolPan(MediaTrack * _srcTr, MediaTrack * _destTr, int _type, SNM_SendPatcher* _p) { bool update = false; char vol[32] = "1.00000000000000"; char pan[32] = "0.00000000000000"; // if pre-fader, then re-copy track vol/pan if (_type == 3) { SNM_ChunkParserPatcher p(_srcTr, false); p.SetWantsMinimalState(true); if (p.Parse(SNM_GET_CHUNK_CHAR, 1, "TRACK", "VOLPAN", 0, 1, vol, NULL, "MUTESOLO") > 0 && p.Parse(SNM_GET_CHUNK_CHAR, 1, "TRACK", "VOLPAN", 0, 2, pan, NULL, "MUTESOLO") > 0) { update = (_p->AddReceive(_srcTr, _type, vol, pan) > 0); } } // default volume if (!update && _snprintfStrict(vol, sizeof(vol), "%.14f", *(double*)GetConfigVar("defsendvol")) > 0) update = (_p->AddReceive(_srcTr, _type, vol, pan) > 0); return update; }
WDL_DLGRET CueBussDlgProc(HWND _hwnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam) { if (INT_PTR r = SNM_HookThemeColorsMessage(_hwnd, _uMsg, _wParam, _lParam)) return r; const char cWndPosKey[] = "CueBus Window Pos"; switch(_uMsg) { case WM_INITDIALOG: { WDL_UTF8_HookComboBox(GetDlgItem(_hwnd, IDC_SNM_CUEBUS_TYPE)); WDL_UTF8_HookComboBox(GetDlgItem(_hwnd, IDC_COMBO)); for(int i=0; i < SNM_MAX_HW_OUTS; i++) WDL_UTF8_HookComboBox(GetDlgItem(_hwnd, IDC_SNM_CUEBUS_HWOUT1+i)); RestoreWindowPos(_hwnd, cWndPosKey, false); char buf[16] = ""; for(int i=0; i < SNM_MAX_CUE_BUSS_CONFS; i++) if (_snprintfStrict(buf,sizeof(buf),"%d",i+1) > 0) SendDlgItemMessage(_hwnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)buf); SendDlgItemMessage(_hwnd,IDC_COMBO,CB_SETCURSEL,0,0); FillCueBussDlg(_hwnd); return 0; } break; case WM_CLOSE : g_cueBussHwnd = NULL; // for proper toggle state report, see openCueBussWnd() break; case WM_COMMAND : switch(LOWORD(_wParam)) { case IDC_COMBO: if(HIWORD(_wParam) == CBN_SELCHANGE) // config id update? { int id = (int)SendDlgItemMessage(_hwnd, IDC_COMBO, CB_GETCURSEL, 0, 0); if (id != CB_ERR) { g_cueBussConfId = id; FillCueBussDlg(); } } break; case IDOK: CueBuss(__LOCALIZE("Create cue buss from track selection","sws_undo"), g_cueBussConfId); return 0; case IDCANCEL: g_cueBussHwnd = NULL; // for proper toggle state report, see openCueBussWnd() ShowWindow(_hwnd, SW_HIDE); return 0; case IDC_FILES: { char curPath[SNM_MAX_PATH]=""; GetDlgItemText(_hwnd, IDC_SNM_CUEBUS_TEMPLATE, curPath, sizeof(curPath)); if (!*curPath || !FileOrDirExists(curPath)) if (_snprintfStrict(curPath, sizeof(curPath), "%s%cTrackTemplates", GetResourcePath(), PATH_SLASH_CHAR) <= 0) *curPath = '\0'; if (char* fn = BrowseForFiles(__LOCALIZE("S&M - Load track template","sws_DLG_149"), curPath, NULL, false, "REAPER Track Template (*.RTrackTemplate)\0*.RTrackTemplate\0")) { SetDlgItemText(_hwnd,IDC_SNM_CUEBUS_TEMPLATE,fn); free(fn); SaveCueBussSettings(); } break; } case IDC_CHECK3: { bool templateEnable = (IsDlgButtonChecked(_hwnd, IDC_CHECK3) == 1); EnableWindow(GetDlgItem(_hwnd, IDC_SNM_CUEBUS_TEMPLATE), templateEnable); EnableWindow(GetDlgItem(_hwnd, IDC_FILES), templateEnable); EnableWindow(GetDlgItem(_hwnd, IDC_SNM_CUEBUS_NAME), !templateEnable); for(int k=0; k < SNM_MAX_HW_OUTS ; k++) EnableWindow(GetDlgItem(_hwnd, IDC_SNM_CUEBUS_HWOUT1+k), !templateEnable); EnableWindow(GetDlgItem(_hwnd, IDC_CHECK1), !templateEnable); EnableWindow(GetDlgItem(_hwnd, IDC_CHECK4), !templateEnable); // SetFocus(GetDlgItem(_hwnd, templateEnable ? IDC_SNM_CUEBUS_TEMPLATE : IDC_SNM_CUEBUS_NAME)); SaveCueBussSettings(); break; } case IDC_SNM_CUEBUS_SOLOGRP: case IDC_CHECK1: case IDC_CHECK2: case IDC_CHECK4: SaveCueBussSettings(); break; case IDC_SNM_CUEBUS_TYPE: case IDC_SNM_CUEBUS_HWOUT1: case IDC_SNM_CUEBUS_HWOUT2: case IDC_SNM_CUEBUS_HWOUT3: case IDC_SNM_CUEBUS_HWOUT4: case IDC_SNM_CUEBUS_HWOUT5: case IDC_SNM_CUEBUS_HWOUT6: case IDC_SNM_CUEBUS_HWOUT7: case IDC_SNM_CUEBUS_HWOUT8: if(HIWORD(_wParam) == CBN_SELCHANGE) SaveCueBussSettings(); break; case IDC_SNM_CUEBUS_TEMPLATE: case IDC_SNM_CUEBUS_NAME: if (HIWORD(_wParam)==EN_CHANGE) SaveCueBussSettings(); break; } break; case WM_DESTROY: SaveWindowPos(_hwnd, cWndPosKey); break; } return 0; }