Skip to content

Commit 356cefa

Browse files
authored
Merge pull request #297 from ebu/reaper7.34-render-dialog
Update render dialog code to support latest REAPER version
2 parents 5cc7552 + 29bedd1 commit 356cefa

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ UNRELEASED
77
* Update BEAR [#287](https://github.com/ebu/ear-production-suite/pull/287)
88
* Use ADM Coordinate Conversion lib over internal implementation [#293](https://github.com/ebu/ear-production-suite/issues/293) [#295](https://github.com/ebu/ear-production-suite/pull/295)
99
* Remove support for 3rd-party plugin suites [#289](https://github.com/ebu/ear-production-suite/pull/289)
10+
* Update render dialog code to support latest version of REAPER (v7.34) [#296](https://github.com/ebu/ear-production-suite/issues/296) [#297](https://github.com/ebu/ear-production-suite/pull/297)
1011

1112
Version 1.1.0b
1213

reaper-adm-extension/src/reaper_adm/exportaction_dialogcontrol.cpp

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,10 @@ void RenderDialogState::startPreparingRenderControls(HWND hwndDlg)
183183
localise(EXPECTED_FIRST_SAMPLE_RATE_COMBO_OPTION, reaperApi);
184184
localise(EXPECTED_FIRST_CHANNEL_COUNT_COMBO_OPTION, reaperApi);
185185
localise(EXPECTED_PRESETS_BUTTON_TEXT, reaperApi);
186+
localise(EXPECTED_PRESERVE_SAMPLE_RATE_CHECKBOX_TEXT, reaperApi);
186187
localise(EXPECTED_NORMALIZE_BUTTON_TEXT1, reaperApi);
187188
localise(EXPECTED_NORMALIZE_BUTTON_TEXT2, reaperApi);
189+
localise(EXPECTED_NORMALIZE_BUTTON_TEXT3, reaperApi);
188190
localise(EXPECTED_SECOND_PASS_CHECKBOX_TEXT, reaperApi);
189191
localise(EXPECTED_MONO2MONO_CHECKBOX_TEXT, reaperApi);
190192
localise(EXPECTED_MULTI2MULTI_CHECKBOX_TEXT, reaperApi);
@@ -195,13 +197,16 @@ void RenderDialogState::startPreparingRenderControls(HWND hwndDlg)
195197
localise(EXPECTED_FIRST_RESAMPLE_MODE_COMBO_OPTION, reaperApi);
196198

197199
// Our dialog displayed - reset all vars (might not be the first time around)
200+
lastFoundButtonHwnd.reset();
198201
boundsControlHwnd.reset();
199202
sourceControlHwnd.reset();
200203
presetsControlHwnd.reset();
204+
normalizeCheckboxControlHwnd.reset();
201205
normalizeControlHwnd.reset();
202206
secondPassControlHwnd.reset();
203207
monoToMonoControlHwnd.reset();
204208
multiToMultiControlHwnd.reset();
209+
preserveSampleRateControlHwnd.reset();
205210
sampleRateControlHwnd.reset();
206211
channelsControlHwnd.reset();
207212
channelsLabelHwnd.reset();
@@ -288,23 +293,55 @@ BOOL CALLBACK RenderDialogState::prepareRenderControl_pass1(HWND hwnd, LPARAM lP
288293
BOOL CALLBACK RenderDialogState::prepareRenderControl_pass2(HWND hwnd, LPARAM lParam) { // Caps BOOL is actually int for EnumChildWindows compatibility
289294
// Prepare Render Dialog Control for ADM export.
290295
// This will involve fixing some values and disabling those controls
296+
ControlType controlType = UNKNOWN;
291297

292298
if (hwnd && IsWindow(hwnd))
293299
{
300+
controlType = getControlType(hwnd);
294301
std::string winStr = getWindowText(hwnd);
295-
auto controlType = getControlType(hwnd);
302+
auto id = GetWindowLong(hwnd, GWL_ID);
296303

297304
if (controlType == BUTTON) {
298305
if (winStr == EXPECTED_PRESETS_BUTTON_TEXT){
299306
// This is the presets button which could be used to override our forced settings - disable it
300307
presetsControlHwnd = hwnd;
301308
EnableWindow(hwnd, false);
302309
}
303-
if (winStr == EXPECTED_NORMALIZE_BUTTON_TEXT1 || winStr == EXPECTED_NORMALIZE_BUTTON_TEXT2){
310+
311+
if (winStr == EXPECTED_NORMALIZE_BUTTON_TEXT1 ||
312+
winStr == EXPECTED_NORMALIZE_BUTTON_TEXT2 ||
313+
winStr == EXPECTED_NORMALIZE_BUTTON_TEXT3){
304314
// This is the normalization config which will not work for this as we don't use the sink feed anyway - disable it
315+
if (winStr == EXPECTED_NORMALIZE_BUTTON_TEXT3) {
316+
// This control has a seperate, unlabeled checkbox before it - see if we just passed it
317+
if (lastFoundButtonHwnd &&
318+
getControlType(*lastFoundButtonHwnd) == BUTTON &&
319+
getWindowText(*lastFoundButtonHwnd) == "") {
320+
normalizeCheckboxControlHwnd = lastFoundButtonHwnd;
321+
normalizeCheckboxLastState = getCheckboxState(*lastFoundButtonHwnd);
322+
setCheckboxState(*lastFoundButtonHwnd, false);
323+
EnableWindow(*lastFoundButtonHwnd, false);
324+
}
325+
}
305326
normalizeControlHwnd = hwnd;
306327
EnableWindow(hwnd, false);
307328
}
329+
// Normalise button text changes depending on what options are enabled.
330+
// Lets check ID too
331+
if (id == EXPECTED_NORMALIZE_BUTTON_ID && !normalizeControlHwnd.has_value()) {
332+
normalizeControlHwnd = hwnd;
333+
EnableWindow(hwnd, false);
334+
}
335+
// Normalise checkbox has no text, and order of control enumeration may not be reliable.
336+
// Lets check ID too
337+
if (id == EXPECTED_NORMALIZE_CHECKBOX_ID && !normalizeCheckboxControlHwnd.has_value()) {
338+
assert(winStr == "");
339+
normalizeCheckboxControlHwnd = hwnd;
340+
normalizeCheckboxLastState = getCheckboxState(hwnd);
341+
setCheckboxState(hwnd, false);
342+
EnableWindow(hwnd, false);
343+
}
344+
308345
if (winStr == EXPECTED_SECOND_PASS_CHECKBOX_TEXT){
309346
// 2nd pass render causes a mismatch between expected number of received block and actual number of received blocks (double)
310347
// Could probably be recified, but disable as quick fix for now
@@ -325,6 +362,12 @@ BOOL CALLBACK RenderDialogState::prepareRenderControl_pass2(HWND hwnd, LPARAM lP
325362
setCheckboxState(hwnd, false);
326363
EnableWindow(hwnd, false);
327364
}
365+
if (winStr == EXPECTED_PRESERVE_SAMPLE_RATE_CHECKBOX_TEXT) {
366+
preserveSampleRateControlHwnd = hwnd;
367+
preserveSampleRateLastState = getCheckboxState(hwnd);
368+
setCheckboxState(hwnd, false);
369+
EnableWindow(hwnd, false);
370+
}
328371
}
329372

330373
if (controlType == TEXT || controlType == EDITABLECOMBO) {
@@ -338,7 +381,8 @@ BOOL CALLBACK RenderDialogState::prepareRenderControl_pass2(HWND hwnd, LPARAM lP
338381
if (controlType == COMBOBOX || controlType == EDITABLECOMBO) {
339382
auto itemText = getComboBoxItemText(hwnd);
340383
// See if this is the resample mode dropdown by seeing if the first item is EXPECTED_FIRST_RESAMPLE_MODE_COMBO_OPTION
341-
if(itemText == EXPECTED_FIRST_RESAMPLE_MODE_COMBO_OPTION) {
384+
// Not totally reliable as these options change, so use ID too
385+
if(id == EXPECTED_RESAMPLE_MODE_COMBO_ID || itemText == EXPECTED_FIRST_RESAMPLE_MODE_COMBO_OPTION) {
342386
resampleModeControlHwnd = hwnd;
343387
auto editControl = getComboBoxEdit(hwnd);
344388
EnableWindow(editControl, false);
@@ -356,6 +400,9 @@ BOOL CALLBACK RenderDialogState::prepareRenderControl_pass2(HWND hwnd, LPARAM lP
356400

357401
}
358402

403+
if (controlType == BUTTON) {
404+
lastFoundButtonHwnd = hwnd;
405+
}
359406
return true; // MUST return true to continue iterating through controls
360407
}
361408

@@ -513,7 +560,6 @@ WDL_DLGRET RenderDialogState::wavecfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPa
513560
// Reenable the controls we disabled.
514561
if(boundsControlHwnd) EnableWindow(*boundsControlHwnd, true);
515562
if(presetsControlHwnd) EnableWindow(*presetsControlHwnd, true);
516-
if(normalizeControlHwnd) EnableWindow(*normalizeControlHwnd, true);
517563
if(sourceControlHwnd) EnableWindow(*sourceControlHwnd, true);
518564

519565
if(secondPassControlHwnd) {
@@ -528,6 +574,20 @@ WDL_DLGRET RenderDialogState::wavecfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPa
528574
EnableWindow(*multiToMultiControlHwnd, true);
529575
setCheckboxState(*multiToMultiControlHwnd, multiToMultiLastState);
530576
}
577+
if (preserveSampleRateControlHwnd) {
578+
EnableWindow(*preserveSampleRateControlHwnd, true);
579+
setCheckboxState(*preserveSampleRateControlHwnd, preserveSampleRateLastState);
580+
}
581+
if (normalizeControlHwnd) {
582+
if (normalizeCheckboxControlHwnd) {
583+
EnableWindow(*normalizeCheckboxControlHwnd, true);
584+
setCheckboxState(*normalizeCheckboxControlHwnd, normalizeCheckboxLastState);
585+
EnableWindow(*normalizeControlHwnd, normalizeCheckboxLastState); // Only reenable if last state was checked
586+
}
587+
else {
588+
EnableWindow(*normalizeControlHwnd, true);
589+
}
590+
}
531591

532592
// NOTE: Sample Rate and Channels controls are;
533593
// EDITABLECOMBO in REAPER <=6.11

reaper-adm-extension/src/reaper_adm/exportaction_dialogcontrol.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,21 @@ class RenderDialogState {
4343
std::shared_ptr<ReaperAPI> reaperApi;
4444
REAPER_PLUGIN_HINSTANCE reaperInst;
4545

46+
std::optional<HWND> lastFoundButtonHwnd{};
47+
4648
std::optional<HWND> boundsControlHwnd{};
4749
std::optional<HWND> sourceControlHwnd{};
4850
std::optional<HWND> presetsControlHwnd{};
4951
std::optional<HWND> sampleRateControlHwnd{};
5052
std::optional<HWND> channelsControlHwnd{};
5153
std::optional<HWND> channelsLabelHwnd{};
5254
std::optional<HWND> secondPassControlHwnd{};
55+
std::optional<HWND> normalizeCheckboxControlHwnd{};
5356
std::optional<HWND> normalizeControlHwnd{};
5457
std::optional<HWND> resampleModeControlHwnd{};
5558
std::optional<HWND> monoToMonoControlHwnd{};
5659
std::optional<HWND> multiToMultiControlHwnd{};
60+
std::optional<HWND> preserveSampleRateControlHwnd{};
5761
bool sampleRateControlSetError{false};
5862
bool channelsControlSetError{false};
5963

@@ -62,6 +66,8 @@ class RenderDialogState {
6266
bool secondPassLastState{ false };
6367
bool monoToMonoLastState{ false };
6468
bool multiToMultiLastState{ false };
69+
bool preserveSampleRateLastState{ false };
70+
bool normalizeCheckboxLastState{ false };
6571

6672
std::shared_ptr<AdmExportHandler> admExportHandler;
6773

@@ -77,8 +83,12 @@ class RenderDialogState {
7783
std::string EXPECTED_FIRST_SAMPLE_RATE_COMBO_OPTION{ "8000" };
7884
std::string EXPECTED_FIRST_CHANNEL_COUNT_COMBO_OPTION{ "Mono" };
7985
std::string EXPECTED_PRESETS_BUTTON_TEXT{ "Presets" };
86+
std::string EXPECTED_PRESERVE_SAMPLE_RATE_CHECKBOX_TEXT{ "Preserve source media sample rate if possible" };
8087
std::string EXPECTED_NORMALIZE_BUTTON_TEXT1{ "Normalize/Limit..." };
8188
std::string EXPECTED_NORMALIZE_BUTTON_TEXT2{ "Normalize/Limit/Fade" }; // Changed to include fade at ~v6.64
89+
std::string EXPECTED_NORMALIZE_BUTTON_TEXT3{ "Normalize/fade" }; // Changed to remove limit at ~v7.34 - includes an unlabelled checkbox alongside
90+
const int EXPECTED_NORMALIZE_BUTTON_ID{ 1067 };
91+
const int EXPECTED_NORMALIZE_CHECKBOX_ID{ 1069 };
8292
std::string EXPECTED_SECOND_PASS_CHECKBOX_TEXT{ "2nd pass render" };
8393
std::string EXPECTED_MONO2MONO_CHECKBOX_TEXT{ "Tracks with only mono media to mono files" };
8494
std::string EXPECTED_MULTI2MULTI_CHECKBOX_TEXT{ "Multichannel tracks to multichannel files" };
@@ -87,6 +97,7 @@ class RenderDialogState {
8797
std::string EXPECTED_CHANNEL_COUNT_LABEL_TEXT{ "Channels:" };
8898
std::string REQUIRED_CHANNEL_COUNT_COMBO_OPTION{ "Mono" };
8999
std::string EXPECTED_FIRST_RESAMPLE_MODE_COMBO_OPTION{ "Point Sampling (lowest quality, retro)" };
100+
const int EXPECTED_RESAMPLE_MODE_COMBO_ID{ 1000 };
90101

91102
};
92103

0 commit comments

Comments
 (0)