Initial audio support
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user