156{
157 std::uint64_t reported_sample_count;
158 auto error = source["sample_count"].get(reported_sample_count);
159 if (error)
160 return error;
161
162 std::size_t sample_rate;
163 if ((error = get_or_default(source, "sample_rate", sample_rate, std::size_t{0})))
164 return error;
165 signal_factory.set_sample_rate(sample_rate);
166
167 float time_offset;
168 if ((error = get_or_default(source, "time_offset", time_offset, 0.0f)))
169 return error;
170 signal_factory.set_time_offset(time_offset);
171
172 simdjson::ondemand::array samples;
173 if ((error = source["samples"].get_array().get(samples)))
174 return error;
175
176 for (auto sample_wrapper : samples) {
177 simdjson::ondemand::object sample_obj;
178 if ((error = sample_wrapper.get_object().get(sample_obj)))
179 return error;
180 Signal::Sample sample_data;
181 if ((error = sample_obj["time"].get(sample_data.time)))
182 return error;
183 if ((error = sample_obj["amplitude"].get(sample_data.amplitude)))
184 return error;
185 signal_factory.emplace_sample(sample_data.time, sample_data.amplitude);
186 }
187
188 verify_sample_count(reported_sample_count, signal_factory.observe_signal());
189 return error;
190}