mirror of
https://github.com/LMMS/lmms.git
synced 2026-03-04 14:18:58 -05:00
* Fix bug introduced by #5657 There was a bug introduced by #5657 where reloading a project and playing it could cause a Segmentation Fault crash. After some debugging, @DomClark tracked the issue to be likely a use-after-free being caused by m_oldAutomatedValues not being cleared when the project was loaded again. This commit adds a line to clear the m_oldAutomatedValues map on Song::clearProject(), which is called from Song::loadProject(). Now, instead of using a Signal/Slot connection to move the control of the models back to the controllers, every time the song is processing the automations, the control of the models that were processed in the last cycle are moved back to the controller. The same is done under Song::stop(), so the last cycle models control is moved back to the controller. That removes the need to have a pointer to the controlled model in the controller object. Adds mixer model change request to avoid race condition. Co-authored-by: Dominic Clark <mrdomclark@gmail.com>
123 lines
2.9 KiB
C++
123 lines
2.9 KiB
C++
/*
|
|
* ControllerConnection.h - declaration of a controller connect, which
|
|
* provides a definition of the link between a controller and
|
|
* model, also handles deferred creation of links while
|
|
* loading project
|
|
*
|
|
* Copyright (c) 2008 Paul Giblock <pgllama/at/gmail.com>
|
|
* Copyright (c) 2010 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
|
*
|
|
* This file is part of LMMS - https://lmms.io
|
|
*
|
|
* 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 (see COPYING); if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef CONTROLLER_CONNECTION_H
|
|
#define CONTROLLER_CONNECTION_H
|
|
|
|
#include <QtCore/QObject>
|
|
#include <QtCore/QVector>
|
|
|
|
#include "Controller.h"
|
|
#include "JournallingObject.h"
|
|
#include "ValueBuffer.h"
|
|
|
|
class ControllerConnection;
|
|
|
|
typedef QVector<ControllerConnection *> ControllerConnectionVector;
|
|
|
|
|
|
class LMMS_EXPORT ControllerConnection : public QObject, public JournallingObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
|
|
ControllerConnection(Controller * _controller);
|
|
ControllerConnection( int _controllerId );
|
|
|
|
virtual ~ControllerConnection();
|
|
|
|
inline Controller * getController()
|
|
{
|
|
return m_controller;
|
|
}
|
|
|
|
void setController( Controller * _controller );
|
|
|
|
inline void setController( int _controllerId );
|
|
|
|
float currentValue( int _offset )
|
|
{
|
|
return m_controller->currentValue( _offset );
|
|
}
|
|
|
|
ValueBuffer * valueBuffer()
|
|
{
|
|
return m_controller->valueBuffer();
|
|
}
|
|
|
|
inline void setTargetName( const QString & _name );
|
|
|
|
inline QString targetName() const
|
|
{
|
|
return m_targetName;
|
|
}
|
|
|
|
inline bool isFinalized()
|
|
{
|
|
return m_controllerId < 0;
|
|
}
|
|
|
|
static void finalizeConnections();
|
|
|
|
void saveSettings( QDomDocument & _doc, QDomElement & _this ) override;
|
|
void loadSettings( const QDomElement & _this ) override;
|
|
|
|
static inline const QString classNodeName()
|
|
{
|
|
return "connection";
|
|
}
|
|
|
|
QString nodeName() const override
|
|
{
|
|
return classNodeName();
|
|
}
|
|
|
|
public slots:
|
|
void deleteConnection();
|
|
|
|
protected:
|
|
//virtual controllerDialog * createDialog( QWidget * _parent );
|
|
Controller * m_controller;
|
|
QString m_targetName;
|
|
int m_controllerId;
|
|
|
|
bool m_ownsController;
|
|
|
|
static ControllerConnectionVector s_connections;
|
|
|
|
signals:
|
|
// The value changed while the mixer isn't running (i.e: MIDI CC)
|
|
void valueChanged();
|
|
|
|
friend class ControllerConnectionDialog;
|
|
};
|
|
|
|
#endif
|
|
|