liumaolin commited on
Commit
627c3e7
·
1 Parent(s): f5226c0

Add robust lifecycle management for `audio_player` service in system routes

Browse files

- Implement `stop` and `resume` functionality for `audio_player` with timeout handling.
- Add readiness checks and informative logging to ensure service stability during start and stop operations.
- Allow system continuation even if `audio_player` encounters errors or is unavailable.

src/voice_dialogue/api/routes/system_routes.py CHANGED
@@ -136,6 +136,26 @@ async def stop_system(request: Request):
136
  except Exception as e:
137
  logger.error(f"停止音频捕获服务时发生错误: {e}", exc_info=True)
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  _system_status["status"] = "stopped"
140
  _system_status["start_time"] = None
141
  _system_status["active_sessions"] = 0
@@ -183,6 +203,33 @@ async def _start_system_background(request: Request):
183
  if not service_manager:
184
  raise RuntimeError("服务管理器未初始化")
185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  # 检查audio_capture服务是否已存在
187
  if service_manager.is_service_running("audio_capture"):
188
  logger.info("音频捕获服务已在运行")
 
136
  except Exception as e:
137
  logger.error(f"停止音频捕获服务时发生错误: {e}", exc_info=True)
138
 
139
+ # 停止audio_player服务
140
+ if service_manager.is_service_running("audio_player"):
141
+ audio_player_service = service_manager.get_service("audio_player")
142
+ if audio_player_service:
143
+ try:
144
+ # 首先停止音频播放
145
+ audio_player_service.stop()
146
+ logger.info("音频播放服务已停止播放")
147
+
148
+ # 等待当前播放完成,但设置超时
149
+ timeout = 3
150
+ start_time = time.time()
151
+ while not audio_player_service.is_stopped and (time.time() - start_time) < timeout:
152
+ await asyncio.sleep(0.1)
153
+
154
+ logger.info("音频播放服务停止完成")
155
+
156
+ except Exception as e:
157
+ logger.error(f"停止音频播放服务时发生错误: {e}", exc_info=True)
158
+
159
  _system_status["status"] = "stopped"
160
  _system_status["start_time"] = None
161
  _system_status["active_sessions"] = 0
 
203
  if not service_manager:
204
  raise RuntimeError("服务管理器未初始化")
205
 
206
+ audio_player_service = service_manager.get_service("audio_player")
207
+ if audio_player_service:
208
+ try:
209
+ if audio_player_service.is_stopped:
210
+ # 如果服务处于停止状态,恢复运行
211
+ audio_player_service.resume()
212
+ logger.info("音频播放服务已恢复运行")
213
+ elif not audio_player_service.is_ready:
214
+ # 如果服务未准备就绪,等待一段时间
215
+ timeout = 5
216
+ start_time = time.time()
217
+ while not audio_player_service.is_ready and (time.time() - start_time) < timeout:
218
+ await asyncio.sleep(0.1)
219
+
220
+ if audio_player_service.is_ready:
221
+ logger.info("音频播放服务已准备就绪")
222
+ else:
223
+ logger.warning("音频播放服务启动超时,但继续启动系统")
224
+ else:
225
+ logger.info("音频播放服务已在运行中")
226
+
227
+ except Exception as e:
228
+ logger.error(f"处理音频播放服务时发生错误: {e}", exc_info=True)
229
+ # 不因为audio_player错误而阻止系统启动
230
+ else:
231
+ logger.warning("未找到音频播放服务,系统将继续启动但可能无法播放音频")
232
+
233
  # 检查audio_capture服务是否已存在
234
  if service_manager.is_service_running("audio_capture"):
235
  logger.info("音频捕获服务已在运行")