feat: complete Phase 12 — voice playback ticker, cache, config, and UI
Add playback position ticker in event loop with 1s UI refresh rate, integrate VoiceCache for downloaded voice files, add [audio] config section (cache_size_mb, auto_download_voice), and render progress bar with waveform visualization in message bubbles. Fix race conditions in AudioPlayer: add `starting` flag to prevent false `is_stopped()` during ffplay startup, guard pid cleanup so old threads don't overwrite newer process pids. Implement `resume_from()` with ffplay `-ss` for real audio seek on unpause (-1s rewind). Kill ffplay on app exit via `stop_playback()` in shutdown + Drop impl. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -47,6 +47,10 @@ pub struct Config {
|
||||
/// Настройки отображения изображений.
|
||||
#[serde(default)]
|
||||
pub images: ImagesConfig,
|
||||
|
||||
/// Настройки аудио (голосовые сообщения).
|
||||
#[serde(default)]
|
||||
pub audio: AudioConfig,
|
||||
}
|
||||
|
||||
/// Общие настройки приложения.
|
||||
@@ -140,6 +144,27 @@ impl Default for ImagesConfig {
|
||||
}
|
||||
}
|
||||
|
||||
/// Настройки аудио (голосовые сообщения).
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct AudioConfig {
|
||||
/// Размер кэша голосовых файлов (в МБ)
|
||||
#[serde(default = "default_audio_cache_size_mb")]
|
||||
pub cache_size_mb: u64,
|
||||
|
||||
/// Автоматически загружать голосовые при открытии чата
|
||||
#[serde(default = "default_auto_download_voice")]
|
||||
pub auto_download_voice: bool,
|
||||
}
|
||||
|
||||
impl Default for AudioConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
cache_size_mb: default_audio_cache_size_mb(),
|
||||
auto_download_voice: default_auto_download_voice(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Дефолтные значения (используются serde атрибутами)
|
||||
fn default_timezone() -> String {
|
||||
"+03:00".to_string()
|
||||
@@ -197,6 +222,14 @@ fn default_auto_download_images() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
fn default_audio_cache_size_mb() -> u64 {
|
||||
crate::constants::DEFAULT_AUDIO_CACHE_SIZE_MB
|
||||
}
|
||||
|
||||
fn default_auto_download_voice() -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
impl Default for GeneralConfig {
|
||||
fn default() -> Self {
|
||||
Self { timezone: default_timezone() }
|
||||
@@ -235,6 +268,7 @@ impl Default for Config {
|
||||
keybindings: Keybindings::default(),
|
||||
notifications: NotificationsConfig::default(),
|
||||
images: ImagesConfig::default(),
|
||||
audio: AudioConfig::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user