• OBS插件学习入门:一个非常简单的、调节音量的filter


    一个非常简单的、调节音量的filter,非线性调节:

    #include <obs-module.h>
    #include <math.h>
    
    struct volume_data {
        obs_source_t *context;
        size_t channels;
        float factor;
    };
    
    static const char *volume_name(void *unused)
    {
        UNUSED_PARAMETER(unused);
        return obs_module_text("Volume");
    }
    
    static void volume_destroy(void *data)
    {
        struct volume_data *gf = data;
        bfree(gf);
    }
    
    static void volume_update(void *data, obs_data_t *s)
    {
        struct volume_data *gf = data;
        double val = obs_data_get_double(s, "volume");
        gf->channels = audio_output_get_channels(obs_get_audio());
        gf->factor = (float)val;
    }
    
    static void *volume_create(obs_data_t *settings, obs_source_t *filter)
    {
        struct volume_data *gf = bzalloc(sizeof(*gf));
        gf->context = filter;
        volume_update(gf, settings);
        return gf;
    }
    
    static struct obs_audio_data *volume_filter_audio(void *data, struct obs_audio_data *audio)
    {
        struct volume_data *gf = data;
        const size_t channels = gf->channels;
        float **adata = (float**)audio->data;
        const float factor = gf->factor;
    
        for (size_t c = 0; c < channels; c++) {
            if (audio->data[c]) {
                for (size_t i = 0; i < audio->frames; i++) {
                    adata[c][i] *= factor;
                }
            }
        }
    
        return audio;
    }
    
    static void volume_defaults(obs_data_t *s)
    {
        obs_data_set_default_double(s, "volume", 1.0f);
    }
    
    static obs_properties_t *volume_properties(void *data)
    {
        obs_properties_t *ppts = obs_properties_create();
    
        obs_properties_add_float_slider(ppts, "volume", "Volume", 0, 1.0, 0.1);
    
        UNUSED_PARAMETER(data);
        return ppts;
    }
    
    struct obs_source_info volume_filter = {
        .id = "volume_filter",
        .type = OBS_SOURCE_TYPE_FILTER,
        .output_flags = OBS_SOURCE_AUDIO,
        .get_name = volume_name,
        .create = volume_create,
        .destroy = volume_destroy,
        .update = volume_update,
        .filter_audio = volume_filter_audio,
        .get_defaults = volume_defaults,
        .get_properties = volume_properties,
    };

  • 相关阅读:
    个人报告04
    个人报告03
    构建之法阅读笔记07
    个人报告02
    第二次冲刺个人报告01
    第二阶段个人总结5
    第十三周学习进度情况
    第二阶段个人总结4(5.28)
    第二阶段个人总结3(5.27)
    课堂作业之找小水王
  • 原文地址:https://www.cnblogs.com/swnuwangyun/p/8117135.html
Copyright © 2020-2023  润新知