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

  1. #include <obs-module.h>
  2. #include <math.h>
  3.  
  4. struct volume_data {
  5. obs_source_t *context;
  6. size_t channels;
  7. float factor;
  8. };
  9.  
  10. static const char *volume_name(void *unused)
  11. {
  12. UNUSED_PARAMETER(unused);
  13. return obs_module_text("Volume");
  14. }
  15.  
  16. static void volume_destroy(void *data)
  17. {
  18. struct volume_data *gf = data;
  19. bfree(gf);
  20. }
  21.  
  22. static void volume_update(void *data, obs_data_t *s)
  23. {
  24. struct volume_data *gf = data;
  25. double val = obs_data_get_double(s, "volume");
  26. gf->channels = audio_output_get_channels(obs_get_audio());
  27. gf->factor = (float)val;
  28. }
  29.  
  30. static void *volume_create(obs_data_t *settings, obs_source_t *filter)
  31. {
  32. struct volume_data *gf = bzalloc(sizeof(*gf));
  33. gf->context = filter;
  34. volume_update(gf, settings);
  35. return gf;
  36. }
  37.  
  38. static struct obs_audio_data *volume_filter_audio(void *data, struct obs_audio_data *audio)
  39. {
  40. struct volume_data *gf = data;
  41. const size_t channels = gf->channels;
  42. float **adata = (float**)audio->data;
  43. const float factor = gf->factor;
  44.  
  45. for (size_t c = ; c < channels; c++) {
  46. if (audio->data[c]) {
  47. for (size_t i = ; i < audio->frames; i++) {
  48. adata[c][i] *= factor;
  49. }
  50. }
  51. }
  52.  
  53. return audio;
  54. }
  55.  
  56. static void volume_defaults(obs_data_t *s)
  57. {
  58. obs_data_set_default_double(s, "volume", 1.0f);
  59. }
  60.  
  61. static obs_properties_t *volume_properties(void *data)
  62. {
  63. obs_properties_t *ppts = obs_properties_create();
  64.  
  65. obs_properties_add_float_slider(ppts, "volume", "Volume", , 1.0, 0.1);
  66.  
  67. UNUSED_PARAMETER(data);
  68. return ppts;
  69. }
  70.  
  71. struct obs_source_info volume_filter = {
  72. .id = "volume_filter",
  73. .type = OBS_SOURCE_TYPE_FILTER,
  74. .output_flags = OBS_SOURCE_AUDIO,
  75. .get_name = volume_name,
  76. .create = volume_create,
  77. .destroy = volume_destroy,
  78. .update = volume_update,
  79. .filter_audio = volume_filter_audio,
  80. .get_defaults = volume_defaults,
  81. .get_properties = volume_properties,
  82. };

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.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. HDU - 5592 ZYB's Premutation (权值线段树)

    题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...

  2. ASP.NET Core EF 查询获取导航属性值,使用Include封装

    // 引用 using Microsoft.EntityFrameworkCore; // 摘要: // Specifies related entities to include in the qu ...

  3. centos上传下载文件

    1.在windows上安装SecureCRT 2.在centos上安装rzsz软件:yum install lrzsz 3.rz命令上传文件到centos 4.sz命令发送文件到windows

  4. iOS 动态调用方法

      - (void)bugly { dispatch_async(dispatch_get_global_queue(0, 0), ^{ if (NSClassFromString(@"Bu ...

  5. Oracle trunc()函数,decode()函数,substr函数,GREATEST函数,java中substring函数的用法

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...

  6. window连接linux共享

    前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.168.1.200 帐号:def 密码:456 共享文件夹: ...

  7. SQL Server 2016 特性和安装方法

    SQL Server 2016 特性: 全程加密技术(Always Encrypted),动态数据屏蔽(Dynamic Data Masking),JSON支持,多TempDB数据库文件,PolyBa ...

  8. 如何用纯 CSS 创作气泡填色的按钮特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKqZjy 可交互视频 ...

  9. 20145216史婧瑶《Java程序设计》第10周学习总结

    20145216 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 一.网络概述 网络编程就是两个或多个设备(程序)之间的数据交换. 识别网络上的每个设备:①IP地址②域名 ...

  10. 20145312《Java第一次实验报告》

    20145312<Java第一次实验报告> Java开发环境的熟悉(Windows+Idea) 一.实验内容 使用Idea编辑.编译.运行.调试Java程序. 使用JDK编译.运行简单的J ...