diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d7e326e --- /dev/null +++ b/.clang-format @@ -0,0 +1,2 @@ +BasedOnStyle: InheritParentConfig +ColumnLimit: 132 \ No newline at end of file diff --git a/source-record.c b/source-record.c index 2e5f4e0..9fb7c10 100644 --- a/source-record.c +++ b/source-record.c @@ -101,8 +101,7 @@ static void mix_audio(obs_source_t *parent, obs_source_t *child, void *param) if (!ts) return; struct obs_source_audio *mixed_audio = param; - const size_t pos = (size_t)ns_to_audio_frames( - mixed_audio->samples_per_sec, ts - mixed_audio->timestamp); + const size_t pos = (size_t)ns_to_audio_frames(mixed_audio->samples_per_sec, ts - mixed_audio->timestamp); if (pos > AUDIO_OUTPUT_FRAMES) return; @@ -122,9 +121,7 @@ static void mix_audio(obs_source_t *parent, obs_source_t *child, void *param) } } -static bool audio_input_callback(void *param, uint64_t start_ts_in, - uint64_t end_ts_in, uint64_t *out_ts, - uint32_t mixers, +static bool audio_input_callback(void *param, uint64_t start_ts_in, uint64_t end_ts_in, uint64_t *out_ts, uint32_t mixers, struct audio_output_data *mixes) { UNUSED_PARAMETER(end_ts_in); @@ -157,32 +154,23 @@ static bool audio_input_callback(void *param, uint64_t start_ts_in, mixed_audio.data[i] = (uint8_t *)mixes->data[i]; } mixed_audio.timestamp = min_ts; - mixed_audio.speakers = - audio_output_get_channels(filter->audio_output); - mixed_audio.samples_per_sec = - audio_output_get_sample_rate( - filter->audio_output); + mixed_audio.speakers = audio_output_get_channels(filter->audio_output); + mixed_audio.samples_per_sec = audio_output_get_sample_rate(filter->audio_output); mixed_audio.format = AUDIO_FORMAT_FLOAT_PLANAR; - obs_source_enum_active_tree(audio_source, mix_audio, - &mixed_audio); + obs_source_enum_active_tree(audio_source, mix_audio, &mixed_audio); - for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; - mix_idx++) { + for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) { if ((mixers & (1 << mix_idx)) == 0) continue; // clamp audio - for (size_t ch = 0; - ch < (size_t)mixed_audio.speakers; ch++) { - float *mix_data = - mixes[mix_idx].data[ch]; - float *mix_end = - &mix_data[AUDIO_OUTPUT_FRAMES]; + for (size_t ch = 0; ch < (size_t)mixed_audio.speakers; ch++) { + float *mix_data = mixes[mix_idx].data[ch]; + float *mix_end = &mix_data[AUDIO_OUTPUT_FRAMES]; while (mix_data < mix_end) { float val = *mix_data; val = (val > 1.0f) ? 1.0f : val; - val = (val < -1.0f) ? -1.0f - : val; + val = (val < -1.0f) ? -1.0f : val; *(mix_data++) = val; } } @@ -240,8 +228,7 @@ static void start_file_output_task(void *data) if (obs_output_start(context->fileOutput)) { if (!context->output_active) { context->output_active = true; - obs_source_inc_showing( - obs_filter_get_parent(context->source)); + obs_source_inc_showing(obs_filter_get_parent(context->source)); } } context->starting_file_output = false; @@ -253,8 +240,7 @@ static void start_stream_output_task(void *data) if (obs_output_start(context->streamOutput)) { if (!context->output_active) { context->output_active = true; - obs_source_inc_showing( - obs_filter_get_parent(context->source)); + obs_source_inc_showing(obs_filter_get_parent(context->source)); } } context->starting_stream_output = false; @@ -271,8 +257,7 @@ static void stop_output_task(void *data) obs_output_t *output = data; signal_handler_t *sh = obs_output_get_signal_handler(output); if (sh) - signal_handler_connect(sh, "stop", release_output_stopped, - output); + signal_handler_connect(sh, "stop", release_output_stopped, output); obs_output_stop(output); if (!sh) obs_output_release(output); @@ -283,8 +268,7 @@ static void force_stop_output_task(void *data) obs_output_t *output = data; signal_handler_t *sh = obs_output_get_signal_handler(output); if (sh) - signal_handler_connect(sh, "stop", release_output_stopped, - output); + signal_handler_connect(sh, "stop", release_output_stopped, output); obs_output_force_stop(output); if (!sh) obs_output_release(output); @@ -296,8 +280,7 @@ static void start_replay_task(void *data) if (obs_output_start(context->replayOutput)) { if (!context->output_active) { context->output_active = true; - obs_source_inc_showing( - obs_filter_get_parent(context->source)); + obs_source_inc_showing(obs_filter_get_parent(context->source)); } } context->starting_replay_output = false; @@ -328,8 +311,7 @@ static void remove_filter(void *data, calldata_t *calldata) { UNUSED_PARAMETER(calldata); struct source_record_filter_context *filter = data; - signal_handler_t *sh = - obs_output_get_signal_handler(filter->fileOutput); + signal_handler_t *sh = obs_output_get_signal_handler(filter->fileOutput); signal_handler_disconnect(sh, "stop", remove_filter, filter); obs_source_t *source = obs_filter_get_parent(filter->source); if (!source && filter->view) { @@ -339,43 +321,82 @@ static void remove_filter(void *data, calldata_t *calldata) obs_source_filter_remove(source, filter->source); } -static void start_file_output(struct source_record_filter_context *filter, - obs_data_t *settings) +static const char *get_encoder_id(obs_data_t *settings) +{ + const char *enc_id = obs_data_get_string(settings, "encoder"); + if (strlen(enc_id) == 0 || strcmp(enc_id, "x264") == 0 || strcmp(enc_id, "x264_lowcpu") == 0) { + enc_id = "obs_x264"; + } else if (strcmp(enc_id, "qsv") == 0) { + enc_id = "obs_qsv11_v2"; + } else if (strcmp(enc_id, "qsv_av1") == 0) { + enc_id = "obs_qsv11_av1"; + } else if (strcmp(enc_id, "amd") == 0) { + enc_id = "h264_texture_amf"; + } else if (strcmp(enc_id, "amd_hevc") == 0) { + enc_id = "h265_texture_amf"; + } else if (strcmp(enc_id, "amd_av1") == 0) { + enc_id = "av1_texture_amf"; + } else if (strcmp(enc_id, "nvenc") == 0) { + enc_id = EncoderAvailable("jim_nvenc") ? "jim_nvenc" : "ffmpeg_nvenc"; + } else if (strcmp(enc_id, "nvenc_hevc") == 0) { + enc_id = EncoderAvailable("jim_hevc_nvenc") ? "jim_hevc_nvenc" : "ffmpeg_hevc_nvenc"; + } else if (strcmp(enc_id, "nvenc_av1") == 0) { + enc_id = "jim_av1_nvenc"; + } else if (strcmp(enc_id, "apple_h264") == 0) { + enc_id = "com.apple.videotoolbox.videoencoder.ave.avc"; + } else if (strcmp(enc_id, "apple_hevc") == 0) { + enc_id = "com.apple.videotoolbox.videoencoder.ave.hevc"; + } + return enc_id; +} + +static void update_video_encoder(struct source_record_filter_context *filter, obs_data_t *settings) +{ + if (obs_encoder_video(filter->encoder) != filter->video_output) { + if (obs_encoder_active(filter->encoder)) { + obs_encoder_release(filter->encoder); + const char *enc_id = get_encoder_id(settings); + filter->encoder = obs_video_encoder_create(enc_id, obs_source_get_name(filter->source), settings, NULL); + obs_encoder_set_scaled_size(filter->encoder, 0, 0); + obs_encoder_set_video(filter->encoder, filter->video_output); + } + } + if (filter->fileOutput && obs_output_get_video_encoder(filter->fileOutput) != filter->encoder) + obs_output_set_video_encoder(filter->fileOutput, filter->encoder); + if (filter->streamOutput && obs_output_get_video_encoder(filter->streamOutput) != filter->encoder) + obs_output_set_video_encoder(filter->streamOutput, filter->encoder); + if (filter->replayOutput && obs_output_get_video_encoder(filter->replayOutput) != filter->encoder) + obs_output_set_video_encoder(filter->replayOutput, filter->encoder); +} + +static void start_file_output(struct source_record_filter_context *filter, obs_data_t *settings) { obs_data_t *s = obs_data_create(); char path[512]; - char *filename = os_generate_formatted_filename( - obs_data_get_string(settings, "rec_format"), true, - obs_data_get_string(settings, "filename_formatting")); - snprintf(path, 512, "%s/%s", obs_data_get_string(settings, "path"), - filename); + char *filename = os_generate_formatted_filename(obs_data_get_string(settings, "rec_format"), true, + obs_data_get_string(settings, "filename_formatting")); + snprintf(path, 512, "%s/%s", obs_data_get_string(settings, "path"), filename); bfree(filename); ensure_directory(path); obs_data_set_string(s, "path", path); if (!filter->fileOutput) { - filter->fileOutput = obs_output_create( - "ffmpeg_muxer", obs_source_get_name(filter->source), s, - NULL); + filter->fileOutput = obs_output_create("ffmpeg_muxer", obs_source_get_name(filter->source), s, NULL); if (filter->remove_after_record) { - signal_handler_t *sh = obs_output_get_signal_handler( - filter->fileOutput); - signal_handler_connect(sh, "stop", remove_filter, - filter); + signal_handler_t *sh = obs_output_get_signal_handler(filter->fileOutput); + signal_handler_connect(sh, "stop", remove_filter, filter); } } else { obs_output_update(filter->fileOutput, s); } obs_data_release(s); if (filter->encoder) { - obs_encoder_set_video(filter->encoder, filter->video_output); - obs_output_set_video_encoder(filter->fileOutput, - filter->encoder); + update_video_encoder(filter, settings); + obs_output_set_video_encoder(filter->fileOutput, filter->encoder); } if (filter->aacTrack) { obs_encoder_set_audio(filter->aacTrack, filter->audio_output); - obs_output_set_audio_encoder(filter->fileOutput, - filter->aacTrack, 0); + obs_output_set_audio_encoder(filter->fileOutput, filter->aacTrack, 0); } filter->starting_file_output = true; @@ -386,13 +407,10 @@ static void start_file_output(struct source_record_filter_context *filter, #define FTL_PROTOCOL "ftl" #define RTMP_PROTOCOL "rtmp" -static void start_stream_output(struct source_record_filter_context *filter, - obs_data_t *settings) +static void start_stream_output(struct source_record_filter_context *filter, obs_data_t *settings) { if (!filter->service) { - filter->service = obs_service_create( - "rtmp_custom", obs_source_get_name(filter->source), - settings, NULL); + filter->service = obs_service_create("rtmp_custom", obs_source_get_name(filter->source), settings, NULL); } else { obs_service_update(filter->service, settings); } @@ -401,45 +419,37 @@ static void start_stream_output(struct source_record_filter_context *filter, #if LIBOBS_API_VER < MAKE_SEMANTIC_VERSION(29, 0, 2) const char *type = obs_service_get_output_type(filter->service); #else - const char *type = - obs_service_get_preferred_output_type(filter->service); + const char *type = obs_service_get_preferred_output_type(filter->service); #endif if (!type) { type = "rtmp_output"; #if LIBOBS_API_VER < MAKE_SEMANTIC_VERSION(29, 0, 2) const char *url = obs_service_get_url(filter->service); #else - const char *url = obs_service_get_connect_info( - filter->service, OBS_SERVICE_CONNECT_INFO_SERVER_URL); + const char *url = obs_service_get_connect_info(filter->service, OBS_SERVICE_CONNECT_INFO_SERVER_URL); #endif - if (url != NULL && - strncmp(url, FTL_PROTOCOL, strlen(FTL_PROTOCOL)) == 0) { + if (url != NULL && strncmp(url, FTL_PROTOCOL, strlen(FTL_PROTOCOL)) == 0) { type = "ftl_output"; - } else if (url != NULL && strncmp(url, RTMP_PROTOCOL, - strlen(RTMP_PROTOCOL)) != 0) { + } else if (url != NULL && strncmp(url, RTMP_PROTOCOL, strlen(RTMP_PROTOCOL)) != 0) { type = "ffmpeg_mpegts_muxer"; } } if (!filter->streamOutput) { - filter->streamOutput = obs_output_create( - type, obs_source_get_name(filter->source), settings, - NULL); + filter->streamOutput = obs_output_create(type, obs_source_get_name(filter->source), settings, NULL); } else { obs_output_update(filter->streamOutput, settings); } obs_output_set_service(filter->streamOutput, filter->service); if (filter->encoder) { - obs_encoder_set_video(filter->encoder, filter->video_output); - obs_output_set_video_encoder(filter->streamOutput, - filter->encoder); + update_video_encoder(filter, settings); + obs_output_set_video_encoder(filter->streamOutput, filter->encoder); } if (filter->aacTrack) { obs_encoder_set_audio(filter->aacTrack, filter->audio_output); - obs_output_set_audio_encoder(filter->streamOutput, - filter->aacTrack, 0); + obs_output_set_audio_encoder(filter->streamOutput, filter->aacTrack, 0); } filter->starting_stream_output = true; @@ -447,26 +457,19 @@ static void start_stream_output(struct source_record_filter_context *filter, run_queued(start_stream_output_task, filter); } -static void start_replay_output(struct source_record_filter_context *filter, - obs_data_t *settings) +static void start_replay_output(struct source_record_filter_context *filter, obs_data_t *settings) { obs_data_t *s = obs_data_create(); - obs_data_set_string(s, "directory", - obs_data_get_string(settings, "path")); - obs_data_set_string(s, "format", - obs_data_get_string(settings, - "filename_formatting")); - obs_data_set_string(s, "extension", - obs_data_get_string(settings, "rec_format")); + obs_data_set_string(s, "directory", obs_data_get_string(settings, "path")); + obs_data_set_string(s, "format", obs_data_get_string(settings, "filename_formatting")); + obs_data_set_string(s, "extension", obs_data_get_string(settings, "rec_format")); obs_data_set_bool(s, "allow_spaces", true); - filter->replay_buffer_duration = - obs_data_get_int(settings, "replay_duration"); + filter->replay_buffer_duration = obs_data_get_int(settings, "replay_duration"); obs_data_set_int(s, "max_time_sec", filter->replay_buffer_duration); obs_data_set_int(s, "max_size_mb", 10000); if (!filter->replayOutput) { - obs_data_t *hotkeys = - obs_data_get_obj(settings, "replay_hotkeys"); + obs_data_t *hotkeys = obs_data_get_obj(settings, "replay_hotkeys"); struct dstr name; obs_source_t *parent = obs_filter_get_parent(filter->source); if (parent) { @@ -474,17 +477,13 @@ static void start_replay_output(struct source_record_filter_context *filter, dstr_cat(&name, " - "); dstr_cat(&name, obs_source_get_name(filter->source)); } else { - dstr_init_copy(&name, - obs_source_get_name(filter->source)); + dstr_init_copy(&name, obs_source_get_name(filter->source)); } - filter->replayOutput = obs_output_create( - "replay_buffer", name.array, s, hotkeys); + filter->replayOutput = obs_output_create("replay_buffer", name.array, s, hotkeys); if (filter->remove_after_record) { - signal_handler_t *sh = obs_output_get_signal_handler( - filter->replayOutput); - signal_handler_connect(sh, "stop", remove_filter, - filter); + signal_handler_t *sh = obs_output_get_signal_handler(filter->replayOutput); + signal_handler_connect(sh, "stop", remove_filter, filter); } dstr_free(&name); obs_data_release(hotkeys); @@ -493,20 +492,14 @@ static void start_replay_output(struct source_record_filter_context *filter, } obs_data_release(s); if (filter->encoder) { - obs_encoder_set_video(filter->encoder, filter->video_output); - if (obs_output_get_video_encoder(filter->replayOutput) != - filter->encoder) - obs_output_set_video_encoder(filter->replayOutput, - filter->encoder); + update_video_encoder(filter, settings); } if (filter->aacTrack) { obs_encoder_set_audio(filter->aacTrack, filter->audio_output); - if (obs_output_get_audio_encoder(filter->replayOutput, 0) != - filter->aacTrack) - obs_output_set_audio_encoder(filter->replayOutput, - filter->aacTrack, 0); + if (obs_output_get_audio_encoder(filter->replayOutput, 0) != filter->aacTrack) + obs_output_set_audio_encoder(filter->replayOutput, filter->aacTrack, 0); } filter->starting_replay_output = true; @@ -514,87 +507,34 @@ static void start_replay_output(struct source_record_filter_context *filter, run_queued(start_replay_task, filter); } -static const char *get_encoder_id(obs_data_t *settings) -{ - const char *enc_id = obs_data_get_string(settings, "encoder"); - if (strlen(enc_id) == 0 || strcmp(enc_id, "x264") == 0 || - strcmp(enc_id, "x264_lowcpu") == 0) { - enc_id = "obs_x264"; - } else if (strcmp(enc_id, "qsv") == 0) { - enc_id = "obs_qsv11_v2"; - } else if (strcmp(enc_id, "qsv_av1") == 0) { - enc_id = "obs_qsv11_av1"; - } else if (strcmp(enc_id, "amd") == 0) { - enc_id = "h264_texture_amf"; - } else if (strcmp(enc_id, "amd_hevc") == 0) { - enc_id = "h265_texture_amf"; - } else if (strcmp(enc_id, "amd_av1") == 0) { - enc_id = "av1_texture_amf"; - } else if (strcmp(enc_id, "nvenc") == 0) { - enc_id = EncoderAvailable("jim_nvenc") ? "jim_nvenc" - : "ffmpeg_nvenc"; - } else if (strcmp(enc_id, "nvenc_hevc") == 0) { - enc_id = EncoderAvailable("jim_hevc_nvenc") - ? "jim_hevc_nvenc" - : "ffmpeg_hevc_nvenc"; - } else if (strcmp(enc_id, "nvenc_av1") == 0) { - enc_id = "jim_av1_nvenc"; - } else if (strcmp(enc_id, "apple_h264") == 0) { - enc_id = "com.apple.videotoolbox.videoencoder.ave.avc"; - } else if (strcmp(enc_id, "apple_hevc") == 0) { - enc_id = "com.apple.videotoolbox.videoencoder.ave.hevc"; - } - return enc_id; -} - static void source_record_filter_update(void *data, obs_data_t *settings) { struct source_record_filter_context *filter = data; - filter->remove_after_record = - obs_data_get_bool(settings, "remove_after_record"); - filter->record_max_seconds = - obs_data_get_int(settings, "record_max_seconds"); + filter->remove_after_record = obs_data_get_bool(settings, "remove_after_record"); + filter->record_max_seconds = obs_data_get_int(settings, "record_max_seconds"); const long long record_mode = obs_data_get_int(settings, "record_mode"); const long long stream_mode = obs_data_get_int(settings, "stream_mode"); - const bool replay_buffer = - obs_data_get_bool(settings, "replay_buffer") && - !filter->closing; - if (!filter->closing && - (record_mode != OUTPUT_MODE_NONE || - stream_mode != OUTPUT_MODE_NONE || replay_buffer)) { + const bool replay_buffer = obs_data_get_bool(settings, "replay_buffer") && !filter->closing; + if (!filter->closing && (record_mode != OUTPUT_MODE_NONE || stream_mode != OUTPUT_MODE_NONE || replay_buffer)) { + const char *enc_id = get_encoder_id(settings); - if (!filter->encoder || - strcmp(obs_encoder_get_id(filter->encoder), enc_id) != 0) { + if (!filter->encoder || strcmp(obs_encoder_get_id(filter->encoder), enc_id) != 0) { obs_encoder_release(filter->encoder); - filter->encoder = obs_video_encoder_create( - enc_id, obs_source_get_name(filter->source), - settings, NULL); + filter->encoder = obs_video_encoder_create(enc_id, obs_source_get_name(filter->source), settings, NULL); obs_encoder_set_scaled_size(filter->encoder, 0, 0); - obs_encoder_set_video(filter->encoder, - filter->video_output); - if (filter->fileOutput && - obs_output_get_video_encoder(filter->fileOutput) != - filter->encoder) - obs_output_set_video_encoder(filter->fileOutput, - filter->encoder); - if (filter->streamOutput && - obs_output_get_video_encoder( - filter->streamOutput) != filter->encoder) - obs_output_set_video_encoder( - filter->streamOutput, filter->encoder); - if (filter->replayOutput && - obs_output_get_video_encoder( - filter->replayOutput) != filter->encoder) - obs_output_set_video_encoder( - filter->replayOutput, filter->encoder); + obs_encoder_set_video(filter->encoder, filter->video_output); + if (filter->fileOutput && obs_output_get_video_encoder(filter->fileOutput) != filter->encoder) + obs_output_set_video_encoder(filter->fileOutput, filter->encoder); + if (filter->streamOutput && obs_output_get_video_encoder(filter->streamOutput) != filter->encoder) + obs_output_set_video_encoder(filter->streamOutput, filter->encoder); + if (filter->replayOutput && obs_output_get_video_encoder(filter->replayOutput) != filter->encoder) + obs_output_set_video_encoder(filter->replayOutput, filter->encoder); } else if (!obs_encoder_active(filter->encoder)) { obs_encoder_update(filter->encoder, settings); } const int audio_track = - obs_data_get_bool(settings, "different_audio") - ? (int)obs_data_get_int(settings, "audio_track") - : 0; + obs_data_get_bool(settings, "different_audio") ? (int)obs_data_get_int(settings, "audio_track") : 0; if (!filter->audio_output) { if (audio_track > 0) { filter->audio_output = obs_get_audio(); @@ -602,9 +542,7 @@ static void source_record_filter_update(void *data, obs_data_t *settings) struct audio_output_info oi = {0}; oi.name = obs_source_get_name(filter->source); oi.speakers = SPEAKERS_STEREO; - oi.samples_per_sec = - audio_output_get_sample_rate( - obs_get_audio()); + oi.samples_per_sec = audio_output_get_sample_rate(obs_get_audio()); oi.format = AUDIO_FORMAT_FLOAT_PLANAR; oi.input_param = filter; oi.input_callback = audio_input_callback; @@ -618,8 +556,7 @@ static void source_record_filter_update(void *data, obs_data_t *settings) struct audio_output_info oi = {0}; oi.name = obs_source_get_name(filter->source); oi.speakers = SPEAKERS_STEREO; - oi.samples_per_sec = - audio_output_get_sample_rate(obs_get_audio()); + oi.samples_per_sec = audio_output_get_sample_rate(obs_get_audio()); oi.format = AUDIO_FORMAT_FLOAT_PLANAR; oi.input_param = filter; oi.input_callback = audio_input_callback; @@ -632,28 +569,19 @@ static void source_record_filter_update(void *data, obs_data_t *settings) filter->aacTrack = NULL; } if (audio_track > 0) { - filter->aacTrack = obs_audio_encoder_create( - "ffmpeg_aac", - obs_source_get_name(filter->source), - NULL, audio_track - 1, NULL); + filter->aacTrack = obs_audio_encoder_create("ffmpeg_aac", obs_source_get_name(filter->source), NULL, + audio_track - 1, NULL); } else { - filter->aacTrack = obs_audio_encoder_create( - "ffmpeg_aac", - obs_source_get_name(filter->source), - NULL, 0, NULL); + filter->aacTrack = + obs_audio_encoder_create("ffmpeg_aac", obs_source_get_name(filter->source), NULL, 0, NULL); } if (filter->audio_output) - obs_encoder_set_audio(filter->aacTrack, - filter->audio_output); + obs_encoder_set_audio(filter->aacTrack, filter->audio_output); if (filter->fileOutput) - obs_output_set_audio_encoder(filter->fileOutput, - filter->aacTrack, - 0); + obs_output_set_audio_encoder(filter->fileOutput, filter->aacTrack, 0); if (filter->replayOutput) - obs_output_set_audio_encoder( - filter->replayOutput, filter->aacTrack, - 0); + obs_output_set_audio_encoder(filter->replayOutput, filter->aacTrack, 0); } filter->audio_track = audio_track; } @@ -662,43 +590,27 @@ static void source_record_filter_update(void *data, obs_data_t *settings) } else if (record_mode == OUTPUT_MODE_ALWAYS) { record = true; } else if (record_mode == OUTPUT_MODE_RECORDING) { - record = obs_frontend_recording_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPED; + record = obs_frontend_recording_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPED; } else if (record_mode == OUTPUT_MODE_STREAMING) { - record = obs_frontend_streaming_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPED; + record = obs_frontend_streaming_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPED; } else if (record_mode == OUTPUT_MODE_STREAMING_OR_RECORDING) { - record = (obs_frontend_streaming_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPED) || - (obs_frontend_recording_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPED); + record = (obs_frontend_streaming_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPED) || + (obs_frontend_recording_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPED); } else if (record_mode == OUTPUT_MODE_VIRTUAL_CAMERA) { - record = obs_frontend_virtualcam_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED; + record = obs_frontend_virtualcam_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED; } if (record != filter->record) { if (record) { - if (obs_source_enabled(filter->source) && - filter->video_output) + if (obs_source_enabled(filter->source) && filter->video_output) start_file_output(filter, settings); } else { if (filter->fileOutput) { - run_queued(stop_output_task, - filter->fileOutput); + run_queued(stop_output_task, filter->fileOutput); filter->fileOutput = NULL; } } @@ -707,30 +619,23 @@ static void source_record_filter_update(void *data, obs_data_t *settings) if (replay_buffer != filter->replayBuffer) { if (replay_buffer) { - if (obs_source_enabled(filter->source) && - filter->video_output) + if (obs_source_enabled(filter->source) && filter->video_output) start_replay_output(filter, settings); } else if (filter->replayOutput) { - obs_data_t *hotkeys = - obs_hotkeys_save_output(filter->replayOutput); + obs_data_t *hotkeys = obs_hotkeys_save_output(filter->replayOutput); obs_data_set_obj(settings, "replay_hotkeys", hotkeys); obs_data_release(hotkeys); - run_queued(force_stop_output_task, - filter->replayOutput); + run_queued(force_stop_output_task, filter->replayOutput); filter->replayOutput = NULL; } filter->replayBuffer = replay_buffer; - } else if (replay_buffer && filter->replayOutput && - obs_source_enabled(filter->source)) { - if (filter->replay_buffer_duration != - obs_data_get_int(settings, "replay_duration")) { - obs_data_t *hotkeys = - obs_hotkeys_save_output(filter->replayOutput); + } else if (replay_buffer && filter->replayOutput && obs_source_enabled(filter->source)) { + if (filter->replay_buffer_duration != obs_data_get_int(settings, "replay_duration")) { + obs_data_t *hotkeys = obs_hotkeys_save_output(filter->replayOutput); obs_data_set_obj(settings, "replay_hotkeys", hotkeys); obs_data_release(hotkeys); - run_queued(force_stop_output_task, - filter->replayOutput); + run_queued(force_stop_output_task, filter->replayOutput); filter->replayOutput = NULL; start_replay_output(filter, settings); } @@ -741,43 +646,27 @@ static void source_record_filter_update(void *data, obs_data_t *settings) } else if (stream_mode == OUTPUT_MODE_ALWAYS) { stream = true; } else if (stream_mode == OUTPUT_MODE_RECORDING) { - stream = obs_frontend_recording_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPED; + stream = obs_frontend_recording_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPED; } else if (stream_mode == OUTPUT_MODE_STREAMING) { - stream = obs_frontend_streaming_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPED; + stream = obs_frontend_streaming_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPED; } else if (stream_mode == OUTPUT_MODE_STREAMING_OR_RECORDING) { - stream = (obs_frontend_streaming_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_STREAMING_STOPPED) || - (obs_frontend_recording_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPING && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_RECORDING_STOPPED); + stream = (obs_frontend_streaming_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_STREAMING_STOPPED) || + (obs_frontend_recording_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPING && + filter->last_frontend_event != OBS_FRONTEND_EVENT_RECORDING_STOPPED); } else if (stream_mode == OUTPUT_MODE_VIRTUAL_CAMERA) { - stream = obs_frontend_virtualcam_active() && - filter->last_frontend_event != - OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED; + stream = obs_frontend_virtualcam_active() && filter->last_frontend_event != OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED; } if (stream != filter->stream) { if (stream) { - if (obs_source_enabled(filter->source) && - filter->video_output) + if (obs_source_enabled(filter->source) && filter->video_output) start_stream_output(filter, settings); } else { if (filter->streamOutput) { - run_queued(force_stop_output_task, - filter->streamOutput); + run_queued(force_stop_output_task, filter->streamOutput); filter->streamOutput = NULL; } } @@ -795,35 +684,27 @@ static void source_record_filter_update(void *data, obs_data_t *settings) } } - vec4_from_rgba(&filter->backgroundColor, - (uint32_t)obs_data_get_int(settings, "backgroundColor")); + vec4_from_rgba(&filter->backgroundColor, (uint32_t)obs_data_get_int(settings, "backgroundColor")); if (obs_data_get_bool(settings, "different_audio")) { - const char *source_name = - obs_data_get_string(settings, "audio_source"); + const char *source_name = obs_data_get_string(settings, "audio_source"); if (!strlen(source_name)) { if (filter->audio_source) { obs_weak_source_release(filter->audio_source); filter->audio_source = NULL; } } else { - obs_source_t *source = obs_weak_source_get_source( - filter->audio_source); + obs_source_t *source = obs_weak_source_get_source(filter->audio_source); if (source) obs_source_release(source); - if (!source || - strcmp(source_name, obs_source_get_name(source)) != - 0) { + if (!source || strcmp(source_name, obs_source_get_name(source)) != 0) { if (filter->audio_source) { - obs_weak_source_release( - filter->audio_source); + obs_weak_source_release(filter->audio_source); filter->audio_source = NULL; } source = obs_get_source_by_name(source_name); if (source) { - filter->audio_source = - obs_source_get_weak_source( - source); + filter->audio_source = obs_source_get_weak_source(source); obs_source_release(source); } } @@ -839,8 +720,7 @@ static void source_record_filter_save(void *data, obs_data_t *settings) { struct source_record_filter_context *filter = data; if (filter->replayOutput) { - obs_data_t *hotkeys = - obs_hotkeys_save_output(filter->replayOutput); + obs_data_t *hotkeys = obs_hotkeys_save_output(filter->replayOutput); obs_data_set_obj(settings, "replay_hotkeys", hotkeys); obs_data_release(hotkeys); } @@ -852,24 +732,16 @@ static void source_record_filter_defaults(obs_data_t *settings) const char *mode = config_get_string(config, "Output", "Mode"); const char *type = config_get_string(config, "AdvOut", "RecType"); - const char *adv_path = - strcmp(type, "Standard") != 0 || strcmp(type, "standard") != 0 - ? config_get_string(config, "AdvOut", "FFFilePath") - : config_get_string(config, "AdvOut", "RecFilePath"); - bool adv_out = strcmp(mode, "Advanced") == 0 || - strcmp(mode, "advanced") == 0; - const char *rec_path = - adv_out ? adv_path - : config_get_string(config, "SimpleOutput", "FilePath"); + const char *adv_path = strcmp(type, "Standard") != 0 || strcmp(type, "standard") != 0 + ? config_get_string(config, "AdvOut", "FFFilePath") + : config_get_string(config, "AdvOut", "RecFilePath"); + bool adv_out = strcmp(mode, "Advanced") == 0 || strcmp(mode, "advanced") == 0; + const char *rec_path = adv_out ? adv_path : config_get_string(config, "SimpleOutput", "FilePath"); obs_data_set_default_string(settings, "path", rec_path); - obs_data_set_default_string(settings, "filename_formatting", - config_get_string(config, "Output", - "FilenameFormatting")); - obs_data_set_default_string( - settings, "rec_format", - config_get_string(config, adv_out ? "AdvOut" : "SimpleOutput", - "RecFormat")); + obs_data_set_default_string(settings, "filename_formatting", config_get_string(config, "Output", "FilenameFormatting")); + obs_data_set_default_string(settings, "rec_format", + config_get_string(config, adv_out ? "AdvOut" : "SimpleOutput", "RecFormat")); obs_data_set_default_int(settings, "backgroundColor", 0); @@ -881,29 +753,22 @@ static void source_record_filter_defaults(obs_data_t *settings) else if (strcmp(enc_id, "jim_nvenc") == 0) enc_id = "nvenc"; else - obs_data_set_default_string(settings, "encoder", - enc_id); + obs_data_set_default_string(settings, "encoder", enc_id); } else { - const char *quality = - config_get_string(config, "SimpleOutput", "RecQuality"); - if (strcmp(quality, "Stream") == 0 || - strcmp(quality, "stream") == 0) { - enc_id = config_get_string(config, "SimpleOutput", - "StreamEncoder"); - } else if (strcmp(quality, "Lossless") == 0 || - strcmp(quality, "lossless") == 0) { + const char *quality = config_get_string(config, "SimpleOutput", "RecQuality"); + if (strcmp(quality, "Stream") == 0 || strcmp(quality, "stream") == 0) { + enc_id = config_get_string(config, "SimpleOutput", "StreamEncoder"); + } else if (strcmp(quality, "Lossless") == 0 || strcmp(quality, "lossless") == 0) { enc_id = "ffmpeg_output"; } else { - enc_id = config_get_string(config, "SimpleOutput", - "RecEncoder"); + enc_id = config_get_string(config, "SimpleOutput", "RecEncoder"); } obs_data_set_default_string(settings, "encoder", enc_id); } obs_data_set_default_int(settings, "replay_duration", 5); } -static void source_record_filter_filter_remove(void *data, - obs_source_t *parent); +static void source_record_filter_filter_remove(void *data, obs_source_t *parent); static void update_task(void *param) { @@ -914,30 +779,22 @@ static void update_task(void *param) static void frontend_event(enum obs_frontend_event event, void *data) { struct source_record_filter_context *context = data; - if (event == OBS_FRONTEND_EVENT_STREAMING_STARTING || - event == OBS_FRONTEND_EVENT_STREAMING_STARTED || - event == OBS_FRONTEND_EVENT_STREAMING_STOPPING || - event == OBS_FRONTEND_EVENT_STREAMING_STOPPED || - event == OBS_FRONTEND_EVENT_RECORDING_STARTING || - event == OBS_FRONTEND_EVENT_RECORDING_STARTED || - event == OBS_FRONTEND_EVENT_RECORDING_STOPPING || - event == OBS_FRONTEND_EVENT_RECORDING_STOPPED || - event == OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED || - event == OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED) { + if (event == OBS_FRONTEND_EVENT_STREAMING_STARTING || event == OBS_FRONTEND_EVENT_STREAMING_STARTED || + event == OBS_FRONTEND_EVENT_STREAMING_STOPPING || event == OBS_FRONTEND_EVENT_STREAMING_STOPPED || + event == OBS_FRONTEND_EVENT_RECORDING_STARTING || event == OBS_FRONTEND_EVENT_RECORDING_STARTED || + event == OBS_FRONTEND_EVENT_RECORDING_STOPPING || event == OBS_FRONTEND_EVENT_RECORDING_STOPPED || + event == OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED || event == OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED) { context->last_frontend_event = (int)event; obs_queue_task(OBS_TASK_GRAPHICS, update_task, data, false); - } else if (event == OBS_FRONTEND_EVENT_EXIT || - event == OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP) { + } else if (event == OBS_FRONTEND_EVENT_EXIT || event == OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP) { context->closing = true; } } -static void *source_record_filter_create(obs_data_t *settings, - obs_source_t *source) +static void *source_record_filter_create(obs_data_t *settings, obs_source_t *source) { - struct source_record_filter_context *context = - bzalloc(sizeof(struct source_record_filter_context)); + struct source_record_filter_context *context = bzalloc(sizeof(struct source_record_filter_context)); context->source = source; context->last_frontend_event = -1; @@ -954,8 +811,7 @@ static void source_record_delayed_destroy(void *data) run_queued(source_record_delayed_destroy, context); return; } - if (context->aacTrack && context->audio_track <= 0 && - obs_encoder_active(context->aacTrack)) { + if (context->aacTrack && context->audio_track <= 0 && obs_encoder_active(context->aacTrack)) { run_queued(source_record_delayed_destroy, context); return; } @@ -1011,8 +867,7 @@ static void source_record_filter_destroy(void *data) source_record_delayed_destroy(context); } -static bool source_record_enable_hotkey(void *data, obs_hotkey_pair_id id, - obs_hotkey_t *hotkey, bool pressed) +static bool source_record_enable_hotkey(void *data, obs_hotkey_pair_id id, obs_hotkey_t *hotkey, bool pressed) { UNUSED_PARAMETER(id); UNUSED_PARAMETER(hotkey); @@ -1027,8 +882,7 @@ static bool source_record_enable_hotkey(void *data, obs_hotkey_pair_id id, return true; } -static bool source_record_disable_hotkey(void *data, obs_hotkey_pair_id id, - obs_hotkey_t *hotkey, bool pressed) +static bool source_record_disable_hotkey(void *data, obs_hotkey_pair_id id, obs_hotkey_t *hotkey, bool pressed) { UNUSED_PARAMETER(id); UNUSED_PARAMETER(hotkey); @@ -1054,19 +908,15 @@ static void source_record_filter_tick(void *data, float seconds) if (context->enableHotkey == OBS_INVALID_HOTKEY_PAIR_ID) context->enableHotkey = obs_hotkey_pair_register_source( - parent, "source_record.enable", - obs_module_text("SourceRecordEnable"), - "source_record.disable", - obs_module_text("SourceRecordDisable"), - source_record_enable_hotkey, - source_record_disable_hotkey, context, context); + parent, "source_record.enable", obs_module_text("SourceRecordEnable"), "source_record.disable", + obs_module_text("SourceRecordDisable"), source_record_enable_hotkey, source_record_disable_hotkey, context, + context); uint32_t width = obs_source_get_width(parent); width += (width & 1); uint32_t height = obs_source_get_height(parent); height += (height & 1); - if (context->width != width || context->height != height || - (!context->video_output && width && height)) { + if (context->width != width || context->height != height || (!context->video_output && width && height)) { struct obs_video_info ovi = {0}; obs_get_video_info(&ovi); @@ -1109,13 +959,10 @@ static void source_record_filter_tick(void *data, float seconds) context->output_active = false; context->restart = false; obs_source_dec_showing(obs_filter_get_parent(context->source)); - } else if (!context->output_active && - obs_source_enabled(context->source) && - (context->replayBuffer || context->record || - context->stream)) { - if (context->starting_file_output || - context->starting_stream_output || - context->starting_replay_output || !context->video_output) + } else if (!context->output_active && obs_source_enabled(context->source) && + (context->replayBuffer || context->record || context->stream)) { + if (context->starting_file_output || context->starting_stream_output || context->starting_replay_output || + !context->video_output) return; obs_data_t *s = obs_source_get_settings(context->source); if (context->record) @@ -1125,8 +972,7 @@ static void source_record_filter_tick(void *data, float seconds) if (context->replayBuffer) start_replay_output(context, s); obs_data_release(s); - } else if (context->output_active && - !obs_source_enabled(context->source)) { + } else if (context->output_active && !obs_source_enabled(context->source)) { if (context->fileOutput) { run_queued(stop_output_task, context->fileOutput); context->fileOutput = NULL; @@ -1143,26 +989,21 @@ static void source_record_filter_tick(void *data, float seconds) obs_source_dec_showing(obs_filter_get_parent(context->source)); } - if (context->output_active && context->fileOutput && - context->record_max_seconds) { - int totalFrames = - obs_output_get_total_frames(context->fileOutput); + if (context->output_active && context->fileOutput && context->record_max_seconds) { + int totalFrames = obs_output_get_total_frames(context->fileOutput); video_t *video = obs_output_video(context->fileOutput); uint64_t frameTimeNs = video_output_get_frame_time(video); - long long msecs = - util_mul_div64(totalFrames, frameTimeNs, 1000000ULL); + long long msecs = util_mul_div64(totalFrames, frameTimeNs, 1000000ULL); if (msecs >= context->record_max_seconds * 1000) { obs_data_t *settings = obs_data_create(); - obs_data_set_int(settings, "record_mode", - OUTPUT_MODE_NONE); + obs_data_set_int(settings, "record_mode", OUTPUT_MODE_NONE); obs_source_update(context->source, settings); obs_data_release(settings); } } } -static bool encoder_changed(void *data, obs_properties_t *props, - obs_property_t *property, obs_data_t *settings) +static bool encoder_changed(void *data, obs_properties_t *props, obs_property_t *property, obs_data_t *settings) { UNUSED_PARAMETER(data); UNUSED_PARAMETER(property); @@ -1172,9 +1013,7 @@ static bool encoder_changed(void *data, obs_properties_t *props, const char *enc_id = get_encoder_id(settings); obs_properties_t *enc_props = obs_get_encoder_properties(enc_id); if (enc_props) { - obs_properties_add_group(props, "encoder_group", - obs_encoder_get_display_name(enc_id), - OBS_GROUP_NORMAL, enc_props); + obs_properties_add_group(props, "encoder_group", obs_encoder_get_display_name(enc_id), OBS_GROUP_NORMAL, enc_props); } obs_properties_add_text( props, "plugin_info", @@ -1189,11 +1028,9 @@ static bool list_add_audio_sources(void *data, obs_source_t *source) obs_property_t *p = data; const uint32_t flags = obs_source_get_output_flags(source); if ((flags & OBS_SOURCE_COMPOSITE) != 0) { - obs_property_list_add_string(p, obs_source_get_name(source), - obs_source_get_name(source)); + obs_property_list_add_string(p, obs_source_get_name(source), obs_source_get_name(source)); } else if ((flags & OBS_SOURCE_AUDIO) != 0) { - obs_property_list_add_string(p, obs_source_get_name(source), - obs_source_get_name(source)); + obs_property_list_add_string(p, obs_source_get_name(source), obs_source_get_name(source)); } return true; } @@ -1204,30 +1041,19 @@ static obs_properties_t *source_record_filter_properties(void *data) obs_properties_t *record = obs_properties_create(); - obs_property_t *p = obs_properties_add_list( - record, "record_mode", obs_module_text("RecordMode"), - OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); + obs_property_t *p = obs_properties_add_list(record, "record_mode", obs_module_text("RecordMode"), OBS_COMBO_TYPE_LIST, + OBS_COMBO_FORMAT_INT); obs_property_list_add_int(p, obs_module_text("None"), OUTPUT_MODE_NONE); - obs_property_list_add_int(p, obs_module_text("Always"), - OUTPUT_MODE_ALWAYS); - obs_property_list_add_int(p, obs_module_text("Streaming"), - OUTPUT_MODE_STREAMING); - obs_property_list_add_int(p, obs_module_text("Recording"), - OUTPUT_MODE_RECORDING); - obs_property_list_add_int(p, obs_module_text("StreamingOrRecording"), - OUTPUT_MODE_STREAMING_OR_RECORDING); - obs_property_list_add_int(p, obs_module_text("VirtualCamera"), - OUTPUT_MODE_VIRTUAL_CAMERA); - - obs_properties_add_path(record, "path", obs_module_text("Path"), - OBS_PATH_DIRECTORY, NULL, NULL); - obs_properties_add_text(record, "filename_formatting", - obs_module_text("FilenameFormatting"), - OBS_TEXT_DEFAULT); - p = obs_properties_add_list(record, "rec_format", - obs_module_text("RecFormat"), - OBS_COMBO_TYPE_EDITABLE, + obs_property_list_add_int(p, obs_module_text("Always"), OUTPUT_MODE_ALWAYS); + obs_property_list_add_int(p, obs_module_text("Streaming"), OUTPUT_MODE_STREAMING); + obs_property_list_add_int(p, obs_module_text("Recording"), OUTPUT_MODE_RECORDING); + obs_property_list_add_int(p, obs_module_text("StreamingOrRecording"), OUTPUT_MODE_STREAMING_OR_RECORDING); + obs_property_list_add_int(p, obs_module_text("VirtualCamera"), OUTPUT_MODE_VIRTUAL_CAMERA); + + obs_properties_add_path(record, "path", obs_module_text("Path"), OBS_PATH_DIRECTORY, NULL, NULL); + obs_properties_add_text(record, "filename_formatting", obs_module_text("FilenameFormatting"), OBS_TEXT_DEFAULT); + p = obs_properties_add_list(record, "rec_format", obs_module_text("RecFormat"), OBS_COMBO_TYPE_EDITABLE, OBS_COMBO_FORMAT_STRING); obs_property_list_add_string(p, "flv", "flv"); obs_property_list_add_string(p, "mp4", "mp4"); @@ -1236,62 +1062,43 @@ static obs_properties_t *source_record_filter_properties(void *data) obs_property_list_add_string(p, "ts", "ts"); obs_property_list_add_string(p, "m3u8", "m3u8"); - obs_properties_add_int(record, "record_max_seconds", - obs_module_text("MaxSeconds"), 0, 100000, 1); + obs_properties_add_int(record, "record_max_seconds", obs_module_text("MaxSeconds"), 0, 100000, 1); - obs_properties_add_group(props, "record", obs_module_text("Record"), - OBS_GROUP_NORMAL, record); + obs_properties_add_group(props, "record", obs_module_text("Record"), OBS_GROUP_NORMAL, record); obs_properties_t *replay = obs_properties_create(); - p = obs_properties_add_int(replay, "replay_duration", - obs_module_text("Duration"), 1, 1000, 1); + p = obs_properties_add_int(replay, "replay_duration", obs_module_text("Duration"), 1, 1000, 1); obs_property_int_set_suffix(p, "s"); - obs_properties_add_group(props, "replay_buffer", - obs_module_text("ReplayBuffer"), - OBS_GROUP_CHECKABLE, replay); + obs_properties_add_group(props, "replay_buffer", obs_module_text("ReplayBuffer"), OBS_GROUP_CHECKABLE, replay); obs_properties_t *stream = obs_properties_create(); - p = obs_properties_add_list(stream, "stream_mode", - obs_module_text("StreamMode"), - OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); + p = obs_properties_add_list(stream, "stream_mode", obs_module_text("StreamMode"), OBS_COMBO_TYPE_LIST, + OBS_COMBO_FORMAT_INT); obs_property_list_add_int(p, obs_module_text("None"), OUTPUT_MODE_NONE); - obs_property_list_add_int(p, obs_module_text("Always"), - OUTPUT_MODE_ALWAYS); - obs_property_list_add_int(p, obs_module_text("Streaming"), - OUTPUT_MODE_STREAMING); - obs_property_list_add_int(p, obs_module_text("Recording"), - OUTPUT_MODE_RECORDING); - obs_property_list_add_int(p, obs_module_text("StreamingOrRecording"), - OUTPUT_MODE_STREAMING_OR_RECORDING); - obs_property_list_add_int(p, obs_module_text("VirtualCamera"), - OUTPUT_MODE_VIRTUAL_CAMERA); - - obs_properties_add_text(stream, "server", obs_module_text("Server"), - OBS_TEXT_DEFAULT); - obs_properties_add_text(stream, "key", obs_module_text("Key"), - OBS_TEXT_PASSWORD); - - obs_properties_add_group(props, "stream", obs_module_text("Stream"), - OBS_GROUP_NORMAL, stream); + obs_property_list_add_int(p, obs_module_text("Always"), OUTPUT_MODE_ALWAYS); + obs_property_list_add_int(p, obs_module_text("Streaming"), OUTPUT_MODE_STREAMING); + obs_property_list_add_int(p, obs_module_text("Recording"), OUTPUT_MODE_RECORDING); + obs_property_list_add_int(p, obs_module_text("StreamingOrRecording"), OUTPUT_MODE_STREAMING_OR_RECORDING); + obs_property_list_add_int(p, obs_module_text("VirtualCamera"), OUTPUT_MODE_VIRTUAL_CAMERA); + + obs_properties_add_text(stream, "server", obs_module_text("Server"), OBS_TEXT_DEFAULT); + obs_properties_add_text(stream, "key", obs_module_text("Key"), OBS_TEXT_PASSWORD); + + obs_properties_add_group(props, "stream", obs_module_text("Stream"), OBS_GROUP_NORMAL, stream); obs_properties_t *background = obs_properties_create(); - obs_properties_add_color(background, "backgroundColor", - obs_module_text("BackgroundColor")); + obs_properties_add_color(background, "backgroundColor", obs_module_text("BackgroundColor")); - obs_properties_add_group(props, "background", - obs_module_text("Background"), - OBS_GROUP_NORMAL, background); + obs_properties_add_group(props, "background", obs_module_text("Background"), OBS_GROUP_NORMAL, background); obs_properties_t *audio = obs_properties_create(); - p = obs_properties_add_list(audio, "audio_track", - obs_module_text("AudioTrack"), - OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); + p = obs_properties_add_list(audio, "audio_track", obs_module_text("AudioTrack"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); obs_property_list_add_int(p, obs_module_text("None"), 0); const char *track = obs_module_text("Track"); for (int i = 1; i <= MAX_AUDIO_MIXES; i++) { @@ -1300,53 +1107,36 @@ static obs_properties_t *source_record_filter_properties(void *data) obs_property_list_add_int(p, buffer, i); } - p = obs_properties_add_list(audio, "audio_source", - obs_module_text("Source"), - OBS_COMBO_TYPE_EDITABLE, + p = obs_properties_add_list(audio, "audio_source", obs_module_text("Source"), OBS_COMBO_TYPE_EDITABLE, OBS_COMBO_FORMAT_STRING); obs_enum_sources(list_add_audio_sources, p); obs_enum_scenes(list_add_audio_sources, p); - obs_properties_add_group(props, "different_audio", - obs_module_text("DifferentAudio"), - OBS_GROUP_CHECKABLE, audio); + obs_properties_add_group(props, "different_audio", obs_module_text("DifferentAudio"), OBS_GROUP_CHECKABLE, audio); - p = obs_properties_add_list(props, "encoder", - obs_module_text("Encoder"), - OBS_COMBO_TYPE_LIST, - OBS_COMBO_FORMAT_STRING); + p = obs_properties_add_list(props, "encoder", obs_module_text("Encoder"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING); obs_property_list_add_string(p, obs_module_text("Software"), "x264"); if (EncoderAvailable("obs_qsv11")) - obs_property_list_add_string(p, obs_module_text("QSV.H264"), - "qsv"); + obs_property_list_add_string(p, obs_module_text("QSV.H264"), "qsv"); if (EncoderAvailable("obs_qsv11_av1")) - obs_property_list_add_string(p, obs_module_text("QSV.AV1"), - "qsv_av1"); + obs_property_list_add_string(p, obs_module_text("QSV.AV1"), "qsv_av1"); if (EncoderAvailable("ffmpeg_nvenc")) - obs_property_list_add_string(p, obs_module_text("NVENC.H264"), - "nvenc"); + obs_property_list_add_string(p, obs_module_text("NVENC.H264"), "nvenc"); if (EncoderAvailable("jim_av1_nvenc")) - obs_property_list_add_string(p, obs_module_text("NVENC.AV1"), - "nvenc_av1"); + obs_property_list_add_string(p, obs_module_text("NVENC.AV1"), "nvenc_av1"); if (EncoderAvailable("h265_texture_amf")) - obs_property_list_add_string(p, obs_module_text("AMD.HEVC"), - "amd_hevc"); + obs_property_list_add_string(p, obs_module_text("AMD.HEVC"), "amd_hevc"); if (EncoderAvailable("ffmpeg_hevc_nvenc")) - obs_property_list_add_string(p, obs_module_text("NVENC.HEVC"), - "nvenc_hevc"); + obs_property_list_add_string(p, obs_module_text("NVENC.HEVC"), "nvenc_hevc"); if (EncoderAvailable("h264_texture_amf")) - obs_property_list_add_string(p, obs_module_text("AMD.H264"), - "amd"); + obs_property_list_add_string(p, obs_module_text("AMD.H264"), "amd"); if (EncoderAvailable("av1_texture_amf")) - obs_property_list_add_string(p, obs_module_text("AMD.AV1"), - "amd_av1"); + obs_property_list_add_string(p, obs_module_text("AMD.AV1"), "amd_av1"); if (EncoderAvailable("com.apple.videotoolbox.videoencoder.ave.avc")) - obs_property_list_add_string(p, obs_module_text("Apple.H264"), - "apple_h264"); + obs_property_list_add_string(p, obs_module_text("Apple.H264"), "apple_h264"); if (EncoderAvailable("com.apple.videotoolbox.videoencoder.ave.hevc")) - obs_property_list_add_string(p, obs_module_text("Apple.HEVC"), - "apple_hevc"); + obs_property_list_add_string(p, obs_module_text("Apple.HEVC"), "apple_hevc"); const char *enc_id = NULL; size_t i = 0; @@ -1354,8 +1144,7 @@ static obs_properties_t *source_record_filter_properties(void *data) if (obs_get_encoder_type(enc_id) != OBS_ENCODER_VIDEO) continue; const uint32_t caps = obs_get_encoder_caps(enc_id); - if ((caps & (OBS_ENCODER_CAP_DEPRECATED | - OBS_ENCODER_CAP_INTERNAL)) != 0) + if ((caps & (OBS_ENCODER_CAP_DEPRECATED | OBS_ENCODER_CAP_INTERNAL)) != 0) continue; const char *name = obs_encoder_get_display_name(enc_id); obs_property_list_add_string(p, name, enc_id); @@ -1363,9 +1152,7 @@ static obs_properties_t *source_record_filter_properties(void *data) obs_property_set_modified_callback2(p, encoder_changed, data); obs_properties_t *group = obs_properties_create(); - obs_properties_add_group(props, "encoder_group", - obs_module_text("Encoder"), OBS_GROUP_NORMAL, - group); + obs_properties_add_group(props, "encoder_group", obs_module_text("Encoder"), OBS_GROUP_NORMAL, group); return props; } @@ -1433,11 +1220,9 @@ static void find_filter(obs_source_t *parent, obs_source_t *child, void *param) *filter = child; } -static void find_source_by_filter(obs_source_t *parent, obs_source_t *child, - void *param) +static void find_source_by_filter(obs_source_t *parent, obs_source_t *child, void *param) { - if (strcmp(obs_source_get_unversioned_id(child), - "source_record_filter") != 0) + if (strcmp(obs_source_get_unversioned_id(child), "source_record_filter") != 0) return; DARRAY(obs_source_t *) *sources = param; @@ -1450,9 +1235,7 @@ static bool find_source(void *data, obs_source_t *source) return true; } -obs_source_t *get_source_record_filter(obs_source_t *source, - obs_data_t *request_data, - obs_data_t *response_data, bool create) +obs_source_t *get_source_record_filter(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data, bool create) { const char *filter_name = obs_data_get_string(request_data, "filter"); obs_source_t *filter = NULL; @@ -1461,21 +1244,16 @@ obs_source_t *get_source_record_filter(obs_source_t *source, filter = obs_source_get_filter_by_name(source, filter_name); if (!filter) { if (response_data) - obs_data_set_string(response_data, "error", - "filter not found"); + obs_data_set_string(response_data, "error", "filter not found"); return NULL; } - if (strcmp(obs_source_get_unversioned_id(filter), - "source_record_filter") != 0) { + if (strcmp(obs_source_get_unversioned_id(filter), "source_record_filter") != 0) { if (response_data) - obs_data_set_string( - response_data, "error", - "filter is not source record filter"); + obs_data_set_string(response_data, "error", "filter is not source record filter"); obs_source_release(filter); return NULL; } - struct source_record_filter_context *context = - obs_obj_get_data(filter); + struct source_record_filter_context *context = obs_obj_get_data(filter); if (context && context->output_active) { context->restart = true; } @@ -1485,42 +1263,29 @@ obs_source_t *get_source_record_filter(obs_source_t *source, if (!filter) { if (!create) { if (response_data) - obs_data_set_string( - response_data, "error", - "failed to find filter"); + obs_data_set_string(response_data, "error", "failed to find filter"); return NULL; } - const char *filename = - obs_data_get_string(request_data, "filename"); + const char *filename = obs_data_get_string(request_data, "filename"); if (!strlen(filename)) { - filename = config_get_string( - config, "Output", "FilenameFormatting"); + filename = config_get_string(config, "Output", "FilenameFormatting"); } obs_data_t *settings = obs_data_create(); - obs_data_set_bool(settings, "remove_after_record", - true); - char *filter_name = os_generate_formatted_filename( - NULL, true, filename); - filter = obs_source_get_filter_by_name(source, - filter_name); + obs_data_set_bool(settings, "remove_after_record", true); + char *filter_name = os_generate_formatted_filename(NULL, true, filename); + filter = obs_source_get_filter_by_name(source, filter_name); if (!filter) { - filter = obs_source_create( - "source_record_filter", filter_name, - settings, NULL); - } else if (strcmp(obs_source_get_unversioned_id(filter), - "source_record_filter") != 0) { + filter = obs_source_create("source_record_filter", filter_name, settings, NULL); + } else if (strcmp(obs_source_get_unversioned_id(filter), "source_record_filter") != 0) { if (response_data) - obs_data_set_string( - response_data, "error", - "filter is not source record filter"); + obs_data_set_string(response_data, "error", "filter is not source record filter"); obs_source_release(filter); bfree(filter_name); obs_data_release(settings); return NULL; } else { - struct source_record_filter_context *context = - obs_obj_get_data(filter); + struct source_record_filter_context *context = obs_obj_get_data(filter); if (context && context->output_active) { context->restart = true; } @@ -1529,9 +1294,7 @@ obs_source_t *get_source_record_filter(obs_source_t *source, obs_data_release(settings); if (!filter) { if (response_data) - obs_data_set_string( - response_data, "error", - "failed to create filter"); + obs_data_set_string(response_data, "error", "failed to create filter"); return NULL; } obs_source_filter_add(source, filter); @@ -1542,11 +1305,9 @@ obs_source_t *get_source_record_filter(obs_source_t *source, return filter; } -static bool start_record_source(obs_source_t *source, obs_data_t *request_data, - obs_data_t *response_data) +static bool start_record_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, true); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, true); if (!filter) return false; obs_data_t *settings = obs_source_get_settings(filter); @@ -1554,16 +1315,10 @@ static bool start_record_source(obs_source_t *source, obs_data_t *request_data, struct source_record_filter_context *context = obs_obj_get_data(filter); if (context && context->output_active) { if (strlen(filename)) { - if (strstr(filename, "%") || - strcmp(filename, - obs_data_get_string( - settings, "filename_formatting")) != - 0) { + if (strstr(filename, "%") || strcmp(filename, obs_data_get_string(settings, "filename_formatting")) != 0) { context->restart = true; } - } else if (strstr(obs_data_get_string(settings, - "filename_formatting"), - "%")) { + } else if (strstr(obs_data_get_string(settings, "filename_formatting"), "%")) { context->restart = true; } } @@ -1571,8 +1326,7 @@ static bool start_record_source(obs_source_t *source, obs_data_t *request_data, if (strlen(filename)) obs_data_set_string(settings, "filename_formatting", filename); if (obs_data_has_user_value(request_data, "max_seconds")) - obs_data_set_int(settings, "record_max_seconds", - obs_data_get_int(request_data, "max_seconds")); + obs_data_set_int(settings, "record_max_seconds", obs_data_get_int(request_data, "max_seconds")); obs_data_set_int(settings, "record_mode", OUTPUT_MODE_ALWAYS); obs_source_update(filter, settings); @@ -1582,11 +1336,9 @@ static bool start_record_source(obs_source_t *source, obs_data_t *request_data, return true; } -static bool stop_record_source(obs_source_t *source, obs_data_t *request_data, - obs_data_t *response_data) +static bool stop_record_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, false); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, false); if (!filter) return false; @@ -1598,8 +1350,7 @@ static bool stop_record_source(obs_source_t *source, obs_data_t *request_data, return true; } -static void websocket_start_record(obs_data_t *request_data, - obs_data_t *response_data, void *param) +static void websocket_start_record(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1607,39 +1358,32 @@ static void websocket_start_record(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } if (obs_data_get_bool(request_data, "stop_existing")) stop_record_source(source, request_data, NULL); - success = start_record_source(source, request_data, - response_data); + success = start_record_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = start_record_source(sources.array[i], - request_data, - response_data) && - success; + success = start_record_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } obs_data_set_bool(response_data, "success", success); } -static void websocket_stop_record(obs_data_t *request_data, - obs_data_t *response_data, void *param) +static void websocket_stop_record(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1647,41 +1391,32 @@ static void websocket_stop_record(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } - success = - stop_record_source(source, request_data, response_data); + success = stop_record_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = stop_record_source(sources.array[i], - request_data, - response_data) && - success; + success = stop_record_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } obs_data_set_bool(response_data, "success", success); } -static bool start_replay_buffer_source(obs_source_t *source, - obs_data_t *request_data, - obs_data_t *response_data) +static bool start_replay_buffer_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, true); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, true); if (!filter) return false; obs_data_t *settings = obs_source_get_settings(filter); @@ -1689,16 +1424,10 @@ static bool start_replay_buffer_source(obs_source_t *source, struct source_record_filter_context *context = obs_obj_get_data(filter); if (context && context->output_active) { if (strlen(filename)) { - if (strstr(filename, "%") || - strcmp(filename, - obs_data_get_string( - settings, "filename_formatting")) != - 0) { + if (strstr(filename, "%") || strcmp(filename, obs_data_get_string(settings, "filename_formatting")) != 0) { context->restart = true; } - } else if (strstr(obs_data_get_string(settings, - "filename_formatting"), - "%")) { + } else if (strstr(obs_data_get_string(settings, "filename_formatting"), "%")) { context->restart = true; } } @@ -1715,12 +1444,9 @@ static bool start_replay_buffer_source(obs_source_t *source, return true; } -static bool stop_replay_buffer_source(obs_source_t *source, - obs_data_t *request_data, - obs_data_t *response_data) +static bool stop_replay_buffer_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, false); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, false); if (!filter) return false; @@ -1732,12 +1458,9 @@ static bool stop_replay_buffer_source(obs_source_t *source, return true; } -static bool save_replay_buffer_source(obs_source_t *source, - obs_data_t *request_data, - obs_data_t *response_data) +static bool save_replay_buffer_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, false); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, false); if (!filter) return false; struct source_record_filter_context *context = obs_obj_get_data(filter); @@ -1752,9 +1475,7 @@ static bool save_replay_buffer_source(obs_source_t *source, return success; } -static void websocket_start_replay_buffer(obs_data_t *request_data, - obs_data_t *response_data, - void *param) +static void websocket_start_replay_buffer(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1762,39 +1483,32 @@ static void websocket_start_replay_buffer(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } if (obs_data_get_bool(request_data, "stop_existing")) stop_replay_buffer_source(source, request_data, NULL); - success = start_replay_buffer_source(source, request_data, - response_data); + success = start_replay_buffer_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = start_replay_buffer_source(sources.array[i], - request_data, - response_data) && - success; + success = start_replay_buffer_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } obs_data_set_bool(response_data, "success", success); } -static void websocket_stop_replay_buffer(obs_data_t *request_data, - obs_data_t *response_data, void *param) +static void websocket_stop_replay_buffer(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1802,37 +1516,30 @@ static void websocket_stop_replay_buffer(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } - success = stop_replay_buffer_source(source, request_data, - response_data); + success = stop_replay_buffer_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = stop_replay_buffer_source(sources.array[i], - request_data, - response_data) && - success; + success = stop_replay_buffer_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } obs_data_set_bool(response_data, "success", success); } -static void websocket_save_replay_buffer(obs_data_t *request_data, - obs_data_t *response_data, void *param) +static void websocket_save_replay_buffer(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1840,40 +1547,32 @@ static void websocket_save_replay_buffer(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } - success = save_replay_buffer_source(source, request_data, - response_data); + success = save_replay_buffer_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = save_replay_buffer_source(sources.array[i], - request_data, - response_data) && - success; + success = save_replay_buffer_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } obs_data_set_bool(response_data, "success", success); } -static bool start_stream_source(obs_source_t *source, obs_data_t *request_data, - obs_data_t *response_data) +static bool start_stream_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, true); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, true); if (!filter) return false; obs_data_t *settings = obs_source_get_settings(filter); @@ -1895,11 +1594,9 @@ static bool start_stream_source(obs_source_t *source, obs_data_t *request_data, return true; } -static bool stop_stream_source(obs_source_t *source, obs_data_t *request_data, - obs_data_t *response_data) +static bool stop_stream_source(obs_source_t *source, obs_data_t *request_data, obs_data_t *response_data) { - obs_source_t *filter = get_source_record_filter(source, request_data, - response_data, false); + obs_source_t *filter = get_source_record_filter(source, request_data, response_data, false); if (!filter) return false; @@ -1911,8 +1608,7 @@ static bool stop_stream_source(obs_source_t *source, obs_data_t *request_data, return true; } -static void websocket_start_stream(obs_data_t *request_data, - obs_data_t *response_data, void *param) +static void websocket_start_stream(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1920,39 +1616,32 @@ static void websocket_start_stream(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } if (obs_data_get_bool(request_data, "stop_existing")) stop_stream_source(source, request_data, NULL); - success = start_stream_source(source, request_data, - response_data); + success = start_stream_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = start_stream_source(sources.array[i], - request_data, - response_data) && - success; + success = start_stream_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } obs_data_set_bool(response_data, "success", success); } -static void websocket_stop_stream(obs_data_t *request_data, - obs_data_t *response_data, void *param) +static void websocket_stop_stream(obs_data_t *request_data, obs_data_t *response_data, void *param) { UNUSED_PARAMETER(param); const char *source_name = obs_data_get_string(request_data, "source"); @@ -1960,29 +1649,23 @@ static void websocket_stop_stream(obs_data_t *request_data, if (strlen(source_name)) { obs_source_t *source = obs_get_source_by_name(source_name); if (!source) { - obs_data_set_string(response_data, "error", - "source not found"); + obs_data_set_string(response_data, "error", "source not found"); obs_data_set_bool(response_data, "success", false); return; } - success = - stop_stream_source(source, request_data, response_data); + success = stop_stream_source(source, request_data, response_data); obs_source_release(source); } else { DARRAY(obs_source_t *) sources = {0}; obs_enum_sources(find_source, &sources); obs_enum_scenes(find_source, &sources); if (!sources.num) { - obs_data_set_string(response_data, "error", - "no source found"); + obs_data_set_string(response_data, "error", "no source found"); obs_data_set_bool(response_data, "success", false); return; } for (size_t i = 0; i < sources.num; i++) { - success = stop_stream_source(sources.array[i], - request_data, - response_data) && - success; + success = stop_stream_source(sources.array[i], request_data, response_data) && success; } da_free(sources); } @@ -1995,23 +1678,13 @@ bool obs_module_load(void) obs_register_source(&source_record_filter_info); vendor = obs_websocket_register_vendor("source-record"); - obs_websocket_vendor_register_request(vendor, "record_start", - websocket_start_record, NULL); - obs_websocket_vendor_register_request(vendor, "record_stop", - websocket_stop_record, NULL); - obs_websocket_vendor_register_request(vendor, "replay_buffer_start", - websocket_start_replay_buffer, - NULL); - obs_websocket_vendor_register_request(vendor, "replay_buffer_stop", - websocket_stop_replay_buffer, - NULL); - obs_websocket_vendor_register_request(vendor, "replay_buffer_save", - websocket_save_replay_buffer, - NULL); - obs_websocket_vendor_register_request(vendor, "stream_start", - websocket_start_stream, NULL); - obs_websocket_vendor_register_request(vendor, "stream_stop", - websocket_stop_stream, NULL); + obs_websocket_vendor_register_request(vendor, "record_start", websocket_start_record, NULL); + obs_websocket_vendor_register_request(vendor, "record_stop", websocket_stop_record, NULL); + obs_websocket_vendor_register_request(vendor, "replay_buffer_start", websocket_start_replay_buffer, NULL); + obs_websocket_vendor_register_request(vendor, "replay_buffer_stop", websocket_stop_replay_buffer, NULL); + obs_websocket_vendor_register_request(vendor, "replay_buffer_save", websocket_save_replay_buffer, NULL); + obs_websocket_vendor_register_request(vendor, "stream_start", websocket_start_stream, NULL); + obs_websocket_vendor_register_request(vendor, "stream_stop", websocket_stop_stream, NULL); return true; }