@@ -260,15 +260,38 @@ void osn::IAdvancedStreaming::SetOutputHeight(void *data, const int64_t id, cons
260260
261261static bool setAudioEncoder (osn::AdvancedStreaming *streaming)
262262{
263- osn::AudioTrack *audioTrack = osn::IAudioTrack::audioTracks[streaming->audioTrack - 1 ];
264- if (!audioTrack)
263+ if (!osn::IAudioTrack::GetTrackConfig (streaming->audioTrack ))
265264 return false ;
266- if (!audioTrack->audioEnc )
265+
266+ const uint32_t mixerIndex = osn::IAudioTrack::GetMixerIndex (streaming->audioTrack );
267+ if (streaming->audioEncoder && streaming->audioEncoderTrack != mixerIndex) {
268+ if (obs_encoder_active (streaming->audioEncoder ))
269+ return false ;
270+
271+ obs_encoder_release (streaming->audioEncoder );
272+ streaming->audioEncoder = nullptr ;
273+ streaming->audioEncoderTrack = 0 ;
274+ }
275+
276+ if (!streaming->audioEncoder ) {
277+ streaming->audioEncoder = osn::IAudioTrack::CreateEncoderForTrack (streaming->audioTrack , " audio-encoder-streaming" );
278+ streaming->audioEncoderTrack = mixerIndex;
279+ } else if (!obs_encoder_active (streaming->audioEncoder )) {
280+ osn::AudioTrack *audioTrack = osn::IAudioTrack::GetTrackConfig (streaming->audioTrack );
281+ if (audioTrack) {
282+ obs_data_t *settings = obs_data_create ();
283+ obs_data_set_int (settings, " bitrate" , audioTrack->bitrate );
284+ obs_encoder_update (streaming->audioEncoder , settings);
285+ obs_data_release (settings);
286+ }
287+ }
288+
289+ if (!streaming->audioEncoder )
267290 return false ;
268291
269- obs_encoder_set_audio (audioTrack-> audioEnc , obs_get_audio ());
270- obs_output_set_audio_encoder (streaming->GetOutput (), audioTrack-> audioEnc , 0 );
271- obs_encoder_set_video_mix (audioTrack-> audioEnc , obs_video_mix_get (streaming->GetCanvas (), OBS_STREAMING_VIDEO_RENDERING ));
292+ obs_encoder_set_audio (streaming-> audioEncoder , obs_get_audio ());
293+ obs_output_set_audio_encoder (streaming->GetOutput (), streaming-> audioEncoder , 0 );
294+ obs_encoder_set_video_mix (streaming-> audioEncoder , obs_video_mix_get (streaming->GetCanvas (), OBS_STREAMING_VIDEO_RENDERING ));
272295
273296 return true ;
274297}
@@ -318,7 +341,7 @@ static void SetupTwitchSoundtrackAudio(osn::AdvancedStreaming *streaming)
318341 obs_output_set_audio_encoder (streaming->GetOutput (), streaming->streamArchive , kSoundtrackArchiveEncoderIdx );
319342 obs_encoder_set_video_mix (streaming->streamArchive , obs_video_mix_get (streaming->GetCanvas (), OBS_STREAMING_VIDEO_RENDERING ));
320343
321- osn::AudioTrack *audioTrack = osn::IAudioTrack::audioTracks [streaming->twitchTrack ];
344+ osn::AudioTrack *audioTrack = osn::IAudioTrack::audioTrackConfigs [streaming->twitchTrack ];
322345 if (!audioTrack)
323346 return ;
324347
@@ -388,6 +411,21 @@ void osn::AdvancedStreaming::UpdateEncoders()
388411 }
389412}
390413
414+ osn::AdvancedStreaming::~AdvancedStreaming ()
415+ {
416+ DeleteOutput ();
417+
418+ if (audioEncoder) {
419+ if (obs_encoder_active (audioEncoder)) {
420+ blog (LOG_WARNING , " AdvancedStreaming audio encoder is still active after DeleteOutput; releasing owner reference." );
421+ }
422+
423+ obs_encoder_release (audioEncoder);
424+ audioEncoder = nullptr ;
425+ audioEncoderTrack = 0 ;
426+ }
427+ }
428+
391429void osn::IAdvancedStreaming::Start (void *data, const int64_t id, const std::vector<ipc::value> &args, std::vector<ipc::value> &rval)
392430{
393431 AdvancedStreaming *streaming = static_cast <AdvancedStreaming *>(osn::IAdvancedStreaming::Manager::GetInstance ().find (args[0 ].value_union .ui64 ));
0 commit comments