Skip to content

Instantly share code, notes, and snippets.

@cfillion
Last active July 5, 2020 14:20
Show Gist options
  • Save cfillion/2bfd6dfa23e8e76f5cb928a6288cd5c2 to your computer and use it in GitHub Desktop.
Save cfillion/2bfd6dfa23e8e76f5cb928a6288cd5c2 to your computer and use it in GitHub Desktop.
// ConfigVar Layout
//
// 1. Grab reaper_plugin.h from https://landoleet.org/dev/reaper_plugin.h
// 2. Grab reaper_plugin_functions.h by running the REAPER action "[developer] Write C++ API functions header"
// 3. Grab WDL: git clone https://github.com/justinfrankel/WDL.git
// 4. Build then copy or link the binary file into <REAPER resource directory>/UserPlugins
//
// Linux
// =====
//
// c++ -fPIC -O2 -std=c++14 -IWDL/WDL -shared main.cpp -o reaper_configvars.so
//
// macOS
// =====
//
// c++ -fPIC -O2 -std=c++14 -IWDL/WDL -dynamiclib main.cpp -o reaper_configvars.dylib
//
// Windows
// =======
//
// (Use the VS Command Prompt matching your REAPER architecture, eg. x64 to use the 64-bit compiler)
// cl /nologo /O2 /Z7 /Zo /DUNICODE main.cpp /link /DEBUG /OPT:REF /PDBALTPATH:%_PDB% /DLL /OUT:reaper_configvars.dll
#define REAPERAPI_IMPLEMENT
#include "reaper_plugin_functions.h"
#include <algorithm>
#include <fstream>
#include <string>
#include <vector>
struct ConfigVar {
ConfigVar(void *a, const std::string &n, int s)
: addr{reinterpret_cast<uintptr_t>(a)}, name{n}, size{s}
{}
uintptr_t addr;
std::string name;
int size;
bool operator<(const ConfigVar &o) const
{
return addr < o.addr;
}
};
#define REQUIRED_API(name) {(void **)&name, #name, true}
#define OPTIONAL_API(name) {(void **)&name, #name, false}
static bool loadAPI(void *(*getFunc)(const char *))
{
if(!getFunc)
return false;
struct ApiFunc { void **ptr; const char *name; bool required; };
const ApiFunc funcs[] {
REQUIRED_API(get_config_var),
REQUIRED_API(GetAppVersion),
REQUIRED_API(GetResourcePath),
REQUIRED_API(plugin_register),
REQUIRED_API(projectconfig_var_addr),
REQUIRED_API(projectconfig_var_getoffs),
};
for(const ApiFunc &func : funcs) {
*func.ptr = getFunc(func.name);
if(func.required && !*func.ptr) {
fprintf(stderr, "[reaper_configvars] Unable to import the following API function: %s\n", func.name);
return false;
}
}
return true;
}
static void dump(std::ofstream &output, const std::vector<ConfigVar> &configvars)
{
uintptr_t expected { 0 };
for(const ConfigVar &cv : configvars) {
if(cv.addr != expected)
output << "\n# 0x" << std::hex << cv.addr << std::endl;
if(!cv.addr)
output << "# INVALID ";
expected = cv.addr + cv.size;
output << cv.name << ',' << std::dec << cv.size << std::endl;
}
}
extern "C" REAPER_PLUGIN_DLL_EXPORT int REAPER_PLUGIN_ENTRYPOINT(
REAPER_PLUGIN_HINSTANCE instance, reaper_plugin_info_t *rec)
{
if(!rec || rec->caller_version != REAPER_PLUGIN_VERSION || !loadAPI(rec->GetFunc))
return 0;
const std::string resourcePath { GetResourcePath() };
std::vector<ConfigVar> global, project;
std::ifstream input { resourcePath + "/configvars.txt" };
// take one config var name per line as input
std::string name;
while(input >> name) {
int size { 0 };
if(const int offset { projectconfig_var_getoffs(name.c_str(), &size) })
project.emplace_back(projectconfig_var_addr(nullptr, offset), name, size);
else
global.emplace_back(get_config_var(name.c_str(), &size), name, size);
}
input.close();
std::stable_sort(global.begin(), global.end());
std::stable_sort(project.begin(), project.end());
std::ofstream output { resourcePath + "/configvars_layout.txt" };
output << "# REAPER " << GetAppVersion() << std::endl;
output << "# Format: name,size - Sorted by memory address\n" << std::endl;
output << "# Global config variables" << std::endl;
dump(output, global);
output << "\n# Project config variables" << std::endl;
dump(output, project);
output.close();
return 1;
}
# REAPER 6.12c/OSX64
# Format: name,size - Sorted by memory address
# Global config variables
# INVALID afxcfg,0
# INVALID audioasync,0
# INVALID cpuallowed,0
# INVALID disk_peakmmap2,0
# INVALID disk_rdmodeex,0
# INVALID nativedrawtext,0
# INVALID reccfg,0
# INVALID rendercfg,0
# INVALID restrictcpu,0
# INVALID showlastundo,0
# INVALID vstbr64,0
# INVALID workset_max,0
# INVALID workset_min,0
# INVALID workset_use,0
# 0x1027e5440
g_config_project,0
# 0x102a20888
autoreturntime,8
autoreturntime_action,8
envtranstime,8
pooledenvtranstime,8
# 0x102a208d0
mutefadems10,4
# 0x102a20bb4
itemtexthide,4
# 0x102a20c38
midiins,8
midiouts,8
midiouts_clock,8
midiins_cs,8
midiouts_llmode,8
midiouts_clock_nospp,8
deffadelen,8
defsplitxfadelen,8
maxspeakgain,8
maxplayoffsrate,8
fadeeditpresel,8
fadeeditpostsel,8
snapextrad,8
# 0x102a20ca8
defsendvol,8
defhwvol,8
deftrackvol,8
quantsize2,8
prerollmeas,8
transientthreshold,8
transientsensitivity,8
automuteval,8
disk_rdmodeexmac,4
disk_rdsizeex,4
disk_rdblksex,4
disk_wrmode,4
disk_wrsize,4
disk_wrblks,4
disk_wrblks2,4
envtrimadjmode,4
envwritepasschg,4
env_options,4
vstbr32,4
hwoutfx_bypass,4
trackitemgap,4
warnmaxram64,4
maxitemlanes,4
takelanes,4
multiprojopt,4
groupdispmode,4
tooltips,4
tooltipdelay,4
actionmenu,4
solodimen,4
solodimdb10,4
rulerlayout,4
rulerlabelspacing,4
playcursormode,4
midioctoffs,4
midicctouchtimeout,4
nometers,4
showpeaksbuild,4
allstereopairs,4
newfnopt,4
saveundostatesproj,4
transflags,4
autoclosetrackwnds,4
alwaysallowkb,4
gridinbg,4
gridinbg2,4
griddot,4
soloip,4
errnowarn,4
tinttcp,4
applyfxtail,4
rendertail,4
userewire,4
mousewheelmode,4
renderbsnew,4
defautomode,4
scrubmode,4
selitem_tintalpha,4
unselitem_tintalpha,4
diskcheck,4
diskcheckmb,4
trimmidionsplit,4
itemdblclk,4
useinnc,4
rfprojfirst,4
audioclosestop,4
audiocloseinactive,4
peakcachegenrs,4
peakcachegenmode,4
viewadvance,4
smoothseek,4
smoothseekmeas,4
labelitems2,4
cueitems,4
insertmtrack,4
copyimpmedia,4
showpeaks,4
adjreclat,4
recopts,4
manuallat,4
manuallatin,4
adjrecmanlat,4
adjrecmanlatin,4
peakrecbm,4
stopprojlen,4
stopendofloop,4
env_reduce,4
env_autoadd,4
pooledenvs,4
itemsnap,4
loadlastproj,4
pmfol,4
newprojdo,4
promptendrec,4
maxrecsize,4
maxrecsize_use,4
projrelpath,4
workthreads,4
workbufmsex,4
workbuffxuims,4
threadpr,4
audiothreadpr,4
autonbworkerthreads,4
midioutthread,4
locklooptotime,4
handzoom,4
midisendflags,4
zoomshowarm,4
offlineinact,4
undomaxmem,4
seekmodes,4
scnameedit,4
deffadeshape,4
defxfadeshape,4
mousemovemod,4
saveopts,4
autosaveint,4
autosavemode,4
fxresize,4
vstfullstate,4
fxdenorm,4
usedxplugs,4
disabledxscan,4
altpeaks,4
prebufperb,4
fadeeditflags,4
fadeeditlink,4
metronome_defout,4
metronome_flags,4
itemclickmovecurs,4
vuupdfreq,4
vudecay,4
trackselonmouse,4
opencopyprompt,4
snapextraden,4
workrender,4
showrecitems,4
recaddatloop,4
envclicksegmode,4
recupdatems,4
loopclickmode,4
loopstopfx,4
undomask,4
showctinmix,4
maxsnaptrack,4
zoommode,4
vzoommode,4
defvzoom,4
defenvs,4
itemeditpr,4
loopselpr,4
miditicksperbeat,4
video_colorspace,4
video_delayms,4
video_defimglen,4
defsendflag,4
deftrackrecflags,4
deftrackrecinput,4
aot,4
itemvolmode,4
volenvrange,4
pitchenvrange,4
tempoenvmin,4
tempoenvmax,4
peaksedges,4
sampleedges,4
midipeaks,4
verchk,4
newtflag,4
fxfloat_focus,4
selitemtop,4
runallonstop,4
runafterstop,4
splitautoxfade,4
ctrlcopyitem,4
norunmute,4
optimizesilence,4
renderaheadlen,4
renderaheadlen2,4
resetvuplay,4
mvu_rmsoffs2,4
mvu_rmsred,4
mvu_rmsgain,4
mvu_rmssize,4
mvu_rmsmode,4
titlebarreghide,4
csurfrate,4
quantflag,4
quantolms,4
quantolms2,4
env_deffoc,4
env_ol_minh,4
envlanes,4
loopnewitems,4
mixerflag,4
use_reamote,4
reamote_smplfmt,4
reamote_maxblock,4
reamote_maxlat_render,4
reamote_maxpkt,4
nativedrawtext2,4
isFullscreen,4
fullscreenRectL,4
fullscreenRectT,4
fullscreenRectR,4
fullscreenRectB,4
screenset_autosave,4
screenset_as_views,4
screenset_as_win,4
maxrecentfx,4
ripplelockmode,4
tcpalign,4
timeseledge,4
midivu,4
scnotes,4
midiccenv,4
midiccdensity,4
midiccinterp,4
preroll,4
tsmarker,4
rbn,4
tabtotransflag,4
reximport,4
acidimport,4
bpminfnimport,4
rightclickemulate,4
automute,4
automuteflags,4
syncsmpuse,4
syncsmpmax2,4
itemfxtail,4
# 0x102a210b0
itemprops,4
# 0x102a215d8
workbehvr,4
# 0x102a21688
sliderminv,8
slidermaxv,8
slidershex,8
pandispmode,4
# 0x102a2192c
hwfadex,4
# 0x102a21968
uiscale,4
# 0x102a21b88
disk_peaks_ramkb,4
disk_peaks_mmapkb,4
# 0x102a2256c
maxrecent,4
# 0x102a22b90
specpeak_huel,8
specpeak_hueh,8
specpeak_lo,8
specpeak_na,8
# 0x102a22c28
itemicons,4
itemicons_minheight,4
itemlabel_minheight,4
itemfade_minwidth,4
itemfade_minheight,4
itemfadehandle_maxwidth,4
itemlowerhalf_minheight,4
guidelines2,4
# 0x102a22c54
relativeedges,4
# 0x102a22c5c
specpeak_alpha,4
specpeak_ftp,4
specpeak_bv,4
# 0x102a3c6e8
multitouch_swipe_gear,8
multitouch_zoom_gear,8
multitouch_rotate_gear,8
# 0x102a3c704
multitouch,4
multitouch_ignorewheel_ms,4
multitouch_ignore_ms,4
kbd_usealt,4
# 0x102a3d21c
vuminvol,4
vumaxvol,4
vuclipstick,4
# 0x102a3de04
vstfolder_settings,4
# 0x102a48e38
scrubrelgain,8
scrubloopstart,4
scrubloopend,4
# 0x102a4b130
help,4
# 0x102a4b1f8
reascripttimeout,8
reascript,4
edit_fontsize,4
# 0x102a4bd48
custommenu,4
# 0x102a97611
osxnomiddlemancocoa,1
# 0x102a98940
mididefcolormap,512
recfile_wildcards,1024
# 0x102a99340
defrenderpath,1024
defsavepath,1024
altpeakspath,1024
altpeaksopathlist,4096
# 0x102a9b140
video_decprio,256
lastthemefn5,1024
# 0x102a9c240
ide_colors,128
# 0x102a9c340
bouncecfg,0
# 0x102a9c358
windowflags,4
renderclosewhendone,4
renderqdelay,4
rendermetadataflags,4
ara,4
# 0x102a9c370
vgrid,4
# 0x102a9c378
wiring_options,4
midieditor,4
bigwndframes,4
templateditcursor,1
# 0x102aa5a3c
itemprops_timemode,4
# 0x102aa5b44
g_markerlist_updcnt,4
# 0x102b5b588
__numcpu,4
# 0x102b69de8
textflags,4
# 0x7ff860010008
projmasternch,4
# 0x7ff86001d2b0
projmastervuflags,4
# 0x7ff86b646058
projmetrobeatlen,4
projmetrof1,4
projmetrof2,4
projmetroclick,4
# 0x7ff86b646070
projmetrov1,8
projmetrov2,8
# Project config variables
# 0x7ff86d070578
mastermutesolo,4
# 0x7ff86d070580
zoom,8
# 0x7ff86d070e08
loopgran,4
audioprshift,4
itemtimelock,4
tempoenvtimelock,4
defpitchcfg,4
defstretchmode,4
itemmixflag,4
miscopts,4
loopgranlen,8
loop,4
projmaxlenuse,4
projmaxlen,8
# 0x7ff86d070e70
projrendernch,4
projrendersrate,4
projrenderlimit,4
projrenderrateinternal,4
# 0x7ff86d070e84
projrenderresample,4
projrenderaddtoproj,4
projrenderstems,4
projrenderdither,4
rendertails,4
rendertaillen,4
projrenderqdelay,4
# 0x7ff86d070ed0
playrate,8
projbpm,8
# 0x7ff86d070ef0
projsellock,4
projtakelane,4
showmaintrack,4
vzoom2,4
# 0x7ff86d070f04
projsrate,4
projsrateuse,4
projmeaslen,4
projtsdenom,4
projtimemode,4
projtimemode2,4
projfrbase,4
projfrdrop,4
projvidw,4
projvidh,4
projvidflags,4
projintmix,4
projshowgrid,4
relsnap,4
projgridmin,4
projgridsnapmin,4
# 0x7ff86d070f60
projgroupover,4
projripedit,4
projrecmode,4
projgroupsel,4
projmeasoffs,4
projmeasoffsruler,4
projrecforopencopy,4
autoxfade,4
playresamplemode,4
envattach,4
pooledenvattach,4
mixeruiflag,4
mixrowflags,4
feedbackmode,4
opennotes,4
projsmptesync,4
projsmpteresync,4
projsmpteskip,4
projsmpteahead,4
projsmptemaxfree,4
projsmpteinput,4
projsmpteresync_rec,4
projsmptefw_rec,4
projmidieditor,4
scorequant,8
scoreminnotelen,8
# 0x7ff86d070fd4
panmode,4
panlawflags,4
projgridframe,4
projgriddiv,8
projgriddivsnap,8
projgridswing,8
projtimeoffs,8
panlaw,8
projpeaksgain,8
projsmpterate,8
projsmpteoffs,8
# 0x7ff86d071058
projmetrocountin,8
# 0x7ff86d071151
projsmpterateuseproj,1
# 0x7ff86d0711e8
projmetroen,4
# 0x7ff86d0712c8
projalignbeatsrate,1
# 0x7ff86d0712f0
psminv,8
psmaxv,8
# 0x7ff86d0713fc
projtrackgroupdisabled,4
# 0x7ff86d07161c
rewireslave,4
rewireslavedelay,4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment