Initial audio support

This commit is contained in:
2026-05-04 14:32:29 +10:00
parent 44316b29c2
commit f836c53d10
17 changed files with 977 additions and 10 deletions

View File

@@ -1055,6 +1055,12 @@ void RuntimeHost::SetPerformanceStats(double frameBudgetMilliseconds, double ren
mSmoothedRenderMilliseconds = mSmoothedRenderMilliseconds * 0.9 + mRenderMilliseconds * 0.1;
}
void RuntimeHost::SetAudioStatus(const AudioStatusSnapshot& status)
{
std::lock_guard<std::mutex> lock(mMutex);
mAudioStatus = status;
}
void RuntimeHost::AdvanceFrame()
{
std::lock_guard<std::mutex> lock(mMutex);
@@ -1121,6 +1127,7 @@ std::vector<RuntimeRenderState> RuntimeHost::GetLayerRenderStates(unsigned outpu
state.inputHeight = mSignalHeight;
state.outputWidth = outputWidth;
state.outputHeight = outputHeight;
state.audioAnalysis = mAudioStatus.analysis;
state.parameterDefinitions = shaderIt->second.parameters;
state.textureAssets = shaderIt->second.textureAssets;
state.isTemporal = shaderIt->second.temporal.enabled;
@@ -1182,6 +1189,21 @@ bool RuntimeHost::LoadConfig(std::string& error)
}
if (const JsonValue* enableExternalKeyingValue = configJson.find("enableExternalKeying"))
mConfig.enableExternalKeying = enableExternalKeyingValue->asBoolean(mConfig.enableExternalKeying);
if (const JsonValue* audioEnabledValue = configJson.find("audioEnabled"))
mConfig.audioEnabled = audioEnabledValue->asBoolean(mConfig.audioEnabled);
if (const JsonValue* audioChannelCountValue = configJson.find("audioChannelCount"))
mConfig.audioChannelCount = static_cast<unsigned>(audioChannelCountValue->asNumber(static_cast<double>(mConfig.audioChannelCount)));
if (const JsonValue* audioSampleRateValue = configJson.find("audioSampleRate"))
mConfig.audioSampleRate = static_cast<unsigned>(audioSampleRateValue->asNumber(static_cast<double>(mConfig.audioSampleRate)));
if (const JsonValue* audioDelayModeValue = configJson.find("audioDelayMode"))
{
if (audioDelayModeValue->isString() && !audioDelayModeValue->asString().empty())
mConfig.audioDelayMode = audioDelayModeValue->asString();
}
if (mConfig.audioChannelCount != kAudioChannelCount)
mConfig.audioChannelCount = kAudioChannelCount;
if (mConfig.audioSampleRate != kAudioSampleRate)
mConfig.audioSampleRate = kAudioSampleRate;
if (const JsonValue* videoFormatValue = configJson.find("videoFormat"))
{
if (videoFormatValue->isString() && !videoFormatValue->asString().empty())
@@ -1519,6 +1541,10 @@ JsonValue RuntimeHost::BuildStateValue() const
app.set("autoReload", JsonValue(mAutoReloadEnabled));
app.set("maxTemporalHistoryFrames", JsonValue(static_cast<double>(mConfig.maxTemporalHistoryFrames)));
app.set("enableExternalKeying", JsonValue(mConfig.enableExternalKeying));
app.set("audioEnabled", JsonValue(mConfig.audioEnabled));
app.set("audioChannelCount", JsonValue(static_cast<double>(mConfig.audioChannelCount)));
app.set("audioSampleRate", JsonValue(static_cast<double>(mConfig.audioSampleRate)));
app.set("audioDelayMode", JsonValue(mConfig.audioDelayMode));
app.set("inputVideoFormat", JsonValue(mConfig.inputVideoFormat));
app.set("inputFrameRate", JsonValue(mConfig.inputFrameRate));
app.set("outputVideoFormat", JsonValue(mConfig.outputVideoFormat));
@@ -1538,6 +1564,26 @@ JsonValue RuntimeHost::BuildStateValue() const
video.set("modeName", JsonValue(mSignalModeName));
root.set("video", video);
JsonValue audio = JsonValue::MakeObject();
audio.set("enabled", JsonValue(mAudioStatus.enabled));
audio.set("bufferedSampleFrames", JsonValue(static_cast<double>(mAudioStatus.bufferedSampleFrames)));
audio.set("underrunCount", JsonValue(static_cast<double>(mAudioStatus.underrunCount)));
JsonValue rms = JsonValue::MakeArray();
rms.pushBack(JsonValue(static_cast<double>(mAudioStatus.analysis.rms[0])));
rms.pushBack(JsonValue(static_cast<double>(mAudioStatus.analysis.rms[1])));
audio.set("rms", rms);
JsonValue peak = JsonValue::MakeArray();
peak.pushBack(JsonValue(static_cast<double>(mAudioStatus.analysis.peak[0])));
peak.pushBack(JsonValue(static_cast<double>(mAudioStatus.analysis.peak[1])));
audio.set("peak", peak);
audio.set("monoRms", JsonValue(static_cast<double>(mAudioStatus.analysis.monoRms)));
audio.set("monoPeak", JsonValue(static_cast<double>(mAudioStatus.analysis.monoPeak)));
JsonValue bands = JsonValue::MakeArray();
for (float band : mAudioStatus.analysis.bands)
bands.pushBack(JsonValue(static_cast<double>(band)));
audio.set("bands", bands);
root.set("audio", audio);
JsonValue deckLink = JsonValue::MakeObject();
deckLink.set("modelName", JsonValue(mDeckLinkOutputStatus.modelName));
deckLink.set("supportsInternalKeying", JsonValue(mDeckLinkOutputStatus.supportsInternalKeying));