jamulus/src/clientdlg.h

236 lines
9 KiB
C
Raw Normal View History

2013-01-23 11:41:13 +01:00
/******************************************************************************\
2020-01-01 15:41:43 +01:00
* Copyright (c) 2004-2020
2013-01-23 11:41:13 +01:00
*
* Author(s):
* Volker Fischer
*
******************************************************************************
*
* 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
2013-01-23 11:41:13 +01:00
*
\******************************************************************************/
#include <QLabel>
#include <QString>
#include <QLineEdit>
#include <QPushButton>
#include <QProgressBar>
#include <QWhatsThis>
#include <QTimer>
#include <QSlider>
#include <QRadioButton>
#include <QMenuBar>
#include <QLayout>
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
# include <QVersionNumber>
#endif
2013-01-23 11:41:13 +01:00
#include "global.h"
#include "client.h"
#include "settings.h"
#include "multicolorled.h"
#include "audiomixerboard.h"
#include "clientsettingsdlg.h"
#include "chatdlg.h"
#include "connectdlg.h"
2013-02-23 21:15:48 +01:00
#include "analyzerconsole.h"
2013-03-24 11:49:25 +01:00
#include "ui_clientdlgbase.h"
#if defined ( __APPLE__ ) || defined ( __MACOSX )
# if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
# include <QtMac>
# endif
#endif
2013-01-23 11:41:13 +01:00
/* Definitions ****************************************************************/
// update time for GUI controls
#define LEVELMETER_UPDATE_TIME_MS 100 // ms
#define BUFFER_LED_UPDATE_TIME_MS 300 // ms
2013-01-23 11:41:13 +01:00
#define LED_BAR_UPDATE_TIME_MS 1000 // ms
// number of ping times > upper bound until error message is shown
#define NUM_HIGH_PINGS_UNTIL_ERROR 5
/* Classes ********************************************************************/
2013-03-24 16:42:23 +01:00
class CClientDlg : public QDialog, private Ui_CClientDlgBase
2013-01-23 11:41:13 +01:00
{
Q_OBJECT
public:
2013-03-24 16:42:23 +01:00
CClientDlg ( CClient* pNCliP,
CSettings* pNSetP,
const QString& strConnOnStartupAddress,
const int iCtrlMIDIChannel,
2013-03-24 16:42:23 +01:00
const bool bNewShowComplRegConnList,
const bool bShowAnalyzerConsole,
2019-04-12 18:42:05 +02:00
QWidget* parent = nullptr,
Qt::WindowFlags f = nullptr );
2013-01-23 11:41:13 +01:00
protected:
void SetGUIDesign ( const EGUIDesign eNewDesign );
void SetMyWindowTitle ( const int iNumClients );
void ShowConnectionSetupDialog();
2015-01-31 09:18:17 +01:00
void ShowMusicianProfileDialog();
2013-01-23 11:41:13 +01:00
void ShowGeneralSettings();
void ShowChatWindow ( const bool bForceRaise = true );
void ShowAnalyzerConsole();
2013-01-23 11:41:13 +01:00
void UpdateAudioFaderSlider();
void UpdateRevSelection();
void Connect ( const QString& strSelectedAddress,
const QString& strMixerBoardLabel );
void Disconnect();
2013-01-23 11:41:13 +01:00
CClient* pClient;
CSettings* pSettings;
bool bConnected;
bool bConnectDlgWasShown;
bool bMIDICtrlUsed;
2013-01-23 11:41:13 +01:00
QTimer TimerSigMet;
QTimer TimerBuffersLED;
2013-01-23 11:41:13 +01:00
QTimer TimerStatus;
QTimer TimerPing;
virtual void closeEvent ( QCloseEvent* Event );
2013-01-23 11:41:13 +01:00
void UpdateDisplay();
QMenu* pViewMenu;
QMenu* pEditMenu;
2013-01-23 11:41:13 +01:00
QMenuBar* pMenu;
QMenu* pInstrPictPopupMenu;
QMenu* pCountryFlagPopupMenu;
2013-01-23 11:41:13 +01:00
CClientSettingsDlg ClientSettingsDlg;
CChatDlg ChatDlg;
CConnectDlg ConnectDlg;
CAnalyzerConsole AnalyzerConsole;
2015-01-31 09:18:17 +01:00
CMusProfDlg MusicianProfileDlg;
2013-01-23 11:41:13 +01:00
public slots:
void OnAboutToQuit() { pSettings->Save(); }
void OnConnectDisconBut();
void OnTimerSigMet();
void OnTimerBuffersLED();
2013-01-23 11:41:13 +01:00
void OnTimerStatus() { UpdateDisplay(); }
void OnTimerPing();
void OnPingTimeResult ( int iPingTime );
void OnCLPingTimeWithNumClientsReceived ( CHostAddress InetAddr,
int iPingTime,
int iNumClients );
void OnControllerInFaderLevel ( const int iChannelIdx,
const int iValue ) { MainMixerBoard->SetFaderLevel ( iChannelIdx,
iValue ); }
void OnVersionAndOSReceived ( COSUtil::EOpSystemType ,
QString strVersion );
#ifdef ENABLE_CLIENT_VERSION_AND_OS_DEBUGGING
void OnCLVersionAndOSReceived ( CHostAddress InetAddr,
COSUtil::EOpSystemType eOSType,
QString strVersion )
{ ConnectDlg.SetVersionAndOSType ( InetAddr, eOSType, strVersion ); }
#endif
void OnOpenConnectionSetupDialog() { ShowConnectionSetupDialog(); }
2015-01-31 09:18:17 +01:00
void OnOpenMusicianProfileDialog() { ShowMusicianProfileDialog(); }
2013-01-23 11:41:13 +01:00
void OnOpenGeneralSettings() { ShowGeneralSettings(); }
void OnOpenChatDialog() { ShowChatWindow(); }
void OnOpenAnalyzerConsole() { ShowAnalyzerConsole(); }
2020-06-13 08:51:05 +02:00
void OnSortChannelsByName() { MainMixerBoard->ChangeFaderOrder ( true, ST_BY_NAME ); }
void OnSortChannelsByInstrument() { MainMixerBoard->ChangeFaderOrder ( true, ST_BY_INSTRUMENT ); }
2013-01-23 11:41:13 +01:00
void OnSettingsStateChanged ( int value );
void OnChatStateChanged ( int value );
2020-04-16 17:54:45 +02:00
void OnLocalMuteStateChanged ( int value );
2013-01-23 11:41:13 +01:00
void OnAudioPanValueChanged ( int value );
void OnAudioReverbValueChanged ( int value )
{ pClient->SetReverbLevel ( value ); }
void OnReverbSelLClicked()
{ pClient->SetReverbOnLeftChan ( true ); }
void OnReverbSelRClicked()
{ pClient->SetReverbOnLeftChan ( false ); }
void OnConClientListMesReceived ( CVector<CChannelInfo> vecChanInfo );
2013-01-23 11:41:13 +01:00
void OnChatTextReceived ( QString strChatText );
void OnLicenceRequired ( ELicenceType eLicenceType );
2013-01-23 11:41:13 +01:00
void OnChangeChanGain ( int iId, double dGain, bool bIsMyOwnFader )
{ pClient->SetRemoteChanGain ( iId, dGain, bIsMyOwnFader ); }
2013-01-23 11:41:13 +01:00
2020-04-26 00:55:28 +02:00
void OnChangeChanPan ( int iId, double dPan )
{ pClient->SetRemoteChanPan ( iId, dPan ); }
2020-04-26 00:55:28 +02:00
2013-01-23 11:41:13 +01:00
void OnNewLocalInputText ( QString strChatText )
{ pClient->CreateChatTextMes ( strChatText ); }
void OnReqServerListQuery ( CHostAddress InetAddr )
{ pClient->CreateCLReqServerListMes ( InetAddr ); }
void OnCreateCLServerListPingMes ( CHostAddress InetAddr )
{ pClient->CreateCLServerListPingMes ( InetAddr ); }
void OnCreateCLServerListReqVerAndOSMes ( CHostAddress InetAddr )
{ pClient->CreateCLServerListReqVerAndOSMes ( InetAddr ); }
void OnCreateCLServerListReqConnClientsListMes ( CHostAddress InetAddr )
{ pClient->CreateCLServerListReqConnClientsListMes ( InetAddr ); }
2013-01-23 11:41:13 +01:00
void OnCLServerListReceived ( CHostAddress InetAddr,
CVector<CServerInfo> vecServerInfo )
{ ConnectDlg.SetServerList ( InetAddr, vecServerInfo ); }
void OnCLConnClientsListMesReceived ( CHostAddress InetAddr,
CVector<CChannelInfo> vecChanInfo )
{ ConnectDlg.SetConnClientsList ( InetAddr, vecChanInfo ); }
void OnClientIDReceived ( int iChanID )
{ MainMixerBoard->SetMyChannelID ( iChanID ); }
void OnMuteStateHasChangedReceived ( int iChanID, bool bIsMuted )
{ MainMixerBoard->SetRemoteFaderIsMute ( iChanID, bIsMuted ); }
void OnCLChannelLevelListReceived ( CHostAddress /* unused */,
CVector<uint16_t> vecLevelList )
{ MainMixerBoard->SetChannelLevels ( vecLevelList ); }
void OnConnectDlgAccepted();
void OnDisconnected() { Disconnect(); }
void OnCentralServerAddressTypeChanged();
void OnGUIDesignChanged() { SetGUIDesign ( pClient->GetGUIDesign() ); }
2013-01-23 11:41:13 +01:00
void OnDisplayChannelLevelsChanged()
{ MainMixerBoard->SetDisplayChannelLevels ( pClient->GetDisplayChannelLevels() ); }
2020-06-14 23:02:13 +02:00
void OnRecorderStateReceived ( ERecorderState eRecorderState )
{ MainMixerBoard->SetRecorderState ( eRecorderState ); }
2014-02-24 20:51:57 +01:00
void OnAudioChannelsChanged() { UpdateRevSelection(); }
2013-01-23 11:41:13 +01:00
void OnNumClientsChanged ( int iNewNumClients );
2015-11-25 16:52:00 +01:00
void OnNewClientLevelChanged() { MainMixerBoard->iNewClientFaderLevel = pClient->iNewClientFaderLevel; }
Add recording support with Reaper Project generation Includes the following changes * Initial .gitignore Administrative * Fix up warning message * Not all Windows file systems are case insensitive Bugfixes * (Qt5) Use QCoreApplication for headless Possible solution to get the application to run as a headless server but it loses the nice history graph, so not ideal. * Avoid ESC closing chat Because ESC shouldn't close the chat window. Or the main app window. * Add console logging support for Windows Whilst looking for the headless support, I found this idea for Windows logging. New improved version. This makes far fewer changes. ---- * Add recording support with Reaper Project generation The main feature! * New -r option to enable recording of PCM files and conversion to Reaper RPP with WAV files * New -R option to set the directory in which to create recording sessions You need to specify the -R option, there's no default... so I guess -r and -R could be combined. * New -T option to convert a session directory with PCM files into a Reaper RPP with WAV files You can use -T on "failed" sessions, if the -r option captures the PCMs but the RPP converter doesn't run for some reaon. (It was useful during development, maybe less so once things seem stable.) The recorder is implemented as a new thread with queuing from the main "real time" server thread. When a new client connects or if its audio format changes (e.g. mono to stereo), a new RIFF WAVE file is started. Each frame of decompressed audio for each client written out as LPCM to the file. When the client disconnects, the RIFF WAVE headers are updated to reflect the file length. Once all clients disconnect, the session is considered ended and a Reaper RPP file is written.
2019-04-03 19:12:45 +02:00
2019-04-12 18:55:43 +02:00
void accept() { close(); } // introduced by pljones
2019-04-12 18:42:05 +02:00
void keyPressEvent ( QKeyEvent *e ) // block escape key
{ if ( e->key() != Qt::Key_Escape ) QDialog::keyPressEvent ( e ); }
2013-01-23 11:41:13 +01:00
};