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

时间:2022-09-01 16:45:21

一个非常简单的、调节音量的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 = ; c < channels; c++) {
if (audio->data[c]) {
for (size_t i = ; 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", , 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,
};

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

OBS插件学习入门:一个非常简单的、调节音量的filter的更多相关文章

  1. phpunit测试学习 1:一点简单的扼要有用的东西的总结 一点入门认识

    16:45 2015/12/8phpunit测试学习 1:一点简单的扼要有用的东西的总结  一点入门认识 具体的入门安装和入门实践请参照文中的推荐博客或网上其他博客推荐博客,我感觉这几篇博客写得很不错 ...

  2. 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破

    我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...

  3. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  4. SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)

    SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...

  5. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...

  6. Win32 程序开发入门:一个最简单的Win32程序

    一.什么是 Win32 Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境. 这里再介绍下 Win32 Applicatio ...

  7. 001&period;Delphi插件之QPlugins,一个最简单的插件

    安装QPlugins里面的Demo,复制粘贴着写了一个最简单的插件,看看好不好用 EXE代码如下: unit Main_Frm; interface uses Winapi.Windows, Wina ...

  8. 2,turicreate入门 - 一个简单的回归模型

    turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...

  9. Python学习 - 编写一个简单的web框架(一)

    自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...

随机推荐

  1. PostgreSQL隐藏字段tableoid

    问题来源: 今天群里有人问:tableoid字段在每行都有,而且一个表里面的值是重复的,这样不合理...... 因此做了一些分析: 1)创建了一个表 apple=# \d test_time Tabl ...

  2. 经历alidns在国外的严重延时

    有个域名,是在国外1und1申请的,但dns的解析,国外的空间的功能弱爆了. 之前是放在dnspod,后来又试过dnspod的海外, 最后放回alidns,之前一直都很好的. 这2天国内没问题,在德国 ...

  3. CentOS7安装memcached

    三台linux服务器系统CentOS7 一台memcached IP:192.168.155.134 一台Apache IP:192.168.155.130 一台nginx IP:192.168.15 ...

  4. 403&period;14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for &quot&semi;IIS APPPOOL&bsol;ASP&period;NET v4&period;0&quot&semi;问题

    问题1: 发布mvc3报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ...

  5. Page directive must not have multiple occurrences of pageencoding

    一个jsp文件中不能同时出现两个 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #932192 } pageE ...

  6. UNIX网络编程——非阻塞connect

    当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行.我们接着使用select检测这个连接或成功或失败的已建 ...

  7. &lbrack;git&rsqb; 常用配置

    基本配置 对git进行配置时使用 git config 命令进行操作 1. git config 的作用域,缺省等于 local git config --local   #只针对某个仓库有效 git ...

  8. POJ1113 Wall【凸包】

    题意: 求把城堡围起来需要的最小墙壁周长. 思路: 围墙周长为=n条平行于凸包的线段+n条圆弧的长度=凸包周长+围墙离城堡距离L为半径的圆周长. 代码: ...还是看大佬写的,自己做个记录方便日后复习 ...

  9. js 获取格林尼治时间戳

    昨天在一论坛里看到有朋友问 js 如何获取格林尼治时间戳.不少朋友第一反应是 toGMTString ...确实可以得到格林尼治时间,但不是时间戳.虽然我也没有啥好的方法一步到位的获取,不过至少是获取 ...

  10. 在ASP&period;NET里实现计算器代码的封装

    一.具体代码 Default2.aspx.cs public partial class Chapter1_Default2 : System.Web.UI.Page { protected void ...