Added a one-window-mode which allows to have only one instrument track
window open at a time. The content of this window is replaced each time
you open a different track.
Furthermore added global reception and forwarding of key events to the
piano widget of the top-most instrument track window. This for example
enables the user to play test sounds while tweaking some effects in a
different subwindow.
First attempts to get away from QPlastiqueStyle as the default style
and instead dynamically use an overloaded version of the native style.
Still needs lots of tuning, especially regarding colors.
The height of TextFloat objects was not sufficient e.g. when used as
tooltips for knobs (while changing their values). Fixed improper
geometry calculation and static values in TextFloat::paintEvent().
Using QVector involves calls to malloc & friends which are not RT safe
and thus must not be used in AudioJack::processCallback(). Instead
allocate the required array upon initialization.
(cherry picked from commit ae7a4e4c2f13432d39b13c25b66231bdd6a1cc65)
There's been some more code that is only required if AUDIO_PORT_SUPPORT
is set. Added according #ifdefs and fixed a typo in AudioPort support
code.
(cherry picked from commit e98726ae992c77fb2dfdb6668319b5521ff8aaef)
* remote-plugin-fixes:
RemotePlugin: sleep in waitForMessage() when actively waiting for data
RemotePlugin: better code order in sendMessage() + cleanups
RemotePlugin: coding style fixes + inline keyword reduces
RemotePlugin: smaller buffers for number to string conversions
RemotePlugin: added branch prediction hints
We must not have any file called config.h in directories which are added
to global include directories. For example when building the CALF plugin
the file config.h from libsamplerate was used rather than CALF's local
one. Fixes missing LADSPA symbols in CALF library if no usable
libsamplerate was found in the system at configure time.
Also bumped version number in src_config.h.
When calling TrackContentObject::paste(), only the content should be
pasted, not the position. This fixes pasting for example note patterns
and is also a more generic solution for the bug fixed in commit
4ec5c6afe1.
Closes#3005649.
Not sure when it broke but cloning BB tracks erroneously cloned
positions of TCOs as well which made the source BB track have
two TCOs one upon the other while the destination BB did not have
any TCOs at all.
The fix is to save the position of the destination TCO before and
restore it manually after paste().
Commit 884b9ca671 completely broke the
note detuning feature as the detuning value was not incoorporated into
the frequency calculation anymore. Fix this by adding the detuning value
to the pitch variable.
Integrates Sami Boukortt's patch described below:
I have made a patch for the “Save changes?” dialog box to let the user choose
between “Save”, “Discard” and “Cancel” instead of “Yes”, “No” and “Cancel”.
I find this way more intuitive, since it enables Qt to reorganize the buttons
properly according to the platform and to give them an icon (at least on X11).
It also allows users to know what is going to happen without having to read
the question.
It's a bad style to manage global instances of an object in the object
itself. Therefore introduced a nested helper class which manages all
instances of EnvelopeAndLfoParameters globally. It is now responsible
for global reset/triggers of LFOs. In contrast to previous state, this
is now done thread-safe. Fixes crashes for example while importing
MIDI files.
The new deleteHelper() template function takes a pointer, saves it
to a temporary, sets the passed pointer to NULL and then deletes the
object it was referring to before. This way we can spot bugs caused by
undesired references to global objects at shutdown more easily.
It was not possible to call any of the functions of AutomationEditor
from threads other than the main GUI thread as the m_pattern pointer
was not protected by a mutex. It is however desired to be able to call
for example AutomationEditor::setCurrentPattern(...) from different
threads (mainly required when deleting AutomationPatterns in other
threads). Thus made this method and all accesses to the m_pattern
pointer thread-safe.
For some effects it is helpful to know whether their attached EffectView
is visible or not. This mainly concerns effects that actually do not
touch the sound data but analyze it and display the results.
Cross compile support for Win32 and Win64 has been unified,
simplified and adapted to the new MinGW64-based build environment.
This finally allows to produce working Win64 binaries.
Users reported the last buffer played repeatedly while the dialog asking
whether to save project is shown. This behaviour even continued while
loading a project. An easy workaround for this is to stop playing song
(or whichever TrackContainer is active at the moment) in
MainWindow::mayChangeProject().
Closes bug #2904781.
We have to lock Mixer when touching Song's state via Song::startExport()
and Song::stopExport() in ProjectRenderer::run() as the FIFO writer
thread may call Mixer::renderNextBuffer() (which calls Song::doActions())
simultaneously. Fixes a random segfault when exporting project.
This was a new bug as the ProjectRenderer does not operate FIFO-less
anymore.
* auto-save:
don't change the current project when auto-saving
auto-saves every minute and recovers upon crash
don't show WelcomeScreen when importing/loading
Conflicts:
src/gui/MainWindow.cpp
There's no need to start the ProjectRenderer thread with high priority
anymore as the actual rendering is done on the other side of the FIFO.
The ProjectRenderer just waits for new data in the FIFO and encodes
them as they arrive.
Renamed the ProjectRenderer::OutputSettings structure to
ProjectRenderer::EncoderSettings to better reflect its meaning.
Additionally added some basic Doxygen comments.
Until now, Mixer not only was responsible for rendering audio buffers
but also managed writing them to audio backend (through a FIFO) and
handled various quality related parameters.
All this functionality has been moved into the new AudioOutputContext
class. It glues together AudioBackend (formerly called AudioDevice),
global quality settings and the Mixer.
The AudioOutputContext class creates a FifoWriter which calls
Mixer::renderNextBuffer() and writes the output into the BufferFifo of
the AudioOutputContext it belongs to. The BufferFifo is read by the
according AudioBackend which belongs to the AudioOutputContext as well.
The AudioOutputContext also handles resampling in case the AudioBackend
wants the buffers in a different samplerate.
During this rewrite the Mixer class and the according source files have
been renamed from "mixer" to "Mixer". This results in small changes
all over LMMS' code base.
This reverts commit c517f1fa5a.
The commit was not very helpful and introduced new xrun problems.
Instead I'll be rewriting the part of LMMS where Mixer, Mixer's
quality settings, Buffer FIFO and AudioDevice are sticked together.
There's really no need to allocate a buffer each period, push it to the
FifoBuffer and free it when fetching the buffer in
AudioDevice::getNextBuffer(). Instead keep the pointer in FifoBuffer's
pool and reuse it.
Try to adjust latency of PulseAudio according to our settings of mixer
so it does not have such a bad latency anymore.
Furthermore force PulseAudio to play silence instead of rewinding
streams in case of underruns.
There have been some problems with the threading logic in the
AudioPulseAudio backend resulting in an endless loop when quitting LMMS.
Furthermore allocated PulseAudio resources were not freed properly.
Thanks to Armin Kazmi <armin.kazmi@tu-dortmund.de> for pointing out
this issue.
every time auto-save ran, it would change the current project to
"recover.mmp". Now it doesn't do this because Song has
guiSaveProject(), guiSaveProjectAs(), and saveProjectFile().
(the latter is used for auto-save)
Changes in base directory were not tracked by filesystem watcher.
Explicitely add base directory to filesystem watcher and add a special
case to LocalResourceProvider::reloadDirectory().
When customizing background color of a widget via CSS, Qt somehow
falls back to ugly old windows style. This resulted in ugly looking
scrollbars in WelcomeScreen when working at a low screen resolution.
Therefore disable those scrollbars as they're rather useless anyways.
QListView automatically shows three dots for too wide text items.
auto-save time is not configurable yet. saves "recover.mmp" to
WORKING_DIR every 60 seconds. Deletes recover.mmp on successful
close of LMMS. If recover.mmp is found upon start, it loads that
project.
In AudioPulseAudio::streamWriteCallback() we're operating on pcmbuf
via an operation from CPU class. All methods of CPU assume the buffer
being aligned on 16 byte boundaries. However pa_xmalloc() & friends do
not allocate aligned memory which resulted in a crash when calling
CPU::convertToS16() (SSE2 version takes advantage of aligned memory).
Replacing pa_xmalloc()/pa_xfree() with CPU::memAlloc()/CPU::memFree()
fixes this crash.
Closes bug #2890465.
Rewrote implementation of class SideBar to use QToolBar instead of
KMultiTabBar. We can style the SideBar now easily via CSS and do not
have to ship 3rd party KDE code with LMMS. Also the QToolBar based
SideBar integrates much better into the according widget style.
Furthermore renamed SideBar related classes and files to match new
coding style.
Still QString::toAscii() & friends were used in several places causing
problems such as failed access to files with non-ASCII characters in
name.
Closes#2884115.