mirror of
https://github.com/cookiengineer/audacity
synced 2025-04-30 23:59:41 +02:00
Remove sc4 plugin from CMake build
This commit is contained in:
parent
a461b7a273
commit
2a4421bf92
@ -421,11 +421,6 @@ add_subdirectory( "cmake-proxies/mod-nyq-bench" )
|
||||
add_subdirectory( "cmake-proxies/mod-script-pipe" )
|
||||
add_subdirectory( "scripts" )
|
||||
|
||||
# Only need the sc4_1882 Ladspa plug-in on Windows and Mac
|
||||
if( CMAKE_SYSTEM_NAME MATCHES "Windows|Darwin" )
|
||||
add_subdirectory( "cmake-proxies/ladspa-plugins" )
|
||||
endif()
|
||||
|
||||
# Uncomment what follows for symbol values.
|
||||
#[[
|
||||
get_cmake_property( _variableNames VARIABLES )
|
||||
|
@ -1,44 +0,0 @@
|
||||
|
||||
set( TARGET sc4_1882 )
|
||||
set( TARGET_ROOT "${_SRCDIR}" )
|
||||
|
||||
message( STATUS "========== Configuring ${TARGET} ==========" )
|
||||
|
||||
add_library( ${TARGET} MODULE EXCLUDE_FROM_ALL )
|
||||
add_dependencies( Audacity ${TARGET} )
|
||||
|
||||
def_vars()
|
||||
|
||||
list( APPEND SOURCES
|
||||
PRIVATE
|
||||
${_SRCDIR}/sc4_1882.c
|
||||
${_SRCDIR}/util/db.c
|
||||
${_SRCDIR}/util/rms.c
|
||||
)
|
||||
|
||||
list( APPEND INCLUDES
|
||||
PRIVATE
|
||||
${_SRCDIR}
|
||||
)
|
||||
|
||||
list( APPEND OPTIONS
|
||||
PRIVATE
|
||||
$<$<C_COMPILER_ID:AppleClang,Clang,GNU>:-D_init=__attribute__\(\(constructor\)\)_${TARGET}_init>
|
||||
$<$<BOOL:HAVE_LRINTF>:-DHAVE_LRINTF=1>
|
||||
)
|
||||
|
||||
set_target_property_all( ${TARGET}
|
||||
LIBRARY_OUTPUT_DIRECTORY
|
||||
"${_DEST}/plug-ins"
|
||||
)
|
||||
|
||||
set_target_properties( ${TARGET}
|
||||
PROPERTIES
|
||||
PREFIX ""
|
||||
FOLDER "lib-src"
|
||||
)
|
||||
|
||||
target_sources( ${TARGET} PRIVATE ${SOURCES} )
|
||||
target_compile_options( ${TARGET} PRIVATE ${OPTIONS} )
|
||||
target_include_directories( ${TARGET} PRIVATE ${INCLUDES} )
|
||||
|
@ -1,340 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
@ -1,6 +0,0 @@
|
||||
This plug-in was extracted from the swh-plugins found here:
|
||||
|
||||
http://plugin.org.uk/
|
||||
|
||||
See COPYING for license information.
|
||||
|
@ -1 +0,0 @@
|
||||
|
@ -1,235 +0,0 @@
|
||||
/* Some misc util functions for audio DSP work, written by Steve Harris,
|
||||
* December 2000
|
||||
*
|
||||
* steve@plugin.org.uk
|
||||
*/
|
||||
|
||||
#ifndef LADSPA_UTIL_H
|
||||
#define LADSPA_UTIL_H
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
// 16.16 fixpoint
|
||||
typedef union {
|
||||
int32_t all;
|
||||
struct {
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
int16_t in;
|
||||
uint16_t fr;
|
||||
#else
|
||||
uint16_t fr;
|
||||
int16_t in;
|
||||
#endif
|
||||
} part;
|
||||
} fixp16;
|
||||
|
||||
// 32.32 fixpoint
|
||||
typedef union {
|
||||
int64_t all;
|
||||
struct {
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
int32_t in;
|
||||
uint32_t fr;
|
||||
#else
|
||||
uint32_t fr;
|
||||
int32_t in;
|
||||
#endif
|
||||
} part;
|
||||
} fixp32;
|
||||
|
||||
/* 32 bit "pointer cast" union */
|
||||
typedef union {
|
||||
float f;
|
||||
int32_t i;
|
||||
} ls_pcast32;
|
||||
|
||||
// Sometimes it doesn't get defined, even though it eists and C99 is declared
|
||||
#if !defined(HAVE_LRINTF)
|
||||
long int lrintf (float x);
|
||||
#endif
|
||||
|
||||
// 1.0 / ln(2)
|
||||
#define LN2R 1.442695041f
|
||||
|
||||
/* detet floating point denormal numbers by comparing them to the smallest
|
||||
* normal, crap, but reliable */
|
||||
#define DN_CHECK(x, l) if (fabs(x) < 1e-38) printf("DN: "l"\n")
|
||||
|
||||
// Denormalise floats, only actually needed for PIII and recent PowerPC
|
||||
//#define FLUSH_TO_ZERO(fv) (((*(unsigned int*)&(fv))&0x7f800000)==0)?0.0f:(fv)
|
||||
|
||||
static inline float flush_to_zero(float f)
|
||||
{
|
||||
ls_pcast32 v;
|
||||
|
||||
v.f = f;
|
||||
|
||||
// original: return (v.i & 0x7f800000) == 0 ? 0.0f : f;
|
||||
// version from Tim Blechmann
|
||||
return (v.i & 0x7f800000) < 0x08000000 ? 0.0f : f;
|
||||
}
|
||||
|
||||
static inline void round_to_zero(volatile float *f)
|
||||
{
|
||||
*f += 1e-18;
|
||||
*f -= 1e-18;
|
||||
}
|
||||
|
||||
/* A set of branchless clipping operations from Laurent de Soras */
|
||||
|
||||
static inline float f_max(float x, float a)
|
||||
{
|
||||
x -= a;
|
||||
x += fabs(x);
|
||||
x *= 0.5;
|
||||
x += a;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline float f_min(float x, float b)
|
||||
{
|
||||
x = b - x;
|
||||
x += fabs(x);
|
||||
x *= 0.5;
|
||||
x = b - x;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline float f_clamp(float x, float a, float b)
|
||||
{
|
||||
const float x1 = fabs(x - a);
|
||||
const float x2 = fabs(x - b);
|
||||
|
||||
x = x1 + a + b;
|
||||
x -= x2;
|
||||
x *= 0.5;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
// Limit a value to be l<=v<=u
|
||||
#define LIMIT(v,l,u) ((v)<(l)?(l):((v)>(u)?(u):(v)))
|
||||
|
||||
// Truncate-to-zero modulo (ANSI C doesn't specify) will only work
|
||||
// if -m < v < 2m
|
||||
#define MOD(v,m) (v<0?v+m:(v>=m?v-m:v))
|
||||
|
||||
// Truncate-to-zero modulo (ANSI C doesn't specify) will only work
|
||||
// if v > -m and v < m
|
||||
#define NEG_MOD(v,m) ((v)<0?((v)+(m)):(v))
|
||||
|
||||
// Convert a value in dB's to a coefficent
|
||||
#define DB_CO(g) ((g) > -90.0f ? powf(10.0f, (g) * 0.05f) : 0.0f)
|
||||
#define CO_DB(v) (20.0f * log10f(v))
|
||||
|
||||
// Linearly interpolate [ = a * (1 - f) + b * f]
|
||||
#define LIN_INTERP(f,a,b) ((a) + (f) * ((b) - (a)))
|
||||
|
||||
// Cubic interpolation function
|
||||
static inline float cube_interp(const float fr, const float inm1, const float
|
||||
in, const float inp1, const float inp2)
|
||||
{
|
||||
return in + 0.5f * fr * (inp1 - inm1 +
|
||||
fr * (4.0f * inp1 + 2.0f * inm1 - 5.0f * in - inp2 +
|
||||
fr * (3.0f * (in - inp1) - inm1 + inp2)));
|
||||
}
|
||||
|
||||
/* fast sin^2 aproxiamtion, adapted from jan AT rpgfan's posting to the
|
||||
* music-dsp list */
|
||||
static inline float f_sin_sq(float angle)
|
||||
{
|
||||
const float asqr = angle * angle;
|
||||
float result = -2.39e-08f;
|
||||
|
||||
result *= asqr;
|
||||
result += 2.7526e-06f;
|
||||
result *= asqr;
|
||||
result -= 1.98409e-04f;
|
||||
result *= asqr;
|
||||
result += 8.3333315e-03f;
|
||||
result *= asqr;
|
||||
result -= 1.666666664e-01f;
|
||||
result *= asqr;
|
||||
result += 1.0f;
|
||||
result *= angle;
|
||||
|
||||
return result * result;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LRINTF
|
||||
|
||||
#define f_round(f) lrintf(f)
|
||||
|
||||
#else
|
||||
|
||||
// Round float to int using IEEE int* hack
|
||||
static inline int f_round(float f)
|
||||
{
|
||||
ls_pcast32 p;
|
||||
|
||||
p.f = f;
|
||||
p.f += (3<<22);
|
||||
|
||||
return p.i - 0x4b400000;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Truncate float to int
|
||||
static inline int f_trunc(float f)
|
||||
{
|
||||
return f_round(floorf(f));
|
||||
}
|
||||
|
||||
/* Andrew Simper's pow(2, x) aproximation from the music-dsp list */
|
||||
|
||||
#if 0
|
||||
|
||||
/* original */
|
||||
static inline float f_pow2(float x)
|
||||
{
|
||||
long *px = (long*)(&x); // store address of float as long pointer
|
||||
const float tx = (x-0.5f) + (3<<22); // temporary value for truncation
|
||||
const long lx = *((long*)&tx) - 0x4b400000; // integer power of 2
|
||||
const float dx = x-(float)(lx); // float remainder of power of 2
|
||||
|
||||
x = 1.0f + dx*(0.6960656421638072f + // cubic apporoximation of 2^x
|
||||
dx*(0.224494337302845f + // for x in the range [0, 1]
|
||||
dx*(0.07944023841053369f)));
|
||||
*px += (lx<<23); // add integer power of 2 to exponent
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* union version */
|
||||
static inline float f_pow2(float x)
|
||||
{
|
||||
ls_pcast32 *px, tx, lx;
|
||||
float dx;
|
||||
|
||||
px = (ls_pcast32 *)&x; // store address of float as long pointer
|
||||
tx.f = (x-0.5f) + (3<<22); // temporary value for truncation
|
||||
lx.i = tx.i - 0x4b400000; // integer power of 2
|
||||
dx = x - (float)lx.i; // float remainder of power of 2
|
||||
|
||||
x = 1.0f + dx * (0.6960656421638072f + // cubic apporoximation of 2^x
|
||||
dx * (0.224494337302845f + // for x in the range [0, 1]
|
||||
dx * (0.07944023841053369f)));
|
||||
(*px).i += (lx.i << 23); // add integer power of 2 to exponent
|
||||
|
||||
return (*px).f;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Fast exponentiation function, y = e^x */
|
||||
#define f_exp(x) f_pow2(x * LN2R)
|
||||
|
||||
#endif
|
@ -1,602 +0,0 @@
|
||||
/* ladspa.h
|
||||
|
||||
Linux Audio Developer's Simple Plugin API Version 1.1[provisional,
|
||||
LGPL]. Copyright (C) 2000-2002 Richard W.E. Furse, Paul
|
||||
Barton-Davis, Stefan Westerfeld.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public License
|
||||
as published by the Free Software Foundation; either version 2.1 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA. */
|
||||
|
||||
#ifndef LADSPA_INCLUDED
|
||||
#define LADSPA_INCLUDED
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Overview:
|
||||
|
||||
There is a large number of synthesis packages in use or development
|
||||
on the Linux platform at this time. This API (`The Linux Audio
|
||||
Developer's Simple Plugin API') attempts to give programmers the
|
||||
ability to write simple `plugin' audio processors in C/C++ and link
|
||||
them dynamically (`plug') into a range of these packages (`hosts').
|
||||
It should be possible for any host and any plugin to communicate
|
||||
completely through this interface.
|
||||
|
||||
This API is deliberately short and simple. To achieve compatibility
|
||||
with a range of promising Linux sound synthesis packages it
|
||||
attempts to find the `greatest common divisor' in their logical
|
||||
behaviour. Having said this, certain limiting decisions are
|
||||
implicit, notably the use of a fixed type (LADSPA_Data) for all
|
||||
data transfer and absence of a parameterised `initialisation'
|
||||
phase. See below for the LADSPA_Data typedef.
|
||||
|
||||
Plugins are expected to distinguish between control and audio
|
||||
data. Plugins have `ports' that are inputs or outputs for audio or
|
||||
control data and each plugin is `run' for a `block' corresponding
|
||||
to a short time interval measured in samples. Audio data is
|
||||
communicated using arrays of LADSPA_Data, allowing a block of audio
|
||||
to be processed by the plugin in a single pass. Control data is
|
||||
communicated using single LADSPA_Data values. Control data has a
|
||||
single value at the start of a call to the `run()' or `run_adding()'
|
||||
function, and may be considered to remain this value for its
|
||||
duration. The plugin may assume that all its input and output ports
|
||||
have been connected to the relevant data location (see the
|
||||
`connect_port()' function below) before it is asked to run.
|
||||
|
||||
Plugins will reside in shared object files suitable for dynamic
|
||||
linking by dlopen() and family. The file will provide a number of
|
||||
`plugin types' that can be used to instantiate actual plugins
|
||||
(sometimes known as `plugin instances') that can be connected
|
||||
together to perform tasks.
|
||||
|
||||
This API contains very limited error-handling. */
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Fundamental data type passed in and out of plugin. This data type
|
||||
is used to communicate audio samples and control values. It is
|
||||
assumed that the plugin will work sensibly given any numeric input
|
||||
value although it may have a preferred range (see hints below).
|
||||
|
||||
For audio it is generally assumed that 1.0f is the `0dB' reference
|
||||
amplitude and is a `normal' signal level. */
|
||||
|
||||
typedef float LADSPA_Data;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Special Plugin Properties:
|
||||
|
||||
Optional features of the plugin type are encapsulated in the
|
||||
LADSPA_Properties type. This is assembled by ORing individual
|
||||
properties together. */
|
||||
|
||||
typedef int LADSPA_Properties;
|
||||
|
||||
/* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a
|
||||
real-time dependency (e.g. listens to a MIDI device) and so its
|
||||
output must not be cached or subject to significant latency. */
|
||||
#define LADSPA_PROPERTY_REALTIME 0x1
|
||||
|
||||
/* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin
|
||||
may cease to work correctly if the host elects to use the same data
|
||||
location for both input and output (see connect_port()). This
|
||||
should be avoided as enabling this flag makes it impossible for
|
||||
hosts to use the plugin to process audio `in-place.' */
|
||||
#define LADSPA_PROPERTY_INPLACE_BROKEN 0x2
|
||||
|
||||
/* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin
|
||||
is capable of running not only in a conventional host but also in a
|
||||
`hard real-time' environment. To qualify for this the plugin must
|
||||
satisfy all of the following:
|
||||
|
||||
(1) The plugin must not use malloc(), free() or other heap memory
|
||||
management within its run() or run_adding() functions. All new
|
||||
memory used in run() must be managed via the stack. These
|
||||
restrictions only apply to the run() function.
|
||||
|
||||
(2) The plugin will not attempt to make use of any library
|
||||
functions with the exceptions of functions in the ANSI standard C
|
||||
and C maths libraries, which the host is expected to provide.
|
||||
|
||||
(3) The plugin will not access files, devices, pipes, sockets, IPC
|
||||
or any other mechanism that might result in process or thread
|
||||
blocking.
|
||||
|
||||
(4) The plugin will take an amount of time to execute a run() or
|
||||
run_adding() call approximately of form (A+B*SampleCount) where A
|
||||
and B depend on the machine and host in use. This amount of time
|
||||
may not depend on input signals or plugin state. The host is left
|
||||
the responsibility to perform timings to estimate upper bounds for
|
||||
A and B. */
|
||||
#define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4
|
||||
|
||||
#define LADSPA_IS_REALTIME(x) ((x) & LADSPA_PROPERTY_REALTIME)
|
||||
#define LADSPA_IS_INPLACE_BROKEN(x) ((x) & LADSPA_PROPERTY_INPLACE_BROKEN)
|
||||
#define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Plugin Ports:
|
||||
|
||||
Plugins have `ports' that are inputs or outputs for audio or
|
||||
data. Ports can communicate arrays of LADSPA_Data (for audio
|
||||
inputs/outputs) or single LADSPA_Data values (for control
|
||||
input/outputs). This information is encapsulated in the
|
||||
LADSPA_PortDescriptor type which is assembled by ORing individual
|
||||
properties together.
|
||||
|
||||
Note that a port must be an input or an output port but not both
|
||||
and that a port must be a control or audio port but not both. */
|
||||
|
||||
typedef int LADSPA_PortDescriptor;
|
||||
|
||||
/* Property LADSPA_PORT_INPUT indicates that the port is an input. */
|
||||
#define LADSPA_PORT_INPUT 0x1
|
||||
|
||||
/* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */
|
||||
#define LADSPA_PORT_OUTPUT 0x2
|
||||
|
||||
/* Property LADSPA_PORT_CONTROL indicates that the port is a control
|
||||
port. */
|
||||
#define LADSPA_PORT_CONTROL 0x4
|
||||
|
||||
/* Property LADSPA_PORT_AUDIO indicates that the port is a audio
|
||||
port. */
|
||||
#define LADSPA_PORT_AUDIO 0x8
|
||||
|
||||
#define LADSPA_IS_PORT_INPUT(x) ((x) & LADSPA_PORT_INPUT)
|
||||
#define LADSPA_IS_PORT_OUTPUT(x) ((x) & LADSPA_PORT_OUTPUT)
|
||||
#define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL)
|
||||
#define LADSPA_IS_PORT_AUDIO(x) ((x) & LADSPA_PORT_AUDIO)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Plugin Port Range Hints:
|
||||
|
||||
The host may wish to provide a representation of data entering or
|
||||
leaving a plugin (e.g. to generate a GUI automatically). To make
|
||||
this more meaningful, the plugin should provide `hints' to the host
|
||||
describing the usual values taken by the data.
|
||||
|
||||
Note that these are only hints. The host may ignore them and the
|
||||
plugin must not assume that data supplied to it is meaningful. If
|
||||
the plugin receives invalid input data it is expected to continue
|
||||
to run without failure and, where possible, produce a sensible
|
||||
output (e.g. a high-pass filter given a negative cutoff frequency
|
||||
might switch to an all-pass mode).
|
||||
|
||||
Hints are meaningful for all input and output ports but hints for
|
||||
input control ports are expected to be particularly useful.
|
||||
|
||||
More hint information is encapsulated in the
|
||||
LADSPA_PortRangeHintDescriptor type which is assembled by ORing
|
||||
individual hint types together. Hints may require further
|
||||
LowerBound and UpperBound information.
|
||||
|
||||
All the hint information for a particular port is aggregated in the
|
||||
LADSPA_PortRangeHint structure. */
|
||||
|
||||
typedef int LADSPA_PortRangeHintDescriptor;
|
||||
|
||||
/* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field
|
||||
of the LADSPA_PortRangeHint should be considered meaningful. The
|
||||
value in this field should be considered the (inclusive) lower
|
||||
bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also
|
||||
specified then the value of LowerBound should be multiplied by the
|
||||
sample rate. */
|
||||
#define LADSPA_HINT_BOUNDED_BELOW 0x1
|
||||
|
||||
/* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field
|
||||
of the LADSPA_PortRangeHint should be considered meaningful. The
|
||||
value in this field should be considered the (inclusive) upper
|
||||
bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also
|
||||
specified then the value of UpperBound should be multiplied by the
|
||||
sample rate. */
|
||||
#define LADSPA_HINT_BOUNDED_ABOVE 0x2
|
||||
|
||||
/* Hint LADSPA_HINT_TOGGLED indicates that the data item should be
|
||||
considered a Boolean toggle. Data less than or equal to zero should
|
||||
be considered `off' or `false,' and data above zero should be
|
||||
considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in
|
||||
conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or
|
||||
LADSPA_HINT_DEFAULT_1. */
|
||||
#define LADSPA_HINT_TOGGLED 0x4
|
||||
|
||||
/* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified
|
||||
should be interpreted as multiples of the sample rate. For
|
||||
instance, a frequency range from 0Hz to the Nyquist frequency (half
|
||||
the sample rate) could be requested by this hint in conjunction
|
||||
with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds
|
||||
at all must support this hint to retain meaning. */
|
||||
#define LADSPA_HINT_SAMPLE_RATE 0x8
|
||||
|
||||
/* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the
|
||||
user will find it more intuitive to view values using a logarithmic
|
||||
scale. This is particularly useful for frequencies and gains. */
|
||||
#define LADSPA_HINT_LOGARITHMIC 0x10
|
||||
|
||||
/* Hint LADSPA_HINT_INTEGER indicates that a user interface would
|
||||
probably wish to provide a stepped control taking only integer
|
||||
values. Any bounds set should be slightly wider than the actual
|
||||
integer range required to avoid floating point rounding errors. For
|
||||
instance, the integer set {0,1,2,3} might be described as [-0.1,
|
||||
3.1]. */
|
||||
#define LADSPA_HINT_INTEGER 0x20
|
||||
|
||||
/* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal'
|
||||
value for the port that is sensible as a default. For instance,
|
||||
this value is suitable for use as an initial value in a user
|
||||
interface or as a value the host might assign to a control port
|
||||
when the user has not provided one. Defaults are encoded using a
|
||||
mask so only one default may be specified for a port. Some of the
|
||||
hints make use of lower and upper bounds, in which case the
|
||||
relevant bound or bounds must be available and
|
||||
LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting
|
||||
default must be rounded if LADSPA_HINT_INTEGER is present. Default
|
||||
values were introduced in LADSPA v1.1. */
|
||||
#define LADSPA_HINT_DEFAULT_MASK 0x3C0
|
||||
|
||||
/* This default values indicates that no default is provided. */
|
||||
#define LADSPA_HINT_DEFAULT_NONE 0x0
|
||||
|
||||
/* This default hint indicates that the suggested lower bound for the
|
||||
port should be used. */
|
||||
#define LADSPA_HINT_DEFAULT_MINIMUM 0x40
|
||||
|
||||
/* This default hint indicates that a low value between the suggested
|
||||
lower and upper bounds should be chosen. For ports with
|
||||
LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 +
|
||||
log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper
|
||||
* 0.25). */
|
||||
#define LADSPA_HINT_DEFAULT_LOW 0x80
|
||||
|
||||
/* This default hint indicates that a middle value between the
|
||||
suggested lower and upper bounds should be chosen. For ports with
|
||||
LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 +
|
||||
log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper *
|
||||
0.5). */
|
||||
#define LADSPA_HINT_DEFAULT_MIDDLE 0xC0
|
||||
|
||||
/* This default hint indicates that a high value between the suggested
|
||||
lower and upper bounds should be chosen. For ports with
|
||||
LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 +
|
||||
log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper
|
||||
* 0.75). */
|
||||
#define LADSPA_HINT_DEFAULT_HIGH 0x100
|
||||
|
||||
/* This default hint indicates that the suggested upper bound for the
|
||||
port should be used. */
|
||||
#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140
|
||||
|
||||
/* This default hint indicates that the number 0 should be used. Note
|
||||
that this default may be used in conjunction with
|
||||
LADSPA_HINT_TOGGLED. */
|
||||
#define LADSPA_HINT_DEFAULT_0 0x200
|
||||
|
||||
/* This default hint indicates that the number 1 should be used. Note
|
||||
that this default may be used in conjunction with
|
||||
LADSPA_HINT_TOGGLED. */
|
||||
#define LADSPA_HINT_DEFAULT_1 0x240
|
||||
|
||||
/* This default hint indicates that the number 100 should be used. */
|
||||
#define LADSPA_HINT_DEFAULT_100 0x280
|
||||
|
||||
/* This default hint indicates that the Hz frequency of `concert A'
|
||||
should be used. This will be 440 unless the host uses an unusual
|
||||
tuning convention, in which case it may be within a few Hz. */
|
||||
#define LADSPA_HINT_DEFAULT_440 0x2C0
|
||||
|
||||
#define LADSPA_IS_HINT_BOUNDED_BELOW(x) ((x) & LADSPA_HINT_BOUNDED_BELOW)
|
||||
#define LADSPA_IS_HINT_BOUNDED_ABOVE(x) ((x) & LADSPA_HINT_BOUNDED_ABOVE)
|
||||
#define LADSPA_IS_HINT_TOGGLED(x) ((x) & LADSPA_HINT_TOGGLED)
|
||||
#define LADSPA_IS_HINT_SAMPLE_RATE(x) ((x) & LADSPA_HINT_SAMPLE_RATE)
|
||||
#define LADSPA_IS_HINT_LOGARITHMIC(x) ((x) & LADSPA_HINT_LOGARITHMIC)
|
||||
#define LADSPA_IS_HINT_INTEGER(x) ((x) & LADSPA_HINT_INTEGER)
|
||||
|
||||
#define LADSPA_IS_HINT_HAS_DEFAULT(x) ((x) & LADSPA_HINT_DEFAULT_MASK)
|
||||
#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_MINIMUM)
|
||||
#define LADSPA_IS_HINT_DEFAULT_LOW(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_LOW)
|
||||
#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_MIDDLE)
|
||||
#define LADSPA_IS_HINT_DEFAULT_HIGH(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_HIGH)
|
||||
#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_MAXIMUM)
|
||||
#define LADSPA_IS_HINT_DEFAULT_0(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_0)
|
||||
#define LADSPA_IS_HINT_DEFAULT_1(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_1)
|
||||
#define LADSPA_IS_HINT_DEFAULT_100(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_100)
|
||||
#define LADSPA_IS_HINT_DEFAULT_440(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \
|
||||
== LADSPA_HINT_DEFAULT_440)
|
||||
|
||||
typedef struct _LADSPA_PortRangeHint {
|
||||
|
||||
/* Hints about the port. */
|
||||
LADSPA_PortRangeHintDescriptor HintDescriptor;
|
||||
|
||||
/* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When
|
||||
LADSPA_HINT_SAMPLE_RATE is also active then this value should be
|
||||
multiplied by the relevant sample rate. */
|
||||
LADSPA_Data LowerBound;
|
||||
|
||||
/* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When
|
||||
LADSPA_HINT_SAMPLE_RATE is also active then this value should be
|
||||
multiplied by the relevant sample rate. */
|
||||
LADSPA_Data UpperBound;
|
||||
|
||||
} LADSPA_PortRangeHint;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Plugin Handles:
|
||||
|
||||
This plugin handle indicates a particular instance of the plugin
|
||||
concerned. It is valid to compare this to NULL (0 for C++) but
|
||||
otherwise the host should not attempt to interpret it. The plugin
|
||||
may use it to reference internal instance data. */
|
||||
|
||||
typedef void * LADSPA_Handle;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Descriptor for a Type of Plugin:
|
||||
|
||||
This structure is used to describe a plugin type. It provides a
|
||||
number of functions to examine the type, instantiate it, link it to
|
||||
buffers and workspaces and to run it. */
|
||||
|
||||
typedef struct _LADSPA_Descriptor {
|
||||
|
||||
/* This numeric identifier indicates the plugin type
|
||||
uniquely. Plugin programmers may reserve ranges of IDs from a
|
||||
central body to avoid clashes. Hosts may assume that IDs are
|
||||
below 0x1000000. */
|
||||
unsigned long UniqueID;
|
||||
|
||||
/* This identifier can be used as a unique, case-sensitive
|
||||
identifier for the plugin type within the plugin file. Plugin
|
||||
types should be identified by file and label rather than by index
|
||||
or plugin name, which may be changed in new plugin
|
||||
versions. Labels must not contain white-space characters. */
|
||||
const char * Label;
|
||||
|
||||
/* This indicates a number of properties of the plugin. */
|
||||
LADSPA_Properties Properties;
|
||||
|
||||
/* This member points to the null-terminated name of the plugin
|
||||
(e.g. "Sine Oscillator"). */
|
||||
const char * Name;
|
||||
|
||||
/* This member points to the null-terminated string indicating the
|
||||
maker of the plugin. This can be an empty string but not NULL. */
|
||||
const char * Maker;
|
||||
|
||||
/* This member points to the null-terminated string indicating any
|
||||
copyright applying to the plugin. If no Copyright applies the
|
||||
string "None" should be used. */
|
||||
const char * Copyright;
|
||||
|
||||
/* This indicates the number of ports (input AND output) present on
|
||||
the plugin. */
|
||||
unsigned long PortCount;
|
||||
|
||||
/* This member indicates an array of port descriptors. Valid indices
|
||||
vary from 0 to PortCount-1. */
|
||||
const LADSPA_PortDescriptor * PortDescriptors;
|
||||
|
||||
/* This member indicates an array of null-terminated strings
|
||||
describing ports (e.g. "Frequency (Hz)"). Valid indices vary from
|
||||
0 to PortCount-1. */
|
||||
const char * const * PortNames;
|
||||
|
||||
/* This member indicates an array of range hints for each port (see
|
||||
above). Valid indices vary from 0 to PortCount-1. */
|
||||
const LADSPA_PortRangeHint * PortRangeHints;
|
||||
|
||||
/* This may be used by the plugin developer to pass any custom
|
||||
implementation data into an instantiate call. It must not be used
|
||||
or interpreted by the host. It is expected that most plugin
|
||||
writers will not use this facility as LADSPA_Handle should be
|
||||
used to hold instance data. */
|
||||
void * ImplementationData;
|
||||
|
||||
/* This member is a function pointer that instantiates a plugin. A
|
||||
handle is returned indicating the new plugin instance. The
|
||||
instantiation function accepts a sample rate as a parameter. The
|
||||
plugin descriptor from which this instantiate function was found
|
||||
must also be passed. This function must return NULL if
|
||||
instantiation fails.
|
||||
|
||||
Note that instance initialisation should generally occur in
|
||||
activate() rather than here. */
|
||||
LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor,
|
||||
unsigned long SampleRate);
|
||||
|
||||
/* This member is a function pointer that connects a port on an
|
||||
instantiated plugin to a memory location at which a block of data
|
||||
for the port will be read/written. The data location is expected
|
||||
to be an array of LADSPA_Data for audio ports or a single
|
||||
LADSPA_Data value for control ports. Memory issues will be
|
||||
managed by the host. The plugin must read/write the data at these
|
||||
locations every time run() or run_adding() is called and the data
|
||||
present at the time of this connection call should not be
|
||||
considered meaningful.
|
||||
|
||||
connect_port() may be called more than once for a plugin instance
|
||||
to allow the host to change the buffers that the plugin is
|
||||
reading or writing. These calls may be made before or after
|
||||
activate() or deactivate() calls.
|
||||
|
||||
connect_port() must be called at least once for each port before
|
||||
run() or run_adding() is called. When working with blocks of
|
||||
LADSPA_Data the plugin should pay careful attention to the block
|
||||
size passed to the run function as the block allocated may only
|
||||
just be large enough to contain the block of samples.
|
||||
|
||||
Plugin writers should be aware that the host may elect to use the
|
||||
same buffer for more than one port and even use the same buffer
|
||||
for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN).
|
||||
However, overlapped buffers or use of a single buffer for both
|
||||
audio and control data may result in unexpected behaviour. */
|
||||
void (*connect_port)(LADSPA_Handle Instance,
|
||||
unsigned long Port,
|
||||
LADSPA_Data * DataLocation);
|
||||
|
||||
/* This member is a function pointer that initialises a plugin
|
||||
instance and activates it for use. This is separated from
|
||||
instantiate() to aid real-time support and so that hosts can
|
||||
reinitialise a plugin instance by calling deactivate() and then
|
||||
activate(). In this case the plugin instance must reset all state
|
||||
information dependent on the history of the plugin instance
|
||||
except for any data locations provided by connect_port() and any
|
||||
gain set by set_run_adding_gain(). If there is nothing for
|
||||
activate() to do then the plugin writer may provide a NULL rather
|
||||
than an empty function.
|
||||
|
||||
When present, hosts must call this function once before run() (or
|
||||
run_adding()) is called for the first time. This call should be
|
||||
made as close to the run() call as possible and indicates to
|
||||
real-time plugins that they are now live. Plugins should not rely
|
||||
on a prompt call to run() after activate(). activate() may not be
|
||||
called again unless deactivate() is called first. Note that
|
||||
connect_port() may be called before or after a call to
|
||||
activate(). */
|
||||
void (*activate)(LADSPA_Handle Instance);
|
||||
|
||||
/* This method is a function pointer that runs an instance of a
|
||||
plugin for a block. Two parameters are required: the first is a
|
||||
handle to the particular instance to be run and the second
|
||||
indicates the block size (in samples) for which the plugin
|
||||
instance may run.
|
||||
|
||||
Note that if an activate() function exists then it must be called
|
||||
before run() or run_adding(). If deactivate() is called for a
|
||||
plugin instance then the plugin instance may not be reused until
|
||||
activate() has been called again.
|
||||
|
||||
If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE
|
||||
then there are various things that the plugin should not do
|
||||
within the run() or run_adding() functions (see above). */
|
||||
void (*run)(LADSPA_Handle Instance,
|
||||
unsigned long SampleCount);
|
||||
|
||||
/* This method is a function pointer that runs an instance of a
|
||||
plugin for a block. This has identical behaviour to run() except
|
||||
in the way data is output from the plugin. When run() is used,
|
||||
values are written directly to the memory areas associated with
|
||||
the output ports. However when run_adding() is called, values
|
||||
must be added to the values already present in the memory
|
||||
areas. Furthermore, output values written must be scaled by the
|
||||
current gain set by set_run_adding_gain() (see below) before
|
||||
addition.
|
||||
|
||||
run_adding() is optional. When it is not provided by a plugin,
|
||||
this function pointer must be set to NULL. When it is provided,
|
||||
the function set_run_adding_gain() must be provided also. */
|
||||
void (*run_adding)(LADSPA_Handle Instance,
|
||||
unsigned long SampleCount);
|
||||
|
||||
/* This method is a function pointer that sets the output gain for
|
||||
use when run_adding() is called (see above). If this function is
|
||||
never called the gain is assumed to default to 1. Gain
|
||||
information should be retained when activate() or deactivate()
|
||||
are called.
|
||||
|
||||
This function should be provided by the plugin if and only if the
|
||||
run_adding() function is provided. When it is absent this
|
||||
function pointer must be set to NULL. */
|
||||
void (*set_run_adding_gain)(LADSPA_Handle Instance,
|
||||
LADSPA_Data Gain);
|
||||
|
||||
/* This is the counterpart to activate() (see above). If there is
|
||||
nothing for deactivate() to do then the plugin writer may provide
|
||||
a NULL rather than an empty function.
|
||||
|
||||
Hosts must deactivate all activated units after they have been
|
||||
run() (or run_adding()) for the last time. This call should be
|
||||
made as close to the last run() call as possible and indicates to
|
||||
real-time plugins that they are no longer live. Plugins should
|
||||
not rely on prompt deactivation. Note that connect_port() may be
|
||||
called before or after a call to deactivate().
|
||||
|
||||
Deactivation is not similar to pausing as the plugin instance
|
||||
will be reinitialised when activate() is called to reuse it. */
|
||||
void (*deactivate)(LADSPA_Handle Instance);
|
||||
|
||||
/* Once an instance of a plugin has been finished with it can be
|
||||
deleted using the following function. The instance handle passed
|
||||
ceases to be valid after this call.
|
||||
|
||||
If activate() was called for a plugin instance then a
|
||||
corresponding call to deactivate() must be made before cleanup()
|
||||
is called. */
|
||||
void (*cleanup)(LADSPA_Handle Instance);
|
||||
|
||||
} LADSPA_Descriptor;
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
/* Accessing a Plugin: */
|
||||
|
||||
/* The exact mechanism by which plugins are loaded is host-dependent,
|
||||
however all most hosts will need to know is the name of shared
|
||||
object file containing the plugin types. To allow multiple hosts to
|
||||
share plugin types, hosts may wish to check for environment
|
||||
variable LADSPA_PATH. If present, this should contain a
|
||||
colon-separated path indicating directories that should be searched
|
||||
(in order) when loading plugin types.
|
||||
|
||||
A plugin programmer must include a function called
|
||||
"ladspa_descriptor" with the following function prototype within
|
||||
the shared object file. This function will have C-style linkage (if
|
||||
you are using C++ this is taken care of by the `extern "C"' clause
|
||||
at the top of the file).
|
||||
|
||||
A host will find the plugin shared object file by one means or
|
||||
another, find the ladspa_descriptor() function, call it, and
|
||||
proceed from there.
|
||||
|
||||
Plugin types are accessed by index (not ID) using values from 0
|
||||
upwards. Out of range indexes must result in this function
|
||||
returning NULL, so the plugin count can be determined by checking
|
||||
for the least index that results in NULL being returned. */
|
||||
|
||||
#ifdef WIN32
|
||||
__declspec(dllexport)
|
||||
#endif
|
||||
const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index);
|
||||
|
||||
/* Datatype corresponding to the ladspa_descriptor() function. */
|
||||
typedef const LADSPA_Descriptor *
|
||||
(*LADSPA_Descriptor_Function)(unsigned long Index);
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LADSPA_INCLUDED */
|
||||
|
||||
/* EOF */
|
@ -1,629 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifndef WIN32
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
#include <libintl.h>
|
||||
#endif
|
||||
|
||||
#define _ISOC9X_SOURCE 1
|
||||
#define _ISOC99_SOURCE 1
|
||||
#define __USE_ISOC99 1
|
||||
#define __USE_ISOC9X 1
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "ladspa.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define _WINDOWS_DLL_EXPORT_ __declspec(dllexport)
|
||||
int bIsFirstTime = 1;
|
||||
void _init(); // forward declaration
|
||||
#else
|
||||
#define _WINDOWS_DLL_EXPORT_
|
||||
#endif
|
||||
|
||||
#line 10 "sc4_1882.xml"
|
||||
|
||||
#include "util/db.h"
|
||||
#include "util/rms.h"
|
||||
|
||||
#define A_TBL 256
|
||||
|
||||
#define SC4_RMS_PEAK 0
|
||||
#define SC4_ATTACK 1
|
||||
#define SC4_RELEASE 2
|
||||
#define SC4_THRESHOLD 3
|
||||
#define SC4_RATIO 4
|
||||
#define SC4_KNEE 5
|
||||
#define SC4_MAKEUP_GAIN 6
|
||||
#define SC4_AMPLITUDE 7
|
||||
#define SC4_GAIN_RED 8
|
||||
#define SC4_LEFT_IN 9
|
||||
#define SC4_RIGHT_IN 10
|
||||
#define SC4_LEFT_OUT 11
|
||||
#define SC4_RIGHT_OUT 12
|
||||
|
||||
static LADSPA_Descriptor *sc4Descriptor = NULL;
|
||||
|
||||
typedef struct {
|
||||
LADSPA_Data *rms_peak;
|
||||
LADSPA_Data *attack;
|
||||
LADSPA_Data *release;
|
||||
LADSPA_Data *threshold;
|
||||
LADSPA_Data *ratio;
|
||||
LADSPA_Data *knee;
|
||||
LADSPA_Data *makeup_gain;
|
||||
LADSPA_Data *amplitude;
|
||||
LADSPA_Data *gain_red;
|
||||
LADSPA_Data *left_in;
|
||||
LADSPA_Data *right_in;
|
||||
LADSPA_Data *left_out;
|
||||
LADSPA_Data *right_out;
|
||||
float amp;
|
||||
float * as;
|
||||
unsigned int count;
|
||||
float env;
|
||||
float env_peak;
|
||||
float env_rms;
|
||||
float gain;
|
||||
float gain_t;
|
||||
rms_env * rms;
|
||||
float sum;
|
||||
LADSPA_Data run_adding_gain;
|
||||
} Sc4;
|
||||
|
||||
_WINDOWS_DLL_EXPORT_
|
||||
const LADSPA_Descriptor *ladspa_descriptor(unsigned long index) {
|
||||
|
||||
#ifdef WIN32
|
||||
if (bIsFirstTime) {
|
||||
_init();
|
||||
bIsFirstTime = 0;
|
||||
}
|
||||
#endif
|
||||
switch (index) {
|
||||
case 0:
|
||||
return sc4Descriptor;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void cleanupSc4(LADSPA_Handle instance) {
|
||||
#line 46 "sc4_1882.xml"
|
||||
Sc4 *plugin_data = (Sc4 *)instance;
|
||||
rms_env_free(plugin_data->rms);
|
||||
free(plugin_data->as);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
static void connectPortSc4(
|
||||
LADSPA_Handle instance,
|
||||
unsigned long port,
|
||||
LADSPA_Data *data) {
|
||||
Sc4 *plugin;
|
||||
|
||||
plugin = (Sc4 *)instance;
|
||||
switch (port) {
|
||||
case SC4_RMS_PEAK:
|
||||
plugin->rms_peak = data;
|
||||
break;
|
||||
case SC4_ATTACK:
|
||||
plugin->attack = data;
|
||||
break;
|
||||
case SC4_RELEASE:
|
||||
plugin->release = data;
|
||||
break;
|
||||
case SC4_THRESHOLD:
|
||||
plugin->threshold = data;
|
||||
break;
|
||||
case SC4_RATIO:
|
||||
plugin->ratio = data;
|
||||
break;
|
||||
case SC4_KNEE:
|
||||
plugin->knee = data;
|
||||
break;
|
||||
case SC4_MAKEUP_GAIN:
|
||||
plugin->makeup_gain = data;
|
||||
break;
|
||||
case SC4_AMPLITUDE:
|
||||
plugin->amplitude = data;
|
||||
break;
|
||||
case SC4_GAIN_RED:
|
||||
plugin->gain_red = data;
|
||||
break;
|
||||
case SC4_LEFT_IN:
|
||||
plugin->left_in = data;
|
||||
break;
|
||||
case SC4_RIGHT_IN:
|
||||
plugin->right_in = data;
|
||||
break;
|
||||
case SC4_LEFT_OUT:
|
||||
plugin->left_out = data;
|
||||
break;
|
||||
case SC4_RIGHT_OUT:
|
||||
plugin->right_out = data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static LADSPA_Handle instantiateSc4(
|
||||
const LADSPA_Descriptor *descriptor,
|
||||
unsigned long s_rate) {
|
||||
Sc4 *plugin_data = (Sc4 *)malloc(sizeof(Sc4));
|
||||
float amp;
|
||||
float *as = NULL;
|
||||
unsigned int count;
|
||||
float env;
|
||||
float env_peak;
|
||||
float env_rms;
|
||||
float gain;
|
||||
float gain_t;
|
||||
rms_env *rms = NULL;
|
||||
float sum;
|
||||
|
||||
#line 23 "sc4_1882.xml"
|
||||
unsigned int i;
|
||||
float sample_rate = (float)s_rate;
|
||||
|
||||
rms = rms_env_new();
|
||||
sum = 0.0f;
|
||||
amp = 0.0f;
|
||||
gain = 0.0f;
|
||||
gain_t = 0.0f;
|
||||
env = 0.0f;
|
||||
env_rms = 0.0f;
|
||||
env_peak = 0.0f;
|
||||
count = 0;
|
||||
|
||||
as = malloc(A_TBL * sizeof(float));
|
||||
as[0] = 1.0f;
|
||||
for (i=1; i<A_TBL; i++) {
|
||||
as[i] = expf(-1.0f / (sample_rate * (float)i / (float)A_TBL));
|
||||
}
|
||||
|
||||
db_init();
|
||||
|
||||
plugin_data->amp = amp;
|
||||
plugin_data->as = as;
|
||||
plugin_data->count = count;
|
||||
plugin_data->env = env;
|
||||
plugin_data->env_peak = env_peak;
|
||||
plugin_data->env_rms = env_rms;
|
||||
plugin_data->gain = gain;
|
||||
plugin_data->gain_t = gain_t;
|
||||
plugin_data->rms = rms;
|
||||
plugin_data->sum = sum;
|
||||
|
||||
return (LADSPA_Handle)plugin_data;
|
||||
}
|
||||
|
||||
#undef buffer_write
|
||||
#undef RUN_ADDING
|
||||
#undef RUN_REPLACING
|
||||
|
||||
#define buffer_write(b, v) (b = v)
|
||||
#define RUN_ADDING 0
|
||||
#define RUN_REPLACING 1
|
||||
|
||||
static void runSc4(LADSPA_Handle instance, unsigned long sample_count) {
|
||||
Sc4 *plugin_data = (Sc4 *)instance;
|
||||
|
||||
/* RMS/peak (float value) */
|
||||
const LADSPA_Data rms_peak = *(plugin_data->rms_peak);
|
||||
|
||||
/* Attack time (ms) (float value) */
|
||||
const LADSPA_Data attack = *(plugin_data->attack);
|
||||
|
||||
/* Release time (ms) (float value) */
|
||||
const LADSPA_Data release = *(plugin_data->release);
|
||||
|
||||
/* Threshold level (dB) (float value) */
|
||||
const LADSPA_Data threshold = *(plugin_data->threshold);
|
||||
|
||||
/* Ratio (1:n) (float value) */
|
||||
const LADSPA_Data ratio = *(plugin_data->ratio);
|
||||
|
||||
/* Knee radius (dB) (float value) */
|
||||
const LADSPA_Data knee = *(plugin_data->knee);
|
||||
|
||||
/* Makeup gain (dB) (float value) */
|
||||
const LADSPA_Data makeup_gain = *(plugin_data->makeup_gain);
|
||||
|
||||
/* Left input (array of floats of length sample_count) */
|
||||
const LADSPA_Data * const left_in = plugin_data->left_in;
|
||||
|
||||
/* Right input (array of floats of length sample_count) */
|
||||
const LADSPA_Data * const right_in = plugin_data->right_in;
|
||||
|
||||
/* Left output (array of floats of length sample_count) */
|
||||
LADSPA_Data * const left_out = plugin_data->left_out;
|
||||
|
||||
/* Right output (array of floats of length sample_count) */
|
||||
LADSPA_Data * const right_out = plugin_data->right_out;
|
||||
float amp = plugin_data->amp;
|
||||
float * as = plugin_data->as;
|
||||
unsigned int count = plugin_data->count;
|
||||
float env = plugin_data->env;
|
||||
float env_peak = plugin_data->env_peak;
|
||||
float env_rms = plugin_data->env_rms;
|
||||
float gain = plugin_data->gain;
|
||||
float gain_t = plugin_data->gain_t;
|
||||
rms_env * rms = plugin_data->rms;
|
||||
float sum = plugin_data->sum;
|
||||
|
||||
#line 51 "sc4_1882.xml"
|
||||
unsigned long pos;
|
||||
|
||||
const float ga = attack < 2.0f ? 0.0f : as[f_round(attack * 0.001f * (float)(A_TBL-1))];
|
||||
const float gr = as[f_round(release * 0.001f * (float)(A_TBL-1))];
|
||||
const float rs = (ratio - 1.0f) / ratio;
|
||||
const float mug = db2lin(makeup_gain);
|
||||
const float knee_min = db2lin(threshold - knee);
|
||||
const float knee_max = db2lin(threshold + knee);
|
||||
const float ef_a = ga * 0.25f;
|
||||
const float ef_ai = 1.0f - ef_a;
|
||||
|
||||
for (pos = 0; pos < sample_count; pos++) {
|
||||
const float la = fabs(left_in[pos]);
|
||||
const float ra = fabs(right_in[pos]);
|
||||
const float lev_in = f_max(la, ra);
|
||||
sum += lev_in * lev_in;
|
||||
|
||||
if (amp > env_rms) {
|
||||
env_rms = env_rms * ga + amp * (1.0f - ga);
|
||||
} else {
|
||||
env_rms = env_rms * gr + amp * (1.0f - gr);
|
||||
}
|
||||
round_to_zero(&env_rms);
|
||||
if (lev_in > env_peak) {
|
||||
env_peak = env_peak * ga + lev_in * (1.0f - ga);
|
||||
} else {
|
||||
env_peak = env_peak * gr + lev_in * (1.0f - gr);
|
||||
}
|
||||
round_to_zero(&env_peak);
|
||||
if ((count++ & 3) == 3) {
|
||||
amp = rms_env_process(rms, sum * 0.25f);
|
||||
sum = 0.0f;
|
||||
if (isnan(env_rms)) {
|
||||
// This can happen sometimes, but I don't know why
|
||||
env_rms = 0.0f;
|
||||
}
|
||||
|
||||
env = LIN_INTERP(rms_peak, env_rms, env_peak);
|
||||
|
||||
if (env <= knee_min) {
|
||||
gain_t = 1.0f;
|
||||
} else if (env < knee_max) {
|
||||
const float x = -(threshold - knee - lin2db(env)) / knee;
|
||||
gain_t = db2lin(-knee * rs * x * x * 0.25f);
|
||||
} else {
|
||||
gain_t = db2lin((threshold - lin2db(env)) * rs);
|
||||
}
|
||||
}
|
||||
gain = gain * ef_a + gain_t * ef_ai;
|
||||
buffer_write(left_out[pos], left_in[pos] * gain * mug);
|
||||
buffer_write(right_out[pos], right_in[pos] * gain * mug);
|
||||
}
|
||||
plugin_data->sum = sum;
|
||||
plugin_data->amp = amp;
|
||||
plugin_data->gain = gain;
|
||||
plugin_data->gain_t = gain_t;
|
||||
plugin_data->env = env;
|
||||
plugin_data->env_rms = env_rms;
|
||||
plugin_data->env_peak = env_peak;
|
||||
plugin_data->count = count;
|
||||
|
||||
*(plugin_data->amplitude) = lin2db(env);
|
||||
*(plugin_data->gain_red) = lin2db(gain);
|
||||
}
|
||||
#undef buffer_write
|
||||
#undef RUN_ADDING
|
||||
#undef RUN_REPLACING
|
||||
|
||||
#define buffer_write(b, v) (b += (v) * run_adding_gain)
|
||||
#define RUN_ADDING 1
|
||||
#define RUN_REPLACING 0
|
||||
|
||||
static void setRunAddingGainSc4(LADSPA_Handle instance, LADSPA_Data gain) {
|
||||
((Sc4 *)instance)->run_adding_gain = gain;
|
||||
}
|
||||
|
||||
static void runAddingSc4(LADSPA_Handle instance, unsigned long sample_count) {
|
||||
Sc4 *plugin_data = (Sc4 *)instance;
|
||||
LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
|
||||
|
||||
/* RMS/peak (float value) */
|
||||
const LADSPA_Data rms_peak = *(plugin_data->rms_peak);
|
||||
|
||||
/* Attack time (ms) (float value) */
|
||||
const LADSPA_Data attack = *(plugin_data->attack);
|
||||
|
||||
/* Release time (ms) (float value) */
|
||||
const LADSPA_Data release = *(plugin_data->release);
|
||||
|
||||
/* Threshold level (dB) (float value) */
|
||||
const LADSPA_Data threshold = *(plugin_data->threshold);
|
||||
|
||||
/* Ratio (1:n) (float value) */
|
||||
const LADSPA_Data ratio = *(plugin_data->ratio);
|
||||
|
||||
/* Knee radius (dB) (float value) */
|
||||
const LADSPA_Data knee = *(plugin_data->knee);
|
||||
|
||||
/* Makeup gain (dB) (float value) */
|
||||
const LADSPA_Data makeup_gain = *(plugin_data->makeup_gain);
|
||||
|
||||
/* Left input (array of floats of length sample_count) */
|
||||
const LADSPA_Data * const left_in = plugin_data->left_in;
|
||||
|
||||
/* Right input (array of floats of length sample_count) */
|
||||
const LADSPA_Data * const right_in = plugin_data->right_in;
|
||||
|
||||
/* Left output (array of floats of length sample_count) */
|
||||
LADSPA_Data * const left_out = plugin_data->left_out;
|
||||
|
||||
/* Right output (array of floats of length sample_count) */
|
||||
LADSPA_Data * const right_out = plugin_data->right_out;
|
||||
float amp = plugin_data->amp;
|
||||
float * as = plugin_data->as;
|
||||
unsigned int count = plugin_data->count;
|
||||
float env = plugin_data->env;
|
||||
float env_peak = plugin_data->env_peak;
|
||||
float env_rms = plugin_data->env_rms;
|
||||
float gain = plugin_data->gain;
|
||||
float gain_t = plugin_data->gain_t;
|
||||
rms_env * rms = plugin_data->rms;
|
||||
float sum = plugin_data->sum;
|
||||
|
||||
#line 51 "sc4_1882.xml"
|
||||
unsigned long pos;
|
||||
|
||||
const float ga = attack < 2.0f ? 0.0f : as[f_round(attack * 0.001f * (float)(A_TBL-1))];
|
||||
const float gr = as[f_round(release * 0.001f * (float)(A_TBL-1))];
|
||||
const float rs = (ratio - 1.0f) / ratio;
|
||||
const float mug = db2lin(makeup_gain);
|
||||
const float knee_min = db2lin(threshold - knee);
|
||||
const float knee_max = db2lin(threshold + knee);
|
||||
const float ef_a = ga * 0.25f;
|
||||
const float ef_ai = 1.0f - ef_a;
|
||||
|
||||
for (pos = 0; pos < sample_count; pos++) {
|
||||
const float la = fabs(left_in[pos]);
|
||||
const float ra = fabs(right_in[pos]);
|
||||
const float lev_in = f_max(la, ra);
|
||||
sum += lev_in * lev_in;
|
||||
|
||||
if (amp > env_rms) {
|
||||
env_rms = env_rms * ga + amp * (1.0f - ga);
|
||||
} else {
|
||||
env_rms = env_rms * gr + amp * (1.0f - gr);
|
||||
}
|
||||
round_to_zero(&env_rms);
|
||||
if (lev_in > env_peak) {
|
||||
env_peak = env_peak * ga + lev_in * (1.0f - ga);
|
||||
} else {
|
||||
env_peak = env_peak * gr + lev_in * (1.0f - gr);
|
||||
}
|
||||
round_to_zero(&env_peak);
|
||||
if ((count++ & 3) == 3) {
|
||||
amp = rms_env_process(rms, sum * 0.25f);
|
||||
sum = 0.0f;
|
||||
if (isnan(env_rms)) {
|
||||
// This can happen sometimes, but I don't know why
|
||||
env_rms = 0.0f;
|
||||
}
|
||||
|
||||
env = LIN_INTERP(rms_peak, env_rms, env_peak);
|
||||
|
||||
if (env <= knee_min) {
|
||||
gain_t = 1.0f;
|
||||
} else if (env < knee_max) {
|
||||
const float x = -(threshold - knee - lin2db(env)) / knee;
|
||||
gain_t = db2lin(-knee * rs * x * x * 0.25f);
|
||||
} else {
|
||||
gain_t = db2lin((threshold - lin2db(env)) * rs);
|
||||
}
|
||||
}
|
||||
gain = gain * ef_a + gain_t * ef_ai;
|
||||
buffer_write(left_out[pos], left_in[pos] * gain * mug);
|
||||
buffer_write(right_out[pos], right_in[pos] * gain * mug);
|
||||
}
|
||||
plugin_data->sum = sum;
|
||||
plugin_data->amp = amp;
|
||||
plugin_data->gain = gain;
|
||||
plugin_data->gain_t = gain_t;
|
||||
plugin_data->env = env;
|
||||
plugin_data->env_rms = env_rms;
|
||||
plugin_data->env_peak = env_peak;
|
||||
plugin_data->count = count;
|
||||
|
||||
*(plugin_data->amplitude) = lin2db(env);
|
||||
*(plugin_data->gain_red) = lin2db(gain);
|
||||
}
|
||||
|
||||
void _init() {
|
||||
char **port_names;
|
||||
LADSPA_PortDescriptor *port_descriptors;
|
||||
LADSPA_PortRangeHint *port_range_hints;
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
#define D_(s) dgettext(PACKAGE, s)
|
||||
setlocale(LC_ALL, "");
|
||||
bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR);
|
||||
#else
|
||||
#define D_(s) (s)
|
||||
#endif
|
||||
|
||||
|
||||
sc4Descriptor =
|
||||
(LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));
|
||||
|
||||
if (sc4Descriptor) {
|
||||
sc4Descriptor->UniqueID = 1882;
|
||||
sc4Descriptor->Label = "sc4";
|
||||
sc4Descriptor->Properties =
|
||||
LADSPA_PROPERTY_HARD_RT_CAPABLE;
|
||||
sc4Descriptor->Name =
|
||||
D_("SC4");
|
||||
sc4Descriptor->Maker =
|
||||
"Steve Harris <steve@plugin.org.uk>";
|
||||
sc4Descriptor->Copyright =
|
||||
"GPL";
|
||||
sc4Descriptor->PortCount = 13;
|
||||
|
||||
port_descriptors = (LADSPA_PortDescriptor *)calloc(13,
|
||||
sizeof(LADSPA_PortDescriptor));
|
||||
sc4Descriptor->PortDescriptors =
|
||||
(const LADSPA_PortDescriptor *)port_descriptors;
|
||||
|
||||
port_range_hints = (LADSPA_PortRangeHint *)calloc(13,
|
||||
sizeof(LADSPA_PortRangeHint));
|
||||
sc4Descriptor->PortRangeHints =
|
||||
(const LADSPA_PortRangeHint *)port_range_hints;
|
||||
|
||||
port_names = (char **)calloc(13, sizeof(char*));
|
||||
sc4Descriptor->PortNames =
|
||||
(const char **)port_names;
|
||||
|
||||
/* Parameters for RMS/peak */
|
||||
port_descriptors[SC4_RMS_PEAK] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_RMS_PEAK] =
|
||||
D_("RMS/peak");
|
||||
port_range_hints[SC4_RMS_PEAK].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MINIMUM;
|
||||
port_range_hints[SC4_RMS_PEAK].LowerBound = 0;
|
||||
port_range_hints[SC4_RMS_PEAK].UpperBound = 1;
|
||||
|
||||
/* Parameters for Attack time (ms) */
|
||||
port_descriptors[SC4_ATTACK] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_ATTACK] =
|
||||
D_("Attack time (ms)");
|
||||
port_range_hints[SC4_ATTACK].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_LOW;
|
||||
port_range_hints[SC4_ATTACK].LowerBound = 1.5;
|
||||
port_range_hints[SC4_ATTACK].UpperBound = 400;
|
||||
|
||||
/* Parameters for Release time (ms) */
|
||||
port_descriptors[SC4_RELEASE] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_RELEASE] =
|
||||
D_("Release time (ms)");
|
||||
port_range_hints[SC4_RELEASE].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE;
|
||||
port_range_hints[SC4_RELEASE].LowerBound = 2;
|
||||
port_range_hints[SC4_RELEASE].UpperBound = 800;
|
||||
|
||||
/* Parameters for Threshold level (dB) */
|
||||
port_descriptors[SC4_THRESHOLD] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_THRESHOLD] =
|
||||
D_("Threshold level (dB)");
|
||||
port_range_hints[SC4_THRESHOLD].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MAXIMUM;
|
||||
port_range_hints[SC4_THRESHOLD].LowerBound = -30;
|
||||
port_range_hints[SC4_THRESHOLD].UpperBound = 0;
|
||||
|
||||
/* Parameters for Ratio (1:n) */
|
||||
port_descriptors[SC4_RATIO] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_RATIO] =
|
||||
D_("Ratio (1:n)");
|
||||
port_range_hints[SC4_RATIO].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_1;
|
||||
port_range_hints[SC4_RATIO].LowerBound = 1;
|
||||
port_range_hints[SC4_RATIO].UpperBound = 20;
|
||||
|
||||
/* Parameters for Knee radius (dB) */
|
||||
port_descriptors[SC4_KNEE] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_KNEE] =
|
||||
D_("Knee radius (dB)");
|
||||
port_range_hints[SC4_KNEE].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_LOW;
|
||||
port_range_hints[SC4_KNEE].LowerBound = 1;
|
||||
port_range_hints[SC4_KNEE].UpperBound = 10;
|
||||
|
||||
/* Parameters for Makeup gain (dB) */
|
||||
port_descriptors[SC4_MAKEUP_GAIN] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_MAKEUP_GAIN] =
|
||||
D_("Makeup gain (dB)");
|
||||
port_range_hints[SC4_MAKEUP_GAIN].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0;
|
||||
port_range_hints[SC4_MAKEUP_GAIN].LowerBound = 0;
|
||||
port_range_hints[SC4_MAKEUP_GAIN].UpperBound = +24;
|
||||
|
||||
/* Parameters for Amplitude (dB) */
|
||||
port_descriptors[SC4_AMPLITUDE] =
|
||||
LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_AMPLITUDE] =
|
||||
D_("Amplitude (dB)");
|
||||
port_range_hints[SC4_AMPLITUDE].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE;
|
||||
port_range_hints[SC4_AMPLITUDE].LowerBound = -40;
|
||||
port_range_hints[SC4_AMPLITUDE].UpperBound = +12;
|
||||
|
||||
/* Parameters for Gain reduction (dB) */
|
||||
port_descriptors[SC4_GAIN_RED] =
|
||||
LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL;
|
||||
port_names[SC4_GAIN_RED] =
|
||||
D_("Gain reduction (dB)");
|
||||
port_range_hints[SC4_GAIN_RED].HintDescriptor =
|
||||
LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE;
|
||||
port_range_hints[SC4_GAIN_RED].LowerBound = -24;
|
||||
port_range_hints[SC4_GAIN_RED].UpperBound = 0;
|
||||
|
||||
/* Parameters for Left input */
|
||||
port_descriptors[SC4_LEFT_IN] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
|
||||
port_names[SC4_LEFT_IN] =
|
||||
D_("Left input");
|
||||
port_range_hints[SC4_LEFT_IN].HintDescriptor = 0;
|
||||
|
||||
/* Parameters for Right input */
|
||||
port_descriptors[SC4_RIGHT_IN] =
|
||||
LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
|
||||
port_names[SC4_RIGHT_IN] =
|
||||
D_("Right input");
|
||||
port_range_hints[SC4_RIGHT_IN].HintDescriptor = 0;
|
||||
|
||||
/* Parameters for Left output */
|
||||
port_descriptors[SC4_LEFT_OUT] =
|
||||
LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
|
||||
port_names[SC4_LEFT_OUT] =
|
||||
D_("Left output");
|
||||
port_range_hints[SC4_LEFT_OUT].HintDescriptor = 0;
|
||||
|
||||
/* Parameters for Right output */
|
||||
port_descriptors[SC4_RIGHT_OUT] =
|
||||
LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
|
||||
port_names[SC4_RIGHT_OUT] =
|
||||
D_("Right output");
|
||||
port_range_hints[SC4_RIGHT_OUT].HintDescriptor = 0;
|
||||
|
||||
sc4Descriptor->activate = NULL;
|
||||
sc4Descriptor->cleanup = cleanupSc4;
|
||||
sc4Descriptor->connect_port = connectPortSc4;
|
||||
sc4Descriptor->deactivate = NULL;
|
||||
sc4Descriptor->instantiate = instantiateSc4;
|
||||
sc4Descriptor->run = runSc4;
|
||||
sc4Descriptor->run_adding = runAddingSc4;
|
||||
sc4Descriptor->set_run_adding_gain = setRunAddingGainSc4;
|
||||
}
|
||||
}
|
||||
|
||||
void _fini() {
|
||||
if (sc4Descriptor) {
|
||||
free((LADSPA_PortDescriptor *)sc4Descriptor->PortDescriptors);
|
||||
free((char **)sc4Descriptor->PortNames);
|
||||
free((LADSPA_PortRangeHint *)sc4Descriptor->PortRangeHints);
|
||||
free(sc4Descriptor);
|
||||
}
|
||||
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "db.h"
|
||||
|
||||
float db_data[DB_TABLE_SIZE];
|
||||
float lin_data[LIN_TABLE_SIZE];
|
||||
|
||||
void db_init()
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i=0; i<LIN_TABLE_SIZE; i++) {
|
||||
lin_data[i] = powf(10.0f, ((DB_MAX - DB_MIN) *
|
||||
(float)i/(float)LIN_TABLE_SIZE + DB_MIN) / 20.0f);
|
||||
}
|
||||
|
||||
for (i=0; i<DB_TABLE_SIZE; i++) {
|
||||
db_data[i] = 20.0f * log10f((LIN_MAX - LIN_MIN) *
|
||||
(float)i/(float)DB_TABLE_SIZE + LIN_MIN);
|
||||
}
|
||||
}
|
@ -1,86 +0,0 @@
|
||||
#ifndef _DB_H
|
||||
#define _DB_H
|
||||
|
||||
#include "../ladspa-util.h"
|
||||
|
||||
void db_init();
|
||||
static inline float f_lin2db_cube(float lin);
|
||||
static inline float f_db2lin_cube(float db);
|
||||
static inline float f_lin2db_lerp(float lin);
|
||||
static inline float f_db2lin_lerp(float db);
|
||||
|
||||
extern float db_data[];
|
||||
extern float lin_data[];
|
||||
|
||||
#define DB_TABLE_SIZE 1024
|
||||
#define DB_MIN -60.0f
|
||||
#define DB_MAX 24.0f
|
||||
#define LIN_TABLE_SIZE 1024
|
||||
#define LIN_MIN 0.0000000002f
|
||||
#define LIN_MAX 9.0f
|
||||
|
||||
#ifdef DB_DEFAULT_CUBE
|
||||
#define db2lin(a) f_db2lin_cube(a)
|
||||
#define lin2db(a) f_lin2db_cube(a)
|
||||
#else
|
||||
#define db2lin(a) f_db2lin_lerp(a)
|
||||
#define lin2db(a) f_lin2db_lerp(a)
|
||||
#endif
|
||||
|
||||
static inline float f_db2lin_cube(float db)
|
||||
{
|
||||
float scale = (db - DB_MIN) * (float)LIN_TABLE_SIZE / (DB_MAX - DB_MIN);
|
||||
int base = f_round(scale - 0.5f);
|
||||
float ofs = scale - base;
|
||||
|
||||
if (base < 1) {
|
||||
return 0.0f;
|
||||
} else if (base > LIN_TABLE_SIZE - 3) {
|
||||
return lin_data[LIN_TABLE_SIZE - 2];
|
||||
}
|
||||
return cube_interp(ofs, lin_data[base-1], lin_data[base], lin_data[base+1], lin_data[base+2]);
|
||||
}
|
||||
|
||||
static inline float f_db2lin_lerp(float db)
|
||||
{
|
||||
float scale = (db - DB_MIN) * (float)LIN_TABLE_SIZE / (DB_MAX - DB_MIN);
|
||||
int base = f_round(scale - 0.5f);
|
||||
float ofs = scale - base;
|
||||
|
||||
if (base < 1) {
|
||||
return 0.0f;
|
||||
} else if (base > LIN_TABLE_SIZE - 3) {
|
||||
return lin_data[LIN_TABLE_SIZE - 2];
|
||||
}
|
||||
return (1.0f - ofs) * lin_data[base] + ofs * lin_data[base+1];
|
||||
}
|
||||
|
||||
static inline float f_lin2db_cube(float lin)
|
||||
{
|
||||
float scale = (lin - LIN_MIN) * (float)DB_TABLE_SIZE / (LIN_MAX - LIN_MIN);
|
||||
int base = f_round(scale - 0.5f);
|
||||
float ofs = scale - base;
|
||||
|
||||
if (base < 2) {
|
||||
return db_data[2] * scale * 0.5f - 23 * (2.0f - scale);
|
||||
} else if (base > DB_TABLE_SIZE - 3) {
|
||||
return db_data[DB_TABLE_SIZE - 2];
|
||||
}
|
||||
return cube_interp(ofs, db_data[base-1], db_data[base], db_data[base+1], db_data[base+2]);
|
||||
}
|
||||
|
||||
static inline float f_lin2db_lerp(float lin)
|
||||
{
|
||||
float scale = (lin - LIN_MIN) * (float)DB_TABLE_SIZE / (LIN_MAX - LIN_MIN);
|
||||
int base = f_round(scale - 0.5f);
|
||||
float ofs = scale - base;
|
||||
|
||||
if (base < 2) {
|
||||
return db_data[2] * scale * 0.5f - 23.0f * (2.0f - scale);
|
||||
} else if (base > DB_TABLE_SIZE - 2) {
|
||||
return db_data[DB_TABLE_SIZE - 1];
|
||||
}
|
||||
return (1.0f - ofs) * db_data[base] + ofs * db_data[base+1];
|
||||
}
|
||||
|
||||
#endif
|
@ -1,25 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
#include "rms.h"
|
||||
|
||||
rms_env *rms_env_new()
|
||||
{
|
||||
rms_env *new = (rms_env *)calloc(1, sizeof(rms_env));
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
void rms_env_reset(rms_env *r)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i=0; i<RMS_BUF_SIZE; i++) {
|
||||
r->buffer[i] = 0.0f;
|
||||
}
|
||||
r->pos = 0;
|
||||
r->sum = 0.0f;
|
||||
}
|
||||
|
||||
void rms_env_free(rms_env *r)
|
||||
{
|
||||
free(r);
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
#ifndef _RMS_H
|
||||
#define _RMS_H
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#define RMS_BUF_SIZE 64
|
||||
|
||||
typedef struct {
|
||||
float buffer[RMS_BUF_SIZE];
|
||||
unsigned int pos;
|
||||
float sum;
|
||||
} rms_env;
|
||||
|
||||
rms_env *rms_env_new();
|
||||
|
||||
static inline float rms_env_process(rms_env *r, const float x);
|
||||
|
||||
void rms_env_reset(rms_env *r);
|
||||
|
||||
void rms_env_free(rms_env *r);
|
||||
|
||||
inline static float rms_env_process(rms_env *r, const float x)
|
||||
{
|
||||
r->sum -= r->buffer[r->pos];
|
||||
r->sum += x;
|
||||
if (r->sum < 1.0e-6) {
|
||||
r->sum = 0.0f;
|
||||
}
|
||||
r->buffer[r->pos] = x;
|
||||
r->pos = (r->pos + 1) & (RMS_BUF_SIZE - 1);
|
||||
|
||||
return sqrt(r->sum / (float)RMS_BUF_SIZE);
|
||||
}
|
||||
|
||||
#endif
|
@ -980,25 +980,12 @@ list( APPEND HEADERS
|
||||
#
|
||||
list( APPEND INCLUDES
|
||||
PUBLIC
|
||||
${CMAKE_CURRENT_BINARY_DIR}/private
|
||||
${_PRVDIR}
|
||||
${topdir}/lib-src/lib-widget-extra
|
||||
${topdir}/include
|
||||
${TARGET_ROOT}
|
||||
)
|
||||
|
||||
#
|
||||
# Get those pesky CMake files out of the way (on Windows)
|
||||
#
|
||||
source_group(
|
||||
TREE
|
||||
"${_INTDIR}"
|
||||
PREFIX
|
||||
"CMake"
|
||||
FILES
|
||||
${_INTDIR}/CMakeFiles/Audacity.dir/cmake_pch.cxx
|
||||
${_INTDIR}/CMakeFiles/Audacity.dir/cmake_pch.hxx
|
||||
)
|
||||
|
||||
#
|
||||
# Define resources
|
||||
#
|
||||
@ -1344,6 +1331,19 @@ organize_source( "${TARGET_ROOT}" "src" "${SOURCES}" )
|
||||
organize_source( "${TARGET_ROOT}/../mac/Resources" "mac" "${MAC_RESOURCES}" )
|
||||
organize_source( "${TARGET_ROOT}/../win" "win" "${WIN_RESOURCES}" )
|
||||
|
||||
#
|
||||
# Get those pesky CMake files out of the way (on Windows)
|
||||
#
|
||||
source_group(
|
||||
TREE
|
||||
"${_INTDIR}"
|
||||
PREFIX
|
||||
"CMake"
|
||||
FILES
|
||||
${_INTDIR}/CMakeFiles/Audacity.dir/cmake_pch.cxx
|
||||
${_INTDIR}/CMakeFiles/Audacity.dir/cmake_pch.hxx
|
||||
)
|
||||
|
||||
target_sources( ${TARGET} PRIVATE ${HEADERS} ${SOURCES} ${RESOURCES} ${MAC_RESOURCES} ${WIN_RESOURCES} )
|
||||
target_compile_definitions( ${TARGET} PRIVATE ${DEFINES} )
|
||||
target_compile_options( ${TARGET} PRIVATE ${OPTIONS} )
|
||||
|
Loading…
x
Reference in New Issue
Block a user