Files

723 lines
29 KiB
Python

from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton,
QLineEdit, QTextEdit, QGroupBox, QFormLayout, QComboBox,
QGridLayout, QMessageBox, QSpinBox, QCheckBox, QFileDialog)
from PyQt5.QtCore import Qt, pyqtSlot
import serial.tools.list_ports
import os
import json
class SettingsTab(QWidget):
def __init__(self, lte_manager, audio_features=None):
super().__init__()
self.lte_manager = lte_manager
self.audio_features = audio_features
# Settings file path
self.settings_file = "lte_settings.json"
# Default settings
self.settings = {
"at_port": "",
"at_baudrate": "115200",
"nmea_port": "None",
"nmea_baudrate": "9600",
"auto_connect": False,
"audio_enabled": True,
"ringtone_file": "",
"recording_path": "",
"auto_record_calls": True, # 自动录制通话
"auto_play_after_call": False, # 通话结束后自动播放录音
"auto_play_on_answer": False, # 接听电话时自动播放声音
"answer_play_audio_file": "", # 接听时播放的音频文件
}
# 从文件加载设置
try:
if os.path.exists(self.settings_file):
with open(self.settings_file, 'r') as f:
saved_settings = json.load(f)
for key, value in saved_settings.items():
self.settings[key] = value
except Exception as e:
print(f"加载设置失败: {str(e)}")
# Connect signals
self.lte_manager.status_changed.connect(self.on_status_changed)
if self.audio_features:
self.audio_features.status_changed.connect(self.on_status_changed)
# Create UI components first
self._create_ui_components()
# Then setup the UI layout
self.setup_ui()
# Finally refresh the ports
self.refresh_ports()
# 应用设置到UI
self._apply_settings_to_ui()
# 如果初始化时有音频特性模块,立即应用相关设置
if self.audio_features:
# 设置录音路径
if self.settings.get("recording_path") and os.path.exists(self.settings.get("recording_path")):
self.audio_features.set_storage_path(self.settings.get("recording_path"))
# 设置自动录音选项
self.audio_features.set_auto_record_calls(self.settings.get("auto_record_calls", True))
# 设置自动播放选项
self.audio_features.set_auto_play_after_call(self.settings.get("auto_play_after_call", False))
def _apply_settings_to_ui(self):
"""将加载的设置应用到UI组件"""
# 加载设置
self.auto_record_cb.setChecked(self.settings.get('auto_record_calls', True))
self.auto_play_cb.setChecked(self.settings.get('auto_play_after_call', False))
self.auto_play_on_answer_cb.setChecked(self.settings.get('auto_play_on_answer', False))
recording_path = self.settings.get('recording_path', '')
self.recording_path_edit.setText(recording_path)
answer_play_file = self.settings.get('answer_play_audio_file', '')
self.answer_play_edit.setText(answer_play_file)
# 如果音频特性实例存在,应用设置
if self.audio_features:
self.audio_features.set_auto_record_calls(self.auto_record_cb.isChecked())
self.audio_features.set_auto_play_after_call(self.auto_play_cb.isChecked())
answer_audio_file = self.answer_play_edit.text()
if answer_audio_file and os.path.exists(answer_audio_file):
self.audio_features.set_auto_play_on_answer(
self.auto_play_on_answer_cb.isChecked(),
answer_audio_file
)
def _create_ui_components(self):
"""创建所有UI组件"""
# 创建串口选择下拉框
self.at_port_combo = QComboBox()
self.at_port_combo.setMinimumWidth(120)
self.at_baud_combo = QComboBox()
self.at_baud_combo.setMinimumWidth(100)
self.at_baud_combo.addItems(['115200', '9600', '38400', '57600'])
self.nmea_port_combo = QComboBox()
self.nmea_port_combo.setMinimumWidth(120)
self.nmea_port_combo.addItem("None")
self.nmea_baud_combo = QComboBox()
self.nmea_baud_combo.setMinimumWidth(100)
self.nmea_baud_combo.addItems(['9600', '38400', '57600', '115200'])
# 创建按钮
self.connect_btn = QPushButton("连接")
self.connect_btn.clicked.connect(self.toggle_connection)
# 创建AT命令输入框和发送按钮
self.at_command_input = QLineEdit()
self.at_command_input.setPlaceholderText("输入AT命令")
self.send_btn = QPushButton("发送")
self.send_btn.clicked.connect(self.send_at_command)
# 创建文本显示区域
self.at_response_text = QTextEdit()
self.at_response_text.setMaximumHeight(150)
self.at_response_text.setReadOnly(True)
self.status_text = QTextEdit()
self.status_text.setMinimumHeight(200)
self.status_text.setReadOnly(True)
# 创建复选框
self.auto_connect_check = QCheckBox("启动时自动连接")
self.auto_connect_check.setChecked(self.settings.get("auto_connect", False))
# 音频功能组件
self.audio_enabled_check = QCheckBox("启用音频功能")
self.audio_enabled_check.setChecked(self.settings.get("audio_enabled", True))
# 自动录音选项
self.auto_record_calls_check = QCheckBox("自动录制通话")
self.auto_record_calls_check.setChecked(self.settings.get("auto_record_calls", True))
self.auto_record_calls_check.setToolTip("接听电话时自动开始录音,通话结束时自动停止")
self.auto_record_calls_check.stateChanged.connect(self.on_auto_record_changed)
# 自动播放录音选项
self.auto_play_after_call_check = QCheckBox("通话结束后自动播放录音")
self.auto_play_after_call_check.setChecked(self.settings.get("auto_play_after_call", False))
self.auto_play_after_call_check.setToolTip("通话结束后自动播放刚录制的通话录音")
self.auto_play_after_call_check.stateChanged.connect(self.on_auto_play_changed)
# 录音路径
self.recording_path_input = QLineEdit()
# 如果没有设置过录音路径,使用音频特性模块的默认路径
if self.audio_features and not self.settings.get("recording_path"):
self.settings["recording_path"] = self.audio_features.storage_path
self.recording_path_input.setText(self.settings.get("recording_path", ""))
self.recording_path_btn = QPushButton("浏览...")
self.recording_path_btn.clicked.connect(self.browse_recording_path)
self.recording_path_reset_btn = QPushButton("重置")
self.recording_path_reset_btn.setToolTip("重置为默认路径")
self.recording_path_reset_btn.clicked.connect(self.reset_recording_path)
# 铃声设置
self.ringtone_path_input = QLineEdit()
self.ringtone_path_input.setText(self.settings.get("ringtone_file", ""))
self.ringtone_path_btn = QPushButton("浏览...")
self.ringtone_path_btn.clicked.connect(self.browse_ringtone_file)
self.set_ringtone_btn = QPushButton("设置铃声")
self.set_ringtone_btn.clicked.connect(self.set_ringtone)
# 录音控制
self.start_recording_btn = QPushButton("开始录音")
self.start_recording_btn.clicked.connect(self.start_recording)
self.stop_recording_btn = QPushButton("停止录音")
self.stop_recording_btn.clicked.connect(self.stop_recording)
# 录音类型选择
self.recording_type_combo = QComboBox()
self.recording_type_combo.addItems(["本地麦克风", "通话对方声音", "双方声音混合"])
# 播放音频
self.play_audio_input = QLineEdit()
self.play_audio_input.setPlaceholderText("输入音频文件名或路径")
self.play_audio_btn = QPushButton("播放")
self.play_audio_btn.clicked.connect(self.play_audio)
self.stop_audio_btn = QPushButton("停止")
self.stop_audio_btn.clicked.connect(self.stop_audio)
self.browse_audio_btn = QPushButton("浏览...")
self.browse_audio_btn.clicked.connect(self.browse_audio_file)
# 播放类型选择
self.play_type_combo = QComboBox()
self.play_type_combo.addItems(["本地播放", "远程播放(对方听)", "双方都播放"])
# 创建音频控制部分
self.audio_group = QGroupBox("音频控制")
self.audio_layout = QVBoxLayout()
# 通话录音部分
self.recording_section = QGroupBox("通话录音")
recording_layout = QVBoxLayout()
# 自动录制选项
self.auto_record_cb = QCheckBox("自动录制通话")
self.auto_record_cb.setToolTip("接听电话时自动开始录音,挂断时自动停止")
self.auto_record_cb.stateChanged.connect(self.on_auto_record_changed)
recording_layout.addWidget(self.auto_record_cb)
# 录音后自动播放选项
self.auto_play_cb = QCheckBox("录音后自动播放")
self.auto_play_cb.setToolTip("通话结束后自动播放录音")
self.auto_play_cb.stateChanged.connect(self.on_auto_play_changed)
recording_layout.addWidget(self.auto_play_cb)
# 录音路径选择
recording_path_layout = QHBoxLayout()
self.recording_path_label = QLabel("录音存储路径:")
self.recording_path_edit = QLineEdit()
self.recording_path_edit.setReadOnly(True)
self.browse_recording_btn = QPushButton("浏览...")
self.browse_recording_btn.clicked.connect(self.browse_recording_path)
self.reset_recording_btn = QPushButton("重置")
self.reset_recording_btn.clicked.connect(self.reset_recording_path)
recording_path_layout.addWidget(self.recording_path_label)
recording_path_layout.addWidget(self.recording_path_edit)
recording_path_layout.addWidget(self.browse_recording_btn)
recording_path_layout.addWidget(self.reset_recording_btn)
recording_layout.addLayout(recording_path_layout)
# 录音控制按钮
recording_control_layout = QHBoxLayout()
self.start_recording_btn = QPushButton("开始录音")
self.start_recording_btn.clicked.connect(self.start_recording)
self.stop_recording_btn = QPushButton("停止录音")
self.stop_recording_btn.clicked.connect(self.stop_recording)
recording_control_layout.addWidget(self.start_recording_btn)
recording_control_layout.addWidget(self.stop_recording_btn)
recording_layout.addLayout(recording_control_layout)
self.recording_section.setLayout(recording_layout)
self.audio_layout.addWidget(self.recording_section)
# 音频播放部分
self.playback_section = QGroupBox("音频播放")
playback_layout = QVBoxLayout()
# 自动接听播放选项
self.auto_play_on_answer_cb = QCheckBox("接听电话时自动播放音频")
self.auto_play_on_answer_cb.setToolTip("接听电话时自动向对方播放指定音频文件")
self.auto_play_on_answer_cb.stateChanged.connect(self.on_auto_play_on_answer_changed)
playback_layout.addWidget(self.auto_play_on_answer_cb)
# 接听播放音频选择
answer_play_layout = QHBoxLayout()
self.answer_play_label = QLabel("接听播放音频:")
self.answer_play_edit = QLineEdit()
self.answer_play_edit.setReadOnly(True)
self.browse_answer_play_btn = QPushButton("浏览...")
self.browse_answer_play_btn.clicked.connect(self.browse_answer_play_file)
answer_play_layout.addWidget(self.answer_play_label)
answer_play_layout.addWidget(self.answer_play_edit)
answer_play_layout.addWidget(self.browse_answer_play_btn)
playback_layout.addLayout(answer_play_layout)
# 音频文件选择
audio_file_layout = QHBoxLayout()
self.audio_file_label = QLabel("音频文件:")
self.audio_file_edit = QLineEdit()
self.audio_file_edit.setReadOnly(True)
self.browse_audio_btn = QPushButton("浏览...")
self.browse_audio_btn.clicked.connect(self.browse_audio_file)
audio_file_layout.addWidget(self.audio_file_label)
audio_file_layout.addWidget(self.audio_file_edit)
audio_file_layout.addWidget(self.browse_audio_btn)
playback_layout.addLayout(audio_file_layout)
# 播放控制按钮
playback_control_layout = QHBoxLayout()
self.play_audio_btn = QPushButton("播放音频")
self.play_audio_btn.clicked.connect(self.play_audio)
self.stop_audio_btn = QPushButton("停止播放")
self.stop_audio_btn.clicked.connect(self.stop_audio)
playback_control_layout.addWidget(self.play_audio_btn)
playback_control_layout.addWidget(self.stop_audio_btn)
playback_layout.addLayout(playback_control_layout)
self.playback_section.setLayout(playback_layout)
self.audio_layout.addWidget(self.playback_section)
# 铃声设置部分
self.ringtone_section = QGroupBox("铃声设置")
ringtone_layout = QVBoxLayout()
# 铃声文件选择
ringtone_file_layout = QHBoxLayout()
self.ringtone_file_label = QLabel("铃声文件:")
self.ringtone_file_edit = QLineEdit()
self.ringtone_file_edit.setReadOnly(True)
self.browse_ringtone_btn = QPushButton("浏览...")
self.browse_ringtone_btn.clicked.connect(self.browse_ringtone_file)
ringtone_file_layout.addWidget(self.ringtone_file_label)
ringtone_file_layout.addWidget(self.ringtone_file_edit)
ringtone_file_layout.addWidget(self.browse_ringtone_btn)
ringtone_layout.addLayout(ringtone_file_layout)
# 铃声设置按钮
self.set_ringtone_btn = QPushButton("设置铃声")
self.set_ringtone_btn.clicked.connect(self.set_ringtone)
ringtone_layout.addWidget(self.set_ringtone_btn)
self.ringtone_section.setLayout(ringtone_layout)
self.audio_layout.addWidget(self.ringtone_section)
self.audio_group.setLayout(self.audio_layout)
def setup_ui(self):
"""设置UI布局"""
layout = QVBoxLayout(self)
# 串口设置组
serial_group = QGroupBox("串口设置")
serial_layout = QGridLayout()
# 第一行:AT串口和波特率
serial_layout.addWidget(QLabel("AT串口:"), 0, 0)
serial_layout.addWidget(self.at_port_combo, 0, 1)
serial_layout.addWidget(QLabel("AT波特率:"), 0, 2)
serial_layout.addWidget(self.at_baud_combo, 0, 3)
# 第二行:NMEA串口和波特率
serial_layout.addWidget(QLabel("NMEA串口:"), 1, 0)
serial_layout.addWidget(self.nmea_port_combo, 1, 1)
serial_layout.addWidget(QLabel("NMEA波特率:"), 1, 2)
serial_layout.addWidget(self.nmea_baud_combo, 1, 3)
# 第三行:刷新按钮和自动连接选项
refresh_btn = QPushButton("刷新串口")
refresh_btn.clicked.connect(self.refresh_ports)
serial_layout.addWidget(refresh_btn, 2, 0, 1, 2)
serial_layout.addWidget(self.auto_connect_check, 2, 2, 1, 2)
serial_group.setLayout(serial_layout)
layout.addWidget(serial_group)
# 连接按钮
layout.addWidget(self.connect_btn)
# 添加音频控制组
layout.addWidget(self.audio_group)
# AT命令区域
at_group = QGroupBox("AT命令")
at_layout = QVBoxLayout()
# AT命令输入区域
at_input_layout = QHBoxLayout()
at_input_layout.addWidget(self.at_command_input)
at_input_layout.addWidget(self.send_btn)
at_layout.addLayout(at_input_layout)
# AT响应显示区域
at_layout.addWidget(self.at_response_text)
at_group.setLayout(at_layout)
layout.addWidget(at_group)
# 状态信息区域
status_group = QGroupBox("状态信息")
status_layout = QVBoxLayout()
status_layout.addWidget(self.status_text)
status_group.setLayout(status_layout)
layout.addWidget(status_group)
def on_auto_record_changed(self, state):
"""处理自动录制通话选项变更"""
is_checked = state == Qt.Checked
if self.audio_features:
self.audio_features.set_auto_record_calls(is_checked)
self.settings["auto_record_calls"] = is_checked
self.save_settings()
def on_auto_play_changed(self, state):
"""处理自动播放录音选项变更"""
is_checked = state == Qt.Checked
if self.audio_features:
self.audio_features.set_auto_play_after_call(is_checked)
self.settings["auto_play_after_call"] = is_checked
self.save_settings()
def reset_recording_path(self):
"""重置录音路径为默认值"""
if self.audio_features:
# 重置为音频模块的默认路径
default_path = self.audio_features.storage_path
self.recording_path_edit.setText(default_path)
self.audio_features.set_storage_path(default_path)
self.settings["recording_path"] = default_path
self.save_settings()
self.add_status_message(f"录音路径已重置为: {default_path}")
def get_available_ports(self):
"""Get list of available serial ports"""
ports = []
for port in serial.tools.list_ports.comports():
ports.append(port.device)
return ports
def refresh_ports(self):
"""Refresh available serial ports"""
self.at_port_combo.clear()
self.nmea_port_combo.clear()
self.nmea_port_combo.addItem("None")
ports = self.get_available_ports()
for port in ports:
self.at_port_combo.addItem(port)
self.nmea_port_combo.addItem(port)
# Set saved ports if available
if self.settings["at_port"] in ports:
self.at_port_combo.setCurrentText(self.settings["at_port"])
if self.settings["nmea_port"] in ports or self.settings["nmea_port"] == "None":
self.nmea_port_combo.setCurrentText(self.settings["nmea_port"])
def toggle_connection(self):
"""切换连接状态"""
if not self.lte_manager.is_connected():
self.connect()
else:
self.disconnect()
def connect(self):
"""连接到LTE模块"""
at_port = self.at_port_combo.currentText()
at_baud = int(self.at_baud_combo.currentText())
# 旧代码保留在注释中,以便后续可能的恢复
# nmea_port = self.nmea_port_combo.currentText()
# nmea_baud = int(self.nmea_baud_combo.currentText())
# if nmea_port == "None":
# nmea_port = ""
# 使用新的连接方法,只传递AT端口和波特率
if self.lte_manager.connect(port=at_port, baudrate=at_baud):
self.connect_btn.setText("断开")
self.save_settings()
# 更新音频控件状态
if self.audio_features:
self.update_audio_controls_state()
# 如果有设置铃声,自动应用
if self.settings.get("ringtone_file") and os.path.exists(self.settings.get("ringtone_file")):
self.set_ringtone()
# 如果有设置录音路径,自动应用
if self.settings.get("recording_path") and os.path.exists(self.settings.get("recording_path")):
self.audio_features.set_storage_path(self.settings.get("recording_path"))
# 应用自动录音和自动播放设置
self.audio_features.set_auto_record_calls(self.auto_record_cb.isChecked())
self.audio_features.set_auto_play_after_call(self.auto_play_cb.isChecked())
else:
QMessageBox.warning(self, "连接错误", "无法连接到LTE模块")
def disconnect(self):
"""断开LTE模块连接"""
self.lte_manager.disconnect()
self.connect_btn.setText("连接")
# 更新音频控件状态
if self.audio_features:
self.update_audio_controls_state()
def send_at_command(self):
"""发送AT命令"""
if not self.lte_manager.is_connected():
QMessageBox.warning(self, "错误", "未连接到LTE模块")
return
command = self.at_command_input.text().strip()
if not command:
return
self.at_response_text.append(f">>> {command}")
response = self.lte_manager.send_at_command(command)
if response:
self.at_response_text.append(response)
self.at_command_input.clear()
def on_status_changed(self, status):
"""Handle status change"""
self.add_status_message(status)
def add_status_message(self, message):
"""Add message to status display"""
self.status_text.append(message)
self.status_text.ensureCursorVisible()
def save_settings(self):
"""保存设置到文件"""
try:
# 更新设置字典
self.settings["at_port"] = self.at_port_combo.currentText()
self.settings["at_baudrate"] = self.at_baud_combo.currentText()
self.settings["nmea_port"] = self.nmea_port_combo.currentText()
self.settings["nmea_baudrate"] = self.nmea_baud_combo.currentText()
self.settings["auto_connect"] = self.auto_connect_check.isChecked()
self.settings["recording_path"] = self.recording_path_edit.text()
self.settings["auto_record_calls"] = self.auto_record_cb.isChecked()
self.settings["auto_play_after_call"] = self.auto_play_cb.isChecked()
self.settings["auto_play_on_answer"] = self.auto_play_on_answer_cb.isChecked()
self.settings["answer_play_audio_file"] = self.answer_play_edit.text()
with open(self.settings_file, 'w') as f:
json.dump(self.settings, f, indent=4)
print("设置已保存到", self.settings_file)
except Exception as e:
print(f"保存设置失败: {str(e)}")
def try_auto_connect(self):
"""尝试自动连接"""
if self.auto_connect_check.isChecked():
self.connect()
# 音频功能相关方法
def update_audio_controls_state(self):
"""更新音频控制按钮的状态"""
if not hasattr(self, 'audio_features') or not self.audio_features:
return
connected = self.lte_manager.is_connected()
recording = self.audio_features.is_recording() if connected else False
playing = self.audio_features.playing if connected else False
# 启用/禁用录音控制按钮
self.start_recording_btn.setEnabled(connected and not recording)
self.stop_recording_btn.setEnabled(connected and recording)
# 启用/禁用播放控制按钮
self.play_audio_btn.setEnabled(connected and not playing)
self.stop_audio_btn.setEnabled(connected and playing)
# 铃声设置按钮
self.set_ringtone_btn.setEnabled(connected)
# 自动功能控制
self.auto_record_cb.setEnabled(connected)
self.auto_play_cb.setEnabled(connected)
self.auto_play_on_answer_cb.setEnabled(connected)
# 路径设置按钮
self.browse_recording_btn.setEnabled(True) # 这个不依赖连接状态
self.reset_recording_btn.setEnabled(True) # 这个不依赖连接状态
self.browse_audio_btn.setEnabled(connected)
self.browse_ringtone_btn.setEnabled(connected)
self.browse_answer_play_btn.setEnabled(connected)
def browse_recording_path(self):
"""浏览并选择录音存储路径"""
current_path = self.recording_path_edit.text() or os.path.expanduser("~")
dir_path = QFileDialog.getExistingDirectory(
self, "选择录音存储路径", current_path
)
if dir_path:
self.recording_path_edit.setText(dir_path)
if self.audio_features:
self.audio_features.set_storage_path(dir_path)
self.save_settings()
self.add_status_message(f"录音存储路径已设置为: {dir_path}")
def browse_ringtone_file(self):
"""浏览并选择铃声文件"""
home_dir = os.path.expanduser("~")
file_dialog = QFileDialog()
file_path, _ = file_dialog.getOpenFileName(
self, "选择铃声文件", home_dir,
"音频文件 (*.mp3 *.wav *.amr);;所有文件 (*)"
)
if file_path:
self.ringtone_file_edit.setText(file_path)
self.save_settings()
def set_ringtone(self):
"""设置铃声"""
if not self.audio_features or not self.lte_manager.is_connected():
return
ringtone_file = self.ringtone_file_edit.text()
if not ringtone_file:
QMessageBox.warning(self, "设置铃声", "请先选择铃声文件")
return
if self.audio_features.set_ringtone(ringtone_file):
QMessageBox.information(self, "设置铃声", "铃声设置成功")
else:
QMessageBox.warning(self, "设置铃声", "铃声设置失败")
def start_recording(self):
"""开始录音"""
if not self.audio_features or not self.lte_manager.is_connected():
return
record_type = self.recording_type_combo.currentIndex() + 1 # 1=本地, 2=远程, 3=混合
if self.audio_features.start_recording(record_path=record_type):
self.update_audio_controls_state()
self.add_status_message("录音已开始")
else:
QMessageBox.warning(self, "录音", "开始录音失败")
def stop_recording(self):
"""停止录音"""
if not self.audio_features or not self.lte_manager.is_connected():
return
if self.audio_features.stop_recording():
self.update_audio_controls_state()
self.add_status_message("录音已停止")
else:
QMessageBox.warning(self, "录音", "停止录音失败")
def browse_audio_file(self):
"""浏览并选择音频文件"""
home_dir = os.path.expanduser("~")
file_path, _ = QFileDialog.getOpenFileName(
self, "选择音频文件", home_dir,
"音频文件 (*.mp3 *.wav *.amr *.pcm);;所有文件 (*)"
)
if file_path:
self.audio_file_edit.setText(file_path)
def play_audio(self):
"""播放选择的音频文件"""
if not self.lte_manager.is_connected() or not self.audio_features:
QMessageBox.warning(self, "播放音频", "未连接到LTE模块或音频功能未启用")
return
audio_file = self.audio_file_edit.text()
if not audio_file:
# 如果未选择文件,提示用户
self.browse_audio_file()
audio_file = self.audio_file_edit.text()
if not audio_file:
return
play_type = self.play_type_combo.currentIndex()
success = self.audio_features.play_audio(audio_file, play_type)
if success:
self.add_status_message(f"开始播放: {os.path.basename(audio_file)}")
else:
QMessageBox.warning(self, "播放音频", "播放音频失败")
def stop_audio(self):
"""停止播放音频"""
if not self.audio_features or not self.lte_manager.is_connected():
return
if self.audio_features.stop_audio():
self.update_audio_controls_state()
self.add_status_message("音频播放已停止")
else:
QMessageBox.warning(self, "播放音频", "停止播放失败")
def on_auto_play_on_answer_changed(self, state):
"""处理接听电话自动播放音频选项变更"""
enabled = state == Qt.Checked
if self.audio_features:
# 如果启用但未设置音频文件,提示用户选择
if enabled and not self.answer_play_edit.text():
self.browse_answer_play_file()
# 如果用户取消了选择,则取消勾选
if not self.answer_play_edit.text():
self.auto_play_on_answer_cb.setChecked(False)
return
audio_file = self.answer_play_edit.text() if self.answer_play_edit.text() else None
self.audio_features.set_auto_play_on_answer(enabled, audio_file)
self.save_settings()
def browse_answer_play_file(self):
"""浏览并选择接听时要播放的音频文件"""
home_dir = os.path.expanduser("~")
file_dialog = QFileDialog()
file_path, _ = file_dialog.getOpenFileName(
self, "选择音频文件", home_dir,
"音频文件 (*.amr *.wav *.mp3 *.pcm);;所有文件 (*)"
)
if file_path:
self.answer_play_edit.setText(file_path)
# 如果音频特性实例存在,更新设置
if self.audio_features:
self.audio_features.set_auto_play_on_answer(
self.auto_play_on_answer_cb.isChecked(),
file_path
)
self.save_settings()