diff --git a/app.py b/app.py index e34fb2c..b8122f3 100644 --- a/app.py +++ b/app.py @@ -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_card.widget_card import ParamData from component.widget_log.widget_log import Widget_Log -from persistence.data_store_manager import DataStoreManager -from persistence.data_store import DataStore +from persistence.data_store_manager_origin import DataStoreManager +from persistence.data_store_origin import DataStore from param_struct_test.service_manager import ServiceManager from application.application_controller import ApplicationController from param_struct_test.params_service import Response diff --git a/doc/struct_params.txt b/doc/struct_params.txt new file mode 100644 index 0000000..2a09246 --- /dev/null +++ b/doc/struct_params.txt @@ -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) diff --git a/persistence/__pycache__/data_store.cpython-313.pyc b/persistence/__pycache__/data_store.cpython-313.pyc index 6040dec..55a2c63 100644 Binary files a/persistence/__pycache__/data_store.cpython-313.pyc and b/persistence/__pycache__/data_store.cpython-313.pyc differ diff --git a/persistence/__pycache__/data_store_manager_origin.cpython-313.pyc b/persistence/__pycache__/data_store_manager_origin.cpython-313.pyc new file mode 100644 index 0000000..4933e0f Binary files /dev/null and b/persistence/__pycache__/data_store_manager_origin.cpython-313.pyc differ diff --git a/persistence/__pycache__/data_store_origin.cpython-313.pyc b/persistence/__pycache__/data_store_origin.cpython-313.pyc new file mode 100644 index 0000000..3e1be1f Binary files /dev/null and b/persistence/__pycache__/data_store_origin.cpython-313.pyc differ diff --git a/persistence/data_store.py b/persistence/data_store.py index 91d8752..3f78381 100644 --- a/persistence/data_store.py +++ b/persistence/data_store.py @@ -1,5 +1,6 @@ -import json +import csv import os +import json from typing import Dict, List, Any, Optional from datetime import datetime from persistence.models import * @@ -16,13 +17,23 @@ class DataStore: """确保存储目录存在""" if not os.path.exists(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: - """获取项目文件路径""" + """获取项目元数据文件路径""" 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: - """创建或更新项目""" + """创建或更新项目元数据""" try: now = datetime.now().isoformat() project_data = ProjectData( @@ -32,7 +43,9 @@ class DataStore: description=description, params={} ) - self._save_project_data(project_name, project_data) + + # 保存项目元数据 + self._save_project_metadata(project_name, project_data) self.current_project = project_name logger.info(f"项目 {project_name} 保存成功") return True @@ -44,10 +57,12 @@ class DataStore: 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(), @@ -55,16 +70,115 @@ class DataStore: 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_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} 成功") return True except Exception as e: logger.error(f"添加参数失败: {e}") 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]: """转换通道数据为ChannelConfig格式""" converted = {} @@ -80,7 +194,7 @@ class DataStore: 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): @@ -93,6 +207,109 @@ class DataStore: logger.error(f"加载项目失败: {e}") 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]: """列出所有项目""" try: @@ -105,21 +322,65 @@ class DataStore: logger.error(f"列出项目失败: {e}") 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: """删除项目""" 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 + + # 删除项目相关的参数文件 + params_dir = os.path.join(self.storage_dir, "params") + for file in os.listdir(params_dir): + 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: logger.error(f"删除项目失败: {e}") 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: """检查项目是否存在""" 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 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) with open(file_path, 'w', encoding='utf-8') as f: - json.dump(asdict(project_data), f, indent=2, ensure_ascii=False) \ No newline at end of file + json.dump(asdict(project_data), f, indent=2, ensure_ascii=False) \ No newline at end of file diff --git a/persistence/data_store_manager.py b/persistence/data_store_manager.py index 99dd4f7..d863d12 100644 --- a/persistence/data_store_manager.py +++ b/persistence/data_store_manager.py @@ -2,8 +2,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) - -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Any from persistence.data_store import DataStore class DataStoreManager: @@ -23,6 +22,10 @@ class DataStoreManager: 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) @@ -30,25 +33,85 @@ class DataStoreManager: 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, + 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 \ No newline at end of file + return cls._instance \ No newline at end of file diff --git a/persistence/data_store_manager_origin.py b/persistence/data_store_manager_origin.py new file mode 100644 index 0000000..99dd4f7 --- /dev/null +++ b/persistence/data_store_manager_origin.py @@ -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 \ No newline at end of file diff --git a/persistence/data_store_origin.py b/persistence/data_store_origin.py new file mode 100644 index 0000000..91d8752 --- /dev/null +++ b/persistence/data_store_origin.py @@ -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) \ No newline at end of file diff --git a/persistence/test_data_store.py b/persistence/test_data_store.py index d8cb548..3c8e464 100644 --- a/persistence/test_data_store.py +++ b/persistence/test_data_store.py @@ -6,7 +6,7 @@ import unittest import os import shutil from datetime import datetime -from persistence.data_store import DataStore +from persistence.data_store_origin import DataStore class TestDataStore(unittest.TestCase): def setUp(self):