diff --git a/TCIAdapter.pas b/TCIAdapter.pas index a599747..c4fcd73 100644 --- a/TCIAdapter.pas +++ b/TCIAdapter.pas @@ -470,11 +470,16 @@ begin Exit(False); OldPort := FServer.Port; - FServer.Stop; - // Сервер остановлен — клиентов больше нет, значит и потоки чужие: снимаем - // тапы, иначе DSP-поток продолжал бы носить аудио в никуда. - StopAllStreams; + // ★ПЕРВЫМИ снимаем тапы — тот же порядок, что и в Destroy, и по той же + // причине: их зовёт DSP-поток. Раньше здесь сначала звали FServer.Stop, а он + // на шаге 5 освобождает клиентов; тапы в этот момент ещё стояли, и DSP-поток, + // войдя в OnAudioTap между Stop и StopAllStreams, писал в уже освобождённого + // клиента (FStreams[i].FeedAudio -> EmitFull -> FClient.SendBin). Ловилось + // сменой порта или снятием галки «Enable» при живом AUDIO_START/IQ_START. SetTaps(False); + FServer.Stop; + // Потоки — после остановки сервера: их объекты ссылаются на клиентов. + StopAllStreams; if not T.Enabled then begin FCfg := T;