载入中...
搜索中...
未找到
AudioRuntime.cpp
浏览该文件的文档.
2
3#include "audio/Source.h"
4
5#include <utility>
6
7namespace eve::audio_editing {
8namespace {
9
10const EditorValue::Object* properties(const AudioSourceTarget& target, EditorValue& snapshot) {
11 snapshot = target.snapshotValue();
12 const auto* root = snapshot.getIf<EditorValue::Object>();
13 if (!root) return nullptr;
14 const auto found = root->find("properties");
15 return found == root->end() ? nullptr : found->second.getIf<EditorValue::Object>();
16}
17
18template <class T>
19const T* value(const EditorValue::Object& properties, const char* path) {
20 const auto found = properties.find(path);
21 return found == properties.end() ? nullptr : found->second.getIf<T>();
22}
23
24} // namespace
25
26Result<void> AudioSourceRuntimeApplier::apply(const AudioSourceTarget& target,
27 audio::Source* source) const {
28 if (!source)
29 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.audio.runtime-source"),
30 "Live audio source is required");
31 const auto diagnostics = target.validate();
32 for (const EditorDiagnostic& diagnostic : diagnostics)
33 if (diagnostic.severity() == DiagnosticSeverity::Error)
34 return Result<void>::failure(eve::Status(EditorStatus::Rejected, diagnostics));
35 EditorValue snapshot;
36 const auto* values = properties(target, snapshot);
37 if (!values)
38 return eve::editing::failed<void>(EditorStatus::Failed, RuleId("editor.audio.runtime-properties"),
39 "Audio source properties are unavailable");
40 source->setVolume(static_cast<float>(*value<double>(*values, "play.volume")));
41 source->setPitch(static_cast<float>(*value<double>(*values, "play.pitch")));
42 source->setLooping(*value<bool>(*values, "play.loop"));
43 const auto& position = *value<EditorValue::Array>(*values, "spatial.position");
44 const auto& velocity = *value<EditorValue::Array>(*values, "spatial.velocity");
45 const auto& direction = *value<EditorValue::Array>(*values, "spatial.direction");
46 source->setPosition(static_cast<float>(*position[0].getIf<double>()),
47 static_cast<float>(*position[1].getIf<double>()),
48 static_cast<float>(*position[2].getIf<double>()));
49 source->setVelocity(static_cast<float>(*velocity[0].getIf<double>()),
50 static_cast<float>(*velocity[1].getIf<double>()),
51 static_cast<float>(*velocity[2].getIf<double>()));
52 source->setDirection(static_cast<float>(*direction[0].getIf<double>()),
53 static_cast<float>(*direction[1].getIf<double>()),
54 static_cast<float>(*direction[2].getIf<double>()));
55 source->setRelative(*value<bool>(*values, "spatial.relative"));
56 source->setAttenuationDistances(
57 static_cast<float>(*value<double>(*values, "spatial.reference-distance")),
58 static_cast<float>(*value<double>(*values, "spatial.maximum-distance")));
59 return eve::editing::applied<void>();
60}
61
62Result<void> AudioSourceRuntimeSink::publish(const AudioSourceTarget& candidate) {
63 return AudioSourceRuntimeApplier().apply(candidate, source_);
64}
65
66} // namespace eve::audio_editing
LogicalId target
double value
int root
Definition AnimSmr.cpp:119
std::map< std::string, Var > values
std::array< float, 3 > position
std::map< std::string, PropertyRule > properties
std::string path
Definition PlayHost.cpp:110
RoadLaneDirection direction
bool found
const UnitySourceAsset & source
std::map< std::string, Value > Object
editing::DiagnosticSeverity DiagnosticSeverity
editing::Value EditorValue
editing::Diagnostic EditorDiagnostic
editing::Status EditorStatus
eve::StatusCode Status
eve::Result< T > Result
audio_editing::AudioSourceRuntimeApplier AudioSourceRuntimeApplier
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16