Подложка полосы задаётся на показе окна, в журнал пишутся громкости и шаги закрытия

Подложка. SetMenuInfo работает по дескриптору меню, а тот появляется
вместе с дескриптором окна — то есть после создания формы. Оба прежних
вызова попадали на несозданный дескриптор и молча ничего не делали.
Теперь вызов идёт из показа окна.

Громкости. В журнал пишется, какая дорожка какую громкость получила и
какая цепочка смешивания ушла в mpv. Снимками экрана это не разобрать:
в одном месте одного и того же клипа звук есть, в соседнем нет, и без
цепочки видно только следствие.

Закрытие. Каждый шаг отмечается в журнале: остановка предпросмотра,
ожидание потоков миниатюр и разбора звука, сохранение настроек,
закрытие плеера, выгрузка libmpv. Под Wine программа зависает при
выходе, а по молчаливому журналу шаг не найти.
This commit is contained in:
4aiman 2026-08-21 12:37:18 +03:00
commit 11075d6b52
2 changed files with 40 additions and 0 deletions

View file

@ -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);

View file

@ -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