UI: If audio bitrate not available, use closest

When an encoder has been removed (such as CoreAudio) and the audio
bitrates currently configured no longer are available to the current
audio encoders anymore, it would cause GetAACEncoderForBitrate to return
false with no encoder available.

To fix the issue, instead just choose the closest bitrate relative to
the current bitrate (rounded up).
master
jp9000 2015-09-21 18:36:26 -07:00
parent e10cf47e0d
commit 17fa004104
4 changed files with 41 additions and 2 deletions

View File

@ -208,3 +208,30 @@ const char *GetAACEncoderForBitrate(int bitrate)
return NULL;
return res->second;
}
#define INVALID_BITRATE 10000
int FindClosestAvailableAACBitrate(int bitrate)
{
auto &map_ = GetAACEncoderBitrateMap();
int prev = 0;
int next = INVALID_BITRATE;
for (auto val : map_) {
if (next > val.first) {
if (val.first == bitrate)
return bitrate;
if (val.first < next && val.first > bitrate)
next = val.first;
if (val.first > prev && val.first < bitrate)
prev = val.first;
}
}
if (next != INVALID_BITRATE)
return next;
if (prev != 0)
return prev;
return 192;
}

View File

@ -4,3 +4,4 @@
const std::map<int, const char*> &GetAACEncoderBitrateMap();
const char *GetAACEncoderForBitrate(int bitrate);
int FindClosestAvailableAACBitrate(int bitrate);

View File

@ -252,7 +252,10 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
int SimpleOutput::GetAudioBitrate() const
{
return config_get_uint(main->Config(), "SimpleOutput", "ABitrate");
int bitrate = (int)config_get_uint(main->Config(), "SimpleOutput",
"ABitrate");
return FindClosestAvailableAACBitrate(bitrate);
}
void SimpleOutput::Update()
@ -875,7 +878,8 @@ int AdvancedOutput::GetAudioBitrate(size_t i) const
"Track1Bitrate", "Track2Bitrate",
"Track3Bitrate", "Track4Bitrate",
};
return config_get_uint(main->Config(), "AdvOut", names[i]);
int bitrate = (int)config_get_uint(main->Config(), "AdvOut", names[i]);
return FindClosestAvailableAACBitrate(bitrate);
}
bool AdvancedOutput::StartStreaming(obs_service_t *service)

View File

@ -1023,6 +1023,8 @@ void OBSBasicSettings::LoadSimpleOutputSettings()
const char *recEnc = config_get_string(main->Config(), "SimpleOutput",
"RecEncoder");
audioBitrate = FindClosestAvailableAACBitrate(audioBitrate);
ui->simpleOutputPath->setText(path);
ui->simpleOutputVBitrate->setValue(videoBitrate);
@ -1263,6 +1265,11 @@ void OBSBasicSettings::LoadAdvOutputAudioSettings()
const char *name4 = config_get_string(main->Config(), "AdvOut",
"Track4Name");
track1Bitrate = FindClosestAvailableAACBitrate(track1Bitrate);
track2Bitrate = FindClosestAvailableAACBitrate(track2Bitrate);
track3Bitrate = FindClosestAvailableAACBitrate(track3Bitrate);
track4Bitrate = FindClosestAvailableAACBitrate(track4Bitrate);
SetComboByName(ui->advOutTrack1Bitrate,
std::to_string(track1Bitrate).c_str());
SetComboByName(ui->advOutTrack2Bitrate,