Skip to content

Commit

Permalink
simplify audio encoder management by making logic similar to video en…
Browse files Browse the repository at this point in the history
…coders
  • Loading branch information
summeroff committed Apr 23, 2024
1 parent edbc0c3 commit cd82744
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 76 deletions.
13 changes: 2 additions & 11 deletions obs-studio-server/source/nodeobs_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1602,24 +1602,15 @@ void OBS_API::destroyOBS_API(void)
recordingEncoder = nullptr;
}

obs_encoder_t *audioStreamingEncoder = OBS_service::getAudioSimpleStreamingEncoder();
if (audioStreamingEncoder != NULL) {
obs_encoder_release(audioStreamingEncoder);
audioStreamingEncoder = nullptr;
}
OBS_service::setAudioStreamingEncoder(nullptr, StreamServiceId::Main);
OBS_service::setAudioStreamingEncoder(nullptr, StreamServiceId::Second);

obs_encoder_t *audioRecordingEncoder = OBS_service::getAudioSimpleRecordingEncoder();
if (audioRecordingEncoder != NULL && (OBS_service::useRecordingPreset() || obs_get_multiple_rendering())) {
obs_encoder_release(audioRecordingEncoder);
audioRecordingEncoder = nullptr;
}

obs_encoder_t *audioAdvancedStreamingEncoder = OBS_service::getAudioAdvancedStreamingEncoder();
if (audioAdvancedStreamingEncoder != NULL) {
obs_encoder_release(audioAdvancedStreamingEncoder);
audioAdvancedStreamingEncoder = nullptr;
}

obs_encoder_t *archiveEncoder = OBS_service::getArchiveEncoder();
if (archiveEncoder != NULL) {
obs_encoder_release(archiveEncoder);
Expand Down
96 changes: 37 additions & 59 deletions obs-studio-server/source/nodeobs_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,8 @@ obs_output_t *replayBufferOutput = nullptr;

obs_output_t *virtualWebcamOutput = nullptr;

obs_encoder_t *audioSimpleStreamingEncoder = nullptr;
obs_encoder_t *audioSimpleRecordingEncoder = nullptr;
obs_encoder_t *audioAdvancedStreamingEncoder = nullptr;
std::vector<obs_encoder_t *> audioStreamingEncoder = {nullptr, nullptr};
std::vector<obs_encoder_t *> videoStreamingEncoder = {nullptr, nullptr};
std::vector<obs_video_info_t *> videoInfo = {nullptr, nullptr};
obs_encoder_t *videoRecordingEncoder = nullptr;
Expand Down Expand Up @@ -802,32 +801,23 @@ bool OBS_service::createVideoStreamingEncoder(StreamServiceId serviceId)
return true;
}

void OBS_service::createSimpleAudioStreamingEncoder()
void OBS_service::createAudioStreamingEncoder(StreamServiceId serviceId, bool isSimpleMode)
{
std::string id;
obs_encoder_t *audioStreamingEncoder = nullptr;
uint64_t trackIndex = 0;
std::string audio_encoder_name = isSimpleMode ? "simple_audio_streaming" : "adv_audio_streaming";
audio_encoder_name = audio_encoder_name + (serviceId == StreamServiceId::Main ? "_main" : "_second");

if (audioSimpleStreamingEncoder) {
obs_encoder_release(audioSimpleStreamingEncoder);
audioSimpleStreamingEncoder = nullptr;
if (!isSimpleMode) {
trackIndex = config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex") - 1;
}

if (!createAudioEncoder(&audioSimpleStreamingEncoder, id, ffmpeg_aac_id, GetSimpleAudioBitrate(), "simple_audio_streaming", 0)) {
throw "Failed to create audio simple recording encoder";
if (!createAudioEncoder(&audioStreamingEncoder, id, ffmpeg_aac_id, GetSimpleAudioBitrate(), audio_encoder_name.c_str(), trackIndex)) {
throw "Failed to create audio streaming encoder";
}
}

void OBS_service::createAdvancedAudioStreamingEncoder()
{
std::string id;

if (audioAdvancedStreamingEncoder) {
obs_encoder_release(audioAdvancedStreamingEncoder);
audioAdvancedStreamingEncoder = nullptr;
}
uint64_t trackIndex = config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex") - 1;
if (!createAudioEncoder(&audioAdvancedStreamingEncoder, id, ffmpeg_aac_id, GetSimpleAudioBitrate(), "adv_audio_streaming", trackIndex)) {
throw "Failed to create audio advenced recording encoder";
}
setAudioStreamingEncoder(audioStreamingEncoder, serviceId);
}

static inline bool valid_string(const char *str)
Expand Down Expand Up @@ -1246,11 +1236,7 @@ bool OBS_service::startStreaming(StreamServiceId serviceId)
updateStreamingOutput(serviceId);

obs_output_set_video_encoder(streamingOutput[serviceId], videoStreamingEncoder[serviceId]);

if (isSimpleMode)
obs_output_set_audio_encoder(streamingOutput[serviceId], audioSimpleStreamingEncoder, 0);
else
obs_output_set_audio_encoder(streamingOutput[serviceId], audioAdvancedStreamingEncoder, 0);
obs_output_set_audio_encoder(streamingOutput[serviceId], audioStreamingEncoder[serviceId], 0);

twitchSoundtrackEnabled = startTwitchSoundtrackAudio();
if (!twitchSoundtrackEnabled)
Expand Down Expand Up @@ -1303,37 +1289,38 @@ void OBS_service::updateAudioStreamingEncoder(bool isSimpleMode, StreamServiceId
return;
}

obs_encoder_t **enc = isSimpleMode ? &audioSimpleStreamingEncoder : &audioAdvancedStreamingEncoder;
obs_encoder_t *enc = getAudioStreamingEncoder(serviceId);

if (*enc && obs_encoder_active(*enc))
if (enc && obs_encoder_active(enc))
return;

if (*enc) {
obs_encoder_release(*enc);
*enc = nullptr;
if (enc) {
obs_encoder_release(enc);
enc = nullptr;
setAudioStreamingEncoder(nullptr, serviceId);
}

if (strstr(codec, "aac") != NULL && isSimpleMode) {
createSimpleAudioStreamingEncoder();
*enc = audioSimpleStreamingEncoder;
createAudioStreamingEncoder(serviceId, isSimpleMode);
enc = audioStreamingEncoder[serviceId];
} else if (strstr(codec, "aac") != NULL && !isSimpleMode) {
createAdvancedAudioStreamingEncoder();
*enc = audioAdvancedStreamingEncoder;
createAudioStreamingEncoder(serviceId, isSimpleMode);
enc = audioStreamingEncoder[serviceId];
} else {
uint64_t trackIndex = config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "TrackIndex");
const char *id = FindAudioEncoderFromCodec(codec);
int audioBitrate = GetAdvancedAudioBitrate(trackIndex - 1);
obs_data_t *settings = obs_data_create();
obs_data_set_int(settings, "bitrate", audioBitrate);

*enc = obs_audio_encoder_create(id, "alt_audio_enc", nullptr, isSimpleMode ? 0 : trackIndex - 1, nullptr);
if (!(*enc))
enc = obs_audio_encoder_create(id, "alt_audio_enc", nullptr, isSimpleMode ? 0 : trackIndex - 1, nullptr);
if (!(enc))
return;

obs_encoder_update(*enc, settings);
obs_encoder_update(enc, settings);
obs_data_release(settings);
}
obs_encoder_set_audio(*enc, obs_get_audio());
obs_encoder_set_audio(enc, obs_get_audio());

return;
}
Expand Down Expand Up @@ -1457,7 +1444,7 @@ bool OBS_service::updateRecordingEncoders(bool isSimpleMode, StreamServiceId ser
if (!obs_get_multiple_rendering())
useStreamEncoder = true;
else {
duplicate_encoder(&audioSimpleRecordingEncoder, audioSimpleStreamingEncoder, 0);
duplicate_encoder(&audioSimpleRecordingEncoder, audioStreamingEncoder[serviceId], 0);
obs_encoder_set_audio(audioSimpleRecordingEncoder, obs_get_audio());
useStreamEncoder = false;
}
Expand Down Expand Up @@ -1512,7 +1499,7 @@ bool OBS_service::startRecording(void)

obs_output_set_video_encoder(recordingOutput, useStreamEncoder ? videoStreamingEncoder[0] : videoRecordingEncoder);
if (isSimpleMode) {
obs_output_set_audio_encoder(recordingOutput, useStreamEncoder ? audioSimpleStreamingEncoder : audioSimpleRecordingEncoder, 0);
obs_output_set_audio_encoder(recordingOutput, useStreamEncoder ? audioStreamingEncoder[0] : audioSimpleRecordingEncoder, 0);
} else {
int tracks = int(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "RecTracks"));
int idx = 0;
Expand Down Expand Up @@ -1682,7 +1669,7 @@ bool OBS_service::startReplayBuffer(void)

obs_output_set_video_encoder(replayBufferOutput, useStreamEncoder ? videoStreamingEncoder[0] : videoRecordingEncoder);
if (isSimpleMode) {
obs_output_set_audio_encoder(replayBufferOutput, useStreamEncoder ? audioSimpleStreamingEncoder : audioSimpleRecordingEncoder, 0);
obs_output_set_audio_encoder(replayBufferOutput, useStreamEncoder ? audioStreamingEncoder[0] : audioSimpleRecordingEncoder, 0);
} else {
int tracks = int(config_get_int(ConfigManager::getInstance().getBasic(), "AdvOut", "RecTracks"));
int idx = 0;
Expand Down Expand Up @@ -1906,7 +1893,7 @@ void OBS_service::updateVideoStreamingEncoder(bool isSimpleMode, StreamServiceId
}

obs_encoder_update(videoStreamingEncoder[serviceId], h264Settings);
obs_encoder_update(audioSimpleStreamingEncoder, aacSettings);
obs_encoder_update(audioStreamingEncoder[serviceId], aacSettings);

obs_data_release(h264Settings);
obs_data_release(aacSettings);
Expand Down Expand Up @@ -2416,15 +2403,17 @@ void OBS_service::setRecordingEncoder(obs_encoder_t *encoder)
videoRecordingEncoder = encoder;
}

obs_encoder_t *OBS_service::getAudioSimpleStreamingEncoder(void)
obs_encoder_t *OBS_service::getAudioStreamingEncoder(StreamServiceId serviceId)
{
return audioSimpleStreamingEncoder;
return audioStreamingEncoder[serviceId];
}

void OBS_service::setAudioSimpleStreamingEncoder(obs_encoder_t *encoder)
void OBS_service::setAudioStreamingEncoder(obs_encoder_t *encoder, StreamServiceId serviceId)
{
obs_encoder_release(audioSimpleStreamingEncoder);
audioSimpleStreamingEncoder = encoder;
if (audioStreamingEncoder[serviceId]) {
obs_encoder_release(audioStreamingEncoder[serviceId]);
}
audioStreamingEncoder[serviceId] = encoder;
}

obs_encoder_t *OBS_service::getAudioSimpleRecordingEncoder(void)
Expand All @@ -2443,17 +2432,6 @@ void OBS_service::setAudioSimpleRecordingEncoder(obs_encoder_t *encoder)
audioSimpleRecordingEncoder = encoder;
}

obs_encoder_t *OBS_service::getAudioAdvancedStreamingEncoder(void)
{
return audioAdvancedStreamingEncoder;
}

void OBS_service::setAudioAdvancedStreamingEncoder(obs_encoder_t *encoder)
{
obs_encoder_release(audioAdvancedStreamingEncoder);
audioAdvancedStreamingEncoder = encoder;
}

obs_output_t *OBS_service::getStreamingOutput(StreamServiceId serviceId)
{
return streamingOutput[serviceId];
Expand Down
9 changes: 3 additions & 6 deletions obs-studio-server/source/nodeobs_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,19 +181,16 @@ class OBS_service {
size_t idx);
static bool createVideoStreamingEncoder(StreamServiceId serviceId);
static std::string GetVideoEncoderName(StreamServiceId serviceId, bool isSimpleMode, bool recording, const char *encoder);
static void createSimpleAudioStreamingEncoder();
static void createAdvancedAudioStreamingEncoder();
static void createAudioStreamingEncoder(StreamServiceId serviceId, bool isSimpleMode);
static bool createVideoRecordingEncoder();
static obs_encoder_t *getStreamingEncoder(StreamServiceId serviceId);
static void setStreamingEncoder(obs_encoder_t *encoder, StreamServiceId serviceId);
static obs_encoder_t *getRecordingEncoder(void);
static void setRecordingEncoder(obs_encoder_t *encoder);
static obs_encoder_t *getAudioSimpleStreamingEncoder(void);
static void setAudioSimpleStreamingEncoder(obs_encoder_t *encoder);
static obs_encoder_t *getAudioStreamingEncoder(StreamServiceId serviceId);
static void setAudioStreamingEncoder(obs_encoder_t *encoder, StreamServiceId serviceId);
static obs_encoder_t *getAudioSimpleRecordingEncoder(void);
static void setAudioSimpleRecordingEncoder(obs_encoder_t *encoder);
static obs_encoder_t *getAudioAdvancedStreamingEncoder(void);
static void setAudioAdvancedStreamingEncoder(obs_encoder_t *encoder);
static void setupRecordingAudioEncoder(void);
static void clearRecordingAudioEncoder(void);
static obs_encoder_t *getArchiveEncoder(void);
Expand Down

0 comments on commit cd82744

Please sign in to comment.