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