From 7fcec77351532bf5abcfe5b0aa756b51d3e803f3 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 21 Feb 2014 21:05:21 -0700 Subject: [PATCH] For *_update, apply settings instead of replacing Make it so obs_data settings input in to *_update are applied to the existing settings rather than fully replace the existing settings. That way you can update with only certain specific settings, leaving other settings untouched. Of course if you're already using the original settings pointer in the first place then you've already done that, so it'll just ignore it because you've already applied them. --- libobs/media-io/audio-io.c | 2 +- libobs/obs-data.c | 24 ++++++++++++++++++++++++ libobs/obs-data.h | 14 ++------------ libobs/obs-encoder.c | 2 +- libobs/obs-output.c | 2 +- libobs/obs-source.c | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/libobs/media-io/audio-io.c b/libobs/media-io/audio-io.c index a34c9b008..22550f74c 100644 --- a/libobs/media-io/audio-io.c +++ b/libobs/media-io/audio-io.c @@ -689,7 +689,7 @@ static inline void mul_vol_u8bit(void *array, float volume, size_t total_num) int32_t vol = (int32_t)(volume * 127.0f); for (size_t i = 0; i < total_num; i++) { - int32_t val = (int32_t)(vals[i] ^ 0x80) << 8; + int32_t val = (int32_t)vals[i] - 128; int32_t output = val * vol / 127; vals[i] = (uint8_t)(CLAMP(output, MIN_S8, MAX_S8) + 128); } diff --git a/libobs/obs-data.c b/libobs/obs-data.c index 484e7f617..efdae4abf 100644 --- a/libobs/obs-data.c +++ b/libobs/obs-data.c @@ -274,6 +274,7 @@ void obs_data_release(obs_data_t data) const char *obs_data_getjson(obs_data_t data) { /* TODO */ +#pragma message ("TODO: implement obs_data_getjson") return data->json; } @@ -340,6 +341,29 @@ static inline void set_item_def(struct obs_data *data, const char *name, set_item_data(data, item, name, ptr, size, type); } +static inline void copy_item(struct obs_data *data, struct obs_data_item *item) +{ + const char *name = get_item_name(item); + void *ptr = get_item_data(item); + + set_item(data, name, ptr, item->data_len, item->type); +} + +void obs_data_apply(obs_data_t target, obs_data_t apply_data) +{ + struct obs_data_item *item; + + if (!target || !apply_data || target == apply_data) + return; + + item = apply_data->first_item; + + while (item) { + copy_item(target, item); + item = item->next; + } +} + void obs_data_erase(obs_data_t data, const char *name) { struct obs_data_item *item = get_item(data, name); diff --git a/libobs/obs-data.h b/libobs/obs-data.h index 5fd01a2b8..3fea971d5 100644 --- a/libobs/obs-data.h +++ b/libobs/obs-data.h @@ -56,6 +56,8 @@ EXPORT void obs_data_release(obs_data_t data); EXPORT const char *obs_data_getjson(obs_data_t data); +EXPORT void obs_data_apply(obs_data_t target, obs_data_t apply_data); + EXPORT void obs_data_erase(obs_data_t data, const char *name); /* Set functions */ @@ -150,18 +152,6 @@ static inline obs_data_t obs_data_newref(obs_data_t data) return data; } -static inline void obs_data_replace(obs_data_t *current, obs_data_t replacement) -{ - if (!current) - return; - - if (*current != replacement) { - replacement = obs_data_newref(replacement); - obs_data_release(*current); - *current = replacement; - } -} - #ifdef __cplusplus } #endif diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index 444c5e3e9..8b3ccbe45 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -100,7 +100,7 @@ void obs_encoder_update(obs_encoder_t encoder, obs_data_t settings) { if (!encoder) return; - obs_data_replace(&encoder->settings, settings); + obs_data_apply(encoder->settings, settings); encoder->info.update(encoder->data, encoder->settings); } diff --git a/libobs/obs-output.c b/libobs/obs-output.c index 1582802e5..cf6795e58 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -102,7 +102,7 @@ obs_properties_t obs_output_properties(const char *id, const char *locale) void obs_output_update(obs_output_t output, obs_data_t settings) { - obs_data_replace(&output->settings, settings); + obs_data_apply(output->settings, settings); if (output->info.update) output->info.update(output->data, output->settings); diff --git a/libobs/obs-source.c b/libobs/obs-source.c index af46e9647..0d0c41964 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -292,7 +292,7 @@ uint32_t obs_source_get_output_flags(obs_source_t source) void obs_source_update(obs_source_t source, obs_data_t settings) { - obs_data_replace(&source->settings, settings); + obs_data_apply(source->settings, settings); if (source->info.update) source->info.update(source->data, source->settings);