Описание
FFmpegVideoWriter имеет полноценный crash recovery: retry_with_backoff(), _attempt_recovery() с созданием _partN сегментов, _check_disk_space() для graceful stop. AudioRecorder — не имеет ничего из этого.
Проблема
- recorder/audio_recorder.py (строки 270-277) — потоки
_writer_thread и _record_thread запускаются как daemon=False, без механизма восстановления. Если sounddevice поток умирает (ошибка драйвера, переключение устройства), аудио-чанки молча теряются.
- recorder/audio_recorder.py (строки 473-478) — исключения при pyaudio cleanup подавляются через
except Exception: pass
- recorder/audio_recorder.py (строки 486-527) — EventBus.publish() вызывается без блокировки, race condition на
self._event_bus
- recorder/audio_recorder.py — нет
_attempt_recovery(), нет retry-логики
Критерии приёмки (DOR)
Локация
recorder/audio_recorder.py (строки 234-241, 270-277, 473-478, 486-527)
Оценка
3-4 часа
Приоритет
High — потеря аудио без уведомления пользователя — критическая проблема надежности.
Описание
FFmpegVideoWriterимеет полноценный crash recovery:retry_with_backoff(),_attempt_recovery()с созданием_partNсегментов,_check_disk_space()для graceful stop.AudioRecorder— не имеет ничего из этого.Проблема
_writer_threadи_record_threadзапускаются какdaemon=False, без механизма восстановления. Еслиsounddeviceпоток умирает (ошибка драйвера, переключение устройства), аудио-чанки молча теряются.except Exception: passself._event_bus_attempt_recovery(), нет retry-логикиКритерии приёмки (DOR)
AudioRecorderперехватывает ошибки sounddevice и пытается переоткрыть поток (max 3 попытки, backoff)RecordingEventс типом ошибкиexcept Exception: passзаменены наlogger.warning_enqueue_audio_chunk()защищён блокировкой при доступе кself._event_busЛокация
recorder/audio_recorder.py(строки 234-241, 270-277, 473-478, 486-527)Оценка
3-4 часа
Приоритет
High — потеря аудио без уведомления пользователя — критическая проблема надежности.