From 11075d6b52171c50f592a20b319d65b292ad1a84 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Fri, 21 Aug 2026 12:37:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BB=D0=BE=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=BB=D0=BE=D1=81=D1=8B=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=91=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=D0=B7=D0=B5=20=D0=BE=D0=BA=D0=BD=D0=B0,=20?= =?UTF-8?q?=D0=B2=20=D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=20=D0=BF=D0=B8?= =?UTF-8?q?=D1=88=D1=83=D1=82=D1=81=D1=8F=20=D0=B3=D1=80=D0=BE=D0=BC=D0=BA?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8=20=D1=88=D0=B0=D0=B3=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Подложка. SetMenuInfo работает по дескриптору меню, а тот появляется вместе с дескриптором окна — то есть после создания формы. Оба прежних вызова попадали на несозданный дескриптор и молча ничего не делали. Теперь вызов идёт из показа окна. Громкости. В журнал пишется, какая дорожка какую громкость получила и какая цепочка смешивания ушла в mpv. Снимками экрана это не разобрать: в одном месте одного и того же клипа звук есть, в соседнем нет, и без цепочки видно только следствие. Закрытие. Каждый шаг отмечается в журнале: остановка предпросмотра, ожидание потоков миниатюр и разбора звука, сохранение настроек, закрытие плеера, выгрузка libmpv. Под Wine программа зависает при выходе, а по молчаливому журналу шаг не найти. --- src/uMainForm.pas | 37 +++++++++++++++++++++++++++++++++++++ src/uMpvPlayer.pas | 3 +++ 2 files changed, 40 insertions(+) diff --git a/src/uMainForm.pas b/src/uMainForm.pas index 92d8b51..9ad2616 100644 --- a/src/uMainForm.pas +++ b/src/uMainForm.pas @@ -364,11 +364,18 @@ begin ApplyDarkTheme(Self); end; +{ Каждый шаг закрытия отмечается в журнале. + + Под Wine программа зависала при выходе, и по молчаливому журналу + понять, на чём именно, нельзя: последняя запись оставалась от работы, а + не от закрытия. Записи дешёвые, а без них искать пришлось бы наугад. } procedure TMainForm.FormDestroy(Sender: TObject); begin + Log('Закрытие: останавливаю предпросмотр.'); FPreviewTimer.Enabled := False; if Assigned(FThumbThread) then begin + Log('Закрытие: жду поток миниатюр.'); { Поток обращается к форме через Synchronize, поэтому дожидаться его обязательно: иначе он попробует достучаться до уже разрушенного окна. } FThumbThread.Terminate; @@ -377,6 +384,7 @@ begin end; if Assigned(FPeaksThread) then begin + Log('Закрытие: жду разбор звука.'); { При закрытии ждать приходится: поток обращается к окну. Ждать недолго — запущенный ffmpeg прерывается по тому же признаку. } FPeaksRestart := False; @@ -385,12 +393,17 @@ begin FreeAndNil(FPeaksThread); end; FreeAndNil(FThumbMap); + Log('Закрытие: сохраняю настройки.'); CollectSettings; FSettings.Save; FreeAndNil(FSettings); + Log('Закрытие: закрываю плеер.'); FreeAndNil(FPlayer); + Log('Закрытие: выгружаю libmpv.'); UnloadMpvLib; + Log('Закрытие: освобождаю проект.'); FreeAndNil(FProject); + Log('Закрытие завершено.'); { Сами списки принадлежат форме и уничтожатся с ней; здесь только перечень ссылок на них. } end; @@ -688,6 +701,15 @@ begin Exit; FStarted := True; + { Подложка полосы меню задаётся здесь, а не при создании формы. + + Она задаётся через SetMenuInfo по дескриптору меню, а тот появляется + вместе с дескриптором окна — то есть уже после создания формы. Вызов + из BuildMenu поэтому попадал на несозданный дескриптор и молча ничего + не делал: пункты рисовались нашими руками, а полоса правее последнего + названия оставалась светлой. } + ApplyDarkMenu(Menu); + StartPlayer; { Файлы из командной строки попадают в список проекта. Так на программу @@ -2023,7 +2045,22 @@ begin if Key = FLastVolumeKey then Exit; FLastVolumeKey := Key; + + { Кто какую громкость получил — в журнал. Иначе разбираться, почему в + одном месте звук есть, а в соседнем нет, приходится по снимкам + экрана. } + Key := ''; + for I := 0 to High(FPreviewAudioTracks) do + begin + if Key <> '' then + Key := Key + ', '; + Key := Key + FPreviewAudioTracks[I].Name + '=' + SecondsToStr(Vols[I]); + end; + Log(Format('Громкости на %s: %s', [SecondsToStr(ATime), Key])); + FPlayer.SetTrackVolumes(Vols); + if FPlayer.AudioGraph <> '' then + Log('Цепочка звука: ' + FPlayer.AudioGraph); end; procedure TMainForm.GenerateProgress(Sender: TObject); diff --git a/src/uMpvPlayer.pas b/src/uMpvPlayer.pas index d237921..0329e61 100644 --- a/src/uMpvPlayer.pas +++ b/src/uMpvPlayer.pas @@ -189,6 +189,9 @@ type property OnDuration: TNotifyEvent read FOnDuration write FOnDuration; property OnPauseChange: TNotifyEvent read FOnPauseChange write FOnPauseChange; property OnLog: TMpvLogEvent read FOnLog write FOnLog; + { Цепочка смешивания, отданная mpv. Нужна журналу: по ней видно, какая + дорожка какую громкость получила на самом деле. } + property AudioGraph: string read FLastGraph; end; implementation