> I'm curious to see the complete changelog since 0.4.1.
Heh, here's a slightly edited SVN log for ya.
The biggest changes usually get the smallest log entries.
- Support shared mode WASAPI surround mix format.
- Add GBA CGB mode option.
- Add save path selection.
- Stop using different file name for save files when forcing DMG.
- Set worker thread MMCSS priority to "Audio".
- Flush audio on ROM load to avoid noise from previous ROM when switching.
- Dont re-initialize on resetAudio for engines that drain when paused.
- Deactivate undesired menu options on ROM load fail stop.
- Use fast, fail-safe ROM reset.
- reenable some printing on load fail due to unsupported mbc.
- Be less sensitive when configuring joystick input.
- Use event-driven scheduling for shared mode WASAPI.
- Include 96000 Hz as a sampling rate listed by default.
- Separate vsync option for exclusive full screen because it tends to work
better, so you may want to enable it while leaving non-exclusive vsync off.
- Add some tool tips.
- Work around DWM compositor screwing up when duplicating frames by adding
"DWM triple buffering" option (on by default) which sets presentparameters
with frame queueing for all blitters.
- Work around DWM breaking windows with frame queuing after composition is
disabled and re-enabled, by resetting present parameters on next video
frame after composition enable event.
- Work around DWM breaking OpenGL window on minimize by unsetting present
params on hide event, and setting on show event.
- Ignore sync to vblank when DWM composition is active.
- Deactivate sync to frame rate option when DWM composition is active.
- Make window size setting a menu rather than a part of video settings dialog.
- Work around Windows file dialog blocking events by waiting for pause to
complete before launching such dialog.
- Work around events getting blocked when resizing on Windows by consuming
pending blit requests on resizeEvent.
- WASAPI: Detect and use shared stream sampling rate in shared mode because
all other rates appear to fail.
- Default screen names start at "1" rather than "0".
- Build fixes for mingw gcc 3.4.
- Add one level of unrolling to cic2.
- Allow intermediate polyphase sinc resamplers in a resampling chain to
start/end (after fold) roll-off at limit of hearing if applicable, not
just the final one.
- Modify chain cost formulae and their derivatives for optimal ratios
- don't wait for video frame consumption if approximate usecs from underrun
is low comapred to video frame timeout.
- slightly higher precision in frametime inc/dec representation.
- Adjustable base frame rate.
- alsaengine: Increase start threashold to full buffer.
- alsaengine: Block rate estimation when pcm not in running state.
- alsaengine: Default custom device plughw rather than hw.
- one more decimal position in refresh rate representation.
- use xrandr screen names
- hide empty full mode comboboxes
- windowed resolution -> window size
- lots of refactoring.
- libgambatte: * (edit: meaning pretty much tons of stuff rewritten and
updated to a shitload of reverse engineering work done covered by several
hundreds of new tests)
- tons of re (cgb _and_ dmg).
Ran 2755 tests.
- done a ton of stuff to better facilitate automated testing.
- DMG testing
- Fix 2xSAI video filter reading out of bounds.
- Optimize save state thumbnail generation.
- Get rid of potential double free of unusable blitter.
- ignore() keyPress/keyRelease events so that global keys still function.
- Better (simpler and makes sense) hypothesis for mode3 sprite cycles.
- Document libgambatte better.
- Document resampling framework better.
- Use a single constant for setting number of resampler channels rather
- Move uncopyable.h to common.
- ScalingMethod header.
- length of video frame -> duration of video frame.
- Document Qt media framework better.
- Move resample files around to separate interface files from
- Move Qt media framework files around to separate interface from
- Redesign Qt multimedia framework to use a worker thread for MediaSource
updates. This was a ton of work, but should make underruns a lot less
likely. The majority of underruns are caused by video I/O blocking (even
when not syncing to vblank). It also means that vsync blocking is a
non-issue. Lots of thread-safety considerations had to be done. Lots of
tools developed to deal with new problems. Things redesigned to be
asynchronous to avoid blocking the worker thread. New interfaces developed
to give clients access to these things without too much pain, as clients
need to deal with thread-safety issues, and be able to do things
asynchronously to avoid blocking and unnecessary synchronization. Things
developed and then scrapped as I changed my mind. Lots of thinking and
testing to ensure video smoothness.
- Make configuration of the multimedia framework way more flexible, by
adding methods for configuring video and sound, rather than forcing the
use of the SoundDialog or VideoDialog. Thus clients can make their own GUI
for such things.
- Pass raw input events to MediaSources so that clients will not have to use
the InputDialog with its Button system.
- Split BlitterWidget blitting into three methods: blit, draw, and sync,
such that blitting is supposedly a fast pixel copy or buffer swap, while
draw prepares for presentation, and sync presents the completed video
frame ASAP. Blit needs to be fast to avoid blocking the worker thread to
- Allow heavy MediaSource video work to be skipped when frames are skipped.
- Do some work in parallel on SMP systems.
- Adjust low audio buffer detection to make it more robust.
- Move variance calculation to the user of estimations, because the variance
calculated by estimators is not well defined anyway.
- Add support for adjustable fast-forward speed.
- Fast-forward now outputs audio, by skipping entire segments of audio when
- Adjust blitters to conform to the new threaded model.
- Direct3DBlitter: Apparently vertices point to the center of pixels.
Subtract 0.5 from vertex coordinates.
- DirectDrawBlitter: Sleep more when far from vblank.
- QGLBlitter: Get rid of makeCurrent calls, because they apparently block
and can be slow and don't seem to be needed anyway. They also seem to
cause instability with some drivers.
- XvBlitter: Double buffer to delay updates to sync time.
- X11Blitter: Double buffer when not scaling to delay updates to sync time.
- QPainterBlitter: Double buffer when not scaling to delay updates to sync
- SdlBlitter: Delay updates to sync time.
- AlsaEngine: Set max periods to 16 to work around stupid ALSA plugins and
drivers that advertise smaller period sizes than properly supported. ALSA
always picks the maximum number of periods allowed, which means it picks
the smallest period size allowed for a given buffer size.
- QPainterBlitter: Don't disable updates when not paused, because this
- Support pause on focus out.
- Add MiscDialog to allow user configuration of fast-forward speed and focus
- Separate sync to refresh rate logic from sync to vblank logic.
- Sync to refresh rate menu option.
- Use semi-bilinear filtering rather than bilinear filtering for
- MakeSincKernel: Consider rounding effects when computing absolute gain.
- MakeSincKernel: Use a function pointer rather than a template argument to
reduce code bloat.
- Reorder sinc kernel phases.
- PolyPhaseConvoluter: Simplify some calculations.
- Replace Hamming and Blackman windowed sincs with Kaiser windowed sinc of
appropriate betas, because they require a lower number of taps to achieve
the same specs.
- Use rounding shifts in resamplers for higher precision and performance.
- libgambatte: Update returns on video frame completion rather than using a
callback for notification.
- libgambatte: Move video filters and color conversion out of the library.
- libgambatte: Get rid of unnecessarily complex VideoBlitter interface.
- libgambatte: Use bit flags rather bools for input state.
- Change some parameters to constants in 2xsai and hqx video filters.
- Probably other stuff I've forgotten about.
- swscale.h: Add semiLinear scaler, which is almost as sharp and fast as
nearestNeighbor for large scales, yet reduces aliasing like the linear
- swscale.h: Center nearest neighbor bias.
- swscale.h: Optimize a bit more.
- ossengine: Reduce number of requested fragments again slightly to 6,
because OSSv4 has a default minimum fragment size of about 10 ms causing
excessive minimum latency.
- ossengine: Fix horribly broken rate estimation on OSS4 (and possibly other
implementations) by using GETOPTR rather than GETOSPACE.
- ossengine: Increase number of fragments requested from 4 to 8 for more
accurate OSPACE/OPTR information with OSS4 (and possibly other
- ossengine: Minor include corrections and namespace fixes.
- ossengine: Use log(x)/log(2) rather than non-c++98 log2.
- ossengine: Minor rounding fix in fragment size calculation.
- AlsaEngine: Set start threshold to half the buffer size, to avoid
(possibly infinite) repeated xruns due to ALSA's default threshold of 1
- Use RGBA internal texture format, as it usually means less conversion.
- Get rid of pointless initialization of OpenGL state that is equal to
the default, or otherwise meaningless. Enable GL_CULL_FACE in case it's
slightly faster in some configurations.
- Use MinKeeper to schedule Memory::events.
- Remove old incEndtime function since it's not worth the maintenance
- Add data structure that efficiently keeps track of the minimum of a
small, fixed set of variables, using templates to autogenerate
efficient, unrolled functions that update the binary tree for each
variable. It also efficiently supports priorities among variables when
their values are equal, and can give variables that change the most
frequently a better spot in the tree if the number of variables isn't a
power of 2. Will be used for event scheduling.
- Lyc0irq on display enable.