gemini claims fixed the issue, now testing

This commit is contained in:
nick huang 2026-03-17 17:24:36 +08:00
parent 1aab24dc74
commit b6abd7b975
1 changed files with 25 additions and 23 deletions

View File

@ -73,17 +73,15 @@ void clear_input_buffer() {
// 音频回调(仅写数据,无额外逻辑) // 音频回调(仅写数据,无额外逻辑)
void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) { void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) {
if (!is_recording.load() || is_stopping.load() || pInput == NULL) return; // 只有在真正停止录制标记为 false 时才退出
if (!is_recording.load() || pInput == NULL) return;
const float* pInputFloat = (const float*)pInput; const float* pInputFloat = (const float*)pInput;
if (pInputFloat == NULL) return;
std::lock_guard<std::mutex> lock(buffer_mutex); std::lock_guard<std::mutex> lock(buffer_mutex);
const size_t max_memory = 16000 * (RECORD_TIMEOUT + 5);
if (audio_buffer.size() < max_memory) { // 持续写入,直到 is_recording 被主线程关掉
audio_buffer.insert(audio_buffer.end(), pInputFloat, pInputFloat + frameCount); audio_buffer.insert(audio_buffer.end(), pInputFloat, pInputFloat + frameCount);
recorded_seconds.store(static_cast<int>(audio_buffer.size() / 16000.0)); recorded_seconds.store(static_cast<int>(audio_buffer.size() / 16000.0));
}
} }
// 静音检测(仅裁剪开头) // 静音检测(仅裁剪开头)
@ -331,25 +329,29 @@ int main(int argc, char** argv) {
// 核心循环 - 无死锁逻辑 // 核心循环 - 无死锁逻辑
while (!exit_program.load() && !stopped) { while (!exit_program.load() && !stopped) {
// 1. 检查手动停止(非阻塞) // 1. 检查手动停止(非阻塞)
if (check_input_non_blocking(50)) { if (check_input_non_blocking(50)) {
char c; char c;
ssize_t ret2 = read(STDIN_FILENO, &c, 1); read(STDIN_FILENO, &c, 1);
(void)ret2; if (c == '\n') {
if (c == '\n' && is_recording.load() && !is_stopping.load()) { printf("\n🛑 手动停止,正在收尾音频数据...");
async_stop_recording("🛑 手动停止录制"); // 异步停止,不阻塞 // 关键:先睡 500ms 捕获回车瞬间的余音,但不开启新线程
stopped = true; std::this_thread::sleep_for(std::chrono::milliseconds(500));
break; is_recording.store(false); // 此时回调停止写入
} stopped = true;
} }
}
// 2. 检查超时停止(非阻塞) // 2. 检查超时停止(非阻塞)
auto duration = std::chrono::duration_cast<std::chrono::seconds>( auto duration = std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::steady_clock::now() - start_time).count(); std::chrono::steady_clock::now() - start_time).count();
if (duration >= RECORD_TIMEOUT && is_recording.load() && !is_stopping.load()) { // 超时判断同理
async_stop_recording("⏱️ 录制超时30秒"); // 异步停止,不阻塞 if (duration >= RECORD_TIMEOUT) {
stopped = true; printf("\n⏱️ 超时停止,正在收尾...");
break; std::this_thread::sleep_for(std::chrono::milliseconds(500));
} is_recording.store(false);
stopped = true;
}
// 3. 检查是否已停止 // 3. 检查是否已停止
if (!is_recording.load()) { if (!is_recording.load()) {