[bugfix] 修复channel_id引起的混乱

This commit is contained in:
Sam 2025-02-24 10:54:09 +08:00
parent 59dbf276b8
commit 3f57b1461f
8 changed files with 49 additions and 34 deletions

13
app.py
View File

@ -84,11 +84,11 @@ class MainWindow(QWidget):
for i in range(channel_count): for i in range(channel_count):
# 创建widget # 创建widget
filter_widget = AudioFilterWidget() filter_widget = AudioFilterWidget()
filter_widget.set_channel_id(i) # filter_widget.set_channel_id(i)
filter_widget.set_channel_name(f"Channel {i+1}") # filter_widget.set_channel_name(f"Channel {i+1}")
# 创建model和controller # 创建model和controller
model = AudioFilterModel(channel_id=i, channel_name=f"Channel {i+1}") model = AudioFilterModel(channel_id = i, channel_name=f"Channel {i+1}")
controller = AudioFilterController(model) controller = AudioFilterController(model)
controller.set_widget(filter_widget) controller.set_widget(filter_widget)
@ -111,18 +111,17 @@ class MainWindow(QWidget):
def test_communication(self): def test_communication(self):
"""测试通信功能""" """测试通信功能"""
print("Testing communication...")
# 测试第一个控制器的通信 # 测试第一个控制器的通信
if self.filter_controllers: if self.filter_controllers:
controller = self.filter_controllers[0] controller = self.filter_controllers[0]
# 测试从服务器加载数据 # 测试从服务器加载数据
print("Testing load from server...") logger.info("load from server...")
controller.load_from_server() controller.load_from_server()
# 测试同步数据到服务器 # 测试同步数据到服务器
print("Testing sync to server...") logger.info("sync to server...")
controller.sync_to_server() controller.sync_to_server()
def Get_All(self): def Get_All(self):

View File

@ -362,7 +362,7 @@ class AudioFilterWidget(QWidget):
def set_all_params(self, params: Dict[str, Any]): def set_all_params(self, params: Dict[str, Any]):
"""设置所有参数""" """设置所有参数"""
if not self.channel_id: if self.channel_id == -1:
return return
# 设置基础参数 # 设置基础参数
@ -370,7 +370,7 @@ class AudioFilterWidget(QWidget):
vol_key = f'vol_data{self.channel_id}' vol_key = f'vol_data{self.channel_id}'
mix_right_key = f'mix_right_data{self.channel_id}' mix_right_key = f'mix_right_data{self.channel_id}'
mix_left_key = f'mix_left_data{self.channel_id}' mix_left_key = f'mix_left_data{self.channel_id}'
print(f"params:{params}") print(f"set_all_params params:{params}")
# 更新基础参数 # 更新基础参数
self._update_basic_params(params, delay_key, vol_key, mix_right_key, mix_left_key) self._update_basic_params(params, delay_key, vol_key, mix_right_key, mix_left_key)
@ -1003,6 +1003,7 @@ class AudioFilterWidget(QWidget):
finally: finally:
# 确保信号总是被重新连接,即使发生异常 # 确保信号总是被重新连接,即使发生异常
self.connect_param_signals() self.connect_param_signals()
def clear_ui_data(self): def clear_ui_data(self):
"""清空UI中的所有数据""" """清空UI中的所有数据"""

View File

@ -94,11 +94,14 @@ class AudioFilterController(QObject):
# 设置model不触发更新 # 设置model不触发更新
self.widget.model = self.model self.widget.model = self.model
# 建立信号连接 # # 建立信号连接
self._setup_widget_connections() # self._setup_widget_connections()
# 手动更新一次UI # # 手动更新一次UI
self.widget.set_all_params(self.model.to_widget_params()) # self.widget.set_all_params(self.model.to_widget_params())
# 手动更新一次UI 关于ui的更新统一封装到updateUI方法中
self.widget.updateUI()
def _setup_widget_connections(self): def _setup_widget_connections(self):
"""设置widget信号连接""" """设置widget信号连接"""
@ -117,14 +120,14 @@ class AudioFilterController(QObject):
def _convert_struct_data_to_model(self, struct_data: Dict[str, Any]) -> Dict[str, Any]: def _convert_struct_data_to_model(self, struct_data: Dict[str, Any]) -> Dict[str, Any]:
"""将结构体格式数据转换为模型数据""" """将结构体格式数据转换为模型数据"""
channel_params = ChannelParams( channel_params = ChannelParams(
delay=struct_data.get(f'tuning_parameters.delay_parameters[{self.model.channel_id-1}].delay_data', 0.0), delay=struct_data.get(f'tuning_parameters.delay_parameters[{self.model.channel_id}].delay_data', 0.0),
volume=struct_data.get(f'tuning_parameters.volume_parameters[{self.model.channel_id-1}].vol_data', 0.0), volume=struct_data.get(f'tuning_parameters.volume_parameters[{self.model.channel_id}].vol_data', 0.0),
mix_right=struct_data.get(f'tuning_parameters.mix_parameters[{self.model.channel_id-1}].mix_right_data', 0.0), mix_right=struct_data.get(f'tuning_parameters.mix_parameters[{self.model.channel_id}].mix_right_data', 0.0),
mix_left=struct_data.get(f'tuning_parameters.mix_parameters[{self.model.channel_id-1}].mix_left_data', 0.0) mix_left=struct_data.get(f'tuning_parameters.mix_parameters[{self.model.channel_id}].mix_left_data', 0.0)
) )
filters = [] filters = []
base_idx = (self.model.channel_id - 1) * 20 # 当前通道的均衡器起始索引 base_idx = (self.model.channel_id) * 20 # 当前通道的均衡器起始索引
print("channel_id:", self.model.channel_id) print("channel_id:", self.model.channel_id)
# 遍历当前通道的20个均衡器单元 # 遍历当前通道的20个均衡器单元
for i in range(20): for i in range(20):
@ -264,16 +267,18 @@ class AudioFilterController(QObject):
struct_params = self._convert_model_data_to_struct(params) struct_params = self._convert_model_data_to_struct(params)
# 基础参数批次 # 基础参数批次
channel_id = self.model.channel_id - 1 # 调整为0基索引 channel_id = self.model.channel_id # 调整为0基索引
base_params = { base_params = {
f'tuning_parameters.mix_parameters[{channel_id}].ch_n': channel_id, f'tuning_parameters.mix_parameters[{channel_id}].ch_n': channel_id + 1,
f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data': struct_params[f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data'], f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data': struct_params[f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data'],
f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data': struct_params[f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data'], f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data': struct_params[f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data'],
f'tuning_parameters.delay_parameters[{channel_id}].ch_n': channel_id, f'tuning_parameters.delay_parameters[{channel_id}].ch_n': channel_id + 1,
f'tuning_parameters.delay_parameters[{channel_id}].delay_data': struct_params[f'tuning_parameters.delay_parameters[{channel_id}].delay_data'], f'tuning_parameters.delay_parameters[{channel_id}].delay_data': struct_params[f'tuning_parameters.delay_parameters[{channel_id}].delay_data'],
f'tuning_parameters.volume_parameters[{channel_id}].ch_n': channel_id, f'tuning_parameters.volume_parameters[{channel_id}].ch_n': channel_id + 1,
f'tuning_parameters.volume_parameters[{channel_id}].vol_data': struct_params[f'tuning_parameters.volume_parameters[{channel_id}].vol_data'] f'tuning_parameters.volume_parameters[{channel_id}].vol_data': struct_params[f'tuning_parameters.volume_parameters[{channel_id}].vol_data']
} }
print("sync_to_server base_params:", base_params)
# 发送基础参数 # 发送基础参数
ServiceManager.instance().params_service.set_params(self.widget, base_params) ServiceManager.instance().params_service.set_params(self.widget, base_params)
@ -315,19 +320,20 @@ class AudioFilterController(QObject):
# 基础参数请求 - 使用实际通道ID # 基础参数请求 - 使用实际通道ID
base_params = [ base_params = [
f'tuning_parameters.mix_parameters[{channel_id-1}].ch_n', f'tuning_parameters.mix_parameters[{channel_id}].ch_n',
f'tuning_parameters.mix_parameters[{channel_id-1}].mix_left_data', f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data',
f'tuning_parameters.mix_parameters[{channel_id-1}].mix_right_data', f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data',
f'tuning_parameters.delay_parameters[{channel_id-1}].ch_n', f'tuning_parameters.delay_parameters[{channel_id}].ch_n',
f'tuning_parameters.delay_parameters[{channel_id-1}].delay_data', f'tuning_parameters.delay_parameters[{channel_id}].delay_data',
f'tuning_parameters.volume_parameters[{channel_id-1}].ch_n', f'tuning_parameters.volume_parameters[{channel_id}].ch_n',
f'tuning_parameters.volume_parameters[{channel_id-1}].vol_data' f'tuning_parameters.volume_parameters[{channel_id}].vol_data'
] ]
print("load_from_server base_params:", base_params)
# 分批请求滤波器参数 # 分批请求滤波器参数
BATCH_SIZE = 5 # 每批请求5个滤波器的参数 BATCH_SIZE = 5 # 每批请求5个滤波器的参数
base_idx = (channel_id - 1) * 20 # 修正滤波器起始索引计算通道1从0开始通道2从20开始 base_idx = (channel_id) * 20 # 修正滤波器起始索引计算通道1从0开始通道2从20开始
print(f"base_idx: {base_idx}")
def request_batch(start_idx, end_idx): def request_batch(start_idx, end_idx):
batch_params = [] batch_params = []
for i in range(start_idx, end_idx): for i in range(start_idx, end_idx):
@ -365,7 +371,7 @@ class AudioFilterController(QObject):
ServiceManager.instance().params_service.get_params( ServiceManager.instance().params_service.get_params(
self.widget, self.widget,
base_params, base_params,
callback=lambda r: all_responses.update(r.data) callback = lambda r: all_responses.update(r.data)
) )
# 发送分批的滤波器参数请求 # 发送分批的滤波器参数请求
@ -375,7 +381,7 @@ class AudioFilterController(QObject):
ServiceManager.instance().params_service.get_params( ServiceManager.instance().params_service.get_params(
self.widget, self.widget,
batch_params, batch_params,
callback=batch_callback callback = batch_callback
) )
except Exception as e: except Exception as e:
@ -634,7 +640,7 @@ def main():
app = QApplication(sys.argv) app = QApplication(sys.argv)
# 创建控制器和相关组件 # 创建控制器和相关组件
model = AudioFilterModel(channel_id=1, channel_name="测试通道") model = AudioFilterModel(channel_id=0, channel_name="测试通道")
controller = AudioFilterController(model) controller = AudioFilterController(model)
widget = AudioFilterWidget() widget = AudioFilterWidget()
controller.set_widget(widget) controller.set_widget(widget)

View File

@ -115,8 +115,11 @@ class AudioFilterModel(QObject):
"""转换为AudioFilterWidget兼容的参数格式""" """转换为AudioFilterWidget兼容的参数格式"""
print(f"self.channel_params:{self.channel_params}") print(f"self.channel_params:{self.channel_params}")
params = self.channel_params.to_dict(self.channel_id) params = self.channel_params.to_dict(self.channel_id)
print(f"filters:{self.filters}")
for i, filter_param in enumerate(self.filters, 1): for i, filter_param in enumerate(self.filters, 1):
params.update(filter_param.to_dict(self.channel_id, i)) params.update(filter_param.to_dict(self.channel_id, i))
print(f"params:{params}")
return params return params

View File

@ -0,0 +1,6 @@
关于最近一次需要重构记录:
1.关于数据的操作全部移入model中controller中只保留对model的调用
2.关于ui的更新统一封装到updateUI方法中在controller中调用
3.关于信号的连接统一封装到setup_connections方法中在controller中调用
4.所有可以互斥的操作都需要成对出现逻辑上也必须完整。set/get
5.