| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
* Compile with c++20 support
* Update CMakeLists.txt
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
MinGW's headers don't seem to define operator| for AudioObjectType.
|
| |
|
| |
|
| |
|
|
|
|
| |
To avoid clashes with compilers that use it as a keyword already
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is very dumb. Template functions are implicitly marked inline according to
C++, and contrary to popular belief, "inline" *does* influence the compiler's
decision to inline a function. A function the compiler may not have decided to
inline normally may be inlined anyway, or issue a warning if it still decides
not to inline, if explicitly or implicitly marked as such (or does inline it as
requested, but then decides to not inline different functions it normally would
because of a cumulative code size increase or something).
Furthermore, once a function becomes inline due to being a template function,
there's no way to undo it. Marking an inline function "noinline" pushes the
problem the other way, causing the compiler to not inline a function it may
have decided was beneficial to inline. There's no way to declare a template
function to be inlined based solely on compiler heuristics, it will always be
influenced by the implicit "inline" or explicit "noinline".
That's what's happening here. A number of functions had been combined into a
smaller number of large-ish template functions to reduce code duplication and
ease maintanence, causing them to be implicitly inline as a side-effect. GCC
then manages to inline these larger functions as implicitly requested, but in
doing so prevents other smaller functions (which are explicitly marked inline)
from being inlined due to excessive code increase and issue a warning. The
"noinline" is a heavy-handed method of un-pessimizing the optimization pass, on
the assumption the compiler apparently doesn't actually want to inline the
template functions, but does so because they're technically marked inline.
There's no good option here until it gets acknowledged that inline does mean
something beyond allowing multiple definitions, and that template (and other
types of) function definitions sometimes (if not most often) want to allow
multiple definitions but don't want an artificial/detrimental boost in inline
prioritization.
/rant
|
| |
|
|
|
|
| |
To avoid extraneous conversions between angles and vectors
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is essentially just a copy of alcGetProcAddress. It's purpose is to bypass
Creative's router's alcGetProcAddress implementation, which returns its own
functions even if given a device handle. When combined with it also wrapping
the drivers' device and context handles, that prevents any extention function
that needs a recognizable device or context handle from working, like the
*Direct functions, as there's no way for the app to get a device or context
handle the driver can know about).
An alternate function to get function pointers allows a driver to return its
own implementation for standard and extension functions, which an application
can use to "bootstrap" audio to use a particular driver directly, enabling
use of extensions that the router gets in the way of (and also avoid the
overhead of the router, however small that may be).
|
|
|
|
|
| |
This also seems to work around the problematic MinGW code generation, so the
indirection to access it can be removed.
|
|
|
|
|
|
|
| |
Reverb needs to prioritize efficiency since it's expected that an app may use
multiple reverb effects simultaneously, and each individual effect may process
twice during a pipeline transition. Approximating sin helps by replacing a per-
sample libc call that we don't need to be perfectly accurate.
|
| |
|
|
|
|
|
| |
This also allows to include 11-bit indices in the fast lookup table path,
without exceeding GCC's internal limit of compile-time calculations.
|
|
|
|
| |
To avoid clashes when used as a sub-project
|
|
|
|
|
| |
This replaces sin/cos calls with an array of 10 complex values for lookup
tables, and separates the first loop iteration with a constant x1 multiplier.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
This restricts available frequencies to fit an integer number of samples per
cycle, but ensures no unintended harmonics from misaligned samples w.r.t.
sawtooth and square waveforms.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
This doesn't make much sense since the effect associated with the ID may be
modified and not represent the effect being played, or was even deleted and
isn't a valid effect ID, but Generic Software allows querying it so it should
be queryable for compatibility if nothing else.
|
| |
|