├── NEWS ├── AUTHORS ├── Makefile.am ├── ChangeLog ├── README ├── README.md ├── autogen.sh ├── src ├── Makefile.am ├── viperfx_so.c ├── gstviperfx.h ├── viperfx_so.h └── gstviperfx.c ├── COPYING └── configure.ac /NEWS: -------------------------------------------------------------------------------- 1 | Nothing much yet. 2 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Jason 2 | -------------------------------------------------------------------------------- /Makefile.am: -------------------------------------------------------------------------------- 1 | SUBDIRS = src 2 | 3 | EXTRA_DIST = autogen.sh 4 | -------------------------------------------------------------------------------- /ChangeLog: -------------------------------------------------------------------------------- 1 | 2017-09-21 Jason 2 | 3 | * initial creation 4 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | WHAT IT IS 2 | ---------- 3 | 4 | gst-plugin-viperfx is a viperfx core wrapper plug-in for GStreamer. 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gst-plugin-viperfx 2 | ViPER FX core wrapper plug-in for GStreamer1
3 | In order to use this plug-in, you need the ViPER FX core.
4 | Please check https://github.com/vipersaudio/viperfx_core_binary for more information.
5 | -------------------------------------------------------------------------------- /autogen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # you can either set the environment variables AUTOCONF, AUTOHEADER, AUTOMAKE, 3 | # ACLOCAL, AUTOPOINT and/or LIBTOOLIZE to the right versions, or leave them 4 | # unset and get the defaults 5 | 6 | autoreconf --verbose --force --install --make || { 7 | echo 'autogen.sh failed'; 8 | exit 1; 9 | } 10 | 11 | ./configure || { 12 | echo 'configure failed'; 13 | exit 1; 14 | } 15 | 16 | echo 17 | echo "Now type 'make' to compile this module." 18 | echo 19 | -------------------------------------------------------------------------------- /src/Makefile.am: -------------------------------------------------------------------------------- 1 | # Note: plugindir is set in configure 2 | 3 | plugin_LTLIBRARIES = libgstviperfx.la 4 | 5 | # sources used to compile this plug-in 6 | libgstviperfx_la_SOURCES = gstviperfx.c viperfx_so.c 7 | 8 | # compiler and linker flags used to compile this plugin, set in configure.ac 9 | libgstviperfx_la_CFLAGS = $(GST_CFLAGS) 10 | libgstviperfx_la_LIBADD = $(GST_LIBS) 11 | libgstviperfx_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -rdynamic -ldl 12 | libgstviperfx_la_LIBTOOLFLAGS = --tag=disable-static 13 | 14 | # headers we need but don't want installed 15 | noinst_HEADERS = gstviperfx.h viperfx_so.h 16 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | Non-GPL 2 | 3 | 在使用这里的文件时,请务必接受下述内容: 4 | 1、本仓库里的内容绝对禁止以GPL协议来使用(可以使用LGPL)。 5 | 2、本仓库里的内容绝对禁止用在商业用途,包括相关联的广告用途、品牌用途等。 6 | 3、使用后,请在软件醒目位置标示“蝰蛇声学”的版权。 7 | 4、当你对本仓库的内容以任何形式重分发时,请携带这里所述的所有内容,确保使用者或接收者明确这些条款。 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | 11 | Please be sure to read the following terms when using the ViPER FX core: 12 | 1. MUST NOT use it under GPL license (exclude LGPL). 13 | 2. The ViPER FX cores are all restrict disallowed in commercial use (exclude nonprofit charities). 14 | 3. Please add a copyright information ("Copyright (C) 2010-2017 ViPER ACOUSTICS") of the ViPER FX core in your software when you use it. 15 | 4. When you redistribute the contents of this repository in any form, please bring all of the contents described here to ensure that the users or recipients specify these terms. 16 | 17 | -------------------------------------------------------------------------------- /src/viperfx_so.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "viperfx_so.h" 6 | 7 | #define ViPERFX_SO "libviperfx.so" 8 | #define ViPERFX_ENTRYPOINT "viperfx_create_instance" 9 | 10 | void* viperfx_load_library (const char * so_path_name) 11 | { 12 | if (so_path_name == NULL) { 13 | return dlopen (ViPERFX_SO, RTLD_NOW); 14 | } else { 15 | return dlopen (so_path_name, RTLD_NOW); 16 | } 17 | } 18 | 19 | void viperfx_unload_library (void * handle) 20 | { 21 | if (handle == NULL) 22 | return; 23 | dlclose (handle); 24 | } 25 | 26 | fn_viperfx_ep query_viperfx_entrypoint (void * handle) 27 | { 28 | if (handle == NULL) 29 | return NULL; 30 | return (fn_viperfx_ep)dlsym ( 31 | handle, ViPERFX_ENTRYPOINT); 32 | } 33 | 34 | int viperfx_command_set_px4_vx4x1 (viperfx_interface * intf, 35 | int32_t param, int32_t value) 36 | { 37 | int32_t cmd_data[3]; 38 | cmd_data[0] = param; 39 | cmd_data[1] = sizeof(int32_t) * 1; 40 | cmd_data[2] = value; 41 | 42 | if (intf->command (intf, COMMAND_CODE_SET, 43 | sizeof(cmd_data), cmd_data, NULL, NULL) != 0) { 44 | return FALSE; 45 | } 46 | return TRUE; 47 | } 48 | 49 | int viperfx_command_set_px4_vx4x2 (viperfx_interface * intf, 50 | int32_t param, int32_t value_l, int32_t value_h) 51 | { 52 | int32_t cmd_data[4]; 53 | cmd_data[0] = param; 54 | cmd_data[1] = sizeof(int32_t) * 2; 55 | cmd_data[2] = value_l; 56 | cmd_data[3] = value_h; 57 | 58 | if (intf->command (intf, COMMAND_CODE_SET, 59 | sizeof(cmd_data), cmd_data, NULL, NULL) != 0) { 60 | return FALSE; 61 | } 62 | return TRUE; 63 | } 64 | 65 | int viperfx_command_set_px4_vx4x3 (viperfx_interface * intf, 66 | int32_t param, int32_t value_l, int32_t value_h, int32_t value_e) 67 | { 68 | int32_t cmd_data[5]; 69 | cmd_data[0] = param; 70 | cmd_data[1] = sizeof(int32_t) * 3; 71 | cmd_data[2] = value_l; 72 | cmd_data[3] = value_h; 73 | cmd_data[4] = value_e; 74 | 75 | if (intf->command (intf, COMMAND_CODE_SET, 76 | sizeof(cmd_data), cmd_data, NULL, NULL) != 0) { 77 | return FALSE; 78 | } 79 | return TRUE; 80 | } 81 | 82 | int viperfx_command_set_ir_path (viperfx_interface * intf, 83 | const char * pathname) 84 | { 85 | char cmd_data[4 + 256]; 86 | int32_t * cmd_data_int = (int32_t *)cmd_data; 87 | 88 | if (strlen (pathname) >= 256) 89 | return FALSE; 90 | 91 | memset (cmd_data, 0, sizeof(cmd_data)); 92 | cmd_data_int[0] = PARAM_HPFX_CONV_UPDATEKERNEL; 93 | cmd_data_int[1] = 256; 94 | cmd_data_int[2] = (int32_t)strlen (pathname); 95 | memcpy (&cmd_data_int[3], 96 | pathname, strlen (pathname)); 97 | 98 | if (intf->command (intf, COMMAND_CODE_SET, 99 | sizeof(cmd_data), cmd_data, NULL, NULL) != 0) { 100 | return FALSE; 101 | } 102 | return TRUE; 103 | } 104 | -------------------------------------------------------------------------------- /configure.ac: -------------------------------------------------------------------------------- 1 | dnl required version of autoconf 2 | AC_PREREQ([2.53]) 3 | 4 | dnl package name and package version 5 | AC_INIT([viperfx-plugin],[1.0.0]) 6 | 7 | dnl required versions of gstreamer and plugins-base 8 | GST_REQUIRED=1.0.0 9 | GSTPB_REQUIRED=1.0.0 10 | 11 | AC_CONFIG_SRCDIR([src/gstviperfx.c]) 12 | AC_CONFIG_HEADERS([config.h]) 13 | 14 | dnl required version of automake 15 | AM_INIT_AUTOMAKE([1.10]) 16 | 17 | dnl enable mainainer mode by default 18 | AM_MAINTAINER_MODE([enable]) 19 | 20 | dnl check for tools (compiler etc.) 21 | AC_PROG_CC 22 | 23 | dnl required version of libtool 24 | LT_PREREQ([2.2.6]) 25 | LT_INIT 26 | 27 | dnl give error and exit if we don't have pkgconfig 28 | AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, [ ], [ 29 | AC_MSG_ERROR([You need to have pkg-config installed!]) 30 | ]) 31 | 32 | dnl Check for the required version of GStreamer core (and gst-plugins-base) 33 | dnl This will export GST_CFLAGS and GST_LIBS variables for use in Makefile.am 34 | dnl 35 | dnl If you need libraries from gst-plugins-base here, also add: 36 | dnl for libgstaudio-1.0: gstreamer-audio-1.0 >= $GST_REQUIRED 37 | dnl for libgstvideo-1.0: gstreamer-video-1.0 >= $GST_REQUIRED 38 | dnl for libgsttag-1.0: gstreamer-tag-1.0 >= $GST_REQUIRED 39 | dnl for libgstpbutils-1.0: gstreamer-pbutils-1.0 >= $GST_REQUIRED 40 | dnl for libgstfft-1.0: gstreamer-fft-1.0 >= $GST_REQUIRED 41 | dnl for libgstinterfaces-1.0: gstreamer-interfaces-1.0 >= $GST_REQUIRED 42 | dnl for libgstrtp-1.0: gstreamer-rtp-1.0 >= $GST_REQUIRED 43 | dnl for libgstrtsp-1.0: gstreamer-rtsp-1.0 >= $GST_REQUIRED 44 | dnl etc. 45 | PKG_CHECK_MODULES(GST, [ 46 | gstreamer-1.0 >= $GST_REQUIRED 47 | gstreamer-base-1.0 >= $GST_REQUIRED 48 | gstreamer-controller-1.0 >= $GST_REQUIRED 49 | gstreamer-audio-1.0 >= $GST_REQUIRED 50 | ], [ 51 | AC_SUBST(GST_CFLAGS) 52 | AC_SUBST(GST_LIBS) 53 | ], [ 54 | AC_MSG_ERROR([ 55 | You need to install or upgrade the GStreamer development 56 | packages on your system. On debian-based systems these are 57 | libgstreamer1.0-dev and libgstreamer-plugins-base1.0-dev. 58 | on RPM-based systems gstreamer1.0-devel, libgstreamer1.0-devel 59 | or similar. The minimum version required is $GST_REQUIRED. 60 | ]) 61 | ]) 62 | 63 | dnl check if compiler understands -Wall (if yes, add -Wall to GST_CFLAGS) 64 | AC_MSG_CHECKING([to see if compiler understands -Wall]) 65 | save_CFLAGS="$CFLAGS" 66 | CFLAGS="$CFLAGS -Wall" 67 | AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ ], [ ])], [ 68 | GST_CFLAGS="$GST_CFLAGS -Wall" 69 | AC_MSG_RESULT([yes]) 70 | ], [ 71 | AC_MSG_RESULT([no]) 72 | ]) 73 | 74 | dnl set the plugindir where plugins should be installed (for src/Makefile.am) 75 | if test "x${prefix}" = "x$HOME"; then 76 | plugindir="$HOME/.gstreamer-1.0/plugins" 77 | else 78 | plugindir="\$(libdir)/gstreamer-1.0" 79 | fi 80 | AC_SUBST(plugindir) 81 | 82 | dnl set proper LDFLAGS for plugins 83 | GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' 84 | AC_SUBST(GST_PLUGIN_LDFLAGS) 85 | 86 | AC_CONFIG_FILES([Makefile src/Makefile]) 87 | AC_OUTPUT 88 | -------------------------------------------------------------------------------- /src/gstviperfx.h: -------------------------------------------------------------------------------- 1 | #ifndef __GST_VIPERFX_H__ 2 | #define __GST_VIPERFX_H__ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "viperfx_so.h" 9 | 10 | G_BEGIN_DECLS 11 | 12 | #define GST_TYPE_VIPERFX (gst_viperfx_get_type()) 13 | #define GST_VIPERFX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIPERFX,Gstviperfx)) 14 | #define GST_VIPERFX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_VIPERFX,GstviperfxClass)) 15 | #define GST_VIPERFX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_VIPERFX,GstviperfxClass)) 16 | #define GST_IS_VIPERFX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIPERFX)) 17 | #define GST_IS_VIPERFX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_VIPERFX)) 18 | 19 | typedef struct _Gstviperfx Gstviperfx; 20 | typedef struct _GstviperfxClass GstviperfxClass; 21 | 22 | struct _Gstviperfx { 23 | GstAudioFilter audiofilter; 24 | 25 | /* properties */ 26 | // global enable 27 | gboolean fx_enabled; 28 | // convolver 29 | gboolean conv_enabled; 30 | gchar conv_ir_path[256]; 31 | gint32 conv_cc_level; 32 | // vhe 33 | gboolean vhe_enabled; 34 | gint32 vhe_level; 35 | // vse 36 | gboolean vse_enabled; 37 | gint32 vse_ref_bark; 38 | gint32 vse_bark_cons; 39 | // equalizer 40 | gboolean eq_enabled; 41 | gint32 eq_band_level[10]; 42 | // colorful music 43 | gboolean colm_enabled; 44 | gint32 colm_widening; 45 | gint32 colm_midimage; 46 | gint32 colm_depth; 47 | // diff surr 48 | gboolean ds_enabled; 49 | gint32 ds_level; 50 | // reverb 51 | gboolean reverb_enabled; 52 | gint32 reverb_roomsize; 53 | gint32 reverb_width; 54 | gint32 reverb_damp; 55 | gint32 reverb_wet; 56 | gint32 reverb_dry; 57 | // agc 58 | gboolean agc_enabled; 59 | gint32 agc_ratio; 60 | gint32 agc_volume; 61 | gint32 agc_maxgain; 62 | // viper bass 63 | gboolean vb_enabled; 64 | gint32 vb_mode; 65 | gint32 vb_freq; 66 | gint32 vb_gain; 67 | // viper clarity 68 | gboolean vc_enabled; 69 | gint32 vc_mode; 70 | gint32 vc_level; 71 | // cure 72 | gboolean cure_enabled; 73 | gint32 cure_level; 74 | // tube 75 | gboolean tube_enabled; 76 | // analog-x 77 | gboolean ax_enabled; 78 | gint32 ax_mode; 79 | // fet compressor 80 | gboolean fetcomp_enabled; 81 | gint32 fetcomp_threshold; 82 | gint32 fetcomp_ratio; 83 | gint32 fetcomp_kneewidth; 84 | gboolean fetcomp_autoknee; 85 | gint32 fetcomp_gain; 86 | gboolean fetcomp_autogain; 87 | gint32 fetcomp_attack; 88 | gboolean fetcomp_autoattack; 89 | gint32 fetcomp_release; 90 | gboolean fetcomp_autorelease; 91 | gint32 fetcomp_meta_kneemulti; 92 | gint32 fetcomp_meta_maxattack; 93 | gint32 fetcomp_meta_maxrelease; 94 | gint32 fetcomp_meta_crest; 95 | gint32 fetcomp_meta_adapt; 96 | gboolean fetcomp_noclip; 97 | // output volume 98 | gint32 out_volume; 99 | // output pan 100 | gint32 out_pan; 101 | // limiter 102 | gint32 lim_threshold; 103 | 104 | /* < private > */ 105 | void *so_handle; 106 | fn_viperfx_ep so_entrypoint; 107 | viperfx_interface *vfx; 108 | GMutex lock; 109 | }; 110 | 111 | struct _GstviperfxClass { 112 | GstAudioFilterClass parent_class; 113 | }; 114 | 115 | GType gst_viperfx_get_type (void); 116 | 117 | G_END_DECLS 118 | 119 | #endif /* __GST_VIPERFX_H__ */ 120 | -------------------------------------------------------------------------------- /src/viperfx_so.h: -------------------------------------------------------------------------------- 1 | #ifndef _VIPERFX_SO_H 2 | #define _VIPERFX_SO_H 3 | 4 | #include 5 | 6 | #ifdef __cplusplus 7 | extern "C" { 8 | #endif 9 | 10 | #ifndef TRUE 11 | #define TRUE 1 12 | #endif 13 | #ifndef FALSE 14 | #define FALSE 0 15 | #endif 16 | 17 | enum 18 | { 19 | COMMAND_CODE_GET = 0x01, 20 | COMMAND_CODE_SET, 21 | }; 22 | 23 | enum 24 | { 25 | PARAM_GET_STATUS_BEGIN = 0x08000, 26 | PARAM_GET_DRIVER_VERSION, 27 | PARAM_GET_NEONENABLED, 28 | PARAM_GET_ENABLED, 29 | PARAM_GET_DRVCANWORK, 30 | PARAM_GET_EFFECT_TYPE, 31 | PARAM_GET_SAMPLINGRATE, 32 | PARAM_GET_CONVKNLID, 33 | PARAM_GET_STATUS_END 34 | }; 35 | 36 | enum 37 | { 38 | PARAM_SET_STATUS_BEGIN = 0x09000, 39 | PARAM_SET_RESET_STATUS, 40 | PARAM_SET_SAMPLINGRATE, 41 | PARAM_SET_DOPROCESS_STATUS, 42 | PARAM_SET_STATUS_END 43 | }; 44 | 45 | enum 46 | { 47 | PARAM_PROCESSUNIT_FX_BEGIN = 0x10000, 48 | 49 | PARAM_FX_TYPE_SWITCH, 50 | PARAM_HPFX_CONV_PROCESS_ENABLED, 51 | PARAM_HPFX_CONV_UPDATEKERNEL, 52 | /*****************************************/ 53 | // Please use PARAM_HPFX_CONV_UPDATEKERNEL instead 54 | PARAM_HPFX_CONV_PREPAREBUFFER, 55 | PARAM_HPFX_CONV_SETBUFFER, 56 | PARAM_HPFX_CONV_COMMITBUFFER, 57 | /*****************************************/ 58 | PARAM_HPFX_CONV_CROSSCHANNEL, 59 | PARAM_HPFX_VHE_PROCESS_ENABLED, 60 | PARAM_HPFX_VHE_EFFECT_LEVEL, 61 | PARAM_HPFX_VDDC_PROCESS_ENABLED, 62 | PARAM_HPFX_VDDC_COEFFS, 63 | PARAM_HPFX_VSE_PROCESS_ENABLED, 64 | PARAM_HPFX_VSE_REFERENCE_BARK, 65 | PARAM_HPFX_VSE_BARK_RECONSTRUCT, 66 | PARAM_HPFX_FIREQ_PROCESS_ENABLED, 67 | PARAM_HPFX_FIREQ_BANDLEVEL, 68 | PARAM_HPFX_COLM_PROCESS_ENABLED, 69 | PARAM_HPFX_COLM_WIDENING, 70 | PARAM_HPFX_COLM_MIDIMAGE, 71 | PARAM_HPFX_COLM_DEPTH, 72 | PARAM_HPFX_DIFFSURR_PROCESS_ENABLED, 73 | PARAM_HPFX_DIFFSURR_DELAYTIME, 74 | PARAM_HPFX_REVB_PROCESS_ENABLED, 75 | PARAM_HPFX_REVB_ROOMSIZE, 76 | PARAM_HPFX_REVB_WIDTH, 77 | PARAM_HPFX_REVB_DAMP, 78 | PARAM_HPFX_REVB_WET, 79 | PARAM_HPFX_REVB_DRY, 80 | PARAM_HPFX_AGC_PROCESS_ENABLED, 81 | PARAM_HPFX_AGC_RATIO, 82 | PARAM_HPFX_AGC_VOLUME, 83 | PARAM_HPFX_AGC_MAXSCALER, 84 | PARAM_HPFX_DYNSYS_PROCESS_ENABLED, 85 | PARAM_HPFX_DYNSYS_XCOEFFS, 86 | PARAM_HPFX_DYNSYS_YCOEFFS, 87 | PARAM_HPFX_DYNSYS_SIDEGAIN, 88 | PARAM_HPFX_DYNSYS_BASSGAIN, 89 | PARAM_HPFX_VIPERBASS_PROCESS_ENABLED, 90 | PARAM_HPFX_VIPERBASS_MODE, 91 | PARAM_HPFX_VIPERBASS_SPEAKER, 92 | PARAM_HPFX_VIPERBASS_BASSGAIN, 93 | PARAM_HPFX_VIPERCLARITY_PROCESS_ENABLED, 94 | PARAM_HPFX_VIPERCLARITY_MODE, 95 | PARAM_HPFX_VIPERCLARITY_CLARITY, 96 | PARAM_HPFX_CURE_PROCESS_ENABLED, 97 | PARAM_HPFX_CURE_CROSSFEED, 98 | PARAM_HPFX_TUBE_PROCESS_ENABLED, 99 | PARAM_HPFX_ANALOGX_PROCESS_ENABLED, 100 | PARAM_HPFX_ANALOGX_MODE, 101 | PARAM_HPFX_OUTPUT_VOLUME, 102 | PARAM_HPFX_OUTPUT_PAN, 103 | PARAM_HPFX_LIMITER_THRESHOLD, 104 | PARAM_SPKFX_CONV_PROCESS_ENABLED, 105 | PARAM_SPKFX_CONV_UPDATEKERNEL, 106 | PARAM_SPKFX_CONV_PREPAREBUFFER, 107 | PARAM_SPKFX_CONV_SETBUFFER, 108 | PARAM_SPKFX_CONV_COMMITBUFFER, 109 | PARAM_SPKFX_CONV_CROSSCHANNEL, 110 | PARAM_SPKFX_FIREQ_PROCESS_ENABLED, 111 | PARAM_SPKFX_FIREQ_BANDLEVEL, 112 | PARAM_SPKFX_REVB_PROCESS_ENABLED, 113 | PARAM_SPKFX_REVB_ROOMSIZE, 114 | PARAM_SPKFX_REVB_WIDTH, 115 | PARAM_SPKFX_REVB_DAMP, 116 | PARAM_SPKFX_REVB_WET, 117 | PARAM_SPKFX_REVB_DRY, 118 | PARAM_SPKFX_AGC_PROCESS_ENABLED, 119 | PARAM_SPKFX_AGC_RATIO, 120 | PARAM_SPKFX_AGC_VOLUME, 121 | PARAM_SPKFX_AGC_MAXSCALER, 122 | PARAM_SPKFX_OUTPUT_VOLUME, 123 | PARAM_SPKFX_LIMITER_THRESHOLD, 124 | PARAM_HPFX_FETCOMP_PROCESS_ENABLED, 125 | PARAM_HPFX_FETCOMP_THRESHOLD, 126 | PARAM_HPFX_FETCOMP_RATIO, 127 | PARAM_HPFX_FETCOMP_KNEEWIDTH, 128 | PARAM_HPFX_FETCOMP_AUTOKNEE_ENABLED, 129 | PARAM_HPFX_FETCOMP_GAIN, 130 | PARAM_HPFX_FETCOMP_AUTOGAIN_ENABLED, 131 | PARAM_HPFX_FETCOMP_ATTACK, 132 | PARAM_HPFX_FETCOMP_AUTOATTACK_ENABLED, 133 | PARAM_HPFX_FETCOMP_RELEASE, 134 | PARAM_HPFX_FETCOMP_AUTORELEASE_ENABLED, 135 | PARAM_HPFX_FETCOMP_META_KNEEMULTI, 136 | PARAM_HPFX_FETCOMP_META_MAXATTACK, 137 | PARAM_HPFX_FETCOMP_META_MAXRELEASE, 138 | PARAM_HPFX_FETCOMP_META_CREST, 139 | PARAM_HPFX_FETCOMP_META_ADAPT, 140 | PARAM_HPFX_FETCOMP_META_NOCLIP_ENABLED, 141 | PARAM_SPKFX_FETCOMP_PROCESS_ENABLED, 142 | PARAM_SPKFX_FETCOMP_THRESHOLD, 143 | PARAM_SPKFX_FETCOMP_RATIO, 144 | PARAM_SPKFX_FETCOMP_KNEEWIDTH, 145 | PARAM_SPKFX_FETCOMP_AUTOKNEE_ENABLED, 146 | PARAM_SPKFX_FETCOMP_GAIN, 147 | PARAM_SPKFX_FETCOMP_AUTOGAIN_ENABLED, 148 | PARAM_SPKFX_FETCOMP_ATTACK, 149 | PARAM_SPKFX_FETCOMP_AUTOATTACK_ENABLED, 150 | PARAM_SPKFX_FETCOMP_RELEASE, 151 | PARAM_SPKFX_FETCOMP_AUTORELEASE_ENABLED, 152 | PARAM_SPKFX_FETCOMP_META_KNEEMULTI, 153 | PARAM_SPKFX_FETCOMP_META_MAXATTACK, 154 | PARAM_SPKFX_FETCOMP_META_MAXRELEASE, 155 | PARAM_SPKFX_FETCOMP_META_CREST, 156 | PARAM_SPKFX_FETCOMP_META_ADAPT, 157 | PARAM_SPKFX_FETCOMP_META_NOCLIP_ENABLED, 158 | 159 | PARAM_PROCESSUNIT_FX_END 160 | }; 161 | 162 | enum 163 | { 164 | ViPER_FX_TYPE_NONE = 0, 165 | 166 | ViPER_FX_TYPE_HEADPHONE = 1, 167 | ViPER_FX_TYPE_SPEAKER = 2, 168 | 169 | ViPER_FX_TYPE_COUNT 170 | }; 171 | 172 | typedef struct _viperfx_interface { 173 | int32_t (*set_samplerate) ( 174 | struct _viperfx_interface * __this, int32_t sample_rate); 175 | int32_t (*set_channels) ( 176 | struct _viperfx_interface * __this, int32_t channels); 177 | void (*reset) (struct _viperfx_interface * __this); 178 | int32_t (*command) (struct _viperfx_interface * __this, 179 | uint32_t cmd_code, uint32_t cmd_size, void * cmd_data, 180 | uint32_t * reply_size, void * reply_data); 181 | void (*process) (struct _viperfx_interface * __this, 182 | int16_t * pcm_buffer, int32_t frame_count); 183 | void (*release) (struct _viperfx_interface * __this); 184 | 185 | void * private_data; 186 | } viperfx_interface; 187 | 188 | typedef viperfx_interface* (*fn_viperfx_ep)(void); 189 | 190 | void* viperfx_load_library (const char * so_path_name); 191 | void viperfx_unload_library (void * handle); 192 | fn_viperfx_ep query_viperfx_entrypoint (void * handle); 193 | 194 | int viperfx_command_set_px4_vx4x1 (viperfx_interface * intf, 195 | int32_t param, int32_t value); 196 | int viperfx_command_set_px4_vx4x2 (viperfx_interface * intf, 197 | int32_t param, int32_t value_l, int32_t value_h); 198 | int viperfx_command_set_px4_vx4x3 (viperfx_interface * intf, 199 | int32_t param, int32_t value_l, int32_t value_h, int32_t value_e); 200 | int viperfx_command_set_ir_path (viperfx_interface * intf, 201 | const char * pathname); 202 | 203 | #ifdef __cplusplus 204 | } 205 | #endif 206 | 207 | #endif 208 | -------------------------------------------------------------------------------- /src/gstviperfx.c: -------------------------------------------------------------------------------- 1 | /** 2 | * SECTION:element-viperfx 3 | * 4 | * 5 | * Example launch line 6 | * |[ 7 | * gst-launch audiotestsrc ! audioconverter ! viperfx ! ! audioconverter ! autoaudiosink 8 | * ]| 9 | * 10 | */ 11 | 12 | #define PACKAGE "viperfx-plugin" 13 | #define VERSION "1.0.0" 14 | 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | #include "gstviperfx.h" 24 | 25 | GST_DEBUG_CATEGORY_STATIC (gst_viperfx_debug); 26 | #define GST_CAT_DEFAULT gst_viperfx_debug 27 | 28 | /* Filter signals and args */ 29 | enum 30 | { 31 | /* FILL ME */ 32 | LAST_SIGNAL 33 | }; 34 | 35 | enum 36 | { 37 | PROP_0, 38 | 39 | /* global enable */ 40 | PROP_FX_ENABLE, 41 | /* convolver */ 42 | PROP_CONV_ENABLE, 43 | PROP_CONV_IR_PATH, 44 | PROP_CONV_CC_LEVEL, 45 | /* vhe */ 46 | PROP_VHE_ENABLE, 47 | PROP_VHE_LEVEL, 48 | /* vse */ 49 | PROP_VSE_ENABLE, 50 | PROP_VSE_REF_BARK, 51 | PROP_VSE_BARK_CONS, 52 | /* equalizer */ 53 | PROP_EQ_ENABLE, 54 | PROP_EQ_BAND1, 55 | PROP_EQ_BAND2, 56 | PROP_EQ_BAND3, 57 | PROP_EQ_BAND4, 58 | PROP_EQ_BAND5, 59 | PROP_EQ_BAND6, 60 | PROP_EQ_BAND7, 61 | PROP_EQ_BAND8, 62 | PROP_EQ_BAND9, 63 | PROP_EQ_BAND10, 64 | /* colorful music */ 65 | PROP_COLM_ENABLE, 66 | PROP_COLM_WIDENING, 67 | PROP_COLM_MIDIMAGE, 68 | PROP_COLM_DEPTH, 69 | /* diff sur */ 70 | PROP_DS_ENABLE, 71 | PROP_DS_LEVEL, 72 | /* reverb */ 73 | PROP_REVERB_ENABLE, 74 | PROP_REVERB_ROOMSIZE, 75 | PROP_REVERB_WIDTH, 76 | PROP_REVERB_DAMP, 77 | PROP_REVERB_WET, 78 | PROP_REVERB_DRY, 79 | /* agc */ 80 | PROP_AGC_ENABLE, 81 | PROP_AGC_RATIO, 82 | PROP_AGC_VOLUME, 83 | PROP_AGC_MAXGAIN, 84 | /* viper bass */ 85 | PROP_VB_ENABLE, 86 | PROP_VB_MODE, 87 | PROP_VB_FREQ, 88 | PROP_VB_GAIN, 89 | /* viper clarity */ 90 | PROP_VC_ENABLE, 91 | PROP_VC_MODE, 92 | PROP_VC_LEVEL, 93 | /* cure */ 94 | PROP_CURE_ENABLE, 95 | PROP_CURE_LEVEL, 96 | /* tube */ 97 | PROP_TUBE_ENABLE, 98 | /* analog-x */ 99 | PROP_AX_ENABLE, 100 | PROP_AX_MODE, 101 | /* fet compressor */ 102 | PROP_FETCOMP_ENABLE, 103 | PROP_FETCOMP_THRESHOLD, 104 | PROP_FETCOMP_RATIO, 105 | PROP_FETCOMP_KNEEWIDTH, 106 | PROP_FETCOMP_AUTOKNEE, 107 | PROP_FETCOMP_GAIN, 108 | PROP_FETCOMP_AUTOGAIN, 109 | PROP_FETCOMP_ATTACK, 110 | PROP_FETCOMP_AUTOATTACK, 111 | PROP_FETCOMP_RELEASE, 112 | PROP_FETCOMP_AUTORELEASE, 113 | PROP_FETCOMP_META_KNEEMULTI, 114 | PROP_FETCOMP_META_MAXATTACK, 115 | PROP_FETCOMP_META_MAXRELEASE, 116 | PROP_FETCOMP_META_CREST, 117 | PROP_FETCOMP_META_ADAPT, 118 | PROP_FETCOMP_NOCLIP, 119 | /* output volume */ 120 | PROP_OUT_VOLUME, 121 | /* output pan */ 122 | PROP_OUT_PAN, 123 | /* limiter */ 124 | PROP_LIM_THRESHOLD 125 | }; 126 | 127 | #define ALLOWED_CAPS \ 128 | "audio/x-raw," \ 129 | " format=(string){"GST_AUDIO_NE(S16)"}," \ 130 | " rate=(int)[44100,MAX]," \ 131 | " channels=(int)2," \ 132 | " layout=(string)interleaved" 133 | 134 | #define gst_viperfx_parent_class parent_class 135 | G_DEFINE_TYPE (Gstviperfx, gst_viperfx, GST_TYPE_AUDIO_FILTER); 136 | 137 | static void gst_viperfx_set_property (GObject * object, guint prop_id, 138 | const GValue * value, GParamSpec * pspec); 139 | static void gst_viperfx_get_property (GObject * object, guint prop_id, 140 | GValue * value, GParamSpec * pspec); 141 | static void gst_viperfx_finalize (GObject * object); 142 | 143 | static gboolean gst_viperfx_setup (GstAudioFilter * self, 144 | const GstAudioInfo * info); 145 | static gboolean gst_viperfx_stop (GstBaseTransform * base); 146 | static GstFlowReturn gst_viperfx_transform_ip (GstBaseTransform * base, 147 | GstBuffer * outbuf); 148 | 149 | /* GObject vmethod implementations */ 150 | 151 | /* initialize the viperfx's class */ 152 | static void 153 | gst_viperfx_class_init (GstviperfxClass * klass) 154 | { 155 | GObjectClass *gobject_class = (GObjectClass *) klass; 156 | GstElementClass *gstelement_class = (GstElementClass *) klass; 157 | GstBaseTransformClass *basetransform_class = (GstBaseTransformClass *) klass; 158 | GstAudioFilterClass *audioself_class = (GstAudioFilterClass *) klass; 159 | GstCaps *caps; 160 | 161 | /* debug category for fltering log messages 162 | */ 163 | GST_DEBUG_CATEGORY_INIT (gst_viperfx_debug, "viperfx", 0, "viperfx element"); 164 | 165 | gobject_class->set_property = gst_viperfx_set_property; 166 | gobject_class->get_property = gst_viperfx_get_property; 167 | gobject_class->finalize = gst_viperfx_finalize; 168 | 169 | /* global switch */ 170 | g_object_class_install_property (gobject_class, PROP_FX_ENABLE, 171 | g_param_spec_boolean ("fx_enable", "FXEnabled", "Enable viperfx processing", 172 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 173 | 174 | /* convolver */ 175 | g_object_class_install_property (gobject_class, PROP_CONV_ENABLE, 176 | g_param_spec_boolean ("conv_enable", "ConvEnabled", "Enable convolver", 177 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 178 | g_object_class_install_property (gobject_class, PROP_CONV_IR_PATH, 179 | g_param_spec_string ("conv_ir_path", "ConvIRPath", "Impulse response file path", 180 | "", G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 181 | g_object_class_install_property (gobject_class, PROP_CONV_CC_LEVEL, 182 | g_param_spec_int ("conv_cc_level", "ConvEnabled", "Cross-channel level (percent)", 183 | 0, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 184 | 185 | /* vhe */ 186 | g_object_class_install_property (gobject_class, PROP_VHE_ENABLE, 187 | g_param_spec_boolean ("vhe_enable", "VHEEnabled", "Enable viper headphone engine", 188 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 189 | g_object_class_install_property (gobject_class, PROP_VHE_LEVEL, 190 | g_param_spec_int ("vhe_level", "VHELevel", "VHE level", 191 | 0, 4, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 192 | 193 | /* vse */ 194 | g_object_class_install_property (gobject_class, PROP_VSE_ENABLE, 195 | g_param_spec_boolean ("vse_enable", "VSEEnabled", "Enable viper spectrum extend", 196 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 197 | g_object_class_install_property (gobject_class, PROP_VSE_REF_BARK, 198 | g_param_spec_int ("vse_ref_bark", "VSERefBark", "VSE reference bark frequency", 199 | 800, 20000, 7600, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 200 | g_object_class_install_property (gobject_class, PROP_VSE_BARK_CONS, 201 | g_param_spec_int ("vse_bark_cons", "VSEBarkCons", "VSE bark reconstruct level", 202 | 10, 100, 10, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 203 | 204 | /* equalizer */ 205 | g_object_class_install_property (gobject_class, PROP_EQ_ENABLE, 206 | g_param_spec_boolean ("eq_enable", "EQEnable", "Enable FIR linear equalizer", 207 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 208 | g_object_class_install_property (gobject_class, PROP_EQ_BAND1, 209 | g_param_spec_int ("eq_band1", "EQBand1", "Gain of eq band 1", 210 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 211 | g_object_class_install_property (gobject_class, PROP_EQ_BAND2, 212 | g_param_spec_int ("eq_band2", "EQBand2", "Gain of eq band 2", 213 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 214 | g_object_class_install_property (gobject_class, PROP_EQ_BAND3, 215 | g_param_spec_int ("eq_band3", "EQBand3", "Gain of eq band 3", 216 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 217 | g_object_class_install_property (gobject_class, PROP_EQ_BAND4, 218 | g_param_spec_int ("eq_band4", "EQBand4", "Gain of eq band 4", 219 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 220 | g_object_class_install_property (gobject_class, PROP_EQ_BAND5, 221 | g_param_spec_int ("eq_band5", "EQBand5", "Gain of eq band 5", 222 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 223 | g_object_class_install_property (gobject_class, PROP_EQ_BAND6, 224 | g_param_spec_int ("eq_band6", "EQBand6", "Gain of eq band 6", 225 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 226 | g_object_class_install_property (gobject_class, PROP_EQ_BAND7, 227 | g_param_spec_int ("eq_band7", "EQBand7", "Gain of eq band 7", 228 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 229 | g_object_class_install_property (gobject_class, PROP_EQ_BAND8, 230 | g_param_spec_int ("eq_band8", "EQBand8", "Gain of eq band 8", 231 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 232 | g_object_class_install_property (gobject_class, PROP_EQ_BAND9, 233 | g_param_spec_int ("eq_band9", "EQBand9", "Gain of eq band 9", 234 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 235 | g_object_class_install_property (gobject_class, PROP_EQ_BAND10, 236 | g_param_spec_int ("eq_band10", "EQBand10", "Gain of eq band 10", 237 | -1200, 1200, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 238 | 239 | /* colorful music */ 240 | g_object_class_install_property (gobject_class, PROP_COLM_ENABLE, 241 | g_param_spec_boolean ("colm_enable", "COLMEnabled", "Enable colorful music", 242 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 243 | g_object_class_install_property (gobject_class, PROP_COLM_WIDENING, 244 | g_param_spec_int ("colm_widening", "COLMWidening", "Widening of colorful music", 245 | 0, 800, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 246 | g_object_class_install_property (gobject_class, PROP_COLM_MIDIMAGE, 247 | g_param_spec_int ("colm_midimage", "COLMMidImage", "Mid-image of colorful music", 248 | 0, 800, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 249 | g_object_class_install_property (gobject_class, PROP_COLM_DEPTH, 250 | g_param_spec_int ("colm_depth", "COLMDepth", "Depth of colorful music", 251 | 0, 32767, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 252 | 253 | /* diff sur */ 254 | g_object_class_install_property (gobject_class, PROP_DS_ENABLE, 255 | g_param_spec_boolean ("ds_enable", "DSEnabled", "Enable diff-surround", 256 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 257 | g_object_class_install_property (gobject_class, PROP_DS_LEVEL, 258 | g_param_spec_int ("ds_level", "DSLevel", "Diff-surround level (percent)", 259 | 0, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 260 | 261 | /* reverb */ 262 | g_object_class_install_property (gobject_class, PROP_REVERB_ENABLE, 263 | g_param_spec_boolean ("reverb_enable", "ReverbEnabled", "Enable reverb", 264 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 265 | g_object_class_install_property (gobject_class, PROP_REVERB_ROOMSIZE, 266 | g_param_spec_int ("reverb_roomsize", "ReverbRoomSize", "Reverb room size (percent)", 267 | 1, 100, 30, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 268 | g_object_class_install_property (gobject_class, PROP_REVERB_WIDTH, 269 | g_param_spec_int ("reverb_width", "ReverbWidth", "Reveb room width (percent)", 270 | 1, 100, 40, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 271 | g_object_class_install_property (gobject_class, PROP_REVERB_DAMP, 272 | g_param_spec_int ("reverb_damp", "ReverbDamp", "Reverb room damp (percent)", 273 | 1, 100, 10, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 274 | g_object_class_install_property (gobject_class, PROP_REVERB_WET, 275 | g_param_spec_int ("reverb_wet", "ReverbWet", "Reverb wet signal (percent)", 276 | 1, 100, 20, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 277 | g_object_class_install_property (gobject_class, PROP_REVERB_DRY, 278 | g_param_spec_int ("reverb_dry", "ReverbDry", "Reverb dry signal (percent)", 279 | 1, 100, 80, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 280 | 281 | /* agc */ 282 | g_object_class_install_property (gobject_class, PROP_AGC_ENABLE, 283 | g_param_spec_boolean ("agc_enable", "AGCEnabled", "Enable auto gain control", 284 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 285 | g_object_class_install_property (gobject_class, PROP_AGC_RATIO, 286 | g_param_spec_int ("agc_ratio", "AGCRatio", "Working ratio of agc", 287 | 50, 500, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 288 | g_object_class_install_property (gobject_class, PROP_AGC_VOLUME, 289 | g_param_spec_int ("agc_volume", "AGCVolume", "Max volume of agc", 290 | 0, 200, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 291 | g_object_class_install_property (gobject_class, PROP_AGC_MAXGAIN, 292 | g_param_spec_int ("agc_maxgain", "AGCMaxGain", "Max gain of agc", 293 | 100, 800, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 294 | 295 | /* viper bass */ 296 | g_object_class_install_property (gobject_class, PROP_VB_ENABLE, 297 | g_param_spec_boolean ("vb_enable", "VBEnabled", "Enable viper bass", 298 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 299 | g_object_class_install_property (gobject_class, PROP_VB_MODE, 300 | g_param_spec_int ("vb_mode", "VBMode", "ViPER bass mode", 301 | 0, 2, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 302 | g_object_class_install_property (gobject_class, PROP_VB_FREQ, 303 | g_param_spec_int ("vb_freq", "VBFreq", "ViPER bass frequency", 304 | 50, 160, 76, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 305 | g_object_class_install_property (gobject_class, PROP_VB_GAIN, 306 | g_param_spec_int ("vb_gain", "VBGain", "ViPER bass gain", 307 | 0, 800, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 308 | 309 | /* viper clarity */ 310 | g_object_class_install_property (gobject_class, PROP_VC_ENABLE, 311 | g_param_spec_boolean ("vc_enable", "VCEnabled", "Enable viper clarity", 312 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 313 | g_object_class_install_property (gobject_class, PROP_VC_MODE, 314 | g_param_spec_int ("vc_mode", "VCMode", "ViPER clarity mode", 315 | 0, 2, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 316 | g_object_class_install_property (gobject_class, PROP_VC_LEVEL, 317 | g_param_spec_int ("vc_level", "VCLevel", "ViPER clarity level", 318 | 0, 800, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 319 | 320 | /* cure */ 321 | g_object_class_install_property (gobject_class, PROP_CURE_ENABLE, 322 | g_param_spec_boolean ("cure_enable", "CureEnabled", "Enable viper cure+", 323 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 324 | g_object_class_install_property (gobject_class, PROP_CURE_LEVEL, 325 | g_param_spec_int ("cure_level", "CureLevel", "ViPER cure+ level", 326 | 0, 2, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 327 | 328 | /* tube */ 329 | g_object_class_install_property (gobject_class, PROP_TUBE_ENABLE, 330 | g_param_spec_boolean ("tube_enable", "TubeEnabled", "Enable tube simiulator", 331 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 332 | 333 | /* analog-x */ 334 | g_object_class_install_property (gobject_class, PROP_AX_ENABLE, 335 | g_param_spec_boolean ("ax_enable", "AXEnabled", "Enable viper analog-x", 336 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 337 | g_object_class_install_property (gobject_class, PROP_AX_MODE, 338 | g_param_spec_int ("ax_mode", "AXMode", "ViPER analog-x mode", 339 | 0, 2, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 340 | 341 | /* fet compressor */ 342 | g_object_class_install_property (gobject_class, PROP_FETCOMP_ENABLE, 343 | g_param_spec_boolean ("fetcomp_enable", "FETCompEnabled", "Enable fet compressor", 344 | FALSE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 345 | g_object_class_install_property (gobject_class, PROP_FETCOMP_THRESHOLD, 346 | g_param_spec_int ("fetcomp_threshold", "FETCompThreshold", "Compressor threshold (percent)", 347 | 0, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 348 | g_object_class_install_property (gobject_class, PROP_FETCOMP_RATIO, 349 | g_param_spec_int ("fetcomp_ratio", "FETCompRatio", "Compressor ratio (percent)", 350 | 0, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 351 | g_object_class_install_property (gobject_class, PROP_FETCOMP_KNEEWIDTH, 352 | g_param_spec_int ("fetcomp_kneewidth", "FETCompKneeWidth", "Compressor knee width (percent)", 353 | 0, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 354 | g_object_class_install_property (gobject_class, PROP_FETCOMP_AUTOKNEE, 355 | g_param_spec_boolean ("fetcomp_autoknee", "FETCompAutoKnee", "Compressor auto knee control", 356 | TRUE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 357 | g_object_class_install_property (gobject_class, PROP_FETCOMP_GAIN, 358 | g_param_spec_int ("fetcomp_gain", "FETCompGain", "Compressor makeup gain (percent)", 359 | 0, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 360 | g_object_class_install_property (gobject_class, PROP_FETCOMP_AUTOGAIN, 361 | g_param_spec_boolean ("fetcomp_autogain", "FETCompAutoGain", "Compressor auto gain control", 362 | TRUE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 363 | g_object_class_install_property (gobject_class, PROP_FETCOMP_ATTACK, 364 | g_param_spec_int ("fetcomp_attack", "FETCompAttack", "Compressor attack time (percent)", 365 | 0, 100, 51, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 366 | g_object_class_install_property (gobject_class, PROP_FETCOMP_AUTOATTACK, 367 | g_param_spec_boolean ("fetcomp_autoattack", "FETCompAutoAttack", "Compressor auto attack control", 368 | TRUE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 369 | g_object_class_install_property (gobject_class, PROP_FETCOMP_RELEASE, 370 | g_param_spec_int ("fetcomp_release", "FETCompRelease", "Compressor release time (percent)", 371 | 0, 100, 38, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 372 | g_object_class_install_property (gobject_class, PROP_FETCOMP_AUTORELEASE, 373 | g_param_spec_boolean ("fetcomp_autorelease", "FETCompAutoRelease", "Compressor auto release control", 374 | TRUE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 375 | g_object_class_install_property (gobject_class, PROP_FETCOMP_META_KNEEMULTI, 376 | g_param_spec_int ("fetcomp_meta_kneemulti", "FETCompKneeMulti", "Compressor knee width multi in auto mode (percent)", 377 | 0, 100, 50, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 378 | g_object_class_install_property (gobject_class, PROP_FETCOMP_META_MAXATTACK, 379 | g_param_spec_int ("fetcomp_meta_maxattack", "FETCompMaxAttack", "Compressor max attack in auto mode (percent)", 380 | 0, 100, 88, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 381 | g_object_class_install_property (gobject_class, PROP_FETCOMP_META_MAXRELEASE, 382 | g_param_spec_int ("fetcomp_meta_maxrelease", "FETCompMaxRelease", "Compressor max release in auto mode (percent)", 383 | 0, 100, 88, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 384 | g_object_class_install_property (gobject_class, PROP_FETCOMP_META_CREST, 385 | g_param_spec_int ("fetcomp_meta_crest", "FETCompCrest", "Compressor crest in auto mode (percent)", 386 | 0, 100, 61, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 387 | g_object_class_install_property (gobject_class, PROP_FETCOMP_META_ADAPT, 388 | g_param_spec_int ("fetcomp_meta_adapt", "FETCompAdapt", "Compressor adapt in auto mode (percent)", 389 | 0, 100, 66, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 390 | g_object_class_install_property (gobject_class, PROP_FETCOMP_NOCLIP, 391 | g_param_spec_boolean ("fetcomp_noclip", "FETCompNoClip", "Compressor prevent clipping", 392 | TRUE, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 393 | 394 | /* output volume */ 395 | g_object_class_install_property (gobject_class, PROP_OUT_VOLUME, 396 | g_param_spec_int ("out_volume", "OutVolume", "Master output volume (percent)", 397 | 0, 100, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 398 | 399 | /* output pan */ 400 | g_object_class_install_property (gobject_class, PROP_OUT_PAN, 401 | g_param_spec_int ("out_pan", "OutPan", "Master output pan", 402 | -100, 100, 0, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 403 | 404 | /* limiter */ 405 | g_object_class_install_property (gobject_class, PROP_LIM_THRESHOLD, 406 | g_param_spec_int ("lim_threshold", "LimThreshold", "Master limiter threshold (percent)", 407 | 1, 100, 100, G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)); 408 | 409 | gst_element_class_set_static_metadata (gstelement_class, 410 | "viperfx", 411 | "Filter/Effect/Audio", 412 | "ViPER-FX Core wrapper for GStreamer1", 413 | "Jason "); 414 | 415 | caps = gst_caps_from_string (ALLOWED_CAPS); 416 | gst_audio_filter_class_add_pad_templates (GST_VIPERFX_CLASS (klass), caps); 417 | gst_caps_unref (caps); 418 | 419 | audioself_class->setup = GST_DEBUG_FUNCPTR (gst_viperfx_setup); 420 | basetransform_class->transform_ip = 421 | GST_DEBUG_FUNCPTR (gst_viperfx_transform_ip); 422 | basetransform_class->transform_ip_on_passthrough = FALSE; 423 | basetransform_class->stop = GST_DEBUG_FUNCPTR (gst_viperfx_stop); 424 | } 425 | 426 | /* sync all parameters to fx core 427 | */ 428 | static void sync_all_parameters (Gstviperfx *self) 429 | { 430 | int32_t idx; 431 | 432 | // convolver 433 | viperfx_command_set_px4_vx4x1 (self->vfx, 434 | PARAM_HPFX_CONV_CROSSCHANNEL, self->conv_cc_level); 435 | viperfx_command_set_ir_path (self->vfx, self->conv_ir_path); 436 | viperfx_command_set_px4_vx4x1 (self->vfx, 437 | PARAM_HPFX_CONV_PROCESS_ENABLED, self->conv_enabled); 438 | 439 | // vhe 440 | viperfx_command_set_px4_vx4x1 (self->vfx, 441 | PARAM_HPFX_VHE_EFFECT_LEVEL, self->vhe_level); 442 | viperfx_command_set_px4_vx4x1 (self->vfx, 443 | PARAM_HPFX_VHE_PROCESS_ENABLED, self->vhe_enabled); 444 | 445 | // vse 446 | viperfx_command_set_px4_vx4x1 (self->vfx, 447 | PARAM_HPFX_VSE_REFERENCE_BARK, self->vse_ref_bark); 448 | viperfx_command_set_px4_vx4x1 (self->vfx, 449 | PARAM_HPFX_VSE_BARK_RECONSTRUCT, self->vse_bark_cons); 450 | viperfx_command_set_px4_vx4x1 (self->vfx, 451 | PARAM_HPFX_VSE_PROCESS_ENABLED, self->vse_enabled); 452 | 453 | // equalizer 454 | for (idx = 0; idx < 10; idx++) { 455 | viperfx_command_set_px4_vx4x2 (self->vfx, 456 | PARAM_HPFX_FIREQ_BANDLEVEL, idx, self->eq_band_level[idx]); 457 | } 458 | viperfx_command_set_px4_vx4x1 (self->vfx, 459 | PARAM_HPFX_FIREQ_PROCESS_ENABLED, self->eq_enabled); 460 | 461 | // colorful music 462 | viperfx_command_set_px4_vx4x1 (self->vfx, 463 | PARAM_HPFX_COLM_WIDENING, self->colm_widening); 464 | viperfx_command_set_px4_vx4x1 (self->vfx, 465 | PARAM_HPFX_COLM_MIDIMAGE, self->colm_midimage); 466 | viperfx_command_set_px4_vx4x1 (self->vfx, 467 | PARAM_HPFX_COLM_DEPTH, self->colm_depth); 468 | viperfx_command_set_px4_vx4x1 (self->vfx, 469 | PARAM_HPFX_COLM_PROCESS_ENABLED, self->colm_enabled); 470 | 471 | // diff surr 472 | viperfx_command_set_px4_vx4x1 (self->vfx, 473 | PARAM_HPFX_DIFFSURR_DELAYTIME, self->ds_level); 474 | viperfx_command_set_px4_vx4x1 (self->vfx, 475 | PARAM_HPFX_DIFFSURR_PROCESS_ENABLED, self->ds_enabled); 476 | 477 | // reverb 478 | viperfx_command_set_px4_vx4x1 (self->vfx, 479 | PARAM_HPFX_REVB_ROOMSIZE, self->reverb_roomsize); 480 | viperfx_command_set_px4_vx4x1 (self->vfx, 481 | PARAM_HPFX_REVB_WIDTH, self->reverb_width); 482 | viperfx_command_set_px4_vx4x1 (self->vfx, 483 | PARAM_HPFX_REVB_DAMP, self->reverb_damp); 484 | viperfx_command_set_px4_vx4x1 (self->vfx, 485 | PARAM_HPFX_REVB_WET, self->reverb_wet); 486 | viperfx_command_set_px4_vx4x1 (self->vfx, 487 | PARAM_HPFX_REVB_DRY, self->reverb_dry); 488 | viperfx_command_set_px4_vx4x1 (self->vfx, 489 | PARAM_HPFX_REVB_PROCESS_ENABLED, self->reverb_enabled); 490 | 491 | // agc 492 | viperfx_command_set_px4_vx4x1 (self->vfx, 493 | PARAM_HPFX_AGC_RATIO, self->agc_ratio); 494 | viperfx_command_set_px4_vx4x1 (self->vfx, 495 | PARAM_HPFX_AGC_VOLUME, self->agc_volume); 496 | viperfx_command_set_px4_vx4x1 (self->vfx, 497 | PARAM_HPFX_AGC_MAXSCALER, self->agc_maxgain); 498 | viperfx_command_set_px4_vx4x1 (self->vfx, 499 | PARAM_HPFX_AGC_PROCESS_ENABLED, self->agc_enabled); 500 | 501 | // viper bass 502 | viperfx_command_set_px4_vx4x1 (self->vfx, 503 | PARAM_HPFX_VIPERBASS_MODE, self->vb_mode); 504 | viperfx_command_set_px4_vx4x1 (self->vfx, 505 | PARAM_HPFX_VIPERBASS_SPEAKER, self->vb_freq); 506 | viperfx_command_set_px4_vx4x1 (self->vfx, 507 | PARAM_HPFX_VIPERBASS_BASSGAIN, self->vb_gain); 508 | viperfx_command_set_px4_vx4x1 (self->vfx, 509 | PARAM_HPFX_VIPERBASS_PROCESS_ENABLED, self->vb_enabled); 510 | 511 | // viper clarity 512 | viperfx_command_set_px4_vx4x1 (self->vfx, 513 | PARAM_HPFX_VIPERCLARITY_MODE, self->vc_mode); 514 | viperfx_command_set_px4_vx4x1 (self->vfx, 515 | PARAM_HPFX_VIPERCLARITY_CLARITY, self->vc_level); 516 | viperfx_command_set_px4_vx4x1 (self->vfx, 517 | PARAM_HPFX_VIPERCLARITY_PROCESS_ENABLED, self->vc_enabled); 518 | 519 | // cure 520 | viperfx_command_set_px4_vx4x1 (self->vfx, 521 | PARAM_HPFX_CURE_CROSSFEED, self->cure_level); 522 | viperfx_command_set_px4_vx4x1 (self->vfx, 523 | PARAM_HPFX_CURE_PROCESS_ENABLED, self->cure_enabled); 524 | 525 | // tube 526 | viperfx_command_set_px4_vx4x1 (self->vfx, 527 | PARAM_HPFX_TUBE_PROCESS_ENABLED, self->tube_enabled); 528 | 529 | // analog-x 530 | viperfx_command_set_px4_vx4x1 (self->vfx, 531 | PARAM_HPFX_ANALOGX_MODE, self->ax_mode); 532 | viperfx_command_set_px4_vx4x1 (self->vfx, 533 | PARAM_HPFX_ANALOGX_PROCESS_ENABLED, self->ax_enabled); 534 | 535 | // fet compressor 536 | viperfx_command_set_px4_vx4x1 (self->vfx, 537 | PARAM_HPFX_FETCOMP_THRESHOLD, self->fetcomp_threshold); 538 | viperfx_command_set_px4_vx4x1 (self->vfx, 539 | PARAM_HPFX_FETCOMP_RATIO, self->fetcomp_ratio); 540 | viperfx_command_set_px4_vx4x1 (self->vfx, 541 | PARAM_HPFX_FETCOMP_KNEEWIDTH, self->fetcomp_kneewidth); 542 | viperfx_command_set_px4_vx4x1 (self->vfx, 543 | PARAM_HPFX_FETCOMP_AUTOKNEE_ENABLED, self->fetcomp_autoknee); 544 | viperfx_command_set_px4_vx4x1 (self->vfx, 545 | PARAM_HPFX_FETCOMP_GAIN, self->fetcomp_gain); 546 | viperfx_command_set_px4_vx4x1 (self->vfx, 547 | PARAM_HPFX_FETCOMP_AUTOGAIN_ENABLED, self->fetcomp_autogain); 548 | viperfx_command_set_px4_vx4x1 (self->vfx, 549 | PARAM_HPFX_FETCOMP_ATTACK, self->fetcomp_attack); 550 | viperfx_command_set_px4_vx4x1 (self->vfx, 551 | PARAM_HPFX_FETCOMP_AUTOATTACK_ENABLED, self->fetcomp_autoattack); 552 | viperfx_command_set_px4_vx4x1 (self->vfx, 553 | PARAM_HPFX_FETCOMP_RELEASE, self->fetcomp_release); 554 | viperfx_command_set_px4_vx4x1 (self->vfx, 555 | PARAM_HPFX_FETCOMP_AUTORELEASE_ENABLED, self->fetcomp_autorelease); 556 | viperfx_command_set_px4_vx4x1 (self->vfx, 557 | PARAM_HPFX_FETCOMP_META_KNEEMULTI, self->fetcomp_meta_kneemulti); 558 | viperfx_command_set_px4_vx4x1 (self->vfx, 559 | PARAM_HPFX_FETCOMP_META_MAXATTACK, self->fetcomp_meta_maxattack); 560 | viperfx_command_set_px4_vx4x1 (self->vfx, 561 | PARAM_HPFX_FETCOMP_META_MAXRELEASE, self->fetcomp_meta_maxrelease); 562 | viperfx_command_set_px4_vx4x1 (self->vfx, 563 | PARAM_HPFX_FETCOMP_META_CREST, self->fetcomp_meta_crest); 564 | viperfx_command_set_px4_vx4x1 (self->vfx, 565 | PARAM_HPFX_FETCOMP_META_ADAPT, self->fetcomp_meta_adapt); 566 | viperfx_command_set_px4_vx4x1 (self->vfx, 567 | PARAM_HPFX_FETCOMP_META_NOCLIP_ENABLED, self->fetcomp_noclip); 568 | viperfx_command_set_px4_vx4x1 (self->vfx, 569 | PARAM_HPFX_FETCOMP_PROCESS_ENABLED, self->fetcomp_enabled); 570 | 571 | // output volume 572 | viperfx_command_set_px4_vx4x1 (self->vfx, 573 | PARAM_HPFX_OUTPUT_VOLUME, self->out_volume); 574 | 575 | // output pan 576 | viperfx_command_set_px4_vx4x1 (self->vfx, 577 | PARAM_HPFX_OUTPUT_PAN, self->out_pan); 578 | 579 | // limiter 580 | viperfx_command_set_px4_vx4x1 (self->vfx, 581 | PARAM_HPFX_LIMITER_THRESHOLD, self->lim_threshold); 582 | 583 | // global enable 584 | viperfx_command_set_px4_vx4x1 (self->vfx, 585 | PARAM_SET_DOPROCESS_STATUS, self->fx_enabled); 586 | 587 | // reset 588 | self->vfx->reset (self->vfx); 589 | } 590 | 591 | /* initialize the new element 592 | * allocate private resources 593 | */ 594 | static void 595 | gst_viperfx_init (Gstviperfx *self) 596 | { 597 | gint32 idx; 598 | 599 | gst_base_transform_set_in_place (GST_BASE_TRANSFORM (self), TRUE); 600 | gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (self), TRUE); 601 | 602 | /* initialize properties */ 603 | self->fx_enabled = FALSE; 604 | // convolver 605 | self->conv_enabled = FALSE; 606 | memset (self->conv_ir_path, 0, 607 | sizeof(self->conv_ir_path)); 608 | self->conv_cc_level = 0; 609 | // vhe 610 | self->vhe_enabled = FALSE; 611 | self->vhe_level = 0; 612 | // vse 613 | self->vse_enabled = FALSE; 614 | self->vse_ref_bark = 7600; 615 | self->vse_bark_cons = 10; 616 | // equalizer 617 | self->eq_enabled = FALSE; 618 | for (idx = 0; idx < 10; idx++) 619 | self->eq_band_level[idx] = 0; 620 | // colorful music 621 | self->colm_enabled = FALSE; 622 | self->colm_widening = 100; 623 | self->colm_midimage = 100; 624 | self->colm_depth = 200; 625 | // diff surr 626 | self->ds_enabled = FALSE; 627 | self->ds_level = 0; 628 | // reverb 629 | self->reverb_enabled = FALSE; 630 | self->reverb_roomsize = 30; 631 | self->reverb_width = 40; 632 | self->reverb_damp = 10; 633 | self->reverb_wet = 20; 634 | self->reverb_dry = 80; 635 | // agc 636 | self->agc_enabled = FALSE; 637 | self->agc_ratio = 100; 638 | self->agc_volume = 100; 639 | self->agc_maxgain = 100; 640 | // viper bass 641 | self->vb_enabled = FALSE; 642 | self->vb_mode = 0; 643 | self->vb_freq = 76; 644 | self->vb_gain = 0; 645 | // viper clarity 646 | self->vc_enabled = FALSE; 647 | self->vc_mode = 0; 648 | self->vc_level = 0; 649 | // cure 650 | self->cure_enabled = FALSE; 651 | self->cure_level = 0; 652 | // tube 653 | self->tube_enabled = FALSE; 654 | // analog-x 655 | self->ax_enabled = FALSE; 656 | self->ax_mode = 0; 657 | // fet compressor 658 | self->fetcomp_enabled = FALSE; 659 | self->fetcomp_threshold = 0; 660 | self->fetcomp_ratio = 0; 661 | self->fetcomp_kneewidth = 0; 662 | self->fetcomp_autoknee = TRUE; 663 | self->fetcomp_gain = 0; 664 | self->fetcomp_autogain = TRUE; 665 | self->fetcomp_attack = 51; 666 | self->fetcomp_autoattack = TRUE; 667 | self->fetcomp_release = 38; 668 | self->fetcomp_autorelease = TRUE; 669 | self->fetcomp_meta_kneemulti = 50; 670 | self->fetcomp_meta_maxattack = 88; 671 | self->fetcomp_meta_maxrelease = 88; 672 | self->fetcomp_meta_crest = 61; 673 | self->fetcomp_meta_adapt = 66; 674 | self->fetcomp_noclip = TRUE; 675 | // output volume 676 | self->out_volume = 100; 677 | // output pan 678 | self->out_pan = 0; 679 | // limiter 680 | self->lim_threshold = 100; 681 | 682 | /* initialize private resources */ 683 | self->vfx = NULL; 684 | self->so_handle = viperfx_load_library (NULL); 685 | if (self->so_handle == NULL) { 686 | self->so_entrypoint = NULL; 687 | } else { 688 | self->so_entrypoint = query_viperfx_entrypoint ( 689 | self->so_handle); 690 | if (self->so_entrypoint == NULL) { 691 | viperfx_unload_library ( 692 | self->so_handle); 693 | self->so_handle = NULL; 694 | } else { 695 | self->vfx = self->so_entrypoint (); 696 | if (self->vfx == NULL) { 697 | viperfx_unload_library ( 698 | self->so_handle); 699 | self->so_handle = NULL; 700 | self->so_entrypoint = NULL; 701 | } 702 | } 703 | } 704 | 705 | if (self->vfx != NULL) 706 | sync_all_parameters (self); 707 | 708 | g_mutex_init (&self->lock); 709 | } 710 | 711 | /* free private resources 712 | */ 713 | static void 714 | gst_viperfx_finalize (GObject * object) 715 | { 716 | Gstviperfx *self = GST_VIPERFX (object); 717 | 718 | if (self->vfx != NULL) { 719 | self->vfx->release (self->vfx); 720 | self->vfx = NULL; 721 | } 722 | if (self->so_handle != NULL) { 723 | viperfx_unload_library ( 724 | self->so_handle); 725 | self->so_handle = NULL; 726 | } 727 | self->so_entrypoint = NULL; 728 | 729 | g_mutex_clear (&self->lock); 730 | 731 | G_OBJECT_CLASS (parent_class)->finalize (object); 732 | } 733 | 734 | static void 735 | gst_viperfx_set_property (GObject * object, guint prop_id, 736 | const GValue * value, GParamSpec * pspec) 737 | { 738 | Gstviperfx *self = GST_VIPERFX (object); 739 | 740 | switch (prop_id) { 741 | case PROP_FX_ENABLE: 742 | { 743 | g_mutex_lock (&self->lock); 744 | self->fx_enabled = g_value_get_boolean (value); 745 | viperfx_command_set_px4_vx4x1 (self->vfx, 746 | PARAM_SET_DOPROCESS_STATUS, self->fx_enabled); 747 | g_mutex_unlock (&self->lock); 748 | } 749 | break; 750 | 751 | case PROP_CONV_ENABLE: 752 | { 753 | g_mutex_lock (&self->lock); 754 | self->conv_enabled = g_value_get_boolean (value); 755 | viperfx_command_set_px4_vx4x1 (self->vfx, 756 | PARAM_HPFX_CONV_PROCESS_ENABLED, self->conv_enabled); 757 | g_mutex_unlock (&self->lock); 758 | } 759 | break; 760 | 761 | case PROP_CONV_IR_PATH: 762 | { 763 | g_mutex_lock (&self->lock); 764 | if (strlen (g_value_get_string (value)) < 256) { 765 | memset (self->conv_ir_path, 0, 766 | sizeof(self->conv_ir_path)); 767 | strcpy(self->conv_ir_path, 768 | g_value_get_string (value)); 769 | viperfx_command_set_ir_path (self->vfx, self->conv_ir_path); 770 | } 771 | g_mutex_unlock (&self->lock); 772 | } 773 | break; 774 | 775 | case PROP_CONV_CC_LEVEL: 776 | { 777 | g_mutex_lock (&self->lock); 778 | self->conv_cc_level = g_value_get_int (value); 779 | viperfx_command_set_px4_vx4x1 (self->vfx, 780 | PARAM_HPFX_CONV_CROSSCHANNEL, self->conv_cc_level); 781 | g_mutex_unlock (&self->lock); 782 | } 783 | break; 784 | 785 | case PROP_VHE_ENABLE: 786 | { 787 | g_mutex_lock (&self->lock); 788 | self->vhe_enabled = g_value_get_boolean (value); 789 | viperfx_command_set_px4_vx4x1 (self->vfx, 790 | PARAM_HPFX_VHE_PROCESS_ENABLED, self->vhe_enabled); 791 | g_mutex_unlock (&self->lock); 792 | } 793 | break; 794 | 795 | case PROP_VHE_LEVEL: 796 | { 797 | g_mutex_lock (&self->lock); 798 | self->vhe_level = g_value_get_int (value); 799 | viperfx_command_set_px4_vx4x1 (self->vfx, 800 | PARAM_HPFX_VHE_EFFECT_LEVEL, self->vhe_level); 801 | g_mutex_unlock (&self->lock); 802 | } 803 | break; 804 | 805 | case PROP_VSE_ENABLE: 806 | { 807 | g_mutex_lock (&self->lock); 808 | self->vse_enabled = g_value_get_boolean (value); 809 | viperfx_command_set_px4_vx4x1 (self->vfx, 810 | PARAM_HPFX_VSE_PROCESS_ENABLED, self->vse_enabled); 811 | g_mutex_unlock (&self->lock); 812 | } 813 | break; 814 | 815 | case PROP_VSE_REF_BARK: 816 | { 817 | g_mutex_lock (&self->lock); 818 | self->vse_ref_bark = g_value_get_int (value); 819 | viperfx_command_set_px4_vx4x1 (self->vfx, 820 | PARAM_HPFX_VSE_REFERENCE_BARK, self->vse_ref_bark); 821 | g_mutex_unlock (&self->lock); 822 | } 823 | break; 824 | 825 | case PROP_VSE_BARK_CONS: 826 | { 827 | g_mutex_lock (&self->lock); 828 | self->vse_bark_cons = g_value_get_int (value); 829 | viperfx_command_set_px4_vx4x1 (self->vfx, 830 | PARAM_HPFX_VSE_BARK_RECONSTRUCT, self->vse_bark_cons); 831 | g_mutex_unlock (&self->lock); 832 | } 833 | break; 834 | 835 | case PROP_EQ_ENABLE: 836 | { 837 | g_mutex_lock (&self->lock); 838 | self->eq_enabled = g_value_get_boolean (value); 839 | viperfx_command_set_px4_vx4x1 (self->vfx, 840 | PARAM_HPFX_FIREQ_PROCESS_ENABLED, self->eq_enabled); 841 | g_mutex_unlock (&self->lock); 842 | } 843 | break; 844 | 845 | case PROP_EQ_BAND1: 846 | { 847 | g_mutex_lock (&self->lock); 848 | self->eq_band_level[0] = g_value_get_int (value); 849 | viperfx_command_set_px4_vx4x2 (self->vfx, 850 | PARAM_HPFX_FIREQ_BANDLEVEL, 0, self->eq_band_level[0]); 851 | g_mutex_unlock (&self->lock); 852 | } 853 | break; 854 | 855 | case PROP_EQ_BAND2: 856 | { 857 | g_mutex_lock (&self->lock); 858 | self->eq_band_level[1] = g_value_get_int (value); 859 | viperfx_command_set_px4_vx4x2 (self->vfx, 860 | PARAM_HPFX_FIREQ_BANDLEVEL, 1, self->eq_band_level[1]); 861 | g_mutex_unlock (&self->lock); 862 | } 863 | break; 864 | 865 | case PROP_EQ_BAND3: 866 | { 867 | g_mutex_lock (&self->lock); 868 | self->eq_band_level[2] = g_value_get_int (value); 869 | viperfx_command_set_px4_vx4x2 (self->vfx, 870 | PARAM_HPFX_FIREQ_BANDLEVEL, 2, self->eq_band_level[2]); 871 | g_mutex_unlock (&self->lock); 872 | } 873 | break; 874 | 875 | case PROP_EQ_BAND4: 876 | { 877 | g_mutex_lock (&self->lock); 878 | self->eq_band_level[3] = g_value_get_int (value); 879 | viperfx_command_set_px4_vx4x2 (self->vfx, 880 | PARAM_HPFX_FIREQ_BANDLEVEL, 3, self->eq_band_level[3]); 881 | g_mutex_unlock (&self->lock); 882 | } 883 | break; 884 | 885 | case PROP_EQ_BAND5: 886 | { 887 | g_mutex_lock (&self->lock); 888 | self->eq_band_level[4] = g_value_get_int (value); 889 | viperfx_command_set_px4_vx4x2 (self->vfx, 890 | PARAM_HPFX_FIREQ_BANDLEVEL, 4, self->eq_band_level[4]); 891 | g_mutex_unlock (&self->lock); 892 | } 893 | break; 894 | 895 | case PROP_EQ_BAND6: 896 | { 897 | g_mutex_lock (&self->lock); 898 | self->eq_band_level[5] = g_value_get_int (value); 899 | viperfx_command_set_px4_vx4x2 (self->vfx, 900 | PARAM_HPFX_FIREQ_BANDLEVEL, 5, self->eq_band_level[5]); 901 | g_mutex_unlock (&self->lock); 902 | } 903 | break; 904 | 905 | case PROP_EQ_BAND7: 906 | { 907 | g_mutex_lock (&self->lock); 908 | self->eq_band_level[6] = g_value_get_int (value); 909 | viperfx_command_set_px4_vx4x2 (self->vfx, 910 | PARAM_HPFX_FIREQ_BANDLEVEL, 6, self->eq_band_level[6]); 911 | g_mutex_unlock (&self->lock); 912 | } 913 | break; 914 | 915 | case PROP_EQ_BAND8: 916 | { 917 | g_mutex_lock (&self->lock); 918 | self->eq_band_level[7] = g_value_get_int (value); 919 | viperfx_command_set_px4_vx4x2 (self->vfx, 920 | PARAM_HPFX_FIREQ_BANDLEVEL, 7, self->eq_band_level[7]); 921 | g_mutex_unlock (&self->lock); 922 | } 923 | break; 924 | 925 | case PROP_EQ_BAND9: 926 | { 927 | g_mutex_lock (&self->lock); 928 | self->eq_band_level[8] = g_value_get_int (value); 929 | viperfx_command_set_px4_vx4x2 (self->vfx, 930 | PARAM_HPFX_FIREQ_BANDLEVEL, 8, self->eq_band_level[8]); 931 | g_mutex_unlock (&self->lock); 932 | } 933 | break; 934 | 935 | case PROP_EQ_BAND10: 936 | { 937 | g_mutex_lock (&self->lock); 938 | self->eq_band_level[9] = g_value_get_int (value); 939 | viperfx_command_set_px4_vx4x2 (self->vfx, 940 | PARAM_HPFX_FIREQ_BANDLEVEL, 9, self->eq_band_level[9]); 941 | g_mutex_unlock (&self->lock); 942 | } 943 | break; 944 | 945 | case PROP_COLM_ENABLE: 946 | { 947 | g_mutex_lock (&self->lock); 948 | self->colm_enabled = g_value_get_boolean (value); 949 | viperfx_command_set_px4_vx4x1 (self->vfx, 950 | PARAM_HPFX_COLM_PROCESS_ENABLED, self->colm_enabled); 951 | g_mutex_unlock (&self->lock); 952 | } 953 | break; 954 | 955 | case PROP_COLM_WIDENING: 956 | { 957 | g_mutex_lock (&self->lock); 958 | self->colm_widening = g_value_get_int (value); 959 | viperfx_command_set_px4_vx4x1 (self->vfx, 960 | PARAM_HPFX_COLM_WIDENING, self->colm_widening); 961 | g_mutex_unlock (&self->lock); 962 | } 963 | break; 964 | 965 | case PROP_COLM_MIDIMAGE: 966 | { 967 | g_mutex_lock (&self->lock); 968 | self->colm_midimage = g_value_get_int (value); 969 | viperfx_command_set_px4_vx4x1 (self->vfx, 970 | PARAM_HPFX_COLM_MIDIMAGE, self->colm_midimage); 971 | g_mutex_unlock (&self->lock); 972 | } 973 | break; 974 | 975 | case PROP_COLM_DEPTH: 976 | { 977 | float f_depth_val = (float) g_value_get_int (value); 978 | gint s_val = 0; 979 | f_depth_val = (f_depth_val / 32767.00f) * 600.00f; 980 | s_val = (gint) (f_depth_val + 200.0f); 981 | if (s_val < 200) s_val = 200; 982 | if (s_val > 800) s_val = 800; 983 | 984 | g_mutex_lock (&self->lock); 985 | self->colm_depth = s_val; 986 | viperfx_command_set_px4_vx4x1 (self->vfx, 987 | PARAM_HPFX_COLM_DEPTH, self->colm_depth); 988 | g_mutex_unlock (&self->lock); 989 | } 990 | break; 991 | 992 | case PROP_DS_ENABLE: 993 | { 994 | g_mutex_lock (&self->lock); 995 | self->ds_enabled = g_value_get_boolean (value); 996 | viperfx_command_set_px4_vx4x1 (self->vfx, 997 | PARAM_HPFX_DIFFSURR_PROCESS_ENABLED, self->ds_enabled); 998 | g_mutex_unlock (&self->lock); 999 | } 1000 | break; 1001 | 1002 | case PROP_DS_LEVEL: 1003 | { 1004 | g_mutex_lock (&self->lock); 1005 | self->ds_level = g_value_get_int (value) * 20; 1006 | if (self->ds_level < 0) self->ds_level = 0; 1007 | if (self->ds_level > 2000) self->ds_level = 2000; 1008 | viperfx_command_set_px4_vx4x1 (self->vfx, 1009 | PARAM_HPFX_DIFFSURR_DELAYTIME, self->ds_level); 1010 | g_mutex_unlock (&self->lock); 1011 | } 1012 | break; 1013 | 1014 | case PROP_REVERB_ENABLE: 1015 | { 1016 | g_mutex_lock (&self->lock); 1017 | self->reverb_enabled = g_value_get_boolean (value); 1018 | viperfx_command_set_px4_vx4x1 (self->vfx, 1019 | PARAM_HPFX_REVB_PROCESS_ENABLED, self->reverb_enabled); 1020 | g_mutex_unlock (&self->lock); 1021 | } 1022 | break; 1023 | 1024 | case PROP_REVERB_ROOMSIZE: 1025 | { 1026 | g_mutex_lock (&self->lock); 1027 | self->reverb_roomsize = g_value_get_int (value); 1028 | viperfx_command_set_px4_vx4x1 (self->vfx, 1029 | PARAM_HPFX_REVB_ROOMSIZE, self->reverb_roomsize); 1030 | g_mutex_unlock (&self->lock); 1031 | } 1032 | break; 1033 | 1034 | case PROP_REVERB_WIDTH: 1035 | { 1036 | g_mutex_lock (&self->lock); 1037 | self->reverb_width = g_value_get_int (value); 1038 | viperfx_command_set_px4_vx4x1 (self->vfx, 1039 | PARAM_HPFX_REVB_WIDTH, self->reverb_width); 1040 | g_mutex_unlock (&self->lock); 1041 | } 1042 | break; 1043 | 1044 | case PROP_REVERB_DAMP: 1045 | { 1046 | g_mutex_lock (&self->lock); 1047 | self->reverb_damp = g_value_get_int (value); 1048 | viperfx_command_set_px4_vx4x1 (self->vfx, 1049 | PARAM_HPFX_REVB_DAMP, self->reverb_damp); 1050 | g_mutex_unlock (&self->lock); 1051 | } 1052 | break; 1053 | 1054 | case PROP_REVERB_WET: 1055 | { 1056 | g_mutex_lock (&self->lock); 1057 | self->reverb_wet = g_value_get_int (value); 1058 | viperfx_command_set_px4_vx4x1 (self->vfx, 1059 | PARAM_HPFX_REVB_WET, self->reverb_wet); 1060 | g_mutex_unlock (&self->lock); 1061 | } 1062 | break; 1063 | 1064 | case PROP_REVERB_DRY: 1065 | { 1066 | g_mutex_lock (&self->lock); 1067 | self->reverb_dry = g_value_get_int (value); 1068 | viperfx_command_set_px4_vx4x1 (self->vfx, 1069 | PARAM_HPFX_REVB_DRY, self->reverb_dry); 1070 | g_mutex_unlock (&self->lock); 1071 | } 1072 | break; 1073 | 1074 | case PROP_AGC_ENABLE: 1075 | { 1076 | g_mutex_lock (&self->lock); 1077 | self->agc_enabled = g_value_get_boolean (value); 1078 | viperfx_command_set_px4_vx4x1 (self->vfx, 1079 | PARAM_HPFX_AGC_PROCESS_ENABLED, self->agc_enabled); 1080 | g_mutex_unlock (&self->lock); 1081 | } 1082 | break; 1083 | 1084 | case PROP_AGC_RATIO: 1085 | { 1086 | g_mutex_lock (&self->lock); 1087 | self->agc_ratio = g_value_get_int (value); 1088 | viperfx_command_set_px4_vx4x1 (self->vfx, 1089 | PARAM_HPFX_AGC_RATIO, self->agc_ratio); 1090 | g_mutex_unlock (&self->lock); 1091 | } 1092 | break; 1093 | 1094 | case PROP_AGC_VOLUME: 1095 | { 1096 | g_mutex_lock (&self->lock); 1097 | self->agc_volume = g_value_get_int (value); 1098 | viperfx_command_set_px4_vx4x1 (self->vfx, 1099 | PARAM_HPFX_AGC_VOLUME, self->agc_volume); 1100 | g_mutex_unlock (&self->lock); 1101 | } 1102 | break; 1103 | 1104 | case PROP_AGC_MAXGAIN: 1105 | { 1106 | g_mutex_lock (&self->lock); 1107 | self->agc_maxgain = g_value_get_int (value); 1108 | viperfx_command_set_px4_vx4x1 (self->vfx, 1109 | PARAM_HPFX_AGC_MAXSCALER, self->agc_maxgain); 1110 | g_mutex_unlock (&self->lock); 1111 | } 1112 | break; 1113 | 1114 | case PROP_VB_ENABLE: 1115 | { 1116 | g_mutex_lock (&self->lock); 1117 | self->vb_enabled = g_value_get_boolean (value); 1118 | viperfx_command_set_px4_vx4x1 (self->vfx, 1119 | PARAM_HPFX_VIPERBASS_PROCESS_ENABLED, self->vb_enabled); 1120 | g_mutex_unlock (&self->lock); 1121 | } 1122 | break; 1123 | 1124 | case PROP_VB_MODE: 1125 | { 1126 | g_mutex_lock (&self->lock); 1127 | self->vb_mode = g_value_get_int (value); 1128 | viperfx_command_set_px4_vx4x1 (self->vfx, 1129 | PARAM_HPFX_VIPERBASS_MODE, self->vb_mode); 1130 | g_mutex_unlock (&self->lock); 1131 | } 1132 | break; 1133 | 1134 | case PROP_VB_FREQ: 1135 | { 1136 | g_mutex_lock (&self->lock); 1137 | self->vb_freq = g_value_get_int (value); 1138 | viperfx_command_set_px4_vx4x1 (self->vfx, 1139 | PARAM_HPFX_VIPERBASS_SPEAKER, self->vb_freq); 1140 | g_mutex_unlock (&self->lock); 1141 | } 1142 | break; 1143 | 1144 | case PROP_VB_GAIN: 1145 | { 1146 | g_mutex_lock (&self->lock); 1147 | self->vb_gain = g_value_get_int (value); 1148 | viperfx_command_set_px4_vx4x1 (self->vfx, 1149 | PARAM_HPFX_VIPERBASS_BASSGAIN, self->vb_gain); 1150 | g_mutex_unlock (&self->lock); 1151 | } 1152 | break; 1153 | 1154 | case PROP_VC_ENABLE: 1155 | { 1156 | g_mutex_lock (&self->lock); 1157 | self->vc_enabled = g_value_get_boolean (value); 1158 | viperfx_command_set_px4_vx4x1 (self->vfx, 1159 | PARAM_HPFX_VIPERCLARITY_PROCESS_ENABLED, self->vc_enabled); 1160 | g_mutex_unlock (&self->lock); 1161 | } 1162 | break; 1163 | 1164 | case PROP_VC_MODE: 1165 | { 1166 | g_mutex_lock (&self->lock); 1167 | self->vc_mode = g_value_get_int (value); 1168 | viperfx_command_set_px4_vx4x1 (self->vfx, 1169 | PARAM_HPFX_VIPERCLARITY_MODE, self->vc_mode); 1170 | g_mutex_unlock (&self->lock); 1171 | } 1172 | break; 1173 | 1174 | case PROP_VC_LEVEL: 1175 | { 1176 | g_mutex_lock (&self->lock); 1177 | self->vc_level = g_value_get_int (value); 1178 | viperfx_command_set_px4_vx4x1 (self->vfx, 1179 | PARAM_HPFX_VIPERCLARITY_CLARITY, self->vc_level); 1180 | g_mutex_unlock (&self->lock); 1181 | } 1182 | break; 1183 | 1184 | case PROP_CURE_ENABLE: 1185 | { 1186 | g_mutex_lock (&self->lock); 1187 | self->cure_enabled = g_value_get_boolean (value); 1188 | viperfx_command_set_px4_vx4x1 (self->vfx, 1189 | PARAM_HPFX_CURE_PROCESS_ENABLED, self->cure_enabled); 1190 | g_mutex_unlock (&self->lock); 1191 | } 1192 | break; 1193 | 1194 | case PROP_CURE_LEVEL: 1195 | { 1196 | g_mutex_lock (&self->lock); 1197 | self->cure_level = g_value_get_int (value); 1198 | viperfx_command_set_px4_vx4x1 (self->vfx, 1199 | PARAM_HPFX_CURE_CROSSFEED, self->cure_level); 1200 | g_mutex_unlock (&self->lock); 1201 | } 1202 | break; 1203 | 1204 | case PROP_TUBE_ENABLE: 1205 | { 1206 | g_mutex_lock (&self->lock); 1207 | self->tube_enabled = g_value_get_boolean (value); 1208 | viperfx_command_set_px4_vx4x1 (self->vfx, 1209 | PARAM_HPFX_TUBE_PROCESS_ENABLED, self->tube_enabled); 1210 | g_mutex_unlock (&self->lock); 1211 | } 1212 | break; 1213 | 1214 | case PROP_AX_ENABLE: 1215 | { 1216 | g_mutex_lock (&self->lock); 1217 | self->ax_enabled = g_value_get_boolean (value); 1218 | viperfx_command_set_px4_vx4x1 (self->vfx, 1219 | PARAM_HPFX_ANALOGX_PROCESS_ENABLED, self->ax_enabled); 1220 | g_mutex_unlock (&self->lock); 1221 | } 1222 | break; 1223 | 1224 | case PROP_AX_MODE: 1225 | { 1226 | g_mutex_lock (&self->lock); 1227 | self->ax_mode = g_value_get_int (value); 1228 | viperfx_command_set_px4_vx4x1 (self->vfx, 1229 | PARAM_HPFX_ANALOGX_MODE, self->ax_mode); 1230 | g_mutex_unlock (&self->lock); 1231 | } 1232 | break; 1233 | 1234 | case PROP_FETCOMP_ENABLE: 1235 | { 1236 | g_mutex_lock (&self->lock); 1237 | self->fetcomp_enabled = g_value_get_boolean (value); 1238 | viperfx_command_set_px4_vx4x1 (self->vfx, 1239 | PARAM_HPFX_FETCOMP_PROCESS_ENABLED, self->fetcomp_enabled); 1240 | g_mutex_unlock (&self->lock); 1241 | } 1242 | break; 1243 | 1244 | case PROP_FETCOMP_THRESHOLD: 1245 | { 1246 | g_mutex_lock (&self->lock); 1247 | self->fetcomp_threshold = g_value_get_int (value); 1248 | viperfx_command_set_px4_vx4x1 (self->vfx, 1249 | PARAM_HPFX_FETCOMP_THRESHOLD, self->fetcomp_threshold); 1250 | g_mutex_unlock (&self->lock); 1251 | } 1252 | break; 1253 | 1254 | case PROP_FETCOMP_RATIO: 1255 | { 1256 | g_mutex_lock (&self->lock); 1257 | self->fetcomp_ratio = g_value_get_int (value); 1258 | viperfx_command_set_px4_vx4x1 (self->vfx, 1259 | PARAM_HPFX_FETCOMP_RATIO, self->fetcomp_ratio); 1260 | g_mutex_unlock (&self->lock); 1261 | } 1262 | break; 1263 | 1264 | case PROP_FETCOMP_KNEEWIDTH: 1265 | { 1266 | g_mutex_lock (&self->lock); 1267 | self->fetcomp_kneewidth = g_value_get_int (value); 1268 | viperfx_command_set_px4_vx4x1 (self->vfx, 1269 | PARAM_HPFX_FETCOMP_KNEEWIDTH, self->fetcomp_kneewidth); 1270 | g_mutex_unlock (&self->lock); 1271 | } 1272 | break; 1273 | 1274 | case PROP_FETCOMP_AUTOKNEE: 1275 | { 1276 | g_mutex_lock (&self->lock); 1277 | self->fetcomp_autoknee = g_value_get_boolean (value); 1278 | viperfx_command_set_px4_vx4x1 (self->vfx, 1279 | PARAM_HPFX_FETCOMP_AUTOKNEE_ENABLED, self->fetcomp_autoknee); 1280 | g_mutex_unlock (&self->lock); 1281 | } 1282 | break; 1283 | 1284 | case PROP_FETCOMP_GAIN: 1285 | { 1286 | g_mutex_lock (&self->lock); 1287 | self->fetcomp_gain = g_value_get_int (value); 1288 | viperfx_command_set_px4_vx4x1 (self->vfx, 1289 | PARAM_HPFX_FETCOMP_GAIN, self->fetcomp_gain); 1290 | g_mutex_unlock (&self->lock); 1291 | } 1292 | break; 1293 | 1294 | case PROP_FETCOMP_AUTOGAIN: 1295 | { 1296 | g_mutex_lock (&self->lock); 1297 | self->fetcomp_autogain = g_value_get_boolean (value); 1298 | viperfx_command_set_px4_vx4x1 (self->vfx, 1299 | PARAM_HPFX_FETCOMP_AUTOGAIN_ENABLED, self->fetcomp_autogain); 1300 | g_mutex_unlock (&self->lock); 1301 | } 1302 | break; 1303 | 1304 | case PROP_FETCOMP_ATTACK: 1305 | { 1306 | g_mutex_lock (&self->lock); 1307 | self->fetcomp_attack = g_value_get_int (value); 1308 | viperfx_command_set_px4_vx4x1 (self->vfx, 1309 | PARAM_HPFX_FETCOMP_ATTACK, self->fetcomp_attack); 1310 | g_mutex_unlock (&self->lock); 1311 | } 1312 | break; 1313 | 1314 | case PROP_FETCOMP_AUTOATTACK: 1315 | { 1316 | g_mutex_lock (&self->lock); 1317 | self->fetcomp_autoattack = g_value_get_boolean (value); 1318 | viperfx_command_set_px4_vx4x1 (self->vfx, 1319 | PARAM_HPFX_FETCOMP_AUTOATTACK_ENABLED, self->fetcomp_autoattack); 1320 | g_mutex_unlock (&self->lock); 1321 | } 1322 | break; 1323 | 1324 | case PROP_FETCOMP_RELEASE: 1325 | { 1326 | g_mutex_lock (&self->lock); 1327 | self->fetcomp_release = g_value_get_int (value); 1328 | viperfx_command_set_px4_vx4x1 (self->vfx, 1329 | PARAM_HPFX_FETCOMP_RELEASE, self->fetcomp_release); 1330 | g_mutex_unlock (&self->lock); 1331 | } 1332 | break; 1333 | 1334 | case PROP_FETCOMP_AUTORELEASE: 1335 | { 1336 | g_mutex_lock (&self->lock); 1337 | self->fetcomp_autorelease = g_value_get_boolean (value); 1338 | viperfx_command_set_px4_vx4x1 (self->vfx, 1339 | PARAM_HPFX_FETCOMP_AUTORELEASE_ENABLED, self->fetcomp_autorelease); 1340 | g_mutex_unlock (&self->lock); 1341 | } 1342 | break; 1343 | 1344 | case PROP_FETCOMP_META_KNEEMULTI: 1345 | { 1346 | g_mutex_lock (&self->lock); 1347 | self->fetcomp_meta_kneemulti = g_value_get_int (value); 1348 | viperfx_command_set_px4_vx4x1 (self->vfx, 1349 | PARAM_HPFX_FETCOMP_META_KNEEMULTI, self->fetcomp_meta_kneemulti); 1350 | g_mutex_unlock (&self->lock); 1351 | } 1352 | break; 1353 | 1354 | case PROP_FETCOMP_META_MAXATTACK: 1355 | { 1356 | g_mutex_lock (&self->lock); 1357 | self->fetcomp_meta_maxattack = g_value_get_int (value); 1358 | viperfx_command_set_px4_vx4x1 (self->vfx, 1359 | PARAM_HPFX_FETCOMP_META_MAXATTACK, self->fetcomp_meta_maxattack); 1360 | g_mutex_unlock (&self->lock); 1361 | } 1362 | break; 1363 | 1364 | case PROP_FETCOMP_META_MAXRELEASE: 1365 | { 1366 | g_mutex_lock (&self->lock); 1367 | self->fetcomp_meta_maxrelease = g_value_get_int (value); 1368 | viperfx_command_set_px4_vx4x1 (self->vfx, 1369 | PARAM_HPFX_FETCOMP_META_MAXRELEASE, self->fetcomp_meta_maxrelease); 1370 | g_mutex_unlock (&self->lock); 1371 | } 1372 | break; 1373 | 1374 | case PROP_FETCOMP_META_CREST: 1375 | { 1376 | g_mutex_lock (&self->lock); 1377 | self->fetcomp_meta_crest = g_value_get_int (value); 1378 | viperfx_command_set_px4_vx4x1 (self->vfx, 1379 | PARAM_HPFX_FETCOMP_META_CREST, self->fetcomp_meta_crest); 1380 | g_mutex_unlock (&self->lock); 1381 | } 1382 | break; 1383 | 1384 | case PROP_FETCOMP_META_ADAPT: 1385 | { 1386 | g_mutex_lock (&self->lock); 1387 | self->fetcomp_meta_adapt = g_value_get_int (value); 1388 | viperfx_command_set_px4_vx4x1 (self->vfx, 1389 | PARAM_HPFX_FETCOMP_META_ADAPT, self->fetcomp_meta_adapt); 1390 | g_mutex_unlock (&self->lock); 1391 | } 1392 | break; 1393 | 1394 | case PROP_FETCOMP_NOCLIP: 1395 | { 1396 | g_mutex_lock (&self->lock); 1397 | self->fetcomp_noclip = g_value_get_boolean (value); 1398 | viperfx_command_set_px4_vx4x1 (self->vfx, 1399 | PARAM_HPFX_FETCOMP_META_NOCLIP_ENABLED, self->fetcomp_noclip); 1400 | g_mutex_unlock (&self->lock); 1401 | } 1402 | break; 1403 | 1404 | case PROP_OUT_VOLUME: 1405 | { 1406 | g_mutex_lock (&self->lock); 1407 | self->out_volume = g_value_get_int (value); 1408 | viperfx_command_set_px4_vx4x1 (self->vfx, 1409 | PARAM_HPFX_OUTPUT_VOLUME, self->out_volume); 1410 | g_mutex_unlock (&self->lock); 1411 | } 1412 | break; 1413 | 1414 | case PROP_OUT_PAN: 1415 | { 1416 | g_mutex_lock (&self->lock); 1417 | self->out_pan = g_value_get_int (value); 1418 | viperfx_command_set_px4_vx4x1 (self->vfx, 1419 | PARAM_HPFX_OUTPUT_PAN, self->out_pan); 1420 | g_mutex_unlock (&self->lock); 1421 | } 1422 | break; 1423 | 1424 | case PROP_LIM_THRESHOLD: 1425 | { 1426 | g_mutex_lock (&self->lock); 1427 | self->lim_threshold = g_value_get_int (value); 1428 | viperfx_command_set_px4_vx4x1 (self->vfx, 1429 | PARAM_HPFX_LIMITER_THRESHOLD, self->lim_threshold); 1430 | g_mutex_unlock (&self->lock); 1431 | } 1432 | break; 1433 | 1434 | default: 1435 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 1436 | break; 1437 | } 1438 | } 1439 | 1440 | static void 1441 | gst_viperfx_get_property (GObject * object, guint prop_id, 1442 | GValue * value, GParamSpec * pspec) 1443 | { 1444 | Gstviperfx *self = GST_VIPERFX (object); 1445 | 1446 | switch (prop_id) { 1447 | 1448 | default: 1449 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 1450 | break; 1451 | } 1452 | } 1453 | 1454 | /* GstBaseTransform vmethod implementations */ 1455 | 1456 | static gboolean 1457 | gst_viperfx_setup (GstAudioFilter * base, const GstAudioInfo * info) 1458 | { 1459 | Gstviperfx *self = GST_VIPERFX (base); 1460 | gint sample_rate = 0; 1461 | 1462 | if (self->vfx == NULL) 1463 | return FALSE; 1464 | 1465 | if (info) { 1466 | sample_rate = GST_AUDIO_INFO_RATE (info); 1467 | } else { 1468 | sample_rate = GST_AUDIO_FILTER_RATE (self); 1469 | } 1470 | if (sample_rate <= 0) 1471 | return FALSE; 1472 | 1473 | GST_DEBUG_OBJECT (self, "current sample_rate = %d", sample_rate); 1474 | 1475 | g_mutex_lock (&self->lock); 1476 | if (!self->vfx->set_samplerate (self->vfx, sample_rate)) { 1477 | g_mutex_unlock (&self->lock); 1478 | return FALSE; 1479 | } 1480 | if (!self->vfx->set_channels (self->vfx, 2)) { 1481 | g_mutex_unlock (&self->lock); 1482 | return FALSE; 1483 | } 1484 | self->vfx->reset (self->vfx); 1485 | g_mutex_unlock (&self->lock); 1486 | 1487 | return TRUE; 1488 | } 1489 | 1490 | static gboolean 1491 | gst_viperfx_stop (GstBaseTransform * base) 1492 | { 1493 | Gstviperfx *self = GST_VIPERFX (base); 1494 | 1495 | if (self->vfx == NULL) 1496 | return TRUE; 1497 | g_mutex_lock (&self->lock); 1498 | self->vfx->reset (self->vfx); 1499 | g_mutex_unlock (&self->lock); 1500 | 1501 | return TRUE; 1502 | } 1503 | 1504 | /* this function does the actual processing 1505 | */ 1506 | static GstFlowReturn 1507 | gst_viperfx_transform_ip (GstBaseTransform * base, GstBuffer * buf) 1508 | { 1509 | Gstviperfx *filter = GST_VIPERFX (base); 1510 | guint idx, num_samples; 1511 | short *pcm_data; 1512 | GstClockTime timestamp, stream_time; 1513 | GstMapInfo map; 1514 | 1515 | timestamp = GST_BUFFER_TIMESTAMP (buf); 1516 | stream_time = 1517 | gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); 1518 | 1519 | if (GST_CLOCK_TIME_IS_VALID (stream_time)) 1520 | gst_object_sync_values (GST_OBJECT (filter), stream_time); 1521 | 1522 | if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_GAP))) 1523 | return GST_FLOW_OK; 1524 | 1525 | gst_buffer_map (buf, &map, GST_MAP_READWRITE); 1526 | num_samples = map.size / GST_AUDIO_FILTER_BPS (filter) / 2; 1527 | pcm_data = (short *)(map.data); 1528 | for (idx = 0; idx < num_samples * 2; idx++) 1529 | pcm_data[idx] >>= 1; 1530 | if (filter->vfx != NULL) { 1531 | g_mutex_lock (&filter->lock); 1532 | filter->vfx->process (filter->vfx, 1533 | pcm_data, (int)num_samples); 1534 | g_mutex_unlock (&filter->lock); 1535 | } 1536 | gst_buffer_unmap (buf, &map); 1537 | 1538 | return GST_FLOW_OK; 1539 | } 1540 | 1541 | /* entry point to initialize the plug-in 1542 | * initialize the plug-in itself 1543 | * register the element factories and other features 1544 | */ 1545 | static gboolean 1546 | viperfx_init (GstPlugin * viperfx) 1547 | { 1548 | return gst_element_register (viperfx, "viperfx", GST_RANK_NONE, 1549 | GST_TYPE_VIPERFX); 1550 | } 1551 | 1552 | /* gstreamer looks for this structure to register viperfxs 1553 | */ 1554 | GST_PLUGIN_DEFINE ( 1555 | GST_VERSION_MAJOR, 1556 | GST_VERSION_MINOR, 1557 | viperfx, 1558 | "viperfx element", 1559 | viperfx_init, 1560 | VERSION, 1561 | "NonGPL", 1562 | "GStreamer", 1563 | "http://gstreamer.net/" 1564 | ) 1565 | --------------------------------------------------------------------------------