Files
EqualizerAPO/helpers/MemoryHelper.cpp
T
jthedering 90ee2b0aa9 Version 0.9
Added: Filter type "IIR", which allows to specify a user-defined IIR filter of arbitrary order with custom coefficients.
Improved: For playback devices, the APO is now installed both as GFX (post-mix) and LFX (pre-mix) APO. Normally the filtering happens in GFX, but the command "Stage" allows to select LFX to apply effects based on the number of input channels.
Added: Expression language. The commands "If", "ElseIf", "Else", "EndIf", "Eval" and inline expressions allow to change the filter behaviour based on runtime conditions.
Added: Command "Copy", which copies audio data between channels.
Added: Command "Delay", which delays the audio on the currently selected channels.
Improved: Configuration files are now locked exclusively for writing while reading them.
Improved: There is now a transition (10 ms) from old to new configuration after loading.
Improved: Substantial internal restructuring to improve extensibility and maintainability. Filtering commands now work exactly in the order they were specified.
Fixed: When the microphone input was in stereo but the application requested a mono stream, the audio was heavily distorted.
Fixed: The sine sweep generated by the Benchmark application had floating-point precision issues leading to severe artifacts when certain filters were applied.
2014-08-10 18:35:59 +00:00

112 lines
2.6 KiB
C++

/*
This file is part of EqualizerAPO, a system-wide equalizer.
Copyright (C) 2013 Jonas Thedering
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.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#ifdef _DEBUG
#include <stdlib.h>
#include <crtdbg.h>
#endif
#ifdef USE_WINDDK
// disable the declarations to use our own (see below)
#define AERT_Allocate _AERT_Allocate_disabled
#define AERT_Free _AERT_Free_disabled
#include <BaseAudioProcessingObject.h>
#undef AERT_Allocate
#undef AERT_Free
#endif
#include "LogHelper.h"
#include "MemoryHelper.h"
#ifdef USE_WINDDK
// someone forgot to add the __stdcall/WINAPI modifier to BaseAudioProcessingObject.h, so we can't use the existing declarations
extern "C"
{
HRESULT __stdcall AERT_Allocate(size_t size, void **pMemory);
HRESULT __stdcall AERT_Free(void *pMemory);
}
#endif
void* MemoryHelper::alloc(size_t size)
{
void* memory;
bool alternative = false;
size += 16;
#ifdef USE_WINDDK
HRESULT hr = AERT_Allocate(size, &memory);
if(FAILED(hr))
{
size += 16;
memory = malloc(size);
alternative = true;
}
#else
#ifdef _DEBUG
memory = _malloc_dbg(size,_NORMAL_BLOCK, __FILE__, __LINE__);
#else
memory = malloc(size);
#endif
#endif
if(memory == NULL)
{
LogFStatic(L"Allocation of %d bytes failed.", size);
return NULL;
}
size_t offset = 16 - ((size_t)memory) % 16;
if(alternative)
offset += 16;
void* ptr = ((char*)memory) + offset;
((char*)ptr)[-1] = (char)offset;
return ptr;
}
void MemoryHelper::free(void* ptr)
{
bool alternative = false;
char offset = ((char*)ptr)[-1];
if(offset > 16)
alternative = true;
void* memory = ((char*)ptr) - offset;
#ifdef USE_WINDDK
if(alternative)
{
::free(memory);
}
else
{
HRESULT hr = AERT_Free(memory);
if(FAILED(hr))
{
LogFStatic(L"Memory release failed. Error code %X", hr);
}
}
#else
#ifdef _DEBUG
_free_dbg(memory,_NORMAL_BLOCK);
#else
::free(memory);
#endif
#endif
}