brisonus_app_eq/persistence/data_store_manager.py

117 lines
4.8 KiB
Python

import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
from typing import Dict, List, Optional, Any
from persistence.data_store import DataStore
class DataStoreManager:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance._store = DataStore()
return cls._instance
@property
def current_project(self) -> Optional[str]:
return self._store.current_project
@property
def current_param(self) -> Optional[str]:
return self._store.current_param
@current_param.setter
def current_param(self, param_name: str):
self._store.current_param = param_name
def create_project(self, name: str, description: str = "") -> bool:
"""创建新项目"""
return self._store.save_project(name, description)
def save_param(self, project_name: str, param_name: str,
channel_settings: Dict[int, Dict], description: str = "") -> bool:
"""保存参数配置"""
success = self._store.add_param_to_project(project_name, param_name,
channel_settings, description)
if success:
self._store.current_param = param_name
return success
def get_project(self, name: str) -> Optional[Dict]:
"""获取项目数据"""
project_data = self._store.load_project(name)
return project_data.__dict__ if project_data else None
def get_param_data(self, project_name: str, param_name: str) -> Dict:
"""获取参数数据"""
return self._store.load_param_data(project_name, param_name)
def get_projects(self) -> List[str]:
"""获取所有项目列表"""
return self._store.list_projects()
def get_params(self, project_name: str) -> List[str]:
"""获取项目的所有参数列表"""
return self._store.list_params(project_name)
def remove_project(self, name: str) -> bool:
"""删除项目"""
return self._store.delete_project(name)
def remove_param(self, project_name: str, param_name: str) -> bool:
"""删除参数"""
return self._store.delete_param(project_name, param_name)
def update_param_value(self, project_name: str, param_name: str,
parameter_path: str, new_value: Any) -> bool:
"""更新参数值"""
try:
# 加载参数数据
param_data = self._store.load_param_data(project_name, param_name)
# 解析参数路径,更新对应的值
parts = parameter_path.split('.')
if parts[0] == 'dataset' and parts[1] == 'tuning_parameters':
if parts[2] == 'mix_parameters':
# 例如: dataset.tuning_parameters.mix_parameters[0].mix_left_data
idx = int(parts[3].split('[')[1].split(']')[0])
field = parts[4]
if idx in param_data:
param_data[idx][field] = new_value
elif parts[2] == 'eq_parameters':
# 例如: dataset.tuning_parameters.eq_parameters[0].fc
idx = int(parts[3].split('[')[1].split(']')[0])
field = parts[4]
channel_id = idx // 20 # 假设每个通道最多20个滤波器
filter_idx = idx % 20
if channel_id in param_data and 'filters' in param_data[channel_id]:
filters = param_data[channel_id]['filters']
if filter_idx < len(filters):
filters[filter_idx][field] = new_value
elif parts[2] == 'delay_parameters':
# 例如: dataset.tuning_parameters.delay_parameters[0].delay_data
idx = int(parts[3].split('[')[1].split(']')[0])
field = parts[4]
if idx in param_data:
param_data[idx]['delay_data'] = new_value
elif parts[2] == 'volume_parameters':
# 例如: dataset.tuning_parameters.volume_parameters[0].vol_data
idx = int(parts[3].split('[')[1].split(']')[0])
field = parts[4]
if idx in param_data:
param_data[idx]['vol_data'] = new_value
# 保存更新后的参数数据
return self._store.add_param_to_project(project_name, param_name, param_data)
except Exception as e:
return False
@classmethod
def get_instance(cls) -> 'DataStoreManager':
"""获取 DataStoreManager 实例"""
if cls._instance is None:
cls._instance = DataStoreManager()
return cls._instance