[bugfix] 调整数据存储结构

This commit is contained in:
Sam 2025-02-25 20:37:41 +08:00
parent 10bc056c39
commit ebbe9c24fa
10 changed files with 1181 additions and 21 deletions

4
app.py
View File

@ -11,8 +11,8 @@ from component.widget_filter.audio_filter_model import AudioFilterModel
from component.widget_filter.audio_filter_controller import AudioFilterController from component.widget_filter.audio_filter_controller import AudioFilterController
from component.widget_card.widget_card import ParamData from component.widget_card.widget_card import ParamData
from component.widget_log.widget_log import Widget_Log from component.widget_log.widget_log import Widget_Log
from persistence.data_store_manager import DataStoreManager from persistence.data_store_manager_origin import DataStoreManager
from persistence.data_store import DataStore from persistence.data_store_origin import DataStore
from param_struct_test.service_manager import ServiceManager from param_struct_test.service_manager import ServiceManager
from application.application_controller import ApplicationController from application.application_controller import ApplicationController
from param_struct_test.params_service import Response from param_struct_test.params_service import Response

644
doc/struct_params.txt Normal file
View File

@ -0,0 +1,644 @@
dataset.audio_mode: offset 0 (int32_t)
dataset.send_action: offset 4 (int32_t)
dataset.tuning_parameters.mix_parameters[0].ch_n: offset 8 (int32_t)
dataset.tuning_parameters.mix_parameters[1].ch_n: offset 20 (int32_t)
dataset.tuning_parameters.mix_parameters[2].ch_n: offset 32 (int32_t)
dataset.tuning_parameters.mix_parameters[3].ch_n: offset 44 (int32_t)
dataset.tuning_parameters.mix_parameters[4].ch_n: offset 56 (int32_t)
dataset.tuning_parameters.mix_parameters[5].ch_n: offset 68 (int32_t)
dataset.tuning_parameters.mix_parameters[0].mix_left_data: offset 12 (float)
dataset.tuning_parameters.mix_parameters[1].mix_left_data: offset 24 (float)
dataset.tuning_parameters.mix_parameters[2].mix_left_data: offset 36 (float)
dataset.tuning_parameters.mix_parameters[3].mix_left_data: offset 48 (float)
dataset.tuning_parameters.mix_parameters[4].mix_left_data: offset 60 (float)
dataset.tuning_parameters.mix_parameters[5].mix_left_data: offset 72 (float)
dataset.tuning_parameters.mix_parameters[0].mix_right_data: offset 16 (float)
dataset.tuning_parameters.mix_parameters[1].mix_right_data: offset 28 (float)
dataset.tuning_parameters.mix_parameters[2].mix_right_data: offset 40 (float)
dataset.tuning_parameters.mix_parameters[3].mix_right_data: offset 52 (float)
dataset.tuning_parameters.mix_parameters[4].mix_right_data: offset 64 (float)
dataset.tuning_parameters.mix_parameters[5].mix_right_data: offset 76 (float)
dataset.tuning_parameters.eq_parameters[0].fc: offset 80 (float)
dataset.tuning_parameters.eq_parameters[1].fc: offset 100 (float)
dataset.tuning_parameters.eq_parameters[2].fc: offset 120 (float)
dataset.tuning_parameters.eq_parameters[3].fc: offset 140 (float)
dataset.tuning_parameters.eq_parameters[4].fc: offset 160 (float)
dataset.tuning_parameters.eq_parameters[5].fc: offset 180 (float)
dataset.tuning_parameters.eq_parameters[6].fc: offset 200 (float)
dataset.tuning_parameters.eq_parameters[7].fc: offset 220 (float)
dataset.tuning_parameters.eq_parameters[8].fc: offset 240 (float)
dataset.tuning_parameters.eq_parameters[9].fc: offset 260 (float)
dataset.tuning_parameters.eq_parameters[10].fc: offset 280 (float)
dataset.tuning_parameters.eq_parameters[11].fc: offset 300 (float)
dataset.tuning_parameters.eq_parameters[12].fc: offset 320 (float)
dataset.tuning_parameters.eq_parameters[13].fc: offset 340 (float)
dataset.tuning_parameters.eq_parameters[14].fc: offset 360 (float)
dataset.tuning_parameters.eq_parameters[15].fc: offset 380 (float)
dataset.tuning_parameters.eq_parameters[16].fc: offset 400 (float)
dataset.tuning_parameters.eq_parameters[17].fc: offset 420 (float)
dataset.tuning_parameters.eq_parameters[18].fc: offset 440 (float)
dataset.tuning_parameters.eq_parameters[19].fc: offset 460 (float)
dataset.tuning_parameters.eq_parameters[20].fc: offset 480 (float)
dataset.tuning_parameters.eq_parameters[21].fc: offset 500 (float)
dataset.tuning_parameters.eq_parameters[22].fc: offset 520 (float)
dataset.tuning_parameters.eq_parameters[23].fc: offset 540 (float)
dataset.tuning_parameters.eq_parameters[24].fc: offset 560 (float)
dataset.tuning_parameters.eq_parameters[25].fc: offset 580 (float)
dataset.tuning_parameters.eq_parameters[26].fc: offset 600 (float)
dataset.tuning_parameters.eq_parameters[27].fc: offset 620 (float)
dataset.tuning_parameters.eq_parameters[28].fc: offset 640 (float)
dataset.tuning_parameters.eq_parameters[29].fc: offset 660 (float)
dataset.tuning_parameters.eq_parameters[30].fc: offset 680 (float)
dataset.tuning_parameters.eq_parameters[31].fc: offset 700 (float)
dataset.tuning_parameters.eq_parameters[32].fc: offset 720 (float)
dataset.tuning_parameters.eq_parameters[33].fc: offset 740 (float)
dataset.tuning_parameters.eq_parameters[34].fc: offset 760 (float)
dataset.tuning_parameters.eq_parameters[35].fc: offset 780 (float)
dataset.tuning_parameters.eq_parameters[36].fc: offset 800 (float)
dataset.tuning_parameters.eq_parameters[37].fc: offset 820 (float)
dataset.tuning_parameters.eq_parameters[38].fc: offset 840 (float)
dataset.tuning_parameters.eq_parameters[39].fc: offset 860 (float)
dataset.tuning_parameters.eq_parameters[40].fc: offset 880 (float)
dataset.tuning_parameters.eq_parameters[41].fc: offset 900 (float)
dataset.tuning_parameters.eq_parameters[42].fc: offset 920 (float)
dataset.tuning_parameters.eq_parameters[43].fc: offset 940 (float)
dataset.tuning_parameters.eq_parameters[44].fc: offset 960 (float)
dataset.tuning_parameters.eq_parameters[45].fc: offset 980 (float)
dataset.tuning_parameters.eq_parameters[46].fc: offset 1000 (float)
dataset.tuning_parameters.eq_parameters[47].fc: offset 1020 (float)
dataset.tuning_parameters.eq_parameters[48].fc: offset 1040 (float)
dataset.tuning_parameters.eq_parameters[49].fc: offset 1060 (float)
dataset.tuning_parameters.eq_parameters[50].fc: offset 1080 (float)
dataset.tuning_parameters.eq_parameters[51].fc: offset 1100 (float)
dataset.tuning_parameters.eq_parameters[52].fc: offset 1120 (float)
dataset.tuning_parameters.eq_parameters[53].fc: offset 1140 (float)
dataset.tuning_parameters.eq_parameters[54].fc: offset 1160 (float)
dataset.tuning_parameters.eq_parameters[55].fc: offset 1180 (float)
dataset.tuning_parameters.eq_parameters[56].fc: offset 1200 (float)
dataset.tuning_parameters.eq_parameters[57].fc: offset 1220 (float)
dataset.tuning_parameters.eq_parameters[58].fc: offset 1240 (float)
dataset.tuning_parameters.eq_parameters[59].fc: offset 1260 (float)
dataset.tuning_parameters.eq_parameters[60].fc: offset 1280 (float)
dataset.tuning_parameters.eq_parameters[61].fc: offset 1300 (float)
dataset.tuning_parameters.eq_parameters[62].fc: offset 1320 (float)
dataset.tuning_parameters.eq_parameters[63].fc: offset 1340 (float)
dataset.tuning_parameters.eq_parameters[64].fc: offset 1360 (float)
dataset.tuning_parameters.eq_parameters[65].fc: offset 1380 (float)
dataset.tuning_parameters.eq_parameters[66].fc: offset 1400 (float)
dataset.tuning_parameters.eq_parameters[67].fc: offset 1420 (float)
dataset.tuning_parameters.eq_parameters[68].fc: offset 1440 (float)
dataset.tuning_parameters.eq_parameters[69].fc: offset 1460 (float)
dataset.tuning_parameters.eq_parameters[70].fc: offset 1480 (float)
dataset.tuning_parameters.eq_parameters[71].fc: offset 1500 (float)
dataset.tuning_parameters.eq_parameters[72].fc: offset 1520 (float)
dataset.tuning_parameters.eq_parameters[73].fc: offset 1540 (float)
dataset.tuning_parameters.eq_parameters[74].fc: offset 1560 (float)
dataset.tuning_parameters.eq_parameters[75].fc: offset 1580 (float)
dataset.tuning_parameters.eq_parameters[76].fc: offset 1600 (float)
dataset.tuning_parameters.eq_parameters[77].fc: offset 1620 (float)
dataset.tuning_parameters.eq_parameters[78].fc: offset 1640 (float)
dataset.tuning_parameters.eq_parameters[79].fc: offset 1660 (float)
dataset.tuning_parameters.eq_parameters[80].fc: offset 1680 (float)
dataset.tuning_parameters.eq_parameters[81].fc: offset 1700 (float)
dataset.tuning_parameters.eq_parameters[82].fc: offset 1720 (float)
dataset.tuning_parameters.eq_parameters[83].fc: offset 1740 (float)
dataset.tuning_parameters.eq_parameters[84].fc: offset 1760 (float)
dataset.tuning_parameters.eq_parameters[85].fc: offset 1780 (float)
dataset.tuning_parameters.eq_parameters[86].fc: offset 1800 (float)
dataset.tuning_parameters.eq_parameters[87].fc: offset 1820 (float)
dataset.tuning_parameters.eq_parameters[88].fc: offset 1840 (float)
dataset.tuning_parameters.eq_parameters[89].fc: offset 1860 (float)
dataset.tuning_parameters.eq_parameters[90].fc: offset 1880 (float)
dataset.tuning_parameters.eq_parameters[91].fc: offset 1900 (float)
dataset.tuning_parameters.eq_parameters[92].fc: offset 1920 (float)
dataset.tuning_parameters.eq_parameters[93].fc: offset 1940 (float)
dataset.tuning_parameters.eq_parameters[94].fc: offset 1960 (float)
dataset.tuning_parameters.eq_parameters[95].fc: offset 1980 (float)
dataset.tuning_parameters.eq_parameters[96].fc: offset 2000 (float)
dataset.tuning_parameters.eq_parameters[97].fc: offset 2020 (float)
dataset.tuning_parameters.eq_parameters[98].fc: offset 2040 (float)
dataset.tuning_parameters.eq_parameters[99].fc: offset 2060 (float)
dataset.tuning_parameters.eq_parameters[100].fc: offset 2080 (float)
dataset.tuning_parameters.eq_parameters[101].fc: offset 2100 (float)
dataset.tuning_parameters.eq_parameters[102].fc: offset 2120 (float)
dataset.tuning_parameters.eq_parameters[103].fc: offset 2140 (float)
dataset.tuning_parameters.eq_parameters[104].fc: offset 2160 (float)
dataset.tuning_parameters.eq_parameters[105].fc: offset 2180 (float)
dataset.tuning_parameters.eq_parameters[106].fc: offset 2200 (float)
dataset.tuning_parameters.eq_parameters[107].fc: offset 2220 (float)
dataset.tuning_parameters.eq_parameters[108].fc: offset 2240 (float)
dataset.tuning_parameters.eq_parameters[109].fc: offset 2260 (float)
dataset.tuning_parameters.eq_parameters[110].fc: offset 2280 (float)
dataset.tuning_parameters.eq_parameters[111].fc: offset 2300 (float)
dataset.tuning_parameters.eq_parameters[112].fc: offset 2320 (float)
dataset.tuning_parameters.eq_parameters[113].fc: offset 2340 (float)
dataset.tuning_parameters.eq_parameters[114].fc: offset 2360 (float)
dataset.tuning_parameters.eq_parameters[115].fc: offset 2380 (float)
dataset.tuning_parameters.eq_parameters[116].fc: offset 2400 (float)
dataset.tuning_parameters.eq_parameters[117].fc: offset 2420 (float)
dataset.tuning_parameters.eq_parameters[118].fc: offset 2440 (float)
dataset.tuning_parameters.eq_parameters[119].fc: offset 2460 (float)
dataset.tuning_parameters.eq_parameters[0].q: offset 84 (float)
dataset.tuning_parameters.eq_parameters[1].q: offset 104 (float)
dataset.tuning_parameters.eq_parameters[2].q: offset 124 (float)
dataset.tuning_parameters.eq_parameters[3].q: offset 144 (float)
dataset.tuning_parameters.eq_parameters[4].q: offset 164 (float)
dataset.tuning_parameters.eq_parameters[5].q: offset 184 (float)
dataset.tuning_parameters.eq_parameters[6].q: offset 204 (float)
dataset.tuning_parameters.eq_parameters[7].q: offset 224 (float)
dataset.tuning_parameters.eq_parameters[8].q: offset 244 (float)
dataset.tuning_parameters.eq_parameters[9].q: offset 264 (float)
dataset.tuning_parameters.eq_parameters[10].q: offset 284 (float)
dataset.tuning_parameters.eq_parameters[11].q: offset 304 (float)
dataset.tuning_parameters.eq_parameters[12].q: offset 324 (float)
dataset.tuning_parameters.eq_parameters[13].q: offset 344 (float)
dataset.tuning_parameters.eq_parameters[14].q: offset 364 (float)
dataset.tuning_parameters.eq_parameters[15].q: offset 384 (float)
dataset.tuning_parameters.eq_parameters[16].q: offset 404 (float)
dataset.tuning_parameters.eq_parameters[17].q: offset 424 (float)
dataset.tuning_parameters.eq_parameters[18].q: offset 444 (float)
dataset.tuning_parameters.eq_parameters[19].q: offset 464 (float)
dataset.tuning_parameters.eq_parameters[20].q: offset 484 (float)
dataset.tuning_parameters.eq_parameters[21].q: offset 504 (float)
dataset.tuning_parameters.eq_parameters[22].q: offset 524 (float)
dataset.tuning_parameters.eq_parameters[23].q: offset 544 (float)
dataset.tuning_parameters.eq_parameters[24].q: offset 564 (float)
dataset.tuning_parameters.eq_parameters[25].q: offset 584 (float)
dataset.tuning_parameters.eq_parameters[26].q: offset 604 (float)
dataset.tuning_parameters.eq_parameters[27].q: offset 624 (float)
dataset.tuning_parameters.eq_parameters[28].q: offset 644 (float)
dataset.tuning_parameters.eq_parameters[29].q: offset 664 (float)
dataset.tuning_parameters.eq_parameters[30].q: offset 684 (float)
dataset.tuning_parameters.eq_parameters[31].q: offset 704 (float)
dataset.tuning_parameters.eq_parameters[32].q: offset 724 (float)
dataset.tuning_parameters.eq_parameters[33].q: offset 744 (float)
dataset.tuning_parameters.eq_parameters[34].q: offset 764 (float)
dataset.tuning_parameters.eq_parameters[35].q: offset 784 (float)
dataset.tuning_parameters.eq_parameters[36].q: offset 804 (float)
dataset.tuning_parameters.eq_parameters[37].q: offset 824 (float)
dataset.tuning_parameters.eq_parameters[38].q: offset 844 (float)
dataset.tuning_parameters.eq_parameters[39].q: offset 864 (float)
dataset.tuning_parameters.eq_parameters[40].q: offset 884 (float)
dataset.tuning_parameters.eq_parameters[41].q: offset 904 (float)
dataset.tuning_parameters.eq_parameters[42].q: offset 924 (float)
dataset.tuning_parameters.eq_parameters[43].q: offset 944 (float)
dataset.tuning_parameters.eq_parameters[44].q: offset 964 (float)
dataset.tuning_parameters.eq_parameters[45].q: offset 984 (float)
dataset.tuning_parameters.eq_parameters[46].q: offset 1004 (float)
dataset.tuning_parameters.eq_parameters[47].q: offset 1024 (float)
dataset.tuning_parameters.eq_parameters[48].q: offset 1044 (float)
dataset.tuning_parameters.eq_parameters[49].q: offset 1064 (float)
dataset.tuning_parameters.eq_parameters[50].q: offset 1084 (float)
dataset.tuning_parameters.eq_parameters[51].q: offset 1104 (float)
dataset.tuning_parameters.eq_parameters[52].q: offset 1124 (float)
dataset.tuning_parameters.eq_parameters[53].q: offset 1144 (float)
dataset.tuning_parameters.eq_parameters[54].q: offset 1164 (float)
dataset.tuning_parameters.eq_parameters[55].q: offset 1184 (float)
dataset.tuning_parameters.eq_parameters[56].q: offset 1204 (float)
dataset.tuning_parameters.eq_parameters[57].q: offset 1224 (float)
dataset.tuning_parameters.eq_parameters[58].q: offset 1244 (float)
dataset.tuning_parameters.eq_parameters[59].q: offset 1264 (float)
dataset.tuning_parameters.eq_parameters[60].q: offset 1284 (float)
dataset.tuning_parameters.eq_parameters[61].q: offset 1304 (float)
dataset.tuning_parameters.eq_parameters[62].q: offset 1324 (float)
dataset.tuning_parameters.eq_parameters[63].q: offset 1344 (float)
dataset.tuning_parameters.eq_parameters[64].q: offset 1364 (float)
dataset.tuning_parameters.eq_parameters[65].q: offset 1384 (float)
dataset.tuning_parameters.eq_parameters[66].q: offset 1404 (float)
dataset.tuning_parameters.eq_parameters[67].q: offset 1424 (float)
dataset.tuning_parameters.eq_parameters[68].q: offset 1444 (float)
dataset.tuning_parameters.eq_parameters[69].q: offset 1464 (float)
dataset.tuning_parameters.eq_parameters[70].q: offset 1484 (float)
dataset.tuning_parameters.eq_parameters[71].q: offset 1504 (float)
dataset.tuning_parameters.eq_parameters[72].q: offset 1524 (float)
dataset.tuning_parameters.eq_parameters[73].q: offset 1544 (float)
dataset.tuning_parameters.eq_parameters[74].q: offset 1564 (float)
dataset.tuning_parameters.eq_parameters[75].q: offset 1584 (float)
dataset.tuning_parameters.eq_parameters[76].q: offset 1604 (float)
dataset.tuning_parameters.eq_parameters[77].q: offset 1624 (float)
dataset.tuning_parameters.eq_parameters[78].q: offset 1644 (float)
dataset.tuning_parameters.eq_parameters[79].q: offset 1664 (float)
dataset.tuning_parameters.eq_parameters[80].q: offset 1684 (float)
dataset.tuning_parameters.eq_parameters[81].q: offset 1704 (float)
dataset.tuning_parameters.eq_parameters[82].q: offset 1724 (float)
dataset.tuning_parameters.eq_parameters[83].q: offset 1744 (float)
dataset.tuning_parameters.eq_parameters[84].q: offset 1764 (float)
dataset.tuning_parameters.eq_parameters[85].q: offset 1784 (float)
dataset.tuning_parameters.eq_parameters[86].q: offset 1804 (float)
dataset.tuning_parameters.eq_parameters[87].q: offset 1824 (float)
dataset.tuning_parameters.eq_parameters[88].q: offset 1844 (float)
dataset.tuning_parameters.eq_parameters[89].q: offset 1864 (float)
dataset.tuning_parameters.eq_parameters[90].q: offset 1884 (float)
dataset.tuning_parameters.eq_parameters[91].q: offset 1904 (float)
dataset.tuning_parameters.eq_parameters[92].q: offset 1924 (float)
dataset.tuning_parameters.eq_parameters[93].q: offset 1944 (float)
dataset.tuning_parameters.eq_parameters[94].q: offset 1964 (float)
dataset.tuning_parameters.eq_parameters[95].q: offset 1984 (float)
dataset.tuning_parameters.eq_parameters[96].q: offset 2004 (float)
dataset.tuning_parameters.eq_parameters[97].q: offset 2024 (float)
dataset.tuning_parameters.eq_parameters[98].q: offset 2044 (float)
dataset.tuning_parameters.eq_parameters[99].q: offset 2064 (float)
dataset.tuning_parameters.eq_parameters[100].q: offset 2084 (float)
dataset.tuning_parameters.eq_parameters[101].q: offset 2104 (float)
dataset.tuning_parameters.eq_parameters[102].q: offset 2124 (float)
dataset.tuning_parameters.eq_parameters[103].q: offset 2144 (float)
dataset.tuning_parameters.eq_parameters[104].q: offset 2164 (float)
dataset.tuning_parameters.eq_parameters[105].q: offset 2184 (float)
dataset.tuning_parameters.eq_parameters[106].q: offset 2204 (float)
dataset.tuning_parameters.eq_parameters[107].q: offset 2224 (float)
dataset.tuning_parameters.eq_parameters[108].q: offset 2244 (float)
dataset.tuning_parameters.eq_parameters[109].q: offset 2264 (float)
dataset.tuning_parameters.eq_parameters[110].q: offset 2284 (float)
dataset.tuning_parameters.eq_parameters[111].q: offset 2304 (float)
dataset.tuning_parameters.eq_parameters[112].q: offset 2324 (float)
dataset.tuning_parameters.eq_parameters[113].q: offset 2344 (float)
dataset.tuning_parameters.eq_parameters[114].q: offset 2364 (float)
dataset.tuning_parameters.eq_parameters[115].q: offset 2384 (float)
dataset.tuning_parameters.eq_parameters[116].q: offset 2404 (float)
dataset.tuning_parameters.eq_parameters[117].q: offset 2424 (float)
dataset.tuning_parameters.eq_parameters[118].q: offset 2444 (float)
dataset.tuning_parameters.eq_parameters[119].q: offset 2464 (float)
dataset.tuning_parameters.eq_parameters[0].gain: offset 88 (float)
dataset.tuning_parameters.eq_parameters[1].gain: offset 108 (float)
dataset.tuning_parameters.eq_parameters[2].gain: offset 128 (float)
dataset.tuning_parameters.eq_parameters[3].gain: offset 148 (float)
dataset.tuning_parameters.eq_parameters[4].gain: offset 168 (float)
dataset.tuning_parameters.eq_parameters[5].gain: offset 188 (float)
dataset.tuning_parameters.eq_parameters[6].gain: offset 208 (float)
dataset.tuning_parameters.eq_parameters[7].gain: offset 228 (float)
dataset.tuning_parameters.eq_parameters[8].gain: offset 248 (float)
dataset.tuning_parameters.eq_parameters[9].gain: offset 268 (float)
dataset.tuning_parameters.eq_parameters[10].gain: offset 288 (float)
dataset.tuning_parameters.eq_parameters[11].gain: offset 308 (float)
dataset.tuning_parameters.eq_parameters[12].gain: offset 328 (float)
dataset.tuning_parameters.eq_parameters[13].gain: offset 348 (float)
dataset.tuning_parameters.eq_parameters[14].gain: offset 368 (float)
dataset.tuning_parameters.eq_parameters[15].gain: offset 388 (float)
dataset.tuning_parameters.eq_parameters[16].gain: offset 408 (float)
dataset.tuning_parameters.eq_parameters[17].gain: offset 428 (float)
dataset.tuning_parameters.eq_parameters[18].gain: offset 448 (float)
dataset.tuning_parameters.eq_parameters[19].gain: offset 468 (float)
dataset.tuning_parameters.eq_parameters[20].gain: offset 488 (float)
dataset.tuning_parameters.eq_parameters[21].gain: offset 508 (float)
dataset.tuning_parameters.eq_parameters[22].gain: offset 528 (float)
dataset.tuning_parameters.eq_parameters[23].gain: offset 548 (float)
dataset.tuning_parameters.eq_parameters[24].gain: offset 568 (float)
dataset.tuning_parameters.eq_parameters[25].gain: offset 588 (float)
dataset.tuning_parameters.eq_parameters[26].gain: offset 608 (float)
dataset.tuning_parameters.eq_parameters[27].gain: offset 628 (float)
dataset.tuning_parameters.eq_parameters[28].gain: offset 648 (float)
dataset.tuning_parameters.eq_parameters[29].gain: offset 668 (float)
dataset.tuning_parameters.eq_parameters[30].gain: offset 688 (float)
dataset.tuning_parameters.eq_parameters[31].gain: offset 708 (float)
dataset.tuning_parameters.eq_parameters[32].gain: offset 728 (float)
dataset.tuning_parameters.eq_parameters[33].gain: offset 748 (float)
dataset.tuning_parameters.eq_parameters[34].gain: offset 768 (float)
dataset.tuning_parameters.eq_parameters[35].gain: offset 788 (float)
dataset.tuning_parameters.eq_parameters[36].gain: offset 808 (float)
dataset.tuning_parameters.eq_parameters[37].gain: offset 828 (float)
dataset.tuning_parameters.eq_parameters[38].gain: offset 848 (float)
dataset.tuning_parameters.eq_parameters[39].gain: offset 868 (float)
dataset.tuning_parameters.eq_parameters[40].gain: offset 888 (float)
dataset.tuning_parameters.eq_parameters[41].gain: offset 908 (float)
dataset.tuning_parameters.eq_parameters[42].gain: offset 928 (float)
dataset.tuning_parameters.eq_parameters[43].gain: offset 948 (float)
dataset.tuning_parameters.eq_parameters[44].gain: offset 968 (float)
dataset.tuning_parameters.eq_parameters[45].gain: offset 988 (float)
dataset.tuning_parameters.eq_parameters[46].gain: offset 1008 (float)
dataset.tuning_parameters.eq_parameters[47].gain: offset 1028 (float)
dataset.tuning_parameters.eq_parameters[48].gain: offset 1048 (float)
dataset.tuning_parameters.eq_parameters[49].gain: offset 1068 (float)
dataset.tuning_parameters.eq_parameters[50].gain: offset 1088 (float)
dataset.tuning_parameters.eq_parameters[51].gain: offset 1108 (float)
dataset.tuning_parameters.eq_parameters[52].gain: offset 1128 (float)
dataset.tuning_parameters.eq_parameters[53].gain: offset 1148 (float)
dataset.tuning_parameters.eq_parameters[54].gain: offset 1168 (float)
dataset.tuning_parameters.eq_parameters[55].gain: offset 1188 (float)
dataset.tuning_parameters.eq_parameters[56].gain: offset 1208 (float)
dataset.tuning_parameters.eq_parameters[57].gain: offset 1228 (float)
dataset.tuning_parameters.eq_parameters[58].gain: offset 1248 (float)
dataset.tuning_parameters.eq_parameters[59].gain: offset 1268 (float)
dataset.tuning_parameters.eq_parameters[60].gain: offset 1288 (float)
dataset.tuning_parameters.eq_parameters[61].gain: offset 1308 (float)
dataset.tuning_parameters.eq_parameters[62].gain: offset 1328 (float)
dataset.tuning_parameters.eq_parameters[63].gain: offset 1348 (float)
dataset.tuning_parameters.eq_parameters[64].gain: offset 1368 (float)
dataset.tuning_parameters.eq_parameters[65].gain: offset 1388 (float)
dataset.tuning_parameters.eq_parameters[66].gain: offset 1408 (float)
dataset.tuning_parameters.eq_parameters[67].gain: offset 1428 (float)
dataset.tuning_parameters.eq_parameters[68].gain: offset 1448 (float)
dataset.tuning_parameters.eq_parameters[69].gain: offset 1468 (float)
dataset.tuning_parameters.eq_parameters[70].gain: offset 1488 (float)
dataset.tuning_parameters.eq_parameters[71].gain: offset 1508 (float)
dataset.tuning_parameters.eq_parameters[72].gain: offset 1528 (float)
dataset.tuning_parameters.eq_parameters[73].gain: offset 1548 (float)
dataset.tuning_parameters.eq_parameters[74].gain: offset 1568 (float)
dataset.tuning_parameters.eq_parameters[75].gain: offset 1588 (float)
dataset.tuning_parameters.eq_parameters[76].gain: offset 1608 (float)
dataset.tuning_parameters.eq_parameters[77].gain: offset 1628 (float)
dataset.tuning_parameters.eq_parameters[78].gain: offset 1648 (float)
dataset.tuning_parameters.eq_parameters[79].gain: offset 1668 (float)
dataset.tuning_parameters.eq_parameters[80].gain: offset 1688 (float)
dataset.tuning_parameters.eq_parameters[81].gain: offset 1708 (float)
dataset.tuning_parameters.eq_parameters[82].gain: offset 1728 (float)
dataset.tuning_parameters.eq_parameters[83].gain: offset 1748 (float)
dataset.tuning_parameters.eq_parameters[84].gain: offset 1768 (float)
dataset.tuning_parameters.eq_parameters[85].gain: offset 1788 (float)
dataset.tuning_parameters.eq_parameters[86].gain: offset 1808 (float)
dataset.tuning_parameters.eq_parameters[87].gain: offset 1828 (float)
dataset.tuning_parameters.eq_parameters[88].gain: offset 1848 (float)
dataset.tuning_parameters.eq_parameters[89].gain: offset 1868 (float)
dataset.tuning_parameters.eq_parameters[90].gain: offset 1888 (float)
dataset.tuning_parameters.eq_parameters[91].gain: offset 1908 (float)
dataset.tuning_parameters.eq_parameters[92].gain: offset 1928 (float)
dataset.tuning_parameters.eq_parameters[93].gain: offset 1948 (float)
dataset.tuning_parameters.eq_parameters[94].gain: offset 1968 (float)
dataset.tuning_parameters.eq_parameters[95].gain: offset 1988 (float)
dataset.tuning_parameters.eq_parameters[96].gain: offset 2008 (float)
dataset.tuning_parameters.eq_parameters[97].gain: offset 2028 (float)
dataset.tuning_parameters.eq_parameters[98].gain: offset 2048 (float)
dataset.tuning_parameters.eq_parameters[99].gain: offset 2068 (float)
dataset.tuning_parameters.eq_parameters[100].gain: offset 2088 (float)
dataset.tuning_parameters.eq_parameters[101].gain: offset 2108 (float)
dataset.tuning_parameters.eq_parameters[102].gain: offset 2128 (float)
dataset.tuning_parameters.eq_parameters[103].gain: offset 2148 (float)
dataset.tuning_parameters.eq_parameters[104].gain: offset 2168 (float)
dataset.tuning_parameters.eq_parameters[105].gain: offset 2188 (float)
dataset.tuning_parameters.eq_parameters[106].gain: offset 2208 (float)
dataset.tuning_parameters.eq_parameters[107].gain: offset 2228 (float)
dataset.tuning_parameters.eq_parameters[108].gain: offset 2248 (float)
dataset.tuning_parameters.eq_parameters[109].gain: offset 2268 (float)
dataset.tuning_parameters.eq_parameters[110].gain: offset 2288 (float)
dataset.tuning_parameters.eq_parameters[111].gain: offset 2308 (float)
dataset.tuning_parameters.eq_parameters[112].gain: offset 2328 (float)
dataset.tuning_parameters.eq_parameters[113].gain: offset 2348 (float)
dataset.tuning_parameters.eq_parameters[114].gain: offset 2368 (float)
dataset.tuning_parameters.eq_parameters[115].gain: offset 2388 (float)
dataset.tuning_parameters.eq_parameters[116].gain: offset 2408 (float)
dataset.tuning_parameters.eq_parameters[117].gain: offset 2428 (float)
dataset.tuning_parameters.eq_parameters[118].gain: offset 2448 (float)
dataset.tuning_parameters.eq_parameters[119].gain: offset 2468 (float)
dataset.tuning_parameters.eq_parameters[0].slope: offset 92 (int32_t)
dataset.tuning_parameters.eq_parameters[1].slope: offset 112 (int32_t)
dataset.tuning_parameters.eq_parameters[2].slope: offset 132 (int32_t)
dataset.tuning_parameters.eq_parameters[3].slope: offset 152 (int32_t)
dataset.tuning_parameters.eq_parameters[4].slope: offset 172 (int32_t)
dataset.tuning_parameters.eq_parameters[5].slope: offset 192 (int32_t)
dataset.tuning_parameters.eq_parameters[6].slope: offset 212 (int32_t)
dataset.tuning_parameters.eq_parameters[7].slope: offset 232 (int32_t)
dataset.tuning_parameters.eq_parameters[8].slope: offset 252 (int32_t)
dataset.tuning_parameters.eq_parameters[9].slope: offset 272 (int32_t)
dataset.tuning_parameters.eq_parameters[10].slope: offset 292 (int32_t)
dataset.tuning_parameters.eq_parameters[11].slope: offset 312 (int32_t)
dataset.tuning_parameters.eq_parameters[12].slope: offset 332 (int32_t)
dataset.tuning_parameters.eq_parameters[13].slope: offset 352 (int32_t)
dataset.tuning_parameters.eq_parameters[14].slope: offset 372 (int32_t)
dataset.tuning_parameters.eq_parameters[15].slope: offset 392 (int32_t)
dataset.tuning_parameters.eq_parameters[16].slope: offset 412 (int32_t)
dataset.tuning_parameters.eq_parameters[17].slope: offset 432 (int32_t)
dataset.tuning_parameters.eq_parameters[18].slope: offset 452 (int32_t)
dataset.tuning_parameters.eq_parameters[19].slope: offset 472 (int32_t)
dataset.tuning_parameters.eq_parameters[20].slope: offset 492 (int32_t)
dataset.tuning_parameters.eq_parameters[21].slope: offset 512 (int32_t)
dataset.tuning_parameters.eq_parameters[22].slope: offset 532 (int32_t)
dataset.tuning_parameters.eq_parameters[23].slope: offset 552 (int32_t)
dataset.tuning_parameters.eq_parameters[24].slope: offset 572 (int32_t)
dataset.tuning_parameters.eq_parameters[25].slope: offset 592 (int32_t)
dataset.tuning_parameters.eq_parameters[26].slope: offset 612 (int32_t)
dataset.tuning_parameters.eq_parameters[27].slope: offset 632 (int32_t)
dataset.tuning_parameters.eq_parameters[28].slope: offset 652 (int32_t)
dataset.tuning_parameters.eq_parameters[29].slope: offset 672 (int32_t)
dataset.tuning_parameters.eq_parameters[30].slope: offset 692 (int32_t)
dataset.tuning_parameters.eq_parameters[31].slope: offset 712 (int32_t)
dataset.tuning_parameters.eq_parameters[32].slope: offset 732 (int32_t)
dataset.tuning_parameters.eq_parameters[33].slope: offset 752 (int32_t)
dataset.tuning_parameters.eq_parameters[34].slope: offset 772 (int32_t)
dataset.tuning_parameters.eq_parameters[35].slope: offset 792 (int32_t)
dataset.tuning_parameters.eq_parameters[36].slope: offset 812 (int32_t)
dataset.tuning_parameters.eq_parameters[37].slope: offset 832 (int32_t)
dataset.tuning_parameters.eq_parameters[38].slope: offset 852 (int32_t)
dataset.tuning_parameters.eq_parameters[39].slope: offset 872 (int32_t)
dataset.tuning_parameters.eq_parameters[40].slope: offset 892 (int32_t)
dataset.tuning_parameters.eq_parameters[41].slope: offset 912 (int32_t)
dataset.tuning_parameters.eq_parameters[42].slope: offset 932 (int32_t)
dataset.tuning_parameters.eq_parameters[43].slope: offset 952 (int32_t)
dataset.tuning_parameters.eq_parameters[44].slope: offset 972 (int32_t)
dataset.tuning_parameters.eq_parameters[45].slope: offset 992 (int32_t)
dataset.tuning_parameters.eq_parameters[46].slope: offset 1012 (int32_t)
dataset.tuning_parameters.eq_parameters[47].slope: offset 1032 (int32_t)
dataset.tuning_parameters.eq_parameters[48].slope: offset 1052 (int32_t)
dataset.tuning_parameters.eq_parameters[49].slope: offset 1072 (int32_t)
dataset.tuning_parameters.eq_parameters[50].slope: offset 1092 (int32_t)
dataset.tuning_parameters.eq_parameters[51].slope: offset 1112 (int32_t)
dataset.tuning_parameters.eq_parameters[52].slope: offset 1132 (int32_t)
dataset.tuning_parameters.eq_parameters[53].slope: offset 1152 (int32_t)
dataset.tuning_parameters.eq_parameters[54].slope: offset 1172 (int32_t)
dataset.tuning_parameters.eq_parameters[55].slope: offset 1192 (int32_t)
dataset.tuning_parameters.eq_parameters[56].slope: offset 1212 (int32_t)
dataset.tuning_parameters.eq_parameters[57].slope: offset 1232 (int32_t)
dataset.tuning_parameters.eq_parameters[58].slope: offset 1252 (int32_t)
dataset.tuning_parameters.eq_parameters[59].slope: offset 1272 (int32_t)
dataset.tuning_parameters.eq_parameters[60].slope: offset 1292 (int32_t)
dataset.tuning_parameters.eq_parameters[61].slope: offset 1312 (int32_t)
dataset.tuning_parameters.eq_parameters[62].slope: offset 1332 (int32_t)
dataset.tuning_parameters.eq_parameters[63].slope: offset 1352 (int32_t)
dataset.tuning_parameters.eq_parameters[64].slope: offset 1372 (int32_t)
dataset.tuning_parameters.eq_parameters[65].slope: offset 1392 (int32_t)
dataset.tuning_parameters.eq_parameters[66].slope: offset 1412 (int32_t)
dataset.tuning_parameters.eq_parameters[67].slope: offset 1432 (int32_t)
dataset.tuning_parameters.eq_parameters[68].slope: offset 1452 (int32_t)
dataset.tuning_parameters.eq_parameters[69].slope: offset 1472 (int32_t)
dataset.tuning_parameters.eq_parameters[70].slope: offset 1492 (int32_t)
dataset.tuning_parameters.eq_parameters[71].slope: offset 1512 (int32_t)
dataset.tuning_parameters.eq_parameters[72].slope: offset 1532 (int32_t)
dataset.tuning_parameters.eq_parameters[73].slope: offset 1552 (int32_t)
dataset.tuning_parameters.eq_parameters[74].slope: offset 1572 (int32_t)
dataset.tuning_parameters.eq_parameters[75].slope: offset 1592 (int32_t)
dataset.tuning_parameters.eq_parameters[76].slope: offset 1612 (int32_t)
dataset.tuning_parameters.eq_parameters[77].slope: offset 1632 (int32_t)
dataset.tuning_parameters.eq_parameters[78].slope: offset 1652 (int32_t)
dataset.tuning_parameters.eq_parameters[79].slope: offset 1672 (int32_t)
dataset.tuning_parameters.eq_parameters[80].slope: offset 1692 (int32_t)
dataset.tuning_parameters.eq_parameters[81].slope: offset 1712 (int32_t)
dataset.tuning_parameters.eq_parameters[82].slope: offset 1732 (int32_t)
dataset.tuning_parameters.eq_parameters[83].slope: offset 1752 (int32_t)
dataset.tuning_parameters.eq_parameters[84].slope: offset 1772 (int32_t)
dataset.tuning_parameters.eq_parameters[85].slope: offset 1792 (int32_t)
dataset.tuning_parameters.eq_parameters[86].slope: offset 1812 (int32_t)
dataset.tuning_parameters.eq_parameters[87].slope: offset 1832 (int32_t)
dataset.tuning_parameters.eq_parameters[88].slope: offset 1852 (int32_t)
dataset.tuning_parameters.eq_parameters[89].slope: offset 1872 (int32_t)
dataset.tuning_parameters.eq_parameters[90].slope: offset 1892 (int32_t)
dataset.tuning_parameters.eq_parameters[91].slope: offset 1912 (int32_t)
dataset.tuning_parameters.eq_parameters[92].slope: offset 1932 (int32_t)
dataset.tuning_parameters.eq_parameters[93].slope: offset 1952 (int32_t)
dataset.tuning_parameters.eq_parameters[94].slope: offset 1972 (int32_t)
dataset.tuning_parameters.eq_parameters[95].slope: offset 1992 (int32_t)
dataset.tuning_parameters.eq_parameters[96].slope: offset 2012 (int32_t)
dataset.tuning_parameters.eq_parameters[97].slope: offset 2032 (int32_t)
dataset.tuning_parameters.eq_parameters[98].slope: offset 2052 (int32_t)
dataset.tuning_parameters.eq_parameters[99].slope: offset 2072 (int32_t)
dataset.tuning_parameters.eq_parameters[100].slope: offset 2092 (int32_t)
dataset.tuning_parameters.eq_parameters[101].slope: offset 2112 (int32_t)
dataset.tuning_parameters.eq_parameters[102].slope: offset 2132 (int32_t)
dataset.tuning_parameters.eq_parameters[103].slope: offset 2152 (int32_t)
dataset.tuning_parameters.eq_parameters[104].slope: offset 2172 (int32_t)
dataset.tuning_parameters.eq_parameters[105].slope: offset 2192 (int32_t)
dataset.tuning_parameters.eq_parameters[106].slope: offset 2212 (int32_t)
dataset.tuning_parameters.eq_parameters[107].slope: offset 2232 (int32_t)
dataset.tuning_parameters.eq_parameters[108].slope: offset 2252 (int32_t)
dataset.tuning_parameters.eq_parameters[109].slope: offset 2272 (int32_t)
dataset.tuning_parameters.eq_parameters[110].slope: offset 2292 (int32_t)
dataset.tuning_parameters.eq_parameters[111].slope: offset 2312 (int32_t)
dataset.tuning_parameters.eq_parameters[112].slope: offset 2332 (int32_t)
dataset.tuning_parameters.eq_parameters[113].slope: offset 2352 (int32_t)
dataset.tuning_parameters.eq_parameters[114].slope: offset 2372 (int32_t)
dataset.tuning_parameters.eq_parameters[115].slope: offset 2392 (int32_t)
dataset.tuning_parameters.eq_parameters[116].slope: offset 2412 (int32_t)
dataset.tuning_parameters.eq_parameters[117].slope: offset 2432 (int32_t)
dataset.tuning_parameters.eq_parameters[118].slope: offset 2452 (int32_t)
dataset.tuning_parameters.eq_parameters[119].slope: offset 2472 (int32_t)
dataset.tuning_parameters.eq_parameters[0].filterType: offset 96 (int32_t)
dataset.tuning_parameters.eq_parameters[1].filterType: offset 116 (int32_t)
dataset.tuning_parameters.eq_parameters[2].filterType: offset 136 (int32_t)
dataset.tuning_parameters.eq_parameters[3].filterType: offset 156 (int32_t)
dataset.tuning_parameters.eq_parameters[4].filterType: offset 176 (int32_t)
dataset.tuning_parameters.eq_parameters[5].filterType: offset 196 (int32_t)
dataset.tuning_parameters.eq_parameters[6].filterType: offset 216 (int32_t)
dataset.tuning_parameters.eq_parameters[7].filterType: offset 236 (int32_t)
dataset.tuning_parameters.eq_parameters[8].filterType: offset 256 (int32_t)
dataset.tuning_parameters.eq_parameters[9].filterType: offset 276 (int32_t)
dataset.tuning_parameters.eq_parameters[10].filterType: offset 296 (int32_t)
dataset.tuning_parameters.eq_parameters[11].filterType: offset 316 (int32_t)
dataset.tuning_parameters.eq_parameters[12].filterType: offset 336 (int32_t)
dataset.tuning_parameters.eq_parameters[13].filterType: offset 356 (int32_t)
dataset.tuning_parameters.eq_parameters[14].filterType: offset 376 (int32_t)
dataset.tuning_parameters.eq_parameters[15].filterType: offset 396 (int32_t)
dataset.tuning_parameters.eq_parameters[16].filterType: offset 416 (int32_t)
dataset.tuning_parameters.eq_parameters[17].filterType: offset 436 (int32_t)
dataset.tuning_parameters.eq_parameters[18].filterType: offset 456 (int32_t)
dataset.tuning_parameters.eq_parameters[19].filterType: offset 476 (int32_t)
dataset.tuning_parameters.eq_parameters[20].filterType: offset 496 (int32_t)
dataset.tuning_parameters.eq_parameters[21].filterType: offset 516 (int32_t)
dataset.tuning_parameters.eq_parameters[22].filterType: offset 536 (int32_t)
dataset.tuning_parameters.eq_parameters[23].filterType: offset 556 (int32_t)
dataset.tuning_parameters.eq_parameters[24].filterType: offset 576 (int32_t)
dataset.tuning_parameters.eq_parameters[25].filterType: offset 596 (int32_t)
dataset.tuning_parameters.eq_parameters[26].filterType: offset 616 (int32_t)
dataset.tuning_parameters.eq_parameters[27].filterType: offset 636 (int32_t)
dataset.tuning_parameters.eq_parameters[28].filterType: offset 656 (int32_t)
dataset.tuning_parameters.eq_parameters[29].filterType: offset 676 (int32_t)
dataset.tuning_parameters.eq_parameters[30].filterType: offset 696 (int32_t)
dataset.tuning_parameters.eq_parameters[31].filterType: offset 716 (int32_t)
dataset.tuning_parameters.eq_parameters[32].filterType: offset 736 (int32_t)
dataset.tuning_parameters.eq_parameters[33].filterType: offset 756 (int32_t)
dataset.tuning_parameters.eq_parameters[34].filterType: offset 776 (int32_t)
dataset.tuning_parameters.eq_parameters[35].filterType: offset 796 (int32_t)
dataset.tuning_parameters.eq_parameters[36].filterType: offset 816 (int32_t)
dataset.tuning_parameters.eq_parameters[37].filterType: offset 836 (int32_t)
dataset.tuning_parameters.eq_parameters[38].filterType: offset 856 (int32_t)
dataset.tuning_parameters.eq_parameters[39].filterType: offset 876 (int32_t)
dataset.tuning_parameters.eq_parameters[40].filterType: offset 896 (int32_t)
dataset.tuning_parameters.eq_parameters[41].filterType: offset 916 (int32_t)
dataset.tuning_parameters.eq_parameters[42].filterType: offset 936 (int32_t)
dataset.tuning_parameters.eq_parameters[43].filterType: offset 956 (int32_t)
dataset.tuning_parameters.eq_parameters[44].filterType: offset 976 (int32_t)
dataset.tuning_parameters.eq_parameters[45].filterType: offset 996 (int32_t)
dataset.tuning_parameters.eq_parameters[46].filterType: offset 1016 (int32_t)
dataset.tuning_parameters.eq_parameters[47].filterType: offset 1036 (int32_t)
dataset.tuning_parameters.eq_parameters[48].filterType: offset 1056 (int32_t)
dataset.tuning_parameters.eq_parameters[49].filterType: offset 1076 (int32_t)
dataset.tuning_parameters.eq_parameters[50].filterType: offset 1096 (int32_t)
dataset.tuning_parameters.eq_parameters[51].filterType: offset 1116 (int32_t)
dataset.tuning_parameters.eq_parameters[52].filterType: offset 1136 (int32_t)
dataset.tuning_parameters.eq_parameters[53].filterType: offset 1156 (int32_t)
dataset.tuning_parameters.eq_parameters[54].filterType: offset 1176 (int32_t)
dataset.tuning_parameters.eq_parameters[55].filterType: offset 1196 (int32_t)
dataset.tuning_parameters.eq_parameters[56].filterType: offset 1216 (int32_t)
dataset.tuning_parameters.eq_parameters[57].filterType: offset 1236 (int32_t)
dataset.tuning_parameters.eq_parameters[58].filterType: offset 1256 (int32_t)
dataset.tuning_parameters.eq_parameters[59].filterType: offset 1276 (int32_t)
dataset.tuning_parameters.eq_parameters[60].filterType: offset 1296 (int32_t)
dataset.tuning_parameters.eq_parameters[61].filterType: offset 1316 (int32_t)
dataset.tuning_parameters.eq_parameters[62].filterType: offset 1336 (int32_t)
dataset.tuning_parameters.eq_parameters[63].filterType: offset 1356 (int32_t)
dataset.tuning_parameters.eq_parameters[64].filterType: offset 1376 (int32_t)
dataset.tuning_parameters.eq_parameters[65].filterType: offset 1396 (int32_t)
dataset.tuning_parameters.eq_parameters[66].filterType: offset 1416 (int32_t)
dataset.tuning_parameters.eq_parameters[67].filterType: offset 1436 (int32_t)
dataset.tuning_parameters.eq_parameters[68].filterType: offset 1456 (int32_t)
dataset.tuning_parameters.eq_parameters[69].filterType: offset 1476 (int32_t)
dataset.tuning_parameters.eq_parameters[70].filterType: offset 1496 (int32_t)
dataset.tuning_parameters.eq_parameters[71].filterType: offset 1516 (int32_t)
dataset.tuning_parameters.eq_parameters[72].filterType: offset 1536 (int32_t)
dataset.tuning_parameters.eq_parameters[73].filterType: offset 1556 (int32_t)
dataset.tuning_parameters.eq_parameters[74].filterType: offset 1576 (int32_t)
dataset.tuning_parameters.eq_parameters[75].filterType: offset 1596 (int32_t)
dataset.tuning_parameters.eq_parameters[76].filterType: offset 1616 (int32_t)
dataset.tuning_parameters.eq_parameters[77].filterType: offset 1636 (int32_t)
dataset.tuning_parameters.eq_parameters[78].filterType: offset 1656 (int32_t)
dataset.tuning_parameters.eq_parameters[79].filterType: offset 1676 (int32_t)
dataset.tuning_parameters.eq_parameters[80].filterType: offset 1696 (int32_t)
dataset.tuning_parameters.eq_parameters[81].filterType: offset 1716 (int32_t)
dataset.tuning_parameters.eq_parameters[82].filterType: offset 1736 (int32_t)
dataset.tuning_parameters.eq_parameters[83].filterType: offset 1756 (int32_t)
dataset.tuning_parameters.eq_parameters[84].filterType: offset 1776 (int32_t)
dataset.tuning_parameters.eq_parameters[85].filterType: offset 1796 (int32_t)
dataset.tuning_parameters.eq_parameters[86].filterType: offset 1816 (int32_t)
dataset.tuning_parameters.eq_parameters[87].filterType: offset 1836 (int32_t)
dataset.tuning_parameters.eq_parameters[88].filterType: offset 1856 (int32_t)
dataset.tuning_parameters.eq_parameters[89].filterType: offset 1876 (int32_t)
dataset.tuning_parameters.eq_parameters[90].filterType: offset 1896 (int32_t)
dataset.tuning_parameters.eq_parameters[91].filterType: offset 1916 (int32_t)
dataset.tuning_parameters.eq_parameters[92].filterType: offset 1936 (int32_t)
dataset.tuning_parameters.eq_parameters[93].filterType: offset 1956 (int32_t)
dataset.tuning_parameters.eq_parameters[94].filterType: offset 1976 (int32_t)
dataset.tuning_parameters.eq_parameters[95].filterType: offset 1996 (int32_t)
dataset.tuning_parameters.eq_parameters[96].filterType: offset 2016 (int32_t)
dataset.tuning_parameters.eq_parameters[97].filterType: offset 2036 (int32_t)
dataset.tuning_parameters.eq_parameters[98].filterType: offset 2056 (int32_t)
dataset.tuning_parameters.eq_parameters[99].filterType: offset 2076 (int32_t)
dataset.tuning_parameters.eq_parameters[100].filterType: offset 2096 (int32_t)
dataset.tuning_parameters.eq_parameters[101].filterType: offset 2116 (int32_t)
dataset.tuning_parameters.eq_parameters[102].filterType: offset 2136 (int32_t)
dataset.tuning_parameters.eq_parameters[103].filterType: offset 2156 (int32_t)
dataset.tuning_parameters.eq_parameters[104].filterType: offset 2176 (int32_t)
dataset.tuning_parameters.eq_parameters[105].filterType: offset 2196 (int32_t)
dataset.tuning_parameters.eq_parameters[106].filterType: offset 2216 (int32_t)
dataset.tuning_parameters.eq_parameters[107].filterType: offset 2236 (int32_t)
dataset.tuning_parameters.eq_parameters[108].filterType: offset 2256 (int32_t)
dataset.tuning_parameters.eq_parameters[109].filterType: offset 2276 (int32_t)
dataset.tuning_parameters.eq_parameters[110].filterType: offset 2296 (int32_t)
dataset.tuning_parameters.eq_parameters[111].filterType: offset 2316 (int32_t)
dataset.tuning_parameters.eq_parameters[112].filterType: offset 2336 (int32_t)
dataset.tuning_parameters.eq_parameters[113].filterType: offset 2356 (int32_t)
dataset.tuning_parameters.eq_parameters[114].filterType: offset 2376 (int32_t)
dataset.tuning_parameters.eq_parameters[115].filterType: offset 2396 (int32_t)
dataset.tuning_parameters.eq_parameters[116].filterType: offset 2416 (int32_t)
dataset.tuning_parameters.eq_parameters[117].filterType: offset 2436 (int32_t)
dataset.tuning_parameters.eq_parameters[118].filterType: offset 2456 (int32_t)
dataset.tuning_parameters.eq_parameters[119].filterType: offset 2476 (int32_t)
dataset.tuning_parameters.delay_parameters[0].ch_n: offset 2500 (int32_t)
dataset.tuning_parameters.delay_parameters[1].ch_n: offset 2508 (int32_t)
dataset.tuning_parameters.delay_parameters[2].ch_n: offset 2516 (int32_t)
dataset.tuning_parameters.delay_parameters[3].ch_n: offset 2524 (int32_t)
dataset.tuning_parameters.delay_parameters[4].ch_n: offset 2532 (int32_t)
dataset.tuning_parameters.delay_parameters[5].ch_n: offset 2540 (int32_t)
dataset.tuning_parameters.delay_parameters[0].delay_data: offset 2504 (float)
dataset.tuning_parameters.delay_parameters[1].delay_data: offset 2512 (float)
dataset.tuning_parameters.delay_parameters[2].delay_data: offset 2520 (float)
dataset.tuning_parameters.delay_parameters[3].delay_data: offset 2528 (float)
dataset.tuning_parameters.delay_parameters[4].delay_data: offset 2536 (float)
dataset.tuning_parameters.delay_parameters[5].delay_data: offset 2544 (float)
dataset.tuning_parameters.volume_parameters[0].ch_n: offset 2548 (int32_t)
dataset.tuning_parameters.volume_parameters[1].ch_n: offset 2556 (int32_t)
dataset.tuning_parameters.volume_parameters[2].ch_n: offset 2564 (int32_t)
dataset.tuning_parameters.volume_parameters[3].ch_n: offset 2572 (int32_t)
dataset.tuning_parameters.volume_parameters[4].ch_n: offset 2580 (int32_t)
dataset.tuning_parameters.volume_parameters[5].ch_n: offset 2588 (int32_t)
dataset.tuning_parameters.volume_parameters[0].vol_data: offset 2552 (float)
dataset.tuning_parameters.volume_parameters[1].vol_data: offset 2560 (float)
dataset.tuning_parameters.volume_parameters[2].vol_data: offset 2568 (float)
dataset.tuning_parameters.volume_parameters[3].vol_data: offset 2576 (float)
dataset.tuning_parameters.volume_parameters[4].vol_data: offset 2584 (float)
dataset.tuning_parameters.volume_parameters[5].vol_data: offset 2592 (float)

View File

@ -1,5 +1,6 @@
import json import csv
import os import os
import json
from typing import Dict, List, Any, Optional from typing import Dict, List, Any, Optional
from datetime import datetime from datetime import datetime
from persistence.models import * from persistence.models import *
@ -17,12 +18,22 @@ class DataStore:
if not os.path.exists(self.storage_dir): if not os.path.exists(self.storage_dir):
os.makedirs(self.storage_dir) os.makedirs(self.storage_dir)
# 确保参数数据目录存在
params_dir = os.path.join(self.storage_dir, "params")
if not os.path.exists(params_dir):
os.makedirs(params_dir)
def _get_project_path(self, project_name: str) -> str: def _get_project_path(self, project_name: str) -> str:
"""获取项目文件路径""" """获取项目元数据文件路径"""
return os.path.join(self.storage_dir, f"{project_name}.json") return os.path.join(self.storage_dir, f"{project_name}.json")
def _get_param_path(self, project_name: str, param_name: str) -> str:
"""获取参数数据文件路径"""
params_dir = os.path.join(self.storage_dir, "params")
return os.path.join(params_dir, f"{project_name}_{param_name}.csv")
def save_project(self, project_name: str, description: str = "") -> bool: def save_project(self, project_name: str, description: str = "") -> bool:
"""创建或更新项目""" """创建或更新项目元数据"""
try: try:
now = datetime.now().isoformat() now = datetime.now().isoformat()
project_data = ProjectData( project_data = ProjectData(
@ -32,7 +43,9 @@ class DataStore:
description=description, description=description,
params={} params={}
) )
self._save_project_data(project_name, project_data)
# 保存项目元数据
self._save_project_metadata(project_name, project_data)
self.current_project = project_name self.current_project = project_name
logger.info(f"项目 {project_name} 保存成功") logger.info(f"项目 {project_name} 保存成功")
return True return True
@ -44,10 +57,12 @@ class DataStore:
channel_data: Dict[int, Dict], description: str = "") -> bool: channel_data: Dict[int, Dict], description: str = "") -> bool:
"""向项目添加参数配置""" """向项目添加参数配置"""
try: try:
# 加载项目元数据
project_data = self.load_project(project_name) project_data = self.load_project(project_name)
if not project_data: if not project_data:
raise ValueError(f"Project {project_name} not found") raise ValueError(f"Project {project_name} not found")
# 创建参数配置
param_config = ParamConfig( param_config = ParamConfig(
name=param_name, name=param_name,
created_at=datetime.now().isoformat(), created_at=datetime.now().isoformat(),
@ -55,16 +70,115 @@ class DataStore:
channels=self._convert_to_channel_config(channel_data) channels=self._convert_to_channel_config(channel_data)
) )
# 更新项目元数据
project_data.params[param_name] = param_config project_data.params[param_name] = param_config
project_data.last_modified = datetime.now().isoformat() project_data.last_modified = datetime.now().isoformat()
self._save_project_metadata(project_name, project_data)
# 保存参数数据到CSV文件
self._save_param_to_csv(project_name, param_name, channel_data)
self._save_project_data(project_name, project_data)
logger.info(f"参数 {param_name} 添加到项目 {project_name} 成功") logger.info(f"参数 {param_name} 添加到项目 {project_name} 成功")
return True return True
except Exception as e: except Exception as e:
logger.error(f"添加参数失败: {e}") logger.error(f"添加参数失败: {e}")
return False return False
def _save_param_to_csv(self, project_name: str, param_name: str, channel_data: Dict[int, Dict]):
"""将参数数据保存为CSV格式只包含参数名和值"""
csv_path = self._get_param_path(project_name, param_name)
with open(csv_path, 'w', newline='') as csvfile:
fieldnames = ['parameter', 'value']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
# 写入基本参数
writer.writerow({
'parameter': 'dataset.audio_mode',
'value': '0' # 默认值
})
writer.writerow({
'parameter': 'dataset.send_action',
'value': '0' # 默认值
})
# 写入通道参数
for channel_id, data in channel_data.items():
# 混音参数
if 0 <= channel_id < 6: # 假设最多6个通道
# 通道号
writer.writerow({
'parameter': f'dataset.tuning_parameters.mix_parameters[{channel_id}].ch_n',
'value': str(channel_id)
})
# 左混音
writer.writerow({
'parameter': f'dataset.tuning_parameters.mix_parameters[{channel_id}].mix_left_data',
'value': str(data.get('mix_left_data', 0.0))
})
# 右混音
writer.writerow({
'parameter': f'dataset.tuning_parameters.mix_parameters[{channel_id}].mix_right_data',
'value': str(data.get('mix_right_data', 0.0))
})
# 延迟参数
writer.writerow({
'parameter': f'dataset.tuning_parameters.delay_parameters[{channel_id}].ch_n',
'value': str(channel_id)
})
writer.writerow({
'parameter': f'dataset.tuning_parameters.delay_parameters[{channel_id}].delay_data',
'value': str(data.get('delay_data', 0.0))
})
# 音量参数
writer.writerow({
'parameter': f'dataset.tuning_parameters.volume_parameters[{channel_id}].ch_n',
'value': str(channel_id)
})
writer.writerow({
'parameter': f'dataset.tuning_parameters.volume_parameters[{channel_id}].vol_data',
'value': str(data.get('vol_data', 0.0))
})
# 滤波器参数
for filter_idx, filter_data in enumerate(data.get('filters', [])):
base_idx = channel_id * 20 + filter_idx # 假设每个通道最多20个滤波器
if base_idx < 120: # 最多120个滤波器参数
# 中心频率
writer.writerow({
'parameter': f'dataset.tuning_parameters.eq_parameters[{base_idx}].fc',
'value': str(filter_data.get('fc', 0.0))
})
# Q值
writer.writerow({
'parameter': f'dataset.tuning_parameters.eq_parameters[{base_idx}].q',
'value': str(filter_data.get('q', 0.0))
})
# 增益
writer.writerow({
'parameter': f'dataset.tuning_parameters.eq_parameters[{base_idx}].gain',
'value': str(filter_data.get('gain', 0.0))
})
# 斜率
writer.writerow({
'parameter': f'dataset.tuning_parameters.eq_parameters[{base_idx}].slope',
'value': str(filter_data.get('slope', 0))
})
# 滤波器类型
writer.writerow({
'parameter': f'dataset.tuning_parameters.eq_parameters[{base_idx}].filterType',
'value': str(filter_data.get('filterType', 0))
})
def _get_param_structure(self):
"""解析struct_params.txt获取参数结构"""
# 这里可以实现解析struct_params.txt的逻辑
# 简化起见,我们直接使用硬编码的结构
return {}
def _convert_to_channel_config(self, channel_data: Dict[int, Dict]) -> Dict[int, ChannelConfig]: def _convert_to_channel_config(self, channel_data: Dict[int, Dict]) -> Dict[int, ChannelConfig]:
"""转换通道数据为ChannelConfig格式""" """转换通道数据为ChannelConfig格式"""
converted = {} converted = {}
@ -80,7 +194,7 @@ class DataStore:
return converted return converted
def load_project(self, project_name: str) -> Optional[ProjectData]: def load_project(self, project_name: str) -> Optional[ProjectData]:
"""加载项目数据""" """加载项目数据"""
try: try:
file_path = self._get_project_path(project_name) file_path = self._get_project_path(project_name)
if not os.path.exists(file_path): if not os.path.exists(file_path):
@ -93,6 +207,109 @@ class DataStore:
logger.error(f"加载项目失败: {e}") logger.error(f"加载项目失败: {e}")
return None return None
def load_param_data(self, project_name: str, param_name: str) -> Dict:
"""加载参数数据"""
try:
csv_path = self._get_param_path(project_name, param_name)
if not os.path.exists(csv_path):
return {}
param_data = {}
with open(csv_path, 'r', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
param_data[row['parameter']] = row['value']
# 转换为通道数据格式
channel_data = self._convert_csv_to_channel_data(param_data)
return channel_data
except Exception as e:
logger.error(f"加载参数数据失败: {e}")
return {}
def _convert_csv_to_channel_data(self, param_data: Dict) -> Dict[int, Dict]:
"""将CSV格式的参数数据转换为通道数据格式"""
channel_data = {}
# 处理混音参数
for i in range(6): # 假设最多6个通道
ch_key = f'dataset.tuning_parameters.mix_parameters[{i}].ch_n'
if ch_key in param_data:
channel_id = int(param_data[ch_key])
if channel_id not in channel_data:
channel_data[channel_id] = {'filters': []}
# 左混音
left_key = f'dataset.tuning_parameters.mix_parameters[{i}].mix_left_data'
if left_key in param_data:
channel_data[channel_id]['mix_left_data'] = float(param_data[left_key])
# 右混音
right_key = f'dataset.tuning_parameters.mix_parameters[{i}].mix_right_data'
if right_key in param_data:
channel_data[channel_id]['mix_right_data'] = float(param_data[right_key])
# 处理延迟参数
for i in range(6):
ch_key = f'dataset.tuning_parameters.delay_parameters[{i}].ch_n'
if ch_key in param_data:
channel_id = int(param_data[ch_key])
if channel_id not in channel_data:
channel_data[channel_id] = {'filters': []}
delay_key = f'dataset.tuning_parameters.delay_parameters[{i}].delay_data'
if delay_key in param_data:
channel_data[channel_id]['delay_data'] = float(param_data[delay_key])
# 处理音量参数
for i in range(6):
ch_key = f'dataset.tuning_parameters.volume_parameters[{i}].ch_n'
if ch_key in param_data:
channel_id = int(param_data[ch_key])
if channel_id not in channel_data:
channel_data[channel_id] = {'filters': []}
vol_key = f'dataset.tuning_parameters.volume_parameters[{i}].vol_data'
if vol_key in param_data:
channel_data[channel_id]['vol_data'] = float(param_data[vol_key])
# 处理滤波器参数
for i in range(120): # 最多120个滤波器
fc_key = f'dataset.tuning_parameters.eq_parameters[{i}].fc'
if fc_key in param_data:
# 确定该滤波器属于哪个通道
channel_id = i // 20 # 假设每个通道最多20个滤波器
filter_idx = i % 20
if channel_id not in channel_data:
channel_data[channel_id] = {'filters': []}
# 确保filters列表有足够的元素
while len(channel_data[channel_id]['filters']) <= filter_idx:
channel_data[channel_id]['filters'].append({})
# 设置滤波器参数
filter_data = channel_data[channel_id]['filters'][filter_idx]
filter_data['fc'] = float(param_data[fc_key])
q_key = f'dataset.tuning_parameters.eq_parameters[{i}].q'
if q_key in param_data:
filter_data['q'] = float(param_data[q_key])
gain_key = f'dataset.tuning_parameters.eq_parameters[{i}].gain'
if gain_key in param_data:
filter_data['gain'] = float(param_data[gain_key])
slope_key = f'dataset.tuning_parameters.eq_parameters[{i}].slope'
if slope_key in param_data:
filter_data['slope'] = int(param_data[slope_key])
filter_type_key = f'dataset.tuning_parameters.eq_parameters[{i}].filterType'
if filter_type_key in param_data:
filter_data['filterType'] = int(param_data[filter_type_key])
return channel_data
def list_projects(self) -> List[str]: def list_projects(self) -> List[str]:
"""列出所有项目""" """列出所有项目"""
try: try:
@ -105,21 +322,65 @@ class DataStore:
logger.error(f"列出项目失败: {e}") logger.error(f"列出项目失败: {e}")
return [] return []
def list_params(self, project_name: str) -> List[str]:
"""列出项目的所有参数"""
try:
project_data = self.load_project(project_name)
if project_data:
return list(project_data.params.keys())
return []
except Exception as e:
logger.error(f"列出参数失败: {e}")
return []
def delete_project(self, project_name: str) -> bool: def delete_project(self, project_name: str) -> bool:
"""删除项目""" """删除项目"""
try: try:
# 删除项目元数据文件
file_path = self._get_project_path(project_name) file_path = self._get_project_path(project_name)
if os.path.exists(file_path): if os.path.exists(file_path):
os.remove(file_path) os.remove(file_path)
if self.current_project == project_name:
self.current_project = None # 删除项目相关的参数文件
logger.info(f"项目 {project_name} 删除成功") params_dir = os.path.join(self.storage_dir, "params")
return True for file in os.listdir(params_dir):
return False if file.startswith(f"{project_name}_") and file.endswith('.csv'):
os.remove(os.path.join(params_dir, file))
if self.current_project == project_name:
self.current_project = None
self.current_param = None
logger.info(f"项目 {project_name} 删除成功")
return True
except Exception as e: except Exception as e:
logger.error(f"删除项目失败: {e}") logger.error(f"删除项目失败: {e}")
return False return False
def delete_param(self, project_name: str, param_name: str) -> bool:
"""删除参数"""
try:
# 更新项目元数据
project_data = self.load_project(project_name)
if project_data and param_name in project_data.params:
del project_data.params[param_name]
project_data.last_modified = datetime.now().isoformat()
self._save_project_metadata(project_name, project_data)
# 删除参数文件
param_path = self._get_param_path(project_name, param_name)
if os.path.exists(param_path):
os.remove(param_path)
if self.current_project == project_name and self.current_param == param_name:
self.current_param = None
logger.info(f"参数 {param_name} 删除成功")
return True
except Exception as e:
logger.error(f"删除参数失败: {e}")
return False
def _project_exists(self, project_name: str) -> bool: def _project_exists(self, project_name: str) -> bool:
"""检查项目是否存在""" """检查项目是否存在"""
return os.path.exists(self._get_project_path(project_name)) return os.path.exists(self._get_project_path(project_name))
@ -131,8 +392,8 @@ class DataStore:
return data.created_at if data else datetime.now().isoformat() return data.created_at if data else datetime.now().isoformat()
return datetime.now().isoformat() return datetime.now().isoformat()
def _save_project_data(self, project_name: str, project_data: ProjectData): def _save_project_metadata(self, project_name: str, project_data: ProjectData):
"""保存项目数据到文件""" """保存项目数据到文件"""
file_path = self._get_project_path(project_name) file_path = self._get_project_path(project_name)
with open(file_path, 'w', encoding='utf-8') as f: with open(file_path, 'w', encoding='utf-8') as f:
json.dump(asdict(project_data), f, indent=2, ensure_ascii=False) json.dump(asdict(project_data), f, indent=2, ensure_ascii=False)

View File

@ -2,8 +2,7 @@ import sys
import os import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
from typing import Dict, List, Optional, Any
from typing import Dict, List, Optional
from persistence.data_store import DataStore from persistence.data_store import DataStore
class DataStoreManager: class DataStoreManager:
@ -23,6 +22,10 @@ class DataStoreManager:
def current_param(self) -> Optional[str]: def current_param(self) -> Optional[str]:
return self._store.current_param 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: def create_project(self, name: str, description: str = "") -> bool:
"""创建新项目""" """创建新项目"""
return self._store.save_project(name, description) return self._store.save_project(name, description)
@ -30,22 +33,82 @@ class DataStoreManager:
def save_param(self, project_name: str, param_name: str, def save_param(self, project_name: str, param_name: str,
channel_settings: Dict[int, Dict], description: str = "") -> bool: channel_settings: Dict[int, Dict], description: str = "") -> bool:
"""保存参数配置""" """保存参数配置"""
return self._store.add_param_to_project(project_name, param_name, success = self._store.add_param_to_project(project_name, param_name,
channel_settings, description) channel_settings, description)
if success:
self._store.current_param = param_name
return success
def get_project(self, name: str) -> Optional[Dict]: def get_project(self, name: str) -> Optional[Dict]:
"""获取项目数据""" """获取项目数据"""
project_data = self._store.load_project(name) project_data = self._store.load_project(name)
return project_data.__dict__ if project_data else None 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]: def get_projects(self) -> List[str]:
"""获取所有项目列表""" """获取所有项目列表"""
return self._store.list_projects() 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: def remove_project(self, name: str) -> bool:
"""删除项目""" """删除项目"""
return self._store.delete_project(name) 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 @classmethod
def get_instance(cls) -> 'DataStoreManager': def get_instance(cls) -> 'DataStoreManager':
"""获取 DataStoreManager 实例""" """获取 DataStoreManager 实例"""

View File

@ -0,0 +1,54 @@
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
from typing import Dict, List, Optional
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
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:
"""保存参数配置"""
return self._store.add_param_to_project(project_name, param_name,
channel_settings, description)
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_projects(self) -> List[str]:
"""获取所有项目列表"""
return self._store.list_projects()
def remove_project(self, name: str) -> bool:
"""删除项目"""
return self._store.delete_project(name)
@classmethod
def get_instance(cls) -> 'DataStoreManager':
"""获取 DataStoreManager 实例"""
if cls._instance is None:
cls._instance = DataStoreManager()
return cls._instance

View File

@ -0,0 +1,138 @@
import json
import os
from typing import Dict, List, Any, Optional
from datetime import datetime
from persistence.models import *
from component.widget_log.log_handler import logger
class DataStore:
def __init__(self, storage_dir: str = "data/projects"):
self.storage_dir = storage_dir
self.current_project: Optional[str] = None
self.current_param: Optional[str] = None
self._ensure_storage_dir()
def _ensure_storage_dir(self):
"""确保存储目录存在"""
if not os.path.exists(self.storage_dir):
os.makedirs(self.storage_dir)
def _get_project_path(self, project_name: str) -> str:
"""获取项目文件路径"""
return os.path.join(self.storage_dir, f"{project_name}.json")
def save_project(self, project_name: str, description: str = "") -> bool:
"""创建或更新项目"""
try:
now = datetime.now().isoformat()
project_data = ProjectData(
name=project_name,
created_at=now if not self._project_exists(project_name) else self._get_project_created_time(project_name),
last_modified=now,
description=description,
params={}
)
self._save_project_data(project_name, project_data)
self.current_project = project_name
logger.info(f"项目 {project_name} 保存成功")
return True
except Exception as e:
logger.error(f"保存项目失败: {e}")
return False
def add_param_to_project(self, project_name: str, param_name: str,
channel_data: Dict[int, Dict], description: str = "") -> bool:
"""向项目添加参数配置"""
try:
project_data = self.load_project(project_name)
if not project_data:
raise ValueError(f"Project {project_name} not found")
param_config = ParamConfig(
name=param_name,
created_at=datetime.now().isoformat(),
description=description,
channels=self._convert_to_channel_config(channel_data)
)
project_data.params[param_name] = param_config
project_data.last_modified = datetime.now().isoformat()
self._save_project_data(project_name, project_data)
logger.info(f"参数 {param_name} 添加到项目 {project_name} 成功")
return True
except Exception as e:
logger.error(f"添加参数失败: {e}")
return False
def _convert_to_channel_config(self, channel_data: Dict[int, Dict]) -> Dict[int, ChannelConfig]:
"""转换通道数据为ChannelConfig格式"""
converted = {}
for channel_id, data in channel_data.items():
filters = [FilterConfig(**f) for f in data.get('filters', [])]
converted[channel_id] = ChannelConfig(
delay_data=data.get('delay_data', 0.0),
vol_data=data.get('vol_data', 0.0),
mix_left_data=data.get('mix_left_data', 0.0),
mix_right_data=data.get('mix_right_data', 0.0),
filters=filters
)
return converted
def load_project(self, project_name: str) -> Optional[ProjectData]:
"""加载项目数据"""
try:
file_path = self._get_project_path(project_name)
if not os.path.exists(file_path):
return None
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
return ProjectData(**data)
except Exception as e:
logger.error(f"加载项目失败: {e}")
return None
def list_projects(self) -> List[str]:
"""列出所有项目"""
try:
projects = []
for file in os.listdir(self.storage_dir):
if file.endswith('.json'):
projects.append(file[:-5])
return projects
except Exception as e:
logger.error(f"列出项目失败: {e}")
return []
def delete_project(self, project_name: str) -> bool:
"""删除项目"""
try:
file_path = self._get_project_path(project_name)
if os.path.exists(file_path):
os.remove(file_path)
if self.current_project == project_name:
self.current_project = None
logger.info(f"项目 {project_name} 删除成功")
return True
return False
except Exception as e:
logger.error(f"删除项目失败: {e}")
return False
def _project_exists(self, project_name: str) -> bool:
"""检查项目是否存在"""
return os.path.exists(self._get_project_path(project_name))
def _get_project_created_time(self, project_name: str) -> str:
"""获取项目创建时间"""
if self._project_exists(project_name):
data = self.load_project(project_name)
return data.created_at if data else datetime.now().isoformat()
return datetime.now().isoformat()
def _save_project_data(self, project_name: str, project_data: ProjectData):
"""保存项目数据到文件"""
file_path = self._get_project_path(project_name)
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(asdict(project_data), f, indent=2, ensure_ascii=False)

View File

@ -6,7 +6,7 @@ import unittest
import os import os
import shutil import shutil
from datetime import datetime from datetime import datetime
from persistence.data_store import DataStore from persistence.data_store_origin import DataStore
class TestDataStore(unittest.TestCase): class TestDataStore(unittest.TestCase):
def setUp(self): def setUp(self):