EchoMap
2026-07-25 6d3977c
An experimental cross-platform digital signal processing application for sound-source localisation.
Toggle main menu visibility
Loading...
Searching...
No Matches
JSONPartialDeserialiser.cpp
Go to the documentation of this file.
1
9
10
#if defined(__EMSCRIPTEN__) || defined(__DOXYGEN__)
11
12
#include "
JSONPartialDeserialiser.hpp
"
13
14
#include "
../../factories/SignalFactory.hpp
"
15
#include "../../Sensor.hpp"
16
#include "
../../web/PartialProject.hpp
"
17
#include "
../JSONDeserialiserHelpers.hpp
"
18
19
namespace
20
{
21
22
echomap::Worker
* parent_worker =
nullptr
;
23
24
auto
get_signals(
25
simdjson::ondemand::object& root,
26
echomap::PartialProject
& project,
27
std::unordered_map
<
28
std::string_view
,
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.
33
std::vector<std::unique_ptr<echomap::SignalFactory>
> factories;
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
53
namespace
simdjson
54
{
55
56
template
<
typename
simdjson_value>
57
auto
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
73
std::unordered_map<std::string_view, echomap::id_type>
signal_ids;
74
if
((error = get_signals(root, partial_project, signal_ids)))
75
return
error;
76
77
// Sensors
78
std::unordered_map<std::string_view, echomap::id_type>
sensor_ids;
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
91
namespace
echomap
92
{
93
94
std::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(
106
std::format
(
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.hpp
JSONDeserialiserHelpers specification.
JSONPartialDeserialiser.hpp
JSONPartialDeserialiser specification.
PartialProject.hpp
PartialProject specification.
SignalFactory.hpp
Wave file specification.
std::string_view
echomap::PartialProject
A Project with semantics for expressing an incomplete set of owned Signal objects.
Definition
PartialProject.hpp:32
echomap::PartialProject::indicate_unloaded_signal
void indicate_unloaded_signal(std::unique_ptr< SignalFactory > &&factory)
Provide the factory for an unloaded Signal.
Definition
PartialProject.cpp:28
echomap::Worker
A Worker provides an encapsulated thread-safe despatch model for submitting work and reviewing result...
Definition
Worker.hpp:45
std::format
T format(T... args)
std::make_unique
T make_unique(T... args)
echomap
The main EchoMap outermost namespace for all non-exported symbols.
Definition
ActionController.hpp:20
std::filesystem::path::c_str
T c_str(T... args)
std::runtime_error
std::unordered_map
std::vector
src
objects
persistence
web
JSONPartialDeserialiser.cpp
Generated by
1.17.0