Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 18 additions & 50 deletions obs-studio-server/source/osn-advanced-streaming.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,54 +296,30 @@ static bool setAudioEncoder(osn::AdvancedStreaming *streaming)
return true;
}

static constexpr int kSoundtrackArchiveEncoderIdx = 1;
static constexpr int kSoundtrackArchiveTrackIdx = 5;

static uint32_t setMixer(obs_source_t *source, const int mixerIdx, const bool checked)
{
uint32_t mixers = obs_source_get_audio_mixers(source);
uint32_t new_mixers = mixers;
if (checked) {
new_mixers |= (1 << mixerIdx);
} else {
new_mixers &= ~(1 << mixerIdx);
}
obs_source_set_audio_mixers(source, new_mixers);
return mixers;
}
static constexpr int kVodEncoderSlot = 1;

static void SetupTwitchSoundtrackAudio(osn::AdvancedStreaming *streaming)
{
// These are magic ints provided by OBS for default sources:
// 0 is the main scene/transition which you'd see on the main preview,
// 1-2 are desktop audio 1 and 2 as you'd see in audio settings,
// 2-4 are mic/aux 1-3 as you'd see in audio settings
auto desktopSource1 = obs_get_output_source(1);
auto desktopSource2 = obs_get_output_source(2);

// Since our plugin duplicates all of the desktop sources, we want to ensure that both of the
// default desktop sources, provided by OBS, are not set to mix on our custom encoder track.
streaming->oldMixer_desktopSource1 = setMixer(desktopSource1, kSoundtrackArchiveTrackIdx, false);
streaming->oldMixer_desktopSource2 = setMixer(desktopSource2, kSoundtrackArchiveTrackIdx, false);
osn::AudioTrack *audioTrack = osn::IAudioTrack::GetTrackConfig(streaming->twitchTrack);
if (!audioTrack)
return;

obs_source_release(desktopSource1);
obs_source_release(desktopSource2);
const uint32_t vodMixer = osn::IAudioTrack::GetMixerIndex(streaming->twitchTrack);

if (streaming->streamArchive && obs_encoder_active(streaming->streamArchive))
return;

if (!streaming->streamArchive) {
streaming->streamArchive =
obs_audio_encoder_create("ffmpeg_aac", "Soundtrack by Twitch Archive Encoder", nullptr, kSoundtrackArchiveTrackIdx, nullptr);
obs_encoder_set_audio(streaming->streamArchive, obs_get_audio());
// mixer is fixed at create time; recreate when track changed
if (streaming->streamArchive) {
obs_encoder_release(streaming->streamArchive);
streaming->streamArchive = nullptr;
}

obs_output_set_audio_encoder(streaming->GetOutput(), streaming->streamArchive, kSoundtrackArchiveEncoderIdx);
obs_encoder_set_video_mix(streaming->streamArchive, obs_video_mix_get(streaming->GetCanvas(), OBS_STREAMING_VIDEO_RENDERING));
streaming->streamArchive = obs_audio_encoder_create("ffmpeg_aac", "Twitch VOD Track Encoder", nullptr, vodMixer, nullptr);
obs_encoder_set_audio(streaming->streamArchive, obs_get_audio());

osn::AudioTrack *audioTrack = osn::IAudioTrack::audioTrackConfigs[streaming->twitchTrack];
if (!audioTrack)
return;
obs_output_set_audio_encoder(streaming->GetOutput(), streaming->streamArchive, kVodEncoderSlot);
obs_encoder_set_video_mix(streaming->streamArchive, obs_video_mix_get(streaming->GetCanvas(), OBS_STREAMING_VIDEO_RENDERING));

obs_data_t *settings = obs_data_create();
obs_data_set_int(settings, "bitrate", audioTrack->bitrate);
Expand All @@ -357,15 +333,6 @@ static void StopTwitchSoundtrackAudio(osn::Streaming *streaming)
obs_encoder_release(streaming->streamArchive);
streaming->streamArchive = nullptr;
}

auto desktopSource1 = obs_get_output_source(1);
auto desktopSource2 = obs_get_output_source(2);

obs_source_set_audio_mixers(desktopSource1, streaming->oldMixer_desktopSource1);
obs_source_set_audio_mixers(desktopSource2, streaming->oldMixer_desktopSource2);

obs_source_release(desktopSource1);
obs_source_release(desktopSource2);
}

void osn::AdvancedStreaming::UpdateEncoders()
Expand Down Expand Up @@ -556,9 +523,10 @@ void osn::IAdvancedStreaming::GetLegacySettings(void *data, const int64_t id, co
streaming->videoEncoder = obs_video_encoder_create(encId, "video-encoder", newSettings, nullptr);
osn::VideoEncoder::Manager::GetInstance().allocate(streaming->videoEncoder);

streaming->audioTrack = static_cast<uint32_t>(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex") - 1);
// basic.ini stores TrackIndex/VodTrackIndex 1-based; keep in-memory 1-based too
streaming->audioTrack = static_cast<uint32_t>(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex"));
streaming->enableTwitchVOD = config_get_bool(ConfigManager::getInstance().getBasic(), "AdvOut", "VodTrackEnabled");
streaming->twitchTrack = static_cast<uint32_t>(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "VodTrackIndex") - 1);
streaming->twitchTrack = static_cast<uint32_t>(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "VodTrackIndex"));
streaming->enforceServiceBitrate = config_get_bool(ConfigManager::getInstance().getBasic(), "AdvOut", "ApplyServiceSettings");

streaming->rescaleFilter = static_cast<uint32_t>(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "RescaleFilter"));
Expand Down Expand Up @@ -607,8 +575,8 @@ void osn::IAdvancedStreaming::SetLegacySettings(void *data, const int64_t id, co

config_set_bool(ConfigManager::getInstance().getBasic(), "AdvOut", "VodTrackEnabled", streaming->enableTwitchVOD);
config_set_bool(ConfigManager::getInstance().getBasic(), "AdvOut", "ApplyServiceSettings", streaming->enforceServiceBitrate);
config_set_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex", streaming->audioTrack + 1);
config_set_int(ConfigManager::getInstance().getBasic(), "AdvOut", "VodTrackIndex", streaming->twitchTrack + 1);
config_set_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex", streaming->audioTrack);
config_set_int(ConfigManager::getInstance().getBasic(), "AdvOut", "VodTrackIndex", streaming->twitchTrack);

streaming->rescaling = streaming->rescaleFilter != OBS_SCALE_DISABLE;
config_set_bool(ConfigManager::getInstance().getBasic(), "AdvOut", "Rescale", streaming->rescaling);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,15 @@ void osn::IEnhancedBroadcastingAdvancedStreaming::Start(void *data, const int64_
PRETTY_ERROR_RETURN(ErrorCode::InvalidReference, "Invalid service.");
}

auto vod_track_mixer = (streaming->twitchVODSupported && streaming->enableTwitchVOD) ? std::optional{streaming->twitchTrack} : std::nullopt;
// mirror AdvancedStreaming::Start; field defaults false and would silently disable VOD
if (streaming->enableTwitchVOD) {
streaming->twitchVODSupported = streaming->isTwitchVODSupported();
}

std::optional<size_t> vod_track_mixer = std::nullopt;
if (streaming->twitchVODSupported && streaming->enableTwitchVOD && osn::IAudioTrack::GetTrackConfig(streaming->twitchTrack)) {
vod_track_mixer = osn::IAudioTrack::GetMixerIndex(streaming->twitchTrack);
}
try {
streaming->StartEnhancedBroadcastingStream(vod_track_mixer);
} catch (const std::exception &error) {
Expand Down
Loading