gain-filter.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <obs-module.h>
  2. #include <media-io/audio-math.h>
  3. #include <math.h>
  4. #define do_log(level, format, ...) \
  5. blog(level, "[gain filter: '%s'] " format, \
  6. obs_source_get_name(gf->context), ##__VA_ARGS__)
  7. #define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
  8. #define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__)
  9. #define S_GAIN_DB "db"
  10. #define MT_ obs_module_text
  11. #define TEXT_GAIN_DB MT_("Gain.GainDB")
  12. struct gain_data {
  13. obs_source_t *context;
  14. size_t channels;
  15. float multiple;
  16. };
  17. static const char *gain_name(void *unused)
  18. {
  19. UNUSED_PARAMETER(unused);
  20. return obs_module_text("Gain");
  21. }
  22. static void gain_destroy(void *data)
  23. {
  24. struct gain_data *gf = data;
  25. bfree(gf);
  26. }
  27. static void gain_update(void *data, obs_data_t *s)
  28. {
  29. struct gain_data *gf = data;
  30. double val = obs_data_get_double(s, S_GAIN_DB);
  31. gf->channels = audio_output_get_channels(obs_get_audio());
  32. gf->multiple = db_to_mul((float)val);
  33. }
  34. static void *gain_create(obs_data_t *settings, obs_source_t *filter)
  35. {
  36. struct gain_data *gf = bzalloc(sizeof(*gf));
  37. gf->context = filter;
  38. gain_update(gf, settings);
  39. return gf;
  40. }
  41. static struct obs_audio_data *gain_filter_audio(void *data,
  42. struct obs_audio_data *audio)
  43. {
  44. struct gain_data *gf = data;
  45. const size_t channels = gf->channels;
  46. float **adata = (float **)audio->data;
  47. const float multiple = gf->multiple;
  48. for (size_t c = 0; c < channels; c++) {
  49. if (audio->data[c]) {
  50. for (size_t i = 0; i < audio->frames; i++) {
  51. adata[c][i] *= multiple;
  52. }
  53. }
  54. }
  55. return audio;
  56. }
  57. static void gain_defaults(obs_data_t *s)
  58. {
  59. obs_data_set_default_double(s, S_GAIN_DB, 0.0f);
  60. }
  61. static obs_properties_t *gain_properties(void *data)
  62. {
  63. obs_properties_t *ppts = obs_properties_create();
  64. obs_property_t *p = obs_properties_add_float_slider(
  65. ppts, S_GAIN_DB, TEXT_GAIN_DB, -30.0, 30.0, 0.1);
  66. obs_property_float_set_suffix(p, " dB");
  67. UNUSED_PARAMETER(data);
  68. return ppts;
  69. }
  70. struct obs_source_info gain_filter = {
  71. .id = "gain_filter",
  72. .type = OBS_SOURCE_TYPE_FILTER,
  73. .output_flags = OBS_SOURCE_AUDIO,
  74. .get_name = gain_name,
  75. .create = gain_create,
  76. .destroy = gain_destroy,
  77. .update = gain_update,
  78. .filter_audio = gain_filter_audio,
  79. .get_defaults = gain_defaults,
  80. .get_properties = gain_properties,
  81. };