Last active
July 5, 2020 14:20
-
-
Save cfillion/2bfd6dfa23e8e76f5cb928a6288cd5c2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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