Merge pull request #2 from corrados/master

pull master
This commit is contained in:
Snayler 2020-05-15 23:20:32 +01:00 committed by GitHub
commit 58b72ca660
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
51 changed files with 6400 additions and 3333 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "libs/oboe"]
path = libs/oboe
url = https://github.com/google/oboe.git

View File

@ -1,35 +1,54 @@
3.5.4git
TODO server list split on query
TODO Keep lrelease? Does it work as expected?
3.5.3git
- for CoreAudio and 4 channel input, support mixing channels 1&2 with 3&4
- added bassoon/oboe/harp instrument icons, created by dszgit (Ticket #131)
- link to docs from application Help menu (Ticket #90)
- support Mac CoreAudio aggregated devices (Ticket #138)
- added translations: french by trebmuh, portuguese by Snayler (Ticket #77)
- bug fix: for mono capture jack audio interface Jamulus complains it cannot make connections (Ticket #137)
TODO re-design About dialog
TODO implement panning for channels (Ticket #52, #145)
TODO fix Linux deploy script -> gives errors right now
TODO WIP support internationalization
TODO implement panning for channels (Ticket #52, #145)
TODO show mute state of others
3.5.3 (2020-05-15)
- correct unregister of headless server and RPP file creation on
SIGINT/SIGTERM, coded by pljones (Tickets #130, #168)
- for CoreAudio and 4 channel input, support mixing channels 1&2 with 3&4
- added bassoon/oboe/harp instrument icons created by dszgit,
congas/bongo created by bspeer (Ticket #131)
- link to docs from application Help menu (Ticket #90)
- support Mac CoreAudio aggregated devices (Ticket #138)
- added translations: French by trebmuh, Portuguese by Snayler,
Spanish by ignotus666, Dutch by jerogee, German by corrados (Ticket #77)
- new design for the About dialog (Ticket #189)
- new command line option -d to disconnect all clients on shutdown of the server (Ticket #161)
- bug fix: for mono capture jack audio interface Jamulus complains it
cannot make connections (Ticket #137)
- bug fix: fixed that Jamulus segfaults when jackd is restarted (Ticket #122, #127)
- bug fix: better handling of disconnect message in the client
- note: Jamulus is no longer compatible to Qt4
3.5.2 (2020-04-24)
- use audio level meter bars for normal skin

View File

@ -1,4 +1,4 @@
VERSION = 3.5.3git
VERSION = 3.5.4git
# use target name which does not use a captital letter at the beginning
contains(CONFIG, "noupcasename") {
@ -8,7 +8,8 @@ contains(CONFIG, "noupcasename") {
CONFIG += qt \
thread \
release
release \
lrelease
QT += widgets \
network \
@ -17,7 +18,8 @@ QT += widgets \
TRANSLATIONS = src/res/translation/translation_de_DE.ts \
src/res/translation/translation_fr_FR.ts \
src/res/translation/translation_pt_PT.ts \
src/res/translation/translation_es_ES.ts
src/res/translation/translation_es_ES.ts \
src/res/translation/translation_nl_NL.ts
INCLUDEPATH += src
@ -127,14 +129,141 @@ win32 {
LIBS += /usr/local/lib/libjack.dylib
}
} else:android {
# we want to compile with C++14
CONFIG += c++14
QT += androidextras
# enabled only for debugging on android devices
DEFINES += ANDROIDDEBUG
target.path = /tmp/your_executable # path on device
INSTALLS += target
HEADERS += android/sound.h
SOURCES += android/sound.cpp
SOURCES += android/sound.cpp \
android/androiddebug.cpp
LIBS += -lOpenSLES
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
OTHER_FILES += android/AndroidManifest.xml
# if compiling for android you need to use Oboe library which is included as a git submodule
# make sure you git pull with submodules to pull the latest Oboe library
OBOE_SOURCES = libs/oboe/src/aaudio/AAudioLoader.cpp \
libs/oboe/src/aaudio/AudioStreamAAudio.cpp \
libs/oboe/src/common/AudioSourceCaller.cpp \
libs/oboe/src/common/AudioStream.cpp \
libs/oboe/src/common/AudioStreamBuilder.cpp \
libs/oboe/src/common/DataConversionFlowGraph.cpp \
libs/oboe/src/common/FilterAudioStream.cpp \
libs/oboe/src/common/FixedBlockAdapter.cpp \
libs/oboe/src/common/FixedBlockReader.cpp \
libs/oboe/src/common/FixedBlockWriter.cpp \
libs/oboe/src/common/LatencyTuner.cpp \
libs/oboe/src/common/QuirksManager.cpp \
libs/oboe/src/common/SourceFloatCaller.cpp \
libs/oboe/src/common/SourceI16Caller.cpp \
libs/oboe/src/common/StabilizedCallback.cpp \
libs/oboe/src/common/Trace.cpp \
libs/oboe/src/common/Utilities.cpp \
libs/oboe/src/common/Version.cpp \
libs/oboe/src/fifo/FifoBuffer.cpp \
libs/oboe/src/fifo/FifoController.cpp \
libs/oboe/src/fifo/FifoControllerBase.cpp \
libs/oboe/src/fifo/FifoControllerIndirect.cpp \
libs/oboe/src/flowgraph/ClipToRange.cpp \
libs/oboe/src/flowgraph/FlowGraphNode.cpp \
libs/oboe/src/flowgraph/ManyToMultiConverter.cpp \
libs/oboe/src/flowgraph/MonoToMultiConverter.cpp \
libs/oboe/src/flowgraph/RampLinear.cpp \
libs/oboe/src/flowgraph/SampleRateConverter.cpp \
libs/oboe/src/flowgraph/SinkFloat.cpp \
libs/oboe/src/flowgraph/SinkI16.cpp \
libs/oboe/src/flowgraph/SinkI24.cpp \
libs/oboe/src/flowgraph/SourceFloat.cpp \
libs/oboe/src/flowgraph/SourceI16.cpp \
libs/oboe/src/flowgraph/SourceI24.cpp \
libs/oboe/src/flowgraph/resampler/IntegerRatio.cpp \
libs/oboe/src/flowgraph/resampler/LinearResampler.cpp \
libs/oboe/src/flowgraph/resampler/MultiChannelResampler.cpp \
libs/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp \
libs/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp \
libs/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp \
libs/oboe/src/flowgraph/resampler/SincResampler.cpp \
libs/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp \
libs/oboe/src/opensles/AudioInputStreamOpenSLES.cpp \
libs/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp \
libs/oboe/src/opensles/AudioStreamBuffered.cpp \
libs/oboe/src/opensles/AudioStreamOpenSLES.cpp \
libs/oboe/src/opensles/EngineOpenSLES.cpp \
libs/oboe/src/opensles/OpenSLESUtilities.cpp \
libs/oboe/src/opensles/OutputMixerOpenSLES.cpp
OBOE_HEADERS = libs/oboe/src/aaudio/AAudioLoader.h \
libs/oboe/src/aaudio/AudioStreamAAudio.h \
libs/oboe/src/common/AudioClock.h \
libs/oboe/src/common/AudioSourceCaller.h \
libs/oboe/src/common/DataConversionFlowGraph.h \
libs/oboe/src/common/FilterAudioStream.h \
libs/oboe/src/common/FixedBlockAdapter.h \
libs/oboe/src/common/FixedBlockReader.h \
libs/oboe/src/common/FixedBlockWriter.h \
libs/oboe/src/common/MonotonicCounter.h \
libs/oboe/src/common/OboeDebug.h \
libs/oboe/src/common/QuirksManager.h \
libs/oboe/src/common/SourceFloatCaller.h \
libs/oboe/src/common/SourceI16Caller.h \
libs/oboe/src/common/Trace.h \
libs/oboe/src/fifo/FifoBuffer.h \
libs/oboe/src/fifo/FifoController.h \
libs/oboe/src/fifo/FifoControllerBase.h \
libs/oboe/src/fifo/FifoControllerIndirect.h \
libs/oboe/src/flowgraph/ClipToRange.h \
libs/oboe/src/flowgraph/FlowGraphNode.h \
libs/oboe/src/flowgraph/ManyToMultiConverter.h \
libs/oboe/src/flowgraph/MonoToMultiConverter.h \
libs/oboe/src/flowgraph/RampLinear.h \
libs/oboe/src/flowgraph/SampleRateConverter.h \
libs/oboe/src/flowgraph/SinkFloat.h \
libs/oboe/src/flowgraph/SinkI16.h \
libs/oboe/src/flowgraph/SinkI24.h \
libs/oboe/src/flowgraph/SourceFloat.h \
libs/oboe/src/flowgraph/SourceI16.h \
libs/oboe/src/flowgraph/SourceI24.h \
libs/oboe/src/flowgraph/resampler/HyperbolicCosineWindow.h \
libs/oboe/src/flowgraph/resampler/IntegerRatio.h \
libs/oboe/src/flowgraph/resampler/LinearResampler.h \
libs/oboe/src/flowgraph/resampler/MultiChannelResampler.h \
libs/oboe/src/flowgraph/resampler/PolyphaseResampler.h \
libs/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.h \
libs/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.h \
libs/oboe/src/flowgraph/resampler/SincResampler.h \
libs/oboe/src/flowgraph/resampler/SincResamplerStereo.h \
libs/oboe/src/opensles/AudioInputStreamOpenSLES.h \
libs/oboe/src/opensles/AudioOutputStreamOpenSLES.h \
libs/oboe/src/opensles/AudioStreamBuffered.h \
libs/oboe/src/opensles/AudioStreamOpenSLES.h \
libs/oboe/src/opensles/EngineOpenSLES.h \
libs/oboe/src/opensles/OpenSLESUtilities.h \
libs/oboe/src/opensles/OutputMixerOpenSLES.h
INCLUDEPATH_OBOE = libs/oboe/include/ \
libs/oboe/src/
DISTFILES_OBOE += libs/oboe/AUTHORS \
libs/oboe/CONTRIBUTING \
libs/oboe/LICENSE \
libs/oboe/README
INCLUDEPATH += $$INCLUDEPATH_OBOE
HEADERS += $$OBOE_HEADERS
SOURCES += $$OBOE_SOURCES
DISTFILES += $$DISTFILES_OBOE
} else:unix {
# we want to compile with C++11
QMAKE_CXXFLAGS += -std=c++11
CONFIG += c++11
# we assume to have lrintf() one moderately modern linux distributions
# would be better to have that tested, though
@ -209,7 +338,8 @@ HEADERS += src/audiomixerboard.h \
src/recorder/jamrecorder.h \
src/recorder/creaperproject.h \
src/recorder/cwavestream.h \
src/historygraph.h
src/historygraph.h \
src/signalhandler.h
HEADERS_OPUS = libs/opus/celt/arch.h \
libs/opus/celt/bands.h \
@ -323,6 +453,7 @@ SOURCES += src/audiomixerboard.cpp \
src/serverlist.cpp \
src/serverlogging.cpp \
src/settings.cpp \
src/signalhandler.cpp \
src/socket.cpp \
src/soundbase.cpp \
src/util.cpp \
@ -491,6 +622,12 @@ DISTFILES += ChangeLog \
COPYING \
INSTALL.md \
README.md \
android/build.gradle \
android/gradle/wrapper/gradle-wrapper.jar \
android/gradle/wrapper/gradle-wrapper.properties \
android/gradlew \
android/gradlew.bat \
android/res/values/libs.xml \
src/res/CLEDBlack.png \
src/res/CLEDBlackSmall.png \
src/res/CLEDDisabledSmall.png \
@ -578,6 +715,10 @@ DISTFILES += ChangeLog \
src/res/instruments/harp.svg \
src/res/instruments/harp.png \
src/res/instruments/viola.png \
src/res/instruments/congas.svg \
src/res/instruments/congas.png \
src/res/instruments/bongo.svg \
src/res/instruments/bongo.png \
src/res/flags/flagnone.png \
src/res/flags/ad.png \
src/res/flags/ae.png \

View File

@ -1,41 +1,94 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest android:versionName="1.0" android:installLocation="auto" package="org.qtproject.jamulus" android:versionCode="1" xmlns:android="http://schemas.android.com/apk/res/android">
<application android:label="Jamulus" android:name="org.qtproject.qt5.android.bindings.QtApplication">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:label="@string/app_name" android:screenOrientation="landscape" android:name="org.qtproject.qt5.android.bindings.QtActivity">
<?xml version="1.0"?>
<manifest package="org.qtproject.jamulus" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
Remove the comment if you do not require these default permissions. -->
<!-- %%INSERT_PERMISSIONS -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
Remove the comment if you do not require these default features. -->
<!-- %%INSERT_FEATURES -->
<uses-feature android:name="android.hardware.microphone" android:required="true"/>
<uses-feature android:name="android.hardware.audio.output" android:required="true"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Jamulus" android:extractNativeLibs="true">
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data android:value="Jamulus" android:name="android.app.lib_name"/>
<meta-data android:resource="@array/qt_sources" android:name="android.app.qt_sources_resource_id"/>
<meta-data android:value="default" android:name="android.app.repository"/>
<meta-data android:resource="@array/qt_libs" android:name="android.app.qt_libs_resource_id"/>
<meta-data android:resource="@array/bundled_libs" android:name="android.app.bundled_libs_resource_id"/>
<!-- Application arguments -->
<!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
<!-- Application arguments -->
<meta-data android:name="android.app.lib_name" android:value="Jamulus"/>
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
<meta-data android:name="android.app.repository" android:value="default"/>
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --" android:name="android.app.bundle_local_qt_libs"/>
<meta-data android:resource="@array/bundled_in_lib" android:name="android.app.bundled_in_lib_resource_id"/>
<meta-data android:resource="@array/bundled_in_assets" android:name="android.app.bundled_in_assets_resource_id"/>
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
<!-- Run with local libs -->
<meta-data android:value="-- %%USE_LOCAL_QT_LIBS%% --" android:name="android.app.use_local_qt_libs"/>
<meta-data android:value="/data/local/tmp/qt/" android:name="android.app.libs_prefix"/>
<meta-data android:value="-- %%INSERT_LOCAL_LIBS%% --" android:name="android.app.load_local_libs"/>
<meta-data android:value="-- %%INSERT_LOCAL_JARS%% --" android:name="android.app.load_local_jars"/>
<meta-data android:value="-- %%INSERT_INIT_CLASSES%% --" android:name="android.app.static_init_classes"/>
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
<!-- Used to specify custom system library path to run with local system libs -->
<!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
<!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
<meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/>
<!-- Messages maps -->
<!-- Splash screen -->
<meta-data android:resource="@layout/splash" android:name="android.app.splash_screen"/>
<!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
are done populating your window with content. -->
<!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
<!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
<!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
<!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
<!-- Splash screen -->
</activity>
<!-- Background running -->
<!-- Warning: changing this value to true may cause unexpected crashes if the
application still try to draw after
"applicationStateChanged(Qt::ApplicationSuspended)"
signal is sent! -->
<meta-data android:name="android.app.background_running" android:value="false"/>
<!-- Background running -->
<!-- auto screen scale factor -->
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
<!-- auto screen scale factor -->
<!-- extract android style -->
<!-- available android:values :
* default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
* full - useful QWidget & Quick Controls 1 apps
* minimal - useful for Quick Controls 2 apps, it is much faster than "full"
* none - useful for apps that don't use any of the above Qt modules
-->
<meta-data android:name="android.app.extract_android_style" android:value="default"/>
<!-- extract android style -->
</activity>
<!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
</application>
<uses-sdk android:targetSdkVersion="19" android:minSdkVersion="17"/>
<supports-screens android:normalScreens="true" android:smallScreens="true" android:largeScreens="true" android:anyDensity="true"/>
<!-- %%INSERT_PERMISSIONS -->
<!-- %%INSERT_FEATURES -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

45
android/androiddebug.cpp Normal file
View File

@ -0,0 +1,45 @@
const char*const applicationName="Jamulus";
#ifdef ANDROIDDEBUG // Set in my myapp.pro file for android builds
#include <android/log.h>
#include <QString>
#include <QEvent>
#include <QDebug>
#include <stdio.h>
#include <math.h>
#include <string>
void myMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
QString report=msg;
if (context.file && !QString(context.file).isEmpty()) {
report+=" in file ";
report+=QString(context.file);
report+=" line ";
report+=QString::number(context.line);
}
if (context.function && !QString(context.function).isEmpty()) {
report+=+" function ";
report+=QString(context.function);
}
const char*const local=report.toLocal8Bit().constData();
switch (type) {
case QtDebugMsg:
__android_log_write(ANDROID_LOG_DEBUG,applicationName,local);
break;
case QtInfoMsg:
__android_log_write(ANDROID_LOG_INFO,applicationName,local);
break;
case QtWarningMsg:
__android_log_write(ANDROID_LOG_WARN,applicationName,local);
break;
case QtCriticalMsg:
__android_log_write(ANDROID_LOG_ERROR,applicationName,local);
break;
case QtFatalMsg:
default:
__android_log_write(ANDROID_LOG_FATAL,applicationName,local);
abort();
}
}
#endif

View File

@ -2,7 +2,7 @@
* Copyright (c) 2004-2020
*
* Author(s):
* Volker Fischer
* Simon Tomlinson
*
******************************************************************************
*
@ -23,256 +23,157 @@
\******************************************************************************/
#include "sound.h"
#include "androiddebug.cpp"
/* Implementation *************************************************************/
CSound::CSound ( void (*fpNewProcessCallback) ( CVector<short>& psData, void* arg ),
void* arg,
const int iCtrlMIDIChannel,
const bool ,
const QString& ) :
CSoundBase ( "OpenSL", true, fpNewProcessCallback, arg, iCtrlMIDIChannel )
{
pSound = this;
#ifdef ANDROIDDEBUG
qInstallMessageHandler(myMessageHandler);
#endif
}
void CSound::setupCommonStreamParams(oboe::AudioStreamBuilder *builder)
{
// We request EXCLUSIVE mode since this will give us the lowest possible
// latency. If EXCLUSIVE mode isn't available the builder will fall back to SHARED mode
builder->setCallback(this)
->setFormat(oboe::AudioFormat::Float)
->setSharingMode(oboe::SharingMode::Shared)
->setChannelCount(oboe::ChannelCount::Mono)
// ->setSampleRate(48000)
// ->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)
->setPerformanceMode(oboe::PerformanceMode::None);
return;
}
void CSound::openStreams()
{
// Create callback
mCallback = this;
//Setup output stream
oboe::AudioStreamBuilder inBuilder, outBuilder;
outBuilder.setDirection(oboe::Direction::Output);
setupCommonStreamParams(&outBuilder);
oboe::Result result = outBuilder.openManagedStream(mPlayStream);
if (result != oboe::Result::OK) {
return;
}
mPlayStream->setBufferSizeInFrames(pSound->iOpenSLBufferSizeStereo);
warnIfNotLowLatency(mPlayStream, "PlayStream");
printStreamDetails(mPlayStream);
//Setup input stream
inBuilder.setDirection(oboe::Direction::Input);
setupCommonStreamParams(&inBuilder);
result = inBuilder.openManagedStream(mRecordingStream);
if (result != oboe::Result::OK) {
closeStream(mPlayStream);
return;
}
mRecordingStream->setBufferSizeInFrames(pSound->iOpenSLBufferSizeStereo);
warnIfNotLowLatency(mRecordingStream, "RecordStream");
printStreamDetails(mRecordingStream);
}
void CSound::printStreamDetails(oboe::ManagedStream &stream)
{
QString sDirection = (stream->getDirection()==oboe::Direction::Input?"Input":"Output");
QString sFramesPerBurst = QString::number(stream->getFramesPerBurst());
QString sBufferSizeInFrames = QString::number(stream->getBufferSizeInFrames());
QString sBytesPerFrame = QString::number(stream->getBytesPerFrame());
QString sBytesPerSample = QString::number(stream->getBytesPerSample());
QString sBufferCapacityInFrames = QString::number(stream->getBufferCapacityInFrames());
QString sPerformanceMode = (stream->getPerformanceMode()==oboe::PerformanceMode::LowLatency?"LowLatency":"NotLowLatency");
QString sSharingMode = (stream->getSharingMode() == oboe::SharingMode::Exclusive?"Exclusive":"Shared");
QString sDeviceID = QString::number(stream->getDeviceId());
QString sSampleRate = QString::number(stream->getSampleRate());
QString sAudioFormat = (stream->getFormat()==oboe::AudioFormat::I16?"I16":"Float");
QString sFramesPerCallback = QString::number(stream->getFramesPerCallback());
//QString sSampleRateConversionQuality = (stream.getSampleRateConversionQuality()==oboe::SampleRateConversionQuality::
qInfo() << "Stream details: [sDirection: " << sDirection <<
", FramesPerBurst: " << sFramesPerBurst <<
", BufferSizeInFrames: " << sBufferSizeInFrames <<
", BytesPerFrame: " << sBytesPerFrame <<
", BytesPerSample: " << sBytesPerSample <<
", BufferCapacityInFrames: " << sBufferCapacityInFrames <<
", PerformanceMode: " << sPerformanceMode <<
", SharingMode: " << sSharingMode <<
", DeviceID: " << sDeviceID <<
", SampleRate: " << sSampleRate <<
", AudioFormat: " << sAudioFormat <<
", FramesPerCallback: " << sFramesPerCallback << "]";
}
void CSound::InitializeOpenSL()
{
// set up stream formats for input and output
SLDataFormat_PCM inStreamFormat;
inStreamFormat.formatType = SL_DATAFORMAT_PCM;
inStreamFormat.numChannels = 1;
inStreamFormat.samplesPerSec = SL_SAMPLINGRATE_16;
inStreamFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
inStreamFormat.containerSize = 16;
inStreamFormat.channelMask = SL_SPEAKER_FRONT_CENTER;
inStreamFormat.endianness = SL_BYTEORDER_LITTLEENDIAN;
SLDataFormat_PCM outStreamFormat;
outStreamFormat.formatType = SL_DATAFORMAT_PCM;
outStreamFormat.numChannels = 2;
outStreamFormat.samplesPerSec = SYSTEM_SAMPLE_RATE_HZ * 1000; // unit is mHz
outStreamFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
outStreamFormat.containerSize = 16;
outStreamFormat.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
outStreamFormat.endianness = SL_BYTEORDER_LITTLEENDIAN;
// create the OpenSL root engine object
slCreateEngine ( &engineObject,
0,
nullptr,
0,
nullptr,
nullptr );
// realize the engine
(*engineObject)->Realize ( engineObject,
SL_BOOLEAN_FALSE );
// get the engine interface (required to create other objects)
(*engineObject)->GetInterface ( engineObject,
SL_IID_ENGINE,
&engine );
// create the main output mix
(*engine)->CreateOutputMix ( engine,
&outputMixObject,
0,
nullptr,
nullptr );
// realize the output mix
(*outputMixObject)->Realize ( outputMixObject,
SL_BOOLEAN_FALSE );
// configure the audio (data) source for input
SLDataLocator_IODevice micLocator;
micLocator.locatorType = SL_DATALOCATOR_IODEVICE;
micLocator.deviceType = SL_IODEVICE_AUDIOINPUT;
micLocator.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
micLocator.device = nullptr;
SLDataSource inDataSource;
inDataSource.pLocator = &micLocator;
inDataSource.pFormat = nullptr;
// configure the input buffer queue
SLDataLocator_AndroidSimpleBufferQueue inBufferQueue;
inBufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
inBufferQueue.numBuffers = 2; // max number of buffers in queue
// configure the audio (data) sink for input
SLDataSink inDataSink;
inDataSink.pLocator = &inBufferQueue;
inDataSink.pFormat = &inStreamFormat;
// create the audio recorder
const SLInterfaceID recorderIds[] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
const SLboolean recorderReq[] = { SL_BOOLEAN_TRUE };
(*engine)->CreateAudioRecorder ( engine,
&recorderObject,
&inDataSource,
&inDataSink,
1,
recorderIds,
recorderReq );
// realize the audio recorder
(*recorderObject)->Realize ( recorderObject,
SL_BOOLEAN_FALSE );
// get the audio recorder interface
(*recorderObject)->GetInterface ( recorderObject,
SL_IID_RECORD,
&recorder );
// get the audio recorder simple buffer queue interface
(*recorderObject)->GetInterface ( recorderObject,
SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
&recorderSimpleBufQueue );
// register the audio input callback
(*recorderSimpleBufQueue)->RegisterCallback ( recorderSimpleBufQueue,
processInput,
this );
// configure the output buffer queue
SLDataLocator_AndroidSimpleBufferQueue outBufferQueue;
outBufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
outBufferQueue.numBuffers = 2; // max number of buffers in queue
// configure the audio (data) source for output
SLDataSource outDataSource;
outDataSource.pLocator = &outBufferQueue;
outDataSource.pFormat = &outStreamFormat;
// configure the output mix
SLDataLocator_OutputMix outputMix;
outputMix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
outputMix.outputMix = outputMixObject;
// configure the audio (data) sink for output
SLDataSink outDataSink;
outDataSink.pLocator = &outputMix;
outDataSink.pFormat = nullptr;
// create the audio player
const SLInterfaceID playerIds[] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE };
const SLboolean playerReq[] = { SL_BOOLEAN_TRUE };
(*engine)->CreateAudioPlayer ( engine,
&playerObject,
&outDataSource,
&outDataSink,
1,
playerIds,
playerReq );
// realize the audio player
(*playerObject)->Realize ( playerObject,
SL_BOOLEAN_FALSE );
// get the audio player interface
(*playerObject)->GetInterface ( playerObject,
SL_IID_PLAY,
&player );
// get the audio player simple buffer queue interface
(*playerObject)->GetInterface ( playerObject,
SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
&playerSimpleBufQueue );
// register the audio output callback
(*playerSimpleBufQueue)->RegisterCallback ( playerSimpleBufQueue,
processOutput,
this );
void CSound::warnIfNotLowLatency(oboe::ManagedStream &stream, QString streamName) {
if (stream->getPerformanceMode() != oboe::PerformanceMode::LowLatency) {
QString latencyMode = (stream->getPerformanceMode()==oboe::PerformanceMode::None ? "None" : "Power Saving");
// throw CGenErr ( tr ( "Stream is NOT low latency."
// "Check your requested format, sample rate and channel count." ) );
}
}
void CSound::CloseOpenSL()
void CSound::closeStream(oboe::ManagedStream &stream)
{
if (stream) {
oboe::Result requestStopRes = stream->requestStop();
oboe::Result result = stream->close();
if (result != oboe::Result::OK) {
throw CGenErr ( tr ( "Error closing stream: $s",
oboe::convertToText(result) ) );
}
stream.reset();
}
}
void CSound::closeStreams()
{
// clean up
(*recorderObject)->Destroy ( recorderObject );
(*playerObject)->Destroy ( playerObject );
(*outputMixObject)->Destroy ( outputMixObject );
(*engineObject)->Destroy ( engineObject );
closeStream(mRecordingStream);
closeStream(mPlayStream);
}
void CSound::Start()
{
InitializeOpenSL();
// TEST We have to supply the interface with initial buffers, otherwise
// the rendering will not start.
// Note that the number of buffers enqueued here must match the maximum
// numbers of buffers configured in the constructor of this class.
vecsTmpAudioSndCrdStereo.Reset ( 0 );
// enqueue initial buffers for record
(*recorderSimpleBufQueue)->Enqueue ( recorderSimpleBufQueue,
&vecsTmpAudioSndCrdStereo[0],
iOpenSLBufferSizeStereo * 2 /* 2 bytes */ );
(*recorderSimpleBufQueue)->Enqueue ( recorderSimpleBufQueue,
&vecsTmpAudioSndCrdStereo[0],
iOpenSLBufferSizeStereo * 2 /* 2 bytes */ );
// enqueue initial buffers for playback
(*playerSimpleBufQueue)->Enqueue ( playerSimpleBufQueue,
&vecsTmpAudioSndCrdStereo[0],
iOpenSLBufferSizeStereo * 2 /* 2 bytes */ );
(*playerSimpleBufQueue)->Enqueue ( playerSimpleBufQueue,
&vecsTmpAudioSndCrdStereo[0],
iOpenSLBufferSizeStereo * 2 /* 2 bytes */ );
// start the rendering
(*recorder)->SetRecordState ( recorder, SL_RECORDSTATE_RECORDING );
(*player)->SetPlayState ( player, SL_PLAYSTATE_PLAYING );
openStreams();
// call base class
CSoundBase::Start();
// finally start the streams so the callback begins, start with inputstream first.
mRecordingStream->requestStart();
mPlayStream->requestStart();
}
void CSound::Stop()
{
// stop the audio stream
(*recorder)->SetRecordState ( recorder, SL_RECORDSTATE_STOPPED );
(*player)->SetPlayState ( player, SL_PLAYSTATE_STOPPED );
// clear the buffers
(*recorderSimpleBufQueue)->Clear ( recorderSimpleBufQueue );
(*playerSimpleBufQueue)->Clear ( playerSimpleBufQueue );
closeStreams();
// call base class
CSoundBase::Stop();
CloseOpenSL();
}
int CSound::Init ( const int iNewPrefMonoBufferSize )
{
// TODO make use of the following:
// String sampleRate = am.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE));
// String framesPerBuffer = am.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER));
/*
// get the Audio IO DEVICE CAPABILITIES interface
SLAudioIODeviceCapabilitiesItf audioCapabilities;
(*engineObject)->GetInterface ( engineObject,
SL_IID_AUDIOIODEVICECAPABILITIES,
&audioCapabilities );
(*audioCapabilities)->QueryAudioInputCapabilities ( audioCapabilities,
inputDeviceIDs[i],
&audioInputDescriptor );
*/
// store buffer size
iOpenSLBufferSizeMono = iNewPrefMonoBufferSize;
iOpenSLBufferSizeMono = 512 ;
//iNewPrefMonoBufferSize;
// init base class
CSoundBase::Init ( iOpenSLBufferSizeMono );
@ -283,7 +184,6 @@ SLAudioIODeviceCapabilitiesItf audioCapabilities;
// create memory for intermediate audio buffer
vecsTmpAudioSndCrdStereo.Init ( iOpenSLBufferSizeStereo );
// TEST
#if ( SYSTEM_SAMPLE_RATE_HZ != 48000 )
# error "Only a system sample rate of 48 kHz is supported by this module"
@ -296,57 +196,105 @@ SLAudioIODeviceCapabilitiesItf audioCapabilities;
iModifiedInBufSize = iOpenSLBufferSizeMono / 3;
vecsTmpAudioInSndCrd.Init ( iModifiedInBufSize );
return iOpenSLBufferSizeMono;
}
void CSound::processInput ( SLAndroidSimpleBufferQueueItf bufferQueue,
void* instance )
// This is the main callback method for when an audio stream is ready to publish data to an output stream
// or has received data on an input stream. As per manual much be very careful not to do anything in this back that
// can cause delays such as sleeping, file processing, allocate memory, etc
oboe::DataCallbackResult CSound::onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames)
{
CSound* pSound = static_cast<CSound*> ( instance );
// only process if we are running
if ( ! pSound->bRun )
{
return oboe::DataCallbackResult::Continue;
}
// only process if we are running
if ( !pSound->bRun )
// Need to modify the size of the buffer based on the numFrames requested in this callback.
// Buffer size can change regularly by android devices
int& iBufferSizeMono = pSound->iOpenSLBufferSizeMono;
// perform the processing for input and output
// QMutexLocker locker ( &pSound->Mutex );
// locker.mutex();
//This can be called from both input and output at different times
if (oboeStream == pSound->mPlayStream.get() && audioData)
{
return;
float *floatData = static_cast<float *>(audioData);
// Zero out the incoming container array
memset(audioData, 0, sizeof(float) * numFrames * oboeStream->getChannelCount());
// Only copy data if we have data to copy, otherwise fill with silence
if (!pSound->vecsTmpAudioSndCrdStereo.empty())
{
for (int frmNum = 0; frmNum < numFrames; ++frmNum)
{
for (int channelNum = 0; channelNum < oboeStream->getChannelCount(); channelNum++)
{
// copy sample received from server into output buffer
// convert to 32 bit
const int32_t iCurSam = static_cast<int32_t> (
pSound->vecsTmpAudioSndCrdStereo [frmNum * oboeStream->getChannelCount() + channelNum] );
floatData[frmNum * oboeStream->getChannelCount() + channelNum] = (float) iCurSam/ _MAXSHORT;
}
}
}
else
{
// prime output stream buffer with silence
memset(static_cast<float*>(audioData) + numFrames * oboeStream->getChannelCount(), 0,
(numFrames) * oboeStream->getBytesPerFrame());
}
}
QMutexLocker locker ( &pSound->Mutex );
// enqueue the buffer for record
(*bufferQueue)->Enqueue ( bufferQueue,
&pSound->vecsTmpAudioInSndCrd[0],
pSound->iModifiedInBufSize * 2 /* 2 bytes */ );
// upsampling (without filtering) and channel management
pSound->vecsTmpAudioSndCrdStereo.Reset ( 0 );
for ( int i = 0; i < pSound->iModifiedInBufSize; i++ )
{
pSound->vecsTmpAudioSndCrdStereo[6 * i] =
pSound->vecsTmpAudioSndCrdStereo[6 * i + 1] =
pSound->vecsTmpAudioInSndCrd[i];
}
}
void CSound::processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
void* instance )
{
CSound* pSound = static_cast<CSound*> ( instance );
// only process if we are running
if ( !pSound->bRun )
else if (oboeStream == pSound->mRecordingStream.get() && audioData)
{
return;
// First things first, we need to discard the input queue a little for 500ms or so
if (pSound->mCountCallbacksToDrain > 0)
{
// discard the input buffer
int32_t numBytes = numFrames * oboeStream->getBytesPerFrame();
memset(audioData, 0 /* value */, numBytes);
pSound->mCountCallbacksToDrain--;
}
// We're good to start recording now
// Take the data from the recording device ouput buffer and move
// it to the vector ready to send up to the server
float *floatData = static_cast<float *>(audioData);
// Copy recording data to internal vector
for (int frmNum = 0; frmNum < numFrames; ++frmNum)
{
for (int channelNum = 0; channelNum < oboeStream->getChannelCount(); channelNum++)
{
pSound->vecsTmpAudioSndCrdStereo [frmNum * oboeStream->getChannelCount() + channelNum] =
(short) floatData[frmNum * oboeStream->getChannelCount() + channelNum] * _MAXSHORT;
}
}
// Tell parent class that we've put some data ready to send to the server
pSound->ProcessCallback ( pSound->vecsTmpAudioSndCrdStereo );
}
QMutexLocker locker ( &pSound->Mutex );
// call processing callback function
pSound->ProcessCallback ( pSound->vecsTmpAudioSndCrdStereo );
// enqueue the buffer for playback
(*bufferQueue)->Enqueue ( bufferQueue,
&pSound->vecsTmpAudioSndCrdStereo[0],
pSound->iOpenSLBufferSizeStereo * 2 /* 2 bytes */ );
// locker.unlock();
return oboe::DataCallbackResult::Continue;
}
//TODO better handling of stream closing errors
void CSound::onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result result)
{
qDebug() << "CSound::onErrorAfterClose";
}
//TODO better handling of stream closing errors
void CSound::onErrorBeforeClose(oboe::AudioStream *oboeStream, oboe::Result result)
{
qDebug() << "CSound::onErrorBeforeClose";
}

View File

@ -2,7 +2,7 @@
* Copyright (c) 2004-2020
*
* Author(s):
* Volker Fischer
* Simon Tomlinson
*
******************************************************************************
*
@ -24,15 +24,18 @@
#pragma once
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>
/* Deprecated, moving to OBOE
* #include <SLES/OpenSLES.h>
* #include <SLES/OpenSLES_Android.h> */
#include <oboe/Oboe.h>
#include <QMutex>
#include "soundbase.h"
#include "global.h"
#include <QDebug>
#include <android/log.h>
/* Classes ********************************************************************/
class CSound : public CSoundBase
class CSound : public CSoundBase, public oboe::AudioStreamCallback//, public IRenderableAudio, public IRestartable
{
public:
CSound ( void (*fpNewProcessCallback) ( CVector<short>& psData, void* arg ),
@ -46,10 +49,30 @@ public:
virtual void Start();
virtual void Stop();
// Call backs for Oboe
virtual oboe::DataCallbackResult onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames);
virtual void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result result);
virtual void onErrorBeforeClose(oboe::AudioStream *oboeStream, oboe::Result result);
// these variables should be protected but cannot since we want
// to access them from the callback function
CVector<short> vecsTmpAudioSndCrdStereo;
static void android_message_handler(QtMsgType type,
const QMessageLogContext &context,
const QString &message)
{
android_LogPriority priority = ANDROID_LOG_DEBUG;
switch (type) {
case QtDebugMsg: priority = ANDROID_LOG_DEBUG; break;
case QtWarningMsg: priority = ANDROID_LOG_WARN; break;
case QtCriticalMsg: priority = ANDROID_LOG_ERROR; break;
case QtFatalMsg: priority = ANDROID_LOG_FATAL; break;
};
__android_log_print(priority, "Qt", "%s", qPrintable(message));
};
// TEST
CVector<short> vecsTmpAudioInSndCrd;
int iModifiedInBufSize;
@ -57,27 +80,25 @@ int iModifiedInBufSize;
int iOpenSLBufferSizeMono;
int iOpenSLBufferSizeStereo;
protected:
private:
void setupCommonStreamParams(oboe::AudioStreamBuilder *builder);
void printStreamDetails(oboe::ManagedStream &stream);
void openStreams();
void closeStreams();
void warnIfNotLowLatency(oboe::ManagedStream &stream, QString streamName);
void closeStream(oboe::ManagedStream &stream);
void InitializeOpenSL();
void CloseOpenSL();
oboe::ManagedStream mRecordingStream;
oboe::ManagedStream mPlayStream;
AudioStreamCallback *mCallback;
// callbacks
static void processInput ( SLAndroidSimpleBufferQueueItf bufferQueue,
void* instance );
// used to reach a state where the input buffer is
// empty and the garbage in the first 500ms or so is discarded
static constexpr int32_t kNumCallbacksToDrain = 10;
int32_t mCountCallbacksToDrain = kNumCallbacksToDrain;
static void processOutput ( SLAndroidSimpleBufferQueueItf bufferQueue,
void* instance );
SLObjectItf engineObject;
SLEngineItf engine;
SLObjectItf recorderObject;
SLRecordItf recorder;
SLAndroidSimpleBufferQueueItf recorderSimpleBufQueue;
SLObjectItf outputMixObject;
SLObjectItf playerObject;
SLPlayItf player;
SLAndroidSimpleBufferQueueItf playerSimpleBufQueue;
// Used to reference this instance of class from within the static callback
CSound *pSound;
QMutex Mutex;

View File

@ -11,6 +11,7 @@ Build-Depends:
make,
qt5-default,
qtdeclarative5-dev,
qttools5-dev-tools,
Standards-Version: 3.9.5
Homepage: http://llcon.sourceforge.net/
Vcs-Git: git://github.com/corrados/jamulus.git

View File

@ -5,6 +5,10 @@
override_dh_auto_configure:
qmake CONFIG+=noupcasename Jamulus.pro
override_dh_auto_build:
cd src/res/translation && lrelease *.ts
dh_auto_build
override_dh_usrlocal:
echo $$(pwd)
mkdir -p $$(pwd)/debian/jamulus/usr/bin/

1
libs/oboe Submodule

@ -0,0 +1 @@
Subproject commit 55d878a4e85e1994f2b5883366079b991500a25f

View File

@ -184,16 +184,20 @@ void CSound::Stop()
int CSound::Init ( const int /* iNewPrefMonoBufferSize */ )
{
// try setting buffer size
// TODO seems not to work! -> no audio after this operation!
// Doesn't this give an infinite loop? The set buffer size function will call our
// registerd callback which calls "EmitReinitRequestSignal()". In that function
// this CSound::Init() function is called...
//jack_set_buffer_size ( pJackClient, iNewPrefMonoBufferSize );
// without a Jack server, Jamulus makes no sense to run, throw an error message
if ( bJackWasShutDown )
{
throw CGenErr ( tr ( "The Jack server was shut down. This software "
"requires a Jack server to run. Try to restart the software to "
"solve the issue." ) );
}
// get actual buffer size
iJACKBufferSizeMono = jack_get_buffer_size ( pJackClient );
@ -321,7 +325,7 @@ int CSound::process ( jack_nframes_t nframes, void* arg )
return 0; // zero on success, non-zero on error
}
int CSound::bufferSizeCallback ( jack_nframes_t, void *arg )
int CSound::bufferSizeCallback ( jack_nframes_t, void* arg )
{
CSound* pSound = static_cast<CSound*> ( arg );
@ -330,12 +334,11 @@ int CSound::bufferSizeCallback ( jack_nframes_t, void *arg )
return 0; // zero on success, non-zero on error
}
void CSound::shutdownCallback ( void* )
void CSound::shutdownCallback ( void* arg )
{
// without a Jack server, our software makes no sense to run, throw
// error message
throw CGenErr ( tr ( "The Jack server was shut down. This software "
"requires a Jack server to run. Try to restart the software to "
"solve the issue." ) );
CSound* pSound = static_cast<CSound*> ( arg );
pSound->bJackWasShutDown = true;
pSound->EmitReinitRequestSignal ( RS_ONLY_RESTART_AND_INIT );
}
#endif // WITH_SOUND

View File

@ -66,7 +66,7 @@ public:
const bool bNoAutoJackConnect,
const QString& strJackClientName ) :
CSoundBase ( "Jack", true, fpNewProcessCallback, arg, iCtrlMIDIChannel ),
iJACKBufferSizeMono ( 0 ) { OpenJack ( bNoAutoJackConnect, strJackClientName.toLocal8Bit().data() ); }
iJACKBufferSizeMono ( 0 ), bJackWasShutDown ( false ) { OpenJack ( bNoAutoJackConnect, strJackClientName.toLocal8Bit().data() ); }
virtual ~CSound() { CloseJack(); }
@ -79,6 +79,7 @@ public:
CVector<short> vecsTmpAudioSndCrdStereo;
int iJACKBufferSizeMono;
int iJACKBufferSizeStero;
bool bJackWasShutDown;
jack_port_t* input_port_left;
jack_port_t* input_port_right;

View File

@ -29,135 +29,135 @@
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="pxlLogo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resources.qrc">:/png/main/res/fronticon.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
<widget class="QLabel" name="lblVersion">
<property name="text">
<string>TextLabelVersion</string>
</property>
<property name="leftMargin">
<number>0</number>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="topMargin">
<number>0</number>
<property name="margin">
<number>2</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="PixmapLabelDreamLogo">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="pixmap">
<pixmap/>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblVersion">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>TextLabelVersion</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
<widget class="QLabel" name="lblCopyright">
<property name="text">
<string>Copyright (C) 2005-2020 Volker Fischer and others</string>
</property>
<property name="leftMargin">
<number>0</number>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="topMargin">
<number>0</number>
<property name="margin">
<number>2</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lblCopyright">
<property name="text">
<string>Copyright (C) 2005-2020 Volker Fischer and others</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QTextBrowser" name="txvCredits"/>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>A&amp;bout</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTextBrowser" name="txvAbout">
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>&amp;Libraries</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTextBrowser" name="txvLibraries">
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>&amp;Contributors</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QTextBrowser" name="txvContributors">
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>&amp;Translation</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QTextBrowser" name="txvTranslation">
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout">
@ -211,7 +211,6 @@
</widget>
<tabstops>
<tabstop>buttonOk</tabstop>
<tabstop>txvCredits</tabstop>
</tabstops>
<resources>
<include location="resources.qrc"/>

View File

@ -261,13 +261,11 @@ void CChannelFader::Reset()
strReceivedName = "";
SetupFaderTag ( SL_NOT_SET );
// set a defined tool tip time out (only available in Qt5)
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
// set a defined tool tip time out
const int iToolTipDurMs = 30000;
plblLabel->setToolTipDuration ( iToolTipDurMs );
plblInstrument->setToolTipDuration ( iToolTipDurMs );
plblCountryFlag->setToolTipDuration ( iToolTipDurMs );
#endif
bOtherChannelIsSolo = false;
}
@ -562,118 +560,9 @@ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags ) :
// Connections -------------------------------------------------------------
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
connectFaderSignalsToMixerBoardSlots<MAX_NUM_CHANNELS>();
#else
// CODE TAG: MAX_NUM_CHANNELS_TAG
// make sure we have MAX_NUM_CHANNELS connections!!!
QObject::connect ( vecpChanFader[0], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh0 ( double ) ) );
QObject::connect ( vecpChanFader[1], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh1 ( double ) ) );
QObject::connect ( vecpChanFader[2], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh2 ( double ) ) );
QObject::connect ( vecpChanFader[3], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh3 ( double ) ) );
QObject::connect ( vecpChanFader[4], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh4 ( double ) ) );
QObject::connect ( vecpChanFader[5], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh5 ( double ) ) );
QObject::connect ( vecpChanFader[6], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh6 ( double ) ) );
QObject::connect ( vecpChanFader[7], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh7 ( double ) ) );
QObject::connect ( vecpChanFader[8], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh8 ( double ) ) );
QObject::connect ( vecpChanFader[9], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh9 ( double ) ) );
QObject::connect ( vecpChanFader[10], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh10 ( double ) ) );
QObject::connect ( vecpChanFader[11], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh11 ( double ) ) );
QObject::connect ( vecpChanFader[12], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh12 ( double ) ) );
QObject::connect ( vecpChanFader[13], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh13 ( double ) ) );
QObject::connect ( vecpChanFader[14], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh14 ( double ) ) );
QObject::connect ( vecpChanFader[15], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh15 ( double ) ) );
QObject::connect ( vecpChanFader[16], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh16 ( double ) ) );
QObject::connect ( vecpChanFader[17], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh17 ( double ) ) );
QObject::connect ( vecpChanFader[18], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh18 ( double ) ) );
QObject::connect ( vecpChanFader[19], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh19 ( double ) ) );
QObject::connect ( vecpChanFader[20], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh20 ( double ) ) );
QObject::connect ( vecpChanFader[21], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh21 ( double ) ) );
QObject::connect ( vecpChanFader[22], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh22 ( double ) ) );
QObject::connect ( vecpChanFader[23], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh23 ( double ) ) );
QObject::connect ( vecpChanFader[24], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh24 ( double ) ) );
QObject::connect ( vecpChanFader[25], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh25 ( double ) ) );
QObject::connect ( vecpChanFader[26], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh26 ( double ) ) );
QObject::connect ( vecpChanFader[27], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh27 ( double ) ) );
QObject::connect ( vecpChanFader[28], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh28 ( double ) ) );
QObject::connect ( vecpChanFader[29], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh29 ( double ) ) );
QObject::connect ( vecpChanFader[30], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh30 ( double ) ) );
QObject::connect ( vecpChanFader[31], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh31 ( double ) ) );
QObject::connect ( vecpChanFader[32], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh32 ( double ) ) );
QObject::connect ( vecpChanFader[33], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh33 ( double ) ) );
QObject::connect ( vecpChanFader[34], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh34 ( double ) ) );
QObject::connect ( vecpChanFader[35], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh35 ( double ) ) );
QObject::connect ( vecpChanFader[36], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh36 ( double ) ) );
QObject::connect ( vecpChanFader[37], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh37 ( double ) ) );
QObject::connect ( vecpChanFader[38], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh38 ( double ) ) );
QObject::connect ( vecpChanFader[39], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh39 ( double ) ) );
QObject::connect ( vecpChanFader[40], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh40 ( double ) ) );
QObject::connect ( vecpChanFader[41], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh41 ( double ) ) );
QObject::connect ( vecpChanFader[42], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh42 ( double ) ) );
QObject::connect ( vecpChanFader[43], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh43 ( double ) ) );
QObject::connect ( vecpChanFader[44], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh44 ( double ) ) );
QObject::connect ( vecpChanFader[45], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh45 ( double ) ) );
QObject::connect ( vecpChanFader[46], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh46 ( double ) ) );
QObject::connect ( vecpChanFader[47], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh47 ( double ) ) );
QObject::connect ( vecpChanFader[48], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh48 ( double ) ) );
QObject::connect ( vecpChanFader[49], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh49 ( double ) ) );
QObject::connect ( vecpChanFader[0], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[1], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[2], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[3], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[4], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[5], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[6], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[7], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[8], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[9], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[10], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[11], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[12], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[13], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[14], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[15], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[16], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[17], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[18], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[19], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[20], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[21], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[22], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[23], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[24], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[25], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[26], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[27], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[28], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[29], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[30], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[31], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[32], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[33], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[34], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[35], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[36], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[37], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[38], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[39], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[40], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[41], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[42], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[43], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[44], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[45], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[46], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[47], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[48], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[49], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
#endif
}
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
template<unsigned int slotId>
inline void CAudioMixerBoard::connectFaderSignalsToMixerBoardSlots()
{
@ -694,8 +583,6 @@ inline void CAudioMixerBoard::connectFaderSignalsToMixerBoardSlots()
template<>
inline void CAudioMixerBoard::connectFaderSignalsToMixerBoardSlots<0>() {};
#endif
void CAudioMixerBoard::SetServerName ( const QString& strNewServerName )
{
// store the current server name

View File

@ -101,12 +101,9 @@ signals:
void soloStateChanged ( int value );
};
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
template<unsigned int slotId>
class CAudioMixerBoardSlots : public CAudioMixerBoardSlots<slotId - 1>
{
public:
void OnChGainValueChanged ( double dValue ) { UpdateGainValue ( slotId - 1, dValue ); }
@ -118,11 +115,6 @@ protected:
template<>
class CAudioMixerBoardSlots<0> {};
#else
template<unsigned int slotId>
class CAudioMixerBoardSlots {};
#endif
class CAudioMixerBoard :
public QScrollArea,
@ -167,78 +159,12 @@ protected:
bool bNoFaderVisible;
QString strServerName;
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
virtual void UpdateGainValue ( const int iChannelIdx,
const double dValue );
template<unsigned int slotId>
inline void connectFaderSignalsToMixerBoardSlots();
#else
void UpdateGainValue ( const int iChannelIdx,
const double dValue );
#endif
#if QT_VERSION < 0x50000 // MOC does not expand macros in Qt 4, so we cannot use QT_VERSION_CHECK(5, 0, 0)
public slots:
// CODE TAG: MAX_NUM_CHANNELS_TAG
// make sure we have MAX_NUM_CHANNELS connections!!!
void OnGainValueChangedCh0 ( double dValue ) { UpdateGainValue ( 0, dValue ); }
void OnGainValueChangedCh1 ( double dValue ) { UpdateGainValue ( 1, dValue ); }
void OnGainValueChangedCh2 ( double dValue ) { UpdateGainValue ( 2, dValue ); }
void OnGainValueChangedCh3 ( double dValue ) { UpdateGainValue ( 3, dValue ); }
void OnGainValueChangedCh4 ( double dValue ) { UpdateGainValue ( 4, dValue ); }
void OnGainValueChangedCh5 ( double dValue ) { UpdateGainValue ( 5, dValue ); }
void OnGainValueChangedCh6 ( double dValue ) { UpdateGainValue ( 6, dValue ); }
void OnGainValueChangedCh7 ( double dValue ) { UpdateGainValue ( 7, dValue ); }
void OnGainValueChangedCh8 ( double dValue ) { UpdateGainValue ( 8, dValue ); }
void OnGainValueChangedCh9 ( double dValue ) { UpdateGainValue ( 9, dValue ); }
void OnGainValueChangedCh10 ( double dValue ) { UpdateGainValue ( 10, dValue ); }
void OnGainValueChangedCh11 ( double dValue ) { UpdateGainValue ( 11, dValue ); }
void OnGainValueChangedCh12 ( double dValue ) { UpdateGainValue ( 12, dValue ); }
void OnGainValueChangedCh13 ( double dValue ) { UpdateGainValue ( 13, dValue ); }
void OnGainValueChangedCh14 ( double dValue ) { UpdateGainValue ( 14, dValue ); }
void OnGainValueChangedCh15 ( double dValue ) { UpdateGainValue ( 15, dValue ); }
void OnGainValueChangedCh16 ( double dValue ) { UpdateGainValue ( 16, dValue ); }
void OnGainValueChangedCh17 ( double dValue ) { UpdateGainValue ( 17, dValue ); }
void OnGainValueChangedCh18 ( double dValue ) { UpdateGainValue ( 18, dValue ); }
void OnGainValueChangedCh19 ( double dValue ) { UpdateGainValue ( 19, dValue ); }
void OnGainValueChangedCh20 ( double dValue ) { UpdateGainValue ( 20, dValue ); }
void OnGainValueChangedCh21 ( double dValue ) { UpdateGainValue ( 21, dValue ); }
void OnGainValueChangedCh22 ( double dValue ) { UpdateGainValue ( 22, dValue ); }
void OnGainValueChangedCh23 ( double dValue ) { UpdateGainValue ( 23, dValue ); }
void OnGainValueChangedCh24 ( double dValue ) { UpdateGainValue ( 24, dValue ); }
void OnGainValueChangedCh25 ( double dValue ) { UpdateGainValue ( 25, dValue ); }
void OnGainValueChangedCh26 ( double dValue ) { UpdateGainValue ( 26, dValue ); }
void OnGainValueChangedCh27 ( double dValue ) { UpdateGainValue ( 27, dValue ); }
void OnGainValueChangedCh28 ( double dValue ) { UpdateGainValue ( 28, dValue ); }
void OnGainValueChangedCh29 ( double dValue ) { UpdateGainValue ( 29, dValue ); }
void OnGainValueChangedCh30 ( double dValue ) { UpdateGainValue ( 30, dValue ); }
void OnGainValueChangedCh31 ( double dValue ) { UpdateGainValue ( 31, dValue ); }
void OnGainValueChangedCh32 ( double dValue ) { UpdateGainValue ( 32, dValue ); }
void OnGainValueChangedCh33 ( double dValue ) { UpdateGainValue ( 33, dValue ); }
void OnGainValueChangedCh34 ( double dValue ) { UpdateGainValue ( 34, dValue ); }
void OnGainValueChangedCh35 ( double dValue ) { UpdateGainValue ( 35, dValue ); }
void OnGainValueChangedCh36 ( double dValue ) { UpdateGainValue ( 36, dValue ); }
void OnGainValueChangedCh37 ( double dValue ) { UpdateGainValue ( 37, dValue ); }
void OnGainValueChangedCh38 ( double dValue ) { UpdateGainValue ( 38, dValue ); }
void OnGainValueChangedCh39 ( double dValue ) { UpdateGainValue ( 39, dValue ); }
void OnGainValueChangedCh40 ( double dValue ) { UpdateGainValue ( 40, dValue ); }
void OnGainValueChangedCh41 ( double dValue ) { UpdateGainValue ( 41, dValue ); }
void OnGainValueChangedCh42 ( double dValue ) { UpdateGainValue ( 42, dValue ); }
void OnGainValueChangedCh43 ( double dValue ) { UpdateGainValue ( 43, dValue ); }
void OnGainValueChangedCh44 ( double dValue ) { UpdateGainValue ( 44, dValue ); }
void OnGainValueChangedCh45 ( double dValue ) { UpdateGainValue ( 45, dValue ); }
void OnGainValueChangedCh46 ( double dValue ) { UpdateGainValue ( 46, dValue ); }
void OnGainValueChangedCh47 ( double dValue ) { UpdateGainValue ( 47, dValue ); }
void OnGainValueChangedCh48 ( double dValue ) { UpdateGainValue ( 48, dValue ); }
void OnGainValueChangedCh49 ( double dValue ) { UpdateGainValue ( 49, dValue ); }
void OnChSoloStateChanged() { UpdateSoloStates(); }
#endif
signals:
void ChangeChanGain ( int iId, double dGain );
void NumClientsChanged ( int iNewNumClients );

View File

@ -94,11 +94,5 @@ void CChatDlg::AddChatText ( QString strChatText )
txvChatWindow->append ( strChatText );
// notify accessibility plugin that text has changed
QAccessible::updateAccessibility (
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
txvChatWindow, 0, QAccessible::ValueChanged
#else
new QAccessibleValueChangeEvent ( txvChatWindow, strChatText )
#endif
);
QAccessible::updateAccessibility ( new QAccessibleValueChangeEvent ( txvChatWindow, strChatText ) );
}

View File

@ -1206,6 +1206,8 @@ fflush(pFileDelay);
// update socket buffer size
Channel.UpdateSocketBufferSize();
Q_UNUSED ( iUnused )
}
int CClient::EstimatedOverallDelay ( const int iPingTimeMs )

View File

@ -398,7 +398,7 @@ public slots:
void OnJittBufSizeChanged ( int iNewJitBufSize );
void OnReqChanInfo() { Channel.SetRemoteInfo ( ChannelInfo ); }
void OnNewConnection();
void OnCLDisconnection ( CHostAddress InetAddr ) { if ( InetAddr == Channel.GetAddress() ) { Stop(); } }
void OnCLDisconnection ( CHostAddress InetAddr ) { if ( InetAddr == Channel.GetAddress() ) { emit Disconnected(); } }
void OnCLPingReceived ( CHostAddress InetAddr,
int iMs );

View File

@ -117,7 +117,7 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
// reverberation level
QString strAudReverb = "<b>" + tr ( "Reverberation Level" ) + ":</b> " +
tr ( "A reverberation effect can be applied to one local mono audio channel or to both "
"channels in stereo mode. The mone channel selection and the "
"channels in stereo mode. The mono channel selection and the "
"reverberation level can be modified. If, e.g., "
"the microphone signal is fed into the right audio channel of the "
"sound card and a reverberation effect shall be applied, set the "
@ -732,16 +732,6 @@ void CClientDlg::OnConnectDisconBut()
}
}
void CClientDlg::OnDisconnected()
{
// channel is now disconnected, clear mixer board (remove all faders) and
// reset the delay LED (since this is only updated on an active connection)
MainMixerBoard->HideAll();
ledDelay->Reset();
UpdateDisplay();
}
void CClientDlg::OnCentralServerAddressTypeChanged()
{
// if the server list is shown and the server type was changed, update the list

View File

@ -194,7 +194,7 @@ public slots:
{ MainMixerBoard->SetChannelLevels ( vecLevelList ); }
void OnConnectDlgAccepted();
void OnDisconnected();
void OnDisconnected() { Disconnect(); }
void OnCentralServerAddressTypeChanged();
void OnGUIDesignChanged()

View File

@ -155,7 +155,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent,
"If no buffer size is selected and all settings are disabled, an "
"unsupported buffer size is used by the driver. The " ) + APP_NAME +
tr ( " software will still work with this setting but with restricted "
"performannce." ) + "<br>" + tr (
"performance." ) + "<br>" + tr (
"The actual buffer delay has influence on the connection status, the "
"current upload rate and the overall delay. The lower the buffer size, "
"the higher the probability of red light in the status indicator (drop "
@ -364,7 +364,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent,
rbtBufferDelayDefault->setText ( GenSndCrdBufferDelayString (
FRAME_SIZE_FACTOR_DEFAULT * SYSTEM_FRAME_SIZE_SAMPLES,
", preferred" ) );
", " + tr ( "preferred" ) ) );
rbtBufferDelaySafe->setText ( GenSndCrdBufferDelayString (
FRAME_SIZE_FACTOR_SAFE * SYSTEM_FRAME_SIZE_SAMPLES ) );

View File

@ -61,9 +61,9 @@ CConnectDlg::CConnectDlg ( const bool bNewShowCompleteRegList,
QString strServAddrH = "<b>" + tr ( "Server Address" ) + ":</b> " + tr (
"The IP address or URL of the server running the " ) + APP_NAME + tr (
" server software must be set here. An optional port number can be added after the IP "
"address or URL using a comma as a separator, e.g, "
"address or URL using a colon as a separator, e.g, "
"example.org:" ) +
QString().setNum ( LLCON_DEFAULT_PORT_NUMBER ) + tr ( ". A list of "
QString().setNum ( DEFAULT_PORT_NUMBER ) + tr ( ". A list of "
"the most recent used server IP addresses or URLs is available for "
"selection." );
@ -76,7 +76,7 @@ CConnectDlg::CConnectDlg ( const bool bNewShowCompleteRegList,
// filter
edtFilter->setWhatsThis ( "<b>" + tr ( "Filter" ) + ":</b> " + tr ( "The server "
"list is filered by the given text. Note that the filter is case insensitive." ) );
"list is filtered by the given text. Note that the filter is case insensitive." ) );
edtFilter->setAccessibleName ( tr ( "Filter edit box" ) );
// show all mucisians
@ -304,7 +304,7 @@ void CConnectDlg::SetServerList ( const CHostAddress& InetAddr,
// IP address and port (use IP number without last byte)
// Definition: If the port number is the default port number, we do
// not show it.
if ( vecServerInfo[iIdx].HostAddr.iPort == LLCON_DEFAULT_PORT_NUMBER )
if ( vecServerInfo[iIdx].HostAddr.iPort == DEFAULT_PORT_NUMBER )
{
// only show IP number, no port number
pNewListViewItem->setText ( 0, CurHostAddress.toString ( CHostAddress::SM_IP_NO_LAST_BYTE ) );

View File

@ -117,8 +117,8 @@ LED bar: lbr
#define IP_LOOKUP_TIMEOUT 500 // ms
// defined port numbers for client and server
#define LLCON_DEFAULT_PORT_NUMBER 22124
#define LLCON_PORT_NUMBER_NORTHAMERICA 22224
#define DEFAULT_PORT_NUMBER 22124
#define DEFAULT_PORT_NUMBER_NORTHAMERICA 22224
// system sample rate (the sound card and audio coder works on this sample rate)
#define SYSTEM_SAMPLE_RATE_HZ 48000 // Hz
@ -173,10 +173,6 @@ LED bar: lbr
#define UPPER_BOUND_SIG_METER ( 0.0 ) // dB
// Maximum number of connected clients at the server.
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
// If you want to change this paramter you have to modify the code on some places, too! The code tag
// "MAX_NUM_CHANNELS_TAG" shows these places (just search for the tag in the entire code)
#endif
#define MAX_NUM_CHANNELS 50 // max number channels for server
// actual number of used channels in the server
@ -236,11 +232,11 @@ LED bar: lbr
#define MAX_LEN_VERSION_TEXT 20
// common tool tip bottom line text
#define TOOLTIP_COM_END_TEXT tr ( \
"<br><div align=right><font size=-1><i>" \
"For more information use the ""What's " \
"This"" help (? menu, right mouse button or Shift+F1)" \
"</i></font></div>" )
#define TOOLTIP_COM_END_TEXT \
"<br><div align=right><font size=-1><i>" + \
QCoreApplication::translate ( "global","For more information use the ""What's " \
"This"" help (help menu, right mouse button or Shift+F1)" ) + \
"</i></font></div>"
#define _MAXSHORT 32767
#define _MAXBYTE 255 // binary: 11111111
@ -258,6 +254,8 @@ typedef unsigned __int64 uint64_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int8 uint8_t;
#elif defined ( ANDROID )
// don't redfine types for android as these ones below don't work
#else
typedef long long int64_t;
typedef int int32_t;

View File

@ -27,18 +27,23 @@
#include <QDir>
#include <QTextStream>
#include <QTranslator>
#include <QLibraryInfo>
#include "global.h"
#include "clientdlg.h"
#include "serverdlg.h"
#include "settings.h"
#include "testbench.h"
#include "util.h"
#ifdef ANDROID
# include <QtAndroidExtras/QtAndroid>
#endif
// Implementation **************************************************************
int main ( int argc, char** argv )
{
QTextStream& tsConsole = *( ( new ConsoleWriterFactory() )->get() );
QString strArgument;
double rDbleArgument;
@ -47,35 +52,36 @@ int main ( int argc, char** argv )
// arguments
#if defined( SERVER_BUNDLE ) && ( defined( __APPLE__ ) || defined( __MACOSX ) )
// if we are on MacOS and we are building a server bundle, starts Jamulus in server mode
bool bIsClient = false;
bool bIsClient = false;
#else
bool bIsClient = true;
bool bIsClient = true;
#endif
bool bUseGUI = true;
bool bStartMinimized = false;
bool bShowComplRegConnList = false;
bool bDisconnectAllClients = false;
bool bUseDoubleSystemFrameSize = true; // default is 128 samples frame size
bool bShowAnalyzerConsole = false;
bool bCentServPingServerInList = false;
bool bNoAutoJackConnect = false;
bool bUseTranslation = false;
int iNumServerChannels = DEFAULT_USED_NUM_CHANNELS;
int iMaxDaysHistory = DEFAULT_DAYS_HISTORY;
int iCtrlMIDIChannel = INVALID_MIDI_CH;
quint16 iPortNumber = LLCON_DEFAULT_PORT_NUMBER;
ELicenceType eLicenceType = LT_NO_LICENCE;
QString strConnOnStartupAddress = "";
QString strIniFileName = "";
QString strHTMLStatusFileName = "";
QString strServerName = "";
QString strLoggingFileName = "";
QString strHistoryFileName = "";
QString strRecordingDirName = "";
QString strCentralServer = "";
QString strServerInfo = "";
QString strWelcomeMessage = "";
QString strClientName = APP_NAME;
bool bUseGUI = true;
bool bStartMinimized = false;
bool bShowComplRegConnList = false;
bool bDisconnectAllClientsOnQuit = false;
bool bUseDoubleSystemFrameSize = true; // default is 128 samples frame size
bool bShowAnalyzerConsole = false;
bool bCentServPingServerInList = false;
bool bNoAutoJackConnect = false;
bool bUseTranslation = true;
bool bCustomPortNumberGiven = false;
int iNumServerChannels = DEFAULT_USED_NUM_CHANNELS;
int iMaxDaysHistory = DEFAULT_DAYS_HISTORY;
int iCtrlMIDIChannel = INVALID_MIDI_CH;
quint16 iPortNumber = DEFAULT_PORT_NUMBER;
ELicenceType eLicenceType = LT_NO_LICENCE;
QString strConnOnStartupAddress = "";
QString strIniFileName = "";
QString strHTMLStatusFileName = "";
QString strServerName = "";
QString strLoggingFileName = "";
QString strHistoryFileName = "";
QString strRecordingDirName = "";
QString strCentralServer = "";
QString strServerInfo = "";
QString strWelcomeMessage = "";
QString strClientName = APP_NAME;
// QT docu: argv()[0] is the program name, argv()[1] is the first
// argument and argv()[argc()-1] is the last argument.
@ -195,6 +201,18 @@ int main ( int argc, char** argv )
}
// Disconnect all clients on quit --------------------------------------
if ( GetFlagArgument ( argv,
i,
"-d",
"--discononquit" ) )
{
bDisconnectAllClientsOnQuit = true;
tsConsole << "- disconnect all clients on quit" << endl;
continue;
}
// Disabling auto Jack connections -------------------------------------
if ( GetFlagArgument ( argv,
i,
@ -207,17 +225,14 @@ int main ( int argc, char** argv )
}
// Enable translations -------------------------------------------------
// Undocumented debugging command line argument: Enable translations
// (since translation is still WIP, it is not enabled by default but
// must be enabled with this undocumented command line flag)
// Disable translations ------------------------------------------------
if ( GetFlagArgument ( argv,
i,
"--translation", // no short form
"--translation" ) )
"-t",
"--notranslation" ) )
{
bUseTranslation = true;
tsConsole << "- translations enabled" << endl;
bUseTranslation = false;
tsConsole << "- translations disabled" << endl;
continue;
}
@ -237,20 +252,6 @@ int main ( int argc, char** argv )
}
// Disconnect all clients (emergency mode) -----------------------------
// Undocumented debugging command line argument: Needed to disconnect
// an unwanted client.
if ( GetFlagArgument ( argv,
i,
"--disconnectall", // no short form
"--disconnectall" ) )
{
bDisconnectAllClients = true;
tsConsole << "- disconnect all clients" << endl;
continue;
}
// Show analyzer console -----------------------------------------------
// Undocumented debugging command line argument: Show the analyzer
// console to debug network buffer properties.
@ -308,7 +309,8 @@ int main ( int argc, char** argv )
65535,
rDbleArgument ) )
{
iPortNumber = static_cast<quint16> ( rDbleArgument );
iPortNumber = static_cast<quint16> ( rDbleArgument );
bCustomPortNumberGiven = true;
tsConsole << "- selected port number: " << iPortNumber << endl;
continue;
}
@ -503,17 +505,41 @@ int main ( int argc, char** argv )
strCentralServer = DEFAULT_SERVER_ADDRESS;
}
// adjust default port number for client: use different default port than the server since
// if the client is started before the server, the server would get a socket bind error
if ( bIsClient && !bCustomPortNumberGiven )
{
iPortNumber += 10; // increment by 10
}
// Application/GUI setup ---------------------------------------------------
// Application object
if ( !bUseGUI && !strHistoryFileName.isEmpty() )
// display a warning if in server no GUI mode and a history file is requested
if ( !bIsClient && !bUseGUI && !strHistoryFileName.isEmpty() )
{
tsConsole << "Qt5 requires a windowing system to paint a JPEG image; image will use SVG" << endl;
}
// Application/GUI setup ---------------------------------------------------
// Application object
QCoreApplication* pApp = bUseGUI
? new QApplication ( argc, argv )
: new QCoreApplication ( argc, argv );
#ifdef ANDROID
// special Android coded needed for record audio permission handling
auto result = QtAndroid::checkPermission ( QString ( "android.permission.RECORD_AUDIO" ) );
if ( result == QtAndroid::PermissionResult::Denied )
{
QtAndroid::PermissionResultMap resultHash = QtAndroid::requestPermissionsSync ( QStringList ( { "android.permission.RECORD_AUDIO" } ) );
if ( resultHash["android.permission.RECORD_AUDIO"] == QtAndroid::PermissionResult::Denied )
{
return 0;
}
}
#endif
#ifdef _WIN32
// set application priority class -> high priority
SetPriorityClass ( GetCurrentProcess(), HIGH_PRIORITY_CLASS );
@ -529,7 +555,7 @@ int main ( int argc, char** argv )
Q_INIT_RESOURCE(resources);
// load translations
QTranslator myappTranslator;
QTranslator myappTranslator, myqtTranslator;
if ( bUseGUI && bUseTranslation )
{
@ -537,11 +563,17 @@ int main ( int argc, char** argv )
{
pApp->installTranslator ( &myappTranslator );
}
// allows the Qt messages to be translated in the application
if ( myqtTranslator.load ( QLocale(), "qt", "_", QLibraryInfo::location ( QLibraryInfo::TranslationsPath ) ) )
{
pApp->installTranslator ( &myqtTranslator );
}
}
// TEST -> activate the following line to activate the test bench,
//CTestbench Testbench ( "127.0.0.1", LLCON_DEFAULT_PORT_NUMBER );
//CTestbench Testbench ( "127.0.0.1", DEFAULT_PORT_NUMBER );
try
@ -599,7 +631,7 @@ int main ( int argc, char** argv )
strWelcomeMessage,
strRecordingDirName,
bCentServPingServerInList,
bDisconnectAllClients,
bDisconnectAllClientsOnQuit,
bUseDoubleSystemFrameSize,
eLicenceType );
if ( bUseGUI )
@ -673,9 +705,11 @@ QString UsageArguments ( char **argv )
" -i, --inifile initialization file name\n"
" -n, --nogui disable GUI\n"
" -p, --port set your local port number\n"
" -t, --notranslation disable translation (use englisch language)\n"
" -v, --version output version information and exit\n"
"\nServer only:\n"
" -a, --servername server name, required for HTML status\n"
" -d, --discononquit disconnect all clients on quit\n"
" -D, --histdays number of days of history to display\n"
" -e, --centralserver address of the central server\n"
" -F, --fastupdate use 64 samples frame size mode\n"

View File

@ -136,6 +136,7 @@ MESSAGES (with connection)
- 0: none, no audio coding applied
- 1: CELT
- 2: OPUS
- 3: OPUS64
- "version": version of the audio coder, if not used this value
shall be set to 0
- "audiocod arg": argument for the audio coder, if not used this value

View File

@ -314,22 +314,31 @@ void CJamRecorder::Init( const CServer* server,
throw std::runtime_error( (recordBaseDir.absolutePath() + " is a directory but cannot be written to").toStdString() );
}
QObject::connect((const QObject *)server, SIGNAL ( Stopped() ),
this, SLOT( OnEnd() ),
Qt::ConnectionType::QueuedConnection);
QObject::connect( (const QObject *)server, SIGNAL ( Stopped() ),
this, SLOT( OnEnd() ),
Qt::ConnectionType::QueuedConnection );
QObject::connect((const QObject *)server, SIGNAL ( ClientDisconnected(int) ),
this, SLOT( OnDisconnected(int) ),
Qt::ConnectionType::QueuedConnection);
QObject::connect( (const QObject *)server, SIGNAL ( ClientDisconnected ( int ) ),
this, SLOT( OnDisconnected ( int ) ),
Qt::ConnectionType::QueuedConnection );
qRegisterMetaType<CVector<int16_t>>();
QObject::connect((const QObject *)server, SIGNAL ( AudioFrame(const int, const QString, const CHostAddress, const int, const CVector<int16_t>) ),
this, SLOT( OnFrame(const int, const QString, const CHostAddress, const int, const CVector<int16_t>) ),
Qt::ConnectionType::QueuedConnection);
QObject::connect( (const QObject *)server, SIGNAL ( AudioFrame( const int, const QString, const CHostAddress, const int, const CVector<int16_t> ) ),
this, SLOT( OnFrame (const int, const QString, const CHostAddress, const int, const CVector<int16_t> ) ),
Qt::ConnectionType::QueuedConnection );
QObject::connect( QCoreApplication::instance(),
SIGNAL ( aboutToQuit() ),
this, SLOT( OnAboutToQuit() ) );
iServerFrameSizeSamples = _iServerFrameSizeSamples;
thisThread = new QThread();
moveToThread ( thisThread );
thisThread->start();
}
/**
* @brief CJamRecorder::OnStart Start up tasks when the first client connects
*/
@ -337,7 +346,7 @@ void CJamRecorder::OnStart() {
// Ensure any previous cleaning up has been done.
OnEnd();
currentSession = new CJamSession(recordBaseDir);
currentSession = new CJamSession( recordBaseDir );
isRecording = true;
}
@ -346,7 +355,7 @@ void CJamRecorder::OnStart() {
*/
void CJamRecorder::OnEnd()
{
if (isRecording)
if ( isRecording )
{
isRecording = false;
currentSession->End();
@ -372,6 +381,13 @@ void CJamRecorder::OnEnd()
}
}
void CJamRecorder::OnAboutToQuit()
{
OnEnd();
thisThread->exit();
}
/**
* @brief CJamRecorder::SessionDirToReaper Replica of CJamRecorder::OnEnd() but using the directory contents to construct the CReaperProject object
* @param strSessionDirName
@ -409,11 +425,11 @@ void CJamRecorder::SessionDirToReaper(QString& strSessionDirName, int serverFram
*/
void CJamRecorder::OnDisconnected(int iChID)
{
if (!isRecording)
if ( !isRecording )
{
qWarning() << "CJamRecorder::OnDisconnected: channel" << iChID << "disconnected but not recording";
}
if (currentSession == nullptr)
if ( currentSession == nullptr )
{
qWarning() << "CJamRecorder::OnDisconnected: channel" << iChID << "disconnected but no currentSession";
return;
@ -434,7 +450,7 @@ void CJamRecorder::OnDisconnected(int iChID)
void CJamRecorder::OnFrame(const int iChID, const QString name, const CHostAddress address, const int numAudioChannels, const CVector<int16_t> data)
{
// Make sure we are ready
if (!isRecording)
if ( !isRecording )
{
OnStart();
}

View File

@ -132,13 +132,16 @@ private:
QList<CJamClientConnection*> jamClientConnections;
};
class CJamRecorder : public QThread
class CJamRecorder : public QObject
{
Q_OBJECT
public:
CJamRecorder(const QString recordingDirName) :
recordBaseDir (recordingDirName), isRecording (false) {}
CJamRecorder ( const QString recordingDirName ) :
recordBaseDir ( recordingDirName ),
isRecording ( false )
{
}
void Init( const CServer* server, const int _iServerFrameSizeSamples );
@ -155,16 +158,21 @@ public slots:
*/
void OnEnd();
/**
* @brief Raised when application is stopping
*/
void OnAboutToQuit();
/**
* @brief Raised when an existing client leaves the server.
* @param iChID channel number of client
*/
void OnDisconnected(int iChID);
void OnDisconnected ( int iChID );
/**
* @brief Raised when a frame of data fis available to process
* @brief Raised when a frame of data is available to process
*/
void OnFrame(const int iChID, const QString name, const CHostAddress address, const int numAudioChannels, const CVector<int16_t> data);
void OnFrame ( const int iChID, const QString name, const CHostAddress address, const int numAudioChannels, const CVector<int16_t> data );
private:
QDir recordBaseDir;
@ -172,6 +180,8 @@ private:
bool isRecording;
CJamSession* currentSession;
int iServerFrameSizeSamples;
QThread* thisThread;
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 360.9 244.9" style="enable-background:new 0 0 360.9 244.9;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{fill:url(#SVGID_1_);}
.st2{fill:url(#SVGID_2_);}
.st3{fill:none;stroke:#E6E6E6;stroke-width:1.0844;stroke-miterlimit:10;}
.st4{fill:#D8BD8D;stroke:#000000;stroke-width:0.1213;stroke-miterlimit:10;}
.st5{fill:none;stroke:#E6E6E6;stroke-width:1.0817;stroke-miterlimit:10;}
.st6{stroke:#000000;stroke-width:0.1213;stroke-miterlimit:10;}
.st7{fill:#D8BD8D;stroke:#000000;stroke-width:0.1188;stroke-miterlimit:10;}
.st8{fill:none;stroke:#000000;stroke-width:1.0817;stroke-miterlimit:10;}
.st9{fill:none;}
.st10{stroke:#000000;stroke-width:0.1456;stroke-miterlimit:10;}
.st11{stroke:#000000;stroke-width:0.1335;stroke-miterlimit:10;}
.st12{stroke:#000000;stroke-width:0.1165;stroke-miterlimit:10;}
.st13{fill:url(#SVGID_3_);stroke:#000000;stroke-width:0.1213;stroke-miterlimit:10;}
.st14{fill:url(#SVGID_4_);stroke:#000000;stroke-width:0.1896;stroke-miterlimit:10;}
</style>
<g id="Layer_1_copy" class="st0">
<image style="display:inline;overflow:visible;" width="2912" height="1976" xlink:href="bongobase.jpg" transform="matrix(0.1239 0 0 0.1239 0 0)">
</image>
</g>
<g id="Layer_1" class="st0">
<image style="display:inline;overflow:visible;" width="2912" height="1976" xlink:href="bongobase.jpg" transform="matrix(0.1239 0 0 0.1239 0 0)">
</image>
</g>
<g id="Layer_10">
</g>
<g id="Layer_6">
</g>
<g id="Layer_7">
</g>
<g id="Layer_4">
</g>
<g id="Layer_9">
</g>
<g id="Layer_8">
</g>
<g id="Layer_2_copy">
</g>
<g id="Layer_2">
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="134.371" y1="104.3634" x2="157.2497" y2="90.1605">
<stop offset="0.1132" style="stop-color:#BF6F00"/>
<stop offset="0.2222" style="stop-color:#FF7300"/>
<stop offset="0.2734" style="stop-color:#FC7C00"/>
<stop offset="0.3585" style="stop-color:#F49600"/>
<stop offset="0.4664" style="stop-color:#E7BF00"/>
<stop offset="0.4807" style="stop-color:#E5C500"/>
<stop offset="0.6614" style="stop-color:#FF7300"/>
<stop offset="0.7093" style="stop-color:#F97C01"/>
<stop offset="0.7888" style="stop-color:#EA9602"/>
<stop offset="0.8109" style="stop-color:#E59E03"/>
<stop offset="0.9573" style="stop-color:#BF6F00"/>
</linearGradient>
<path class="st1" d="M129.8,95l10.6,11.2c0,0,7.8,1.7,10.8,0s5.4-4.6,5.5-4.5c0.1,0.1-3.3-4.5-2.8-7.6c0.4-3.1,1.6-6.9,1.6-6.9
s-7,5.9-12.4,7.2c-5.4,1.4-8.8,1.5-10.4,1.1C131.1,95.2,129.8,95,129.8,95z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="161.3593" y1="113.4498" x2="194.464" y2="110.1142">
<stop offset="0.1132" style="stop-color:#BF6F00"/>
<stop offset="0.2222" style="stop-color:#FF7300"/>
<stop offset="0.2734" style="stop-color:#FC7C00"/>
<stop offset="0.3585" style="stop-color:#F49600"/>
<stop offset="0.4664" style="stop-color:#E7BF00"/>
<stop offset="0.4807" style="stop-color:#E5C500"/>
<stop offset="0.6614" style="stop-color:#FF7300"/>
<stop offset="0.7093" style="stop-color:#F97C01"/>
<stop offset="0.7888" style="stop-color:#EA9602"/>
<stop offset="0.8109" style="stop-color:#E59E03"/>
<stop offset="0.9573" style="stop-color:#BF6F00"/>
</linearGradient>
<path class="st2" d="M161.1,105c0,0,10.2,3.3,15.8,3.1s8.1-1.1,11.4-2.3c3.3-1.2,7.3-4.3,7.3-4.3l-4.8,12.5c0,0-2.8,5.2-6.5,5.6
s-10,0.4-12.6-0.6s-5.6-3.1-6.4-5S161.1,105,161.1,105L161.1,105"/>
<ellipse transform="matrix(0.9359 -0.3524 0.3524 0.9359 -20.9237 55.2979)" class="st3" cx="141.4" cy="85.1" rx="16.6" ry="8.8"/>
<path class="st4" d="M127,83.3c0,0-2.1,5.5,8.3,5.1c10.4-0.4,16.3-7.1,16.3-7.1s2.1-3.5,1.9-4.4c-0.2-0.9-2.5-2.4-2.5-2.4l3.4,1
c1.5,0.4,2.6,1.7,2.9,3.3l0.1,0.8l-1.5,2.9l-1,2.6l-2.8,2.4l-5.6,3.4l-10.1,2.8l-7-1.6l-4.2-2.7l1-3L127,83.3z"/>
<path class="st5" d="M201.3,89.7c1,9.8-8.5,16.4-21.5,18.1c-13.1,1.7-24.6-3.5-25.6-11.7c-1.1-8.2,8.7-16.2,21.8-17.9
S200.5,81.5,201.3,89.7z"/>
<path class="st6" d="M148.5,73.5l2.6,0.9c0.7,0.3-0.9,0.1,1.3,0.3l3.1,2.6c0.8,0.7,1.2,1.5-0.7,4.5c-2.9,4.5-10.5,8.8-18.9,9.5
c-6.7,0.5-9.4-2.5-9.4-2.5L126,87v-1.8c0,0,1-3,4.6-5.6c3.6-2.6,5.2-3.2,5.2-3.2s4.2-1.7,4.7-1.9
C142.3,73.8,146.3,73.5,148.5,73.5c-2.3-0.1-4.5,0.1-5.9,0.3c-11.5,2-15.7,8.1-17.3,10.8c-1.6,2.7,0,5.3,0,5.3l1.3,1.9
c0,0,5.7,5.9,17.5,0.8s14.4-10.2,13.1-14.8C156.5,75.4,150.1,73.7,148.5,73.5z"/>
<path class="st7" d="M165.7,78.3c0,0-5.5,1.8-7.1,5.8c-1.6,4-2.6,10,4.2,12.6c6.7,2.6,15.6,3.2,24-0.8c8.4-4,11.3-10.8,9.1-15.6
l5.3,5.9c0,0-0.2,5.3-2.1,8.5s-1.9,3.3-1.9,3.3s-8.4,8.3-21.2,8.1c-12.8-0.2-18-4.4-20.1-6.9c-2-2.4-1.8-3.9-2.3-4.9
c-0.5-0.9-0.3-3.4,0-4.8c0.3-1.4,5.4-7.4,5.4-7.4L165.7,78.3z"/>
<g>
<path class="st8" d="M155.7,98.5c0,0-1.3,0.5-2.3,1c-0.5,0.3-0.7,1-0.3,1.4c1.6,1.8,5.5,6,5.9,6.5c0,0,0,0.1,0.1,0.1l5.9,12.3"/>
<path class="st8" d="M153.4,93l-1.1,0.7c-0.1,0.1-0.2,0.2-0.1,0.3l1.9,5.3c0.1,0.3,0.5,0.2,0.5-0.1v0c0-0.1,0.1-0.2,0.2-0.2
l1-0.5"/>
<path class="st8" d="M146.1,90.2l1.4,1.8c0.1,0.1,0.1,0.2,0,0.3l-2.6,4.4c-0.1,0.1-0.2,0.2-0.3,0.1l-4.7-1.6
c-0.1,0-0.2-0.1-0.2-0.2l-0.4-2.4"/>
<path class="st8" d="M143.3,95.3c0,0,0.8-1.1,1.7-0.6c0.9,0.5,1.8,0.8,1.1,2.2c-0.7,1.3,0.2,4.7,0.3,5c0,0,0,0,0,0.1l4.7,8.6"/>
<path class="st8" d="M138.8,106.9l-9.1-10.8l-5.5-4.8c-0.1-0.1-0.1-0.4,0.1-0.5l0.8-0.3"/>
<path class="st8" d="M181.4,105.5l1.4,2.8c0,0.1,0.1,0.1,0.2,0.1l3.8,1.4c0.1,0,0.2,0,0.3-0.1l4.6-4.8c0.1-0.1,0.1-0.2,0-0.3
l-1.2-1.8"/>
<path class="st8" d="M185.2,108c0,0,1.1-0.7,1.9,0c0.9,0.7,1.6,2.4,0.8,4c-0.8,1.5-2.4,3.8-2.6,4.2c0,0,0,0.1,0,0.2v9.5"/>
</g>
<path d="M163.7,110.6c0,0,2.6,5.3,8.4,7.2s11.5,1,15-1.2s4.1-3.8,4.3-4.4c0.3-0.5,0.3-0.5,0.3-0.5l0.5-1.8c0,0-0.3,5.5-3.2,7.7
c-2.9,2.2-8,4.8-15.1,3.1c-7.2-1.7-9-5.6-9.4-6.7S163.7,110.6,163.7,110.6z"/>
<path class="st8" d="M183,119.5L183,119.5c-0.6,0-1,0.8-0.6,1.3l1.1,1.4c0.1,0.1,0.1,0.2,0.1,0.3c0.1,0.3,0.4,0.8,1.6,0.3l0.8-0.3
c0.4-0.2,0.6-0.7,0.4-1.1L185,119"/>
<path class="st8" d="M166.4,115.6l-2.7,1.8c0,0-1.1,0.4-1.8-0.2c-0.6-0.6,0.4-1.6,0.4-1.6l2.7-1.5"/>
<line class="st9" x1="185.2" y1="123.7" x2="185.2" y2="126.5"/>
<path d="M137.2,102c0,0,1.2,3.2,7.1,4c5.9,0.8,12-4,12-4l1.8,1.7c0,0-2.5,1.7-4,2.6c-3.5,2.1-7.7,2.5-11.4,1.8
c0,0-2.4-1.2-3.9-3.2C138,104,137.2,102,137.2,102z"/>
<path class="st8" d="M138,103.8l-1.1,1c0,0-1.3,0.3-1.4,1.2c-0.1,1,1.7,0,1.7,0l1.5-1.1"/>
<path class="st6" d="M136.3,104.5l1.8-0.8l1,0.7l1.3,2c0,0,0.4,0.5,0,0.6c-0.4,0.1-1.4,1.3-1.4,1.3h-1.6l-1.6-2.3L136.3,104.5z"/>
<path class="st6" d="M148.2,107.7l1.8-0.8l1,0.7l1.3,2c0,0,0.4,0.5,0,0.6c-0.4,0.1-1.4,1.3-1.4,1.3h-1.6l-1.6-2.3L148.2,107.7z"/>
<path class="st10" d="M183.7,121.3l2.3-0.3l0.9,1.1l0.8,2.8c0,0,0.3,0.8-0.2,0.7c-0.5,0-2,1-2,1l-1.8-0.5l-1.1-3.2L183.7,121.3z"
/>
<path class="st11" d="M162,116.4l1.9-0.9l1.1,0.8l1.4,2.3c0,0,0.5,0.6,0,0.7c-0.5,0.1-1.5,1.4-1.5,1.4h-1.7l-1.8-2.6L162,116.4z"
/>
<path class="st6" d="M179.6,95l1.8-0.8l1,0.7l1.3,2c0,0,0.4,0.5,0,0.6c-0.4,0.1-1.4,1.3-1.4,1.3h-1.6l-1.6-2.3L179.6,95z"/>
<path class="st12" d="M201.4,86.4c-0.3-3.1-4.6-6.8-8.2-9c-3.6-2.3-12.1-3-12.9-2.9c-8.1,0.4-14.2,2.9-14.2,2.9
c-5.6,2.4-11,7.4-12.3,11.3c-1.3,3.9,0.8,10.3,4.5,13.9c3.8,3.6,14.6,5.9,22.9,4.6c8.3-1.3,15.1-6,17.1-9S201.7,89.5,201.4,86.4z
M191.8,100.8c-9.9,4.8-18.3,4.9-27.5,2.2c-9.2-2.7-9.8-8.4-9.8-8.4s0.1-2.2,0-3.6c-0.1-1.4,0.6-1.9,1-3.1
c0.3-1.2,1.2-2.5,2.5-3.7s2.2-2.3,2.2-2.3s1,0.5,3.1-1.4c2.2-1.9,10.8-4.3,10.8-4.3s4.1-0.5,6.8-0.7c2.7-0.1,7,0.8,10.8,2.2
c3.8,1.4,6.6,5.1,7.4,7.1c0.9,2,0.4,0.7,1,2.7C200.5,89.7,201.7,96,191.8,100.8z"/>
<g>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="125.5923" y1="81.5875" x2="153.9333" y2="81.5875">
<stop offset="5.076142e-03" style="stop-color:#FFE794"/>
<stop offset="1" style="stop-color:#ECDEFF"/>
</linearGradient>
<path class="st13" d="M125.8,85.8c-1.2-3.9,4.1-9,11.9-11.3c7.7-2.3,15-1.1,16.1,2.8c1.2,3.9-4.1,9-11.9,11.3
C134.2,91,126.9,89.7,125.8,85.8z"/>
</g>
<g>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="156.165" y1="88.117" x2="197.6382" y2="88.117">
<stop offset="5.076142e-03" style="stop-color:#FFE794"/>
<stop offset="1" style="stop-color:#ECDEFF"/>
</linearGradient>
<path class="st14" d="M156.3,91.8c-1.2-6.8,7-14,18.4-16.1c11.4-2,21.6,1.9,22.8,8.7c1.2,6.8-7,14-18.4,16.1
C167.7,102.5,157.5,98.6,156.3,91.8z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 29 21.9" style="enable-background:new 0 0 29 21.9;" xml:space="preserve">
<style type="text/css">
.st0{display:none;fill:#DDD6CE;}
.st1{fill:url(#SVGID_1_);}
.st2{fill:url(#SVGID_2_);}
.st3{fill:none;stroke:#898989;stroke-width:0.4152;stroke-linecap:round;stroke-miterlimit:10;}
.st4{fill:url(#SVGID_3_);}
.st5{fill:url(#SVGID_4_);}
.st6{fill:url(#SVGID_5_);}
.st7{fill:url(#SVGID_6_);}
.st8{fill:#231F20;}
.st9{fill:#9B7550;}
.st10{fill:#C1AC97;}
.st11{stroke:#000000;stroke-width:0.4152;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<path class="st0" d="M6.2,47.6"/>
<g>
<g id="Layer_2_1_">
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-6.7753" y1="181.6339" x2="-2.3834" y2="181.6339" gradientTransform="matrix(0.9952 -9.790000e-02 -9.790000e-02 -0.9952 34.2217 190.0392)">
<stop offset="0" style="stop-color:#A5161B"/>
<stop offset="0.2559" style="stop-color:#AB1F23"/>
<stop offset="0.6801" style="stop-color:#BA3939"/>
<stop offset="0.8934" style="stop-color:#C34846"/>
</linearGradient>
<path class="st1" d="M9.7,3.2l3.4-0.7c0.1,0,0.3,0.1,0.3,0.2l1.3,13.5c0,0.1-0.1,0.2-0.2,0.3c-0.2,0.1-0.6,0.2-1.1,0.1
c-0.6-0.1-1-0.6-1.1-0.7c0,0,0,0,0-0.1c-2.2-5.3-1.6-3.5-2.2-5.3c-0.6-1.7-0.8-5-0.8-5.4c0,0,0-0.4,0-0.4l0.1-1.2
C9.4,3.4,9.5,3.3,9.7,3.2z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-63.7946" y1="181.6438" x2="-59.2975" y2="181.6438" gradientTransform="matrix(-0.9952 9.790000e-02 -9.790000e-02 -0.9952 -27.5088 196.0988)">
<stop offset="0" style="stop-color:#A5161B"/>
<stop offset="0.2559" style="stop-color:#AB1F23"/>
<stop offset="0.6801" style="stop-color:#BA3939"/>
<stop offset="0.8934" style="stop-color:#C34846"/>
</linearGradient>
<path class="st2" d="M17,2.4l-3.7,0.1l1.1,14c0,0,0.6,0.2,1.3-0.2c0.7-0.3,1-1,1-1c1.3-5.7,1-3.8,1.3-5.7s-0.3-5.3-0.3-5.3
l-0.3-1.6C17.3,2.5,17.2,2.4,17,2.4z"/>
</g>
</g>
<path class="st3" d="M10.6,8.5c0-0.2,0.2-0.8,0.1-0.9l-0.6-2.4"/>
<g>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-32.4531" y1="177.8433" x2="-27.3982" y2="177.8433" gradientTransform="matrix(0.9815 -0.1915 -0.1915 -0.9815 67.819 182.7466)">
<stop offset="0" style="stop-color:#FF7300"/>
<stop offset="0.1217" style="stop-color:#F97C01"/>
<stop offset="0.3234" style="stop-color:#EA9602"/>
<stop offset="0.3795" style="stop-color:#E59E03"/>
<stop offset="0.8652" style="stop-color:#E5C500"/>
</linearGradient>
<path class="st4" d="M1.1,6.4L5,5.2c0.2-0.1,0.3,0.1,0.4,0.2l3,15.9c0,0.1,0,0.3-0.2,0.3c-0.3,0.1-0.7,0.3-1.2,0.2
c-0.7-0.1-1.2-0.6-1.3-0.7c0,0,0,0,0-0.1c-3.2-6-2.3-4-3.2-6c-0.9-2-1.5-5.9-1.5-6.3c0,0,0-0.5,0-0.5l0-1.4
C0.8,6.6,0.9,6.5,1.1,6.4z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-39.4058" y1="177.8697" x2="-34.2269" y2="177.8697" gradientTransform="matrix(-0.9815 0.1915 -0.1915 -0.9815 6.937 194.6229)">
<stop offset="0" style="stop-color:#FF7300"/>
<stop offset="0.1217" style="stop-color:#F97C01"/>
<stop offset="0.3234" style="stop-color:#EA9602"/>
<stop offset="0.3795" style="stop-color:#E59E03"/>
<stop offset="0.8652" style="stop-color:#E5C500"/>
</linearGradient>
<path class="st5" d="M9.4,4.7L5.2,5.2l2.9,16.5c0,0,0.7,0.1,1.5-0.3s1-1.2,1-1.2c0.8-6.9,0.7-4.6,0.8-6.9c0.1-2.3-1-6.3-1-6.3
L9.8,5C9.8,4.8,9.6,4.7,9.4,4.7z"/>
</g>
<g>
<g>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="34.4733" y1="159.7419" x2="39.6473" y2="159.7419" gradientTransform="matrix(0.996 8.950000e-02 8.950000e-02 -0.996 -30.5432 168.0219)">
<stop offset="0" style="stop-color:#FF7300"/>
<stop offset="0.1217" style="stop-color:#F97C01"/>
<stop offset="0.3234" style="stop-color:#EA9602"/>
<stop offset="0.3795" style="stop-color:#E59E03"/>
<stop offset="0.8652" style="stop-color:#E5C500"/>
</linearGradient>
<path class="st6" d="M19.3,4l4.2,0c0.2,0,0.3,0.2,0.3,0.3l-1.3,16.3c0,0.1-0.1,0.3-0.3,0.3c-0.3,0-0.8,0-1.3-0.2
c-0.7-0.3-1.1-0.9-1.1-1.1c0,0,0,0,0-0.1c-1.5-6.8-1.2-4.5-1.5-6.8c-0.3-2.2,0.6-6.6,0.7-7.1c0,0,0,0,0-0.1l0-1.3
C19,4.1,19.1,4,19.3,4z"/>
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-106.4789" y1="159.7513" x2="-101.3623" y2="159.7513" gradientTransform="matrix(-0.996 -8.950000e-02 8.950000e-02 -0.996 -92.3257 162.4685)">
<stop offset="0" style="stop-color:#FF7300"/>
<stop offset="0.1217" style="stop-color:#F97C01"/>
<stop offset="0.3234" style="stop-color:#EA9602"/>
<stop offset="0.3795" style="stop-color:#E59E03"/>
<stop offset="0.8652" style="stop-color:#E5C500"/>
</linearGradient>
<path class="st7" d="M28.2,4.8L23.8,4l-1.6,16.8c0,0,0.7,0.3,1.6,0.1c0.9-0.2,1.3-0.9,1.3-0.9c2.7-6.4,2-4.2,2.7-6.4
c0.7-2.2,0.5-7.1,0.5-7.1l0.2-1.3C28.5,5,28.4,4.8,28.2,4.8z"/>
</g>
<path class="st8" d="M19.6,19.2c0,0,1.1,1.1,2.3,1.2c1.2,0.1,2,0,2.6-0.4c0.6-0.3,1-0.7,1-0.7l-0.2,1c0,0-0.8,1-2.7,0.9
c-2-0.1-2.7-1.1-2.7-1.1L19.6,19.2z"/>
</g>
<path class="st8" d="M5.3,20.7c0,0,1,0.7,2.5,0.4c1.6-0.3,1.8-0.6,2.3-1.1c0.5-0.5,0.5-0.7,0.5-0.7V20c0,0.2-0.2,0.4-0.3,0.6
c-0.4,0.8-1.2,1-2.2,1.2c-0.7,0.1-1.3,0.1-1.9,0c-0.4-0.1-0.7-0.2-0.9-0.5L5.3,20.7z"/>
<path class="st9" d="M1.1,5.1l8-0.9c0.2,0,0,0,0.4,0l0.3,0.2C9.5,4.3,9.7,4.5,9.7,4.6c0,0.1,0.1,0.2,0.1,0.2l0,0
c0.1,0,0.1,0.4,0.2,0.5c0,0.1,0,0-0.1,0.1C9.5,5.9,8,7.1,5.9,7.5C3.6,8,2.8,7.8,1.7,7.6C1,7.5,0.7,7,0.6,6.7C0.5,6.4,0.3,6.3,0.4,6
l0.2-0.6C0.7,5.2,0.9,5.1,1.1,5.1z"/>
<path class="st9" d="M19.5,3l9.1,1.1c0,0,0,0.1,0.1,0.1l0.2,0.3c0,0.1-0.2,0.3-0.1,0.3l0-0.1c0.1,0,0.1,0.4,0.1,0.5
c0.1,0.4-0.1,0.5-0.2,0.6c-0.3,0.7-2.1,0.9-4,0.7c-3-0.3-2.7-0.4-3.8-0.8c-0.6-0.2-1.1-0.5-1.5-0.7c-0.3-0.2-0.7-0.8-0.5-1.1
L19.5,3C19.4,3.1,19.5,3,19.5,3z"/>
<path class="st9" d="M9.5,1.8L9.3,2.6c0,0,0.4,0.8,2.7,1s4.9-1.4,4.9-1.4c0.2-0.1,0.1-0.3,0.2-0.4c0,0,0.1-0.1,0-0.2l-0.6-0.8"/>
<ellipse transform="matrix(0.9875 -0.1577 0.1577 0.9875 -0.7287 0.8601)" class="st10" cx="5.1" cy="5" rx="4.6" ry="1.7"/>
<ellipse transform="matrix(0.9945 -0.1051 0.1051 0.9945 -7.567539e-02 1.3796)" class="st10" cx="13.1" cy="1.4" rx="3.5" ry="1.4"/>
<ellipse transform="matrix(0.1216 -0.9926 0.9926 0.1216 17.2543 27.095)" class="st10" cx="23.9" cy="3.8" rx="1.7" ry="4.6"/>
<path class="st8" d="M0.4,5.7c0,0-0.4,0.5-0.4,0.8s0.4,1.9,0.4,1.9l0.3,0.3l0.5-0.3c0,0,0.6,0.2,1.7,0.3s1.7,0,1.7,0l1,1.5l0.6-0.1
l0.6-1.8c0,0,1-0.3,1.7-0.8s1.5-1.1,1.5-1.1l0.4,0.9L10.7,7l-0.6-2.5L9.6,4.3l0.3,1c0,0-0.2,0.7-1.9,1.5C6.6,7.4,5.3,7.7,5.3,7.7
S4,7.8,2.8,7.7C0.6,7.5,0.4,6.6,0.4,6.6V5.7z"/>
<path class="st3" d="M0.3,8c0,0.3-0.1,1-0.1,1.3L0.8,10L1,11.7"/>
<polygon class="st8" points="0.6,10.6 1.2,10.6 1.3,11.3 0.7,11.5 "/>
<polygon class="st11" points="4.9,11.1 6.2,11.5 7.3,10.6 6.6,13.3 "/>
<line class="st3" x1="5.9" y1="9.3" x2="6.3" y2="12.2"/>
<path class="st8" d="M9.5,1.7c0,0-0.5,0.4-0.6,0.6c0,0.2,0.2,1.5,0.2,1.5L9.4,4l0.4-0.2c0,0,0.5,0.3,1.4,0.4
c0.9,0.1,1.4,0.1,1.4,0.1l0.8,1.1L14,5.3l0.6-1.3c0,0,0.9-0.2,1.5-0.5c0.6-0.3,1.3-0.8,1.3-0.8l0.2,0.8l0.3-0.3l-0.3-1.8
c0-0.1-0.1-0.2-0.2-0.3l-0.5-0.2l0.4,0.6c0,0-0.1,0.6-1.5,1.2c-1.1,0.4-2.3,0.6-2.3,0.6s-1.1,0.1-2.1,0c-1.9-0.3-1.9-1-1.9-1
L9.5,1.7z"/>
<g>
<polygon class="st11" points="12.7,6.5 13.9,6.9 15,6.2 14.1,8.6 "/>
<line class="st3" x1="13.6" y1="4.8" x2="13.9" y2="7.6"/>
</g>
<path class="st8" d="M14.5,15.7c-1.7,0-2.4-0.4-2.4-0.4l0.2,0.6c0,0,0.4,0.7,2.2,0.6c1.8-0.1,2.2-0.9,2.2-0.9v-0.7
c0,0-0.2,0.3-0.9,0.6C15.1,15.8,14.5,15.7,14.5,15.7z"/>
<path class="st8" d="M24.2,7.4c1.4,0,1.6,0.2,3-0.2c0.6-0.2,1.1-0.4,1.1-0.4l0.4-0.4l0.2-0.5l0-1.1c0-0.2-0.1-0.4-0.2-0.5l-0.1-0.1
l0.1,0.9c0,0,0,0.7-1.9,1c-1.5,0.2-2.9,0.1-2.9,0.1S22.4,6,21.3,5.6c-2.3-0.8-2.2-1.8-2.2-1.8L19.4,3c0,0-0.5,0.3-0.6,0.5
c-0.1,0.2-0.1,1.4-0.1,1.4l0.3,0.4l0,0c0,0,1.3,1.5,3,1.8l0,0L24.2,7.4z"/>
<polygon class="st8" points="21.5,6.6 20.7,7.6 20,7.3 19.9,6 "/>
<path class="st8" d="M25.7,7l1.7-0.3l-0.2,1.4c0-0.2,0-0.2,0-0.2l-0.9,0.2L25.7,7z"/>
<g>
<polygon class="st11" points="25.7,9.4 26.9,9.7 28,8.8 27.3,11.7 "/>
<line class="st3" x1="26.6" y1="7.3" x2="27" y2="10.6"/>
</g>
<g>
<polygon class="st11" points="18.9,7.8 19.8,8.8 21.1,8.7 19.4,10.7 "/>
<line class="st3" x1="20.5" y1="6.7" x2="19.6" y2="9.6"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -4,22 +4,31 @@
<context>
<name>CAboutDlg</name>
<message>
<location filename="../../util.cpp" line="355"/>
<location filename="../../util.cpp" line="353"/>
<source>The </source>
<translation>O </translation>
</message>
<message>
<location filename="../../util.cpp" line="356"/>
<source> software enables musicians to perform real-time jam sessions over the internet. There is a </source>
<translation> permite aos músicos realizar jam sessions em tempo real pela Internet. Existe um servidor </translation>
<translation type="vanished"> permite aos músicos realizar jam sessions em tempo real pela Internet. Existe um servidor </translation>
</message>
<message>
<location filename="../../util.cpp" line="357"/>
<location filename="../../util.cpp" line="354"/>
<source> software enables musicians to perform real-time jam sessions over the internet.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="355"/>
<source> server which collects the audio data from each </source>
<translation> que reúne os dados de áudio de cada cliente </translation>
</message>
<message>
<location filename="../../util.cpp" line="359"/>
<location filename="../../util.cpp" line="355"/>
<source>There is a </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="357"/>
<source> client, mixes the audio data and sends the mix back to each client.</source>
<translation>, que mistura os dados de áudio e envia a mistura de volta para cada cliente.</translation>
</message>
@ -29,22 +38,77 @@
<translation> utiliza as seguintes bibliotecas, recursos ou partes de código:</translation>
</message>
<message>
<location filename="../../util.cpp" line="399"/>
<location filename="../../util.cpp" line="376"/>
<source>Qt cross-platform application framework</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="380"/>
<source>Audio reverberation code by Perry R. Cook and Gary P. Scavone</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="383"/>
<source>Some pixmaps are from the</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="385"/>
<source>Country flag icons from Mark James</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="403"/>
<source>For details on the contributions check out the </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="404"/>
<source>Github Contributors list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="408"/>
<source>Spanish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="410"/>
<source>French</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="412"/>
<source>Portuguese</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="414"/>
<source>Dutch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="416"/>
<source>German</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="423"/>
<source>About </source>
<translation>Sobre o </translation>
</message>
<message>
<location filename="../../util.cpp" line="416"/>
<location filename="../../util.cpp" line="440"/>
<source>, Version </source>
<translation>, Versão </translation>
</message>
<message>
<location filename="../../util.cpp" line="427"/>
<location filename="../../util.cpp" line="453"/>
<source>Internet Jam Session Software</source>
<translation>Programa de Jam Sessions pela Internet</translation>
</message>
<message>
<location filename="../../util.cpp" line="438"/>
<location filename="../../util.cpp" line="457"/>
<source>Under the GNU General Public License (GPL)</source>
<translation>Sob a Licença Pública Geral GNU (GPL)</translation>
</message>
@ -57,15 +121,35 @@
<translation>Sobre</translation>
</message>
<message>
<location filename="../../aboutdlgbase.ui" line="79"/>
<location filename="../../aboutdlgbase.ui" line="59"/>
<source>TextLabelVersion</source>
<translation>TextLabelVersion</translation>
</message>
<message>
<location filename="../../aboutdlgbase.ui" line="128"/>
<location filename="../../aboutdlgbase.ui" line="72"/>
<source>Copyright (C) 2005-2020 Volker Fischer and others</source>
<translation>Copyright (C) 2005-2020 Volker Fischer e outros</translation>
</message>
<message>
<location filename="../../aboutdlgbase.ui" line="106"/>
<source>A&amp;bout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../aboutdlgbase.ui" line="120"/>
<source>&amp;Libraries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../aboutdlgbase.ui" line="134"/>
<source>&amp;Contributors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../aboutdlgbase.ui" line="148"/>
<source>&amp;Translation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author: Volker Fischer</source>
<translation type="vanished">Autor: Volker Fischer</translation>
@ -96,12 +180,12 @@
<context>
<name>CAudioMixerBoard</name>
<message>
<location filename="../../audiomixerboard.cpp" line="707"/>
<location filename="../../audiomixerboard.cpp" line="594"/>
<source>Server</source>
<translation>Servidor</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="716"/>
<location filename="../../audiomixerboard.cpp" line="603"/>
<source>T R Y I N G T O C O N N E C T</source>
<translation>T E N T A N D O L I G A R</translation>
</message>
@ -194,44 +278,44 @@
<translation>SOLO</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="442"/>
<location filename="../../audiomixerboard.cpp" line="440"/>
<source>Alias/Name</source>
<translation>Nome/Alcunha</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="448"/>
<location filename="../../audiomixerboard.cpp" line="446"/>
<source>Instrument</source>
<translation>Instrumento</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="456"/>
<location filename="../../audiomixerboard.cpp" line="454"/>
<source>Location</source>
<translation>Localização</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="478"/>
<location filename="../../audiomixerboard.cpp" line="482"/>
<location filename="../../audiomixerboard.cpp" line="486"/>
<location filename="../../audiomixerboard.cpp" line="476"/>
<location filename="../../audiomixerboard.cpp" line="480"/>
<location filename="../../audiomixerboard.cpp" line="484"/>
<source>Skill Level</source>
<translation>Nível de Habilidade</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="478"/>
<location filename="../../audiomixerboard.cpp" line="476"/>
<source>Beginner</source>
<translation>Principiante</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="482"/>
<location filename="../../audiomixerboard.cpp" line="480"/>
<source>Intermediate</source>
<translation>Intermediário</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="486"/>
<location filename="../../audiomixerboard.cpp" line="484"/>
<source>Expert</source>
<translation>Avançado</translation>
</message>
<message>
<location filename="../../audiomixerboard.cpp" line="497"/>
<location filename="../../audiomixerboard.cpp" line="495"/>
<source>Musician Profile</source>
<translation>Perfil do músico</translation>
</message>
@ -421,7 +505,7 @@
</message>
<message>
<location filename="../../clientdlg.cpp" line="204"/>
<location filename="../../clientdlg.cpp" line="1085"/>
<location filename="../../clientdlg.cpp" line="1075"/>
<source>C&amp;onnect</source>
<translation>&amp;Ligar</translation>
</message>
@ -503,7 +587,7 @@
</message>
<message>
<location filename="../../clientdlg.cpp" line="119"/>
<source>A reverberation effect can be applied to one local mono audio channel or to both channels in stereo mode. The mone channel selection and the reverberation level can be modified. If, e.g., the microphone signal is fed into the right audio channel of the sound card and a reverberation effect shall be applied, set the channel selector to right and move the fader upwards until the desired reverberation level is reached.</source>
<source>A reverberation effect can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverberation level can be modified. If, e.g., the microphone signal is fed into the right audio channel of the sound card and a reverberation effect shall be applied, set the channel selector to right and move the fader upwards until the desired reverberation level is reached.</source>
<translation>Um efeito de reverberação pode ser aplicado a um canal local de áudio mono ou a ambos os canais no modo estéreo. A seleção do canal mono e o nível de reverberação podem ser modificados. Se, por exemplo, o sinal do microfone for alimentado no canal de áudio direito da placa de som, e for aplicado um efeito de reverberação, ajuste o seletor de canal para a direita e mova o fader para cima até que o nível de reverberação desejado seja atingido.</translation>
</message>
<message>
@ -562,17 +646,17 @@
<translation>O CPU do cliente ou servidor está a 100%.</translation>
</message>
<message>
<location filename="../../clientdlg.cpp" line="819"/>
<location filename="../../clientdlg.cpp" line="809"/>
<source>user</source>
<translation>utilizador</translation>
</message>
<message>
<location filename="../../clientdlg.cpp" line="824"/>
<location filename="../../clientdlg.cpp" line="814"/>
<source>users</source>
<translation>utilizadores</translation>
</message>
<message>
<location filename="../../clientdlg.cpp" line="1061"/>
<location filename="../../clientdlg.cpp" line="1051"/>
<source>D&amp;isconnect</source>
<translation>Desl&amp;igar</translation>
</message>
@ -849,7 +933,7 @@
</message>
<message>
<location filename="../../clientsettingsdlg.cpp" line="157"/>
<source> software will still work with this setting but with restricted performannce.</source>
<source> software will still work with this setting but with restricted performance.</source>
<translation> ainda funcionará com essa configuração, mas com desempenho restrito.</translation>
</message>
<message>
@ -1077,6 +1161,11 @@
<source>Default (North America)</source>
<translation>Servidor Padrão (America do Norte)</translation>
</message>
<message>
<location filename="../../clientsettingsdlg.cpp" line="367"/>
<source>preferred</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../clientsettingsdlg.cpp" line="457"/>
<location filename="../../clientsettingsdlg.cpp" line="461"/>
@ -1301,7 +1390,7 @@
</message>
<message>
<location filename="../../connectdlg.cpp" line="62"/>
<source> server software must be set here. An optional port number can be added after the IP address or URL using a comma as a separator, e.g, example.org:</source>
<source> server software must be set here. An optional port number can be added after the IP address or URL using a colon as a separator, e.g, example.org:</source>
<translation> deve ser definido aqui. Um número de porta opcional pode ser adicionado após o endereço IP ou URL usando o caractere dois pontos como separador, por exemplo, example.org:</translation>
</message>
<message>
@ -1326,7 +1415,7 @@
</message>
<message>
<location filename="../../connectdlg.cpp" line="78"/>
<source>The server list is filered by the given text. Note that the filter is case insensitive.</source>
<source>The server list is filtered by the given text. Note that the filter is case insensitive.</source>
<translation>A lista de servidores é filtrada pelo texto fornecido. Note que o filtro não diferencia maiúsculas de minúsculas.</translation>
</message>
<message>
@ -1406,23 +1495,28 @@
<context>
<name>CHelpMenu</name>
<message>
<location filename="../../util.cpp" line="831"/>
<location filename="../../util.cpp" line="836"/>
<location filename="../../util.cpp" line="840"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="845"/>
<location filename="../../util.cpp" line="850"/>
<source>Getting &amp;Started...</source>
<translation>Como Começa&amp;r...</translation>
</message>
<message>
<location filename="../../util.cpp" line="832"/>
<location filename="../../util.cpp" line="846"/>
<source>Software &amp;Manual...</source>
<translation>&amp;Manual do Programa...</translation>
</message>
<message>
<location filename="../../util.cpp" line="839"/>
<location filename="../../util.cpp" line="853"/>
<source>What&apos;s &amp;This</source>
<translation>O que é &amp;isto</translation>
</message>
<message>
<location filename="../../util.cpp" line="841"/>
<location filename="../../util.cpp" line="855"/>
<source>&amp;About...</source>
<translation>&amp;Sobre...</translation>
</message>
@ -1430,102 +1524,102 @@
<context>
<name>CLicenceDlg</name>
<message>
<location filename="../../util.cpp" line="465"/>
<location filename="../../util.cpp" line="479"/>
<source>I &amp;agree to the above licence terms</source>
<translation>Eu &amp;aceito os termos da licença acima</translation>
</message>
<message>
<location filename="../../util.cpp" line="466"/>
<location filename="../../util.cpp" line="480"/>
<source>Accept</source>
<translation>Aceitar</translation>
</message>
<message>
<location filename="../../util.cpp" line="467"/>
<location filename="../../util.cpp" line="481"/>
<source>Decline</source>
<translation>Rejeitar</translation>
</message>
<message>
<location filename="../../util.cpp" line="483"/>
<location filename="../../util.cpp" line="497"/>
<source>By connecting to this server and agreeing to this notice, you agree to the following:</source>
<translation>Ao ligar-se a este servidor e concordar com este aviso, está a concordar com o seguinte:</translation>
</message>
<message>
<location filename="../../util.cpp" line="485"/>
<location filename="../../util.cpp" line="499"/>
<source>You agree that all data, sounds, or other works transmitted to this server are owned and created by you or your licensors, and that you are making these data, sounds or other works available via the following Creative Commons License (for more information on this license, see </source>
<translation>Você concorda que todos os dados, sons ou outros trabalhos transmitidos para este servidor pertencem e são criados por você ou por seus licenciadores, e que você está disponibilizando esses dados, sons ou outros trabalhos através da seguinte licença Creative Commons (para obter mais informações sobre esta licença, consulte </translation>
</message>
<message>
<location filename="../../util.cpp" line="493"/>
<location filename="../../util.cpp" line="507"/>
<source>You are free to:</source>
<translation>Você tem o direito de:</translation>
</message>
<message>
<location filename="../../util.cpp" line="495"/>
<location filename="../../util.cpp" line="509"/>
<source>Share</source>
<translation>Compartilhar</translation>
</message>
<message>
<location filename="../../util.cpp" line="496"/>
<location filename="../../util.cpp" line="510"/>
<source>copy and redistribute the material in any medium or format</source>
<translation>copiar e redistribuir o material em qualquer suporte ou formato</translation>
</message>
<message>
<location filename="../../util.cpp" line="497"/>
<location filename="../../util.cpp" line="511"/>
<source>Adapt</source>
<translation>Adaptar</translation>
</message>
<message>
<location filename="../../util.cpp" line="498"/>
<location filename="../../util.cpp" line="512"/>
<source>remix, transform, and build upon the material</source>
<translation>remisturar, transformar, e criar a partir do material</translation>
</message>
<message>
<location filename="../../util.cpp" line="499"/>
<location filename="../../util.cpp" line="513"/>
<source>The licensor cannot revoke these freedoms as long as you follow the license terms.</source>
<translation>O licenciante não pode revogar estes direitos desde que você respeite os termos da licença.</translation>
</message>
<message>
<location filename="../../util.cpp" line="501"/>
<location filename="../../util.cpp" line="515"/>
<source>Under the following terms:</source>
<translation>De acordo com os termos seguintes:</translation>
</message>
<message>
<location filename="../../util.cpp" line="503"/>
<location filename="../../util.cpp" line="517"/>
<source>Attribution</source>
<translation>Atribuição</translation>
</message>
<message>
<location filename="../../util.cpp" line="504"/>
<location filename="../../util.cpp" line="518"/>
<source>You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.</source>
<translation>Você deve atribuir o devido crédito, fornecer um link para a licença, e indicar se foram feitas alterações. Você pode fazê-lo de qualquer forma razoável, mas não de uma forma que sugira que o licenciante o apoia ou aprova o seu uso.</translation>
</message>
<message>
<location filename="../../util.cpp" line="507"/>
<location filename="../../util.cpp" line="521"/>
<source>NonCommercial</source>
<translation>NãoComercial</translation>
</message>
<message>
<location filename="../../util.cpp" line="508"/>
<location filename="../../util.cpp" line="522"/>
<source>You may not use the material for commercial purposes.</source>
<translation>Você não pode usar o material para fins comerciais.</translation>
</message>
<message>
<location filename="../../util.cpp" line="509"/>
<location filename="../../util.cpp" line="523"/>
<source>ShareAlike</source>
<translation>CompartilhaIgual</translation>
</message>
<message>
<location filename="../../util.cpp" line="510"/>
<location filename="../../util.cpp" line="524"/>
<source>If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.</source>
<translation>Se você remisturar, transformar, ou criar a partir do material, tem de distribuir as suas contribuições ao abrigo da mesma licença que o original.</translation>
</message>
<message>
<location filename="../../util.cpp" line="512"/>
<location filename="../../util.cpp" line="526"/>
<source>No additional restrictions</source>
<translation>Sem restrições adicionais</translation>
</message>
<message>
<location filename="../../util.cpp" line="513"/>
<location filename="../../util.cpp" line="527"/>
<source>You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.</source>
<translation>Você não pode aplicar termos jurídicos ou medidas de caráter tecnológico que restrinjam legalmente outros de fazerem algo que a licença permita.</translation>
</message>
@ -1533,263 +1627,273 @@
<context>
<name>CMusProfDlg</name>
<message>
<location filename="../../util.cpp" line="697"/>
<location filename="../../util.cpp" line="711"/>
<source> server. This tag will also show up at each client which is connected to the same server as you. If the name is left empty, the IP address is shown instead.</source>
<translation>. Esta identificação também será exibida em cada cliente ligado ao mesmo servidor que você. Se o nome estiver vazio, o endereço IP será mostrado.</translation>
</message>
<message>
<location filename="../../util.cpp" line="702"/>
<location filename="../../util.cpp" line="716"/>
<source>Alias or name edit box</source>
<translation>Caixa de edição do nome ou pseudônimo</translation>
</message>
<message>
<location filename="../../util.cpp" line="704"/>
<location filename="../../util.cpp" line="718"/>
<source>Instrument picture button</source>
<translation>Botão da imagem do instrumento</translation>
</message>
<message>
<location filename="../../util.cpp" line="706"/>
<location filename="../../util.cpp" line="720"/>
<source>Country flag button</source>
<translation>Botão da bandeira do país</translation>
</message>
<message>
<location filename="../../util.cpp" line="708"/>
<location filename="../../util.cpp" line="722"/>
<source>City edit box</source>
<translation>Caixa de edição da cidade</translation>
</message>
<message>
<location filename="../../util.cpp" line="710"/>
<location filename="../../util.cpp" line="724"/>
<source>Skill level combo box</source>
<translation>Caixa do nível de habilidade</translation>
</message>
<message>
<location filename="../../util.cpp" line="655"/>
<location filename="../../util.cpp" line="667"/>
<location filename="../../util.cpp" line="959"/>
<location filename="../../util.cpp" line="669"/>
<location filename="../../util.cpp" line="681"/>
<location filename="../../util.cpp" line="973"/>
<source>None</source>
<translation>Nenhum</translation>
</message>
<message>
<location filename="../../util.cpp" line="542"/>
<location filename="../../util.cpp" line="690"/>
<location filename="../../util.cpp" line="556"/>
<location filename="../../util.cpp" line="704"/>
<source>Musician Profile</source>
<translation>Perfil do músico</translation>
</message>
<message>
<location filename="../../util.cpp" line="547"/>
<location filename="../../util.cpp" line="561"/>
<source>Alias/Name</source>
<translation>Nome/Alcunha</translation>
</message>
<message>
<location filename="../../util.cpp" line="549"/>
<location filename="../../util.cpp" line="563"/>
<source>Instrument</source>
<translation>Instrumento</translation>
</message>
<message>
<location filename="../../util.cpp" line="551"/>
<location filename="../../util.cpp" line="565"/>
<source>Country</source>
<translation>País</translation>
</message>
<message>
<location filename="../../util.cpp" line="553"/>
<location filename="../../util.cpp" line="567"/>
<source>City</source>
<translation>Cidade</translation>
</message>
<message>
<location filename="../../util.cpp" line="555"/>
<location filename="../../util.cpp" line="569"/>
<source>Skill</source>
<translation>Habilidade</translation>
</message>
<message>
<location filename="../../util.cpp" line="557"/>
<location filename="../../util.cpp" line="571"/>
<source>&amp;Close</source>
<translation>&amp;Fechar</translation>
</message>
<message>
<location filename="../../util.cpp" line="673"/>
<location filename="../../util.cpp" line="687"/>
<source>Beginner</source>
<translation>Principiante</translation>
</message>
<message>
<location filename="../../util.cpp" line="679"/>
<location filename="../../util.cpp" line="693"/>
<source>Intermediate</source>
<translation>Intermediário</translation>
</message>
<message>
<location filename="../../util.cpp" line="685"/>
<location filename="../../util.cpp" line="699"/>
<source>Expert</source>
<translation>Avançado</translation>
</message>
<message>
<location filename="../../util.cpp" line="690"/>
<location filename="../../util.cpp" line="704"/>
<source>Set your name or an alias here so that the other musicians you want to play with know who you are. Additionally you may set an instrument picture of the instrument you play and a flag of the country you are living. The city you live in and the skill level of playing your instrument may also be added.</source>
<translation>Defina o seu nome ou um pseudônimo aqui para que os outros músicos com quem quer tocar saibam quem você é. Além disso, pode definir uma imagem do instrumento que toca e uma bandeira do país em que vive. A cidade em que vive e o nível de habilidade com o seu instrumento também podem ser adicionados.</translation>
</message>
<message>
<location filename="../../util.cpp" line="695"/>
<location filename="../../util.cpp" line="709"/>
<source>What you set here will appear at your fader on the mixer board when you are connected to a </source>
<translation>O que definir aqui aparecerá por baixo do seu fader na secção de mistura quando estiver ligado a um servidor </translation>
</message>
<message>
<location filename="../../util.cpp" line="960"/>
<location filename="../../util.cpp" line="974"/>
<source>Drum Set</source>
<translation>Bateria</translation>
</message>
<message>
<location filename="../../util.cpp" line="961"/>
<location filename="../../util.cpp" line="975"/>
<source>Djembe</source>
<translation>Djembe</translation>
</message>
<message>
<location filename="../../util.cpp" line="962"/>
<location filename="../../util.cpp" line="976"/>
<source>Electric Guitar</source>
<translation>Guitarra Elétrica</translation>
</message>
<message>
<location filename="../../util.cpp" line="963"/>
<location filename="../../util.cpp" line="977"/>
<source>Acoustic Guitar</source>
<translation>Guitarra Acústica</translation>
</message>
<message>
<location filename="../../util.cpp" line="964"/>
<location filename="../../util.cpp" line="978"/>
<source>Bass Guitar</source>
<translation>Baixo</translation>
</message>
<message>
<location filename="../../util.cpp" line="965"/>
<location filename="../../util.cpp" line="979"/>
<source>Keyboard</source>
<translation>Teclado</translation>
</message>
<message>
<location filename="../../util.cpp" line="966"/>
<location filename="../../util.cpp" line="980"/>
<source>Synthesizer</source>
<translation>Sintetizador</translation>
</message>
<message>
<location filename="../../util.cpp" line="967"/>
<location filename="../../util.cpp" line="981"/>
<source>Grand Piano</source>
<translation>Piano de Cauda</translation>
</message>
<message>
<location filename="../../util.cpp" line="968"/>
<location filename="../../util.cpp" line="982"/>
<source>Accordion</source>
<translation>Acordeão</translation>
</message>
<message>
<location filename="../../util.cpp" line="969"/>
<location filename="../../util.cpp" line="983"/>
<source>Vocal</source>
<translation>Voz</translation>
</message>
<message>
<location filename="../../util.cpp" line="970"/>
<location filename="../../util.cpp" line="984"/>
<source>Microphone</source>
<translation>Microfone</translation>
</message>
<message>
<location filename="../../util.cpp" line="971"/>
<location filename="../../util.cpp" line="985"/>
<source>Harmonica</source>
<translation>Harmónica</translation>
</message>
<message>
<location filename="../../util.cpp" line="972"/>
<location filename="../../util.cpp" line="986"/>
<source>Trumpet</source>
<translation>Trompete</translation>
</message>
<message>
<location filename="../../util.cpp" line="973"/>
<location filename="../../util.cpp" line="987"/>
<source>Trombone</source>
<translation>Trombone</translation>
</message>
<message>
<location filename="../../util.cpp" line="974"/>
<location filename="../../util.cpp" line="988"/>
<source>French Horn</source>
<translation>Trompa Francesa</translation>
</message>
<message>
<location filename="../../util.cpp" line="975"/>
<location filename="../../util.cpp" line="989"/>
<source>Tuba</source>
<translation>Tuba</translation>
</message>
<message>
<location filename="../../util.cpp" line="976"/>
<location filename="../../util.cpp" line="990"/>
<source>Saxophone</source>
<translation>Saxofone</translation>
</message>
<message>
<location filename="../../util.cpp" line="977"/>
<location filename="../../util.cpp" line="991"/>
<source>Clarinet</source>
<translation>Clarinete</translation>
</message>
<message>
<location filename="../../util.cpp" line="978"/>
<location filename="../../util.cpp" line="992"/>
<source>Flute</source>
<translation>Flauta</translation>
</message>
<message>
<location filename="../../util.cpp" line="979"/>
<location filename="../../util.cpp" line="993"/>
<source>Violin</source>
<translation>Violino</translation>
</message>
<message>
<location filename="../../util.cpp" line="980"/>
<location filename="../../util.cpp" line="994"/>
<source>Cello</source>
<translation>Violoncelo</translation>
</message>
<message>
<location filename="../../util.cpp" line="981"/>
<location filename="../../util.cpp" line="995"/>
<source>Double Bass</source>
<translation>Contrabaixo</translation>
</message>
<message>
<location filename="../../util.cpp" line="982"/>
<location filename="../../util.cpp" line="996"/>
<source>Recorder</source>
<translation>Gravador</translation>
</message>
<message>
<location filename="../../util.cpp" line="983"/>
<location filename="../../util.cpp" line="997"/>
<source>Streamer</source>
<translation>Streamer</translation>
</message>
<message>
<location filename="../../util.cpp" line="984"/>
<location filename="../../util.cpp" line="998"/>
<source>Listener</source>
<translation>Ouvinte</translation>
</message>
<message>
<location filename="../../util.cpp" line="985"/>
<location filename="../../util.cpp" line="999"/>
<source>Guitar+Vocal</source>
<translation>Guitarra+Voz</translation>
</message>
<message>
<location filename="../../util.cpp" line="986"/>
<location filename="../../util.cpp" line="1000"/>
<source>Keyboard+Vocal</source>
<translation>Teclado+Voz</translation>
</message>
<message>
<location filename="../../util.cpp" line="987"/>
<location filename="../../util.cpp" line="1001"/>
<source>Bodhran</source>
<translation>Bodhrán</translation>
</message>
<message>
<location filename="../../util.cpp" line="988"/>
<location filename="../../util.cpp" line="1002"/>
<source>Bassoon</source>
<translation>Fagote</translation>
</message>
<message>
<location filename="../../util.cpp" line="989"/>
<location filename="../../util.cpp" line="1003"/>
<source>Oboe</source>
<translation>Oboé</translation>
</message>
<message>
<location filename="../../util.cpp" line="990"/>
<location filename="../../util.cpp" line="1004"/>
<source>Harp</source>
<translation>Harpa</translation>
</message>
<message>
<location filename="../../util.cpp" line="991"/>
<location filename="../../util.cpp" line="1005"/>
<source>Viola</source>
<translation>Viola de Arco</translation>
</message>
<message>
<location filename="../../util.cpp" line="1006"/>
<source>Congas</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../util.cpp" line="1007"/>
<source>Bongo</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CServerDlg</name>
@ -1977,42 +2081,42 @@
<translation>&amp;Janela</translation>
</message>
<message>
<location filename="../../util.h" line="593"/>
<location filename="../../util.h" line="591"/>
<source>Unregistered</source>
<translation>Não Registado</translation>
</message>
<message>
<location filename="../../util.h" line="596"/>
<location filename="../../util.h" line="594"/>
<source>Bad address</source>
<translation>Endereço incorrecto</translation>
</message>
<message>
<location filename="../../util.h" line="599"/>
<location filename="../../util.h" line="597"/>
<source>Registration requested</source>
<translation>Registo solicitado</translation>
</message>
<message>
<location filename="../../util.h" line="602"/>
<location filename="../../util.h" line="600"/>
<source>Registration failed</source>
<translation>Falha no registo</translation>
</message>
<message>
<location filename="../../util.h" line="605"/>
<location filename="../../util.h" line="603"/>
<source>Check server version</source>
<translation>Verifique versão do servidor</translation>
</message>
<message>
<location filename="../../util.h" line="608"/>
<location filename="../../util.h" line="606"/>
<source>Registered</source>
<translation>Registado</translation>
</message>
<message>
<location filename="../../util.h" line="611"/>
<location filename="../../util.h" line="609"/>
<source>Central Server full</source>
<translation>Servidor Central Cheio</translation>
</message>
<message>
<location filename="../../util.h" line="614"/>
<location filename="../../util.h" line="612"/>
<source>Unknown value </source>
<translation>Valor desconhecido </translation>
</message>
@ -2120,7 +2224,7 @@
<translation>Não é possível ativar o cliente Jack.</translation>
</message>
<message>
<location filename="../../../linux/sound.cpp" line="337"/>
<location filename="../../../linux/sound.cpp" line="197"/>
<source>The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue.</source>
<translation>O servidor Jack foi desligado. Este programa requer um servidor Jack para ser executado. Tente reiniciar o programa para resolver o problema.</translation>
</message>
@ -2210,6 +2314,11 @@
<source> software requires the low latency audio interface ASIO to work properly. This is no standard Windows audio interface and therefore a special audio driver is required. Either your sound card has a native ASIO driver (which is recommended) or you might want to use alternative drivers like the ASIO4All driver.</source>
<translation> requer que a interface de áudio de baixa latência ASIO funcione corretamente. Esta não é uma interface de áudio padrão do Windows e, portanto, é necessário um driver de áudio especial. Ou a sua placa de som possui um driver ASIO nativo (recomendado), ou pode usar drivers alternativos, como o driver ASIO4All.</translation>
</message>
<message>
<location filename="../../../android/sound.cpp" line="137"/>
<source>Error closing stream: $s</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSoundBase</name>
@ -2259,4 +2368,12 @@
<translation> não pôde ser iniciado devido a problemas na interface de áudio.</translation>
</message>
</context>
<context>
<name>global</name>
<message>
<location filename="../../global.h" line="237"/>
<source>For more information use the What&apos;s This help (help menu, right mouse button or Shift+F1)</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -11,6 +11,9 @@
<qresource prefix="/translations" lang="es">
<file alias="translation.qm">res/translation/translation_es_ES.qm</file>
</qresource>
<qresource prefix="/translations" lang="nl">
<file alias="translation.qm">res/translation/translation_nl_NL.qm</file>
</qresource>
<qresource prefix="/png/LEDs">
<file>res/CLEDDisabledSmall.png</file>
<file>res/CLEDGreenArrow.png</file>
@ -66,6 +69,8 @@
<file>res/instruments/oboe.png</file>
<file>res/instruments/harp.png</file>
<file>res/instruments/viola.png</file>
<file>res/instruments/congas.png</file>
<file>res/instruments/bongo.png</file>
</qresource>
<qresource prefix="/png/main">
<file>res/fronticon.png</file>

View File

@ -231,27 +231,28 @@ CServer::CServer ( const int iNewMaxNumChan,
const QString& strNewWelcomeMessage,
const QString& strRecordingDirName,
const bool bNCentServPingServerInList,
const bool bNDisconnectAllClients,
const bool bNDisconnectAllClientsOnQuit,
const bool bNUseDoubleSystemFrameSize,
const ELicenceType eNLicenceType ) :
bUseDoubleSystemFrameSize ( bNUseDoubleSystemFrameSize ),
iMaxNumChannels ( iNewMaxNumChan ),
Socket ( this, iPortNumber ),
Logging ( iMaxDaysHistory ),
JamRecorder ( strRecordingDirName ),
bEnableRecording ( !strRecordingDirName.isEmpty() ),
bWriteStatusHTMLFile ( false ),
HighPrecisionTimer ( bNUseDoubleSystemFrameSize ),
ServerListManager ( iPortNumber,
strCentralServer,
strServerInfo,
iNewMaxNumChan,
bNCentServPingServerInList,
&ConnLessProtocol ),
bAutoRunMinimized ( false ),
strWelcomeMessage ( strNewWelcomeMessage ),
eLicenceType ( eNLicenceType ),
bDisconnectAllClients ( bNDisconnectAllClients )
bUseDoubleSystemFrameSize ( bNUseDoubleSystemFrameSize ),
iMaxNumChannels ( iNewMaxNumChan ),
Socket ( this, iPortNumber ),
Logging ( iMaxDaysHistory ),
JamRecorder ( strRecordingDirName ),
bEnableRecording ( !strRecordingDirName.isEmpty() ),
bWriteStatusHTMLFile ( false ),
HighPrecisionTimer ( bNUseDoubleSystemFrameSize ),
ServerListManager ( iPortNumber,
strCentralServer,
strServerInfo,
iNewMaxNumChan,
bNCentServPingServerInList,
&ConnLessProtocol ),
bAutoRunMinimized ( false ),
strWelcomeMessage ( strNewWelcomeMessage ),
eLicenceType ( eNLicenceType ),
bDisconnectAllClientsOnQuit ( bNDisconnectAllClientsOnQuit ),
pSignalHandler ( CSignalHandler::getSingletonP() )
{
int iOpusError;
int i;
@ -398,11 +399,10 @@ CServer::CServer ( const int iNewMaxNumChan,
QString().number( static_cast<int> ( iPortNumber ) ) );
}
// Enable jam recording (if requested)
// Enable jam recording (if requested) - kicks off the thread
if ( bEnableRecording )
{
JamRecorder.Init ( this, iServerFrameSizeSamples );
JamRecorder.start();
}
// enable all channels (for the server all channel must be enabled the
@ -466,281 +466,21 @@ CServer::CServer ( const int iNewMaxNumChan,
SIGNAL ( SvrRegStatusChanged() ),
this, SLOT ( OnSvrRegStatusChanged() ) );
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
QObject::connect ( QCoreApplication::instance(),
SIGNAL ( aboutToQuit() ),
this, SLOT ( OnAboutToQuit() ) );
QObject::connect ( pSignalHandler,
SIGNAL ( ShutdownSignal ( int ) ),
this, SLOT ( OnShutdown ( int ) ) );
connectChannelSignalsToServerSlots<MAX_NUM_CHANNELS>();
#else
// CODE TAG: MAX_NUM_CHANNELS_TAG
// make sure we have MAX_NUM_CHANNELS connections!!!
// send message
QObject::connect ( &vecChannels[0], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh0 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[1], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh1 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[2], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh2 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[3], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh3 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[4], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh4 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[5], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh5 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[6], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh6 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[7], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh7 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[8], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh8 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[9], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh9 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[10], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh10 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[11], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh11 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[12], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh12 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[13], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh13 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[14], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh14 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[15], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh15 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[16], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh16 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[17], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh17 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[18], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh18 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[19], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh19 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[20], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh20 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[21], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh21 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[22], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh22 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[23], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh23 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[24], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh24 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[25], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh25 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[26], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh26 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[27], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh27 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[28], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh28 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[29], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh29 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[30], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh30 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[31], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh31 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[32], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh32 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[33], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh33 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[34], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh34 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[35], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh35 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[36], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh36 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[37], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh37 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[38], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh38 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[39], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh39 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[40], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh40 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[41], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh41 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[42], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh42 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[43], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh43 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[44], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh44 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[45], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh45 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[46], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh46 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[47], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh47 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[48], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh48 ( CVector<uint8_t> ) ) );
QObject::connect ( &vecChannels[49], SIGNAL ( MessReadyForSending ( CVector<uint8_t> ) ), this, SLOT ( OnSendProtMessCh49 ( CVector<uint8_t> ) ) );
// request connected clients list
QObject::connect ( &vecChannels[0], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh0() ) );
QObject::connect ( &vecChannels[1], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh1() ) );
QObject::connect ( &vecChannels[2], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh2() ) );
QObject::connect ( &vecChannels[3], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh3() ) );
QObject::connect ( &vecChannels[4], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh4() ) );
QObject::connect ( &vecChannels[5], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh5() ) );
QObject::connect ( &vecChannels[6], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh6() ) );
QObject::connect ( &vecChannels[7], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh7() ) );
QObject::connect ( &vecChannels[8], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh8() ) );
QObject::connect ( &vecChannels[9], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh9() ) );
QObject::connect ( &vecChannels[10], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh10() ) );
QObject::connect ( &vecChannels[11], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh11() ) );
QObject::connect ( &vecChannels[12], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh12() ) );
QObject::connect ( &vecChannels[13], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh13() ) );
QObject::connect ( &vecChannels[14], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh14() ) );
QObject::connect ( &vecChannels[15], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh15() ) );
QObject::connect ( &vecChannels[16], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh16() ) );
QObject::connect ( &vecChannels[17], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh17() ) );
QObject::connect ( &vecChannels[18], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh18() ) );
QObject::connect ( &vecChannels[19], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh19() ) );
QObject::connect ( &vecChannels[20], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh20() ) );
QObject::connect ( &vecChannels[21], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh21() ) );
QObject::connect ( &vecChannels[22], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh22() ) );
QObject::connect ( &vecChannels[23], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh23() ) );
QObject::connect ( &vecChannels[24], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh24() ) );
QObject::connect ( &vecChannels[25], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh25() ) );
QObject::connect ( &vecChannels[26], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh26() ) );
QObject::connect ( &vecChannels[27], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh27() ) );
QObject::connect ( &vecChannels[28], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh28() ) );
QObject::connect ( &vecChannels[29], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh29() ) );
QObject::connect ( &vecChannels[30], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh30() ) );
QObject::connect ( &vecChannels[31], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh31() ) );
QObject::connect ( &vecChannels[32], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh32() ) );
QObject::connect ( &vecChannels[33], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh33() ) );
QObject::connect ( &vecChannels[34], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh34() ) );
QObject::connect ( &vecChannels[35], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh35() ) );
QObject::connect ( &vecChannels[36], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh36() ) );
QObject::connect ( &vecChannels[37], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh37() ) );
QObject::connect ( &vecChannels[38], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh38() ) );
QObject::connect ( &vecChannels[39], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh39() ) );
QObject::connect ( &vecChannels[40], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh40() ) );
QObject::connect ( &vecChannels[41], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh41() ) );
QObject::connect ( &vecChannels[42], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh42() ) );
QObject::connect ( &vecChannels[43], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh43() ) );
QObject::connect ( &vecChannels[44], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh44() ) );
QObject::connect ( &vecChannels[45], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh45() ) );
QObject::connect ( &vecChannels[46], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh46() ) );
QObject::connect ( &vecChannels[47], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh47() ) );
QObject::connect ( &vecChannels[48], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh48() ) );
QObject::connect ( &vecChannels[49], SIGNAL ( ReqConnClientsList() ), this, SLOT ( OnReqConnClientsListCh49() ) );
// channel info has changed
QObject::connect ( &vecChannels[0], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh0() ) );
QObject::connect ( &vecChannels[1], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh1() ) );
QObject::connect ( &vecChannels[2], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh2() ) );
QObject::connect ( &vecChannels[3], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh3() ) );
QObject::connect ( &vecChannels[4], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh4() ) );
QObject::connect ( &vecChannels[5], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh5() ) );
QObject::connect ( &vecChannels[6], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh6() ) );
QObject::connect ( &vecChannels[7], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh7() ) );
QObject::connect ( &vecChannels[8], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh8() ) );
QObject::connect ( &vecChannels[9], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh9() ) );
QObject::connect ( &vecChannels[10], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh10() ) );
QObject::connect ( &vecChannels[11], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh11() ) );
QObject::connect ( &vecChannels[12], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh12() ) );
QObject::connect ( &vecChannels[13], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh13() ) );
QObject::connect ( &vecChannels[14], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh14() ) );
QObject::connect ( &vecChannels[15], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh15() ) );
QObject::connect ( &vecChannels[16], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh16() ) );
QObject::connect ( &vecChannels[17], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh17() ) );
QObject::connect ( &vecChannels[18], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh18() ) );
QObject::connect ( &vecChannels[19], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh19() ) );
QObject::connect ( &vecChannels[20], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh20() ) );
QObject::connect ( &vecChannels[21], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh21() ) );
QObject::connect ( &vecChannels[22], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh22() ) );
QObject::connect ( &vecChannels[23], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh23() ) );
QObject::connect ( &vecChannels[24], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh24() ) );
QObject::connect ( &vecChannels[25], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh25() ) );
QObject::connect ( &vecChannels[26], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh26() ) );
QObject::connect ( &vecChannels[27], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh27() ) );
QObject::connect ( &vecChannels[28], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh28() ) );
QObject::connect ( &vecChannels[29], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh29() ) );
QObject::connect ( &vecChannels[30], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh30() ) );
QObject::connect ( &vecChannels[31], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh31() ) );
QObject::connect ( &vecChannels[32], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh32() ) );
QObject::connect ( &vecChannels[33], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh33() ) );
QObject::connect ( &vecChannels[34], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh34() ) );
QObject::connect ( &vecChannels[35], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh35() ) );
QObject::connect ( &vecChannels[36], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh36() ) );
QObject::connect ( &vecChannels[37], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh37() ) );
QObject::connect ( &vecChannels[38], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh38() ) );
QObject::connect ( &vecChannels[39], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh39() ) );
QObject::connect ( &vecChannels[40], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh40() ) );
QObject::connect ( &vecChannels[41], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh41() ) );
QObject::connect ( &vecChannels[42], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh42() ) );
QObject::connect ( &vecChannels[43], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh43() ) );
QObject::connect ( &vecChannels[44], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh44() ) );
QObject::connect ( &vecChannels[45], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh45() ) );
QObject::connect ( &vecChannels[46], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh46() ) );
QObject::connect ( &vecChannels[47], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh47() ) );
QObject::connect ( &vecChannels[48], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh48() ) );
QObject::connect ( &vecChannels[49], SIGNAL ( ChanInfoHasChanged() ), this, SLOT ( OnChanInfoHasChangedCh49() ) );
// chat text received
QObject::connect ( &vecChannels[0], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh0 ( QString ) ) );
QObject::connect ( &vecChannels[1], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh1 ( QString ) ) );
QObject::connect ( &vecChannels[2], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh2 ( QString ) ) );
QObject::connect ( &vecChannels[3], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh3 ( QString ) ) );
QObject::connect ( &vecChannels[4], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh4 ( QString ) ) );
QObject::connect ( &vecChannels[5], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh5 ( QString ) ) );
QObject::connect ( &vecChannels[6], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh6 ( QString ) ) );
QObject::connect ( &vecChannels[7], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh7 ( QString ) ) );
QObject::connect ( &vecChannels[8], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh8 ( QString ) ) );
QObject::connect ( &vecChannels[9], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh9 ( QString ) ) );
QObject::connect ( &vecChannels[10], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh10 ( QString ) ) );
QObject::connect ( &vecChannels[11], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh11 ( QString ) ) );
QObject::connect ( &vecChannels[12], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh12 ( QString ) ) );
QObject::connect ( &vecChannels[13], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh13 ( QString ) ) );
QObject::connect ( &vecChannels[14], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh14 ( QString ) ) );
QObject::connect ( &vecChannels[15], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh15 ( QString ) ) );
QObject::connect ( &vecChannels[16], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh16 ( QString ) ) );
QObject::connect ( &vecChannels[17], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh17 ( QString ) ) );
QObject::connect ( &vecChannels[18], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh18 ( QString ) ) );
QObject::connect ( &vecChannels[19], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh19 ( QString ) ) );
QObject::connect ( &vecChannels[20], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh20 ( QString ) ) );
QObject::connect ( &vecChannels[21], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh21 ( QString ) ) );
QObject::connect ( &vecChannels[22], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh22 ( QString ) ) );
QObject::connect ( &vecChannels[23], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh23 ( QString ) ) );
QObject::connect ( &vecChannels[24], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh24 ( QString ) ) );
QObject::connect ( &vecChannels[25], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh25 ( QString ) ) );
QObject::connect ( &vecChannels[26], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh26 ( QString ) ) );
QObject::connect ( &vecChannels[27], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh27 ( QString ) ) );
QObject::connect ( &vecChannels[28], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh28 ( QString ) ) );
QObject::connect ( &vecChannels[29], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh29 ( QString ) ) );
QObject::connect ( &vecChannels[30], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh30 ( QString ) ) );
QObject::connect ( &vecChannels[31], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh31 ( QString ) ) );
QObject::connect ( &vecChannels[32], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh32 ( QString ) ) );
QObject::connect ( &vecChannels[33], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh33 ( QString ) ) );
QObject::connect ( &vecChannels[34], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh34 ( QString ) ) );
QObject::connect ( &vecChannels[35], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh35 ( QString ) ) );
QObject::connect ( &vecChannels[36], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh36 ( QString ) ) );
QObject::connect ( &vecChannels[37], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh37 ( QString ) ) );
QObject::connect ( &vecChannels[38], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh38 ( QString ) ) );
QObject::connect ( &vecChannels[39], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh39 ( QString ) ) );
QObject::connect ( &vecChannels[40], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh40 ( QString ) ) );
QObject::connect ( &vecChannels[41], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh41 ( QString ) ) );
QObject::connect ( &vecChannels[42], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh42 ( QString ) ) );
QObject::connect ( &vecChannels[43], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh43 ( QString ) ) );
QObject::connect ( &vecChannels[44], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh44 ( QString ) ) );
QObject::connect ( &vecChannels[45], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh45 ( QString ) ) );
QObject::connect ( &vecChannels[46], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh46 ( QString ) ) );
QObject::connect ( &vecChannels[47], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh47 ( QString ) ) );
QObject::connect ( &vecChannels[48], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh48 ( QString ) ) );
QObject::connect ( &vecChannels[49], SIGNAL ( ChatTextReceived ( QString ) ), this, SLOT ( OnChatTextReceivedCh49 ( QString ) ) );
// auto socket buffer size change
QObject::connect ( &vecChannels[0], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh0 ( int ) ) );
QObject::connect ( &vecChannels[1], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh1 ( int ) ) );
QObject::connect ( &vecChannels[2], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh2 ( int ) ) );
QObject::connect ( &vecChannels[3], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh3 ( int ) ) );
QObject::connect ( &vecChannels[4], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh4 ( int ) ) );
QObject::connect ( &vecChannels[5], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh5 ( int ) ) );
QObject::connect ( &vecChannels[6], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh6 ( int ) ) );
QObject::connect ( &vecChannels[7], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh7 ( int ) ) );
QObject::connect ( &vecChannels[8], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh8 ( int ) ) );
QObject::connect ( &vecChannels[9], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh9 ( int ) ) );
QObject::connect ( &vecChannels[10], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh10 ( int ) ) );
QObject::connect ( &vecChannels[11], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh11 ( int ) ) );
QObject::connect ( &vecChannels[12], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh12 ( int ) ) );
QObject::connect ( &vecChannels[13], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh13 ( int ) ) );
QObject::connect ( &vecChannels[14], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh14 ( int ) ) );
QObject::connect ( &vecChannels[15], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh15 ( int ) ) );
QObject::connect ( &vecChannels[16], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh16 ( int ) ) );
QObject::connect ( &vecChannels[17], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh17 ( int ) ) );
QObject::connect ( &vecChannels[18], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh18 ( int ) ) );
QObject::connect ( &vecChannels[19], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh19 ( int ) ) );
QObject::connect ( &vecChannels[20], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh20 ( int ) ) );
QObject::connect ( &vecChannels[21], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh21 ( int ) ) );
QObject::connect ( &vecChannels[22], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh22 ( int ) ) );
QObject::connect ( &vecChannels[23], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh23 ( int ) ) );
QObject::connect ( &vecChannels[24], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh24 ( int ) ) );
QObject::connect ( &vecChannels[25], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh25 ( int ) ) );
QObject::connect ( &vecChannels[26], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh26 ( int ) ) );
QObject::connect ( &vecChannels[27], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh27 ( int ) ) );
QObject::connect ( &vecChannels[28], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh28 ( int ) ) );
QObject::connect ( &vecChannels[29], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh29 ( int ) ) );
QObject::connect ( &vecChannels[30], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh30 ( int ) ) );
QObject::connect ( &vecChannels[31], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh31 ( int ) ) );
QObject::connect ( &vecChannels[32], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh32 ( int ) ) );
QObject::connect ( &vecChannels[33], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh33 ( int ) ) );
QObject::connect ( &vecChannels[34], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh34 ( int ) ) );
QObject::connect ( &vecChannels[35], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh35 ( int ) ) );
QObject::connect ( &vecChannels[36], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh36 ( int ) ) );
QObject::connect ( &vecChannels[37], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh37 ( int ) ) );
QObject::connect ( &vecChannels[38], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh38 ( int ) ) );
QObject::connect ( &vecChannels[39], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh39 ( int ) ) );
QObject::connect ( &vecChannels[40], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh40 ( int ) ) );
QObject::connect ( &vecChannels[41], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh41 ( int ) ) );
QObject::connect ( &vecChannels[42], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh42 ( int ) ) );
QObject::connect ( &vecChannels[43], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh43 ( int ) ) );
QObject::connect ( &vecChannels[44], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh44 ( int ) ) );
QObject::connect ( &vecChannels[45], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh45 ( int ) ) );
QObject::connect ( &vecChannels[46], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh46 ( int ) ) );
QObject::connect ( &vecChannels[47], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh47 ( int ) ) );
QObject::connect ( &vecChannels[48], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh48 ( int ) ) );
QObject::connect ( &vecChannels[49], SIGNAL ( ServerAutoSockBufSizeChange ( int ) ), this, SLOT ( OnServerAutoSockBufSizeChangeCh49 ( int ) ) );
#endif
// start the socket (it is important to start the socket after all
// initializations and connections)
Socket.Start();
}
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
template<unsigned int slotId>
inline void CServer::connectChannelSignalsToServerSlots()
{
@ -768,15 +508,15 @@ inline void CServer::connectChannelSignalsToServerSlots()
// channel info has changed
QObject::connect ( &vecChannels[iCurChanID], &CChannel::ChanInfoHasChanged,
this, &CServer::CreateAndSendChanListForAllConChannels );
this, &CServer::CreateAndSendChanListForAllConChannels );
// chat text received
QObject::connect ( &vecChannels[iCurChanID], &CChannel::ChatTextReceived,
this, pOnChatTextReceivedCh );
this, pOnChatTextReceivedCh );
// auto socket buffer size change
QObject::connect ( &vecChannels[iCurChanID], &CChannel::ServerAutoSockBufSizeChange,
this, pOnServerAutoSockBufSizeChangeCh );
this, pOnServerAutoSockBufSizeChangeCh );
connectChannelSignalsToServerSlots<slotId - 1>();
};
@ -790,8 +530,6 @@ void CServer::CreateAndSendJitBufMessage ( const int iCurChanID,
vecChannels[iCurChanID].CreateJitBufMes ( iNNumFra );
}
#endif
void CServer::SendProtMessage ( int iChID, CVector<uint8_t> vecMessage )
{
// the protocol queries me to call the function to send the message
@ -802,14 +540,6 @@ void CServer::SendProtMessage ( int iChID, CVector<uint8_t> vecMessage )
void CServer::OnNewConnection ( int iChID,
CHostAddress RecHostAddr )
{
// in the special case that all clients shall be disconnected, just send the
// disconnect message and leave this function
if ( bDisconnectAllClients )
{
ConnLessProtocol.CreateCLDisconnection ( RecHostAddr );
return;
}
// on a new connection we query the network transport properties for the
// audio packets (to use the correct network block size and audio
// compression properties, etc.)
@ -908,6 +638,39 @@ void CServer::OnCLDisconnection ( CHostAddress InetAddr )
}
}
void CServer::OnAboutToQuit()
{
// if enabled, disconnect all clients on quit
if ( bDisconnectAllClientsOnQuit )
{
Mutex.lock();
{
for ( int i = 0; i < iMaxNumChannels; i++ )
{
if ( vecChannels[i].IsConnected() )
{
ConnLessProtocol.CreateCLDisconnection ( vecChannels[i].GetAddress() );
}
}
}
Mutex.unlock(); // release mutex
}
Stop();
// if server was registered at the central server, unregister on shutdown
if ( GetServerListEnabled() )
{
UnregisterSlaveServer();
}
}
void CServer::OnShutdown ( int )
{
// This should trigger OnAboutToQuit
QCoreApplication::instance()->exit();
}
void CServer::Start()
{
// only start if not already running
@ -1272,6 +1035,8 @@ opus_custom_encoder_ctl ( CurOpusEncoder,
// does not consume any significant CPU when no client is connected.
Stop();
}
Q_UNUSED ( iUnused )
}
/// @brief Mix all audio data from all clients together.

View File

@ -36,6 +36,7 @@
#endif
#include "global.h"
#include "buffer.h"
#include "signalhandler.h"
#include "socket.h"
#include "channel.h"
#include "util.h"
@ -116,8 +117,6 @@ signals:
};
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
template<unsigned int slotId>
class CServerSlots : public CServerSlots<slotId - 1>
{
@ -152,12 +151,6 @@ protected:
template<>
class CServerSlots<0> {};
#else
template<unsigned int slotId>
class CServerSlots {};
#endif
class CServer :
public QObject,
public CServerSlots<MAX_NUM_CHANNELS>
@ -177,7 +170,7 @@ public:
const QString& strNewWelcomeMessage,
const QString& strRecordingDirName,
const bool bNCentServPingServerInList,
const bool bNDisconnectAllClients,
const bool bNDisconnectAllClientsOnQuit,
const bool bNUseDoubleSystemFrameSize,
const ELicenceType eNLicenceType );
@ -257,9 +250,9 @@ protected:
int GetNumberOfConnectedClients();
CVector<CChannelInfo> CreateChannelList();
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
virtual void CreateAndSendChanListForAllConChannels();
virtual void CreateAndSendChanListForThisChan ( const int iCurChanID );
virtual void CreateAndSendChatTextForAllConChannels ( const int iCurChanID,
const QString& strChatText );
@ -272,17 +265,6 @@ protected:
template<unsigned int slotId>
inline void connectChannelSignalsToServerSlots();
#else
void CreateAndSendChanListForAllConChannels();
void CreateAndSendChanListForThisChan ( const int iCurChanID );
void CreateAndSendChatTextForAllConChannels ( const int iCurChanID,
const QString& strChatText );
void SendProtMessage ( int iChID,
CVector<uint8_t> vecMessage );
#endif
void WriteHTMLChannelList();
void ProcessData ( const CVector<CVector<int16_t> >& vecvecsData,
@ -368,7 +350,9 @@ protected:
// messaging
QString strWelcomeMessage;
ELicenceType eLicenceType;
bool bDisconnectAllClients;
bool bDisconnectAllClientsOnQuit;
CSignalHandler* pSignalHandler;
signals:
void Started();
@ -455,264 +439,7 @@ public slots:
void OnCLDisconnection ( CHostAddress InetAddr );
#if QT_VERSION < 0x50000 // MOC does not expand macros in Qt 4, so we cannot use QT_VERSION_CHECK(5, 0, 0)
// CODE TAG: MAX_NUM_CHANNELS_TAG
// make sure we have MAX_NUM_CHANNELS connections!!!
// send message
void OnSendProtMessCh0 ( CVector<uint8_t> mess ) { SendProtMessage ( 0, mess ); }
void OnSendProtMessCh1 ( CVector<uint8_t> mess ) { SendProtMessage ( 1, mess ); }
void OnSendProtMessCh2 ( CVector<uint8_t> mess ) { SendProtMessage ( 2, mess ); }
void OnSendProtMessCh3 ( CVector<uint8_t> mess ) { SendProtMessage ( 3, mess ); }
void OnSendProtMessCh4 ( CVector<uint8_t> mess ) { SendProtMessage ( 4, mess ); }
void OnSendProtMessCh5 ( CVector<uint8_t> mess ) { SendProtMessage ( 5, mess ); }
void OnSendProtMessCh6 ( CVector<uint8_t> mess ) { SendProtMessage ( 6, mess ); }
void OnSendProtMessCh7 ( CVector<uint8_t> mess ) { SendProtMessage ( 7, mess ); }
void OnSendProtMessCh8 ( CVector<uint8_t> mess ) { SendProtMessage ( 8, mess ); }
void OnSendProtMessCh9 ( CVector<uint8_t> mess ) { SendProtMessage ( 9, mess ); }
void OnSendProtMessCh10 ( CVector<uint8_t> mess ) { SendProtMessage ( 10, mess ); }
void OnSendProtMessCh11 ( CVector<uint8_t> mess ) { SendProtMessage ( 11, mess ); }
void OnSendProtMessCh12 ( CVector<uint8_t> mess ) { SendProtMessage ( 12, mess ); }
void OnSendProtMessCh13 ( CVector<uint8_t> mess ) { SendProtMessage ( 13, mess ); }
void OnSendProtMessCh14 ( CVector<uint8_t> mess ) { SendProtMessage ( 14, mess ); }
void OnSendProtMessCh15 ( CVector<uint8_t> mess ) { SendProtMessage ( 15, mess ); }
void OnSendProtMessCh16 ( CVector<uint8_t> mess ) { SendProtMessage ( 16, mess ); }
void OnSendProtMessCh17 ( CVector<uint8_t> mess ) { SendProtMessage ( 17, mess ); }
void OnSendProtMessCh18 ( CVector<uint8_t> mess ) { SendProtMessage ( 18, mess ); }
void OnSendProtMessCh19 ( CVector<uint8_t> mess ) { SendProtMessage ( 19, mess ); }
void OnSendProtMessCh20 ( CVector<uint8_t> mess ) { SendProtMessage ( 20, mess ); }
void OnSendProtMessCh21 ( CVector<uint8_t> mess ) { SendProtMessage ( 21, mess ); }
void OnSendProtMessCh22 ( CVector<uint8_t> mess ) { SendProtMessage ( 22, mess ); }
void OnSendProtMessCh23 ( CVector<uint8_t> mess ) { SendProtMessage ( 23, mess ); }
void OnSendProtMessCh24 ( CVector<uint8_t> mess ) { SendProtMessage ( 24, mess ); }
void OnSendProtMessCh25 ( CVector<uint8_t> mess ) { SendProtMessage ( 25, mess ); }
void OnSendProtMessCh26 ( CVector<uint8_t> mess ) { SendProtMessage ( 26, mess ); }
void OnSendProtMessCh27 ( CVector<uint8_t> mess ) { SendProtMessage ( 27, mess ); }
void OnSendProtMessCh28 ( CVector<uint8_t> mess ) { SendProtMessage ( 28, mess ); }
void OnSendProtMessCh29 ( CVector<uint8_t> mess ) { SendProtMessage ( 29, mess ); }
void OnSendProtMessCh30 ( CVector<uint8_t> mess ) { SendProtMessage ( 30, mess ); }
void OnSendProtMessCh31 ( CVector<uint8_t> mess ) { SendProtMessage ( 31, mess ); }
void OnSendProtMessCh32 ( CVector<uint8_t> mess ) { SendProtMessage ( 32, mess ); }
void OnSendProtMessCh33 ( CVector<uint8_t> mess ) { SendProtMessage ( 33, mess ); }
void OnSendProtMessCh34 ( CVector<uint8_t> mess ) { SendProtMessage ( 34, mess ); }
void OnSendProtMessCh35 ( CVector<uint8_t> mess ) { SendProtMessage ( 35, mess ); }
void OnSendProtMessCh36 ( CVector<uint8_t> mess ) { SendProtMessage ( 36, mess ); }
void OnSendProtMessCh37 ( CVector<uint8_t> mess ) { SendProtMessage ( 37, mess ); }
void OnSendProtMessCh38 ( CVector<uint8_t> mess ) { SendProtMessage ( 38, mess ); }
void OnSendProtMessCh39 ( CVector<uint8_t> mess ) { SendProtMessage ( 39, mess ); }
void OnSendProtMessCh40 ( CVector<uint8_t> mess ) { SendProtMessage ( 40, mess ); }
void OnSendProtMessCh41 ( CVector<uint8_t> mess ) { SendProtMessage ( 41, mess ); }
void OnSendProtMessCh42 ( CVector<uint8_t> mess ) { SendProtMessage ( 42, mess ); }
void OnSendProtMessCh43 ( CVector<uint8_t> mess ) { SendProtMessage ( 43, mess ); }
void OnSendProtMessCh44 ( CVector<uint8_t> mess ) { SendProtMessage ( 44, mess ); }
void OnSendProtMessCh45 ( CVector<uint8_t> mess ) { SendProtMessage ( 45, mess ); }
void OnSendProtMessCh46 ( CVector<uint8_t> mess ) { SendProtMessage ( 46, mess ); }
void OnSendProtMessCh47 ( CVector<uint8_t> mess ) { SendProtMessage ( 47, mess ); }
void OnSendProtMessCh48 ( CVector<uint8_t> mess ) { SendProtMessage ( 48, mess ); }
void OnSendProtMessCh49 ( CVector<uint8_t> mess ) { SendProtMessage ( 49, mess ); }
void OnAboutToQuit();
void OnReqConnClientsListCh0() { CreateAndSendChanListForThisChan ( 0 ); }
void OnReqConnClientsListCh1() { CreateAndSendChanListForThisChan ( 1 ); }
void OnReqConnClientsListCh2() { CreateAndSendChanListForThisChan ( 2 ); }
void OnReqConnClientsListCh3() { CreateAndSendChanListForThisChan ( 3 ); }
void OnReqConnClientsListCh4() { CreateAndSendChanListForThisChan ( 4 ); }
void OnReqConnClientsListCh5() { CreateAndSendChanListForThisChan ( 5 ); }
void OnReqConnClientsListCh6() { CreateAndSendChanListForThisChan ( 6 ); }
void OnReqConnClientsListCh7() { CreateAndSendChanListForThisChan ( 7 ); }
void OnReqConnClientsListCh8() { CreateAndSendChanListForThisChan ( 8 ); }
void OnReqConnClientsListCh9() { CreateAndSendChanListForThisChan ( 9 ); }
void OnReqConnClientsListCh10() { CreateAndSendChanListForThisChan ( 10 ); }
void OnReqConnClientsListCh11() { CreateAndSendChanListForThisChan ( 11 ); }
void OnReqConnClientsListCh12() { CreateAndSendChanListForThisChan ( 12 ); }
void OnReqConnClientsListCh13() { CreateAndSendChanListForThisChan ( 13 ); }
void OnReqConnClientsListCh14() { CreateAndSendChanListForThisChan ( 14 ); }
void OnReqConnClientsListCh15() { CreateAndSendChanListForThisChan ( 15 ); }
void OnReqConnClientsListCh16() { CreateAndSendChanListForThisChan ( 16 ); }
void OnReqConnClientsListCh17() { CreateAndSendChanListForThisChan ( 17 ); }
void OnReqConnClientsListCh18() { CreateAndSendChanListForThisChan ( 18 ); }
void OnReqConnClientsListCh19() { CreateAndSendChanListForThisChan ( 19 ); }
void OnReqConnClientsListCh20() { CreateAndSendChanListForThisChan ( 20 ); }
void OnReqConnClientsListCh21() { CreateAndSendChanListForThisChan ( 21 ); }
void OnReqConnClientsListCh22() { CreateAndSendChanListForThisChan ( 22 ); }
void OnReqConnClientsListCh23() { CreateAndSendChanListForThisChan ( 23 ); }
void OnReqConnClientsListCh24() { CreateAndSendChanListForThisChan ( 24 ); }
void OnReqConnClientsListCh25() { CreateAndSendChanListForThisChan ( 25 ); }
void OnReqConnClientsListCh26() { CreateAndSendChanListForThisChan ( 26 ); }
void OnReqConnClientsListCh27() { CreateAndSendChanListForThisChan ( 27 ); }
void OnReqConnClientsListCh28() { CreateAndSendChanListForThisChan ( 28 ); }
void OnReqConnClientsListCh29() { CreateAndSendChanListForThisChan ( 29 ); }
void OnReqConnClientsListCh30() { CreateAndSendChanListForThisChan ( 30 ); }
void OnReqConnClientsListCh31() { CreateAndSendChanListForThisChan ( 31 ); }
void OnReqConnClientsListCh32() { CreateAndSendChanListForThisChan ( 32 ); }
void OnReqConnClientsListCh33() { CreateAndSendChanListForThisChan ( 33 ); }
void OnReqConnClientsListCh34() { CreateAndSendChanListForThisChan ( 34 ); }
void OnReqConnClientsListCh35() { CreateAndSendChanListForThisChan ( 35 ); }
void OnReqConnClientsListCh36() { CreateAndSendChanListForThisChan ( 36 ); }
void OnReqConnClientsListCh37() { CreateAndSendChanListForThisChan ( 37 ); }
void OnReqConnClientsListCh38() { CreateAndSendChanListForThisChan ( 38 ); }
void OnReqConnClientsListCh39() { CreateAndSendChanListForThisChan ( 39 ); }
void OnReqConnClientsListCh40() { CreateAndSendChanListForThisChan ( 40 ); }
void OnReqConnClientsListCh41() { CreateAndSendChanListForThisChan ( 41 ); }
void OnReqConnClientsListCh42() { CreateAndSendChanListForThisChan ( 42 ); }
void OnReqConnClientsListCh43() { CreateAndSendChanListForThisChan ( 43 ); }
void OnReqConnClientsListCh44() { CreateAndSendChanListForThisChan ( 44 ); }
void OnReqConnClientsListCh45() { CreateAndSendChanListForThisChan ( 45 ); }
void OnReqConnClientsListCh46() { CreateAndSendChanListForThisChan ( 46 ); }
void OnReqConnClientsListCh47() { CreateAndSendChanListForThisChan ( 47 ); }
void OnReqConnClientsListCh48() { CreateAndSendChanListForThisChan ( 48 ); }
void OnReqConnClientsListCh49() { CreateAndSendChanListForThisChan ( 49 ); }
void OnChanInfoHasChangedCh0() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh1() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh2() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh3() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh4() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh5() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh6() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh7() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh8() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh9() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh10() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh11() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh12() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh13() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh14() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh15() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh16() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh17() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh18() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh19() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh20() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh21() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh22() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh23() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh24() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh25() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh26() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh27() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh28() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh29() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh30() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh31() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh32() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh33() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh34() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh35() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh36() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh37() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh38() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh39() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh40() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh41() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh42() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh43() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh44() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh45() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh46() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh47() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh48() { CreateAndSendChanListForAllConChannels(); }
void OnChanInfoHasChangedCh49() { CreateAndSendChanListForAllConChannels(); }
void OnChatTextReceivedCh0 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 0, strChatText ); }
void OnChatTextReceivedCh1 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 1, strChatText ); }
void OnChatTextReceivedCh2 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 2, strChatText ); }
void OnChatTextReceivedCh3 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 3, strChatText ); }
void OnChatTextReceivedCh4 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 4, strChatText ); }
void OnChatTextReceivedCh5 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 5, strChatText ); }
void OnChatTextReceivedCh6 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 6, strChatText ); }
void OnChatTextReceivedCh7 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 7, strChatText ); }
void OnChatTextReceivedCh8 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 8, strChatText ); }
void OnChatTextReceivedCh9 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 9, strChatText ); }
void OnChatTextReceivedCh10 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 10, strChatText ); }
void OnChatTextReceivedCh11 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 11, strChatText ); }
void OnChatTextReceivedCh12 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 12, strChatText ); }
void OnChatTextReceivedCh13 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 13, strChatText ); }
void OnChatTextReceivedCh14 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 14, strChatText ); }
void OnChatTextReceivedCh15 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 15, strChatText ); }
void OnChatTextReceivedCh16 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 16, strChatText ); }
void OnChatTextReceivedCh17 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 17, strChatText ); }
void OnChatTextReceivedCh18 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 18, strChatText ); }
void OnChatTextReceivedCh19 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 19, strChatText ); }
void OnChatTextReceivedCh20 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 20, strChatText ); }
void OnChatTextReceivedCh21 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 21, strChatText ); }
void OnChatTextReceivedCh22 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 22, strChatText ); }
void OnChatTextReceivedCh23 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 23, strChatText ); }
void OnChatTextReceivedCh24 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 24, strChatText ); }
void OnChatTextReceivedCh25 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 25, strChatText ); }
void OnChatTextReceivedCh26 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 26, strChatText ); }
void OnChatTextReceivedCh27 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 27, strChatText ); }
void OnChatTextReceivedCh28 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 28, strChatText ); }
void OnChatTextReceivedCh29 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 29, strChatText ); }
void OnChatTextReceivedCh30 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 30, strChatText ); }
void OnChatTextReceivedCh31 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 31, strChatText ); }
void OnChatTextReceivedCh32 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 32, strChatText ); }
void OnChatTextReceivedCh33 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 33, strChatText ); }
void OnChatTextReceivedCh34 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 34, strChatText ); }
void OnChatTextReceivedCh35 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 35, strChatText ); }
void OnChatTextReceivedCh36 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 36, strChatText ); }
void OnChatTextReceivedCh37 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 37, strChatText ); }
void OnChatTextReceivedCh38 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 38, strChatText ); }
void OnChatTextReceivedCh39 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 39, strChatText ); }
void OnChatTextReceivedCh40 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 40, strChatText ); }
void OnChatTextReceivedCh41 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 41, strChatText ); }
void OnChatTextReceivedCh42 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 42, strChatText ); }
void OnChatTextReceivedCh43 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 43, strChatText ); }
void OnChatTextReceivedCh44 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 44, strChatText ); }
void OnChatTextReceivedCh45 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 45, strChatText ); }
void OnChatTextReceivedCh46 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 46, strChatText ); }
void OnChatTextReceivedCh47 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 47, strChatText ); }
void OnChatTextReceivedCh48 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 48, strChatText ); }
void OnChatTextReceivedCh49 ( QString strChatText ) { CreateAndSendChatTextForAllConChannels ( 49, strChatText ); }
void OnServerAutoSockBufSizeChangeCh0 ( int iNNumFra ) { vecChannels[0].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh1 ( int iNNumFra ) { vecChannels[1].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh2 ( int iNNumFra ) { vecChannels[2].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh3 ( int iNNumFra ) { vecChannels[3].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh4 ( int iNNumFra ) { vecChannels[4].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh5 ( int iNNumFra ) { vecChannels[5].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh6 ( int iNNumFra ) { vecChannels[6].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh7 ( int iNNumFra ) { vecChannels[7].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh8 ( int iNNumFra ) { vecChannels[8].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh9 ( int iNNumFra ) { vecChannels[9].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh10 ( int iNNumFra ) { vecChannels[10].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh11 ( int iNNumFra ) { vecChannels[11].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh12 ( int iNNumFra ) { vecChannels[12].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh13 ( int iNNumFra ) { vecChannels[13].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh14 ( int iNNumFra ) { vecChannels[14].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh15 ( int iNNumFra ) { vecChannels[15].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh16 ( int iNNumFra ) { vecChannels[16].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh17 ( int iNNumFra ) { vecChannels[17].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh18 ( int iNNumFra ) { vecChannels[18].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh19 ( int iNNumFra ) { vecChannels[19].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh20 ( int iNNumFra ) { vecChannels[20].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh21 ( int iNNumFra ) { vecChannels[21].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh22 ( int iNNumFra ) { vecChannels[22].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh23 ( int iNNumFra ) { vecChannels[23].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh24 ( int iNNumFra ) { vecChannels[24].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh25 ( int iNNumFra ) { vecChannels[25].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh26 ( int iNNumFra ) { vecChannels[26].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh27 ( int iNNumFra ) { vecChannels[27].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh28 ( int iNNumFra ) { vecChannels[28].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh29 ( int iNNumFra ) { vecChannels[29].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh30 ( int iNNumFra ) { vecChannels[30].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh31 ( int iNNumFra ) { vecChannels[31].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh32 ( int iNNumFra ) { vecChannels[32].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh33 ( int iNNumFra ) { vecChannels[33].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh34 ( int iNNumFra ) { vecChannels[34].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh35 ( int iNNumFra ) { vecChannels[35].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh36 ( int iNNumFra ) { vecChannels[36].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh37 ( int iNNumFra ) { vecChannels[37].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh38 ( int iNNumFra ) { vecChannels[38].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh39 ( int iNNumFra ) { vecChannels[39].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh40 ( int iNNumFra ) { vecChannels[40].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh41 ( int iNNumFra ) { vecChannels[41].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh42 ( int iNNumFra ) { vecChannels[42].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh43 ( int iNNumFra ) { vecChannels[43].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh44 ( int iNNumFra ) { vecChannels[44].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh45 ( int iNNumFra ) { vecChannels[45].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh46 ( int iNNumFra ) { vecChannels[46].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh47 ( int iNNumFra ) { vecChannels[47].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh48 ( int iNNumFra ) { vecChannels[48].CreateJitBufMes ( iNNumFra ); }
void OnServerAutoSockBufSizeChangeCh49 ( int iNNumFra ) { vecChannels[49].CreateJitBufMes ( iNNumFra ); }
#endif
void OnShutdown ( int );
};

View File

@ -342,18 +342,6 @@ lvwClients->setMinimumHeight ( 140 );
Timer.start ( GUI_CONTRL_UPDATE_TIME );
}
void CServerDlg::closeEvent ( QCloseEvent* Event )
{
// if server was registered at the central server, unregister on shutdown
if ( pServer->GetServerListEnabled() )
{
pServer->UnregisterSlaveServer();
}
// default implementation of this event handler routine
Event->accept();
}
void CServerDlg::OnStartOnOSStartStateChanged ( int value )
{
const bool bCurAutoStartMinState = ( value == Qt::Checked );

View File

@ -58,7 +58,6 @@ public:
protected:
virtual void changeEvent ( QEvent* pEvent );
virtual void closeEvent ( QCloseEvent* Event );
void UpdateGUIDependencies();
void UpdateSystemTrayIcon ( const bool bIsActive );

183
src/signalhandler.cpp Executable file
View File

@ -0,0 +1,183 @@
/******************************************************************************\
* Copyright (c) 2020
*
* Author(s):
* Peter L Jones
*
******************************************************************************
*
* 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.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
******************************************************************************
*
* This code contains some ideas derived from QCtrlSignals
* https://github.com/Skycoder42/QCtrlSignals.git
* - mostly the singleton and emitSignal code, plus some of the structure
* - virtually everything else is common knowledge across SourceForge answers
*
* BSD 3-Clause License
*
* Copyright (c) 2016, Felix Barz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
\******************************************************************************/
#include "signalhandler.h"
class CSignalHandlerSingleton : public CSignalHandler {
public:
inline CSignalHandlerSingleton() : CSignalHandler() {}
};
Q_GLOBAL_STATIC ( CSignalHandlerSingleton, singleton )
CSignalHandler::CSignalHandler() : pSignalBase ( CSignalBase::withSignalHandler ( this ) ) {}
CSignalHandler::~CSignalHandler() = default;
CSignalHandler* CSignalHandler::getSingletonP() { return singleton; }
bool CSignalHandler::emitSignal ( int sigNum )
{
return QMetaObject::invokeMethod( singleton, "ShutdownSignal", Qt::QueuedConnection, Q_ARG( int, sigNum ) );
}
#ifndef _WIN32
void CSignalHandler::OnSocketNotify( int socket )
{
int sigNum;
if ( ::read ( socket, &sigNum, sizeof ( int ) ) == sizeof ( int ) )
{
emitSignal ( sigNum );
}
}
#endif
// ----------------------------------------------------------
CSignalBase::CSignalBase ( CSignalHandler* pSignalHandler ) :
pSignalHandler ( pSignalHandler )
{
}
CSignalBase::~CSignalBase() = default;
CSignalBase* CSignalBase::withSignalHandler ( CSignalHandler* pSignalHandler )
{
#ifdef _WIN32
return new CSignalWin ( pSignalHandler );
#else
return new CSignalUnix ( pSignalHandler );
#endif
}
#ifdef _WIN32
CSignalWin::CSignalWin ( CSignalHandler* nPSignalHandler ) :
CSignalBase ( nPSignalHandler ),
lock ( QReadWriteLock::Recursive )
{
SetConsoleCtrlHandler ( signalHandler, true );
}
CSignalWin::~CSignalWin() {
SetConsoleCtrlHandler ( signalHandler, false );
}
QReadWriteLock* CSignalWin::getLock() const
{
return &lock;
}
BOOL WINAPI CSignalWin::signalHandler ( _In_ DWORD sigNum )
{
auto self = getSelf<CSignalWin>();
QReadLocker lock ( self->getLock() );
return self->pSignalHandler->emitSignal ( static_cast<int>( sigNum ) );
}
#else
int CSignalUnix::socketPair[2];
CSignalUnix::CSignalUnix ( CSignalHandler* nPSignalHandler ) :
CSignalBase ( nPSignalHandler )
{
if ( ::socketpair ( AF_UNIX, SOCK_STREAM, 0, socketPair ) == 0 )
{
socketNotifier = new QSocketNotifier ( socketPair[ 1 ], QSocketNotifier::Read );
QObject::connect ( socketNotifier, &QSocketNotifier::activated, nPSignalHandler, &CSignalHandler::OnSocketNotify );
socketNotifier->setEnabled ( true );
setSignalHandled ( SIGINT, true );
setSignalHandled ( SIGTERM, true );
}
}
CSignalUnix::~CSignalUnix() {
setSignalHandled ( SIGINT, false );
setSignalHandled ( SIGTERM, false );
}
QReadWriteLock* CSignalUnix::getLock() const { return nullptr; }
bool CSignalUnix::setSignalHandled ( int sigNum, bool state )
{
struct sigaction sa;
sigemptyset ( &sa.sa_mask );
if ( state )
{
sa.sa_handler = CSignalUnix::signalHandler;
sa.sa_flags |= SA_RESTART;
}
else
{
sa.sa_handler = SIG_DFL;
}
return ::sigaction ( sigNum, &sa, nullptr ) == 0;
}
void CSignalUnix::signalHandler ( int sigNum )
{
const auto res = ::write ( socketPair[ 0 ], &sigNum, sizeof ( int ) );
Q_UNUSED ( res );
}
#endif

177
src/signalhandler.h Executable file
View File

@ -0,0 +1,177 @@
/******************************************************************************\
* Copyright (c) 2020
*
* Author(s):
* Peter L Jones
*
******************************************************************************
*
* 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.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
******************************************************************************
*
* This code contains some ideas derived from QCtrlSignals
* https://github.com/Skycoder42/QCtrlSignals.git
* - mostly the singleton and emitSignal code, plus some of the structure
* - virtually everything else is common knowledge across SourceForge answers
*
* BSD 3-Clause License
*
* Copyright (c) 2016, Felix Barz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
\******************************************************************************/
#pragma once
#include <QtCore/QObject>
#include <QtCore/QScopedPointer>
#include <QtCore/QHash>
#include <QtCore/QReadWriteLock>
#include <QtCore/QSet>
#include <QGlobalStatic>
#ifdef _WIN32
#include <qt_windows.h>
#include <QtCore/QCoreApplication>
#include <QtCore/QSemaphore>
#include <QtCore/QThread>
#include <QtCore/QDebug>
#else
#include <QSocketNotifier>
#include <QObject>
#include <QCoreApplication>
#include <csignal>
#include <signal.h>
#include <unistd.h>
#include <sys/socket.h>
#endif
class CSignalBase;
class CSignalHandler : public QObject
{
Q_OBJECT
friend class CSignalBase;
friend class CSignalHandlerSingleton;
public:
static CSignalHandler* getSingletonP();
bool emitSignal ( int );
#ifndef _WIN32
public slots:
void OnSocketNotify ( int socket );
#endif
signals:
void ShutdownSignal ( int sigNum );
private:
QScopedPointer<CSignalBase> pSignalBase;
explicit CSignalHandler();
~CSignalHandler() override;
};
// ----------------------------------------------------------
class CSignalBase
{
Q_DISABLE_COPY ( CSignalBase )
public:
static CSignalBase* withSignalHandler ( CSignalHandler* );
virtual ~CSignalBase();
virtual QReadWriteLock* getLock() const = 0;
QSet<int> sHandledSigNums;
protected:
CSignalBase ( CSignalHandler* );
CSignalHandler* pSignalHandler;
template <typename T>
static T *getSelf()
{
return static_cast<T*>( CSignalHandler::getSingletonP()->pSignalBase.data() );
}
};
#ifdef _WIN32
class CSignalWin : public CSignalBase
{
public:
CSignalWin ( CSignalHandler* );
~CSignalWin() override;
virtual QReadWriteLock* getLock() const override;
private:
mutable QReadWriteLock lock;
static BOOL WINAPI signalHandler ( _In_ DWORD sigNum );
};
#else
class CSignalUnix : public CSignalBase
{
public:
CSignalUnix ( CSignalHandler* );
~CSignalUnix() override;
virtual QReadWriteLock* getLock() const override;
private:
QSocketNotifier* socketNotifier = nullptr;
bool setSignalHandled ( int sigNum, bool state );
static int socketPair[2];
static void signalHandler ( int sigNum );
};
#endif

View File

@ -65,11 +65,9 @@ void CSocket::Init ( const quint16 iPortNumber )
}
else
{
// Per definition use the port number plus ten for the client to make
// it possible to run server and client on the same computer. If the
// port is not available, try "NUM_SOCKET_PORTS_TO_TRY" times with
// incremented port numbers.
quint16 iClientPortIncrement = 10; // start value: port nubmer plus ten
// if the port is not available, try "NUM_SOCKET_PORTS_TO_TRY" times
// with incremented port numbers
quint16 iClientPortIncrement = 0;
bSuccess = false; // initialization for while loop
while ( !bSuccess && ( iClientPortIncrement <= NUM_SOCKET_PORTS_TO_TRY ) )

View File

@ -348,16 +348,14 @@ CAboutDlg::CAboutDlg ( QWidget* parent ) : QDialog ( parent )
{
setupUi ( this );
// set the text for the about dialog html text control
txvCredits->setOpenExternalLinks ( true );
txvCredits->setText (
"<p>" // general description of software
"<big>" + tr ( "The " ) + APP_NAME +
// general description of software
txvAbout->setText (
"<p>" + tr ( "The " ) + APP_NAME +
tr ( " software enables musicians to perform real-time jam sessions "
"over the internet. There is a " ) + APP_NAME + tr ( " "
"over the internet." ) + "<br>" + tr ( "There is a " ) + APP_NAME + tr ( " "
"server which collects the audio data from each " ) +
APP_NAME + tr ( " client, mixes the audio data and sends the mix back "
"to each client." ) + "</big></p><br>"
"to each client." ) + "</p>"
"<p><font face=\"courier\">" // GPL header text
"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 "
@ -370,27 +368,53 @@ CAboutDlg::CAboutDlg ( QWidget* parent ) : QDialog ( parent )
"License along with his program; if not, write to the Free Software "
"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 "
"USA"
"</font></p><br>"
"<p><b>" + APP_NAME + // libraries used by this compilation
"</font></p>" );
// libraries used by this compilation
txvLibraries->setText ( APP_NAME +
tr ( " uses the following libraries, resources or code snippets:" ) +
"</b></p>"
"<ul>"
"<li>Qt cross-platform application framework: "
"<i><a href=""http://www.qt.io"">http://www.qt.io</a></i></li>"
"<li>Opus Interactive Audio Codec: "
"<i><a href=""http://www.opus-codec.org"">http://www.opus-codec.org</a></i></li>"
"<li>Audio reverberation code: by Perry R. Cook and Gary P. Scavone, "
"1995 - 2004 (taken from "
"<i><a href=""http://ccrma.stanford.edu/software/stk"">"
"The Synthesis ToolKit in C++ (STK)</a></i>)</li>"
"<li>Some pixmaps are from the Open Clip Art Library (OCAL): "
"<i><a href=""http://openclipart.org"">http://openclipart.org</a></i></li>"
"<li>Country flag icons from Mark James: "
"<i><a href=""http://www.famfamfam.com"">http://www.famfamfam.com</a></i></li>"
"</ul>"
"We would like to acknowledge the contributors listed in the "
"<a href=""https://github.com/corrados/jamulus/graphs/contributors"">Github Contributors list</a>"
"</center><br>");
"<br><p>" + tr ( "Qt cross-platform application framework" ) +
", <i><a href=""http://www.qt.io"">http://www.qt.io</a></i></p>"
"<p>Opus Interactive Audio Codec"
", <i><a href=""http://www.opus-codec.org"">http://www.opus-codec.org</a></i></p>"
"<p>" + tr ( "Audio reverberation code by Perry R. Cook and Gary P. Scavone" ) +
", 1995 - 2004, <i><a href=""http://ccrma.stanford.edu/software/stk"">"
"The Synthesis ToolKit in C++ (STK)</a></i></p>"
"<p>" + tr ( "Some pixmaps are from the" ) + " Open Clip Art Library (OCAL), "
"<i><a href=""http://openclipart.org"">http://openclipart.org</a></i></p>"
"<p>" + tr ( "Country flag icons from Mark James" ) +
", <i><a href=""http://www.famfamfam.com"">http://www.famfamfam.com</a></i></p>" );
// contributors list
txvContributors->setText (
"<p>Peter L. Jones (<a href=""https://github.com/pljones"">pljones</a>)</p>"
"<p>Jonathan Baker-Bates (<a href=""https://github.com/gilgongo"">gilgongo</a>)</p>"
"<p>Daniele Masato (<a href=""https://github.com/doloopuntil"">doloopuntil</a>)</p>"
"<p>Simon Tomlinson (<a href=""https://github.com/sthenos"">sthenos</a>)</p>"
"<p>Marc jr. Landolt (<a href=""https://github.com/braindef"">braindef</a>)</p>"
"<p>Olivier Humbert (<a href=""https://github.com/trebmuh"">trebmuh</a>)</p>"
"<p>mirabilos (<a href=""https://github.com/mirabilos"">mirabilos</a>)</p>"
"<p>newlaurent62 (<a href=""https://github.com/newlaurent62"">newlaurent62</a>)</p>"
"<p>Emlyn Bolton (<a href=""https://github.com/emlynmac"">emlynmac</a>)</p>"
"<p>Jos van den Oever (<a href=""https://github.com/vandenoever"">vandenoever</a>)</p>"
"<p>Tormod Volden (<a href=""https://github.com/tormodvolden"">tormodvolden</a>)</p>"
"<p>Stanislas Michalak (<a href=""https://github.com/stanislas-m"">stanislas-m</a>)</p>"
"<p>JP Cimalando (<a href=""https://github.com/jpcima"">jpcima</a>)</p>"
"<br>" + tr ( "For details on the contributions check out the " ) +
"<a href=""https://github.com/corrados/jamulus/graphs/contributors"">" + tr ( "Github Contributors list" ) + "</a>." );
// translators
txvTranslation->setText (
"<p><b>" + tr ( "Spanish" ) + "</b></p>"
"<p>Daryl Hanlon (<a href=""https://github.com/ignotus666"">ignotus666</a>)</p>"
"<p><b>" + tr ( "French" ) + "</b></p>"
"<p>Olivier Humbert (<a href=""https://github.com/trebmuh"">trebmuh</a>)</p>"
"<p><b>" + tr ( "Portuguese" ) + "</b></p>"
"<p>Miguel de Matos (<a href=""https://github.com/Snayler"">Snayler</a>)</p>"
"<p><b>" + tr ( "Dutch" ) + "</b></p>"
"<p>Jeroen Geertzen (<a href=""https://github.com/jerogee"">jerogee</a>)</p>"
"<p><b>" + tr ( "German" ) + "</b></p>"
"<p>Volker Fischer (<a href=""https://github.com/corrados"">corrados</a>)</p>" );
// set version number in about dialog
lblVersion->setText ( GetVersionAndNameStr() );
@ -406,7 +430,7 @@ QString CAboutDlg::GetVersionAndNameStr ( const bool bWithHtml )
// name, short description and GPL hint
if ( bWithHtml )
{
strVersionText += "<center><b>";
strVersionText += "<b>";
}
else
{
@ -424,24 +448,14 @@ QString CAboutDlg::GetVersionAndNameStr ( const bool bWithHtml )
strVersionText += "\n *** ";
}
strVersionText += tr ( "Internet Jam Session Software" );
if ( bWithHtml )
{
strVersionText += "<br>";
}
else
if ( !bWithHtml )
{
strVersionText += tr ( "Internet Jam Session Software" );
strVersionText += "\n *** ";
}
strVersionText += tr ( "Under the GNU General Public License (GPL)" );
if ( bWithHtml )
{
strVersionText += "</center>";
}
return strVersionText;
}
@ -823,7 +837,7 @@ void CMusProfDlg::OnSkillActivated ( int iCntryListItem )
// Help menu -------------------------------------------------------------------
CHelpMenu::CHelpMenu ( const bool bIsClient, QWidget* parent ) : QMenu ( "&Help", parent )
CHelpMenu::CHelpMenu ( const bool bIsClient, QWidget* parent ) : QMenu ( tr ( "&Help" ), parent )
{
// standard help menu consists of about and what's this help
if ( bIsClient )
@ -850,7 +864,7 @@ bool NetworkUtil::ParseNetworkAddress ( QString strAddress,
CHostAddress& HostAddress )
{
QHostAddress InetAddr;
quint16 iNetPort = LLCON_DEFAULT_PORT_NUMBER;
quint16 iNetPort = DEFAULT_PORT_NUMBER;
// init requested host address with invalid address first
HostAddress = CHostAddress();
@ -937,7 +951,7 @@ QString NetworkUtil::GetCentralServerAddress ( const ECSAddType eCentralServerAd
switch ( eCentralServerAddressType )
{
case AT_MANUAL: return strCentralServerAddress;
case AT_NORTH_AMERICA: return QString ( "%1:%2" ).arg ( DEFAULT_SERVER_ADDRESS ).arg ( LLCON_PORT_NUMBER_NORTHAMERICA );
case AT_NORTH_AMERICA: return QString ( "%1:%2" ).arg ( DEFAULT_SERVER_ADDRESS ).arg ( DEFAULT_PORT_NUMBER_NORTHAMERICA );
default: return DEFAULT_SERVER_ADDRESS; // AT_DEFAULT
}
}
@ -989,6 +1003,8 @@ CVector<CInstPictures::CInstPictProps>& CInstPictures::GetTable()
vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Oboe" ), ":/png/instr/res/instruments/oboe.png", IC_WIND_INSTRUMENT ) );
vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Harp" ), ":/png/instr/res/instruments/harp.png", IC_STRING_INSTRUMENT ) );
vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Viola" ), ":/png/instr/res/instruments/viola.png", IC_STRING_INSTRUMENT ) );
vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Congas" ), ":/png/instr/res/instruments/congas.png", IC_PERCUSSION_INSTRUMENT ) );
vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bongo" ), ":/png/instr/res/instruments/bongo.png", IC_PERCUSSION_INSTRUMENT ) );
// now the table is initialized
TableIsInitialized = true;

View File

@ -39,9 +39,7 @@
#include <QDesktopServices>
#include <QUrl>
#include <QLocale>
#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
# include <QElapsedTimer>
#endif
#include <QElapsedTimer>
#include <vector>
#include <algorithm>
#include "global.h"
@ -1217,7 +1215,6 @@ public:
// Timing measurement ----------------------------------------------------------
// intended for debugging the timing jitter of the sound card or server timer
#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
class CTimingMeas
{
public:
@ -1269,7 +1266,6 @@ protected:
QElapsedTimer ElapsedTimer;
int iCnt;
};
#endif
/******************************************************************************\