Skip to content

Commit bba5e06

Browse files
committed
feat(main): sep UI and logic
1 parent 68253de commit bba5e06

4 files changed

Lines changed: 71 additions & 80 deletions

File tree

src/audio/recorder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub fn build_process_closure(
8383
.app_state
8484
.lock()
8585
.unwrap();
86-
*state = AppState::Playing;
86+
*state = AppState::Idle;
8787
break;
8888
}
8989
}

src/main.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,30 +71,24 @@ fn main() {
7171
"recording",
7272
recording_duration_samples as u64,
7373
templates::RECORDING,
74-
format!("Record for {} secs", DEFAULT_RECORD_SECONDS).as_str(),
74+
in_port_name.as_str(),
7575
)
7676
.unwrap();
7777

78-
// UI 线程负责基于状态更新进度
79-
std::thread::spawn({
80-
let shared = shared.clone();
81-
let pm = progress_manager;
82-
move || {
83-
ui::run_progress_loop(&shared, recording_duration_samples, &pm);
84-
}
85-
});
86-
87-
// 监听状态变化:录制 -> 播放
8878
loop {
8979
std::thread::sleep(std::time::Duration::from_millis(50));
80+
81+
ui::update_progress(&shared, recording_duration_samples, &progress_manager);
82+
9083
let state = {
9184
shared
92-
.app_state
93-
.lock()
94-
.unwrap()
95-
.clone()
85+
.app_state
86+
.lock()
87+
.unwrap()
88+
.clone()
9689
};
97-
if let recorder::AppState::Playing = state {
90+
if let recorder::AppState::Idle = state {
91+
progress_manager.finish_all();
9892
break;
9993
}
10094
}
@@ -106,8 +100,20 @@ fn main() {
106100
&out_port_name,
107101
);
108102

103+
progress_manager.create_bar(
104+
"playback",
105+
recording_duration_samples as u64,
106+
templates::PLAYBACK,
107+
out_port_name.as_str(),
108+
).unwrap();
109+
110+
*shared.app_state.lock().unwrap() = recorder::AppState::Playing;
111+
109112
loop {
110113
std::thread::sleep(std::time::Duration::from_millis(50));
114+
115+
ui::update_progress(&shared, recording_duration_samples, &progress_manager);
116+
111117
let state = {
112118
shared
113119
.app_state
@@ -116,6 +122,7 @@ fn main() {
116122
.clone()
117123
};
118124
if let recorder::AppState::Idle = state {
125+
progress_manager.finish_all();
119126
break;
120127
}
121128
}

src/ui/mod.rs

Lines changed: 34 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,70 +5,45 @@ pub fn print_banner() {
55
println!("TrackMaker-rs");
66
}
77

8-
pub fn run_progress_loop(
8+
pub fn update_progress(
99
shared: &AppShared,
1010
recording_duration_samples: usize,
1111
progress_manager: &ProgressManager,
1212
) {
13-
loop {
14-
std::thread::sleep(std::time::Duration::from_millis(
15-
crate::utils::consts::PROGRESS_UPDATE_INTERVAL_MS,
16-
));
13+
let current_state = {
14+
let state = shared
15+
.app_state
16+
.lock()
17+
.unwrap();
18+
state.clone()
19+
};
1720

18-
let current_state = {
19-
let state = shared
20-
.app_state
21-
.lock()
22-
.unwrap();
23-
state.clone()
24-
};
25-
26-
match current_state {
27-
AppState::Recording => {
28-
let recorded_samples = {
29-
let recorded = shared
30-
.recorded_audio
31-
.lock()
32-
.unwrap();
33-
recorded.len()
34-
};
35-
let _ = progress_manager
36-
.set_position("recording", recorded_samples as u64);
37-
}
38-
AppState::Playing => {
39-
if progress_manager.exists("recording")
40-
&& !progress_manager
41-
.is_finished("recording")
42-
.unwrap_or(true)
43-
{
44-
let _ = progress_manager.finish_and_clear("recording");
45-
}
46-
47-
if !progress_manager.exists("playback") {
48-
let _ = progress_manager.create_bar(
49-
"playback",
50-
recording_duration_samples as u64,
51-
templates::PLAYBACK,
52-
"Playing...",
53-
);
54-
}
55-
56-
let remaining_samples = {
57-
let playback = shared
58-
.playback_buffer
59-
.lock()
60-
.unwrap();
61-
playback.len()
62-
};
63-
let played_samples =
64-
recording_duration_samples - remaining_samples;
65-
let _ = progress_manager
66-
.set_position("playback", played_samples as u64);
67-
}
68-
AppState::Idle => {
69-
progress_manager.clear_all();
70-
break;
71-
}
21+
match current_state {
22+
AppState::Recording => {
23+
let recorded_samples = {
24+
let recorded = shared
25+
.recorded_audio
26+
.lock()
27+
.unwrap();
28+
recorded.len()
29+
};
30+
let _ = progress_manager
31+
.set_position("recording", recorded_samples as u64);
32+
}
33+
AppState::Playing => {
34+
let remaining_samples = {
35+
let playback = shared
36+
.playback_buffer
37+
.lock()
38+
.unwrap();
39+
playback.len()
40+
};
41+
let played_samples =
42+
recording_duration_samples - remaining_samples;
43+
let _ = progress_manager
44+
.set_position("playback", played_samples as u64);
45+
}
46+
AppState::Idle => {
7247
}
7348
}
7449
}

src/utils/progress.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ impl ProgressManager {
129129
}
130130
}
131131

132+
/// 完成所有进度条
133+
pub fn finish_all(&self) {
134+
if let Ok(mut bars) = self.bars.lock() {
135+
for (_, pb) in bars.drain() {
136+
pb.finish();
137+
}
138+
}
139+
}
140+
132141
/// 清理所有进度条
133142
pub fn clear_all(&self) {
134143
if let Ok(mut bars) = self.bars.lock() {
@@ -147,13 +156,13 @@ impl Default for ProgressManager {
147156

148157
pub mod templates {
149158
pub const RECORDING: &str =
150-
"RECORDING: [{bar:30.red}] {percent}% ({pos}/{len} samples) {msg}";
159+
"RECORDING: [{bar:30.red}] {percent}% ({pos}/{len} samples) {msg}";
151160
pub const PLAYBACK: &str =
152-
"PLAYBACK: [{bar:30.green}] {percent}% ({pos}/{len} samples) {msg}";
161+
"PLAYBACK: [{bar:30.green}] {percent}% ({pos}/{len} samples) {msg}";
153162
pub const PROCESSING: &str =
154-
"PROCESSING: [{bar:30.blue}] {percent}% ({pos}/{len}) {msg}";
163+
"PROCESSING: [{bar:30.blue}] {percent}% ({pos}/{len}) {msg}";
155164
pub const DOWNLOAD: &str =
156-
"DOWNLOAD: [{bar:30.yellow}] {percent}% ({pos}/{len} bytes) {msg}";
165+
"DOWNLOADING: [{bar:30.yellow}] {percent}% ({pos}/{len} bytes) {msg}";
157166
}
158167

159168
pub mod colors {

0 commit comments

Comments
 (0)