@@ -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
288293BOOL 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
0 commit comments