EchoMap 2026-07-25 6d3977c
An experimental cross-platform digital signal processing application for sound-source localisation.
Loading...
Searching...
No Matches
JSONPartialDeserialiser.cpp
Go to the documentation of this file.
1
9
10#if defined(__EMSCRIPTEN__) || defined(__DOXYGEN__)
11
13
15#include "../../Sensor.hpp"
18
19namespace
20{
21
22echomap::Worker* parent_worker = nullptr;
23
24auto get_signals(
25 simdjson::ondemand::object& root,
29 echomap::id_type>& loaded
30)
31{
32 // Step 1. Create our factories which detain only the signal metadata (sample rate, etc.) and source information.
34 if (const auto error = root["signals"].get(factories))
35 return error;
36
37 /*
38 * Step 2. The factories can't be used yet, since we need to establish VFS mappings. In this case, we declare them
39 * to the project to use later on, once the VFS mappings are done.
40 */
41 for (auto factory : factories | std::views::as_rvalue) {
42 if (const auto& signal = factory->observe_signal(); !loaded.emplace(signal.get_name(), signal.get_id()).second)
43 throw std::runtime_error(std::format("Project contains duplicate signal {}.", signal.get_name()));
44
45 project.indicate_unloaded_signal(std::move(factory));
46 }
47
48 return simdjson::SUCCESS;
49}
50
51}
52
53namespace simdjson
54{
55
56template <typename simdjson_value>
57auto tag_invoke(
58 deserialize_tag /*unused*/,
59 simdjson_value& value,
60 echomap::PartialProject& partial_project
61)
62{
63 ondemand::object root;
64 auto error = echomap::JSONDeserialiserHelpers::get_root(root, value);
65 if (error)
66 return error;
67
68 // Metadata
69 if ((error = echomap::JSONDeserialiserHelpers::get_metadata(root, partial_project)))
70 return error;
71
72 // Signals
74 if ((error = get_signals(root, partial_project, signal_ids)))
75 return error;
76
77 // Sensors
79 if ((error = echomap::JSONDeserialiserHelpers::get_sensors(root, partial_project, sensor_ids)))
80 return error;
81
82 // Channel Map
83 if ((error = echomap::JSONDeserialiserHelpers::get_mappings(root, partial_project, signal_ids, sensor_ids)))
84 return error;
85
86 return SUCCESS;
87}
88
89} // namespace simdjson
90
91namespace echomap
92{
93
94std::unique_ptr<PartialProject> JSONPartialDeserialiser::deserialise_project(
95 const std::filesystem::path& path,
96 Worker* const worker
97)
98{
99 parent_worker = worker;
100 const auto json = simdjson::padded_string::load(path.c_str());
101 auto doc = parser.iterate(json);
102 auto partial_project = std::make_unique<PartialProject>();
103
104 if (const auto error = doc.get(*partial_project); error)
105 throw std::runtime_error(
107 "Could not load Project at {} due to error: {}",
108 path.c_str(),
109 simdjson::error_message(error)
110 )
111 );
112
113 return partial_project;
114}
115
116} // namespace echomap
117
118#endif // __EMSCRIPTEN__
JSONDeserialiserHelpers specification.
JSONPartialDeserialiser specification.
PartialProject specification.
Wave file specification.
A Project with semantics for expressing an incomplete set of owned Signal objects.
void indicate_unloaded_signal(std::unique_ptr< SignalFactory > &&factory)
Provide the factory for an unloaded Signal.
A Worker provides an encapsulated thread-safe despatch model for submitting work and reviewing result...
Definition Worker.hpp:45
T format(T... args)
T make_unique(T... args)
The main EchoMap outermost namespace for all non-exported symbols.