104 lines
4.1 KiB
Markdown
104 lines
4.1 KiB
Markdown
# DAW verification — REAPER behaviour behind a bank for never-saved projects
|
||
|
||
What a hand-run REAPER pass must establish before the temporary bank for never-saved
|
||
projects is designed. The plan is that the extension keeps a never-saved project's bank
|
||
index in project ext state, then moves the bank's files into the project folder on the
|
||
project's first save. That only works if REAPER keeps ext state on a project that has no
|
||
`.rpp` yet and carries it into the first save. **No ReaSampler code exists for this yet** —
|
||
every experiment below tests REAPER itself. **If E1 fails, the design needs rework**;
|
||
E2–E5 only refine it.
|
||
|
||
**Build to use.** None needed. The snippets run in REAPER's ReaScript console: *Actions →
|
||
ReaScript: run ReaScript (EEL2 or lua)...*, or save the snippet as a `.lua` file and load
|
||
it through *Actions → New action → Load ReaScript...*. Every API name cited below is in
|
||
`vendor/reaper-sdk/sdk/reaper_plugin_functions.h`. The Lua return shapes are
|
||
`[verify — DAW]`: ReaScript returns out-buffers as extra return values rather than taking
|
||
a buffer argument, so adjust a snippet if it errors.
|
||
|
||
**Projects to use.** Fresh never-saved tabs (*File → New project tab*). Close any saved
|
||
project first so a stray `0` (current project) cannot resolve to it.
|
||
|
||
---
|
||
|
||
## E1. Ext state on a never-saved project survives tab switches and the first save (gates the design)
|
||
|
||
1. In a new, never-saved tab, run:
|
||
|
||
```lua
|
||
reaper.SetProjExtState(0, "rs_test", "k", "v")
|
||
```
|
||
|
||
2. Switch to another project tab, then back.
|
||
3. Run:
|
||
|
||
```lua
|
||
local n, v = reaper.GetProjExtState(0, "rs_test", "k") -- [verify — DAW] return shape
|
||
reaper.ShowConsoleMsg(("n=%s v=%s\n"):format(tostring(n), tostring(v)))
|
||
```
|
||
|
||
4. Save the project for the first time. Close the tab, reopen the `.rpp`, and run step 3
|
||
again. Optionally open the `.rpp` in a text editor and look for `rs_test`.
|
||
|
||
Read off: is `v` still `v` after the tab switch? After save and reopen? Is `rs_test` in
|
||
the `.rpp`? The SDK header says `GetProjExtState` returns the value "the last time the
|
||
project was saved", so a blank read at step 3 would matter even if step 4 passes.
|
||
|
||
Result:
|
||
|
||
## E2. Does `SetProjExtState` alone mark a never-saved project dirty?
|
||
|
||
In a fresh never-saved tab with no other edits, run the `SetProjExtState` line from E1,
|
||
then:
|
||
|
||
```lua
|
||
reaper.ShowConsoleMsg("dirty=" .. reaper.IsProjectDirty(0) .. "\n")
|
||
```
|
||
|
||
Read off: the `dirty` value, whether the title bar shows an asterisk, and whether closing
|
||
the tab prompts to save.
|
||
|
||
Result:
|
||
|
||
## E3. What project path does a never-saved tab report?
|
||
|
||
In two different never-saved tabs, run in each:
|
||
|
||
```lua
|
||
local p = reaper.GetProjectPathEx(0, "") -- [verify — DAW] return shape
|
||
reaper.ShowConsoleMsg("ex=" .. tostring(p) .. " plain=" .. tostring(reaper.GetProjectPath("")) .. "\n")
|
||
```
|
||
|
||
Then change one tab's recording path (*File → Project settings → Media → Path to save
|
||
media files*) and run it again in that tab.
|
||
|
||
Read off: is it the default recording path? Is it the same in both tabs? Does the per-tab
|
||
setting change it?
|
||
|
||
Result:
|
||
|
||
## E4. Save As with and without "Copy all media into project directory"
|
||
|
||
In a never-saved tab, insert a media item whose file lives outside any project folder
|
||
(e.g. a `.wav` on the desktop).
|
||
|
||
1. *File → Save project as...* with **Copy all media into project directory** ticked.
|
||
Check where the item's source now points (item *Source properties*, or the take's
|
||
source via `GetMediaSourceFileName`).
|
||
2. Repeat in a new never-saved tab with the option **unticked**.
|
||
|
||
Read off: ticked — does the item now point at a copy in the project directory? Unticked —
|
||
does it still point at the original path?
|
||
|
||
Result:
|
||
|
||
## E5. Save from the "save changes?" prompt on close and on quit
|
||
|
||
Observation only. In a never-saved tab, make any change, then close the tab and choose
|
||
**Save** in REAPER's "save changes?" prompt. Repeat by quitting REAPER with a never-saved,
|
||
changed tab open.
|
||
|
||
Read off: did REAPER save and then close in one step, with nothing in between? This
|
||
confirms that an extension timer never gets to run between the save and the close.
|
||
|
||
Result:
|