Fix building with wx 2.8 by rewriting some more string related code.
Replace all calls to .c_str() with .mb_str().
Remove some of the .c_str()/.mb_str() calls where the target is already
wxString.
Move the split()/enum_idx() functions from opts.cpp into
str_split()/vec_find() in strutils.h/strutils.cpp for use in other
files.
Replace the C-style string parsing code in a couple of places in
wxvbam.cpp for processing possible command line options by splitting on
'='.
Also replace a couple of places that use pointer arithmetic in
widgets/joyedit.cpp and widgets/keyedit.cpp with wxString methods.
When calling find_package(wxWidgets ...) allow the first call to fail
because the OpenGL library may not be found. A subsequent call without
listing the OpenGL library is done with REQUIRED.
And if the OpenGL library is not found, skip the OpenGL compile test.
When cross-compiling (e.g. with mxe or other mingw packages) skip the wx
ABI compatibility run tests.
When choosing which minhook lib to link to the wx ABI compat run test
program, check for 64 bit but fallback to 32 bit just in case.
Fix some syntax errors and extraneous output in fedora_installdeps().
"Fix" the 32 bit deps installer to try to ignore file conflicts between
i686 and host rpms, by first using rpm --force to install the 32 bit
rpms and then overwriting them with the host ones using --force as well.
This is hackish and fragile, but there aren't any good alternatives
right now.
When Wx is built with --enable-stl, wxString to wxChar*/char* implicit
conversions and vice-versa no longer work.
Change all wxChar* data members to wxString and change all pointer
arithmetic code (mostly in opts.cpp, cmdevents.cpp and
widgets/joyedit.cpp) to use wxString methods instead.
Also make mostly minor changes in various other files for all of this to
work.
Fix error dialog boxes popping up when the Wx ABI compat tests are run
from cmake.
Wx 3.x is hardcoded to use MessageBox for wxLogFatalError(), even in a
console app, so use the minhook trampoline lib (added to dependencies)
to hook the Win32 API MessageBoxW and MessageBoxA (the second just in
case) so that no error dialogs pop up.
Details here:
https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra
Include `wx/wxprec.h` (precompiled header first in test programs to
possibly make the tests slightly faster.
For the ABI compat check, set a variable for the test program instead of
listing it twice.
Following some suggestions from @ArtiiP, first check if there are no
issues without an -fabi-version flag, and then instead of incrementing
from 0, decrement from 15 to find the highest working ABI version.
This is very slow if the needed ABI version is 2 for example, but not
much to do about that for the time being.
Start checking the ABI version at -fabi-version=0, which is the default,
and if that succeeds don't set the flag at all.
This will allow the code to work properly if and when Wx removes the ABI
check alltogether.
Break command line argument processing and OS detection off into
functions called from `main()`.
Remove all references to cairo.
For fink, install the SFML package I made instead of turning off link.
In 4e665ae I hardcoded -fabi-version=2 for g++ flags, and @ArtiiP
pointed out that this is wrong, because Wx may be compiled with other
ABI versions.
Add cmake check_cxx_source_runs() tests to determine the correct ABI
version flag to use with Wx.
Use the g++ `-fabi-version=2` compiler option, as suggested by @ArtiiP
to fix problems similar to:
```
Fatal Error: Mismatch between the program and library build versions
detected.
The library used 3.0 (wchar_t,compiler with C++ ABI 1002,wx
containers,compatible with 2.8),
and your program used 3.0 (wchar_t,compiler with C++ ABI 1009,wx
containers,compatible with 2.8).
Aborted
```
Turn LTO off by default until I fix it for newer gcc/binutils, currently
with gcc7 ar segfaults linking vbamcore.
Replace the hardcoded `make -j8` command in the build instructions with
a `-j` parameter that is the number of the host's CPUs minus one.
Subtracting 1 is done to reduce chances of overloading the host.
If the value is `1`, then don't print the `-j` flag at all.
This flags breaks the build on e.g. ARM, so only use it when a PC
architecture (x86 or amd64) has been detected. Thanks to ZachBacon for
spotting this.
ConfigManager does not use any version info, but is part of libvbamcore,
so removing the `#include` makes rebuilds after git changes much much
faster.
Remove the AutoBuild.h includes from ConfigManager.cpp and SDL.cpp (the
SDL port) because the information in that file does not seem to be used
and it also includes version.h, forcing those files to rebuild
unnecessarily.
Use cmake to generate the version.h from version.h.in which is a cleaned
up version of the old version.h with the git short sha into the build
directory, and include the version.h from there.
Continue to use the GetGitRevisionDescription plugin to make the cmake
configuration state depend on the current sha of HEAD, but throw away
the results (for the time being.)
This makes rebuilds after git changes such as a commit only recompile a
couple of files instead of the whole tree.
`throttle == 0` is supposed to emulate at full speed and drop audio
data, this is different from `throttle == 100` which is emulation
throttled at normal speed, the default setting.
Fix the recently rewritten SoundSDL sound driver to make `throttle == 0`
work, and make some minor changes to clean up the relevant code in the
XAudio2 sound driver.
Add a "REPORTING CRASH BUGS" section to the README.md with instructions
for how to provide a symbolic backtrace on Linux and MSYS2.
Add a "Crash bugs" section the the issue template with a link to said
README.md section.
Rewrite SoundSDL (the SDL sound driver).
Clean up the code and eliminate all deadlocks/hangs/crashes (hopefully.)
Many of the deadlocks were caused by initialize() not de-initializing
properly and causing the audio callback thread to deadlock, fix this.
Also use better logic for the semaphore controls, which will also
hopefully increase audio quality.
Use better logic for the throttle control, with throttle == 0 being the
same as throttle == 100 and implement setThrottle().
Also increase the buffer size to 300ms and the number of samples to
2048, for hopefully less choppiness in audio overall.
The SDL API documentation for the audio callback specifies that the
callback *MUST* write to the buffer and not just return:
https://wiki.libsdl.org/SDL_AudioSpec#Remarks
write silence to the buffer (value taken from the AudioSpec returned
from OpenAudioDevice) when the emulator is paused.
Paint the whole GameArea (containing the emulator graphics panel) black
on size events for both the GameArea and the panel.
This will hopefully fix reports of garbage around the panel when going
full screen with the OpenGL driver on Linux.
Remove F11 as the default key for save state (GS=) in the defkeys array
in opts.cpp and leave it unmapped by default, because it conflicts with
the menu XRC mapping for full screen which is also F11 on non-macOS
platforms.
SDL_PauseAudioDevice seems to be causing thread deadlocks in combination
with Wx threads (e.g. on menu activation or modal dialogs.)
Remove these calls from SoundSDL::pause() and SoundSDL::resume() for the
time being so that deadlocks do not happen.
This effectively allows pausing, but on resume there is no sound for 2-3
seconds until the buffer is filled again.
This will need a proper fix at a later time.
Remove the wxALIGN_CENTRE_VERTICAL flag from items that have the
wxEXPAND flag in the MemViewer.xrc because wx 3.1+ warns about the flags
being incompatible.
As cmake now warns when policies are set to OLD, change the CMP0005
policy to NEW.
What this does is have cmake escape -D preprocessor definitions passed
to e.g. add_definitions() starting in cmake 2.6 . This is fine since the
minimum cmake version we support is 2.8.12 . It also makes the code
cleaner since we don't have to escape quotes anymore ourselves. This
will also work better on different platforms, where different escapes
may be needed.
Remove all quote escapes from string params to add_definitions() for
this policy change to work.
- drop unused variables
- unused-but-set-variable
- stray trailing comments
- in viewsupt.cpp replace redundant expression with variable that holds the same value
In StartRFUSocket() in gba/GBALink.cpp move a postincrement out of an
expression to a following statement, because the evaluation order is
undefined.
In GetDevices() in wx/openal.cpp replace an #else with an #endif so that
the function has a default return statement visible to the linter.
In FilterThread::Entry() add a `return 0;` (ExitCode) statement at the
end even though it is probably never reached.
In the TransferToWindow() for the positive double validator widget in
wx/widgets/wxmisc.cpp add a default `return true;`, for the rare case
there is no double value, in which case the string representation would
be displayed (since it is a subclass of wxGenericValidator(wxString&) .)