diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..3f550c73 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libs/oboe"] + path = libs/oboe + url = https://github.com/google/oboe.git diff --git a/ChangeLog b/ChangeLog index e535cda6..fd172635 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,43 @@ + + + 3.5.3git -TODO improve input channel mapping and introduce input/output gains with overrange to amplification (separate dialog, replace Pan, etc.) +- correct unregister of headless server and RPP file creation on + SIGINT/SIGTERM, coded by pljones (Tickets #130, #168) -TODO support internationalization +- for CoreAudio and 4 channel input, support mixing channels 1&2 with 3&4 -TODO sometimes I cannot see the central server in the server list +- 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 (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 + + +TODO check if Tickets #130, #168 are really solved by code from pljones + +TODO WIP support internationalization + +TODO implement panning for channels (Ticket #52, #145) + +TODO show mute state of others @@ -15,73 +46,73 @@ TODO sometimes I cannot see the central server in the server list 3.5.2 (2020-04-24) - * use audio level meter bars for normal skin +- use audio level meter bars for normal skin - * store Show All Musicians setting in the ini-file +- store Show All Musicians setting in the ini-file - * improved Mac installer, coded by doloopuntil +- improved Mac installer, coded by doloopuntil - * support to open ASIO driver setup(s) if startup failed due to incorrect driver settings (Ticket #117) +- support to open ASIO driver setup(s) if startup failed due to incorrect driver settings (Ticket #117) - * added -v/--version command line argument to output version information (Ticket #121) +- added -v/--version command line argument to output version information (Ticket #121) - * added bodhran and other instrument icons, bodhran created by bomm (Ticket #131) +- added bodhran and other instrument icons, bodhran created by bomm (Ticket #131) - * bug fix: if small network buffers are used we get much better audio quality when drop outs occur +- bug fix: if small network buffers are used we get much better audio quality when drop outs occur - * bug fix: if names given with the -o option were too long, the server registration failed (Ticket #91) +- bug fix: if names given with the -o option were too long, the server registration failed (Ticket #91) - * bug fix: audio level changes if Buffer Delay is changed (Ticket #106) +- bug fix: audio level changes if Buffer Delay is changed (Ticket #106) - * bug fix: do not reset fader level meters if number of clients change +- bug fix: do not reset fader level meters if number of clients change - * bug fix: fixed a crash with JackRouter 64 bit ASIO driver (Ticket #93, thanks to elliotclee) +- bug fix: fixed a crash with JackRouter 64 bit ASIO driver (Ticket #93, thanks to elliotclee) 3.5.1 (2020-04-18) - * added a Mute Stream button to hear your signal and the signal of the other clients but - do not transmit your signal to the server so that the other clients cannot hear you +- added a Mute Stream button to hear your signal and the signal of the other clients but + do not transmit your signal to the server so that the other clients cannot hear you - * added Enable Small Network Buffers switch to enable small sound card buffers in - combination with legacy OPUS packets since OPUS packets with 64 samples enable low - latency but can increase audio drop outs +- added Enable Small Network Buffers switch to enable small sound card buffers in + combination with legacy OPUS packets since OPUS packets with 64 samples enable low + latency but can increase audio drop outs - * upgrade OPUS codec library to v1.3.1 by doloopuntil +- upgrade OPUS codec library to v1.3.1 by doloopuntil - * server list registration status indicator added to the server GUI, coded by pljones +- server list registration status indicator added to the server GUI, coded by pljones - * improved auto jitter buffer for 64 samples frame size +- improved auto jitter buffer for 64 samples frame size - * the ping times in the server list are now more stable +- the ping times in the server list are now more stable 3.5.0 (2020-04-15) - * added support for 64 samples OPUS packets in the client (if a sound card buffer size - larger or equal than 128 samples is chosen, the legacy 128 samples OPUS packets are used) +- added support for 64 samples OPUS packets in the client (if a sound card buffer size + larger or equal than 128 samples is chosen, the legacy 128 samples OPUS packets are used) - * added a filter for the server list to, e.g., filter a specific country or search for a musician +- added a filter for the server list to, e.g., filter a specific country or search for a musician - * refresh server list if the Central Server address type is changed +- refresh server list if the Central Server address type is changed - * the unit of the mixer faders is now dB using the range -50 dB to 0 dB +- the unit of the mixer faders is now dB using the range -50 dB to 0 dB - * increased LED luminance (Ticket #71) +- increased LED luminance (Ticket #71) - * bug fix: the server welcome message may appear twice if the server list was double clicked +- bug fix: the server welcome message may appear twice if the server list was double clicked 3.4.7 (2020-04-11) - * added support for alternative Central Servers to solve the 200 server registration limit (Ticket #50) +- added support for alternative Central Servers to solve the 200 server registration limit (Ticket #50) - * added support for 64 samples frame size in the server (if server runs in 64 or 128 samples - mode it is still compatible to both, 64 and 128 samples frame size clients) +- added support for 64 samples frame size in the server (if server runs in 64 or 128 samples + mode it is still compatible to both, 64 and 128 samples frame size clients) - * added multichannel CoreAudio support, coded by emlynmac (#44) +- added multichannel CoreAudio support, coded by emlynmac (#44) - * fixed server not visible if in same local network, coded by pljones (Ticket #27) +- fixed server not visible if in same local network, coded by pljones (Ticket #27) 3.4.6 (2020-04-09) diff --git a/Jamulus.pro b/Jamulus.pro index c1f04052..31e840bb 100755 --- a/Jamulus.pro +++ b/Jamulus.pro @@ -8,16 +8,17 @@ contains(CONFIG, "noupcasename") { CONFIG += qt \ thread \ - debug - -CONFIG(debug, debug|release) { CONFIG += qt warn_on rtti exceptions } + release \ + lrelease QT += widgets \ network \ xml -#TRANSLATIONS = src/res/translation_de_DE.ts \ -# src/res/translation_fr_FR.ts +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 INCLUDEPATH += src @@ -127,11 +128,138 @@ 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 @@ -147,8 +275,14 @@ win32 { nosoundoption = $$find(CONFIG, "nosound") count(nosoundoption, 0) { message(Jack Audio Interface Enabled.) - CONFIG += link_pkgconfig - PKGCONFIG += jack + + contains(CONFIG, "raspijamulus") { + message(Using Jack Audio in raspijamulus.sh mode.) + LIBS += -ljack + } else { + CONFIG += link_pkgconfig + PKGCONFIG += jack + } HEADERS += linux/sound.h SOURCES += linux/sound.cpp @@ -203,7 +337,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 \ @@ -317,6 +452,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 \ @@ -485,6 +621,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 \ @@ -512,7 +654,6 @@ DISTFILES += ChangeLog \ src/res/ledbuttonnotpressed.png \ src/res/ledbuttonpressed.png \ src/res/fronticon.png \ - src/res/logopicture.png \ src/res/mainicon.png \ src/res/mixerboardbackground.png \ src/res/VLEDBlack.png \ @@ -566,6 +707,17 @@ DISTFILES += ChangeLog \ src/res/instruments/instrkeyboardvocal.png \ src/res/instruments/bodhran.svg \ src/res/instruments/bodhran.png \ + src/res/instruments/bassoon.svg \ + src/res/instruments/bassoon.png \ + src/res/instruments/oboe.svg \ + src/res/instruments/oboe.png \ + 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 \ diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index addcb052..cba6d9a2 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,41 +1,94 @@ - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + - - - + + - - - - - + + + + + + + + + - + + + + + - + + + + + + + + + + + + + + + + + + - - - - - - - + diff --git a/android/androiddebug.cpp b/android/androiddebug.cpp new file mode 100644 index 00000000..93656a47 --- /dev/null +++ b/android/androiddebug.cpp @@ -0,0 +1,45 @@ +const char*const applicationName="Jamulus"; + +#ifdef ANDROIDDEBUG // Set in my myapp.pro file for android builds +#include +#include +#include +#include +#include +#include +#include + +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 diff --git a/android/sound.cpp b/android/sound.cpp index d1fe9d61..ae28508a 100644 --- a/android/sound.cpp +++ b/android/sound.cpp @@ -2,7 +2,7 @@ * Copyright (c) 2004-2020 * * Author(s): - * Volker Fischer + * Simon Tomlinson * ****************************************************************************** * @@ -23,255 +23,157 @@ \******************************************************************************/ #include "sound.h" - +#include "androiddebug.cpp" /* Implementation *************************************************************/ -CSound::CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ) : - CSoundBase ( "OpenSL", true, fpNewProcessCallback, arg, iCtrlMIDIChannel, bNoAutoJackConnect ) + +CSound::CSound ( void (*fpNewProcessCallback) ( CVector& 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 ); @@ -282,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" @@ -295,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 ( 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(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 ( + pSound->vecsTmpAudioSndCrdStereo [frmNum * oboeStream->getChannelCount() + channelNum] ); + floatData[frmNum * oboeStream->getChannelCount() + channelNum] = (float) iCurSam/ _MAXSHORT; + } + } + } + else + { + // prime output stream buffer with silence + memset(static_cast(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 ( 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(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"; +} + + + diff --git a/android/sound.h b/android/sound.h index 4af7353c..535694b7 100644 --- a/android/sound.h +++ b/android/sound.h @@ -2,7 +2,7 @@ * Copyright (c) 2004-2020 * * Author(s): - * Volker Fischer + * Simon Tomlinson * ****************************************************************************** * @@ -24,31 +24,55 @@ #pragma once -#include -#include +/* Deprecated, moving to OBOE + * #include + * #include */ +#include #include #include "soundbase.h" #include "global.h" - +#include +#include /* Classes ********************************************************************/ -class CSound : public CSoundBase +class CSound : public CSoundBase, public oboe::AudioStreamCallback//, public IRenderableAudio, public IRestartable { public: - CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ); + CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), + void* arg, + const int iCtrlMIDIChannel, + const bool , + const QString& ); virtual ~CSound() {} virtual int Init ( const int iNewPrefMonoBufferSize ); 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 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 vecsTmpAudioInSndCrd; int iModifiedInBufSize; @@ -56,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; diff --git a/distributions/debian/control b/distributions/debian/control index c84207cb..10809972 100644 --- a/distributions/debian/control +++ b/distributions/debian/control @@ -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 diff --git a/distributions/debian/rules b/distributions/debian/rules index e7195b91..b98816c9 100755 --- a/distributions/debian/rules +++ b/distributions/debian/rules @@ -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/ diff --git a/distributions/raspijamulus.sh b/distributions/raspijamulus.sh index 71a99121..4a3d3e06 100755 --- a/distributions/raspijamulus.sh +++ b/distributions/raspijamulus.sh @@ -75,7 +75,7 @@ fi # compile Jamulus with external Opus library cd .. -qmake "CONFIG+=opus_shared_lib" "INCLUDEPATH+=distributions/${OPUS}/include" "QMAKE_LIBDIR+=distributions/${OPUS}/.libs" "INCLUDEPATH+=distributions/jack2/common" "QMAKE_LIBDIR+=distributions/jack2/build/common" Jamulus.pro +qmake "CONFIG+=opus_shared_lib" "CONFIG+=raspijamulus" "INCLUDEPATH+=distributions/${OPUS}/include" "QMAKE_LIBDIR+=distributions/${OPUS}/.libs" "INCLUDEPATH+=distributions/jack2/common" "QMAKE_LIBDIR+=distributions/jack2/build/common" Jamulus.pro make -j${NCORES} # get first USB audio sound card device diff --git a/libs/oboe b/libs/oboe new file mode 160000 index 00000000..55d878a4 --- /dev/null +++ b/libs/oboe @@ -0,0 +1 @@ +Subproject commit 55d878a4e85e1994f2b5883366079b991500a25f diff --git a/linux/sound.cpp b/linux/sound.cpp index be46d83c..b55b550e 100755 --- a/linux/sound.cpp +++ b/linux/sound.cpp @@ -27,14 +27,15 @@ #include "sound.h" #ifdef WITH_SOUND -void CSound::OpenJack() +void CSound::OpenJack ( const bool bNoAutoJackConnect, + const char* jackClientName ) { jack_status_t JackStatus; // try to become a client of the JACK server - pJackClient = jack_client_open ( APP_NAME, JackNullOption, &JackStatus ); + pJackClient = jack_client_open ( jackClientName, JackNullOption, &JackStatus ); - if ( pJackClient == NULL ) + if ( pJackClient == nullptr ) { throw CGenErr ( tr ( "The Jack server is not running. This software " "requires a Jack server to run. Normally if the Jack server is " @@ -57,13 +58,13 @@ void CSound::OpenJack() if ( jack_get_sample_rate ( pJackClient ) != SYSTEM_SAMPLE_RATE_HZ ) { throw CGenErr ( tr ( "The Jack server sample rate is different from " - "the required one. The required sample rate is: " ) + - QString().setNum ( SYSTEM_SAMPLE_RATE_HZ ) + tr ( " Hz. You can " + "the required one. The required sample rate is:" ) + " " + + QString().setNum ( SYSTEM_SAMPLE_RATE_HZ ) + " Hz. " + tr ( "You can " "use a tool like QJackCtl " - "to adjust the Jack server sample rate.
Make sure to set the " - "Frames/Period to a low value like " ) + + "to adjust the Jack server sample rate." ) + "
" + tr ( "Make sure to set the " + "Frames/Period to a low value like " ) + QString().setNum ( DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES ) + - tr ( "
to achieve a low delay." ) ); + tr ( " to achieve a low delay." ) ); } // create four ports (two for input, two for output -> stereo) @@ -79,10 +80,10 @@ void CSound::OpenJack() output_port_right = jack_port_register ( pJackClient, "output right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); - if ( ( input_port_left == NULL ) || - ( input_port_right == NULL ) || - ( output_port_left == NULL ) || - ( output_port_right == NULL ) ) + if ( ( input_port_left == nullptr ) || + ( input_port_right == nullptr ) || + ( output_port_left == nullptr ) || + ( output_port_right == nullptr ) ) { throw CGenErr ( tr ( "The Jack port registering failed." ) ); } @@ -93,14 +94,14 @@ void CSound::OpenJack() input_port_midi = jack_port_register ( pJackClient, "input midi", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0 ); - if ( input_port_midi == NULL ) + if ( input_port_midi == nullptr ) { throw CGenErr ( tr ( "The Jack port registering failed." ) ); } } else { - input_port_midi = NULL; + input_port_midi = nullptr; } // tell the JACK server that we are ready to roll @@ -119,23 +120,16 @@ void CSound::OpenJack() // try to connect physical input ports if ( ( ports = jack_get_ports ( pJackClient, - NULL, - NULL, - JackPortIsPhysical | JackPortIsOutput ) ) != NULL ) + nullptr, + nullptr, + JackPortIsPhysical | JackPortIsOutput ) ) != nullptr ) { - if ( jack_connect ( pJackClient, ports[0], jack_port_name ( input_port_left ) ) ) - { - throw CGenErr ( tr ( "Cannot connect the Jack input ports" ) ); - } + jack_connect ( pJackClient, ports[0], jack_port_name ( input_port_left ) ); - // before connecting the second stereo channel, check if the input is not - // mono + // before connecting the second stereo channel, check if the input is not mono if ( ports[1] ) { - if ( jack_connect ( pJackClient, ports[1], jack_port_name ( input_port_right ) ) ) - { - throw CGenErr ( tr ( "Cannot connect the Jack input ports" ) ); - } + jack_connect ( pJackClient, ports[1], jack_port_name ( input_port_right ) ); } jack_free ( ports ); @@ -143,23 +137,16 @@ void CSound::OpenJack() // try to connect physical output ports if ( ( ports = jack_get_ports ( pJackClient, - NULL, - NULL, - JackPortIsPhysical | JackPortIsInput ) ) != NULL ) + nullptr, + nullptr, + JackPortIsPhysical | JackPortIsInput ) ) != nullptr ) { - if ( jack_connect ( pJackClient, jack_port_name ( output_port_left ), ports[0] ) ) - { - throw CGenErr ( tr ( "Cannot connect the Jack output ports." ) ); - } + jack_connect ( pJackClient, jack_port_name ( output_port_left ), ports[0] ); - // before connecting the second stereo channel, check if the output is not - // mono + // before connecting the second stereo channel, check if the output is not mono if ( ports[1] ) { - if ( jack_connect ( pJackClient, jack_port_name ( output_port_right ), ports[1] ) ) - { - throw CGenErr ( tr ( "Cannot connect the Jack output ports." ) ); - } + jack_connect ( pJackClient, jack_port_name ( output_port_right ), ports[1] ); } jack_free ( ports ); @@ -197,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 ); @@ -230,7 +221,7 @@ int CSound::process ( jack_nframes_t nframes, void* arg ) CSound* pSound = static_cast ( arg ); int i; - if ( pSound->IsRunning() ) + if ( pSound->IsRunning() && ( nframes == static_cast ( pSound->iJACKBufferSizeMono ) ) ) { // get input data pointer jack_default_audio_sample_t* in_left = @@ -242,7 +233,7 @@ int CSound::process ( jack_nframes_t nframes, void* arg ) pSound->input_port_right, nframes ); // copy input audio data - if ( in_left != 0 && in_right != 0 ) + if ( ( in_left != nullptr ) && ( in_right != nullptr ) ) { for ( i = 0; i < pSound->iJACKBufferSizeMono; i++ ) { @@ -267,7 +258,7 @@ int CSound::process ( jack_nframes_t nframes, void* arg ) pSound->output_port_right, nframes ); // copy output data - if ( out_left != 0 && out_right != 0 ) + if ( ( out_left != nullptr ) && ( out_right != nullptr ) ) { for ( i = 0; i < pSound->iJACKBufferSizeMono; i++ ) { @@ -291,7 +282,7 @@ int CSound::process ( jack_nframes_t nframes, void* arg ) pSound->output_port_right, nframes ); // clear output data - if ( out_left != 0 && out_right != 0 ) + if ( ( out_left != nullptr ) && ( out_right != nullptr ) ) { memset ( out_left, 0, @@ -304,7 +295,7 @@ int CSound::process ( jack_nframes_t nframes, void* arg ) } // akt on MIDI data if MIDI is enabled - if ( pSound->input_port_midi != NULL ) + if ( pSound->input_port_midi != nullptr ) { void* in_midi = jack_port_get_buffer ( pSound->input_port_midi, nframes ); @@ -334,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 ( arg ); @@ -343,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 ( arg ); + + pSound->bJackWasShutDown = true; + pSound->EmitReinitRequestSignal ( RS_ONLY_RESTART_AND_INIT ); } #endif // WITH_SOUND diff --git a/linux/sound.h b/linux/sound.h index 0b03c275..23e9bf59 100755 --- a/linux/sound.h +++ b/linux/sound.h @@ -60,12 +60,14 @@ class CSound : public CSoundBase { public: - CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ) : - CSoundBase ( "Jack", true, fpNewProcessCallback, arg, iCtrlMIDIChannel, bNoAutoJackConnect ), iJACKBufferSizeMono ( 0 ), - iJACKBufferSizeStero ( 0 ) { OpenJack(); } + CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), + void* arg, + const int iCtrlMIDIChannel, + const bool bNoAutoJackConnect, + const QString& strJackClientName ) : + CSoundBase ( "Jack", true, fpNewProcessCallback, arg, iCtrlMIDIChannel ), + iJACKBufferSizeMono ( 0 ), bJackWasShutDown ( false ) { OpenJack ( bNoAutoJackConnect, strJackClientName.toLocal8Bit().data() ); } + virtual ~CSound() { CloseJack(); } virtual int Init ( const int iNewPrefMonoBufferSize ); @@ -77,6 +79,7 @@ public: CVector vecsTmpAudioSndCrdStereo; int iJACKBufferSizeMono; int iJACKBufferSizeStero; + bool bJackWasShutDown; jack_port_t* input_port_left; jack_port_t* input_port_right; @@ -85,7 +88,9 @@ public: jack_port_t* input_port_midi; protected: - void OpenJack(); + void OpenJack ( const bool bNoAutoJackConnect, + const char* jackClientName ); + void CloseJack(); // callbacks @@ -99,11 +104,12 @@ protected: class CSound : public CSoundBase { public: - CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* pParg ), - void* pParg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ) : - CSoundBase ( "nosound", false, fpNewProcessCallback, pParg, iCtrlMIDIChannel, bNoAutoJackConnect ) {} + CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* pParg ), + void* pParg, + const int iCtrlMIDIChannel, + const bool , + const QString& ) : + CSoundBase ( "nosound", false, fpNewProcessCallback, pParg, iCtrlMIDIChannel ) {} virtual ~CSound() {} }; #endif // WITH_SOUND diff --git a/mac/sound.cpp b/mac/sound.cpp index d3cdf322..4f708da7 100755 --- a/mac/sound.cpp +++ b/mac/sound.cpp @@ -26,11 +26,12 @@ /* Implementation *************************************************************/ -CSound::CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ) : - CSoundBase ( "CoreAudio", true, fpNewProcessCallback, arg, iCtrlMIDIChannel, bNoAutoJackConnect ), +CSound::CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), + void* arg, + const int iCtrlMIDIChannel, + const bool , + const QString& ) : + CSoundBase ( "CoreAudio", true, fpNewProcessCallback, arg, iCtrlMIDIChannel ), midiInPortRef ( static_cast ( NULL ) ) { // Apple Mailing Lists: Subject: GUI Apps should set kAudioHardwarePropertyRunLoop @@ -166,6 +167,7 @@ CSound::CSound ( void (*fpNewProcessCallback) ( CVector& psData, vo CurrentAudioInputDeviceID = 0; CurrentAudioOutputDeviceID = 0; iNumInChan = 0; + iNumInChanPlusAddChan = 0; iNumOutChan = 0; iSelInputLeftChannel = 0; iSelInputRightChannel = 0; @@ -255,47 +257,55 @@ void CSound::GetAudioDeviceInfos ( const AudioDeviceID DeviceID, } int CSound::CountChannels ( AudioDeviceID devID, - const int iNumChanPerFrame, bool isInput ) { OSStatus err; UInt32 propSize; int result = 0; - // check for the case the we have interleaved format, in that case we assume - // that only the very first buffer contains all our channels - if ( iNumChanPerFrame > 1 ) + if ( isInput ) { - result = iNumChanPerFrame; + vecNumInBufChan.Init ( 0 ); } else { - // it seems we have multiple buffers where each buffer has only one channel, - // in that case we assume that each input channel has its own buffer - AudioObjectPropertyScope theScope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + vecNumOutBufChan.Init ( 0 ); + } - AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyStreamConfiguration, - theScope, - 0 }; + // it seems we have multiple buffers where each buffer has only one channel, + // in that case we assume that each input channel has its own buffer + AudioObjectPropertyScope theScope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - AudioObjectGetPropertyDataSize ( devID, &theAddress, 0, NULL, &propSize ); + AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyStreamConfiguration, + theScope, + 0 }; - AudioBufferList *buflist = (AudioBufferList*) malloc ( propSize ); + AudioObjectGetPropertyDataSize ( devID, &theAddress, 0, NULL, &propSize ); - err = AudioObjectGetPropertyData ( devID, &theAddress, 0, NULL, &propSize, buflist ); + AudioBufferList *buflist = (AudioBufferList*) malloc ( propSize ); - if ( !err ) + err = AudioObjectGetPropertyData ( devID, &theAddress, 0, NULL, &propSize, buflist ); + + if ( !err ) + { + for ( UInt32 i = 0; i < buflist->mNumberBuffers; ++i ) { - for ( UInt32 i = 0; i < buflist->mNumberBuffers; ++i ) + // The correct value mNumberChannels for an AudioBuffer can be derived from the mChannelsPerFrame + // and the interleaved flag. For non interleaved formats, mNumberChannels is always 1. + // For interleaved formats, mNumberChannels is equal to mChannelsPerFrame. + result += buflist->mBuffers[i].mNumberChannels; + + if ( isInput ) { - // The correct value mNumberChannels for an AudioBuffer can be derived from the mChannelsPerFrame - // and the interleaved flag. For non interleaved formats, mNumberChannels is always 1. - // For interleaved formats, mNumberChannels is equal to mChannelsPerFrame. - result += buflist->mBuffers[i].mNumberChannels; + vecNumInBufChan.Add ( buflist->mBuffers[i].mNumberChannels ); + } + else + { + vecNumOutBufChan.Add ( buflist->mBuffers[i].mNumberChannels ); } } - free ( buflist ); } + free ( buflist ); return result; } @@ -315,10 +325,10 @@ QString CSound::LoadAndInitializeDriver ( int iDriverIdx, bool ) // the device has changed, per definition we reset the channel // mapping to the defaults (first two available channels) - iSelInputLeftChannel = 0; - iSelInputRightChannel = min ( iNumInChan - 1, 1 ); - iSelOutputLeftChannel = 0; - iSelOutputRightChannel = min ( iNumOutChan - 1, 1 ); + SetLeftInputChannel ( 0 ); + SetRightInputChannel ( 1 ); + SetLeftOutputChannel ( 0 ); + SetRightOutputChannel ( 1 ); } return strStat; @@ -461,9 +471,6 @@ QString CSound::CheckDeviceCapabilities ( const int iDriverIdx ) "not compatible with this software." ); } - // store the input number of channels per frame for this stream - const int iNumInChanPerFrame = CurDevStreamFormat.mChannelsPerFrame; - // check the output AudioObjectGetPropertyData ( outputStreamID, &stPropertyAddress, @@ -482,12 +489,9 @@ QString CSound::CheckDeviceCapabilities ( const int iDriverIdx ) "not compatible with this software." ); } - // store the output number of channels per frame for this stream - const int iNumOutChanPerFrame = CurDevStreamFormat.mChannelsPerFrame; - // store the input and out number of channels for this device - iNumInChan = CountChannels ( audioInputDevice[iDriverIdx], iNumInChanPerFrame, true ); - iNumOutChan = CountChannels ( audioOutputDevice[iDriverIdx], iNumOutChanPerFrame, false ); + iNumInChan = CountChannels ( audioInputDevice[iDriverIdx], true ); + iNumOutChan = CountChannels ( audioOutputDevice[iDriverIdx], false ); // clip the number of input/output channels to our allowed maximum if ( iNumInChan > MAX_NUM_IN_OUT_CHANNELS ) @@ -567,25 +571,129 @@ QString CSound::CheckDeviceCapabilities ( const int iDriverIdx ) } } + // special case with 4 input channels: support adding channels + if ( iNumInChan == 4 ) + { + // add four mixed channels (i.e. 4 normal, 4 mixed channels) + iNumInChanPlusAddChan = 8; + + for ( int iCh = 0; iCh < iNumInChanPlusAddChan; iCh++ ) + { + int iSelCH, iSelAddCH; + + GetSelCHAndAddCH ( iCh, iNumInChan, iSelCH, iSelAddCH ); + + if ( iSelAddCH >= 0 ) + { + // for mixed channels, show both audio channel names to be mixed + sChannelNamesInput[iCh] = + sChannelNamesInput[iSelCH] + " + " + sChannelNamesInput[iSelAddCH]; + } + } + } + else + { + // regular case: no mixing input channels used + iNumInChanPlusAddChan = iNumInChan; + } + // everything is ok, return empty string for "no error" case return ""; } +void CSound::UpdateChSelection() +{ + // calculate the selected input/output buffer and the selected interleaved + // channel index in the buffer, note that each buffer can have a different + // number of interleaved channels + int iChCnt; + int iSelCHLeft, iSelAddCHLeft; + int iSelCHRight, iSelAddCHRight; + + // initialize all buffer indexes with an invalid value + iSelInBufferLeft = -1; + iSelInBufferRight = -1; + iSelAddInBufferLeft = -1; // if no additional channel used, this will stay on the invalid value + iSelAddInBufferRight = -1; // if no additional channel used, this will stay on the invalid value + iSelOutBufferLeft = -1; + iSelOutBufferRight = -1; + + // input + GetSelCHAndAddCH ( iSelInputLeftChannel, iNumInChan, iSelCHLeft, iSelAddCHLeft ); + GetSelCHAndAddCH ( iSelInputRightChannel, iNumInChan, iSelCHRight, iSelAddCHRight ); + + iChCnt = 0; + + for ( int iBuf = 0; iBuf < vecNumInBufChan.Size(); iBuf++ ) + { + iChCnt += vecNumInBufChan[iBuf]; + + if ( ( iSelInBufferLeft < 0 ) && ( iChCnt > iSelCHLeft ) ) + { + iSelInBufferLeft = iBuf; + iSelInInterlChLeft = iSelCHLeft - iChCnt + vecNumInBufChan[iBuf]; + } + + if ( ( iSelInBufferRight < 0 ) && ( iChCnt > iSelCHRight ) ) + { + iSelInBufferRight = iBuf; + iSelInInterlChRight = iSelCHRight - iChCnt + vecNumInBufChan[iBuf]; + } + + if ( ( iSelAddCHLeft >= 0 ) && ( iSelAddInBufferLeft < 0 ) && ( iChCnt > iSelAddCHLeft ) ) + { + iSelAddInBufferLeft = iBuf; + iSelAddInInterlChLeft = iSelAddCHLeft - iChCnt + vecNumInBufChan[iBuf]; + } + + if ( ( iSelAddCHRight >= 0 ) && ( iSelAddInBufferRight < 0 ) && ( iChCnt > iSelAddCHRight ) ) + { + iSelAddInBufferRight = iBuf; + iSelAddInInterlChRight = iSelAddCHRight - iChCnt + vecNumInBufChan[iBuf]; + } + } + + // output + GetSelCHAndAddCH ( iSelOutputLeftChannel, iNumOutChan, iSelCHLeft, iSelAddCHLeft ); + GetSelCHAndAddCH ( iSelOutputRightChannel, iNumOutChan, iSelCHRight, iSelAddCHRight ); + + iChCnt = 0; + + for ( int iBuf = 0; iBuf < vecNumOutBufChan.Size(); iBuf++ ) + { + iChCnt += vecNumOutBufChan[iBuf]; + + if ( ( iSelOutBufferLeft < 0 ) && ( iChCnt > iSelCHLeft ) ) + { + iSelOutBufferLeft = iBuf; + iSelOutInterlChLeft = iSelCHLeft - iChCnt + vecNumOutBufChan[iBuf]; + } + + if ( ( iSelOutBufferRight < 0 ) && ( iChCnt > iSelCHRight ) ) + { + iSelOutBufferRight = iBuf; + iSelOutInterlChRight = iSelCHRight - iChCnt + vecNumOutBufChan[iBuf]; + } + } +} + void CSound::SetLeftInputChannel ( const int iNewChan ) { // apply parameter after input parameter check - if ( ( iNewChan >= 0 ) && ( iNewChan < iNumInChan ) ) + if ( ( iNewChan >= 0 ) && ( iNewChan < iNumInChanPlusAddChan ) ) { iSelInputLeftChannel = iNewChan; + UpdateChSelection(); } } void CSound::SetRightInputChannel ( const int iNewChan ) { // apply parameter after input parameter check - if ( ( iNewChan >= 0 ) && ( iNewChan < iNumInChan ) ) + if ( ( iNewChan >= 0 ) && ( iNewChan < iNumInChanPlusAddChan ) ) { iSelInputRightChannel = iNewChan; + UpdateChSelection(); } } @@ -595,6 +703,7 @@ void CSound::SetLeftOutputChannel ( const int iNewChan ) if ( ( iNewChan >= 0 ) && ( iNewChan < iNumOutChan ) ) { iSelOutputLeftChannel = iNewChan; + UpdateChSelection(); } } @@ -604,6 +713,7 @@ void CSound::SetRightOutputChannel ( const int iNewChan ) if ( ( iNewChan >= 0 ) && ( iNewChan < iNumOutChan ) ) { iSelOutputRightChannel = iNewChan; + UpdateChSelection(); } } @@ -823,68 +933,70 @@ OSStatus CSound::callbackIO ( AudioDeviceID inDevice, // both, the input and output device use the same callback function QMutexLocker locker ( &pSound->Mutex ); - const int iCoreAudioBufferSizeMono = pSound->iCoreAudioBufferSizeMono; - const int iNumInChan = pSound->iNumInChan; - const int iNumOutChan = pSound->iNumOutChan; - const int iSelInputLeftChannel = pSound->iSelInputLeftChannel; - const int iSelInputRightChannel = pSound->iSelInputRightChannel; - const int iSelOutputLeftChannel = pSound->iSelOutputLeftChannel; - const int iSelOutputRightChannel = pSound->iSelOutputRightChannel; + const int iCoreAudioBufferSizeMono = pSound->iCoreAudioBufferSizeMono; + const int iSelInBufferLeft = pSound->iSelInBufferLeft; + const int iSelInBufferRight = pSound->iSelInBufferRight; + const int iSelInInterlChLeft = pSound->iSelInInterlChLeft; + const int iSelInInterlChRight = pSound->iSelInInterlChRight; + const int iSelAddInBufferLeft = pSound->iSelAddInBufferLeft; + const int iSelAddInBufferRight = pSound->iSelAddInBufferRight; + const int iSelAddInInterlChLeft = pSound->iSelAddInInterlChLeft; + const int iSelAddInInterlChRight = pSound->iSelAddInInterlChRight; + const int iSelOutBufferLeft = pSound->iSelOutBufferLeft; + const int iSelOutBufferRight = pSound->iSelOutBufferRight; + const int iSelOutInterlChLeft = pSound->iSelOutInterlChLeft; + const int iSelOutInterlChRight = pSound->iSelOutInterlChRight; + const CVector& vecNumInBufChan = pSound->vecNumInBufChan; + const CVector& vecNumOutBufChan = pSound->vecNumOutBufChan; if ( ( inDevice == pSound->CurrentAudioInputDeviceID ) && inInputData ) { - // check size (float32 has four bytes) - if ( inInputData->mBuffers[0].mDataByteSize == - static_cast ( iCoreAudioBufferSizeMono * iNumInChan * 4 ) ) + // check sizes (note that float32 has four bytes) + if ( ( iSelInBufferLeft >= 0 ) && + ( iSelInBufferLeft < static_cast ( inInputData->mNumberBuffers ) ) && + ( iSelInBufferRight >= 0 ) && + ( iSelInBufferRight < static_cast ( inInputData->mNumberBuffers ) ) && + ( iSelAddInBufferLeft < static_cast ( inInputData->mNumberBuffers ) ) && + ( iSelAddInBufferRight < static_cast ( inInputData->mNumberBuffers ) ) && + ( inInputData->mBuffers[iSelInBufferLeft].mDataByteSize == static_cast ( vecNumInBufChan[iSelInBufferLeft] * iCoreAudioBufferSizeMono * 4 ) ) && + ( inInputData->mBuffers[iSelInBufferRight].mDataByteSize == static_cast ( vecNumInBufChan[iSelInBufferRight] * iCoreAudioBufferSizeMono * 4 ) ) ) { - // one buffer with all the channels in interleaved format: - // get a pointer to the input data of the correct type - Float32* pInData = static_cast ( inInputData->mBuffers[0].mData ); + Float32* pLeftData = static_cast ( inInputData->mBuffers[iSelInBufferLeft].mData ); + Float32* pRightData = static_cast ( inInputData->mBuffers[iSelInBufferRight].mData ); + int iNumChanPerFrameLeft = vecNumInBufChan[iSelInBufferLeft]; + int iNumChanPerFrameRight = vecNumInBufChan[iSelInBufferRight]; // copy input data for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) { - // left - pSound->vecsTmpAudioSndCrdStereo[2 * i] = - (short) ( pInData[iNumInChan * i + iSelInputLeftChannel] * _MAXSHORT ); - - // right - pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] = - (short) ( pInData[iNumInChan * i + iSelInputRightChannel] * _MAXSHORT ); - -/* -// TEST mix channel with micro to the stereo output -if ( iNumInChan == 4 ) -{ - // add mic input on input channel 4 to both stereo channels - pSound->vecsTmpAudioSndCrdStereo[2 * i] = - Double2Short ( (double) ( pInData[iNumInChan * i + 3] * _MAXSHORT ) + - (double) pSound->vecsTmpAudioSndCrdStereo[2 * i] ); - pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] = - Double2Short ( (double) ( pInData[iNumInChan * i + 3] * _MAXSHORT ) + - (double) pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] ); -} -*/ - + // copy left and right channels separately + pSound->vecsTmpAudioSndCrdStereo[2 * i] = (short) ( pLeftData[iNumChanPerFrameLeft * i + iSelInInterlChLeft] * _MAXSHORT ); + pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] = (short) ( pRightData[iNumChanPerFrameRight * i + iSelInInterlChRight] * _MAXSHORT ); } - } - else if ( inInputData->mNumberBuffers == (UInt32) iNumInChan && // we should have a matching number of buffers to channels - inInputData->mBuffers[0].mDataByteSize == static_cast ( iCoreAudioBufferSizeMono * 4 ) ) - { - // one buffer per channel mode: - AudioBuffer left = inInputData->mBuffers[iSelInputLeftChannel]; - Float32* pLeftData = static_cast ( left.mData ); - AudioBuffer right = inInputData->mBuffers[iSelInputRightChannel]; - Float32* pRightData = static_cast ( right.mData ); - // copy input data - for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) + // add an additional optional channel + if ( iSelAddInBufferLeft >= 0 ) { - // left - pSound->vecsTmpAudioSndCrdStereo[2 * i] = (short) ( pLeftData[i] * _MAXSHORT ); + pLeftData = static_cast ( inInputData->mBuffers[iSelAddInBufferLeft].mData ); + iNumChanPerFrameLeft = vecNumInBufChan[iSelAddInBufferLeft]; - // right - pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] = (short) ( pRightData[i] * _MAXSHORT ); + for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) + { + pSound->vecsTmpAudioSndCrdStereo[2 * i] = Double2Short ( + pSound->vecsTmpAudioSndCrdStereo[2 * i] + pLeftData[iNumChanPerFrameLeft * i + iSelAddInInterlChLeft] * _MAXSHORT ); + } + } + + if ( iSelAddInBufferRight >= 0 ) + { + pRightData = static_cast ( inInputData->mBuffers[iSelAddInBufferRight].mData ); + iNumChanPerFrameRight = vecNumInBufChan[iSelAddInBufferRight]; + + for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) + { + pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] = Double2Short ( + pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] + pRightData[iNumChanPerFrameRight * i + iSelAddInInterlChRight] * _MAXSHORT ); + } } } else @@ -899,42 +1011,26 @@ if ( iNumInChan == 4 ) if ( ( inDevice == pSound->CurrentAudioOutputDeviceID ) && outOutputData ) { - // check size (float32 has four bytes) - if ( outOutputData->mBuffers[0].mDataByteSize == - static_cast ( iCoreAudioBufferSizeMono * iNumOutChan * 4 ) ) - { - // one buffer with all the channels in interleaved format: - // get a pointer to the input data of the correct type - Float32* pOutData = static_cast ( outOutputData->mBuffers[0].mData ); + // check sizes (note that float32 has four bytes) + if ( ( iSelOutBufferLeft >= 0 ) && + ( iSelOutBufferLeft < static_cast ( outOutputData->mNumberBuffers ) ) && + ( iSelOutBufferRight >= 0 ) && + ( iSelOutBufferRight < static_cast ( outOutputData->mNumberBuffers ) ) && + ( outOutputData->mBuffers[iSelOutBufferLeft].mDataByteSize == static_cast ( vecNumOutBufChan[iSelOutBufferLeft] * iCoreAudioBufferSizeMono * 4 ) ) && + ( outOutputData->mBuffers[iSelOutBufferRight].mDataByteSize == static_cast ( vecNumOutBufChan[iSelOutBufferRight] * iCoreAudioBufferSizeMono * 4 ) ) ) + { + Float32* pLeftData = static_cast ( outOutputData->mBuffers[iSelOutBufferLeft].mData ); + Float32* pRightData = static_cast ( outOutputData->mBuffers[iSelOutBufferRight].mData ); + int iNumChanPerFrameLeft = vecNumOutBufChan[iSelOutBufferLeft]; + int iNumChanPerFrameRight = vecNumOutBufChan[iSelOutBufferRight]; - // copy output data - for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) - { - // left - pOutData[iNumOutChan * i + iSelOutputLeftChannel] = - (Float32) pSound->vecsTmpAudioSndCrdStereo[2 * i] / _MAXSHORT; - - // right - pOutData[iNumOutChan * i + iSelOutputRightChannel] = - (Float32) pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] / _MAXSHORT; - } - } - else if ( outOutputData->mNumberBuffers == (UInt32) iNumOutChan && // we should have a matching number of buffers to channels - outOutputData->mBuffers[0].mDataByteSize == static_cast ( iCoreAudioBufferSizeMono * 4 ) ) - { - // Outputs are to individual buffers too, rather than using channels - Float32* pLeftOutData = static_cast ( outOutputData->mBuffers[iSelOutputLeftChannel].mData ); - Float32* pRightOutData = static_cast ( outOutputData->mBuffers[iSelOutputRightChannel].mData ); - - // copy output data - for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) - { - // left - pLeftOutData[i] = (Float32) pSound->vecsTmpAudioSndCrdStereo[2 * i] / _MAXSHORT; - - // right - pRightOutData[i] = (Float32) pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] / _MAXSHORT; - } + // copy output data + for ( int i = 0; i < iCoreAudioBufferSizeMono; i++ ) + { + // copy left and right channels separately + pLeftData[iNumChanPerFrameLeft * i + iSelOutInterlChLeft] = (Float32) pSound->vecsTmpAudioSndCrdStereo[2 * i] / _MAXSHORT; + pRightData[iNumChanPerFrameRight * i + iSelOutInterlChRight] = (Float32) pSound->vecsTmpAudioSndCrdStereo[2 * i + 1] / _MAXSHORT; + } } } diff --git a/mac/sound.h b/mac/sound.h index 67ae10da..183c5377 100755 --- a/mac/sound.h +++ b/mac/sound.h @@ -36,17 +36,18 @@ class CSound : public CSoundBase { public: - CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ); + CSound ( void (*fpNewProcessCallback) ( CVector& psData, void* arg ), + void* arg, + const int iCtrlMIDIChannel, + const bool , + const QString& ); virtual int Init ( const int iNewPrefMonoBufferSize ); virtual void Start(); virtual void Stop(); // channel selection - virtual int GetNumInputChannels() { return iNumInChan; } + virtual int GetNumInputChannels() { return iNumInChanPlusAddChan; } virtual QString GetInputChannelName ( const int iDiD ) { return sChannelNamesInput[iDiD]; } virtual void SetLeftInputChannel ( const int iNewChan ); virtual void SetRightInputChannel ( const int iNewChan ); @@ -68,18 +69,34 @@ public: AudioDeviceID CurrentAudioInputDeviceID; AudioDeviceID CurrentAudioOutputDeviceID; int iNumInChan; + int iNumInChanPlusAddChan; // includes additional "added" channels int iNumOutChan; int iSelInputLeftChannel; int iSelInputRightChannel; int iSelOutputLeftChannel; int iSelOutputRightChannel; + int iSelInBufferLeft; + int iSelInBufferRight; + int iSelInInterlChLeft; + int iSelInInterlChRight; + int iSelAddInBufferLeft; + int iSelAddInBufferRight; + int iSelAddInInterlChLeft; + int iSelAddInInterlChRight; + int iSelOutBufferLeft; + int iSelOutBufferRight; + int iSelOutInterlChLeft; + int iSelOutInterlChRight; + CVector vecNumInBufChan; + CVector vecNumOutBufChan; protected: virtual QString LoadAndInitializeDriver ( int iIdx, bool ); - QString CheckDeviceCapabilities ( const int iDriverIdx ); + QString CheckDeviceCapabilities ( const int iDriverIdx ); + void UpdateChSelection(); + int CountChannels ( AudioDeviceID devID, - const int iNumChanPerFrame, bool isInput ); UInt32 SetBufferSize ( AudioDeviceID& audioDeviceID, diff --git a/src/aboutdlgbase.ui b/src/aboutdlgbase.ui index c6ed9d23..398f30f8 100755 --- a/src/aboutdlgbase.ui +++ b/src/aboutdlgbase.ui @@ -30,174 +30,134 @@ - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - true - - - false - - - - - - - - 0 - 0 - - - - TextLabelVersion - - - Qt::AlignCenter - - - false - - - - - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Author: Volker Fischer - - - false - - - - - - - Copyright (C) 2005-2020 - - - false - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 20 - 20 - - - - - - - + + + + 0 + 0 + + + + + + + :/png/main/res/fronticon.png + + + Qt::AlignCenter + + + + 0 + - + - + TextLabelVersion - - :/png/main/res/logopicture.png + + false + + + 2 - - - Qt::Vertical + + + Copyright (C) 2005-2020 Volker Fischer and others - - QSizePolicy::Minimum + + false - - - 20 - 1 - + + 2 - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + - + + + 0 + + + + A&bout + + + + + + true + + + + + + + + &Libraries + + + + + + true + + + + + + + + &Contributors + + + + + + true + + + + + + + + &Translation + + + + + + true + + + + + + @@ -251,7 +211,6 @@ buttonOk - txvCredits diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp index 79433433..06b2afc9 100644 --- a/src/audiomixerboard.cpp +++ b/src/audiomixerboard.cpp @@ -43,11 +43,11 @@ CChannelFader::CChannelFader ( QWidget* pNW, pPan = new QSlider (Qt::Horizontal, pLevelsBox); pMuteSoloBox = new QWidget ( pFrame ); - pcbMute = new QCheckBox ( "Mute", pMuteSoloBox ); - pcbSolo = new QCheckBox ( "Solo", pMuteSoloBox ); + pcbMute = new QCheckBox ( tr ( "Mute" ), pMuteSoloBox ); + pcbSolo = new QCheckBox ( tr ( "Solo" ), pMuteSoloBox ); pLabelInstBox = new QGroupBox ( pFrame ); - plblLabel = new QLabel ( "", pFrame ); + plblLabel = new QLabel ( "", pFrame ); plblInstrument = new QLabel ( pFrame ); plblCountryFlag = new QLabel ( pFrame ); @@ -116,15 +116,15 @@ CChannelFader::CChannelFader ( QWidget* pNW, Reset(); // add help text to controls - plbrChannelLevel->setWhatsThis ( tr ( "Channel Level: Displays the " - "pre-fader audio level of this channel. All connected clients at the " + plbrChannelLevel->setWhatsThis ( "" + tr ( "Channel Level" ) + ": " + + tr ( "Displays the pre-fader audio level of this channel. All connected clients at the " "server will be assigned an audio level, the same value for each client." ) ); plbrChannelLevel->setAccessibleName ( tr ( "Input level of the current audio " "channel at the server" ) ); - pFader->setWhatsThis ( tr ( "Mixer Fader: Adjusts the audio level of " - "this channel. All connected clients at the server will be assigned " - "an audio fader at each client, adjusting the local mix." ) ); + pFader->setWhatsThis ( "" + tr ( "Mixer Fader" ) + ": " + tr ( + "Adjusts the audio level of this channel. All connected clients at the server " + "will be assigned an audio fader at each client, adjusting the local mix." ) ); pFader->setAccessibleName ( tr ( "Local mix level setting of the current audio " "channel at the server" ) ); @@ -132,17 +132,17 @@ CChannelFader::CChannelFader ( QWidget* pNW, " Works only in stero or preferably mono in/stereo out mode." ) ); pPan->setAccessibleName ( tr ( "Local panning position of the current audio channel at the server" ) ); - pcbMute->setWhatsThis ( tr ( "Mute: With the Mute checkbox, the " - "audio channel can be muted." ) ); + pcbMute->setWhatsThis ( "" + tr ( "Mute" ) + ": " + tr ( + "With the Mute checkbox, the audio channel can be muted." ) ); pcbMute->setAccessibleName ( tr ( "Mute button" ) ); - pcbSolo->setWhatsThis ( tr ( "Solo: With the Solo checkbox, the " + pcbSolo->setWhatsThis ( "" + tr ( "Solo" ) + ": " + tr ( "With the Solo checkbox, the " "audio channel can be set to solo which means that all other channels " "except of the current channel are muted. It is possible to set more than " "one channel to solo." ) ); pcbSolo->setAccessibleName ( tr ( "Solo button" ) ); - QString strFaderText = tr ( "Fader Tag: The fader tag " + QString strFaderText = "" + tr ( "Fader Tag" ) + ": " + tr ( "The fader tag " "identifies the connected client. The tag name, the picture of your " "instrument and a flag of your country can be set in the main window." ); @@ -474,13 +474,13 @@ void CChannelFader::SetChannelInfos ( const CChannelInfo& cChanInfo ) // alias/name if ( !strReceivedName.isEmpty() ) { - strToolTip += "

Alias/Name

" + strReceivedName; + strToolTip += "

" + tr ( "Alias/Name" ) + "

" + strReceivedName; } // instrument if ( !CInstPictures::IsNotUsedInstrument ( iTTInstrument ) ) { - strToolTip += "

Instrument

" + + strToolTip += "

" + tr ( "Instrument" ) + "

" + CInstPictures::GetName ( iTTInstrument ); } @@ -488,7 +488,7 @@ void CChannelFader::SetChannelInfos ( const CChannelInfo& cChanInfo ) if ( ( eTTCountry != QLocale::AnyCountry ) || ( !cChanInfo.strCity.isEmpty() ) ) { - strToolTip += "

Location

"; + strToolTip += "

" + tr ( "Location" ) + "

"; if ( !cChanInfo.strCity.isEmpty() ) { @@ -510,15 +510,15 @@ void CChannelFader::SetChannelInfos ( const CChannelInfo& cChanInfo ) switch ( cChanInfo.eSkillLevel ) { case SL_BEGINNER: - strToolTip += "

Skill Level

Beginner"; + strToolTip += "

" + tr ( "Skill Level" ) + "

" + tr ( "Beginner" ); break; case SL_INTERMEDIATE: - strToolTip += "

Skill Level

Intermediate"; + strToolTip += "

" + tr ( "Skill Level" ) + "

" + tr ( "Intermediate" ); break; case SL_PROFESSIONAL: - strToolTip += "

Skill Level

Expert"; + strToolTip += "

" + tr ( "Skill Level" ) + "

" + tr ( "Expert" ); break; case SL_NOT_SET: @@ -529,7 +529,7 @@ void CChannelFader::SetChannelInfos ( const CChannelInfo& cChanInfo ) // if no information is given, leave the tool tip empty, otherwise add header if ( !strToolTip.isEmpty() ) { - strToolTip.prepend ( "

Musician Profile

" ); + strToolTip.prepend ( "

" + tr ( "Musician Profile" ) + "

" ); } plblCountryFlag->setToolTip ( strToolTip ); @@ -746,7 +746,7 @@ void CAudioMixerBoard::SetServerName ( const QString& strNewServerName ) if ( strServerName.isEmpty() ) { // no connection or connection was reset: show default title - pGroupBox->setTitle ( "Server" ); + pGroupBox->setTitle ( tr ( "Server" ) ); } else { @@ -755,13 +755,7 @@ void CAudioMixerBoard::SetServerName ( const QString& strNewServerName ) // list was received, the connection was successful and the title is updated // with the correct server name. Make sure to choose a "try to connect" title // which is most striking (we use filled blocks and upper case letters). - QByteArray baBlock; - baBlock.append ( 0xE2 ); - baBlock.append ( 0x96 ); - baBlock.append ( 0x88 ); - QString sBlocks = QString().fromUtf8 ( baBlock ).repeated ( 5 ); - - pGroupBox->setTitle ( sBlocks + " T R Y I N G T O C O N N E C T " + sBlocks ); + pGroupBox->setTitle ( u8"\u2588\u2588\u2588\u2588\u2588 " + tr ( "T R Y I N G T O C O N N E C T" ) + u8" \u2588\u2588\u2588\u2588\u2588" ); } } diff --git a/src/audiomixerboard.h b/src/audiomixerboard.h index b73fbbaa..9cbefc1c 100644 --- a/src/audiomixerboard.h +++ b/src/audiomixerboard.h @@ -52,7 +52,7 @@ public: void SetChannelInfos ( const CChannelInfo& cChanInfo ); void Show() { pFrame->show(); } void Hide() { pFrame->hide(); } - bool IsVisible() { return plblLabel->isVisible(); } + bool IsVisible() { return !pFrame->isHidden(); } bool IsSolo() { return pcbSolo->isChecked(); } bool IsMute() { return pcbMute->isChecked(); } void SetGUIDesign ( const EGUIDesign eNewDesign ); diff --git a/src/chatdlg.cpp b/src/chatdlg.cpp index 1a06c53e..f2fd1769 100755 --- a/src/chatdlg.cpp +++ b/src/chatdlg.cpp @@ -34,14 +34,14 @@ CChatDlg::CChatDlg ( QWidget* parent, Qt::WindowFlags f ) : // Add help text to controls ----------------------------------------------- // chat window - txvChatWindow->setWhatsThis ( tr ( "Chat Window: The chat window " - "shows a history of all chat messages." ) ); + txvChatWindow->setWhatsThis ( "" + tr ( "Chat Window" ) + ": " + tr ( + "The chat window shows a history of all chat messages." ) ); txvChatWindow->setAccessibleName ( tr ( "Chat history" ) ); // input message text - edtLocalInputText->setWhatsThis ( tr ( "Input Message Text: Enter " - "the chat message text in the edit box and press enter to send the " + edtLocalInputText->setWhatsThis ( "" + tr ( "Input Message Text" ) + ": " + tr ( + "Enter the chat message text in the edit box and press enter to send the " "message to the server which distributes the message to all connected " "clients. Your message will then show up in the chat window." ) ); diff --git a/src/client.cpp b/src/client.cpp index 515bc012..1259e3ee 100755 --- a/src/client.cpp +++ b/src/client.cpp @@ -29,7 +29,8 @@ CClient::CClient ( const quint16 iPortNumber, const QString& strConnOnStartupAddress, const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ) : + const bool bNoAutoJackConnect, + const QString& strNClientName ) : vstrIPAddress ( MAX_NUM_SERVER_ADDR_ITEMS, "" ), ChannelInfo (), vecStoredFaderTags ( MAX_NUM_STORED_FADER_SETTINGS, "" ), @@ -38,6 +39,7 @@ CClient::CClient ( const quint16 iPortNumber, vecStoredFaderIsMute ( MAX_NUM_STORED_FADER_SETTINGS, false ), iNewClientFaderLevel ( 100 ), bConnectDlgShowAllMusicians ( true ), + strClientName ( strNClientName ), vecWindowPosMain (), // empty array vecWindowPosSettings (), // empty array vecWindowPosChat (), // empty array @@ -59,7 +61,7 @@ CClient::CClient ( const quint16 iPortNumber, bIsInitializationPhase ( true ), bMuteOutStream ( false ), Socket ( &Channel, iPortNumber ), - Sound ( AudioCallback, this, iCtrlMIDIChannel, bNoAutoJackConnect ), + Sound ( AudioCallback, this, iCtrlMIDIChannel, bNoAutoJackConnect, strNClientName ), iAudioInFader ( AUD_FADER_IN_MIDDLE ), bReverbOnLeftChan ( false ), iReverbLevel ( 0 ), @@ -945,7 +947,7 @@ vecsMultChanAudioSndCrd = vecsStereoSndCrdTMP; // TEST just copy the stereo data void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) { - int i, j; + int i, j, iUnused; unsigned char* pCurCodedData; @@ -957,7 +959,7 @@ void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) if ( iReverbLevel != 0 ) { // calculate attenuation amplification factor - const double dRevLev = static_cast ( iReverbLevel ) / AUD_REVERB_MAX / 2; + const double dRevLev = static_cast ( iReverbLevel ) / AUD_REVERB_MAX / 4; if ( eAudioChannelConf == CC_STEREO ) { @@ -1094,19 +1096,19 @@ void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) { if ( bMuteOutStream ) { - opus_custom_encode ( CurOpusEncoder, - &vecZeros[i * iNumAudioChannels * iOPUSFrameSizeSamples], - iOPUSFrameSizeSamples, - &vecCeltData[0], - iCeltNumCodedBytes ); + iUnused = opus_custom_encode ( CurOpusEncoder, + &vecZeros[i * iNumAudioChannels * iOPUSFrameSizeSamples], + iOPUSFrameSizeSamples, + &vecCeltData[0], + iCeltNumCodedBytes ); } else { - opus_custom_encode ( CurOpusEncoder, - &vecsStereoSndCrd[i * iNumAudioChannels * iOPUSFrameSizeSamples], - iOPUSFrameSizeSamples, - &vecCeltData[0], - iCeltNumCodedBytes ); + iUnused = opus_custom_encode ( CurOpusEncoder, + &vecsStereoSndCrd[i * iNumAudioChannels * iOPUSFrameSizeSamples], + iOPUSFrameSizeSamples, + &vecCeltData[0], + iCeltNumCodedBytes ); } } @@ -1150,11 +1152,11 @@ void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) // OPUS decoding if ( CurOpusDecoder != nullptr ) { - opus_custom_decode ( CurOpusDecoder, - pCurCodedData, - iCeltNumCodedBytes, - &vecsStereoSndCrd[i * iNumAudioChannels * iOPUSFrameSizeSamples], - iOPUSFrameSizeSamples ); + iUnused = opus_custom_decode ( CurOpusDecoder, + pCurCodedData, + iCeltNumCodedBytes, + &vecsStereoSndCrd[i * iNumAudioChannels * iOPUSFrameSizeSamples], + iOPUSFrameSizeSamples ); } } @@ -1204,6 +1206,8 @@ fflush(pFileDelay); // update socket buffer size Channel.UpdateSocketBufferSize(); + + Q_UNUSED ( iUnused ) } int CClient::EstimatedOverallDelay ( const int iPingTimeMs ) diff --git a/src/client.h b/src/client.h index 3dbbd0b6..dd2eacb2 100755 --- a/src/client.h +++ b/src/client.h @@ -107,7 +107,8 @@ public: CClient ( const quint16 iPortNumber, const QString& strConnOnStartupAddress, const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ); + const bool bNoAutoJackConnect, + const QString& strNClientName ); void Start(); void Stop(); @@ -285,6 +286,7 @@ public: CVector vecStoredFaderIsMute; int iNewClientFaderLevel; bool bConnectDlgShowAllMusicians; + QString strClientName; // window position/state settings QByteArray vecWindowPosMain; @@ -399,7 +401,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 ); diff --git a/src/clientdlg.cpp b/src/clientdlg.cpp index 1a5dc9f1..2b30023d 100755 --- a/src/clientdlg.cpp +++ b/src/clientdlg.cpp @@ -48,10 +48,10 @@ CClientDlg::CClientDlg ( CClient* pNCliP, // Add help text to controls ----------------------------------------------- // input level meter - QString strInpLevH = tr ( "Input Level Meter: The input level " + QString strInpLevH = "" + tr ( "Input Level Meter" ) + ": " + tr ( "The input level " "indicators show the input level of the two stereo channels " - "of the current selected audio input.
" - "Make sure not to clip the input signal to avoid distortions of the " + "of the current selected audio input." ) + "
" + + tr ( "Make sure not to clip the input signal to avoid distortions of the " "audio signal." ); QString strInpLevHTT = tr ( "If the " ) + APP_NAME + @@ -60,13 +60,13 @@ CClientDlg::CClientDlg ( CClient* pNCliP, "meter should flicker. If this is not the case, you have " "probably selected the wrong input channel (e.g. line in instead " "of the microphone input) or set the input gain too low in the " - "(Windows) audio mixer.
For a proper usage of the " ) + APP_NAME + - tr ( " software, " + "(Windows) audio mixer." ) + "
" + tr ( "For a proper usage of the " ) + + APP_NAME + tr ( " software, " "you should not hear your singing/instrument in the loudspeaker or " "your headphone when the " ) + APP_NAME + tr ( " software is not connected. This can " "be achieved by muting your input audio channel in the Playback " - "mixer (not the Recording mixer!)." ) + TOOLTIP_COM_END_TEXT; + "mixer (not the Recording mixer!)." ) + TOOLTIP_COM_END_TEXT; QString strInpLevHAccText = tr ( "Input level meter" ); QString strInpLevHAccDescr = tr ( "Simulates an analog LED level meter." ); @@ -84,8 +84,8 @@ CClientDlg::CClientDlg ( CClient* pNCliP, lbrInputLevelR->setToolTip ( strInpLevHTT ); // connect/disconnect button - butConnect->setWhatsThis ( tr ( "Connect / Disconnect Button:" - " Push this button to connect a server. A dialog where you can " + butConnect->setWhatsThis ( "" + tr ( "Connect/Disconnect Button" ) + ": " + + tr ( "Push this button to connect a server. A dialog where you can " "select a server will open. If you are connected, pressing this " "button will end the session." ) ); @@ -98,14 +98,15 @@ CClientDlg::CClientDlg ( CClient* pNCliP, "and disconnecting the " ) + APP_NAME + tr ( " software." ) ); // local audio input fader - QString strAudFader = tr ( "Local Audio Input Fader: With the " - "audio fader, the relative levels of the left and right local audio " + QString strAudFader = "" + tr ( "Local Audio Input Fader" ) + ": " + + tr ( "With the audio fader, the relative levels of the left and right local audio " "channels can be changed. For a mono signal it acts like a panning " "between the two channels. If, e.g., a microphone is connected to " "the right input channel and an instrument is connected to the left " "input channel which is much louder than the microphone, move the " - "audio fader in a direction where the label above the fader shows " - "L -x, where x is the current attenuation indicator." ); + "audio fader in a direction where the label above the fader shows " ) + + "" + tr ( "L" ) + " -x" + tr ( ", where" ) + " x " + + tr ( "is the current attenuation indicator." ); lblAudioPan->setWhatsThis ( strAudFader ); lblAudioPanValue->setWhatsThis ( strAudFader ); @@ -114,14 +115,14 @@ CClientDlg::CClientDlg ( CClient* pNCliP, sldAudioPan->setAccessibleName ( tr ( "Local audio input fader (left/right)" ) ); // reverberation level - QString strAudReverb = tr ( "Reverberation Level: 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 " + QString strAudReverb = "" + tr ( "Reverberation Level" ) + ": " + + tr ( "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.
" + "desired reverberation level is reached." ) + "
" + tr ( "The reverberation effect requires significant CPU so that it should " "only be used on fast PCs. If the reverberation level fader is set to " "minimum (which is the default setting), the reverberation effect is " @@ -133,8 +134,8 @@ CClientDlg::CClientDlg ( CClient* pNCliP, sldAudioReverb->setAccessibleName ( tr ( "Reverberation effect level setting" ) ); // reverberation channel selection - QString strRevChanSel = tr ( "Reverberation Channel Selection: " - "With these radio buttons the audio input channel on which the " + QString strRevChanSel = "" + tr ( "Reverberation Channel Selection" ) + ": " + + tr ( "With these radio buttons the audio input channel on which the " "reverberation effect is applied can be chosen. Either the left " "or right input channel can be selected." ); @@ -144,8 +145,8 @@ CClientDlg::CClientDlg ( CClient* pNCliP, rbtReverbSelR->setAccessibleName ( tr ( "Right channel selection for reverberation" ) ); // delay LED - QString strLEDDelay = tr ( "Delay Status LED: " - "The delay status LED indicator shows the current audio delay " + QString strLEDDelay = "" + tr ( "Delay Status LED" ) + ": " + + tr ( "The delay status LED indicator shows the current audio delay " "status. If the light is green, the delay is perfect for a jam " "session. If the light is yellow, a session is still possible but " "it may be harder to play. If the light is red, the delay is too " @@ -160,20 +161,20 @@ CClientDlg::CClientDlg ( CClient* pNCliP, ledDelay->setAccessibleName ( tr ( "Delay status LED indicator" ) ); // buffers LED - QString strLEDBuffers = tr ( "Buffers Status LED: " - "The buffers status LED indicator shows the current audio/streaming " + QString strLEDBuffers = "" + tr ( "Buffers Status LED" ) + ": " + + tr ( "The buffers status LED indicator shows the current audio/streaming " "status. If the light is green, there are no buffer overruns/underruns " "and the audio stream is not interrupted. If the light is red, the " - "audio stream is interrupted caused by one of the following problems:" + "audio stream is interrupted caused by one of the following problems:" ) + "
    " - "
  • The network jitter buffer is not large enough for the current " - "network/audio interface jitter.
  • " - "
  • The sound card buffer delay (buffer size) is set to a too small " - "value.
  • " - "
  • The upload or download stream rate is too high for the current " - "available internet bandwidth.
  • " - "
  • The CPU of the client or server is at 100%.
  • " - "
" ); + "
  • " + tr ( "The network jitter buffer is not large enough for the current " + "network/audio interface jitter." ) + "
  • " + "
  • " + tr ( "The sound card buffer delay (buffer size) is set to a too small " + "value." ) + "
  • " + "
  • " + tr ( "The upload or download stream rate is too high for the current " + "available internet bandwidth." ) + "
  • " + "
  • " + tr ( "The CPU of the client or server is at 100%." ) + "
  • " + ""; lblBuffers->setWhatsThis ( strLEDBuffers ); ledBuffers->setWhatsThis ( strLEDBuffers ); @@ -200,7 +201,7 @@ CClientDlg::CClientDlg ( CClient* pNCliP, OnTimerStatus(); // init connection button text - butConnect->setText ( CON_BUT_CONNECTTEXT ); + butConnect->setText ( tr ( "C&onnect" ) ); // init input level meter bars lbrInputLevelL->setValue ( 0 ); @@ -252,7 +253,7 @@ CClientDlg::CClientDlg ( CClient* pNCliP, // View menu -------------------------------------------------------------- - pViewMenu = new QMenu ( "&View", this ); + pViewMenu = new QMenu ( tr ( "&View" ), this ); pViewMenu->addAction ( tr ( "&Connection Setup..." ), this, SLOT ( OnOpenConnectionSetupDialog() ) ); @@ -283,7 +284,7 @@ CClientDlg::CClientDlg ( CClient* pNCliP, pMenu = new QMenuBar ( this ); pMenu->addMenu ( pViewMenu ); - pMenu->addMenu ( new CHelpMenu ( this ) ); + pMenu->addMenu ( new CHelpMenu ( true, this ) ); // Now tell the layout about the menu layout()->setMenuBar ( pMenu ); @@ -323,7 +324,7 @@ CClientDlg::CClientDlg ( CClient* pNCliP, { // default icon and name for no flag selected CurFlagIcon.addFile ( ":/png/flags/res/flags/flagnone.png" ); - sCurCountryName = "None"; + sCurCountryName = tr ( "None" ); } else { @@ -606,20 +607,20 @@ void CClientDlg::UpdateAudioFaderSlider() // attenuated if ( iCurAudInFader == AUD_FADER_IN_MIDDLE ) { - lblAudioPanValue->setText ( "Center" ); + lblAudioPanValue->setText ( tr ( "Center" ) ); } else { if ( iCurAudInFader > AUD_FADER_IN_MIDDLE ) { // attenuation on right channel - lblAudioPanValue->setText ( "R -" + + lblAudioPanValue->setText ( tr ( "R" ) + " -" + QString().setNum ( iCurAudInFader - AUD_FADER_IN_MIDDLE ) ); } else { // attenuation on left channel - lblAudioPanValue->setText ( "L -" + + lblAudioPanValue->setText ( tr ( "L" ) + " -" + QString().setNum ( AUD_FADER_IN_MIDDLE - iCurAudInFader ) ); } } @@ -734,16 +735,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 @@ -812,18 +803,18 @@ void CClientDlg::SetMyWindowTitle ( const int iNumClients ) if ( iNumClients == 0 ) { // only application name - setWindowTitle ( APP_NAME ); + setWindowTitle ( pClient->strClientName ); } else { if ( iNumClients == 1 ) { - setWindowTitle ( QString ( APP_NAME ) + " (1 user)" ); + setWindowTitle ( QString ( pClient->strClientName ) + " (1 " + tr ( "user" ) + ")" ); } else { - setWindowTitle ( QString ( APP_NAME ) + - QString ( " (%1 users)" ).arg ( iNumClients ) ); + setWindowTitle ( QString ( pClient->strClientName ) + + QString ( " (%1 " + tr ( "users" ) + ")" ).arg ( iNumClients ) ); } } @@ -1060,7 +1051,7 @@ void CClientDlg::Connect ( const QString& strSelectedAddress, } // change connect button text to "disconnect" - butConnect->setText ( CON_BUT_DISCONNECTTEXT ); + butConnect->setText ( tr ( "D&isconnect" ) ); // set server name in audio mixer group box title MainMixerBoard->SetServerName ( strMixerBoardLabel ); @@ -1084,7 +1075,7 @@ void CClientDlg::Disconnect() } // change connect button text to "connect" - butConnect->setText ( CON_BUT_CONNECTTEXT ); + butConnect->setText ( tr ( "C&onnect" ) ); // reset server name in audio mixer group box title MainMixerBoard->SetServerName ( "" ); diff --git a/src/clientdlg.h b/src/clientdlg.h index 8c870878..ccff42c8 100755 --- a/src/clientdlg.h +++ b/src/clientdlg.h @@ -51,10 +51,6 @@ /* Definitions ****************************************************************/ -// text strings for connection button for connect and disconnect -#define CON_BUT_CONNECTTEXT "C&onnect" -#define CON_BUT_DISCONNECTTEXT "D&isconnect" - // update time for GUI controls #define LEVELMETER_UPDATE_TIME_MS 100 // ms #define BUFFER_LED_UPDATE_TIME_MS 300 // ms @@ -102,7 +98,7 @@ protected: QTimer TimerStatus; QTimer TimerPing; - virtual void closeEvent ( QCloseEvent* Event ); + virtual void closeEvent ( QCloseEvent* Event ); void UpdateDisplay(); QMenu* pViewMenu; @@ -201,7 +197,7 @@ public slots: { MainMixerBoard->SetChannelLevels ( vecLevelList ); } void OnConnectDlgAccepted(); - void OnDisconnected(); + void OnDisconnected() { Disconnect(); } void OnCentralServerAddressTypeChanged(); void OnGUIDesignChanged() diff --git a/src/clientdlgbase.ui b/src/clientdlgbase.ui index 3794e7a4..6f30a5e8 100755 --- a/src/clientdlgbase.ui +++ b/src/clientdlgbase.ui @@ -249,7 +249,7 @@ - 16 + 19 88 @@ -265,7 +265,7 @@ - 16 + 19 88 @@ -548,43 +548,13 @@
    - - - QFrame::NoFrame + + + + 0 + 0 + - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - diff --git a/src/clientsettingsdlg.cpp b/src/clientsettingsdlg.cpp index c3263123..0e18604c 100755 --- a/src/clientsettingsdlg.cpp +++ b/src/clientsettingsdlg.cpp @@ -34,34 +34,34 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, // Add help text to controls ----------------------------------------------- // jitter buffer - QString strJitterBufferSize = tr ( "Jitter Buffer Size: The jitter " - "buffer compensates for network and sound card timing jitters. The " + QString strJitterBufferSize = "" + tr ( "Jitter Buffer Size" ) + ": " + tr ( + "The jitter buffer compensates for network and sound card timing jitters. The " "size of this jitter buffer has therefore influence on the quality of " "the audio stream (how many dropouts occur) and the overall delay " - "(the longer the buffer, the higher the delay).
    " + "(the longer the buffer, the higher the delay)." ) + "
    " + tr ( "The jitter buffer size can be manually chosen for the local client " "and the remote server. For the local jitter buffer, dropouts in the " "audio stream are indicated by the light on the bottom " "of the jitter buffer size faders. If the light turns to red, a buffer " - "overrun/underrun took place and the audio stream is interrupted.
    " + "overrun/underrun took place and the audio stream is interrupted." ) + "
    " + tr ( "The jitter buffer setting is therefore a trade-off between audio " - "quality and overall delay.
    " + "quality and overall delay." ) + "
    " + tr ( "An auto setting of the jitter buffer size setting is available. If " "the check Auto is enabled, the jitter buffers of the local client and " "the remote server are set automatically " "based on measurements of the network and sound card timing jitter. If " - "the Auto check is enabled, the jitter buffer size faders are " + "the Auto check is enabled, the jitter buffer size faders are " "disabled (they cannot be moved with the mouse)." ); QString strJitterBufferSizeTT = tr ( "In case the auto setting of the " "jitter buffer is enabled, the network buffers of the local client and " "the remote server are set to a conservative " - "value to minimize the audio dropout probability. To tweak the " - "audio delay/latency it is recommended to disable the auto setting " - "functionality and to lower the jitter buffer size manually by " + "value to minimize the audio dropout probability. To tweak the " + "audio delay/latency it is recommended to disable the auto setting " + "functionality and to lower the jitter buffer size manually by " "using the sliders until your personal acceptable limit of the amount " "of dropouts is reached. The LED indicator will visualize the audio " - "dropouts of the local jitter buffer by a red light" ) + + "dropouts of the local jitter buffer by a red light." ) + TOOLTIP_COM_END_TEXT; lblNetBuf->setWhatsThis ( strJitterBufferSize ); @@ -80,11 +80,11 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, ledNetw->setToolTip ( strJitterBufferSizeTT ); // sound card device - cbxSoundcard->setWhatsThis ( tr ( "Sound Card Device: The ASIO " - "driver (sound card) can be selected using " ) + APP_NAME + + cbxSoundcard->setWhatsThis ( "" + tr ( "Sound Card Device" ) + ": " + + tr ( "The ASIO driver (sound card) can be selected using " ) + APP_NAME + tr ( " under the Windows operating system. Under MacOS/Linux, no sound " "card selection is possible. If the selected ASIO driver is not valid " - "an error message is shown and the previous valid driver is selected.
    " + "an error message is shown and the previous valid driver is selected." ) + "
    " + tr ( "If the driver is selected during an active connection, the connection " "is stopped, the driver is changed and the connection is started again " "automatically." ) ); @@ -93,19 +93,19 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, #ifdef _WIN32 // set Windows specific tool tip - cbxSoundcard->setToolTip ( tr ( "In case the ASIO4ALL driver is used, " + cbxSoundcard->setToolTip ( tr ( "In case the ASIO4ALL driver is used, " "please note that this driver usually introduces approx. 10-30 ms of " "additional audio delay. Using a sound card with a native ASIO driver " - "is therefore recommended.
    If you are using the kX ASIO " + "is therefore recommended." ) + "
    " + tr ( "If you are using the kX ASIO " "driver, make sure to connect the ASIO inputs in the kX DSP settings " "panel." ) + TOOLTIP_COM_END_TEXT ); #endif // sound card input/output channel mapping - QString strSndCrdChanMapp = tr ( "Sound Card Channel Mapping: " - "In case the selected sound card device offers more than one " + QString strSndCrdChanMapp = "" + tr ( "Sound Card Channel Mapping" ) + ": " + + tr ( "In case the selected sound card device offers more than one " "input or output channel, the Input Channel Mapping and Output " - "Channel Mapping settings are visible.
    " + "Channel Mapping settings are visible." ) + "
    " + tr ( "For each " ) + APP_NAME + tr ( " input/output channel (Left and " "Right channel) a different actual sound card channel can be " "selected." ); @@ -122,8 +122,8 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, cbxROutChan->setAccessibleName ( tr ( "Right output channel selection combo box" ) ); // enable OPUS64 - chbEnableOPUS64->setWhatsThis ( tr ( "Enable Small Network Buffers: If enabled, " - "the support for very small network audio packets is activated. Very small " + chbEnableOPUS64->setWhatsThis ( "" + tr ( "Enable Small Network Buffers" ) + ": " + tr ( + "If enabled, the support for very small network audio packets is activated. Very small " "network packets are only actually used if the sound card buffer delay is smaller than " ) + QString().setNum ( DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES ) + tr ( " samples. The " "smaller the network buffers, the smaller the audio latency. But at the same time " @@ -132,35 +132,35 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, chbEnableOPUS64->setAccessibleName ( tr ( "Enable small network buffers check box" ) ); // sound card buffer delay - QString strSndCrdBufDelay = tr ( "Sound Card Buffer Delay: The " - "buffer delay setting is a fundamental setting of the " ) + + QString strSndCrdBufDelay = "" + tr ( "Sound Card Buffer Delay" ) + ": " + + tr ( "The buffer delay setting is a fundamental setting of the " ) + APP_NAME + tr ( " software. This setting has influence on many " - "connection properties.
    " - "Three buffer sizes are supported:" - "
      " - "
    • 64 samples: This is the preferred setting since it gives lowest " - "latency but does not work with all sound cards.
    • " - "
    • 128 samples: This setting should work on most of the available " - "sound cards.
    • " - "
    • 256 samples: This setting should only be used if only a very slow " - "computer or a slow internet connection is available.
    • " - "
    " + "connection properties." ) + "
    " + tr ( + "Three buffer sizes are supported" ) + + ":
      " + "
    • " + tr ( "64 samples: This is the preferred setting since it gives lowest " + "latency but does not work with all sound cards." ) + "
    • " + "
    • " + tr ( "128 samples: This setting should work on most of the available " + "sound cards." ) + "
    • " + "
    • " + tr ( "256 samples: This setting should only be used if only a very slow " + "computer or a slow internet connection is available." ) + "
    • " + "
    " + tr ( "Some sound card driver do not allow the buffer delay to be changed " "from within the " ) + APP_NAME + tr ( " software. In this case the buffer delay setting " "is disabled. To change the actual buffer delay, this " "setting has to be changed in the sound card driver. On Windows, press " "the ASIO Setup button to open the driver settings panel. On Linux, " - "use the Jack configuration tool to change the buffer size.
    " + "use the Jack configuration tool to change the buffer size." ) + "
    " + tr ( "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.
    " + "performance." ) + "
    " + 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 " "outs) and the higher the upload rate and the lower the overall " - "delay.
    " + "delay." ) + "
    " + tr ( "The buffer setting is therefore a trade-off between audio " "quality and overall delay." ); @@ -185,19 +185,19 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, butDriverSetup->setToolTip ( strSndCrdBufDelayTT ); // fancy skin - chbGUIDesignFancy->setWhatsThis ( tr ( "Fancy Skin: If enabled, " - "a fancy skin will be applied to the main window." ) ); + chbGUIDesignFancy->setWhatsThis ( "" + tr ( "Fancy Skin" ) + ": " + tr ( + "If enabled, a fancy skin will be applied to the main window." ) ); chbGUIDesignFancy->setAccessibleName ( tr ( "Fancy skin check box" ) ); // display channel levels - chbDisplayChannelLevels->setWhatsThis ( tr ( "Display Channel Levels: " - "If enabled, each client channel will display a pre-fader level bar." ) ); + chbDisplayChannelLevels->setWhatsThis ( "" + tr ( "Display Channel Levels" ) + ": " + + tr ( "If enabled, each client channel will display a pre-fader level bar." ) ); chbDisplayChannelLevels->setAccessibleName ( tr ( "Display channel levels check box" ) ); // audio channels - QString strAudioChannels = tr ( "Audio Channels: " + QString strAudioChannels = "" + tr ( "Audio Channels" ) + ": " + tr ( "Select the number of audio channels to be used. There are three " "modes available. The mono and stereo modes use one and two " "audio channels respectively. In the mono-in/stereo-out mode " @@ -206,10 +206,10 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, "sound card puts the instrument on one input channel and the " "microphone on the other channel. In that case the two input signals " "can be mixed to one mono channel but the server mix can be heard in " - "stereo.
    " + "stereo." ) + "
    " + tr ( "Enabling the stereo streaming mode will increase the " "stream data rate. Make sure that the current upload rate does not " - "exceed the available bandwidth of your internet connection.
    " + "exceed the available bandwidth of your internet connection." ) + "
    " + tr ( "In case of the stereo streaming mode, no audio channel selection " "for the reverberation effect will be available on the main window " "since the effect is applied on both channels in this case." ); @@ -219,7 +219,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, cbxAudioChannels->setAccessibleName ( tr ( "Audio channels combo box" ) ); // audio quality - QString strAudioQuality = tr ( "Audio Quality: " + QString strAudioQuality = "" + tr ( "Audio Quality" ) + ": " + tr ( "Select the desired audio quality. A low, normal or high audio " "quality can be selected. The higher the audio quality, the higher " "the audio stream data rate. Make sure that the current " @@ -231,8 +231,8 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, cbxAudioQuality->setAccessibleName ( tr ( "Audio quality combo box" ) ); // new client fader level - QString strNewClientLevel = tr ( "New Client Level: The " - "new client level setting defines the fader level of a new " + QString strNewClientLevel = "" + tr ( "New Client Level" ) + ": " + + tr ( "The new client level setting defines the fader level of a new " "connected client in percent. I.e. if a new client connects " "to the current server, it will get the specified initial " "fader level if no other fader level of a previous connection " @@ -243,8 +243,8 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, edtNewClientLevel->setAccessibleName ( tr ( "New client level edit box" ) ); // central server address - QString strCentrServAddr = tr ( "Central Server Address: The " - "central server address is the IP address or URL of the central server " + QString strCentrServAddr = "" + tr ( "Central Server Address" ) + ": " + + tr ( "The central server address is the IP address or URL of the central server " "at which the server list of the connection dialog is managed. With the " "central server address type either the local region can be selected of " "the default central servers or a manual address can be specified." ); @@ -257,15 +257,15 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, edtCentralServerAddress->setAccessibleName ( tr ( "Central server address line edit" ) ); // current connection status parameter - QString strConnStats = tr ( "Current Connection Status " - "Parameter: The ping time is the time required for the audio " + QString strConnStats = "" + tr ( "Current Connection Status " + "Parameter" ) + ": " + tr ( "The ping time is the time required for the audio " "stream to travel from the client to the server and backwards. This " "delay is introduced by the network. This delay should be as low as " "20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to " "the server is too large or your internet connection is not " - "sufficient.
    " + "sufficient." ) + "
    " + tr ( "The overall delay is calculated from the current ping time and the " - "delay which is introduced by the current buffer settings.
    " + "delay which is introduced by the current buffer settings." ) + "
    " + tr ( "The upstream rate depends on the current audio packet size and the " "audio compression setting. Make sure that the upstream rate is not " "higher than the available rate (check the upstream capabilities of " @@ -285,7 +285,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, // init driver button #ifdef _WIN32 - butDriverSetup->setText ( "ASIO Setup" ); + butDriverSetup->setText ( tr ( "ASIO Setup" ) ); #else // no use for this button for MacOS/Linux right now -> hide it butDriverSetup->hide(); @@ -332,23 +332,23 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, // "Audio Channels" combo box cbxAudioChannels->clear(); - cbxAudioChannels->addItem ( "Mono" ); // CC_MONO - cbxAudioChannels->addItem ( "Mono-in/Stereo-out" ); // CC_MONO_IN_STEREO_OUT - cbxAudioChannels->addItem ( "Stereo" ); // CC_STEREO + cbxAudioChannels->addItem ( tr ( "Mono" ) ); // CC_MONO + cbxAudioChannels->addItem ( tr ( "Mono-in/Stereo-out" ) ); // CC_MONO_IN_STEREO_OUT + cbxAudioChannels->addItem ( tr ( "Stereo" ) ); // CC_STEREO cbxAudioChannels->setCurrentIndex ( static_cast ( pClient->GetAudioChannels() ) ); // "Audio Quality" combo box cbxAudioQuality->clear(); - cbxAudioQuality->addItem ( "Low" ); // AQ_LOW - cbxAudioQuality->addItem ( "Normal" ); // AQ_NORMAL - cbxAudioQuality->addItem ( "High" ); // AQ_HIGH + cbxAudioQuality->addItem ( tr ( "Low" ) ); // AQ_LOW + cbxAudioQuality->addItem ( tr ( "Normal" ) ); // AQ_NORMAL + cbxAudioQuality->addItem ( tr ( "High" ) ); // AQ_HIGH cbxAudioQuality->setCurrentIndex ( static_cast ( pClient->GetAudioQuality() ) ); // central server address type combo box cbxCentServAddrType->clear(); - cbxCentServAddrType->addItem ( "Manual" ); // AT_MANUAL - cbxCentServAddrType->addItem ( "Default" ); // AT_DEFAULT - cbxCentServAddrType->addItem ( "Default (North America)" ); // AT_NORTH_AMERICA + cbxCentServAddrType->addItem ( tr ( "Manual" ) ); // AT_MANUAL + cbxCentServAddrType->addItem ( tr ( "Default" ) ); // AT_DEFAULT + cbxCentServAddrType->addItem ( tr ( "Default (North America)" ) ); // AT_NORTH_AMERICA cbxCentServAddrType->setCurrentIndex ( static_cast ( pClient->GetCentralServerAddressType() ) ); UpdateCentralServerDependency(); @@ -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 ) ); @@ -454,11 +454,11 @@ void CClientSettingsDlg::UpdateJitterBufferFrame() // update slider value and text const int iCurNumNetBuf = pClient->GetSockBufNumFrames(); sldNetBuf->setValue ( iCurNumNetBuf ); - lblNetBuf->setText ( "Size: " + QString().setNum ( iCurNumNetBuf ) ); + lblNetBuf->setText ( tr ( "Size: " ) + QString().setNum ( iCurNumNetBuf ) ); const int iCurNumNetBufServer = pClient->GetServerSockBufNumFrames(); sldNetBufServer->setValue ( iCurNumNetBufServer ); - lblNetBufServer->setText ( "Size: " + QString().setNum ( iCurNumNetBufServer ) ); + lblNetBufServer->setText ( tr ( "Size: " ) + QString().setNum ( iCurNumNetBufServer ) ); // if auto setting is enabled, disable slider control const bool bIsAutoSockBufSize = pClient->GetDoAutoSockBufSize(); @@ -515,12 +515,12 @@ void CClientSettingsDlg::UpdateSoundCardFrame() if ( bPreferredChecked || bDefaultChecked || bSafeChecked ) { // default title text - grbSoundCrdBufDelay->setTitle ( "Buffer Delay" ); + grbSoundCrdBufDelay->setTitle ( tr ( "Buffer Delay" ) ); } else { // special title text with buffer size information added - grbSoundCrdBufDelay->setTitle ( "Buffer Delay: " + + grbSoundCrdBufDelay->setTitle ( tr ( "Buffer Delay: " ) + GenSndCrdBufferDelayString ( iCurActualBufSize ) ); } } @@ -633,7 +633,7 @@ void CClientSettingsDlg::OnSoundcardActivated ( int iSndDevIdx ) QString ( tr ( "The selected audio device could not be used " "because of the following error: " ) ) + strError + QString ( tr ( " The previous driver will be selected." ) ), - "Ok", nullptr ); + tr ( "Ok" ), nullptr ); // recover old selection cbxSoundcard->setCurrentIndex ( pClient->GetSndCrdDev() ); diff --git a/src/connectdlg.cpp b/src/connectdlg.cpp index fc5ddc27..b3aa823e 100755 --- a/src/connectdlg.cpp +++ b/src/connectdlg.cpp @@ -44,13 +44,13 @@ CConnectDlg::CConnectDlg ( const bool bNewShowCompleteRegList, // Add help text to controls ----------------------------------------------- // server list - lvwServers->setWhatsThis ( tr ( "Server List: The server list shows " - "a list of available servers which are registered at the central " - "server. Select a server from the list and press the connect button to " + lvwServers->setWhatsThis ( "" + tr ( "Server List" ) + ": " + tr ( + "The server list shows a list of available servers which are registered at the " + "central server. Select a server from the list and press the connect button to " "connect to this server. Alternatively, double click a server from " "the list to connect to it. If a server is occupied, a list of the " "connected musicians is available by expanding the list item. " - "Permanent servers are shown in bold font.
    " + "Permanent servers are shown in bold font." ) + "
    " + tr ( "Note that it may take some time to retrieve the server list from the " "central server. If no valid central server address is specified in " "the settings, no server list will be available." ) ); @@ -58,12 +58,12 @@ CConnectDlg::CConnectDlg ( const bool bNewShowCompleteRegList, lvwServers->setAccessibleName ( tr ( "Server list view" ) ); // server address - QString strServAddrH = tr ( "Server Address: 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, " + QString strServAddrH = "" + tr ( "Server Address" ) + ": " + 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 colon as a separator, e.g, " "example.org:" ) + - QString().setNum ( LLCON_DEFAULT_PORT_NUMBER ) + tr ( ". A list of " + QString().setNum ( LLCON_DEFAULT_PORT_NUMBER ) + tr ( ". A list of " "the most recent used server IP addresses or URLs is available for " "selection." ); @@ -75,13 +75,13 @@ CConnectDlg::CConnectDlg ( const bool bNewShowCompleteRegList, "IP address or URL. It also stores old URLs in the combo box list." ) ); // filter - edtFilter->setWhatsThis ( tr ( "Filter: The server list is filered " - "by the given text. Note that the filter is case insensitive." ) ); + edtFilter->setWhatsThis ( "" + tr ( "Filter" ) + ": " + tr ( "The server " + "list is filered by the given text. Note that the filter is case insensitive." ) ); edtFilter->setAccessibleName ( tr ( "Filter edit box" ) ); // show all mucisians - chbExpandAll->setWhatsThis ( tr ( "Show All Musicians: If you check " - "this check box, the musicians of all servers are shown. If you " + chbExpandAll->setWhatsThis ( "" + tr ( "Show All Musicians" ) + ": " + tr ( + "If you check this check box, the musicians of all servers are shown. If you " "uncheck the check box, all list view items are collapsed.") ); chbExpandAll->setAccessibleName ( tr ( "Show all musicians check box" ) ); diff --git a/src/global.h b/src/global.h index 97823ef6..defc3489 100755 --- a/src/global.h +++ b/src/global.h @@ -105,8 +105,10 @@ LED bar: lbr #define DEFAULT_SERVER_ADDRESS "jamulus.fischvolk.de" #define DEFAULT_SERVER_NAME "Central Server" -// download URL -#define SOFTWARE_DOWNLOAD_URL "http://sourceforge.net/projects/llcon/files" +// getting started and software manual URL +#define CLIENT_GETTING_STARTED_URL "https://github.com/corrados/jamulus/wiki/Software-Manual" +#define SERVER_GETTING_STARTED_URL "https://github.com/corrados/jamulus/wiki/Running-a-Server" +#define SOFTWARE_MANUAL_URL "https://github.com/corrados/jamulus/blob/master/src/res/homepage/manual.md" // determining server internal address uses well-known host and port // (Google DNS, or something else reliable) @@ -218,15 +220,12 @@ LED bar: lbr #define SERVLIST_TIME_PERMSERV_MINUTES 1440 // minutes, 1440 = 60 min * 24 h // registration response timeout -#define REGISTER_SERVER_TIME_OUT_MS 500 // ms +#define REGISTER_SERVER_TIME_OUT_MS 500 // ms // defines the maximum number of times to retry server registration // when no response is received within the timeout (before reverting // to SERVLIST_REGIST_INTERV_MINUTES) -#define REGISTER_SERVER_RETRY_LIMIT 5 // count - -// length of the moving average buffer for response time measurement -#define TIME_MOV_AV_RESPONSE_SECONDS 30 // seconds +#define REGISTER_SERVER_RETRY_LIMIT 5 // count // Maximum length of fader tag and text message strings (Since for chat messages @@ -264,6 +263,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; diff --git a/src/main.cpp b/src/main.cpp index 7d4a09e5..385b5fef 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,49 +33,54 @@ #include "settings.h" #include "testbench.h" #include "util.h" +#ifdef ANDROID +# include +#endif // Implementation ************************************************************** int main ( int argc, char** argv ) { + QTextStream& tsConsole = *( ( new ConsoleWriterFactory() )->get() ); QString strArgument; double rDbleArgument; // initialize all flags and string which might be changed by command line // 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; - 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 = ""; + 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 = 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; // QT docu: argv()[0] is the program name, argv()[1] is the first // argument and argv()[argc()-1] is the last argument. @@ -195,6 +200,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,6 +224,18 @@ int main ( int argc, char** argv ) } + // Disable translations ------------------------------------------------ + if ( GetFlagArgument ( argv, + i, + "-t", + "--notranslation" ) ) + { + bUseTranslation = false; + tsConsole << "- translations disabled" << endl; + continue; + } + + // Show all registered servers in the server list ---------------------- // Undocumented debugging command line argument: Show all registered // servers in the server list regardless if a ping to the server is @@ -222,20 +251,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. @@ -293,7 +308,8 @@ int main ( int argc, char** argv ) 65535, rDbleArgument ) ) { - iPortNumber = static_cast ( rDbleArgument ); + iPortNumber = static_cast ( rDbleArgument ); + bCustomPortNumberGiven = true; tsConsole << "- selected port number: " << iPortNumber << endl; continue; } @@ -327,7 +343,22 @@ int main ( int argc, char** argv ) } - // HTML status file ---------------------------------------------------- + // Client Name --------------------------------------------------------- + if ( GetStringArgument ( tsConsole, + argc, + argv, + i, + "--clientname", + "--clientname", + strArgument ) ) + { + strClientName = QString ( APP_NAME ) + " " + strArgument; + tsConsole << "- client name: " << strClientName << endl; + continue; + } + + + // Server history file name -------------------------------------------- if ( GetStringArgument ( tsConsole, argc, argv, @@ -473,17 +504,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 ); @@ -498,16 +553,16 @@ int main ( int argc, char** argv ) // init resources Q_INIT_RESOURCE(resources); + // load translations + QTranslator myappTranslator; -// TODO translation loading does not yet work -// // load translations -// if ( bUseGUI ) -// { -// QTranslator myappTranslator; -// bool ret = myappTranslator.load ( "src/res/translation_" + QLocale::system().name() ); -//qDebug() << "translation successfully loaded: " << ret << " " << "src/res/translation_" + QLocale::system().name(); -// pApp->installTranslator ( &myappTranslator ); -// } + if ( bUseGUI && bUseTranslation ) + { + if ( myappTranslator.load ( ":/translations/translation.qm" ) ) + { + pApp->installTranslator ( &myappTranslator ); + } + } // TEST -> activate the following line to activate the test bench, @@ -523,7 +578,8 @@ int main ( int argc, char** argv ) CClient Client ( iPortNumber, strConnOnStartupAddress, iCtrlMIDIChannel, - bNoAutoJackConnect ); + bNoAutoJackConnect, + strClientName ); // load settings from init-file CSettings Settings ( &Client, strIniFileName ); @@ -568,7 +624,7 @@ int main ( int argc, char** argv ) strWelcomeMessage, strRecordingDirName, bCentServPingServerInList, - bDisconnectAllClients, + bDisconnectAllClientsOnQuit, bUseDoubleSystemFrameSize, eLicenceType ); if ( bUseGUI ) @@ -636,44 +692,45 @@ int main ( int argc, char** argv ) QString UsageArguments ( char **argv ) { return - "Usage: " + QString ( argv[0] ) + " [option] [argument]\n" + "Usage: " + QString ( argv[0] ) + " [option] [optional argument]\n" "\nRecognized options:\n" - " -a, --servername server name, required for HTML status (server\n" - " only)\n" - " -c, --connect connect to given server address on startup\n" - " (client only)\n" - " -e, --centralserver address of the central server (server only)\n" - " -F, --fastupdate use 64 samples frame size mode (server only)\n" - " -g, --pingservers ping servers in list to keep NAT port open\n" - " (central server only)\n" " -h, -?, --help display this help text and exit\n" " -i, --inifile initialization file name\n" - " -j, --nojackconnect disable auto Jack connections (client only)\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" + " -g, --pingservers ping servers in list to keep NAT port open\n" + " (central server only)\n" " -l, --log enable logging, set file name\n" " -L, --licence a licence must be accepted on a new\n" - " connection (server only)\n" - " -m, --htmlstatus enable HTML status file, set file name (server\n" - " only)\n" - " -n, --nogui disable GUI\n" + " connection\n" + " -m, --htmlstatus enable HTML status file, set file name\n" " -o, --serverinfo infos of the server(s) in the format:\n" " [name];[city];[country as QLocale ID]; ...\n" " [server1 address];[server1 name]; ...\n" " [server1 city]; ...\n" " [server1 country as QLocale ID]; ...\n" - " [server2 address]; ... (server only)\n" - " -p, --port local port number (server only)\n" + " [server2 address]; ...\n" " -R, --recording enables recording and sets directory to contain\n" - " recorded jams (server only)\n" + " recorded jams\n" " -s, --server start server\n" - " -u, --numchannels maximum number of channels (server only)\n" - " -v, --version output version information and exit\n" - " -w, --welcomemessage welcome message on connect (server only)\n" - " -y, --history enable connection history and set file\n" - " name (server only)\n" - " -D, --histdays number of days of history to display (server only)\n" - " -z, --startminimized start minimizied (server only)\n" - " --ctrlmidich MIDI controller channel to listen (client only)" - "\nExample: " + QString ( argv[0] ) + " -l -inifile myinifile.ini\n"; + " -u, --numchannels maximum number of channels\n" + " -w, --welcomemessage welcome message on connect\n" + " -y, --history enable connection history and set file name\n" + " -z, --startminimized start minimizied\n" + "\nClient only:\n" + " -c, --connect connect to given server address on startup\n" + " -j, --nojackconnect disable auto Jack connections\n" + " --ctrlmidich MIDI controller channel to listen\n" + " --clientname client name (window title and jack client name)\n" + "\nExample: " + QString ( argv[0] ) + " -s -inifile myinifile.ini\n"; } bool GetFlagArgument ( char** argv, diff --git a/src/multicolorledbar.cpp b/src/multicolorledbar.cpp index 0cd94af4..b67efea4 100755 --- a/src/multicolorledbar.cpp +++ b/src/multicolorledbar.cpp @@ -48,8 +48,7 @@ CMultiColorLEDBar::CMultiColorLEDBar ( QWidget* parent, Qt::WindowFlags f ) : // create LED object vecpLEDs[iLEDIdx] = new cLED ( parent ); - // add LED to layout with spacer (do not add spacer on the bottom of the - // first LED) + // add LED to layout with spacer (do not add spacer on the bottom of the first LED) if ( iLEDIdx < NUM_STEPS_LED_BAR - 1 ) { pLEDLayout->addStretch(); @@ -77,7 +76,7 @@ CMultiColorLEDBar::CMultiColorLEDBar ( QWidget* parent, Qt::WindowFlags f ) : // according to QScrollArea description: "When using a scroll area to display the // contents of a custom widget, it is important to ensure that the size hint of // the child widget is set to a suitable value." - pProgressBar->setMinimumSize ( QSize ( 1, 1 ) ); + pProgressBar->setMinimumSize ( QSize ( 19, 1 ) ); // 15px + 2 * 1px + 2 * 1px = 19px pLEDMeter->setMinimumSize ( QSize ( 1, 1 ) ); // update the meter type (using the default value of the meter type) diff --git a/src/recorder/jamrecorder.cpp b/src/recorder/jamrecorder.cpp index 1055efdc..2c817919 100755 --- a/src/recorder/jamrecorder.cpp +++ b/src/recorder/jamrecorder.cpp @@ -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>(); - QObject::connect((const QObject *)server, SIGNAL ( AudioFrame(const int, const QString, const CHostAddress, const int, const CVector) ), - this, SLOT( OnFrame(const int, const QString, const CHostAddress, const int, const CVector) ), - Qt::ConnectionType::QueuedConnection); + QObject::connect( (const QObject *)server, SIGNAL ( AudioFrame( const int, const QString, const CHostAddress, const int, const CVector ) ), + this, SLOT( OnFrame (const int, const QString, const CHostAddress, const int, const CVector ) ), + 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 data) { // Make sure we are ready - if (!isRecording) + if ( !isRecording ) { OnStart(); } diff --git a/src/recorder/jamrecorder.h b/src/recorder/jamrecorder.h index cc49705d..eb5a0581 100755 --- a/src/recorder/jamrecorder.h +++ b/src/recorder/jamrecorder.h @@ -132,13 +132,16 @@ private: QList 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 data); + void OnFrame ( const int iChID, const QString name, const CHostAddress address, const int numAudioChannels, const CVector data ); private: QDir recordBaseDir; @@ -172,6 +180,8 @@ private: bool isRecording; CJamSession* currentSession; int iServerFrameSizeSamples; + + QThread* thisThread; }; } diff --git a/src/res/instruments/bassoon.png b/src/res/instruments/bassoon.png new file mode 100644 index 00000000..d002ab67 Binary files /dev/null and b/src/res/instruments/bassoon.png differ diff --git a/src/res/instruments/bassoon.svg b/src/res/instruments/bassoon.svg new file mode 100644 index 00000000..ed6d31a3 --- /dev/null +++ b/src/res/instruments/bassoon.svg @@ -0,0 +1,227 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/res/instruments/bongo.png b/src/res/instruments/bongo.png new file mode 100644 index 00000000..3864cc70 Binary files /dev/null and b/src/res/instruments/bongo.png differ diff --git a/src/res/instruments/bongo.svg b/src/res/instruments/bongo.svg new file mode 100644 index 00000000..3a5f42fc --- /dev/null +++ b/src/res/instruments/bongo.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/res/instruments/congas.png b/src/res/instruments/congas.png new file mode 100644 index 00000000..48f696ef Binary files /dev/null and b/src/res/instruments/congas.png differ diff --git a/src/res/instruments/congas.svg b/src/res/instruments/congas.svg new file mode 100644 index 00000000..db68fdf0 --- /dev/null +++ b/src/res/instruments/congas.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/res/instruments/harp.png b/src/res/instruments/harp.png new file mode 100644 index 00000000..6b32f308 Binary files /dev/null and b/src/res/instruments/harp.png differ diff --git a/src/res/instruments/harp.svg b/src/res/instruments/harp.svg new file mode 100644 index 00000000..04f7b027 --- /dev/null +++ b/src/res/instruments/harp.svg @@ -0,0 +1,465 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/res/instruments/oboe.png b/src/res/instruments/oboe.png new file mode 100644 index 00000000..ab6e075a Binary files /dev/null and b/src/res/instruments/oboe.png differ diff --git a/src/res/instruments/oboe.svg b/src/res/instruments/oboe.svg new file mode 100644 index 00000000..e00f40d5 --- /dev/null +++ b/src/res/instruments/oboe.svg @@ -0,0 +1,282 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/res/instruments/viola.png b/src/res/instruments/viola.png new file mode 100644 index 00000000..388c5558 Binary files /dev/null and b/src/res/instruments/viola.png differ diff --git a/src/res/logopicture.png b/src/res/logopicture.png deleted file mode 100755 index 30f3d7c0..00000000 Binary files a/src/res/logopicture.png and /dev/null differ diff --git a/src/res/logopicture.xcf b/src/res/logopicture.xcf deleted file mode 100755 index 3b0b8b35..00000000 Binary files a/src/res/logopicture.xcf and /dev/null differ diff --git a/src/res/translation/translation_de_DE.qm b/src/res/translation/translation_de_DE.qm new file mode 100644 index 00000000..296f9faf Binary files /dev/null and b/src/res/translation/translation_de_DE.qm differ diff --git a/src/res/translation/translation_de_DE.ts b/src/res/translation/translation_de_DE.ts new file mode 100644 index 00000000..4e38a76f --- /dev/null +++ b/src/res/translation/translation_de_DE.ts @@ -0,0 +1,2334 @@ + + + + + CAboutDlg + + + The + Die + + + + software enables musicians to perform real-time jam sessions over the internet. + Software ermöglicht Musikern über das Internet in Echtzeit zu jammen. + + + + server which collects the audio data from each + Server, der die Audiodaten von allen + + + + There is a + Es gibt einen + + + + client, mixes the audio data and sends the mix back to each client. + Teilnehmern sammelt, zusammen mischt und wieder an alle verbundenen Teilnehmer zurück schickt. + + + + uses the following libraries, resources or code snippets: + verwendet die folgenden Bibliotheken, Ressourcen oder Codeschnipsel: + + + + Qt cross-platform application framework + Qt plattformübergreifender Anwendungsrahmen + + + + Audio reverberation code by Perry R. Cook and Gary P. Scavone + Halleffekt von Perry R. Cook und Gary P. Scavone + + + + Some pixmaps are from the + Einige Bilder sind von + + + + Country flag icons from Mark James + Die Bilder der Länderflaggen sind von Mark James + + + + For details on the contributions check out the + Die Details über die Codebeiträge findet man in der + + + + Github Contributors list + Github Liste der Mitwirkenden + + + + About + Über + + + + , Version + + + + + Internet Jam Session Software + + + + + Under the GNU General Public License (GPL) + Unter der GNU General Public License (GPL) + + + + CAboutDlgBase + + + About + Über + + + + TextLabelVersion + + + + + Copyright (C) 2005-2020 Volker Fischer and others + Copyright (C) 2005-2020 Volker Fischer und andere + + + + A&bout + Ü&ber + + + + &Libraries + Bib&liotheken + + + + &Contributors + &Mitwirkende + + + + &Translation + Überse&tzung + + + + &OK + + + + + CAnalyzerConsole + + + Analyzer Console + + + + + Error Rate of Each Buffer Size + + + + + CAudioMixerBoard + + + Server + + + + + T R Y I N G T O C O N N E C T + V E R B I N D U N G S A U F B A U + + + + CChannelFader + + + Channel Level + Kanalpegel + + + + Displays the pre-fader audio level of this channel. All connected clients at the server will be assigned an audio level, the same value for each client. + Zeigt den Audiopegel vor dem Lautstärkeregler des Kanals. Allen verbundenen Teilnehmern am Server wird ein Audiopegel zugewiesen. + + + + Input level of the current audio channel at the server + Eingangspegel des aktuellen Teilnehmerkanals am Server + + + + Mixer Fader + Kanalregler + + + + Adjusts the audio level of this channel. All connected clients at the server will be assigned an audio fader at each client, adjusting the local mix. + Regelt die Lautstärke des Kanals. Für alle Teilnehmer, die gerade am Server verbunden sind, wird ein Lautstärkeregler angezeigt. Damit kann man seinen eigenen lokalen Mix erstellen. + + + + Local mix level setting of the current audio channel at the server + Lokale Mixerpegeleinstellung des aktuellen Kanals am Server + + + + With the Mute checkbox, the audio channel can be muted. + Mit dem Mute-Schalter kann man den Kanal stumm schalten. + + + + Mute button + Mute Schalter + + + + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except of the current channel are muted. It is possible to set more than one channel to solo. + Bei aktiviertem Solo Status hört man nur diesen Kanal. Alle anderen Kanäle sind stumm geschaltet. Es ist möglich mehrere Kanäle auf Solo zu stellen. Dann hört man nur die Kanäle, die auf Solo gestellt wurden. + + + + Solo button + Solo Schalter + + + + Fader Tag + Kanalbeschriftung + + + + The fader tag identifies the connected client. The tag name, the picture of your instrument and a flag of your country can be set in the main window. + Mit der Kanalbeschriftung wird der verbundene Teilnehmen identifiziert. Der Name, ein Bild des Instruments und eine Flagge des eigenen Landes kann im eigenen Profil ausgewählt werden. + + + + Mixer channel instrument picture + Mixerkanal Instrumentenbild + + + + Mixer channel label (fader tag) + Mixerkanalbeschriftung + + + + Mixer channel country flag + Mixerkanal Landesflagge + + + + MUTE + + + + + SOLO + + + + + Alias/Name + + + + + Instrument + + + + + Location + Standort + + + + + + Skill Level + Spielstärke + + + + Beginner + Anfänger + + + + Intermediate + Mittlere Spielstärke + + + + Expert + Experte + + + + Musician Profile + Profil des Musikers + + + + + + Mute + + + + + + + Solo + + + + + CChatDlg + + + Chat Window + Chatfenster + + + + The chat window shows a history of all chat messages. + Das Chatfenster zeigt den Verlauf aller Chatnachrichten. + + + + Chat history + Chatverlauf + + + + Input Message Text + Chatnachricht Eingabefeld + + + + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. + Tippe die Chatnachricht in dieses Feld und drücke anschließend die Eingabetaste um die Nachricht an den Server zu schicken. Der Server verteilt die Nachrichti anschließend an alle Teilnehmer. Die eigene Nachricht wird dann im Chatfenster angezeigt. + + + + New chat text edit box + Chatnachrichteneingabefeld + + + + CChatDlgBase + + + Chat + Chat + + + + Cl&ear + &Löschen + + + + &Close + &Schließen + + + + CClientDlg + + + Input Level Meter + Eingangspegelanzeige + + + + The input level indicators show the input level of the two stereo channels of the current selected audio input. + Die Eingangspegelanzeige zeigt den Pegel der beiden Stereokanäle der selektierten Audiohardware an. + + + + Make sure not to clip the input signal to avoid distortions of the audio signal. + Man sollte darauf achten, dass das Signal nicht zu stark ausgesteuert ist, um Verzerrungen des Signal zu vermeiden. + + + + If the + Wenn die + + + + software is connected and you play your instrument/sing in the microphone, the LED level meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. line in instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. + Software verbunden ist und die spielst dein Instrument, dann sollte die Eingangspegelanzeige flackern. Wenn das nicht der Fall ist, dann ist wahrscheinlich der falsche Eingangskanal ausgewählt (z.B. der Line-In-Kanal anstatt des Mikrofonkanals) oder der Eingangsregler im (Windows) Systemmixer ist zu niedrig eingestellt. + + + + For a proper usage of the + Um die + + + + software, you should not hear your singing/instrument in the loudspeaker or your headphone when the + Software optimal zu nutzen, sollte man sein eigenes Instrument oder Gesant nicht im Lautsprecher oder Kopfhörer hören, wenn die + + + + software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). + Software nicht verbunden ist. Das kann man erreichen, indem man den Eingangskanal im Wiedergabemixer stumm schaltet. + + + + Input level meter + Eingangspegelanzeige + + + + Simulates an analog LED level meter. + Simuliert eine analoge LED-Signalpegelanzeige. + + + + Connect/Disconnect Button + Verbinden-/Trennschalter + + + + Push this button to connect a server. A dialog where you can select a server will open. If you are connected, pressing this button will end the session. + Drücke diesen Knopf um sich mit dem Server zu verbinden. Es wird ein Fenster angezeigt, in dem man den Server auswählen kann. Wenn man gerade verbunden ist und den Knopf drückt, dann wird die Verbindung getrennt und die Session wird beendet. + + + + Connect and disconnect toggle button + Schalter zum Verbinden und Trennen + + + + Clicking on this button changes the caption of the button from Connect to Disconnect, i.e., it implements a toggle functionality for connecting and disconnecting the + Wenn man diesen Knopf drückt, dann wird die Beschriftung des Knopfes von Verbinden zu Trennen geändert, das heißt, dass er eine Umschaltfunktion hat zum Verbinden und Trennen der + + + + + software. + Software. + + + + Local Audio Input Fader + Lokaler Eingangspegelregler + + + + Local audio input fader (left/right) + Lokaler Eingangsregler + + + + Reverberation effect level setting + Halleffekt Pegelregler + + + + Left channel selection for reverberation + Auswahl linker Kanal für Halleffekt + + + + Right channel selection for reverberation + Auswahl rechter Kanal für Halleffekt + + + + If this LED indicator turns red, you will not have much fun using the + Wenn diese LED rot leuchtet, dann wirst du keinen Spaß haben mit der + + + + Delay status LED indicator + LED Stautuslampe für die Verzögerung + + + + Buffers status LED indicator + LED Statuslampe für den Netzwerkpuffer + + + + + C&onnect + &Verbinden + + + + &View + &Ansicht + + + + &Connection Setup... + &Konfiguration der Verbindung... + + + + My &Profile... + Mein &Profil... + + + + C&hat... + C&hat... + + + + &Settings... + &Einstellungen... + + + + &Analyzer Console... + + + + + E&xit + &Beenden + + + + None + Keine + + + + Center + Mitte + + + + R + + + + + + L + + + + + With the audio fader, the relative levels of the left and right local audio channels can be changed. For a mono signal it acts like a panning between the two channels. If, e.g., a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows + Mit diesem Einstellregler kann der relative Pegel vom linken und rechten Eingangskanal verändert werden. Für ein Mono-Signal verhält sich der Regler wie ein Pan-Regler. Wenn, z.B., ein Mikrofon am rechten Kanal angeschlossen ist und das Instrument am linken Eingangskanal ist viel lauter als das Mikrofon, dann kann man den Lautstärkeunterschied mit diesem Regler kompensieren indem man den Regler in eine Richtung verschiebt, so dass über dem Regler + + + + , where + angezeigt wird, wobei + + + + is the current attenuation indicator. + die aktuelle Dämpfung anzeigt. + + + + Reverberation Level + Halleffektregler + + + + 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. + Der Halleffekt kann auf einen selektierten Mono-Audiokanal oder auf beide Stereoaudiokanäle angewendet werden. Die Mono-Kanalselektion und die Hallstärke können eingestellt werden. Wenn z.B. ein Mikrofonsignal auf dem rechten Kanal anliegt und ein Halleffekt soll auf das Mikrofonsignal angewendet werden, dann muss die Hallkanalselektion auf rechts eingestellt werden und der Hallregler muss erhöht werden, bis die gewünschte Stärke des Halleffekts erreicht ist. + + + + The reverberation effect requires significant CPU so that it should only be used on fast PCs. If the reverberation level fader is set to minimum (which is the default setting), the reverberation effect is switched off and does not cause any additional CPU usage. + Die Berechnung des Halleffekts benötigt etwas Rechenleistung, so dass der Halleffekt nur bei schnellen Computern angewendet werden sollte. Wenn der Hallregler ganz nach unten gezogen ist, dann ist der Halleffekt ausgeschaltet und verbraucht keine Rechenleistung mehr. + + + + Reverberation Channel Selection + Halleffekt Kanalselektion + + + + With these radio buttons the audio input channel on which the reverberation effect is applied can be chosen. Either the left or right input channel can be selected. + Mit diesen Knöpfen kann ausgewählt werden, auf welches Eingangssignal der Halleffekt angewendet werden soll. Entweder der rechte oder linke Eingangskanal kann ausgewählt werden. + + + + Delay Status LED + Status LED für die Verzögerung + + + + The delay status LED indicator shows the current audio delay status. If the light is green, the delay is perfect for a jam session. If the light is yellow, a session is still possible but it may be harder to play. If the light is red, the delay is too large for jamming. + Die Status-LED für die Verzögerung zeigt eine Bewertung der Gesamtverzögerung des Audiosignals. Wenn die LED grün leuchtet, dann ist die Verzögerung gering genug für das Jammen. Wenn die LED gelb anzeigt kann man noch spielen aber es wird schwieriger Lieder mit hohem Tempo zu spielen. Wenn die LED rot anzeigt, dann ist die Verzögerung zu hoch zum Jammen. + + + + Buffers Status LED + Status LED für den Netzwerkpuffer + + + + The buffers status LED indicator shows the current audio/streaming status. If the light is green, there are no buffer overruns/underruns and the audio stream is not interrupted. If the light is red, the audio stream is interrupted caused by one of the following problems: + Die Status-LED für den Netzwerkpuffer zeigt den aktuellen Status des Netzwerkstroms. Wenn die LED grün ist, dann gibt es keine Pufferprobleme. Wenn die LED rot anzeigt, dann ist der Netzwerkstrom kurz unterbrochen. Dies kann folgende Ursachen haben: + + + + The network jitter buffer is not large enough for the current network/audio interface jitter. + Der Netzwerkpuffer ist nicht groß genug eingestellt für die aktuellen Netzwerkbedingungen. + + + + The sound card buffer delay (buffer size) is set to a too small value. + Der Soundkartenpuffer ist zu klein eingestellt. + + + + The upload or download stream rate is too high for the current available internet bandwidth. + Die Upload-Rate der Internetverbindung ist zu klein für den Netzwerkdatenstrom. + + + + The CPU of the client or server is at 100%. + Die CPU des Computers ist voll ausgelastet. + + + + user + Teilnehmer + + + + users + Teilnehmer + + + + D&isconnect + &Trennen + + + + CClientDlgBase + + + Delay + Verzögerung + + + + Buffers + Puffer + + + + Input + Eingang + + + + L + + + + + R + + + + + Settings + Einstellungen + + + + Chat + Chat + + + + Mute Myself + Stummschalten + + + + C&onnect + &Verbinden + + + + Pan + + + + + Center + Mitte + + + + Reverb + Halleffekt + + + + Left + Links + + + + Right + Rechts + + + + CClientSettingsDlg + + + Jitter Buffer Size + Netzwerkpuffergröße + + + + The jitter buffer compensates for network and sound card timing jitters. The size of this jitter buffer has therefore influence on the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). + Der Netzwerkpuffer kompensiert die Netzwerk- und Soundkarten-Timing-Schwankungen. Die Größe des Netzwerkpuffers hat Auswirkungen auf die Qualität des Audiosignals (wie viele Aussetzer auftreten) und die Gesamtverzögerung (je länger der Puffer, desto größer ist die Verzögerung). + + + + The jitter buffer size can be manually chosen for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light on the bottom of the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun took place and the audio stream is interrupted. + Die Netzwerkpuffergröße kann manuell verstellt werden, jeweils getrennt für die Applikation und den Server. Für den lokalen Netzwerkpuffer werden die Aussetzer durch die LED-Anzeige unter den Reglern angezeigt. Wenn die Lampe rot anzeigt, dann hat ein Pufferüberlauf oder ein Leerlauf des Puffers stattgefunden und der Audiodatenstrom wurde kurz unterbrochen. + + + + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. + Die Netzwerkpuffergröße ist deshalb ein Kompromiss zwischen Audioqualität und Gesamtverzögerung. + + + + An auto setting of the jitter buffer size setting is available. If the check Auto is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If the Auto check is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). + Die Netzwerkpuffergröße kann automatisch eingestellt werden. Wenn die Automatik aktiviert ist, dann werden die Netzwerkpuffer der Applikation und des Servers getrennt basierend auf Messungen der Netzwerkschwankungen eingestellt. Wenn die Automatik aktiviert ist, dann sind die beiden Regler gesperrt für die manuelle Verstellung (sie können nicht mit der Maus verändert werden). + + + + In case the auto setting of the jitter buffer is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the auto setting functionality and to lower the jitter buffer size manually by using the sliders until your personal acceptable limit of the amount of dropouts is reached. The LED indicator will visualize the audio dropouts of the local jitter buffer by a red light. + Wenn die Automatik zum Einstellen der Netzwerkpuffer aktiviert ist, dann werden die Netzwerkpuffer der Applikation und des entfernten Servers auf einen konservativen Wert eingestellt, um eine möglichst gute Audioqualität zu garantieren. Um die Gesamtverzögerung zu optimieren, bietet es sich an, die Automatik zu deaktivieren und die Netzwerkpuffer etwas kleiner einzustellen. Die Werte sollte man so weit reduzieren, bis die Audioqualität gerade noch der persönlichen Akkzeptanz entspricht. Die LED-Anzeige hilft dabei die Audioaussetzer verursacht durch den lokalen Netzwerkpuffer zu visualisieren (wenn die LED rot leuchtet). + + + + Local jitter buffer slider control + Lokale Netzwerkpuffergröße Schieberegler + + + + Server jitter buffer slider control + Server Netzwerkpuffergröße Schieberegler + + + + Auto jitter buffer switch + Automatik für die Netzwerkpuffergröße aktivieren + + + + Jitter buffer status LED indicator + Netzwerkpuffer Status LED + + + + Sound Card Device + Soundkartengerät + + + + The ASIO driver (sound card) can be selected using + Der ASIO-Treiber (Soundkarte) kann ausgewählt werden mit der + + + + under the Windows operating system. Under MacOS/Linux, no sound card selection is possible. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. + Software unter Windows. Unter MacOS und Linux kann man die Soundkarte nicht auswählen. Wenn der selektierte ASIO-Treiber nicht gültig ist, dann wird eine Fehlermeldung angezeigt und der vorherige gültige Treiber wird wieder ausgewählt. + + + + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. + Wenn der Treiber während eine aktiven Verbindung ausgewählt wird, dann wird die Verbindung gestoppt, der neue Treiber ausgewählt und anschließend wird die Verbindung automatisch wiederhergestellt. + + + + Sound card device selector combo box + Soundkarten Auswahlbox + + + + In case the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. + Falls der ASIO4All-Treiber verwendet wird, kann es sein, dass dieser Treiber zusätzliche 10-30 ms Verzögerung hinzufügt. Aus diesem Grund sollte man bevorzugt einen nativen ASIO-Treiber der Soundkarte verwenden, der mit dem Produkt mitgeliefert wurde. + + + + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. + Falls der kx ASIO-Treiber verwendet wird, dann muss man darauf achten, dass die ASIO-Eingänge im kx DSP-Einstellungsfenster verbunden sind. + + + + Sound Card Channel Mapping + Soundkarten Kanalzuweisung + + + + In case the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. + Falls die ausgewählte Soundkarte mehr als zwei Eingangs- oder Ausgangskanäle unterstützt, dann werden die Steuerelemente für die Kanalzuweisung angezeigt. + + + + For each + Für jeden + + + + input/output channel (Left and Right channel) a different actual sound card channel can be selected. + Eingangs-/Ausgangskanal (linker und rechter Kanal) kann ein beliebiger Soundkartenkanal zugewiesen werden. + + + + Left input channel selection combo box + Linker Eingang Kanalauswahlbox + + + + Right input channel selection combo box + Rechter Eingang Kanalauswahlbox + + + + Left output channel selection combo box + Linker Ausgang Kanalauswahlbox + + + + Right output channel selection combo box + Rechter Ausgang Kanalauswahlbox + + + + Enable Small Network Buffers + Aktiviere kleine Netzwerkpuffer + + + + If enabled, the support for very small network audio packets is activated. Very small network packets are only actually used if the sound card buffer delay is smaller than + Falls aktiviert wird die Unterstützung für sehr kleine Netzwerk-Audiopakete aktiviert. Sehr kleine Netzwerkpakete werden nur dann verwendet, wenn der Soundkartenpuffer kleiner als + + + + samples. The smaller the network buffers, the smaller the audio latency. But at the same time the network load increases and the probability of audio dropouts also increases. + Samples ist. Je kleiner die Netzwerkpakete sind, desto kleiner ist auch die Audioverzögerung. Aber gleichzeitig wird dadurch die Netzwerklast erhöht und die Wahrscheinlichkeit für Audioaussetzer erhöht sich dadurch auch. + + + + Enable small network buffers check box + Aktiviere kleine Netzwerkpuffer Schalter + + + + Sound Card Buffer Delay + Soundkarten Puffergröße + + + + The buffer delay setting is a fundamental setting of the + Die Soundkartenpuffergröße ist eine fundamentale Einstellung der + + + + software. This setting has influence on many connection properties. + Software. Diese Einstellung hat Einfluss auf viele andere Verbindungseigenschaften. + + + + Three buffer sizes are supported + Drei Puffergrößen werden unterstützt + + + + 64 samples: This is the preferred setting since it gives lowest latency but does not work with all sound cards. + 64 Samples: Dies ist die bevorzugte Einstellung weil es die geringste Verzögerung hat. Diese Puffergröße funktioniert allerdings nicht mit allen Soundkarten. + + + + 128 samples: This setting should work on most of the available sound cards. + 128 Samples: Diese Puffergröße sollte mit den meisten Soundkarten funktionieren. + + + + 256 samples: This setting should only be used if only a very slow computer or a slow internet connection is available. + 256 Samples: Diese Einstellung sollte nur dann verwendet werden, wenn man einen langsamen Computer oder eine langsame Internetverbindung hat. + + + + Some sound card driver do not allow the buffer delay to be changed from within the + Manche Soundkartentreiber unterstützen nicht das Verändern der Puffergröße innerhalb der + + + + software. In this case the buffer delay setting is disabled. To change the actual buffer delay, this setting has to be changed in the sound card driver. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + Software. In diesem Fall ist die Einstellungsmöglichkeit für die Puffergröße deaktiviert. Die Puffergröße muss man stattdessen direkt im Soundkartentreiber durchführen. Unter Windows kann man den ASIO-Einstellungen Knopf drücken um die Treibereinstellungen zu öffnen. Unter Linux benutzt man das Jack-Konfigurationsprogramm um die Puffergröße einzustellen. + + + + If no buffer size is selected and all settings are disabled, an unsupported buffer size is used by the driver. The + Falls keiner der vorgegebenen Puffergrößen ausgeählt ist und alle Einstellungen deaktiviert sind, dann wird eine nicht unterstützte Puffergröße im Soundkartentreiber verwendet. Die + + + + software will still work with this setting but with restricted performance. + Software funktioniert trotzdem aber es könnte eine größere Verzögerung resultieren. + + + + 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 outs) and the higher the upload rate and the lower the overall delay. + Die Puffergröße hat einen Einfluss auf den Verbindungsstatus, die aktuelle Upload-Rate und die Gesamtverzögerung. Je kleiner der Puffer, desto größer ist die Wahrscheinlichkeit für das Auftreten einer rot leuchtenden LED (was Audioaussetzer anzeigt), eine höheren Upload-Rate und eine niedrigere Gesamtverzögerung. + + + + The buffer setting is therefore a trade-off between audio quality and overall delay. + Die Puffergröße ist somit ein Kompromiss zwischen Audioqualität und Gesamtverzögerung. + + + + If the buffer delay settings are disabled, it is prohibited by the audio driver to modify this setting from within the + Falls die Puffergröße nicht verstellt werden kann, dann hat der Soundkartentreiber die Einstellung gesperrt man kann es nicht innerhalb der + + + + software. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + Software verändern. Unter Windows kann man den ASIO-Einstellungen Knopf drücken, um die Treibereinstellungen zu öffnen. Unter Linux kann man ein Jack-Konfigurationswerkzeug verwenden, um die Puffergröße zu verändern. + + + + 128 samples setting radio button + 128 Samples Einstellknopf + + + + 256 samples setting radio button + 256 Samples Einstellknopf + + + + 512 samples setting radio button + 512 Samples Einstellknopf + + + + ASIO setup push button + ASIO-Einstellungen Knopf + + + + Fancy Skin + Schicke Oberfläche + + + + If enabled, a fancy skin will be applied to the main window. + Falls aktiviert wird eine schicke Oberfläche im Hauptfenster verwendet. + + + + Fancy skin check box + Schicke Oberfläche Schalter + + + + Display Channel Levels + Zeige Kanalsignalpegel + + + + If enabled, each client channel will display a pre-fader level bar. + Falls aktiviert wird eine Signalpegelanzeige neben jedem Kanalfader angezeigt, welcher den Pegel vor dem Fader anzeigt. + + + + Display channel levels check box + Zeige Kanalpegel Schalter + + + + Audio Channels + Audiokanäle + + + + Select the number of audio channels to be used. There are three modes available. The mono and stereo modes use one and two audio channels respectively. In the mono-in/stereo-out mode the audio signal which is sent to the server is mono but the return signal is stereo. This is useful for the case that the sound card puts the instrument on one input channel and the microphone on the other channel. In that case the two input signals can be mixed to one mono channel but the server mix can be heard in stereo. + Hiermit kann man die Anzahl an Audiokanälen auswählen. Es gibt drei Modi. Die Mono- und Stereomodi verwenden jeweils einen oder zwei Kanäle. Im Mono-In/Stereo-Out Modus wird ein Monosignal zum Server geschickt aber es kommt ein Stereo-Signal zurück vom Server. Dies is nützlich für den Fall, dass man an die Soundkarte ein Instrument an den einen Eingangskanal und ein Mikrofon an den anderen Eingangskanal angeschlossen hat. In diesem Fall können die beiden Signale zusammen gemischt werden und an den Server geschickt werden aber man kann das Stereo-Signal von den anderen Musikern hören. + + + + Enabling the stereo streaming mode will increase the stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Wenn man den Stereo-Modus verwendet, dann ist die Übertragungsrate etwas höher. Man muss sicher stellen, dass die Internetverbindung die höhere Rate übertragen kann. + + + + In case of the stereo streaming mode, no audio channel selection for the reverberation effect will be available on the main window since the effect is applied on both channels in this case. + Wenn der Stereo-Modus ausgewählt wurde, dann verschwindet die Kanalselektion für den Halleffekt im Hauptfenster, da der Effekt auf beide Stereokanäle angewendet wird. + + + + Audio channels combo box + Audiokanal Auswahlbox + + + + Audio Quality + Audioqualität + + + + Select the desired audio quality. A low, normal or high audio quality can be selected. The higher the audio quality, the higher the audio stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Wählt die gewünschte Audioqualität aus. Es wird eine niedrige, mittlere und hohe Audioqualität angeboten. Je höher die Audioqualität, desto höher ist die Netzwerkübertragungsrate. Man muss sicherstellen, dass die Internetverbindung die höhere Rate übertragen kann. + + + + Audio quality combo box + Audioqualität Auswahlbox + + + + New Client Level + Pegel für neuen Teilnehmer + + + + The new client level setting defines the fader level of a new connected client in percent. I.e. if a new client connects to the current server, it will get the specified initial fader level if no other fader level of a previous connection of that client was already stored. + Der Pegel für neue Teilnehmer definiert die Fadereinstellung, wenn sich ein Teilnehmer neu mit dem Server verbindet. D.h. wenn ein neuer Fader erscheint, dann wird er auf den voreingestellten Pegel gesetzt. Eine Ausnahme bildet der Fall, dass der Teilnehmer vorher schon mal mit dem Server verbunden war und der Pegel gespeichert war. + + + + New client level edit box + Neuer Teilnehmer Pegel Einstellbox + + + + Central Server Address + Zentralserveradresse + + + + The central server address is the IP address or URL of the central server at which the server list of the connection dialog is managed. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + Die Zentralserveradresse ist die IP-Adresse oder URL des Zentralservers, der die Serverlist organisiert und bereitstellt. Mit der Zentralserveradresse kann entweder die örtliche Region festgelegt werden (durch Auswahl des entsprechenden vorgegebenen Zentralservers) oder man gibt eine beliebige Adresse manuell ein. + + + + Default central server type combo box + Voreingestellter Zentralservertyp Auswahlbox + + + + Central server address line edit + Zentralserveradresse Eingabefeld + + + + Current Connection Status Parameter + Verbindungsstatus Parameter + + + + The ping time is the time required for the audio stream to travel from the client to the server and backwards. This delay is introduced by the network. This delay should be as low as 20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to the server is too large or your internet connection is not sufficient. + Die Ping-Zeit ist die Zeit, die der Audiodatenstrom benötigt, um von der Applikation zum Server und zurück zu kommen. Diese Verzögerung wird vom Netzwerk hervorgerufen. Diese Verzögerung sollte so um die 20-30 ms sein. Falls die Verzögerung größer ist (z.B. 50-60 ms), der Abstand zum Server ist zu groß oder die Internetverbindung ist nicht ausreichend. + + + + The overall delay is calculated from the current ping time and the delay which is introduced by the current buffer settings. + Die Gesamtverzögerung setzt sich zusammen aus der Ping-Zeit und die Verzögerung, die durch die Puffergrößen verursacht wird. + + + + The upstream rate depends on the current audio packet size and the audio compression setting. Make sure that the upstream rate is not higher than the available rate (check the upstream capabilities of your internet connection by, e.g., using speedtest.net). + Die Upload-Rate hängt von der Soundkartenpuffergröße und die Audiokomprimierung ab. Man muss sicher stellen, dass die Upload-Rate immer kleiner ist als die Rate, die die Internetverbindung zur Verfügung stellt (man kann die Upload-Rate des Internetproviders z.B. mit speedtest.net überprüfen). + + + + If this LED indicator turns red, you will not have much fun using the + Wenn diese LED rot leuchtet, dann wirst du keinen Spaß haben mit der + + + + software. + Software. + + + + ASIO Setup + ASIO-Einstellung + + + + Mono + + + + + Mono-in/Stereo-out + Mono-In/Stereo-Out + + + + Stereo + + + + + Low + Niedrig + + + + Normal + Normal + + + + High + Hoch + + + + Manual + Manuell + + + + Default + Standard + + + + Default (North America) + Standard (Nordamerika) + + + + preferred + bevorzugt + + + + + Size: + Größe: + + + + Buffer Delay + Puffergröße + + + + Buffer Delay: + Puffergröße: + + + + The selected audio device could not be used because of the following error: + Das ausgewählte Audiogerät kann aus folgendem Grund nicht verwendet werden: + + + + The previous driver will be selected. + Der vorherige Treiber wird wieder ausgewählt. + + + + Ok + + + + + CClientSettingsDlgBase + + + Settings + Einstellungen + + + + Soundcard + Soundkarte + + + + Device + Gerät + + + + Input Channel Mapping + Eingangskanalzuweisung + + + + + L + + + + + + R + + + + + Output Channel Mapping + Ausgangskanalzuweisung + + + + Enable Small Network Buffers + Aktiviere kleine Netzwerkpuffer + + + + Buffer Delay + Puffergröße + + + + (preferred) + (bevorzugt) + + + + (default) + (standard) + + + + (safe) + (sicher) + + + + Driver Setup + Treibereinstellungen + + + + Jitter Buffer + Netzwerkpuffer + + + + Auto + + + + + Local + Lokal + + + + Server + Server + + + + + Size + Größe + + + + Misc + Sonstiges + + + + Audio Channels + Audiokanäle + + + + Audio Quality + Audioqualität + + + + New Client Level + Pegel für neuen Teilnehmer + + + + % + + + + + Fancy Skin + Schicke Oberfläche + + + + Display Channel Levels + Zeige Signalpegel + + + + Central Server Address: + Zentralserveradresse: + + + + Audio Stream Rate + Netzwerkrate + + + + + + val + Wert + + + + Ping Time + Ping-Zeit + + + + Overall Delay + Gesamtverzögerung + + + + CConnectDlg + + + Server List + Severliste + + + + The server list shows a list of available servers which are registered at the central server. Select a server from the list and press the connect button to connect to this server. Alternatively, double click a server from the list to connect to it. If a server is occupied, a list of the connected musicians is available by expanding the list item. Permanent servers are shown in bold font. + Die Serverliste zeigt eine Liste von verfügbaren Server, die sich am Zentralserver registriert haben. Markiere einen Server von der Liste und drücke den Knopf Verbinden um eine Verbindung zu dem Server aufzubauen. Alternativ kann man auch den Server in der Liste direkt doppelklicken. Wenn ein Server belegt ist, dann wird eine Liste der verbundenen Musikern angezeigt. Server, die länger online sind (permanente Server) werden in Fettschrift dargestellt. + + + + Note that it may take some time to retrieve the server list from the central server. If no valid central server address is specified in the settings, no server list will be available. + Es kann einen Moment dauern, bis die Serverliste vom Zentralserver empfangen wird. Falls keine gültige Zentralserveradresse in den Einstellungen angegeben ist, kann keine Liste angezeigt werden. + + + + Server list view + Serverliste Anzeige + + + + Server Address + Serveradresse + + + + The IP address or URL of the server running the + Die IP-Adresse oder URL des Servers, auf der die + + + + 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: + Serversoftware läuft wird hier angegeben. Optional kann eine Portnummer angefügt werden. Diese wird hinter der IP-Adresse durch ein Doppelpunkt getrennt angegeben. Beispiel: example.org: + + + + . A list of the most recent used server IP addresses or URLs is available for selection. + Eine Liste der letzten IP-Adressen oder URLs wird gespeichert und kann nachträglich wieder ausgewählt werden. + + + + Server address edit box + Serveradresse Eingabefeld + + + + Holds the current server IP address or URL. It also stores old URLs in the combo box list. + Enthält die aktuelle Server-IP-Adresse oder URL. Es speichert auch alte URLs in der Auswahlliste. + + + + Filter + Filter + + + + The server list is filered by the given text. Note that the filter is case insensitive. + Die Serverliste kann mit dem eingegebenen Text gefiltert werden, d.h. es werden nur Einträge angezeigt, die dem Filtertext entsprechen. Die Groß- und Kleinschreibung des Filtertexts wird dabei nicht beachtet. + + + + Filter edit box + Filtereingabefeld + + + + Show All Musicians + Zeige alle Teilnehmer + + + + If you check this check box, the musicians of all servers are shown. If you uncheck the check box, all list view items are collapsed. + Ist diese Einstellung angehakt, dann werden alle Musiker auf allen Servern angezeigt. Wird der Haken entfernt, dann werden alle Listeneinträge eingeklappt und die verbundenen Musikernamen werden verborgen. + + + + Show all musicians check box + Zeige alle Teilnehmer Schalter + + + + CConnectDlgBase + + + Connection Setup + Verbindungseinstellung + + + + Filter + Filter + + + + Show All Musicians + Zeige alle Teilnehmer + + + + Server Name + Servername + + + + Ping Time + Ping-Zeit + + + + Musicians + Teilnehmer + + + + Location + Standort + + + + Server Name/Address + Servername/Adresse + + + + C&ancel + A&bbrechen + + + + &Connect + &Verbinden + + + + CHelpMenu + + + &Help + &Hilfe + + + + + Getting &Started... + &Erste Schritte... + + + + Software &Manual... + Software&handbuch... + + + + What's &This + Konte&xthilfe + + + + &About... + Ü&ber... + + + + CLicenceDlg + + + I &agree to the above licence terms + Ich &stimme den Lizenzbedingungen zu + + + + Accept + Einwilligen + + + + Decline + Ablehnen + + + + By connecting to this server and agreeing to this notice, you agree to the following: + Durch das Verbinden mit diesem Server und das Akzeptieren des Lizenztextes willigst du folgenden Bedingungen ein: + + + + 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 + + + + + You are free to: + + + + + Share + + + + + copy and redistribute the material in any medium or format + + + + + Adapt + + + + + remix, transform, and build upon the material + + + + + The licensor cannot revoke these freedoms as long as you follow the license terms. + + + + + Under the following terms: + + + + + Attribution + + + + + 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. + + + + + NonCommercial + + + + + You may not use the material for commercial purposes. + + + + + ShareAlike + + + + + If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + + + + + No additional restrictions + + + + + You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + + + + + CMusProfDlg + + + 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. + -Server. Dieses Schild wird auch bei allen anderen Teilnehmern, die mit dem gleichen Server verbunden sind, angezeigt. Wenn der Name leer gelassen wurde, dann wird die IP-Adresse stattdessen angezeigt. + + + + Alias or name edit box + Alias oder Name Eingabefeld + + + + Instrument picture button + Instrumentenbild Knopf + + + + Country flag button + Landesflagge Knopf + + + + City edit box + Stadt Eingabefeld + + + + Skill level combo box + Fähigkeit Auswahlbox + + + + + + None + Kein + + + + + Musician Profile + Musikerprofil + + + + Alias/Name + + + + + Instrument + + + + + Country + Land + + + + City + Stadt + + + + Skill + Können + + + + &Close + &Schließen + + + + Beginner + Anfänger + + + + Intermediate + Mittlere Spielstärke + + + + Expert + Experte + + + + 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. + Schreibe den Namen oder Alias hier rein so dass die anderen Musikern mit denen du spielst wissen wer du bist. Zusätzlich kannst du dein Instrument auswählen und eine Flagge des Landes auswählen in dem du dich befindest. Deine Stadt und deine Spielstärke des Instruments kannst du ebenso angeben. + + + + What you set here will appear at your fader on the mixer board when you are connected to a + Was man hier sieht wird auch am Fader im Mixer angezeigt, wenn du mit einem + + + + Drum Set + Schlagzeug + + + + Djembe + Djembe + + + + Electric Guitar + E-Gitarre + + + + Acoustic Guitar + Akustikgitarre + + + + Bass Guitar + E-Bass + + + + Keyboard + Keyboard + + + + Synthesizer + Synthesizer + + + + Grand Piano + Flügel + + + + Accordion + Akkordeon + + + + Vocal + Gesang + + + + Microphone + Mikrofon + + + + Harmonica + Mundharmonika + + + + Trumpet + Trompete + + + + Trombone + Posaune + + + + French Horn + Waldhorn + + + + Tuba + Tuba + + + + Saxophone + Saxophon + + + + Clarinet + Klarinette + + + + Flute + Flöte + + + + Violin + Violine + + + + Cello + Cello + + + + Double Bass + Kontrabass + + + + Recorder + Recorder + + + + Streamer + + + + + Listener + Zuhörer + + + + Guitar+Vocal + Gitarre+Gesang + + + + Keyboard+Vocal + Keyboard+Gesang + + + + Bodhran + + + + + Bassoon + Fagott + + + + Oboe + Oboe + + + + Harp + Harfe + + + + Viola + Viola + + + + Congas + Congas + + + + Bongo + Bongos + + + + CServerDlg + + + Client List + Teilnehmerliste + + + + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. + Die Teilnehmerliste zeigt alle gerade mit dem Server verbunden Musiker an. Für jeden Teilnehmer werden zusätzliche Informationen wie die IP-Adresse und Namen angezeigt. + + + + Connected clients list view + Teilnehmerliste + + + + Start Minimized on Operating System Start + Starte minimiert beim Starten des Betriebssystems + + + + If the start minimized on operating system start check box is checked, the + Wenn diese Funktion angehakt ist, dann wird der + + + + server will be started when the operating system starts up and is automatically minimized to a system task bar icon. + -Server automatisch mit dem Betriebssystemstart geladen und erscheint minimiert in der Systemleiste als Icon. + + + + Show Creative Commons Licence Dialog + Zeige den Creative Commons Lizenzdialog + + + + If enabled, a Creative Commons BY-NC-SA 4.0 Licence dialog is shown each time a new user connects the server. + Falls aktiviert wird ein Create Commons BY-NC-SA 4.0 Lizenzdialog angezeigt, wenn ein neuer Teilnehmer versucht sich mit dem Server zu verbinden. + + + + Make My Server Public + Veröffentliche meinen Server + + + + If the Make My Server Public check box is checked, this server registers itself at the central server so that all + Mit dieser Funktion wird der eigene Server in der Serverliste des Zentralservers registriert so dass alle anderen Applikationsnutzer den + + + + users can see the server in the connect dialog server list and connect to it. The registering of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. + -Server in der Liste sehen können und sich mit ihm verbinden können. Die Registrierung mit dem Zentralserver wird periodisch erneuert um sicherzugehen, dass alle registrierten Server auch wirklich erreichbar sind. + + + + Register Server Status + Registrierungsstatus + + + + If the Make My Server Public check box is checked, this will show the success of registration with the central server. + Wenn der eigene Server veröffentlicht wurde, dann zeigt der Registrierungsstatus and, ob die Registrierung erfolgreich war oder nicht. + + + + Central Server Address + Zentralserveradresse + + + + The Central server address is the IP address or URL of the central server at which this server is registered. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + Die Zentralserveradrees ist die IP-Adresse oder URL des Zentralservers bei dem man sich registrieren möchte. Mit dem Zentralservertyp legt man die Region fest, in der man sich befindet. Außerdem kann eine freie Adresse eingetragen werden. + + + + Default central server type combo box + Voreingestellter Zentralservertyp Auswahlbox + + + + Central server address line edit + Zentralserveradresse Eingabefeld + + + + Server Name + Servername + + + + The server name identifies your server in the connect dialog server list at the clients. If no name is given, the IP address is shown instead. + Der Servername identifiziert deinen Server in der Serverliste. Falls kein Name angegeben wurde, dann wird die IP-Adresse stattdessen angezeigt. + + + + Server name line edit + Servername Eingabefeld + + + + Location City + Standort Stadt + + + + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. + Hier kann man die Stadt angeben, in der sich der Server befindet. Falls eine Stadt angegeben wurde, dann wird die in der Serverliste angezeigt. + + + + City where the server is located line edit + Stadt in der sich der Server befindet Eingabefeld + + + + Location country + Standort Land + + + + The country in which this server is located can be set here. If a country is entered, it will be shown in the connect dialog server list at the clients. + Hier kann man das Land eingeben, in dem sich der Server befindet. Falls ein Land angegeben wurde, dann wird das in der Serverliste angezeigt. + + + + Country where the server is located combo box + Land in dem sich der Server befindet Auswahlbox + + + + + E&xit + &Beenden + + + + &Hide + &Ausblenden vom + + + + + + server + -Server + + + + &Open + Ö&ffne den + + + + server + Server + + + + Manual + Manuell + + + + Default + Standard + + + + Default (North America) + Standard (Nordamerika) + + + + Server + + + + + &Window + &Fenster + + + + Unregistered + Nicht registriert + + + + Bad address + Ungültige Adresse + + + + Registration requested + Registrierung angefordert + + + + Registration failed + Registrierung fehlgeschlagen + + + + Check server version + Überprüfe Version des Servers + + + + Registered + Registriert + + + + Central Server full + Zentralserver voll + + + + Unknown value + Unbekannter Wert + + + + CServerDlgBase + + + Client IP:Port + Teilnehmer IP:Port + + + + + Name + Name + + + + Jitter Buffer Size + Netzwerkpuffergröße + + + + Start Minimized on Windows Start + Starte minimiert beim Windows-Start + + + + Show Creative Commons BY-NC-SA 4.0 Licence Dialog + Zeige den Creative Commons BY-NC-SA 4.0 Lizenzdialog + + + + Make My Server Public (Register My Server in the Server List) + Veröffentliche meinen Server in der Serverliste + + + + STATUS + + + + + Central Server Address: + Zentralserveradresse + + + + My Server Info + Meine Serverinformationen + + + + Location: City + Standort: Stadt + + + + Location: Country + Standort: Land + + + + TextLabelNameVersion + + + + + CSound + + + The Jack server is not running. This software requires a Jack server to run. Normally if the Jack server is not running this software will automatically start the Jack server. It seems that this auto start has not worked. Try to start the Jack server manually. + Der Jack-Server läuft nicht. Diese Software benötigt aber einen Jack-Server um zu funktionieren. Normalerweise wird der Jack-Server automatisch gestartet. Es scheint so, als hätte dieser Automatismus nicht funktioniert. Versuche den Jack-Server manuell zu starten. + + + + The Jack server sample rate is different from the required one. The required sample rate is: + Die Jack-Server-Samplerate ist verschieden zu der benötigen. Die benötigte Samplerate ist: + + + + You can use a tool like <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> to adjust the Jack server sample rate. + Do kannst ein Werkzeug wie <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></li> verwenden um die Samplerate umzustellen. + + + + Make sure to set the Frames/Period to a low value like + Versichere dich, dass die Frames/Perioden auf einen niedrigen Wert wie z.B. + + + + to achieve a low delay. + eingestellt ist um eine niedrige Verzögerung zu erreichen. + + + + + The Jack port registering failed. + Die Jack-Portregistrierung ist fehlgeschlagen. + + + + Cannot activate the Jack client. + Der Jack-Client kann nicht aktiviert werden. + + + + The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue. + Der Jack-Server wurde gestoppt. Diese Software benötigt aber einen aktiven Jack-Server um zu funktionieren. Versuche die Software neu zu starten um das Problem zu lösen. + + + + CoreAudio input AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + CoreAudio Eingang AudioHardwareGetProperty Aufruf schlug fehl. Es scheint als wäre keine Soundkarte im System vorhanden. + + + + CoreAudio output AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + CoreAudio Ausgang AudioHardwareGetProperty Aufruf schlug fehl. Es scheint, dass keine Soundkarte ist im System verfügbar. + + + + Current system audio input device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + Die aktuelle Eingangssamplerate von %1 Hz wird nicht unterstützt. Bitte öffne die Audio-MIDI-Setup-Applikation in Applikationen->Werkzeuge und versuche die Samplerate auf %2 Hz einzustellen. + + + + Current system audio output device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + Die aktuelle Ausgangssamplerate von %1 Hz wird nicht unterstützt. Bitte öffne die Audio-MIDI-Setup-Applikation in Applikationen->Werkzeuge und versuche die Samplerate auf %2 Hz einzustellen. + + + + The audio input stream format for this audio device is not compatible with this software. + Das Audioeingangsstromformat von diesem Audiogerät ist nicht kompatibel mit dieser Software. + + + + The audio output stream format for this audio device is not compatible with this software. + Das Audioausgangsstromformat von diesem Audiogerät ist nicht kompatibel mit dieser Software. + + + + The buffer sizes of the current input and output audio device cannot be set to a common value. Please choose other input/output audio devices in your system settings. + Die Puffergrößen vom aktuellen Eingangs- und Ausgangsaudiogerät kann nicht auf einen gemeinsamen Wert eingestellt werden. Bitte wähle ein anderes Eingangs-/Ausgangsgerät aus der Geräteliste aus. + + + + The audio driver could not be initialized. + Der Audiotreiber konnte nicht initialisiert werden. + + + + The audio device does not support the required sample rate. The required sample rate is: + Das Audiogerät unterstützt nicht die benötigte Samplerate. Die benötigte Samplerate ist: + + + + The audio device does not support to set the required sampling rate. This error can happen if you have an audio interface like the Roland UA-25EX where you set the sample rate with a hardware switch on the audio device. If this is the case, please change the sample rate to + Das Audiogerät unterstützt nicht die benötigte Samplerate. Dieser Fehler kann auftreten, wenn ein Audiogerät wie das Roland UA-25EX verwendet wird, bei dem die Samplerate per Schalter am Gerät verstellt werden muss. Falls das der Fall sein sollte, dann stelle bitte den Schalter auf + + + + Hz on the device and restart the + Hz am Gerät und starte die + + + + software. + Software neu. + + + + The audio device does not support the required number of channels. The required number of channels for input and output is: + Das Audiogerät unterstützt nicht die benötigte Anzahl an Kanälen. Die benötigte Anzahl an Kanälen für den Eingang und den Ausgang ist: + + + + + Required audio sample format not available. + Das benötigte Audio Sampleformat ist nicht verfügbar. + + + + No ASIO audio device (driver) found. + Kein ASIO-Gerätetreiber wurde gefunden. + + + + The + Die + + + + 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. + Software benötigt aber ein ASIO Audiointerface um zu funktionieren. Dies ist keine Standard-Windowsschnittstelle und benötigt deshalb einen speziellen Treiber. Entweder die Soundkarte liefert einen nativen ASIO-Treiber mit (was empfohlen wird) oder man versucht es mit dem ASIO4All-Universaltreiber. + + + + Error closing stream: $s + Fehler beim Schließen des Datenstroms: $s + + + + CSoundBase + + + Invalid device selection. + Ungültige Geräteauswahl. + + + + The audio driver properties have changed to a state which is incompatible to this software. The selected audio device could not be used because of the following error: + Die Audiotreibereigenschaften haben sich geändert. Die neuen Einstellungen sind nicht mehr kompatibel zu dieser Software. Das ausgewählte Audiogerät konnte nicht benutzt werden wegen folgendem Fehler: + + + + Please restart the software. + Bitte starte die Software neu. + + + + Close + + + + + No usable + Kein benutzbares + + + + audio device (driver) found. + Audiogerät (Treiber) konnte gefunden werden. + + + + In the following there is a list of all available drivers with the associated error message: + Im folgenden wird eine Liste aller gefundenen Audiogeräte mit entsprechender Fehlermeldung angezeigt: + + + + Do you want to open the ASIO driver setups? + Willst du die ASIO-Treibereinstellungen öffnen? + + + + could not be started because of audio interface issues. + konnte nicht gestartet werden wegen Problemen mit dem Audiogerät. + + + diff --git a/src/res/translation/translation_es_ES.qm b/src/res/translation/translation_es_ES.qm new file mode 100644 index 00000000..1b23987e Binary files /dev/null and b/src/res/translation/translation_es_ES.qm differ diff --git a/src/res/translation/translation_es_ES.ts b/src/res/translation/translation_es_ES.ts new file mode 100644 index 00000000..f7289637 --- /dev/null +++ b/src/res/translation/translation_es_ES.ts @@ -0,0 +1,2338 @@ + + + + + CAboutDlg + + + The + El software + + + software enables musicians to perform real-time jam sessions over the internet. There is a + software permite a músicos realizar jam sessions en tiempo real por internet. Hay un + + + + software enables musicians to perform real-time jam sessions over the internet. + permite a músicos realizar jam sessions en tiempo real por internet. + + + + server which collects the audio data from each + servidor que recoge el audio de cada + + + + There is a + Hay un + + + + client, mixes the audio data and sends the mix back to each client. + cliente, mezcla el audio y lo envía de vuelta a cada cliente. + + + + uses the following libraries, resources or code snippets: + utiliza las siguientes librerías, recursos o fragmentos de código: + + + + Qt cross-platform application framework + Qt cross-platform application framework + + + + Audio reverberation code by Perry R. Cook and Gary P. Scavone + Código de reverberación de audio de Perry R. Cook y Gary P. Scavone + + + + Some pixmaps are from the + Algunos pixmaps son del + + + + Country flag icons from Mark James + Iconos de banderas nacionales de Mark James + + + + For details on the contributions check out the + Para más detalles sobre los contribuidores consulta la + + + + Github Contributors list + lista de Contribuidores en Github + + + + About + Acerca de + + + + , Version + , Versión + + + + Internet Jam Session Software + Internet Jam Session Software + + + + Under the GNU General Public License (GPL) + Bajo la GNU General Public License (GPL) + + + + CAboutDlgBase + + + About + Acerca de + + + + TextLabelVersion + TextLabelVersion + + + + Copyright (C) 2005-2020 Volker Fischer and others + Copyright (C) 2005-2020 Volker Fischer y otros + + + + A&bout + A&cerca de + + + + &Libraries + &Librerías + + + + &Contributors + &Contribuidores + + + + &Translation + &Traducción + + + + &OK + &OK + + + + CAnalyzerConsole + + + Analyzer Console + Analyzer Console + + + + Error Rate of Each Buffer Size + Tasa de Error de Cada Tamaño de Buffer + + + + CAudioMixerBoard + + + Server + Servidor + + + + T R Y I N G T O C O N N E C T + I N T E N T A N D O C O N E C T A R + + + + CChannelFader + + + Channel Level + Nivel Canal + + + + Displays the pre-fader audio level of this channel. All connected clients at the server will be assigned an audio level, the same value for each client. + Muestra el nivel de audio pre-fader de este canal. Todos los clientes conectados al servidor tienen un nivel de audio asignado, el mismo para cada cliente. + + + + Input level of the current audio channel at the server + Nivel de entrada del canal de audio actual en el servidor + + + + Mixer Fader + Fader Mezclador + + + + Adjusts the audio level of this channel. All connected clients at the server will be assigned an audio fader at each client, adjusting the local mix. + Ajusta el nivel de audio de este canal. Todos los clientes conectados al servidor tienen asignado un fader en el cliente, ajustando la mezcla local. + + + + Local mix level setting of the current audio channel at the server + Ajuste local de la mezcla del canal de audio actual en el servidor + + + + With the Mute checkbox, the audio channel can be muted. + Activando Mute, se puede mutear el canal de audio. + + + + Mute button + Botón Mute + + + + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except of the current channel are muted. It is possible to set more than one channel to solo. + Activando Solo, todos los demás canales de audio excepto este se mutean. Es posible activar esta función para más de un canal. + + + + Solo button + Botón Solo + + + + Fader Tag + Etiqueta Fader + + + + The fader tag identifies the connected client. The tag name, the picture of your instrument and a flag of your country can be set in the main window. + La etiqueta del fader identifica al cliente conectado. El nombre de la etiqueta, la imagen de tu instrumento y la bandera de tu país se pueden establecer en la ventana principal. + + + + Mixer channel instrument picture + Imagen mezclador canal instrumento + + + + Mixer channel label (fader tag) + Etiqueta mezclador canal (etiqueta fader) + + + + Mixer channel country flag + Bandera país mezclador canal + + + + MUTE + MUTE + + + + SOLO + SOLO + + + + Alias/Name + Alias/Nombre + + + + Instrument + Instrumento + + + + Location + Ubicación + + + + + + Skill Level + Nivel Habilidad + + + + Beginner + Principiante + + + + Intermediate + Intermedio + + + + Expert + Experto + + + + Musician Profile + Perfil Músico + + + + + + Mute + Mute + + + + + + Solo + Solo + + + + CChatDlg + + + Chat Window + Ventana Chat + + + + The chat window shows a history of all chat messages. + La ventana del chat muestra un historial de todos los mensajes. + + + + Chat history + Historial chat + + + + Input Message Text + Texto Mensaje + + + + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. + Teclea el mensaje en el campo y pulsa Enter para enviar el mensaje al servidor, el cual distribuye el mensaje a todos los clientes conectados. Tu mensaje se mostrará en la ventana del chat. + + + + New chat text edit box + Campo nuevo texto chat + + + + CChatDlgBase + + + Chat + Chat + + + + Cl&ear + Va&ciar + + + + &Close + &Cerrar + + + + CClientDlg + + + Input Level Meter + Indicador nivel entrada + + + + The input level indicators show the input level of the two stereo channels of the current selected audio input. + Los indicadores de nivel de entrada muestran el nivel de entrada de los dos canales estéreo de la entrada de audio actualmente seleccionada. + + + + Make sure not to clip the input signal to avoid distortions of the audio signal. + Asegúrate de no clipear la señal de entrada para evitar distorsiones de la señal de audio. + + + + If the + Si el software + + + + software is connected and you play your instrument/sing in the microphone, the LED level meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. line in instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. + está conectado y tocas tu instrumento/cantas por el micrófono, el LED del indicador debería parpadear. Si no es así, seguramente has seleccionado el canal de entrada equivocado (por ej. line in en lugar de la entrada del micrófono) o está muy bajo el gain de entrada en el mezclador de audio (Windows). + + + + For a proper usage of the + Para un uso adecuado del software + + + + software, you should not hear your singing/instrument in the loudspeaker or your headphone when the + , no deberías oír tu voz/instrumento por el altavoz o los auriculares cuando el software + + + + software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). + no está conectado. Esto se puede hacer muteando tu entrada de audio en el mezclador de Reproducción (¡y no en el de Grabación!). + + + + Input level meter + Indicador nivel entrada + + + + Simulates an analog LED level meter. + Simula un indicador analógico de LEDs. + + + + Connect/Disconnect Button + Botón Conexión/Desconexión + + + + Push this button to connect a server. A dialog where you can select a server will open. If you are connected, pressing this button will end the session. + Pulsa este botón para conectar con un servidor. Se abrirá una ventana donde puedes seleccionar un servidor. Si estás conectado, este botón finalizará la sesión. + + + + Connect and disconnect toggle button + Botón de conexión y desconexión + + + + Clicking on this button changes the caption of the button from Connect to Disconnect, i.e., it implements a toggle functionality for connecting and disconnecting the + Pulsando este botón cambia el texto del mismo de Conectar a Desconectar; esto es, tiene la función de conmutador para conectar y desconectar el software + + + + + software. + . + + + + Local Audio Input Fader + Fader Entrada Audio Local + + + + Local audio input fader (left/right) + Fader entrada audio local (izq/dcho) + + + + Reverberation effect level setting + Nivel efecto reverberación + + + + Left channel selection for reverberation + Selección canal izq para reverberación + + + + Right channel selection for reverberation + Selección canal dcho para reverberación + + + + If this LED indicator turns red, you will not have much fun using the + Si este indicador LED se vuelve rojo, no te divertirás demasiado utilizando el + + + + Delay status LED indicator + Indicador LED estado retardo + + + + Buffers status LED indicator + Indicador LED estado buffers + + + + + C&onnect + C&onectar + + + + &View + &Ver + + + + &Connection Setup... + &Configuración de Conexión... + + + + My &Profile... + Mi &Perfil... + + + + C&hat... + C&hat... + + + + &Settings... + &Configuración... + + + + &Analyzer Console... + &Analyzer Console... + + + + E&xit + S&alir + + + + None + Ninguno + + + + Center + Centro + + + + R + R + + + + + L + L + + + + With the audio fader, the relative levels of the left and right local audio channels can be changed. For a mono signal it acts like a panning between the two channels. If, e.g., a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows + Con el fader de audio, los niveles relativos de los canales locales de audio derecho e izquierdo pueden cambiarse. Para una señal mono actúa como paneo entre los dos canales. Por ej., si se conecta un miocrófono al canal derecho y un instrumento al izquierdo que suena mucho más alto que el micrófono, mueve el fader en una dirección donde la etiqueta sobre el fader muestra + + + + , where + , donde + + + + is the current attenuation indicator. + es el indicador actual de atenuación. + + + + Reverberation Level + Nivel Reverberación + + + + 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. + Se puede aplicar un efecto de reverberación a un canal local de audio mono o a ambos canales en modo estéreo. Se puede modificar la selección de canales en modo mono y el nivel de reverberación. Por ej., si la señal del micrófono va por el canal derecho de la tarjeta de sonido y se desea aplicar reverberación, cambia el selector de canal a derecho y sube el fader hasta alcanzar el nivel de reverberación deseado. + + + + The reverberation effect requires significant CPU so that it should only be used on fast PCs. If the reverberation level fader is set to minimum (which is the default setting), the reverberation effect is switched off and does not cause any additional CPU usage. + El efecto de reverberación require un esfuerzo importante del procesador, por lo que solo debería usarse en ordenadores potentes. Si se deja el fader de reverberación al mínimo (la configuración por defecto), el efecto estará desactivado y no significará ninguna carga adicional para el procesador. + + + + Reverberation Channel Selection + Selección Canal Reverberación + + + + With these radio buttons the audio input channel on which the reverberation effect is applied can be chosen. Either the left or right input channel can be selected. + Con estos botones se puede escoger el canal de entrada de audio al que se aplica el efecto de reverberación. Se pueden elegir los canales de entrada izquierdo o derecho. + + + + Delay Status LED + LED Estado Retardo + + + + The delay status LED indicator shows the current audio delay status. If the light is green, the delay is perfect for a jam session. If the light is yellow, a session is still possible but it may be harder to play. If the light is red, the delay is too large for jamming. + El indicador LED del estado del retardo muestra el estado actual del retardo del audio. Si está en verde, el retardo es perfecto para una jam session. Si está en amarillo, la sesión aún es posible, pero quizá sea más difícil tocar. Si está en rojo, el retardo es demasiado alto para tocar. + + + + Buffers Status LED + LED Estado Buffers + + + + The buffers status LED indicator shows the current audio/streaming status. If the light is green, there are no buffer overruns/underruns and the audio stream is not interrupted. If the light is red, the audio stream is interrupted caused by one of the following problems: + El indicador LED del estado de buffers muestra el estado actual del flujo de audio. Si está verde, no hay problemas de buffer y no se interrumpe el flujo de audio. Si está rojo, el flujo de audio se interrumpe, a causa de uno de los siguientes problemas: + + + + The network jitter buffer is not large enough for the current network/audio interface jitter. + El jitter buffer de red no es lo suficientemente grande para el jitter actual de la red/interfaz de audio. + + + + The sound card buffer delay (buffer size) is set to a too small value. + El retardo de buffer de la tarjeta de audio (tamaño buffer) tiene un valor demasiado bajo. + + + + The upload or download stream rate is too high for the current available internet bandwidth. + La tasa de subida o bajada is demasiado alta para el ancho de banda disponible de internet. + + + + The CPU of the client or server is at 100%. + El procesador del cliente o del servidor está al 100%. + + + + user + usuario + + + + users + usuarios + + + + D&isconnect + D&esconectar + + + + CClientDlgBase + + + Delay + Retardo + + + + Buffers + Buffers + + + + Input + Entrada + + + + L + L + + + + R + R + + + + Settings + Configuración + + + + Chat + Chat + + + + Mute Myself + Mutearme Yo + + + + C&onnect + C&onectar + + + + Pan + Paneo + + + + Center + Centro + + + + Reverb + Reverb + + + + Left + Izq + + + + Right + Dcho + + + + CClientSettingsDlg + + + Jitter Buffer Size + Tamaño Jitter Buffer + + + + The jitter buffer compensates for network and sound card timing jitters. The size of this jitter buffer has therefore influence on the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). + El jitter buffer compensa el jitter de la red y la tarjeta de audio. El tamaño de este buffer tiene por tanto un impacto sobre la calidad del flujo de audio (el número de caídas de la señal) y el retardo total (a mayor buffer, mayor retardo). + + + + The jitter buffer size can be manually chosen for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light on the bottom of the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun took place and the audio stream is interrupted. + El tamaño del jitter buffer se puede establecer para el cliente local y para el servidor remoto. Para el jitter buffer local, las caídas del flujo de audio se indican mediante la luz debajo de los faders del jitter buffer. Si la luz se vuelve roja, significa que ha habido una interrupción del flujo de audio. + + + + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. + Por tanto la configuración del jitter buffer es un compromiso entre calidad y retardo total. + + + + An auto setting of the jitter buffer size setting is available. If the check Auto is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If the Auto check is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). + Hay disponible una configuración automática del jitter buffer. Si se activa Auto, los jitter buffers del cliente local y del servidor remoto se configuran automáticamente basándose en mediciones del jitter de la red y la tarjeta de audio. Si se activa esta opción, los faders quedan deshabilitados (no pueden moverse con el ratón). + + + + In case the auto setting of the jitter buffer is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the auto setting functionality and to lower the jitter buffer size manually by using the sliders until your personal acceptable limit of the amount of dropouts is reached. The LED indicator will visualize the audio dropouts of the local jitter buffer by a red light. + En caso de activar la configuración automática del jitter buffer, los buffers de red del cliente local y del servidor remoto se asignan a un valor conservador para minimizar la probabilidad de fallos de audio. Para ajustar el retardo de audio/latencia se recomienda desactivar la función automática y bajar los valores de jitter buffer manualmente utilizando los controles deslizantes hasta alcanzar un límite aceptable de caídas de audio. El indicador LED ofrece una visualización de las caídas de audio mediante una luz roja. + + + + Local jitter buffer slider control + Control deslizante jitter buffer local + + + + Server jitter buffer slider control + Control deslizante jitter buffer servidor + + + + Auto jitter buffer switch + Interruptor auto jitter buffer + + + + Jitter buffer status LED indicator + Indicador LED estado jitter buffer + + + + Sound Card Device + Dispositivo de Audio + + + + The ASIO driver (sound card) can be selected using + El driver ASIO (tarjeta de audio) se puede seleccionar utilizando + + + + under the Windows operating system. Under MacOS/Linux, no sound card selection is possible. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. + en el sistema operativo Windows. En MacOs/Linux no es posible seleccionar la tarjeta de audio. Si el driver ASIO no es válido se muestra un mensaje de error y se selecciona el driver válido anterior. + + + + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. + Si el driver se selecciona durante una conexión activa, la conexión se detiene, se cambia el driver y la conexión se reanuda automáticamente. + + + + Sound card device selector combo box + Selector de dispositivo de audio + + + + In case the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. + En caso de utilizar el driver ASIO4ALL, por favor ten en cuenta que este driver normalmente introduce una latencia adicional de 10-30 ms. Por tanto se recomienda utilizar la tarjeta de audio con un driver nativo. + + + + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. + Si utilizas el driver kX ASIO, asegúrate de conectar las entradas ASIO en el panel de configuración de kX DSP. + + + + Sound Card Channel Mapping + Mapeo Canales Tarjeta Audio + + + + In case the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. + Si el dispositivo de audio ofrece más de un canal de entrada o salida, son visibles las configuraciones para el Mapeo de Canales de Entrada y de Salida. + + + + For each + Para cada + + + + input/output channel (Left and Right channel) a different actual sound card channel can be selected. + canal de entrada/salida (canal Izquierdo y Derecho) se puede seleccionar un canal diferente de la tarjeta de audio. + + + + Left input channel selection combo box + Selección canal entrada izquierdo + + + + Right input channel selection combo box + Selección canal entrada derecho + + + + Left output channel selection combo box + Selección canal salida izquierdo + + + + Right output channel selection combo box + Selección canal salida derecho + + + + Enable Small Network Buffers + Activar Buffers Red Pequeños + + + + If enabled, the support for very small network audio packets is activated. Very small network packets are only actually used if the sound card buffer delay is smaller than + Si se activa, se habilita el soporte para paquetes de red de audio muy pequeños. Solo se utilizan estos paquetes pequeños si el retardo de buffer de la tarjeta de audio es menor de + + + + samples. The smaller the network buffers, the smaller the audio latency. But at the same time the network load increases and the probability of audio dropouts also increases. + muestras. Cuanto menores los buffers de red, menor la latencia de audio. Pero al mismo tiempo, aumenta la carga de red y la probabilidad de caídas de audio también aumenta. + + + + Enable small network buffers check box + Activar buffers de red pequeños + + + + Sound Card Buffer Delay + Retardo Buffer Tarjeta Audio + + + + The buffer delay setting is a fundamental setting of the + Este parámetro es una parte fundamental de la configuración del software + + + + software. This setting has influence on many connection properties. + . Este parámetro tiene un impacto sobre muchas propiedades de la conexión. + + + + Three buffer sizes are supported + Hay soporte para tres tamaños de buffer + + + + 64 samples: This is the preferred setting since it gives lowest latency but does not work with all sound cards. + 64 muestras: Es la configuración aconsejada puesto que ofrece la latencia más baja, aunque no funciona con todas las tarjetas de audio. + + + + 128 samples: This setting should work on most of the available sound cards. + 128 muestras: Esta configuración debería de funcionar con la mayoría de tarjetas de audio. + + + + 256 samples: This setting should only be used if only a very slow computer or a slow internet connection is available. + 256 muestras: Esta configuración solo debería usarse con un ordenador muy lento o con una conexión a internet muy lenta. + + + + Some sound card driver do not allow the buffer delay to be changed from within the + Algunos drivers de tarjetas de audio no permiten cambiar el retardo de buffer desde el software + + + + software. In this case the buffer delay setting is disabled. To change the actual buffer delay, this setting has to be changed in the sound card driver. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + . En este caso la configuración del retardo de buffer se deshabilita. Para cambiarlo, esta configuración debe realizarse en el driver de la tarjeta de audio. En Windows, pulsa el botón de Configuración ASIO para acceder al panel de configuración. En Linux, utiliza la herramienta de configuración de Jack para cambiar el tamaño del buffer. + + + + If no buffer size is selected and all settings are disabled, an unsupported buffer size is used by the driver. The + Si no hay ningún tamaño de buffer seleccionado y todas las configuraciones están deshabilitadas, el driver está utilizando un tamaño de buffer no soportado. El software + + + + software will still work with this setting but with restricted performance. + seguirá funcionando con esta configuración pero con un rendimiento limitado. + + + + 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 outs) and the higher the upload rate and the lower the overall delay. + El retardo del buffer tiene un impacto en el estado de la conexión, la tasa de subida y el retardo total. Cuanto menor sea el retardo del buffer, mayor la probabilidad de que el indicador de estado esté en rojo (caídas de audio), mayor la tasa de subida y menor el retardo total. + + + + The buffer setting is therefore a trade-off between audio quality and overall delay. + Por tanto la configuración del buffer es un compromiso entre calidad de audio y retardo total. + + + + If the buffer delay settings are disabled, it is prohibited by the audio driver to modify this setting from within the + Si la configuración de retardo de buffers se encuentra deshabilitada, es porque el driver de audio prohíbe la modificación de este parámetro desde dentro del software + + + + software. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + . En Windows, pulsa el botón de Configuración ASIO para abrir el panel de configuración del driver. En Linux, utiliza la herramienta de configuración de Jack para cambiar el tamaño del buffer. + + + + 128 samples setting radio button + Configuración 128 muestras + + + + 256 samples setting radio button + Configuración 256 muestras + + + + 512 samples setting radio button + Configuración 512 muestras + + + + ASIO setup push button + Botón configuración ASIO + + + + Fancy Skin + Interfaz Oscura + + + + If enabled, a fancy skin will be applied to the main window. + Si se activa, se aplicará un aspecto oscuro a la ventana principal. + + + + Fancy skin check box + Activar interfaz oscura + + + + Display Channel Levels + Mostrar Niveles Canales + + + + If enabled, each client channel will display a pre-fader level bar. + Si se activa, cada canal de cliente mostrará una barra de nivel pre-fader. + + + + Display channel levels check box + Mostrar niveles canales + + + + Audio Channels + Canales Audio + + + + Select the number of audio channels to be used. There are three modes available. The mono and stereo modes use one and two audio channels respectively. In the mono-in/stereo-out mode the audio signal which is sent to the server is mono but the return signal is stereo. This is useful for the case that the sound card puts the instrument on one input channel and the microphone on the other channel. In that case the two input signals can be mixed to one mono channel but the server mix can be heard in stereo. + Selecciona el número de canales de audio a utilizar. Hay tres modos disponibles. Los modos mono y estéreo utilizan uno y dos canales de audio respectivamente. En modo entrada-mono/salida-estéreo la señal de audio enviada al servidor es mono pero la señal que vuelve es estéreo. Esto es útil si la tarjeta de audio tiene un instrumento en un canal de entrada y un micrófono en el otro. En ese caso las dos señales de entrada pueden combinarse en un canal mono pero la mezcla del servidor se escucha en estéreo. + + + + Enabling the stereo streaming mode will increase the stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Activar el modo estéreo aumentará la tasa de envío de datos. Asegúrate de que la tasa de subida no excede el ancho de banda disponible en tu conexión a internet. + + + + In case of the stereo streaming mode, no audio channel selection for the reverberation effect will be available on the main window since the effect is applied on both channels in this case. + En el caso del modo estéreo, no estará disponible la selección de canal para el efecto de reverberación en la ventana principal puesto que en este caso el efecto se aplicará a ambos canales. + + + + Audio channels combo box + Selección canales audio + + + + Audio Quality + Calidad Audio + + + + Select the desired audio quality. A low, normal or high audio quality can be selected. The higher the audio quality, the higher the audio stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Selecciona la calidad de audio deseada. Se puede seleccionar una calidad baja, normal o alta. Cuanto mayor la calidad del audio, mayor la tasa de transferencia de datos de audio. Asegúrate de que la tasa de subida no excede el ancho de banda disponible en tu conexión a internet. + + + + Audio quality combo box + Selección calidad audio + + + + New Client Level + Nivel Cliente Nuevo + + + + The new client level setting defines the fader level of a new connected client in percent. I.e. if a new client connects to the current server, it will get the specified initial fader level if no other fader level of a previous connection of that client was already stored. + La configuración del nivel de clientes nuevos define el nivel del fader para una nueva conexión expresado en un porcentaje. Esto es, si un cliente nuevo se conecta al servidor actual, su fader tomará el valor especificado si no se ha guardado ningún valor de una conexión anterior de ese cliente. + + + + New client level edit box + Campo para nivel nuevo cliente + + + + Central Server Address + Dirección Servidor Central + + + + The central server address is the IP address or URL of the central server at which the server list of the connection dialog is managed. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + La dirección del servidor central es la dirección IP o URL del servidor central en el que se gestiona la lista de servidores en la ventana de conexión. Aquí se puede escoger la región local de entre los servidores centrales por defecto o se puede especificar una dirección manualmente. + + + + Default central server type combo box + Selección servidor central + + + + Central server address line edit + Dirección servidor central + + + + Current Connection Status Parameter + Parámetro Estado Conexión Actual + + + + The ping time is the time required for the audio stream to travel from the client to the server and backwards. This delay is introduced by the network. This delay should be as low as 20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to the server is too large or your internet connection is not sufficient. + El ping es el tiempo que requiere el flujo de audio para viajar desde el cliente al servidor y volver. Este retardo lo determina la red. Esta cifra debería ser de unos 20-30 ms. Si este retardo es mayor (por ej. 50-60 ms), la distancia al servidor es demasiado grande o tu conexión a internet no es óptima. + + + + The overall delay is calculated from the current ping time and the delay which is introduced by the current buffer settings. + El retardo total se calcula con el ping y el retardo ocasionado por la configuración de buffers. + + + + The upstream rate depends on the current audio packet size and the audio compression setting. Make sure that the upstream rate is not higher than the available rate (check the upstream capabilities of your internet connection by, e.g., using speedtest.net). + La tasa de subida depende del tamaño actual de paquetes de audio y la configuración de compresión de audio. Asegúrate de que la tasa de subida no es mayor que la tasa disponible (comprueba la tasa de subida de tu conexión a internet, por ej. con speedtest.net). + + + + If this LED indicator turns red, you will not have much fun using the + Si este indicador LED se vuelve rojo, no te divertirás demasiado utilizando el software + + + + software. + . + + + + ASIO Setup + Configuración ASIO + + + + Mono + Mono + + + + Mono-in/Stereo-out + Mono-in/Estéreo-out + + + + Stereo + Estéreo + + + + Low + Baja + + + + Normal + Normal + + + + High + Alta + + + + Manual + Manual + + + + Default + Por defecto + + + + Default (North America) + Por defecto (Norteamérica) + + + + preferred + aconsejado + + + + + Size: + Tamaño: + + + + Buffer Delay + Retardo Buffer + + + + Buffer Delay: + Retardo Buffer: + + + + The selected audio device could not be used because of the following error: + El dispositivo de audio seleccionado no puede utilizarse a causa del siguiente error: + + + + The previous driver will be selected. + Se utilizará el driver anterior. + + + + Ok + Ok + + + + CClientSettingsDlgBase + + + Settings + Configuración + + + + Soundcard + Tarjeta Sonido + + + + Device + Dispositivo + + + + Input Channel Mapping + Mapeo Canales Entrada + + + + + L + L + + + + + R + R + + + + Output Channel Mapping + Mapeo Canales Salida + + + + Enable Small Network Buffers + Activar Buffers Pequeños + + + + Buffer Delay + Retardo Buffer + + + + (preferred) + (aconsejado) + + + + (default) + (por defecto) + + + + (safe) + (seguro) + + + + Driver Setup + Configuración Driver + + + + Jitter Buffer + Jitter Buffer + + + + Auto + Auto + + + + Local + Local + + + + Server + Servidor + + + + + Size + Valor + + + + Misc + Varios + + + + Audio Channels + Canales Audio + + + + Audio Quality + Calidad Audio + + + + New Client Level + Nivel Cliente Nuevo + + + + % + % + + + + Fancy Skin + Intfaz Oscura + + + + Display Channel Levels + Mostrar Nivel Canales + + + + Central Server Address: + Dirección Servidor Central: + + + + Audio Stream Rate + Tasa Muestreo Audio + + + + + + val + val + + + + Ping Time + Tiempo Ping + + + + Overall Delay + Retardo Total + + + + CConnectDlg + + + Server List + Lista Servidores + + + + The server list shows a list of available servers which are registered at the central server. Select a server from the list and press the connect button to connect to this server. Alternatively, double click a server from the list to connect to it. If a server is occupied, a list of the connected musicians is available by expanding the list item. Permanent servers are shown in bold font. + La lista de servidores muestra una lista de servidores disponibles que se encuentran registrados en el servidor central. Escoge un servidor de la lista y pulsa el botón de conectar para conectarte a este servidor. También es posible realizar la conexión haciendo doble clic en un servidor de la lista. Si un servidor está ocupado, se puede desplegar una lista de los músicos conectados al pulsar el icono al lado del nombre. Los servidores permanentes se muestran en negrita. + + + + Note that it may take some time to retrieve the server list from the central server. If no valid central server address is specified in the settings, no server list will be available. + Ten en cuenta que puede llevar un tiempo recuperar la lista de servidores del servidor central. Si no se especifica una dirección válida en la configuración, no habrá ninguna lista de servidores disponible. + + + + Server list view + Vista lista de servidores + + + + Server Address + Dirección Servidor + + + + The IP address or URL of the server running the + La dirección IP o URL del servidor ejecutando el software del servidor + + + + 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: + debe introducirse aquí. Se puede añadir un número de puerto opcional detrás de la dirección IP o URL utilizando dos puntos como separador, por ej. ejemplo.org: + + + + . A list of the most recent used server IP addresses or URLs is available for selection. + . Hay disponible una lista de las direcciones IP o URLs utilizadas más recientemente para su selección. + + + + Server address edit box + Selección dirección servidor + + + + Holds the current server IP address or URL. It also stores old URLs in the combo box list. + Contiene la dirección IP o URL actual del servidor. También guarda viejas URL en la lista. + + + + Filter + Filtro + + + + The server list is filered by the given text. Note that the filter is case insensitive. + La lista de servidores se filtra con el texto introducido. El filtro no es sensible a mayúsculas/minúsculas. + + + + Filter edit box + Campo filtro + + + + Show All Musicians + Mostrar Todos los Músicos + + + + If you check this check box, the musicians of all servers are shown. If you uncheck the check box, all list view items are collapsed. + Si activas esta opción, se mostrarán los músicos de todos los servidores. Si lo desactivas, se colapsan todas las listas. + + + + Show all musicians check box + Selección Mostrar todos los músicos + + + + CConnectDlgBase + + + Connection Setup + Configuración Conexión + + + + Filter + Filtro + + + + Show All Musicians + Mostrar Todos los Músicos + + + + Server Name + Nombre Servidor + + + + Ping Time + Tiempo Ping + + + + Musicians + Músicos + + + + Location + Ubicación + + + + Server Name/Address + Nombre/Dirección Servidor + + + + C&ancel + C&ancelar + + + + &Connect + &Conectar + + + + CHelpMenu + + + &Help + &Ayuda + + + + + Getting &Started... + Cómo &Empezar... + + + + Software &Manual... + Manual del &Software... + + + + What's &This + Qué es &Esto + + + + &About... + &Acerca de... + + + + CLicenceDlg + + + I &agree to the above licence terms + &Acepto los términos de la licencia arriba expuestos + + + + Accept + Acepto + + + + Decline + No Acepto + + + + By connecting to this server and agreeing to this notice, you agree to the following: + Al conectarte a este servidor y aceptar esta notificación, aceptas lo siguiente: + + + + 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 + Ud. declara que todos los datos, audios u otras obras transmitidas a este servidor son la propiedad de Ud. y creadas por Ud. o sus licenciatarios, y que pone a disposición de terceras partes estos datos, audios u otras obras mediante la siguiente Licencia Creative Commons (para más información sobre esta licencia, ver + + + + You are free to: + Ud. es libre de: + + + + Share + Compartir + + + + copy and redistribute the material in any medium or format + copiar y redistribuir el material en cualquier medio o formato + + + + Adapt + Adaptar + + + + remix, transform, and build upon the material + remezclar, transformar y construir a partir del material + + + + The licensor cannot revoke these freedoms as long as you follow the license terms. + El licenciante no puede revocar estas libertades en tanto Ud. siga los términos de la licencia. + + + + Under the following terms: + Bajo los siguientes términos: + + + + Attribution + Atribución + + + + 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. + Ud. debe dar crédito de manera adecuada, brindar un enlace a la licencia, e indicar si se han realizado cambios. Puede hacerlo en cualquier forma razonable, pero no de forma tal que sugiera que Ud. o su uso tienen el apoyo de la licenciante. + + + + NonCommercial + No-Comercial + + + + You may not use the material for commercial purposes. + No puede utilizar el material con fines comerciales. + + + + ShareAlike + ShareAlike + + + + If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + Si remezcla, transforma o construye sobre el material, debe distribuir sus contribuciones bajo la misma licencia que el original. + + + + No additional restrictions + Sin restricciones adicionales + + + + You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + No puede aplicar términos legales o medidas tecnológicas que restringan legalmente a otras personas de hacer cualquier cosa permitida por la licencia. + + + + CMusProfDlg + + + 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. + Esta etiqueta también se mostrará a cada cliente conectado al mismo servidor que tú. Se se deja vacío, se muestra la dirección IP en su lugar. + + + + Alias or name edit box + Campo para alias o nombre + + + + Instrument picture button + Botón imagen instrumento + + + + Country flag button + Botón bandera país + + + + City edit box + Ciudad + + + + Skill level combo box + Nivel de habilidad + + + + + + None + Ninguno + + + + + Musician Profile + Perfil Músico + + + + Alias/Name + Alias/Nombre + + + + Instrument + Instrumento + + + + Country + País + + + + City + Ciudad + + + + Skill + Habilidad + + + + &Close + &Cerrar + + + + Beginner + Principiante + + + + Intermediate + Intermedio + + + + Expert + Experto + + + + 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. + Escribe tu nombre o alias aquí para que los demás músicos con quien quieras tocar te reconozcan. Puedes además añadir una imagen del instrumento que tocas y la bandera del país donde vives. La ciudad donde vives y tu nivel de habilidad con el instrumento también pueden añadirse. + + + + What you set here will appear at your fader on the mixer board when you are connected to a + Lo que introduzcas aquí aparecerá en tu fader del mezclador cuando te conectes a un servidor + + + + Drum Set + Batería + + + + Djembe + Djembé + + + + Electric Guitar + Guitarra Eléctrica + + + + Acoustic Guitar + Guitarra Acústica + + + + Bass Guitar + Bajo Eléctrico + + + + Keyboard + Teclado + + + + Synthesizer + Sintetizador + + + + Grand Piano + Piano de Cola + + + + Accordion + Acordeón + + + + Vocal + Voz + + + + Microphone + Micrófono + + + + Harmonica + Armónica + + + + Trumpet + Trompeta + + + + Trombone + Trombón + + + + French Horn + Trompa + + + + Tuba + Tuba + + + + Saxophone + Saxofón + + + + Clarinet + Clarinete + + + + Flute + Flauta + + + + Violin + Violín + + + + Cello + Violonchelo + + + + Double Bass + Contrabajo + + + + Recorder + Grabadora + + + + Streamer + Streamer + + + + Listener + Oyente + + + + Guitar+Vocal + Guitarra+Voz + + + + Keyboard+Vocal + Teclado+Voz + + + + Bodhran + Bodhran + + + + Bassoon + Fagot + + + + Oboe + Oboe + + + + Harp + Arpa + + + + Viola + Viola + + + + Congas + Congas + + + + Bongo + Bongo + + + + CServerDlg + + + Client List + Lista Clientes + + + + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. + La lista de clientes muestra todos los clientes actualmente conectados a este servidor. Alguna información sobre los clientes como la dirección IP y el nombre aparecen para cada cliente conectado. + + + + Connected clients list view + Vista lista clientes conectados + + + + Start Minimized on Operating System Start + Arranca Minimizado al Arrancar Sistema Operativo + + + + If the start minimized on operating system start check box is checked, the + Si se activa el arranque al arrancar el sistema operativo, el + + + + server will be started when the operating system starts up and is automatically minimized to a system task bar icon. + servidor arrancará cuando arranque el sistema operativo y se minimizará automáticamente a un icono en la barra de tareas. + + + + Show Creative Commons Licence Dialog + Mostrar Diálogo de Licencia Creative Commons + + + + If enabled, a Creative Commons BY-NC-SA 4.0 Licence dialog is shown each time a new user connects the server. + Si se activa, se mostrará un diálogo con la Licencia Creative Commons BY-NC-SA 4.0 cada vez que un cliente nuevo se conecte al servidor. + + + + Make My Server Public + Mi Servidor es Público + + + + If the Make My Server Public check box is checked, this server registers itself at the central server so that all + Si se activa Mi Servidor es Público, este servidor se registra en el servidor central para que todos los usuarios de + + + + users can see the server in the connect dialog server list and connect to it. The registering of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. + puedan ver el servidor en la lista de servidores de la ventana de conexión y puedan conectarse a él. El registro del servidor se renueva periódicamente para asegurarse de que todos los servidores en la lista se encuentren realmente disponibles. + + + + Register Server Status + Estado Registro Servidor + + + + If the Make My Server Public check box is checked, this will show the success of registration with the central server. + Si se ha activado Mi Servidor es Público, esto mostrará si se ha registrado en el servidor central con éxito. + + + + Central Server Address + Dirección Servidor Central + + + + The Central server address is the IP address or URL of the central server at which this server is registered. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + La dirección del Servidor Central es la dirección IP o URL del servidor central en el que se ha registrado este servidor. Aquí se puede escoger la región local de entre los servidores centrales por defecto o se puede especificar una dirección manualmente. + + + + Default central server type combo box + Selección servidor central + + + + Central server address line edit + Dirección servidor central + + + + Server Name + Nombre Servidor + + + + The server name identifies your server in the connect dialog server list at the clients. If no name is given, the IP address is shown instead. + El nombre del servidor identifica a tu servidor en la lista de conexión de servidores de los clientes. Si no se especifica un nombre, se muestra la dirección IP en su lugar. + + + + Server name line edit + Nombre del servidor + + + + Location City + Ubicación Ciudad + + + + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. + Aquí se puede especificar la ciudad en donde se ubica el servidor. Si se introduce una ciudad, se mostrará en la lista de conexión de servidores de los clientes. + + + + City where the server is located line edit + Ciudad en donde se encuentra en servidor + + + + Location country + Ubicación país + + + + The country in which this server is located can be set here. If a country is entered, it will be shown in the connect dialog server list at the clients. + Aquí se puede especificar el país en donde se ubica el servidor. Si se introduce un país, se mostrará en la lista de conexión de servidores de los clientes. + + + + Country where the server is located combo box + País en donde se encuentra el servidor + + + + + E&xit + S&alir + + + + &Hide + &Ocultar servidor + + + + + + server + + + + + &Open + &Abrir servidor + + + + server + + + + + Manual + Manual + + + + Default + Por defecto + + + + Default (North America) + Por defecto (Norteamérica) + + + + Server + : Servidor + + + + &Window + &Ventana + + + + Unregistered + Sin registrar + + + + Bad address + Dirección no válida + + + + Registration requested + Registro solicitado + + + + Registration failed + Error de registro + + + + Check server version + Comprueba la versión del servidor + + + + Registered + Registrado + + + + Central Server full + Servidor Central lleno + + + + Unknown value + Valor desconocido + + + + CServerDlgBase + + + Client IP:Port + IP:Puerto cliente + + + + + Name + Nombre + + + + Jitter Buffer Size + Tamaño Jitter Buffer + + + + Start Minimized on Windows Start + Arranca Minimizado al Arrancar Windows + + + + Show Creative Commons BY-NC-SA 4.0 Licence Dialog + Mostrar Diálogo de Licencia Creative Commons BY-NC-SA 4.0 + + + + Make My Server Public (Register My Server in the Server List) + Mi Servidor es Público (Registra Mi Servidor en la Lista de Servidores) + + + + STATUS + ESTADO + + + + Central Server Address: + Dirección Servidor Central: + + + + My Server Info + Info Mi Servidor + + + + Location: City + Ubicación: Ciudad + + + + Location: Country + Ubicación: País + + + + TextLabelNameVersion + TextLabelNameVersion + + + + CSound + + + The Jack server is not running. This software requires a Jack server to run. Normally if the Jack server is not running this software will automatically start the Jack server. It seems that this auto start has not worked. Try to start the Jack server manually. + El servidor Jack no está arrancado. Este software necesita el servidor Jack para funcionar. Normalmente, si el servidor no está arrancado este software lo arrancará automáticamente. Parece que este auto-arranque no ha funcionado. Intenta arrancar el servidor Jack manualmente. + + + + The Jack server sample rate is different from the required one. The required sample rate is: + La tasa de muestreo del servidor Jack es distinta a la requerida. La tasa de muestreo requerida es: + + + + You can use a tool like <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> to adjust the Jack server sample rate. + Puedes utilizar una herramiento como <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> para ajustar la tasa de muestreo del servidor Jack. + + + + Make sure to set the Frames/Period to a low value like + Asegúrate de establecer los Cuadros/Período en un valor bajo como + + + + to achieve a low delay. + para conseguir un retardo bajo. + + + + + The Jack port registering failed. + El registro de puertos de Jack falló. + + + + Cannot activate the Jack client. + No se puede activar el cliente Jack. + + + + The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue. + El servidor Jack se ha cerrado. Este software necesita el servidor Jack para funcionar. Intenta reiniciar el software para solucionar este problema. + + + + CoreAudio input AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + CoreAudio input AudioHardwareGetProperty call failed. Parece ser que el sistema no tiene una tarjeta de sonido disponible. + + + + CoreAudio output AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + CoreAudio output AudioHardwareGetProperty call failed. Parece ser que el sistema no tiene una tarjeta de sonido disponible. + + + + Current system audio input device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + La tasa de muestreo actual del dispositivo de audio de entrada de %1 Hz no está soportada. Por favor, abre Configuración-Audio-MIDI en Aplicaciones->Utilidades e intenta configurar una tasa de muestreo de %2 Hz. + + + + Current system audio output device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + La tasa de muestreo actual del dispositivo de audio de salida de %1 Hz no está soportada. Por favor, abre Configuración-Audio-MIDI en Aplicaciones->Utilidades e intenta configurar una tasa de muestreo de %2 Hz. + + + + The audio input stream format for this audio device is not compatible with this software. + El formato de transmisión de audio de entrada para este dispositivo de audio no es compatible con este software. + + + + The audio output stream format for this audio device is not compatible with this software. + El formato de transmisión de audio de salida para este dispositivo de audio no es compatible con este software. + + + + The buffer sizes of the current input and output audio device cannot be set to a common value. Please choose other input/output audio devices in your system settings. + Los tamaños de buffer del dispositivo actual de entrada/salida de audio no pueden establecerse en un valor común. Por favor, selecciona otros dispositivos de entrada/salida de audio en la configuración del sistema. + + + + The audio driver could not be initialized. + No se pudo iniciar el driver de audio. + + + + The audio device does not support the required sample rate. The required sample rate is: + El dispositivo de audio no soporta la tasa de muestreo requerida. La tasa de muestreo requerida es de: + + + + The audio device does not support to set the required sampling rate. This error can happen if you have an audio interface like the Roland UA-25EX where you set the sample rate with a hardware switch on the audio device. If this is the case, please change the sample rate to + El dispositivo de audio no permite establecer la tasa de muestreo requerida. Este error puede suceder si tienes un dispositivo de audio como el Roland UA-25EX en el que se configura mediante un interruptor físico en el dispositivo. Si es este el caso, por favor cambia la tasa de muestreo a + + + + Hz on the device and restart the + Hz en el dispositivo y reinicie el software + + + + software. + . + + + + The audio device does not support the required number of channels. The required number of channels for input and output is: + El dispositivo de audio no soporta el número de canales requerido. El número de canales requerido es de: + + + + + Required audio sample format not available. + Formato de muestras de audio requerido no disponible. + + + + No ASIO audio device (driver) found. + No se ha encontrado un dispositivo ASIO (driver). + + + + The + El software + + + + 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. + requiere la interfaz de audio de baja latencia ASIO para funcionar correctamente. No es una interfaz estándar de Windows y por tanto se requiere un driver de audio especial. Tu tarjeta de audio podría tener un driver ASIO nativo (lo recomendado) o quizá quieras probar un driver alternativo como ASIO4All. + + + + Error closing stream: $s + Error cerrando transmisión: $s + + + + CSoundBase + + + Invalid device selection. + Selección de dispositivo no válida. + + + + The audio driver properties have changed to a state which is incompatible to this software. The selected audio device could not be used because of the following error: + Las propiedades del driver de audio han cambiado a un estado que es incompatible con este software. El dispositivo de audio seleccionado no se pudo utilizar a causa del siguiente error: + + + + Please restart the software. + Por favor reinicie el software. + + + + Close + Cerrar + + + + No usable + Ningún driver + + + + audio device (driver) found. + de audio utilizable encontrado. + + + + In the following there is a list of all available drivers with the associated error message: + A continuación hay una lista de todos los drivers disponibles con el error asociado: + + + + Do you want to open the ASIO driver setups? + ¿Quieres abrir la configuración del driver ASIO? + + + + could not be started because of audio interface issues. + no pudo arrancar debido a problemas con el dispositivo de audio. + + + diff --git a/src/res/translation/translation_fr_FR.qm b/src/res/translation/translation_fr_FR.qm new file mode 100644 index 00000000..8d5adb43 Binary files /dev/null and b/src/res/translation/translation_fr_FR.qm differ diff --git a/src/res/translation/translation_fr_FR.ts b/src/res/translation/translation_fr_FR.ts new file mode 100644 index 00000000..084b6ad9 --- /dev/null +++ b/src/res/translation/translation_fr_FR.ts @@ -0,0 +1,2346 @@ + + + + + CAboutDlg + + + The + Le logiciel + + + software enables musicians to perform real-time jam sessions over the internet. There is a + permet aux musiciens de faire des bœufs en temps réel sur internet. Il existe un + + + + software enables musicians to perform real-time jam sessions over the internet. + permet aux musiciens de faire des bœufs en temps réel sur internet. + + + + server which collects the audio data from each + qui collecte les données audio de chaque client + + + + There is a + Il existe un serveur + + + + client, mixes the audio data and sends the mix back to each client. + , mixe les données audio et renvoie le mixage à chaque client. + + + + uses the following libraries, resources or code snippets: + utilise les bibliothèques, ressources ou extraits de code suivants : + + + + Qt cross-platform application framework + Cadriciel d'application multiplateforme Qt + + + + Audio reverberation code by Perry R. Cook and Gary P. Scavone + Code de réverbération audio par Perry R. Cook et Gary P. Scavone + + + + Some pixmaps are from the + Certaines images sont issues de + + + + Country flag icons from Mark James + Icônes de drapeaux de pays par Mark James + + + + For details on the contributions check out the + Pour plus de détails sur les contributions, consultez la + + + + Github Contributors list + liste de contributeurs sur github + + + + About + À propos + + + + , Version + , version + + + + Internet Jam Session Software + Logiciels de bœuf sur Internet + + + + Under the GNU General Public License (GPL) + Sous la licence public général GNU (GPL) + + + + CAboutDlgBase + + + About + À propos + + + + TextLabelVersion + + + + + Copyright (C) 2005-2020 Volker Fischer and others + Copyright (C) 2005-2020 Volker Fischer et autres + + + + A&bout + À &propos + + + + &Libraries + Bib&liothèques + + + + &Contributors + &Contributeurs + + + + &Translation + &Traduction + + + Author: Volker Fischer + Auteur : Volker Fisher + + + Copyright (C) 2005-2020 + Copyright (C) 2005-2020 + + + + &OK + &OK + + + + CAnalyzerConsole + + + Analyzer Console + Console d'analyse + + + + Error Rate of Each Buffer Size + Taux d'erreur de chaque taille de tampon + + + + CAudioMixerBoard + + + Server + Serveur + + + + T R Y I N G T O C O N N E C T + T E N T A T I V E D E C O N N E X I O N + + + + CChannelFader + + + Channel Level + Niveau de canal + + + + Displays the pre-fader audio level of this channel. All connected clients at the server will be assigned an audio level, the same value for each client. + Affiche le niveau audio pré-fader de ce canal. Tous les clients connectés au serveur se verront attribuer un niveau audio, la même valeur pour chaque client. + + + + Input level of the current audio channel at the server + Niveau d'entrée du canal audio actuel sur le serveur + + + + Mixer Fader + Charriot du mixeur + + + + Adjusts the audio level of this channel. All connected clients at the server will be assigned an audio fader at each client, adjusting the local mix. + Règle le niveau audio de ce canal. Tous les clients connectés au serveur se verront attribuer un charriot audio à chaque client, ce qui permettra d'ajuster le mixage local. + + + + Local mix level setting of the current audio channel at the server + Réglage du niveau de mixage local du canal audio actuel sur le serveur + + + + With the Mute checkbox, the audio channel can be muted. + En cochant la case Muet, le canal audio peut être mis en sourdine. + + + + Mute button + Bouton de sourdine + + + + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except of the current channel are muted. It is possible to set more than one channel to solo. + En cochant la case Solo, le canal audio peut être réglé sur solo, ce qui signifie que tous les autres canaux, à l'exception du canal actuel, sont mis en sourdine. Il est possible de mettre plus d'un canal en solo. + + + + Solo button + Bouton de solo + + + + Fader Tag + Étiquette de charriot + + + + The fader tag identifies the connected client. The tag name, the picture of your instrument and a flag of your country can be set in the main window. + L'étiquette de charriot identifie le client connecté. Le nom du tag, la photo de votre instrument et un drapeau de votre pays peuvent être définis dans la fenêtre principale. + + + + Mixer channel instrument picture + + + + + Mixer channel label (fader tag) + + + + + Mixer channel country flag + + + + + MUTE + MUET + + + + SOLO + SOLO + + + + Alias/Name + Pseudo/nom + + + + Instrument + Instrument + + + + Location + Localisation + + + + + + Skill Level + Niveau de compétence + + + + Beginner + Débutant + + + + Intermediate + Intermédiaire + + + + Expert + Expert + + + + Musician Profile + Profil de musicien + + + + + + Mute + Muet + + + + + + Solo + Solo + + + + CChatDlg + + + Chat Window + + + + + The chat window shows a history of all chat messages. + + + + + Chat history + + + + + Input Message Text + + + + + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. + + + + + New chat text edit box + + + + + CChatDlgBase + + + Chat + Tchate + + + + Cl&ear + N&ettoyer + + + + &Close + &Fermer + + + + CClientDlg + + + Input Level Meter + Indicateur de niveau d'entrée + + + + The input level indicators show the input level of the two stereo channels of the current selected audio input. + Les indicateurs de niveau d'entrée indiquent le niveau d'entrée des deux canaux stéréo de l'entrée audio actuellement sélectionnée. + + + + Make sure not to clip the input signal to avoid distortions of the audio signal. + Veillez à ne pas clipper le signal d'entrée afin d'éviter les distorsions du signal audio. + + + + If the + + + + + software, you should not hear your singing/instrument in the loudspeaker or your headphone when the + + + + + software is connected and you play your instrument/sing in the microphone, the LED level meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. line in instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. + + + + + For a proper usage of the + + + + + software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). + + + + + Input level meter + + + + + Simulates an analog LED level meter. + + + + + Connect/Disconnect Button + Bouton connecter/déconnecter + + + + Push this button to connect a server. A dialog where you can select a server will open. If you are connected, pressing this button will end the session. + Appuyez sur ce bouton pour vous connecter à un serveur. Une boîte de dialogue vous permettant de sélectionner un serveur s'ouvrira. Si vous êtes connecté, l'appui sur ce bouton mettra fin à la session. + + + + Connect and disconnect toggle button + Bouton-bascule de connection/déconnexion + + + + Clicking on this button changes the caption of the button from Connect to Disconnect, i.e., it implements a toggle functionality for connecting and disconnecting the + En cliquant sur ce bouton, la légende du bouton passe de Connecter à Déconnecter, c'est-à-dire qu'il met en œuvre une fonctionnalité de basculement pour connecter et déconnecter le logiciel + + + + + software. + . + + + + Local Audio Input Fader + Chariot d'entrée audio locale + + + + Local audio input fader (left/right) + Chariot d'entrée audio locale (gauche/droite) + + + + Reverberation effect level setting + + + + + Left channel selection for reverberation + + + + + Right channel selection for reverberation + + + + + If this LED indicator turns red, you will not have much fun using the + Si ce voyant devient rouge, vous n'aurez pas beaucoup de plaisir à utiliser le logiciel + + + + Delay status LED indicator + + + + + Buffers status LED indicator + + + + + + C&onnect + Se c&onnecter + + + + &View + &Vue + + + + &Connection Setup... + Paramètres de &connexion... + + + + My &Profile... + Mon &profil + + + + C&hat... + Tc&hate... + + + + &Settings... + Paramètre&s... + + + + &Analyzer Console... + Console d'&analyse + + + + E&xit + &Quitter + + + + None + Aucun + + + + Center + Centre + + + + R + D + + + + + L + G + + + + With the audio fader, the relative levels of the left and right local audio channels can be changed. For a mono signal it acts like a panning between the two channels. If, e.g., a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows + Avec le chariot audio, les niveaux relatifs des canaux audio locaux gauche et droit peuvent être modifiés. Pour un signal mono, il agit comme un panoramique entre les deux canaux. Si, par exemple, un microphone est connecté au canal d'entrée droit et qu'un instrument est connecté au canal d'entrée gauche qui est beaucoup plus fort que le microphone, déplacez le fader audio dans une direction où l'étiquette au-dessus du chariot indique + + + + , where + , où + + + + is the current attenuation indicator. + est l'indicateur d'atténuation actuel. + + + + Reverberation Level + Niveau de réverbération + + + + 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. + Un effet de réverbération peut être appliqué à un canal audio mono local ou aux deux canaux en mode stéréo. La sélection du canal mono et le niveau de réverbération peuvent être modifiés. Si, par exemple, le signal du microphone est envoyé dans le canal audio droit de la carte son et qu'un effet de réverbération doit être appliqué, réglez le sélecteur de canal à droite et déplacez le curseur vers le haut jusqu'à ce que le niveau de réverbération souhaité soit atteint. + + + + The reverberation effect requires significant CPU so that it should only be used on fast PCs. If the reverberation level fader is set to minimum (which is the default setting), the reverberation effect is switched off and does not cause any additional CPU usage. + L'effet de réverbération nécessite un processeur important, de sorte qu'il ne doit être utilisé que sur des PC rapides. Si le chariot de niveau de réverbération est réglé au minimum (qui est le réglage par défaut), l'effet de réverbération est désactivé et n'entraîne aucune utilisation supplémentaire du processeur. + + + + Reverberation Channel Selection + Sélection de canal de réverbération + + + + With these radio buttons the audio input channel on which the reverberation effect is applied can be chosen. Either the left or right input channel can be selected. + Ces boutons radio permettent de choisir le canal d'entrée audio sur lequel l'effet de réverbération est appliqué. Il est possible de sélectionner le canal d'entrée gauche ou droit. + + + + Delay Status LED + Voyant d'état de délai + + + + The delay status LED indicator shows the current audio delay status. If the light is green, the delay is perfect for a jam session. If the light is yellow, a session is still possible but it may be harder to play. If the light is red, the delay is too large for jamming. + Le voyant d'état de délai indique l'état actuel du délai audio. Si le voyant est vert, le délai est parfait pour une session de bœuf. Si le voyant est jaune, une session est toujours possible mais elle peut être plus difficile à jouer. Si le voyant est rouge, le délai est trop important pour un bœuf. + + + + Buffers Status LED + Voyant d'état de tampon + + + + The buffers status LED indicator shows the current audio/streaming status. If the light is green, there are no buffer overruns/underruns and the audio stream is not interrupted. If the light is red, the audio stream is interrupted caused by one of the following problems: + Le voyant d'état des tampons indique l'état actuel de l'audio/du streaming. Si le voyant est vert, il n'y a pas de dépassement de mémoire tampon ni de sous-dépassement et le flux audio n'est pas interrompu. Si le voyant est rouge, le flux audio est interrompu en raison de l'un des problèmes suivants : + + + + The network jitter buffer is not large enough for the current network/audio interface jitter. + Le tampon de jitter réseau n'est pas assez grand pour le jitter actuel de l'interface réseau/audio. + + + + The sound card buffer delay (buffer size) is set to a too small value. + Le délai du tampon de la carte son (taille du tampon) est réglé sur une valeur trop faible. + + + + The upload or download stream rate is too high for the current available internet bandwidth. + Le taux de flux montant ou descendant est trop élevé pour la bande passante Internet actuellement disponible. + + + + The CPU of the client or server is at 100%. + Le processeur du client ou du serveur est à 100%. + + + + user + utilisateur + + + + users + utilisateurs + + + + D&isconnect + Dé&connecter + + + + CClientDlgBase + + + Delay + Délai + + + + Buffers + Tampons + + + + Input + Entrée + + + + L + G + + + + R + D + + + + Settings + Paramètres + + + + Chat + Tchate + + + + Mute Myself + Me silencer + + + + C&onnect + Se c&onnecter + + + + Pan + Pan + + + + Center + Centre + + + + Reverb + Réverb + + + + Left + Gauche + + + + Right + Droite + + + + CClientSettingsDlg + + + Jitter Buffer Size + Taille du tampon de gigue + + + + The jitter buffer compensates for network and sound card timing jitters. The size of this jitter buffer has therefore influence on the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). + Le tampon de gigue compense les gigues de synchronisation du réseau et de l'interface audio. La taille de ce tampon de gigue a donc une influence sur la qualité du flux audio (combien de décrochages se produisent) et le délai global (plus le tampon est long, plus le délai est important). + + + + The jitter buffer size can be manually chosen for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light on the bottom of the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun took place and the audio stream is interrupted. + La taille du tampon de gigue peut être choisie manuellement pour le client local et le serveur distant. Pour le tampon de gigue local, les désynchronisations dans le flux audio sont indiquées par le voyant situé en bas des chariots de taille du tampon de gigue. Si le voyant devient rouge, un dépassement de la taille de la mémoire tampon a eu lieu et le flux audio est interrompu. + + + + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. + Le réglage du tampon de gigue est donc un compromis entre la qualité audio et le délai global. + + + + An auto setting of the jitter buffer size setting is available. If the check Auto is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If the Auto check is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). + Un réglage automatique de la taille du tampon de gigue est disponible. Si la case Auto est activée, les tampons de gigue du client local et du serveur distant sont réglés automatiquement en fonction des mesures de la gigue de synchronisation du réseau et de la carte son. Si la case Auto est activée, les chariots de la taille du tampon de gigue sont désactivés (ils ne peuvent pas être déplacés avec la souris). + + + + In case the auto setting of the jitter buffer is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the auto setting functionality and to lower the jitter buffer size manually by using the sliders until your personal acceptable limit of the amount of dropouts is reached. The LED indicator will visualize the audio dropouts of the local jitter buffer by a red light. + + + + + Local jitter buffer slider control + + + + + Server jitter buffer slider control + + + + + Auto jitter buffer switch + + + + + Jitter buffer status LED indicator + + + + + Sound Card Device + + + + + The ASIO driver (sound card) can be selected using + + + + + under the Windows operating system. Under MacOS/Linux, no sound card selection is possible. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. + + + + + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. + + + + + Sound card device selector combo box + + + + + In case the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. + + + + + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. + + + + + Sound Card Channel Mapping + + + + + In case the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. + + + + + For each + + + + + input/output channel (Left and Right channel) a different actual sound card channel can be selected. + + + + + Left input channel selection combo box + + + + + Right input channel selection combo box + + + + + Left output channel selection combo box + + + + + Right output channel selection combo box + + + + + Enable Small Network Buffers + Activer les petits tampons de réseau + + + + If enabled, the support for very small network audio packets is activated. Very small network packets are only actually used if the sound card buffer delay is smaller than + Si activée, la prise en charge des très petits paquets audio de réseau est activée. Les très petits paquets réseau ne sont réellement utilisés que si le délai de la mémoire tampon de la carte son est inférieur à + + + + samples. The smaller the network buffers, the smaller the audio latency. But at the same time the network load increases and the probability of audio dropouts also increases. + échantillons. Plus la mémoire tampon du réseau est petite, plus la latence audio est faible. Mais en même temps, la charge du réseau augmente et la probabilité de décrochage audio augmente également. + + + + Enable small network buffers check box + Cochez la case Activer les petits tampons de réseau + + + + Sound Card Buffer Delay + Délai de temporisation de l'interface audio + + + + The buffer delay setting is a fundamental setting of the + Le paramètre de délai de temporisation est un paramètre fondamental du logiciel + + + + software. This setting has influence on many connection properties. + . Ce paramètre influence de nombreuses propriétés de connexion. + + + + Three buffer sizes are supported + Trois tailles de tampon sont prises en charge + + + + 64 samples: This is the preferred setting since it gives lowest latency but does not work with all sound cards. + 64 échantillons : c'est le réglage préféré car il donne la latence la plus faible mais ne fonctionne pas avec toutes les interfaces audio. + + + + 128 samples: This setting should work on most of the available sound cards. + 128 échantillons : ce réglage devrait fonctionner sur la plupart des interfaces audio disponibles. + + + + 256 samples: This setting should only be used if only a very slow computer or a slow internet connection is available. + 256 échantillons : ce paramètre ne doit être utilisé que si seul un ordinateur très lent ou une connexion internet lente est disponible. + + + + Some sound card driver do not allow the buffer delay to be changed from within the + Certains pilotes d'interface audio ne permettent pas de modifier le délai de la mémoire tampon à partir du logiciel + + + + software. In this case the buffer delay setting is disabled. To change the actual buffer delay, this setting has to be changed in the sound card driver. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + . Dans ce cas, le réglage du délai de mise en mémoire tampon est désactivé. Pour modifier le délai actuel de la mémoire tampon, ce paramètre doit être modifié dans le pilote de l'interface audio. Sous Windows, appuyez sur le bouton ASIO Setup pour ouvrir le panneau des paramètres du pilote. Sous Linux, utilisez l'outil de configuration Jack pour modifier la taille de la mémoire tampon. + + + + If no buffer size is selected and all settings are disabled, an unsupported buffer size is used by the driver. The + Si aucune taille de tampon n'est sélectionnée et que tous les paramètres sont désactivés, une taille de tampon non prise en charge est utilisée par le pilote. Le logiciel + + + + software will still work with this setting but with restricted performance. + continuera toujours de fonctionner avec ce réglage, mais avec des performances limitées. + + + + 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 outs) and the higher the upload rate and the lower the overall delay. + Le délai actuel de la mémoire tampon a une influence sur l'état de la connexion, le taux de téléchargement actuel et le délai global. Plus la taille de la mémoire tampon est faible, plus la probabilité d'un voyant rouge dans l'indicateur d'état (désynchronisations) est élevée, plus le taux de téléchargement est élevé et plus le délai global est faible. + + + + The buffer setting is therefore a trade-off between audio quality and overall delay. + Le réglage de la mémoire tampon est donc un compromis entre la qualité audio et le délai global. + + + + If the buffer delay settings are disabled, it is prohibited by the audio driver to modify this setting from within the + + + + + software. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + + + + + 128 samples setting radio button + + + + + 256 samples setting radio button + + + + + 512 samples setting radio button + + + + + ASIO setup push button + + + + + Fancy Skin + Habillage fantaisie + + + + If enabled, a fancy skin will be applied to the main window. + Si activée, un habillage fantaisie sera appliqué à la fenêtre principale. + + + + Fancy skin check box + Cocher la case Habillage fantaisie + + + + Display Channel Levels + Afficher les niveaux des canaux + + + + If enabled, each client channel will display a pre-fader level bar. + Si activée, chaque canal de client affichera une barre de niveau pré-fader. + + + + Display channel levels check box + Cocher la case Afficher les niveaux des canaux + + + + Audio Channels + Canaux audio + + + + Select the number of audio channels to be used. There are three modes available. The mono and stereo modes use one and two audio channels respectively. In the mono-in/stereo-out mode the audio signal which is sent to the server is mono but the return signal is stereo. This is useful for the case that the sound card puts the instrument on one input channel and the microphone on the other channel. In that case the two input signals can be mixed to one mono channel but the server mix can be heard in stereo. + Sélectionnez le nombre de canaux audio à utiliser. Trois modes sont disponibles. Les modes mono et stéréo utilisent respectivement un et deux canaux audio. Dans le mode mono-in/stereo-out, le signal audio qui est envoyé au serveur est mono mais le signal de retour est stéréo. Ceci est utile dans le cas où l'interface audio place l'instrument sur un canal d'entrée et le microphone sur l'autre canal. Dans ce cas, les deux signaux d'entrée peuvent être mélangés dans un canal mono mais le mixage du serveur peut être entendu en stéréo. + + + + Enabling the stereo streaming mode will increase the stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + L'activation du mode de streaming stéréo augmentera le débit de données du flux. Assurez-vous que le débit montant actuel ne dépasse pas la bande passante disponible de votre connexion internet. + + + + In case of the stereo streaming mode, no audio channel selection for the reverberation effect will be available on the main window since the effect is applied on both channels in this case. + Dans le cas du mode de streaming stéréo, aucune sélection de canal audio pour l'effet de réverbération ne sera disponible dans la fenêtre principale puisque l'effet est appliqué sur les deux canaux dans ce cas. + + + + Audio channels combo box + + + + + Audio Quality + Qualité audio + + + + Select the desired audio quality. A low, normal or high audio quality can be selected. The higher the audio quality, the higher the audio stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Sélectionnez la qualité audio souhaitée. Une qualité audio faible, normale ou élevée peut être sélectionnée. Plus la qualité audio est élevée, plus le débit de données du flux audio est élevé. Assurez-vous que le débit montant actuel ne dépasse pas la bande passante disponible de votre connexion internet. + + + + Audio quality combo box + + + + + New Client Level + Niveau de nouveau client + + + + The new client level setting defines the fader level of a new connected client in percent. I.e. if a new client connects to the current server, it will get the specified initial fader level if no other fader level of a previous connection of that client was already stored. + Le paramètre de niveau de nouveau client définit le niveau de chariot d'un client nouvellement connecté en pourcentage. C'est-à-dire que si un nouveau client se connecte au serveur actuel, il aura le niveau de chariot initial spécifié si aucun autre niveau de chariot d'une connexion précédente de ce client n'était déjà stocké. + + + + New client level edit box + + + + + Central Server Address + Adresse du serveur central + + + + The central server address is the IP address or URL of the central server at which the server list of the connection dialog is managed. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + L'adresse du serveur central est l'adresse IP ou l'URL du serveur central sur lequel la liste des serveurs du dialogue de connexion est gérée. Avec le type d'adresse du serveur central, on peut soit sélectionner la région de localisation parmi les serveurs centraux par défaut, soit spécifier une adresse manuelle. + + + + Default central server type combo box + + + + + Central server address line edit + + + + + Current Connection Status Parameter + Paramètre de l'état de la connexion actuelle + + + + The ping time is the time required for the audio stream to travel from the client to the server and backwards. This delay is introduced by the network. This delay should be as low as 20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to the server is too large or your internet connection is not sufficient. + Le temps de ping est le temps nécessaire pour que le flux audio voyage du client au serveur et vice-versa. Ce délai est introduit par le réseau. Ce délai doit être de 20 ou 30 ms. Si ce délai est supérieur (par exemple 50-60 ms), la distance qui vous sépare du serveur est trop importante ou votre connexion internet n'est pas suffisante. + + + + The overall delay is calculated from the current ping time and the delay which is introduced by the current buffer settings. + Le délai global est calculé à partir du temps de ping actuel et du délai qui est introduit par les paramètres actuels de la mémoire tampon. + + + + The upstream rate depends on the current audio packet size and the audio compression setting. Make sure that the upstream rate is not higher than the available rate (check the upstream capabilities of your internet connection by, e.g., using speedtest.net). + Le débit montant dépend de la taille actuelle du paquet audio et du réglage de la compression audio. Assurez-vous que le débit montant n'est pas supérieur au débit disponible (vérifiez les capacités montant de votre connexion internet en utilisant, par exemple, speedtest.net). + + + + If this LED indicator turns red, you will not have much fun using the + Si ce voyant devient rouge, vous n'aurez pas beaucoup de plaisir à utiliser le logiciel + + + + software. + . + + + + ASIO Setup + + + + + Mono + + + + + Mono-in/Stereo-out + + + + + Stereo + + + + + Low + + + + + Normal + + + + + High + + + + + Manual + + + + + Default + + + + + Default (North America) + + + + + preferred + + + + + + Size: + Taille : + + + + Buffer Delay + Délai de temporisation + + + + Buffer Delay: + + + + + The selected audio device could not be used because of the following error: + + + + + The previous driver will be selected. + + + + + Ok + Ok + + + + CClientSettingsDlgBase + + + Settings + Paramètres + + + + Soundcard + Interface audio + + + + Device + Périphérique + + + + Input Channel Mapping + Cartographie des canaux d'entrée + + + + + L + G + + + + + R + D + + + + Output Channel Mapping + Cartographie des canaux de sortie + + + + Enable Small Network Buffers + Activer les petits tampons de réseau + + + + Buffer Delay + Délai de temporisation + + + + (preferred) + (préféré) + + + + (default) + (défaut) + + + + (safe) + (sûr) + + + + Driver Setup + Configuration du pilote + + + + Jitter Buffer + Tampon de gigue + + + + Auto + Auto + + + + Local + Local + + + + Server + Serveur + + + + + Size + Taille + + + + Misc + Divers + + + + Audio Channels + Canaux audio + + + + Audio Quality + Qualité audio + + + + New Client Level + Niveau de nouveau client + + + + % + % + + + + Fancy Skin + Habillage fantaisie + + + + Display Channel Levels + Afficher les niveaux des canaux + + + + Central Server Address: + Adresse du serveur central : + + + + Audio Stream Rate + Débit du flux audio + + + + + + val + val + + + + Ping Time + Temps de réponse + + + + Overall Delay + Délai global + + + + CConnectDlg + + + Server List + Liste de serveurs + + + + The server list shows a list of available servers which are registered at the central server. Select a server from the list and press the connect button to connect to this server. Alternatively, double click a server from the list to connect to it. If a server is occupied, a list of the connected musicians is available by expanding the list item. Permanent servers are shown in bold font. + La liste de serveurs affiche une liste des serveurs disponibles qui sont enregistrés sur le serveur central. Sélectionnez un serveur dans la liste et appuyez sur le bouton de connexion pour vous connecter à ce serveur. Vous pouvez également double-cliquer sur un serveur de la liste pour vous y connecter. Si un serveur est occupé, une liste des musiciens connectés est disponible en développant l'élément de la liste. Les serveurs permanents sont indiqués en caractères gras. + + + + Note that it may take some time to retrieve the server list from the central server. If no valid central server address is specified in the settings, no server list will be available. + Notez que ça peut prendre un certain temps pour récupérer la liste des serveurs depuis le serveur central. Si aucune adresse de serveur central valide n'est spécifiée dans les paramètres, aucune liste de serveurs ne sera disponible. + + + + Server list view + Vue de la liste de serveurs + + + + Server Address + Adresse du serveur + + + + The IP address or URL of the server running the + L'adresse IP ou l'URL du serveur qui exécute le logiciel serveur + + + + 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: + doit être paramétré ici. Un numéro optionnel de port peut être ajouté après l'adresse IP ou l'URL en utilisant deux points en tant que séparateur, par exemple, exemple.org : + + + + . A list of the most recent used server IP addresses or URLs is available for selection. + Une liste des adresses IP ou URL de serveur les plus récentes est disponible pour la sélection. + + + + Server address edit box + Boîte d'édition de l'adresse du serveur + + + + Holds the current server IP address or URL. It also stores old URLs in the combo box list. + + + + + Filter + Filtre + + + + The server list is filered by the given text. Note that the filter is case insensitive. + + + + + Filter edit box + + + + + Show All Musicians + Afficher tous les musiciens + + + + If you check this check box, the musicians of all servers are shown. If you uncheck the check box, all list view items are collapsed. + Si vous cochez cette case, les musiciens de tous les serveurs sont affichés. Si vous décochez la case, tous les éléments de la vue en liste sont regroupés. + + + + Show all musicians check box + Cochez la case Afficher tous les musiciens + + + + CConnectDlgBase + + + Connection Setup + Paramètres de connexion + + + + Filter + Filtre + + + + Show All Musicians + Afficher tous les musiciens + + + + Server Name + Nom du serveur + + + + Ping Time + Temps de réponse + + + + Musicians + Musiciens + + + + Location + Localisation + + + + Server Name/Address + Nom du serveur / adresse + + + + C&ancel + &Annuler + + + + &Connect + Se &connecter + + + + CHelpMenu + + + &Help + &Aide + + + + + Getting &Started... + Premier pa&s... + + + + Software &Manual... + &Manuel du logiciel... + + + + What's &This + C'es&t quoi ça + + + + &About... + À &propos + + + + CLicenceDlg + + + I &agree to the above licence terms + J'&accepte les conditions de licence ci-dessus + + + + Accept + Accepter + + + + Decline + Décliner + + + + By connecting to this server and agreeing to this notice, you agree to the following: + En vous connectant à ce serveur et en acceptant le présent avis, vous acceptez ce qui suit : + + + + 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 + Vous acceptez que toutes les données, sons ou autres œuvres transmises à ce serveur soient détenus et créés par vous ou vos ayant-droits, et que vous rendiez ces données, sons ou autres œuvres disponibles via la licence Creative Commons suivante (pour plus d'informations sur cette licence, voir + + + + You are free to: + Vous êtes libres de : + + + + Share + Partager + + + + copy and redistribute the material in any medium or format + copier et redistribuer le matériel sur tout support ou format + + + + Adapt + Adapter + + + + remix, transform, and build upon the material + remixer, transformer et développer à partir du matériel + + + + The licensor cannot revoke these freedoms as long as you follow the license terms. + Le donneur de licence ne peut pas révoquer ces libertés tant que vous respectez les conditions de la licence. + + + + Under the following terms: + Dans les conditions suivantes : + + + + Attribution + Attribution + + + + 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. + Vous devez donner un crédit approprié, fournir un lien vers la licence et indiquer si des modifications ont été apportées. Vous pouvez le faire de toute manière raisonnable, mais pas d'une manière qui suggère que le donneur de licence vous cautionne ou cautionne votre utilisation. + + + + NonCommercial + Non commercial + + + + You may not use the material for commercial purposes. + Vous ne pouvez pas utiliser le matériel à des fins commerciales. + + + + ShareAlike + Partager à l'identique + + + + If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + Si vous remixez, transformez ou développez à partir du matériel, vous devez distribuer vos contributions sous la même licence que l'original. + + + + No additional restrictions + Aucune restriction supplémentaire + + + + You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + Vous ne pouvez pas appliquer des termes juridiques ou des mesures technologiques qui empêchent légalement d'autres personnes de faire ce que la licence autorise. + + + + CMusProfDlg + + + 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. + + + + + Alias or name edit box + + + + + Instrument picture button + Bouton d'image d'instrument + + + + Country flag button + Bouton de drapeau de pays + + + + City edit box + Boîte d'édition de la ville + + + + Skill level combo box + Boîte combo de niveau de compétence + + + + + + None + Aucune + + + + + Musician Profile + Profil de musicien + + + + Alias/Name + Pseudo/nom + + + + Instrument + Instrument + + + + Country + Pays + + + + City + Ville + + + + Skill + Compétence + + + + &Close + &Fermer + + + + Beginner + Débutant + + + + Intermediate + Intermédiaire + + + + Expert + Expert + + + + 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. + + + + + What you set here will appear at your fader on the mixer board when you are connected to a + + + + + Drum Set + Batterie + + + + Djembe + Djembé + + + + Electric Guitar + Guitare électrique + + + + Acoustic Guitar + Guitare accoustique + + + + Bass Guitar + Guitare basse + + + + Keyboard + Clavier + + + + Synthesizer + Synthétiseur + + + + Grand Piano + Piano à queue + + + + Accordion + Accordéon + + + + Vocal + Voix + + + + Microphone + Microphone + + + + Harmonica + Harmonica + + + + Trumpet + Trompette + + + + Trombone + Trombone + + + + French Horn + Cor d'harmonie + + + + Tuba + Tuba + + + + Saxophone + Saxophone + + + + Clarinet + Clarinette + + + + Flute + Flute + + + + Violin + Violon + + + + Cello + Violoncelle + + + + Double Bass + Contrebasse + + + + Recorder + Enregistreur + + + + Streamer + Diffuseur + + + + Listener + Auditeur + + + + Guitar+Vocal + Guitare+voix + + + + Keyboard+Vocal + Clavier+voix + + + + Bodhran + Bodhran + + + + Bassoon + Basson + + + + Oboe + Hautbois + + + + Harp + Harpe + + + + Viola + Alto + + + + Congas + Congas + + + + Bongo + Bongo + + + + CServerDlg + + + Client List + + + + + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. + + + + + Connected clients list view + + + + + Start Minimized on Operating System Start + + + + + If the start minimized on operating system start check box is checked, the + + + + + server will be started when the operating system starts up and is automatically minimized to a system task bar icon. + + + + + Show Creative Commons Licence Dialog + + + + + If enabled, a Creative Commons BY-NC-SA 4.0 Licence dialog is shown each time a new user connects the server. + + + + + Make My Server Public + + + + + If the Make My Server Public check box is checked, this server registers itself at the central server so that all + + + + + users can see the server in the connect dialog server list and connect to it. The registering of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. + + + + + Register Server Status + + + + + If the Make My Server Public check box is checked, this will show the success of registration with the central server. + + + + + Central Server Address + + + + + The Central server address is the IP address or URL of the central server at which this server is registered. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + + + + + Default central server type combo box + + + + + Central server address line edit + + + + + Server Name + Nom du serveur + + + + The server name identifies your server in the connect dialog server list at the clients. If no name is given, the IP address is shown instead. + + + + + Server name line edit + + + + + Location City + + + + + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. + + + + + City where the server is located line edit + + + + + Location country + + + + + The country in which this server is located can be set here. If a country is entered, it will be shown in the connect dialog server list at the clients. + + + + + Country where the server is located combo box + + + + + + E&xit + &Quitter + + + + &Hide + + + + + + + server + + + + + &Open + + + + + server + + + + + Manual + + + + + Default + + + + + Default (North America) + + + + + Server + + + + + &Window + + + + + Unregistered + + + + + Bad address + + + + + Registration requested + + + + + Registration failed + + + + + Check server version + + + + + Registered + + + + + Central Server full + + + + + Unknown value + + + + + CServerDlgBase + + + Client IP:Port + + + + + + Name + + + + + Jitter Buffer Size + Taille du tampon de gigue + + + + Start Minimized on Windows Start + + + + + Show Creative Commons BY-NC-SA 4.0 Licence Dialog + + + + + Make My Server Public (Register My Server in the Server List) + + + + + STATUS + + + + + Central Server Address: + Adresse du serveur central : + + + + My Server Info + + + + + Location: City + + + + + Location: Country + + + + + TextLabelNameVersion + + + + + CSound + + + The Jack server is not running. This software requires a Jack server to run. Normally if the Jack server is not running this software will automatically start the Jack server. It seems that this auto start has not worked. Try to start the Jack server manually. + + + + + The Jack server sample rate is different from the required one. The required sample rate is: + + + + + You can use a tool like <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> to adjust the Jack server sample rate. + + + + + Make sure to set the Frames/Period to a low value like + + + + + to achieve a low delay. + + + + + + The Jack port registering failed. + + + + + Cannot activate the Jack client. + + + + + The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue. + + + + + CoreAudio input AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + + + + + CoreAudio output AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + + + + + Current system audio input device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + + + + + Current system audio output device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + + + + + The audio input stream format for this audio device is not compatible with this software. + + + + + The audio output stream format for this audio device is not compatible with this software. + + + + + The buffer sizes of the current input and output audio device cannot be set to a common value. Please choose other input/output audio devices in your system settings. + + + + + The audio driver could not be initialized. + + + + + The audio device does not support the required sample rate. The required sample rate is: + + + + + The audio device does not support to set the required sampling rate. This error can happen if you have an audio interface like the Roland UA-25EX where you set the sample rate with a hardware switch on the audio device. If this is the case, please change the sample rate to + + + + + Hz on the device and restart the + + + + + software. + . + + + + The audio device does not support the required number of channels. The required number of channels for input and output is: + + + + + + Required audio sample format not available. + + + + + No ASIO audio device (driver) found. + + + + + The + Le logiciel + + + + 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. + + + + + Error closing stream: $s + + + + + CSoundBase + + + Invalid device selection. + + + + + The audio driver properties have changed to a state which is incompatible to this software. The selected audio device could not be used because of the following error: + + + + + Please restart the software. + + + + + Close + + + + + No usable + + + + + audio device (driver) found. + + + + + In the following there is a list of all available drivers with the associated error message: + + + + + Do you want to open the ASIO driver setups? + + + + + could not be started because of audio interface issues. + + + + diff --git a/src/res/translation/translation_pt_PT.qm b/src/res/translation/translation_pt_PT.qm new file mode 100644 index 00000000..b6fd9264 Binary files /dev/null and b/src/res/translation/translation_pt_PT.qm differ diff --git a/src/res/translation/translation_pt_PT.ts b/src/res/translation/translation_pt_PT.ts new file mode 100644 index 00000000..a8d45ac7 --- /dev/null +++ b/src/res/translation/translation_pt_PT.ts @@ -0,0 +1,2346 @@ + + + + + CAboutDlg + + + The + O + + + software enables musicians to perform real-time jam sessions over the internet. There is a + permite aos músicos realizar jam sessions em tempo real pela Internet. Existe um servidor + + + + software enables musicians to perform real-time jam sessions over the internet. + + + + + server which collects the audio data from each + que reúne os dados de áudio de cada cliente + + + + There is a + + + + + client, mixes the audio data and sends the mix back to each client. + , que mistura os dados de áudio e envia a mistura de volta para cada cliente. + + + + uses the following libraries, resources or code snippets: + utiliza as seguintes bibliotecas, recursos ou partes de código: + + + + Qt cross-platform application framework + + + + + Audio reverberation code by Perry R. Cook and Gary P. Scavone + + + + + Some pixmaps are from the + + + + + Country flag icons from Mark James + + + + + For details on the contributions check out the + + + + + Github Contributors list + + + + + About + Sobre o + + + + , Version + , Versão + + + + Internet Jam Session Software + Programa de Jam Sessions pela Internet + + + + Under the GNU General Public License (GPL) + Sob a Licença Pública Geral GNU (GPL) + + + + CAboutDlgBase + + + About + Sobre + + + + TextLabelVersion + TextLabelVersion + + + + Copyright (C) 2005-2020 Volker Fischer and others + Copyright (C) 2005-2020 Volker Fischer e outros + + + + A&bout + + + + + &Libraries + + + + + &Contributors + + + + + &Translation + + + + Author: Volker Fischer + Autor: Volker Fischer + + + Copyright (C) 2005-2020 + Copyright (C) 2005-2020 + + + + &OK + &OK + + + + CAnalyzerConsole + + + Analyzer Console + Consola de Análise + + + + Error Rate of Each Buffer Size + Taxa de Erros de Cada Tamanho de Buffer + + + + CAudioMixerBoard + + + Server + Servidor + + + + T R Y I N G T O C O N N E C T + T E N T A N D O L I G A R + + + + CChannelFader + + + Channel Level + Nível do Canal + + + + Displays the pre-fader audio level of this channel. All connected clients at the server will be assigned an audio level, the same value for each client. + Mostra o nível de áudio pré-fader deste canal. Todos os clientes ligados ao servidor terão atribuído um nível de áudio, o mesmo valor para cada cliente. + + + + Input level of the current audio channel at the server + Nível de entrada deste canal de áudio do servidor + + + + Mixer Fader + Fader da Mistura + + + + Adjusts the audio level of this channel. All connected clients at the server will be assigned an audio fader at each client, adjusting the local mix. + Ajusta o nível de áudio deste canal. Por cada cliente ligado ao servidor será atribuído um fader de áudio em todos os clientes, podendo cada um ajustar a sua mistura local. + + + + Local mix level setting of the current audio channel at the server + Configuração do nível de mistura local deste canal de áudio do servidor + + + + With the Mute checkbox, the audio channel can be muted. + Com a caixa de seleção Mute, o canal de áudio pode ser silenciado. + + + + Mute button + Botão Mute + + + + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except of the current channel are muted. It is possible to set more than one channel to solo. + Com a caixa de seleção Solo, o canal de áudio pode ser definido como solo, o que significa que todos os outros canais, exceto o canal atual, serão silenciados. É possível definir mais que um canal no modo solo. + + + + Solo button + Botão Solo + + + + Fader Tag + Identificador do Fader + + + + The fader tag identifies the connected client. The tag name, the picture of your instrument and a flag of your country can be set in the main window. + O Identificador do fader identifica o cliente ligado. O nome no identificador, a imagem do instrumento e a bandeira do país podem ser definidos no Meu Perfil. + + + + Mixer channel instrument picture + Imagem do instrumento do canal da mistura + + + + Mixer channel label (fader tag) + Identificação do canal da mistura (identificador do fader) + + + + Mixer channel country flag + Bandeira do país do canal da mistura + + + + MUTE + MUTE + + + + SOLO + SOLO + + + + Alias/Name + Nome/Alcunha + + + + Instrument + Instrumento + + + + Location + Localização + + + + + + Skill Level + Nível de Habilidade + + + + Beginner + Principiante + + + + Intermediate + Intermediário + + + + Expert + Avançado + + + + Musician Profile + Perfil do músico + + + + + + Mute + Mute + + + + + + Solo + Solo + + + + CChatDlg + + + Chat Window + Janela de Mensagens + + + + The chat window shows a history of all chat messages. + A janela de mensagens mostra um histórico de todas as mensagens enviadas durante a sessão. + + + + Chat history + Histórico de Mensagens + + + + Input Message Text + Texto da Mensagem + + + + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. + Introduza o texto da mensagem no campo de introdução e pressione Enter para enviar a mensagem ao servidor, que distribui a mensagem a todos os clientes ligados. A sua mensagem será exibida na janela de mensagens. + + + + New chat text edit box + Campo de edição de texto da mensagem + + + + CChatDlgBase + + + Chat + Mensagens + + + + Cl&ear + &Limpar + + + + &Close + &Fechar + + + + CClientDlg + + + Input Level Meter + Medidor do Nível de Entrada + + + + The input level indicators show the input level of the two stereo channels of the current selected audio input. + Os indicadores do nível de entrada mostram o nível dos dois canais stereo da entrada de áudio selecionada. + + + + Make sure not to clip the input signal to avoid distortions of the audio signal. + Certifique-se de não clipar o sinal de entrada para evitar distorções no sinal de áudio. + + + + If the + Se o cliente + + + + software, you should not hear your singing/instrument in the loudspeaker or your headphone when the + , não deve ouvir a sua voz/instrumento diretamente nas colunas ou nos headphones enquanto o cliente + + + + software is connected and you play your instrument/sing in the microphone, the LED level meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. line in instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. + estiver ligado a um servidor e tocar o seu instrumento/cantar no microfone, os LEDs do medidor do nível de entrada devem piscar. Se tal não acontecer, provavelmente selecionou o canal de entrada errado (por exemplo, entrada de linha em vez da entrada do microfone) ou ajustou o ganho da entrada muito baixo no misturador de áudio (Windows) ou na placa de som. + + + + For a proper usage of the + Para um uso adequado do cliente + + + + software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). + não estiver ligado a um servidor. Isso pode ser feito silenciando (mute) o canal da entrada de áudio no dispositivo de reprodução (não no dispositivo de captura!) + + + + Input level meter + Medidor do nível de entrada + + + + Simulates an analog LED level meter. + Simula um medidor de nível analógico LED. + + + + Connect/Disconnect Button + Botão de Ligar/Desligar + + + + Push this button to connect a server. A dialog where you can select a server will open. If you are connected, pressing this button will end the session. + Pressione este botão para se ligar a um servidor. Uma janela será aberta onde pode selecionar um servidor. Se já estiver ligado a um servidor, pressionar este botão encerrará a sessão. + + + + Connect and disconnect toggle button + Botão de alternação entre ligar e desligar + + + + Clicking on this button changes the caption of the button from Connect to Disconnect, i.e., it implements a toggle functionality for connecting and disconnecting the + Clicar nesse botão altera a legenda do botão de Ligar para Desligar, ou seja, implementa uma funcionalidade de alternação para conectar e desconectar o cliente + + + + + software. + . + + + + Local Audio Input Fader + Fader da Entrada Local de Áudio + + + + Local audio input fader (left/right) + Fader de entrada local de áudio (esquerdo/direito) + + + + Reverberation effect level setting + Ajuste do nível do efeito de reverberação + + + + Left channel selection for reverberation + Seleção do canal esquerdo para reverberação + + + + Right channel selection for reverberation + Seleção do canal direito para reverberação + + + + If this LED indicator turns red, you will not have much fun using the + Se este indicador LED ficar vermelho, não se vai divertir muito ao usar o + + + + Delay status LED indicator + Indicador LED do estado de latência + + + + Buffers status LED indicator + Indicador LED do estado dos buffers + + + + + C&onnect + &Ligar + + + + &View + &Ver + + + + &Connection Setup... + &Configuração da ligação ... + + + + My &Profile... + Meu &Perfil... + + + + C&hat... + &Mensagens... + + + + &Settings... + &Definições... + + + + &Analyzer Console... + Consola de &Análise... + + + + E&xit + &Sair + + + + None + Nenhum + + + + Center + Centro + + + + R + R + + + + + L + L + + + + With the audio fader, the relative levels of the left and right local audio channels can be changed. For a mono signal it acts like a panning between the two channels. If, e.g., a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows + Com o fader de áudio, os níveis relativos dos canais locais esquerdo e direito podem ser alterados. Para um sinal mono, atua como uma panorâmica entre os dois canais. Se, por exemplo, um microfone estiver ligado no canal direito e um instrumento estiver ligado no canal esquerdo, mais alto que o microfone, mova o fader de áudio numa direção em que a etiqueta acima do fader mostre + + + + , where + , onde + + + + is the current attenuation indicator. + é o indicador de atenuação atual. + + + + Reverberation Level + Nível de Reverberação + + + + 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. + 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. + + + + The reverberation effect requires significant CPU so that it should only be used on fast PCs. If the reverberation level fader is set to minimum (which is the default setting), the reverberation effect is switched off and does not cause any additional CPU usage. + O efeito de reverberação requer uma utilização do CPU significativa, de forma a que só deve ser usado em PCs rápidos. Se o atenuador do nível de reverberação estiver definido como mínimo (que é a configuração padrão), o efeito de reverberação será desativado e não causará nenhum uso adicional do CPU. + + + + Reverberation Channel Selection + Seleção do Canal de Reverberação + + + + With these radio buttons the audio input channel on which the reverberation effect is applied can be chosen. Either the left or right input channel can be selected. + Com estes botões de seleção, pode ser escolhido o canal de entrada de áudio no qual o efeito de reverberação é aplicado. Pode ser selecionado o canal de entrada esquerdo ou direito. + + + + Delay Status LED + LED do Estado da Latência + + + + The delay status LED indicator shows the current audio delay status. If the light is green, the delay is perfect for a jam session. If the light is yellow, a session is still possible but it may be harder to play. If the light is red, the delay is too large for jamming. + O indicador LED do estado da latência mostra o estado atual do atraso do áudio. Se a luz estiver verde, o atraso é perfeito para uma jam session. Se a luz estiver amarela, uma sessão ainda é possível, mas pode ser mais difícil tocar sincronizado. Se a luz estiver vermelha, o atraso é demasiado grande para uma sessão de jamming. + + + + Buffers Status LED + LED do Estado dos Buffers + + + + The buffers status LED indicator shows the current audio/streaming status. If the light is green, there are no buffer overruns/underruns and the audio stream is not interrupted. If the light is red, the audio stream is interrupted caused by one of the following problems: + O indicador LED do estado dos buffers mostra o estado atual do áudio/transmissão. Se a luz estiver verde, não haverá buffer em excesso/déficit e o fluxo de áudio não será interrompido. Se a luz estiver vermelha, o fluxo de áudio é interrompido devido a um dos seguintes problemas: + + + + The network jitter buffer is not large enough for the current network/audio interface jitter. + O jitter buffer da rede não é grande o suficiente para o jitter atual da interface de rede/áudio. + + + + The sound card buffer delay (buffer size) is set to a too small value. + O atraso do buffer da placa de som (buffer size) está definido para um valor demasiado baixo. + + + + The upload or download stream rate is too high for the current available internet bandwidth. + A taxa de upload ou download é muito alta para a largura de banda disponível na ligação à Internet. + + + + The CPU of the client or server is at 100%. + O CPU do cliente ou servidor está a 100%. + + + + user + utilizador + + + + users + utilizadores + + + + D&isconnect + Desl&igar + + + + CClientDlgBase + + + Delay + Latência + + + + Buffers + Buffers + + + + Input + Entrada + + + + L + L + + + + R + R + + + + Settings + Definições + + + + Chat + Mensagens + + + + Mute Myself + Silenciar-me + + + + C&onnect + &Ligar + + + + Pan + Pan + + + + Center + Centro + + + + Reverb + Reverberação + + + + Left + Esquerdo + + + + Right + Direito + + + + CClientSettingsDlg + + + Jitter Buffer Size + Tamanho do Jitter Buffer + + + + The jitter buffer compensates for network and sound card timing jitters. The size of this jitter buffer has therefore influence on the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). + O jitter buffer (ou buffer de instabilidade) compensa os desvios de temporização da rede e da placa de som. O tamanho desse jitter buffer influencia, portanto, a qualidade do fluxo de áudio (quantas interrupções ocorrem) e a latência geral (quanto maior o buffer, maior a latência). + + + + The jitter buffer size can be manually chosen for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light on the bottom of the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun took place and the audio stream is interrupted. + O tamanho do jitter buffer pode ser escolhido manualmente para o cliente local e o servidor remoto. Para o jitter buffer local, as interrupções no fluxo de áudio são indicadas pela luz na parte inferior dos faders do jitter buffer. Se a luz ficar vermelha, ocorreu um excesso/déficit do buffer e o fluxo de áudio é interrompido. + + + + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. + A configuração do jitter buffer é, portanto, uma troca entre a qualidade do áudio e o atraso geral. + + + + An auto setting of the jitter buffer size setting is available. If the check Auto is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If the Auto check is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). + Está disponível uma configuração automática do tamanho do jitter buffer. Se a opção Auto estiver ativada, os jitter buffers do cliente local e do servidor remoto serão configurados automaticamente com base nas medições da instabilidade de sincronização da rede e da placa de som. Se a opção Auto estiver ativada, os faders do jitter buffer serão desativados (não poderão ser movidos manualmente). + + + + In case the auto setting of the jitter buffer is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the auto setting functionality and to lower the jitter buffer size manually by using the sliders until your personal acceptable limit of the amount of dropouts is reached. The LED indicator will visualize the audio dropouts of the local jitter buffer by a red light. + Caso a configuração automática do jitter buffer estiver ativada, os buffers de rede do cliente local e do servidor remoto são configurados com um valor conservador para minimizar a probabilidade de perda de áudio. Para ajustar o atraso/latência do áudio, é recomendável desativar a funcionalidade de configuração automática e diminuir o tamanho do jitter buffer manualmente usando os controles deslizantes até que a quantidade de perdas de áudio lhe sejam pessoalmente aceitáveis. O indicador LED representará as interrupções de áudio do jitter buffer local através de uma luz vermelha. + + + + Local jitter buffer slider control + Controle deslizante do jitter buffer local + + + + Server jitter buffer slider control + Controle deslizante do jitter buffer do servidor + + + + Auto jitter buffer switch + Interruptor do jitter buffer automático + + + + Jitter buffer status LED indicator + Indicador LED de estado do jitter buffer + + + + Sound Card Device + Dispositivo da Placa de Som + + + + The ASIO driver (sound card) can be selected using + O driver ASIO (placa de som) pode ser selecionado usando o + + + + under the Windows operating system. Under MacOS/Linux, no sound card selection is possible. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. + no Windows. No MacOS/Linux, não é possível seleccionar a placa de som. Se o driver ASIO selecionado não for válido, uma mensagem de erro será exibida e o driver válido anterior será selecionado. + + + + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. + Se o driver for selecionado durante uma ligação ativa, a ligação será interrompida, o driver será alterado e a ligação reiniciada automaticamente. + + + + Sound card device selector combo box + Seletor de dispositivo da placa de som + + + + In case the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. + Caso o driver ASIO4ALL seja usado, note que esse driver geralmente introduz aprox. 10-30 ms de atraso de áudio adicional. Dado isto, é recomendável usar uma placa de som com um driver ASIO nativo. + + + + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. + Se estiver a usar o driver kX ASIO, certifique-se de ligar as entradas ASIO no painel de configurações do kX DSP. + + + + Sound Card Channel Mapping + Mapeamento de Canais da Placa de Som + + + + In case the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. + Caso o dispositivo selecionado da placa de som ofereça mais que um canal de entrada ou saída, as configurações de Mapeamento de canais de entrada e de saída estarão visíveis. + + + + For each + Para cada canal de entrada/saída do + + + + input/output channel (Left and Right channel) a different actual sound card channel can be selected. + (canal esquerdo e direito), um canal real da placa de som pode ser selecionado. + + + + Left input channel selection combo box + Seletor de canal de entrada esquerdo + + + + Right input channel selection combo box + Seletor de canal de entrada direito + + + + Left output channel selection combo box + Seletor de canal de saída esquerdo + + + + Right output channel selection combo box + Seletor de canal de saída direito + + + + Enable Small Network Buffers + Activar Buffers de Rede Pequenos + + + + If enabled, the support for very small network audio packets is activated. Very small network packets are only actually used if the sound card buffer delay is smaller than + Se ativado, o suporte para pacotes de áudio de rede muito pequenos é ativado. Pacotes de rede muito pequenos serão apenas realmente usados se o atraso do buffer da placa de som for menor que + + + + samples. The smaller the network buffers, the smaller the audio latency. But at the same time the network load increases and the probability of audio dropouts also increases. + amostras. Quanto menor o buffer da rede, menor a latência do áudio. Mas, ao mesmo tempo, a carga da rede e a probabilidade de interrupção do áudio também aumentam. + + + + Enable small network buffers check box + Caixa de activação de buffers de rede pequenos + + + + Sound Card Buffer Delay + Atraso do Buffer da Placa de Som + + + + The buffer delay setting is a fundamental setting of the + A configuração do atraso do buffer (buffer delay) é uma configuração fundamental do cliente + + + + software. This setting has influence on many connection properties. + . Esta configuração tem influência em muitas propriedades da ligação. + + + + Three buffer sizes are supported + Três tamanhos de buffer são suportados + + + + 64 samples: This is the preferred setting since it gives lowest latency but does not work with all sound cards. + 64 amostras: esta é a configuração preferida, pois oferece menor latência, mas não funciona com todas as placas de som. + + + + 128 samples: This setting should work on most of the available sound cards. + 128 amostras: esta configuração deve funcionar na maioria das placas de som disponíveis. + + + + 256 samples: This setting should only be used if only a very slow computer or a slow internet connection is available. + 256 amostras: esta configuração deve ser usada se apenas estiver disponível um computador muito lento ou uma ligação lenta à Internet. + + + + Some sound card driver do not allow the buffer delay to be changed from within the + Alguns drivers da placa de som não permitem que o atraso do buffer seja alterado pelo cliente + + + + software. In this case the buffer delay setting is disabled. To change the actual buffer delay, this setting has to be changed in the sound card driver. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + . Nesse caso, a configuração de atraso do buffer estará desativada. Para alterar o atraso do buffer, essa configuração deve ser alterada no driver da placa de som. No Windows, pressione o botão Configuração do Driver para abrir o painel de configurações do driver. No Linux, use a ferramenta de configuração Jack para alterar o atraso do buffer. + + + + If no buffer size is selected and all settings are disabled, an unsupported buffer size is used by the driver. The + Se nenhum atraso do buffer estiver selecionado e todas as configurações estiverem desativadas, um atraso do buffer não suportado será usado pelo driver. O cliente + + + + software will still work with this setting but with restricted performance. + ainda funcionará com essa configuração, mas com desempenho restrito. + + + + 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 outs) and the higher the upload rate and the lower the overall delay. + O atraso do buffer influencia o estado da ligação, a taxa de upload atual e a latência geral. Quanto menor o atraso do buffer, maior a probabilidade de a luz vermelha no indicador de estado (interrupções), maior a taxa de upload e menor a latência geral. + + + + The buffer setting is therefore a trade-off between audio quality and overall delay. + A configuração do buffer é, portanto, uma troca entre qualidade de áudio e latência geral. + + + + If the buffer delay settings are disabled, it is prohibited by the audio driver to modify this setting from within the + Se as configurações de atraso do buffer estiverem desativadas, é porque o driver de áudio proibe modificar essa configuração a partir do cliente + + + + software. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. + . No Windows, pressione o botão <i>Configuração do Driver</i> para abrir o painel de configurações do driver. No Linux, use a ferramenta de configuração <i>Jack</i> para alterar o atraso do buffer. + + + + 128 samples setting radio button + Botão de configuração de 128 amostras + + + + 256 samples setting radio button + Botão de configuração de 256 amostras + + + + 512 samples setting radio button + Botão de configuração de 512 amostras + + + + ASIO setup push button + Botão de configuração do ASIO + + + + Fancy Skin + Skin Sofisticada + + + + If enabled, a fancy skin will be applied to the main window. + Se ativada, uma skin sofisticada será aplicada à janela principal. + + + + Fancy skin check box + Caixa de ativação da skin sofisticada + + + + Display Channel Levels + Mostrar Níveis de Canais + + + + If enabled, each client channel will display a pre-fader level bar. + Se ativado, cada canal de cliente exibirá uma barra de nível pré-fader. + + + + Display channel levels check box + Caixa de activação para exibir níveis de canais + + + + Audio Channels + Canais de Áudio + + + + Select the number of audio channels to be used. There are three modes available. The mono and stereo modes use one and two audio channels respectively. In the mono-in/stereo-out mode the audio signal which is sent to the server is mono but the return signal is stereo. This is useful for the case that the sound card puts the instrument on one input channel and the microphone on the other channel. In that case the two input signals can be mixed to one mono channel but the server mix can be heard in stereo. + Selecione o número de canais de áudio a serem usados. Existem três modos disponíveis. Os modos mono e estéreo usam um e dois canais de áudio, respectivamente. No modo Entrada Mono/Saída Estéreo, o sinal de áudio enviado ao servidor é mono, mas o sinal de retorno é estéreo. Isso é útil quando a placa de som coloca o instrumento e o microfone em canais diferentes. Nesse caso, os dois sinais de entrada podem ser misturados num canal mono, mas a mistura do servidor pode ser ouvida em estéreo. + + + + Enabling the stereo streaming mode will increase the stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Ativar o modo de transmissão estéreo aumenta a taxa do fluxo de dados. Verifique que a taxa de transmissão não excede a largura de banda disponível da sua ligação à Internet. + + + + In case of the stereo streaming mode, no audio channel selection for the reverberation effect will be available on the main window since the effect is applied on both channels in this case. + No modo de transmissão estéreo, nenhuma seleção de canal de áudio para o efeito de reverberação estará disponível na janela principal, pois o efeito é aplicado em ambos os canais. + + + + Audio channels combo box + Seletor de canais áudio + + + + Audio Quality + Qualidade de Áudio + + + + Select the desired audio quality. A low, normal or high audio quality can be selected. The higher the audio quality, the higher the audio stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. + Selecione a qualidade de áudio desejada. Pode ser selecionada uma qualidade de áudio baixa, normal ou alta. Quanto maior a qualidade do áudio, maior a taxa de dados do fluxo de áudio. Verifique que a taxa de transmissão não excede a largura de banda disponível da sua ligação à Internet. + + + + Audio quality combo box + Seletor de qualidade áudio + + + + New Client Level + Nível de Novo Cliente + + + + The new client level setting defines the fader level of a new connected client in percent. I.e. if a new client connects to the current server, it will get the specified initial fader level if no other fader level of a previous connection of that client was already stored. + A configuração de nível de novo cliente define, em percentagem, o nível do fader de um novo cliente ligado. Por exemplo, se um cliente novo se ligar ao servidor atual, o seu canal terá o nível inicial do fader especificado, excepto quando um diferente nível do fader de uma ligação anterior desse mesmo cliente já tenha sido definido. + + + + New client level edit box + Caixa de edição no nível de novo cliente + + + + Central Server Address + Endereço do servidor central + + + + The central server address is the IP address or URL of the central server at which the server list of the connection dialog is managed. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + O endereço do servidor central é o endereço IP ou URL do servidor central a partir do qual é gerida a lista de servidores do diálogo de ligação. Com a configuração do endereço do servidor central, é possível selecionar um dos servidores centrais padrão ou especificar um endereço manual. + + + + Default central server type combo box + Seletor de servidor central padrão + + + + Central server address line edit + Caixa de edição do endereço do servidor central + + + + Current Connection Status Parameter + Parâmetros do Estado da Ligação + + + + The ping time is the time required for the audio stream to travel from the client to the server and backwards. This delay is introduced by the network. This delay should be as low as 20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to the server is too large or your internet connection is not sufficient. + A latência da ligação é o tempo necessário para o fluxo de áudio viajar do cliente para o servidor e vice-versa. Esta latência é introduzida pela rede. Esta latência deve ser tão baixa quanto 20-30 ms. Se esta latência for maior (por exemplo, 50-60 ms), a distância até ao servidor é muito grande ou sua ligação à Internet não é suficiente. + + + + The overall delay is calculated from the current ping time and the delay which is introduced by the current buffer settings. + A latência geral é calculada a partir da latência da ligação atual e do atraso introduzido pelas configurações do buffer. + + + + The upstream rate depends on the current audio packet size and the audio compression setting. Make sure that the upstream rate is not higher than the available rate (check the upstream capabilities of your internet connection by, e.g., using speedtest.net). + A taxa de transmissão depende do tamanho do pacote de áudio e da configuração de compactação de áudio. Verifique se a taxa de transmissão não é maior que a taxa disponível (verifique a taxa de upload da sua ligação à Internet usando, por exemplo, o speedtest.net). + + + + If this LED indicator turns red, you will not have much fun using the + Se este indicador LED ficar vermelho, não se irá divertir muito ao usar o + + + + software. + . + + + + ASIO Setup + Configuração ASIO + + + + Mono + Mono + + + + Mono-in/Stereo-out + Entrada Mono/Saída Estéreo + + + + Stereo + Estéreo + + + + Low + Baixa + + + + Normal + Normal + + + + High + Alta + + + + Manual + Manual + + + + Default + Servidor Padrão + + + + Default (North America) + Servidor Padrão (America do Norte) + + + + preferred + + + + + + Size: + Tamanho: + + + + Buffer Delay + Atraso do buffer + + + + Buffer Delay: + Atraso do buffer: + + + + The selected audio device could not be used because of the following error: + O dispositivo de áudio selecionado não pôde ser usado devido ao seguinte erro: + + + + The previous driver will be selected. + O driver anterior será selecionado. + + + + Ok + Ok + + + + CClientSettingsDlgBase + + + Settings + Definições + + + + Soundcard + Placa de Som + + + + Device + Dispositivo + + + + Input Channel Mapping + Mapeamento do Canal de Entrada + + + + + L + L + + + + + R + R + + + + Output Channel Mapping + Mapeamento do Canal de Saída + + + + Enable Small Network Buffers + Activar Buffers de Rede Pequenos + + + + Buffer Delay + Atraso do buffer + + + + (preferred) + (preferido) + + + + (default) + (padrão) + + + + (safe) + (seguro) + + + + Driver Setup + Configuração do Driver + + + + Jitter Buffer + Jitter Buffer + + + + Auto + Auto + + + + Local + Local + + + + Server + Servidor + + + + + Size + Tamanho + + + + Misc + Outras Config. + + + + Audio Channels + Canais de Áudio + + + + Audio Quality + Qualidade de Áudio + + + + New Client Level + Nível de Novo Cliente + + + + % + % + + + + Fancy Skin + Skin Sofisticada + + + + Display Channel Levels + Mostrar Níveis de Canais + + + + Central Server Address: + Endereço do Servidor Central: + + + + Audio Stream Rate + Taxa de Transmissão de Áudio + + + + + + val + val + + + + Ping Time + Latência da Ligação + + + + Overall Delay + Latência Geral + + + + CConnectDlg + + + Server List + Lista de servidores + + + + The server list shows a list of available servers which are registered at the central server. Select a server from the list and press the connect button to connect to this server. Alternatively, double click a server from the list to connect to it. If a server is occupied, a list of the connected musicians is available by expanding the list item. Permanent servers are shown in bold font. + A lista de servidores mostra a os servidores disponíveis registados no servidor central. Selecione um servidor da lista e pressione o botão Ligar para se ligar a este servidor. Como alternativa, clique duas vezes num servidor da lista para se ligar ao mesmo. Se um servidor estiver ocupado, uma lista dos músicos ligados estará disponível expandindo o item da lista. Os servidores permanentes são mostrados em negrito. + + + + Note that it may take some time to retrieve the server list from the central server. If no valid central server address is specified in the settings, no server list will be available. + Observe que pode demorar algum tempo para obter a lista de servidores do servidor central. Se nenhum endereço de servidor central válido for especificado nas definições, nenhuma lista de servidores estará disponível. + + + + Server list view + Vista da lista de servidores + + + + Server Address + Endereço do servidor + + + + The IP address or URL of the server running the + O endereço IP ou URL do servidor executando o servidor + + + + 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: + 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: + + + + . A list of the most recent used server IP addresses or URLs is available for selection. + . Uma lista dos endereços IP ou URLs dos servidores usados recentemente está disponível para seleção. + + + + Server address edit box + Caixa de edição do endereço do servidor + + + + Holds the current server IP address or URL. It also stores old URLs in the combo box list. + Contém o endereço IP ou URL do servidor atual. Também armazena URLs antigos na lista do seletor. + + + + Filter + Filtro + + + + The server list is filered by the given text. Note that the filter is case insensitive. + A lista de servidores é filtrada pelo texto fornecido. Note que o filtro não diferencia maiúsculas de minúsculas. + + + + Filter edit box + Caixa de edição do filtro + + + + Show All Musicians + Mostrar Todos os Músicos + + + + If you check this check box, the musicians of all servers are shown. If you uncheck the check box, all list view items are collapsed. + Se marcar esta caixa de seleção, os músicos de todos os servidores serão mostrados. Se desmarcar a caixa de seleção, todos os itens em exibição na lista serão recolhidos. + + + + Show all musicians check box + Caixa de seleção para mostrar músicos + + + + CConnectDlgBase + + + Connection Setup + Configuração da Ligação + + + + Filter + Filtro + + + + Show All Musicians + Mostrar Todos os Músicos + + + + Server Name + Nome do Servidor + + + + Ping Time + Latência + + + + Musicians + Músicos + + + + Location + Localização + + + + Server Name/Address + Nome/Endereço do Servidor + + + + C&ancel + &Cancelar + + + + &Connect + &Ligar + + + + CHelpMenu + + + &Help + + + + + + Getting &Started... + Como Começa&r... + + + + Software &Manual... + &Manual do Programa... + + + + What's &This + O que é &isto + + + + &About... + &Sobre... + + + + CLicenceDlg + + + I &agree to the above licence terms + Eu &aceito os termos da licença acima + + + + Accept + Aceitar + + + + Decline + Rejeitar + + + + By connecting to this server and agreeing to this notice, you agree to the following: + Ao ligar-se a este servidor e concordar com este aviso, está a concordar com o seguinte: + + + + 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 + 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 + + + + You are free to: + Você tem o direito de: + + + + Share + Compartilhar + + + + copy and redistribute the material in any medium or format + copiar e redistribuir o material em qualquer suporte ou formato + + + + Adapt + Adaptar + + + + remix, transform, and build upon the material + remisturar, transformar, e criar a partir do material + + + + The licensor cannot revoke these freedoms as long as you follow the license terms. + O licenciante não pode revogar estes direitos desde que você respeite os termos da licença. + + + + Under the following terms: + De acordo com os termos seguintes: + + + + Attribution + Atribuição + + + + 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. + 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. + + + + NonCommercial + NãoComercial + + + + You may not use the material for commercial purposes. + Você não pode usar o material para fins comerciais. + + + + ShareAlike + CompartilhaIgual + + + + If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + 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. + + + + No additional restrictions + Sem restrições adicionais + + + + You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + 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. + + + + CMusProfDlg + + + 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. + . 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. + + + + Alias or name edit box + Caixa de edição do nome ou pseudônimo + + + + Instrument picture button + Botão da imagem do instrumento + + + + Country flag button + Botão da bandeira do país + + + + City edit box + Caixa de edição da cidade + + + + Skill level combo box + Caixa do nível de habilidade + + + + + + None + Nenhum + + + + + Musician Profile + Perfil do músico + + + + Alias/Name + Nome/Alcunha + + + + Instrument + Instrumento + + + + Country + País + + + + City + Cidade + + + + Skill + Habilidade + + + + &Close + &Fechar + + + + Beginner + Principiante + + + + Intermediate + Intermediário + + + + Expert + Avançado + + + + 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. + 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. + + + + What you set here will appear at your fader on the mixer board when you are connected to a + O que definir aqui aparecerá por baixo do seu fader na secção de mistura quando estiver ligado a um servidor + + + + Drum Set + Bateria + + + + Djembe + Djembe + + + + Electric Guitar + Guitarra Elétrica + + + + Acoustic Guitar + Guitarra Acústica + + + + Bass Guitar + Baixo + + + + Keyboard + Teclado + + + + Synthesizer + Sintetizador + + + + Grand Piano + Piano de Cauda + + + + Accordion + Acordeão + + + + Vocal + Voz + + + + Microphone + Microfone + + + + Harmonica + Harmónica + + + + Trumpet + Trompete + + + + Trombone + Trombone + + + + French Horn + Trompa Francesa + + + + Tuba + Tuba + + + + Saxophone + Saxofone + + + + Clarinet + Clarinete + + + + Flute + Flauta + + + + Violin + Violino + + + + Cello + Violoncelo + + + + Double Bass + Contrabaixo + + + + Recorder + Gravador + + + + Streamer + Streamer + + + + Listener + Ouvinte + + + + Guitar+Vocal + Guitarra+Voz + + + + Keyboard+Vocal + Teclado+Voz + + + + Bodhran + Bodhrán + + + + Bassoon + Fagote + + + + Oboe + Oboé + + + + Harp + Harpa + + + + Viola + Viola de Arco + + + + Congas + + + + + Bongo + + + + + CServerDlg + + + Client List + Lista de Clientes + + + + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. + A lista de clientes mostra todos os clientes que estão atualmente ligados a este servidor. Algumas informações sobre os clientes, como o endereço IP e o nome, são fornecidas para cada cliente ligado. + + + + Connected clients list view + Lista de clientes ligados + + + + Start Minimized on Operating System Start + Iniciar Minimizado com o Sistema Operativo + + + + If the start minimized on operating system start check box is checked, the + Se a caixa de seleção Iniciar Minimizado com o Sistema Operativo estiver marcada, o servidor + + + + server will be started when the operating system starts up and is automatically minimized to a system task bar icon. + será iniciado quando o sistema operativo for iniciado, e minimizado automaticamente para um ícone da barra de tarefas do sistema. + + + + Show Creative Commons Licence Dialog + Mostrar Diálogo da Licença Creative Commons + + + + If enabled, a Creative Commons BY-NC-SA 4.0 Licence dialog is shown each time a new user connects the server. + Se ativada, uma caixa de diálogo Creative Commons BY-NC-SA 4.0 será exibida sempre que um novo utilizador se ligar ao servidor. + + + + Make My Server Public + Tornar Servidor Público + + + + If the Make My Server Public check box is checked, this server registers itself at the central server so that all + Se a caixa de seleção Tornar Servidor Público estiver marcada, esse servidor irá registar-se no servidor central para que todos os utilizadores do + + + + users can see the server in the connect dialog server list and connect to it. The registering of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. + possam ver o servidor na lista do diálogo de ligação e ligar-se a ele. O registo do servidor é renovado periodicamente para garantir que todos os servidores na lista de diálogo de ligação estejam realmente disponíveis. + + + + Register Server Status + Estado de Registo do Servidor + + + + If the Make My Server Public check box is checked, this will show the success of registration with the central server. + Se a caixa de seleção Tornar Servidor Público estiver marcada, isto mostrará o sucesso ou insucesso do registo no servidor central. + + + + Central Server Address + Endereço do servidor central + + + + The Central server address is the IP address or URL of the central server at which this server is registered. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. + O endereço do servidor central é o endereço IP ou o URL do servidor central no qual esse servidor será registado. Com o menu dos servidores centrais, é possível selecionar um dos servidores centrais padrão ou especificar um endereço manual. + + + + Default central server type combo box + Seletor do servidor central padrão + + + + Central server address line edit + Caixa de edição do endereço do servidor central + + + + Server Name + Nome do Servidor + + + + The server name identifies your server in the connect dialog server list at the clients. If no name is given, the IP address is shown instead. + O nome do servidor identifica o servidor na lista do diálogo de ligação exibido nos clientes. Se nenhum nome for fornecido, o endereço IP será mostrado. + + + + Server name line edit + Caixa de edição do nome do servidor + + + + Location City + ;Localização: Cidade + + + + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. + A cidade onde este servidor está localizado pode ser definida aqui. Se um nome de cidade for inserido, este será mostrado na lista do diálogo de ligação dos clientes. + + + + City where the server is located line edit + Caixa de edição da cidade onde o servidor se encontra + + + + Location country + Localização: País + + + + The country in which this server is located can be set here. If a country is entered, it will be shown in the connect dialog server list at the clients. + O país em que este servidor está localizado pode ser definido aqui. Se um país for inserido, ele será mostrado na lista do diálogo de logação dos clientes. + + + + Country where the server is located combo box + Seletor do país onde o servidor de encontra + + + + + E&xit + &Sair + + + + &Hide + &Esconder servidor + + + + + + server + + + + + &Open + &Abrir servidor + + + + server + + + + + Manual + Manual + + + + Default + Servidor Padrão + + + + Default (North America) + Servidor Padrão (America do Norte) + + + + Server + - Servidor + + + + &Window + &Janela + + + + Unregistered + Não Registado + + + + Bad address + Endereço incorrecto + + + + Registration requested + Registo solicitado + + + + Registration failed + Falha no registo + + + + Check server version + Verifique versão do servidor + + + + Registered + Registado + + + + Central Server full + Servidor Central Cheio + + + + Unknown value + Valor desconhecido + + + + CServerDlgBase + + + Client IP:Port + IP do Cliente:Porta + + + + + Name + Nome do Servidor + + + + Jitter Buffer Size + Tamanho do Jitter Buffer + + + + Start Minimized on Windows Start + Iniciar Minimizado com o Sistema Operativo + + + + Show Creative Commons BY-NC-SA 4.0 Licence Dialog + Mostrar Diálogo da Licença Creative Commons BY-NC-SA 4.0 + + + + Make My Server Public (Register My Server in the Server List) + Tornar Servidor Público (Registar na Lista de Servidores) + + + + STATUS + ESTADO + + + + Central Server Address: + Endereço do Servidor Central: + + + + My Server Info + Informação do Servidor + + + + Location: City + Localização: Cidade + + + + Location: Country + Localização: País + + + + TextLabelNameVersion + TextLabelNameVersion + + + + CSound + + + The Jack server is not running. This software requires a Jack server to run. Normally if the Jack server is not running this software will automatically start the Jack server. It seems that this auto start has not worked. Try to start the Jack server manually. + O servidor Jack não está em execução. Este programa requer um servidor Jack para ser executado. Normalmente, se o servidor Jack não estiver em execução, este programa iniciará automaticamente o servidor Jack. Parece que esse início automático não funcionou. Tente iniciar o servidor Jack manualmente. + + + + The Jack server sample rate is different from the required one. The required sample rate is: + A taxa de amostragem (sample rate) do servidor Jack é diferente da necessária. A taxa de amostragem necessária é: + + + + You can use a tool like <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> to adjust the Jack server sample rate. + Pode usar uma ferramenta como <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> para ajustar a taxa de amostragem do servidor Jack. + + + + Make sure to set the Frames/Period to a low value like + Certifique-se de definir Frames/Período para um valor baixo como + + + + to achieve a low delay. + para obter uma latência baixa. + + + + + The Jack port registering failed. + O registo da porta Jack falhou. + + + + Cannot activate the Jack client. + Não é possível ativar o cliente Jack. + + + + The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue. + O servidor Jack foi desligado. Este programa requer um servidor Jack para ser executado. Tente reiniciar o programa para resolver o problema. + + + + CoreAudio input AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + A entrada do CoreAudio falhou na chamada AudioHardwareGetProperty. Parece que nenhuma placa de som está disponível no sistema. + + + + CoreAudio output AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. + A saída do CoreAudio falhou na chamada AudioHardwareGetProperty. Parece que nenhuma placa de som está disponível no sistema. + + + + Current system audio input device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + A taxa de amostragem (sample rate) de %1 Hz do dispositivo de entrada de áudio atual não é suportada. Por favor, abra o Audio-MIDI-Setup em Applications-> Utilities e tente definir uma taxa de amostragem de %2 Hz. + + + + Current system audio output device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. + A taxa de amostragem (sample rate) de %1 Hz do dispositivo de saída de áudio atual não é suportada. Por favor, abra o Audio-MIDI-Setup em Applications-> Utilities e tente definir uma taxa de amostragem de %2 Hz. + + + + The audio input stream format for this audio device is not compatible with this software. + O formato do fluxo de entrada de áudio para este dispositivo de áudio não é compatível com este programa. + + + + The audio output stream format for this audio device is not compatible with this software. + O formato do fluxo de saída de áudio para este dispositivo de áudio não é compatível com este programa. + + + + The buffer sizes of the current input and output audio device cannot be set to a common value. Please choose other input/output audio devices in your system settings. + Os tamanhos de buffer do dispositivo de áudio de entrada e saída atual não podem ser definidos para um valor comum. Por favor, escolha outros dispositivos de áudio de entrada/saída nas configurações do seu sistema. + + + + The audio driver could not be initialized. + O driver de áudio não pôde ser inicializado. + + + + The audio device does not support the required sample rate. The required sample rate is: + O dispositivo de áudio não suporta a taxa de amostragem (sample rate) necessária. A taxa de amostragem necessária é: + + + + The audio device does not support to set the required sampling rate. This error can happen if you have an audio interface like the Roland UA-25EX where you set the sample rate with a hardware switch on the audio device. If this is the case, please change the sample rate to + O dispositivo de áudio não suporta definir a taxa de amostragem (sample rate) necessária. Este erro pode ocorrer se você tiver uma interface de áudio como o Roland UA-25EX, onde se define a taxa de amostragem através de um interruptor de hardware no dispositivo de áudio. Se for esse o caso, altere a taxa de amostragem para + + + + Hz on the device and restart the + Hz no dispositivo e reinicie o cliente + + + + software. + . + + + + The audio device does not support the required number of channels. The required number of channels for input and output is: + O dispositivo de áudio não suporta o número necessário de canais. O número necessário de canais para entrada e saída é: + + + + + Required audio sample format not available. + Formato de amostra de áudio necessário não disponível. + + + + No ASIO audio device (driver) found. + Nenhum dispositivo de áudio ASIO (driver) encontrado + + + + The + O programa + + + + 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. + 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. + + + + Error closing stream: $s + + + + + CSoundBase + + + Invalid device selection. + Seleção de dispositivo inválida. + + + + The audio driver properties have changed to a state which is incompatible to this software. The selected audio device could not be used because of the following error: + As propriedades do driver de áudio foram alteradas para um estado incompatível com este programa. O dispositivo de áudio selecionado não pôde ser usado devido ao seguinte erro: + + + + Please restart the software. + Por favor reinicie o programa. + + + + Close + Fechar + + + + No usable + Nenhum dispositivo de áudio (driver) + + + + audio device (driver) found. + utilizável encontrado. + + + + In the following there is a list of all available drivers with the associated error message: + De seguida verá uma lista de todos os drivers disponíveis com a mensagem de erro associada: + + + + Do you want to open the ASIO driver setups? + Deseja abrir as configurações do driver ASIO? + + + + could not be started because of audio interface issues. + não pôde ser iniciado devido a problemas na interface de áudio. + + + diff --git a/src/res/translation_de_DE.ts b/src/res/translation_de_DE.ts deleted file mode 100644 index 157e0be3..00000000 --- a/src/res/translation_de_DE.ts +++ /dev/null @@ -1,1446 +0,0 @@ - - - - - CAboutDlg - - - The - - - - - software enables musicians to perform real-time jam sessions over the internet. There is a - - - - - server which collects the audio data from each - - - - - client, mixes the audio data and sends the mix back to each client. - - - - - uses the following libraries, resources or code snippets: - - - - - About - - - - - , Version - - - - - Internet Jam Session Software - - - - - Under the GNU General Public License (GPL) - - - - - CAboutDlgBase - - - About - - - - - TextLabelVersion - - - - - Author: Volker Fischer - - - - - Copyright (C) 2005-2020 - - - - - &OK - - - - - CAnalyzerConsole - - - Analyzer Console - - - - - Error Rate of Each Buffer Size - - - - - CChannelFader - - - <b>Channel Level:</b> Displays the pre-fader audio level of this channel. All connected clients at the server will be assigned an audio level, the same value for each client. - - - - - Input level of the current audio channel at the server - - - - - <b>Mixer Fader:</b> Adjusts the audio level of this channel. All connected clients at the server will be assigned an audio fader at each client, adjusting the local mix. - - - - - Local mix level setting of the current audio channel at the server - - - - - <b>Mute:</b> With the Mute checkbox, the audio channel can be muted. - - - - - Mute button - - - - - <b>Solo:</b> With the Solo checkbox, the audio channel can be set to solo which means that all other channels except of the current channel are muted. It is possible to set more than one channel to solo. - - - - - Solo button - - - - - <b>Fader Tag:</b> The fader tag identifies the connected client. The tag name, the picture of your instrument and a flag of your country can be set in the main window. - - - - - Mixer channel instrument picture - - - - - Mixer channel label (fader tag) - - - - - Mixer channel country flag - - - - - MUTE - - - - - SOLO - - - - - Mute - - - - - Solo - - - - - CChatDlg - - - <b>Chat Window:</b> The chat window shows a history of all chat messages. - - - - - Chat history - - - - - <b>Input Message Text:</b> Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. - - - - - New chat text edit box - - - - - CChatDlgBase - - - Chat - - - - - Cl&ear - - - - - &Close - - - - - CClientDlg - - - <b>Input Level Meter:</b> The input level indicators show the input level of the two stereo channels of the current selected audio input.<br>Make sure not to clip the input signal to avoid distortions of the audio signal. - - - - - If the - - - - - software is connected and you play your instrument/sing in the microphone, the LED level meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. line in instead of the microphone input) or set the input gain too low in the (Windows) audio mixer.<br>For a proper usage of the - - - - - software, you should not hear your singing/instrument in the loudspeaker or your headphone when the - - - - - software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (<b>not</b> the Recording mixer!). - - - - - Input level meter - - - - - Simulates an analog LED level meter. - - - - - <b>Connect / Disconnect Button:</b> Push this button to connect a server. A dialog where you can select a server will open. If you are connected, pressing this button will end the session. - - - - - Connect and disconnect toggle button - - - - - Clicking on this button changes the caption of the button from Connect to Disconnect, i.e., it implements a toggle functionality for connecting and disconnecting the - - - - - - software. - - - - - <b>Local Audio Input Fader:</b> With the audio fader, the relative levels of the left and right local audio channels can be changed. For a mono signal it acts like a panning between the two channels. If, e.g., a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows <i>L -x</i>, where <i>x</i> is the current attenuation indicator. - - - - - Local audio input fader (left/right) - - - - - <b>Reverberation Level:</b> 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.<br>The reverberation effect requires significant CPU so that it should only be used on fast PCs. If the reverberation level fader is set to minimum (which is the default setting), the reverberation effect is switched off and does not cause any additional CPU usage. - - - - - Reverberation effect level setting - - - - - <b>Reverberation Channel Selection:</b> With these radio buttons the audio input channel on which the reverberation effect is applied can be chosen. Either the left or right input channel can be selected. - - - - - Left channel selection for reverberation - - - - - Right channel selection for reverberation - - - - - <b>Delay Status LED:</b> The delay status LED indicator shows the current audio delay status. If the light is green, the delay is perfect for a jam session. If the light is yellow, a session is still possible but it may be harder to play. If the light is red, the delay is too large for jamming. - - - - - If this LED indicator turns red, you will not have much fun using the - - - - - Delay status LED indicator - - - - - <b>Buffers Status LED:</b> The buffers status LED indicator shows the current audio/streaming status. If the light is green, there are no buffer overruns/underruns and the audio stream is not interrupted. If the light is red, the audio stream is interrupted caused by one of the following problems:<ul><li>The network jitter buffer is not large enough for the current network/audio interface jitter.</li><li>The sound card buffer delay (buffer size) is set to a too small value.</li><li>The upload or download stream rate is too high for the current available internet bandwidth.</li><li>The CPU of the client or server is at 100%.</li></ul> - - - - - Buffers status LED indicator - - - - - &Connection Setup... - - - - - My &Profile... - - - - - C&hat... - - - - - &Settings... - &Einstellungen - - - - &Analyzer Console... - - - - - E&xit - - - - - CClientDlgBase - - - Delay - - - - - Buffers - - - - - Input - - - - - L - - - - - R - - - - - Settings - - - - - Chat - - - - - Mute Myself - - - - - C&onnect - - - - - Pan - - - - - Center - - - - - Reverb - - - - - Left - - - - - Right - - - - - CClientSettingsDlg - - - <b>Jitter Buffer Size:</b> The jitter buffer compensates for network and sound card timing jitters. The size of this jitter buffer has therefore influence on the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay).<br>The jitter buffer size can be manually chosen for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light on the bottom of the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun took place and the audio stream is interrupted.<br>The jitter buffer setting is therefore a trade-off between audio quality and overall delay.<br>An auto setting of the jitter buffer size setting is available. If the check Auto is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If the <i>Auto</i> check is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). - - - - - In case the auto setting of the jitter buffer is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To <b>tweak the audio delay/latency</b> it is recommended to disable the auto setting functionality and to <b>lower the jitter buffer size manually</b> by using the sliders until your personal acceptable limit of the amount of dropouts is reached. The LED indicator will visualize the audio dropouts of the local jitter buffer by a red light - - - - - Local jitter buffer slider control - - - - - Server jitter buffer slider control - - - - - Auto jitter buffer switch - - - - - Jitter buffer status LED indicator - - - - - <b>Sound Card Device:</b> The ASIO driver (sound card) can be selected using - - - - - under the Windows operating system. Under MacOS/Linux, no sound card selection is possible. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected.<br>If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. - - - - - Sound card device selector combo box - - - - - In case the <b>ASIO4ALL</b> driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended.<br>If you are using the <b>kX ASIO</b> driver, make sure to connect the ASIO inputs in the kX DSP settings panel. - - - - - <b>Sound Card Channel Mapping:</b> In case the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible.<br>For each - - - - - input/output channel (Left and Right channel) a different actual sound card channel can be selected. - - - - - Left input channel selection combo box - - - - - Right input channel selection combo box - - - - - Left output channel selection combo box - - - - - Right output channel selection combo box - - - - - <b>Enable Small Network Buffers:</b> If enabled, the support for very small network audio packets is activated. Very small network packets are only actually used if the sound card buffer delay is smaller than - - - - - samples. The smaller the network buffers, the smaller the audio latency. But at the same time the network load increases and the probability of audio dropouts also increases. - - - - - Enable small network buffers check box - - - - - <b>Sound Card Buffer Delay:</b> The buffer delay setting is a fundamental setting of the - - - - - software. This setting has influence on many connection properties.<br>Three buffer sizes are supported:<ul><li>64 samples: This is the preferred setting since it gives lowest latency but does not work with all sound cards.</li><li>128 samples: This setting should work on most of the available sound cards.</li><li>256 samples: This setting should only be used if only a very slow computer or a slow internet connection is available.</li></ul>Some sound card driver do not allow the buffer delay to be changed from within the - - - - - software. In this case the buffer delay setting is disabled. To change the actual buffer delay, this setting has to be changed in the sound card driver. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size.<br>If no buffer size is selected and all settings are disabled, an unsupported buffer size is used by the driver. The - - - - - software will still work with this setting but with restricted performannce.<br>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 outs) and the higher the upload rate and the lower the overall delay.<br>The buffer setting is therefore a trade-off between audio quality and overall delay. - - - - - If the buffer delay settings are disabled, it is prohibited by the audio driver to modify this setting from within the - - - - - software. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. - - - - - 128 samples setting radio button - - - - - 256 samples setting radio button - - - - - 512 samples setting radio button - - - - - ASIO setup push button - - - - - <b>Fancy Skin:</b> If enabled, a fancy skin will be applied to the main window. - - - - - Fancy skin check box - - - - - <b>Display Channel Levels:</b> If enabled, each client channel will display a pre-fader level bar. - - - - - Display channel levels check box - - - - - <b>Audio Channels:</b> Select the number of audio channels to be used. There are three modes available. The mono and stereo modes use one and two audio channels respectively. In the mono-in/stereo-out mode the audio signal which is sent to the server is mono but the return signal is stereo. This is useful for the case that the sound card puts the instrument on one input channel and the microphone on the other channel. In that case the two input signals can be mixed to one mono channel but the server mix can be heard in stereo.<br>Enabling the stereo streaming mode will increase the stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection.<br>In case of the stereo streaming mode, no audio channel selection for the reverberation effect will be available on the main window since the effect is applied on both channels in this case. - - - - - Audio channels combo box - - - - - <b>Audio Quality:</b> Select the desired audio quality. A low, normal or high audio quality can be selected. The higher the audio quality, the higher the audio stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. - - - - - Audio quality combo box - - - - - <b>New Client Level:</b> The new client level setting defines the fader level of a new connected client in percent. I.e. if a new client connects to the current server, it will get the specified initial fader level if no other fader level of a previous connection of that client was already stored. - - - - - New client level edit box - - - - - <b>Central Server Address:</b> The central server address is the IP address or URL of the central server at which the server list of the connection dialog is managed. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. - - - - - Default central server type combo box - - - - - Central server address line edit - - - - - <b>Current Connection Status Parameter:</b> The ping time is the time required for the audio stream to travel from the client to the server and backwards. This delay is introduced by the network. This delay should be as low as 20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to the server is too large or your internet connection is not sufficient.<br>The overall delay is calculated from the current ping time and the delay which is introduced by the current buffer settings.<br>The upstream rate depends on the current audio packet size and the audio compression setting. Make sure that the upstream rate is not higher than the available rate (check the upstream capabilities of your internet connection by, e.g., using speedtest.net). - - - - - If this LED indicator turns red, you will not have much fun using the - - - - - software. - - - - - The selected audio device could not be used because of the following error: - - - - - The previous driver will be selected. - - - - - CClientSettingsDlgBase - - - Settings - - - - - Soundcard - - - - - Device - - - - - Input Channel Mapping - - - - - - L - - - - - - R - - - - - Output Channel Mapping - - - - - Enable Small Network Buffers - - - - - Buffer Delay - - - - - (preferred) - - - - - (default) - - - - - (safe) - - - - - Driver Setup - - - - - Jitter Buffer - - - - - Auto - - - - - Local - - - - - Server - - - - - - Size - - - - - Misc - - - - - Audio Channels - - - - - Audio Quality - - - - - New Client Level - - - - - % - - - - - Fancy Skin - - - - - Display Channel Levels - - - - - Central Server Address: - - - - - Audio Stream Rate - - - - - - - val - - - - - Ping Time - - - - - Overall Delay - - - - - CConnectDlg - - - <b>Server List:</b> The server list shows a list of available servers which are registered at the central server. Select a server from the list and press the connect button to connect to this server. Alternatively, double click a server from the list to connect to it. If a server is occupied, a list of the connected musicians is available by expanding the list item. Permanent servers are shown in bold font.<br>Note that it may take some time to retrieve the server list from the central server. If no valid central server address is specified in the settings, no server list will be available. - - - - - Server list view - - - - - <b>Server Address:</b> The IP address or URL of the server running the - - - - - 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, <i>example.org: - - - - - </i>. A list of the most recent used server IP addresses or URLs is available for selection. - - - - - Server address edit box - - - - - Holds the current server IP address or URL. It also stores old URLs in the combo box list. - - - - - <b>Filter:</b> The server list is filered by the given text. Note that the filter is case insensitive. - - - - - Filter edit box - - - - - <b>Show All Musicians:</b> If you check this check box, the musicians of all servers are shown. If you uncheck the check box, all list view items are collapsed. - - - - - Show all musicians check box - - - - - CConnectDlgBase - - - Connection Setup - - - - - Filter - - - - - Show All Musicians - - - - - Server Name - - - - - Ping Time - - - - - Musicians - - - - - Location - - - - - Server Name/Address - - - - - C&ancel - - - - - &Connect - - - - - CHelpMenu - - - What's &This - - - - - &Download Link... - - - - - &About... - - - - - CLicenceDlg - - - By connecting to this server and agreeing to this notice, you agree to the following: - - - - - 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 <i><a href=http://creativecommons.org/licenses/by-nc-sa/4.0>http://creativecommons.org/licenses/by-nc-sa/4.0</a></i>): - - - - - You are free to: - - - - - Share - - - - - copy and redistribute the material in any medium or format - - - - - Adapt - - - - - remix, transform, and build upon the material - - - - - The licensor cannot revoke these freedoms as long as you follow the license terms. - - - - - Under the following terms: - - - - - Attribution - - - - - 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. - - - - - NonCommercial - - - - - You may not use the material for commercial purposes. - - - - - ShareAlike - - - - - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. - - - - - No additional restrictions - - - - - You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. - - - - - CMusProfDlg - - - <b>Musician Profile:</b> 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. -What you set here will appear at your fader on the mixer board when you are connected to a - - - - - 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. - - - - - Alias or name edit box - - - - - Instrument picture button - - - - - Country flag button - - - - - City edit box - - - - - Skill level combo box - - - - - CServerDlg - - - <b>Client List:</b> The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. - - - - - Connected clients list view - - - - - <b>Start Minimized on Operating System Start:</b> If the start minimized on operating system start check box is checked, the - - - - - server will be started when the operating system starts up and is automatically minimized to a system task bar icon. - - - - - <b>Show Creative Commons Licence Dialog:</b> If enabled, a Creative Commons Licence dialog is shown each time a new user connects the server. - - - - - <b>Make My Server Public:</b> If the Make My Server Public check box is checked, this server registers itself at the central server so that all - - - - - users can see the server in the connect dialog server list and connect to it. The registering of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. - - - - - <b>Register Server Status:</b> If the Make My Server Public check box is checked, this will show the success of registration with the central server. - - - - - <b>Central Server Address:</b> The Central server address is the IP address or URL of the central server at which this server is registered. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. - - - - - Default central server type combo box - - - - - Central server address line edit - - - - - <b>Server Name:</b> The server name identifies your server in the connect dialog server list at the clients. If no name is given, the IP address is shown instead. - - - - - Server name line edit - - - - - <b>Location City:</b> The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. - - - - - City where the server is located line edit - - - - - <b>Location country:</b> The country in which this server is located can be set here. If a country is entered, it will be shown in the connect dialog server list at the clients. - - - - - Country where the server is located combo box - - - - - - E&xit - - - - - &Hide - - - - - - - server - - - - - &Open - - - - - server - - - - - Server - - - - - CServerDlgBase - - - Client IP:Port - - - - - - Name - - - - - Jitter Buffer Size - - - - - Start Minimized on Windows Start - - - - - Show Creative Commons Licence Dialog - - - - - Make My Server Public (Register My Server in the Server List) - - - - - STATUS - - - - - Central Server Address: - - - - - My Server Info - - - - - Location: City - - - - - Location: Country - - - - - TextLabelNameVersion - - - - - CSound - - - The Jack server is not running. This software requires a Jack server to run. Normally if the Jack server is not running this software will automatically start the Jack server. It seems that this auto start has not worked. Try to start the Jack server manually. - - - - - The Jack server sample rate is different from the required one. The required sample rate is: <b> - - - - - Hz</b>. You can use a tool like <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> to adjust the Jack server sample rate.<br>Make sure to set the <b>Frames/Period</b> to a low value like <b> - - - - - </b> to achieve a low delay. - - - - - - The Jack port registering failed. - - - - - Cannot activate the Jack client. - - - - - - Cannot connect the Jack input ports - - - - - - Cannot connect the Jack output ports. - - - - - The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue. - - - - - CoreAudio input AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. - - - - - CoreAudio output AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. - - - - - Current system audio input device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. - - - - - Current system audio output device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. - - - - - The audio input stream format for this audio device is not compatible with this software. - - - - - The audio output stream format for this audio device is not compatible with this software. - - - - - The buffer sizes of the current input and output audio device cannot be set to a common value. Please choose other input/output audio devices in your system settings. - - - - - The audio driver could not be initialized. - - - - - The audio device does not support the required sample rate. The required sample rate is: - - - - - The audio device does not support to set the required sampling rate. This error can happen if you have an audio interface like the Roland UA-25EX where you set the sample rate with a hardware switch on the audio device. If this is the case, please change the sample rate to - - - - - Hz on the device and restart the - - - - - software. - - - - - The audio device does not support the required number of channels. The required number of channels for input and output is: - - - - - - Required audio sample format not available. - - - - - <b>No ASIO audio device (driver) found.</b><br><br>The - - - - - software requires the low latency audio interface <b>ASIO</b> 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. - - - - - CSoundBase - - - Invalid device selection. - - - - - The audio driver properties have changed to a state which is incompatible to this software. The selected audio device could not be used because of the following error: <b> - - - - - </b><br><br>Please restart the software. - - - - - <b>No usable - - - - - audio device (driver) found.</b><br><br>In the following there is a list of all available drivers with the associated error message:<ul> - - - - - <br/>Do you want to open the ASIO driver setups? - - - - - could not be started because of audio interface issues. - - - - diff --git a/src/res/translation_fr_FR.ts b/src/res/translation_fr_FR.ts deleted file mode 100644 index 96aba445..00000000 --- a/src/res/translation_fr_FR.ts +++ /dev/null @@ -1,1446 +0,0 @@ - - - - - CAboutDlg - - - The - - - - - software enables musicians to perform real-time jam sessions over the internet. There is a - - - - - server which collects the audio data from each - - - - - client, mixes the audio data and sends the mix back to each client. - - - - - uses the following libraries, resources or code snippets: - - - - - About - - - - - , Version - - - - - Internet Jam Session Software - - - - - Under the GNU General Public License (GPL) - - - - - CAboutDlgBase - - - About - - - - - TextLabelVersion - - - - - Author: Volker Fischer - - - - - Copyright (C) 2005-2020 - - - - - &OK - - - - - CAnalyzerConsole - - - Analyzer Console - - - - - Error Rate of Each Buffer Size - - - - - CChannelFader - - - <b>Channel Level:</b> Displays the pre-fader audio level of this channel. All connected clients at the server will be assigned an audio level, the same value for each client. - - - - - Input level of the current audio channel at the server - - - - - <b>Mixer Fader:</b> Adjusts the audio level of this channel. All connected clients at the server will be assigned an audio fader at each client, adjusting the local mix. - - - - - Local mix level setting of the current audio channel at the server - - - - - <b>Mute:</b> With the Mute checkbox, the audio channel can be muted. - - - - - Mute button - - - - - <b>Solo:</b> With the Solo checkbox, the audio channel can be set to solo which means that all other channels except of the current channel are muted. It is possible to set more than one channel to solo. - - - - - Solo button - - - - - <b>Fader Tag:</b> The fader tag identifies the connected client. The tag name, the picture of your instrument and a flag of your country can be set in the main window. - - - - - Mixer channel instrument picture - - - - - Mixer channel label (fader tag) - - - - - Mixer channel country flag - - - - - MUTE - - - - - SOLO - - - - - Mute - - - - - Solo - - - - - CChatDlg - - - <b>Chat Window:</b> The chat window shows a history of all chat messages. - - - - - Chat history - - - - - <b>Input Message Text:</b> Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. - - - - - New chat text edit box - - - - - CChatDlgBase - - - Chat - - - - - Cl&ear - - - - - &Close - - - - - CClientDlg - - - <b>Input Level Meter:</b> The input level indicators show the input level of the two stereo channels of the current selected audio input.<br>Make sure not to clip the input signal to avoid distortions of the audio signal. - - - - - If the - - - - - software is connected and you play your instrument/sing in the microphone, the LED level meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. line in instead of the microphone input) or set the input gain too low in the (Windows) audio mixer.<br>For a proper usage of the - - - - - software, you should not hear your singing/instrument in the loudspeaker or your headphone when the - - - - - software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (<b>not</b> the Recording mixer!). - - - - - Input level meter - - - - - Simulates an analog LED level meter. - - - - - <b>Connect / Disconnect Button:</b> Push this button to connect a server. A dialog where you can select a server will open. If you are connected, pressing this button will end the session. - - - - - Connect and disconnect toggle button - - - - - Clicking on this button changes the caption of the button from Connect to Disconnect, i.e., it implements a toggle functionality for connecting and disconnecting the - - - - - - software. - - - - - <b>Local Audio Input Fader:</b> With the audio fader, the relative levels of the left and right local audio channels can be changed. For a mono signal it acts like a panning between the two channels. If, e.g., a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows <i>L -x</i>, where <i>x</i> is the current attenuation indicator. - - - - - Local audio input fader (left/right) - - - - - <b>Reverberation Level:</b> 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.<br>The reverberation effect requires significant CPU so that it should only be used on fast PCs. If the reverberation level fader is set to minimum (which is the default setting), the reverberation effect is switched off and does not cause any additional CPU usage. - - - - - Reverberation effect level setting - - - - - <b>Reverberation Channel Selection:</b> With these radio buttons the audio input channel on which the reverberation effect is applied can be chosen. Either the left or right input channel can be selected. - - - - - Left channel selection for reverberation - - - - - Right channel selection for reverberation - - - - - <b>Delay Status LED:</b> The delay status LED indicator shows the current audio delay status. If the light is green, the delay is perfect for a jam session. If the light is yellow, a session is still possible but it may be harder to play. If the light is red, the delay is too large for jamming. - - - - - If this LED indicator turns red, you will not have much fun using the - - - - - Delay status LED indicator - - - - - <b>Buffers Status LED:</b> The buffers status LED indicator shows the current audio/streaming status. If the light is green, there are no buffer overruns/underruns and the audio stream is not interrupted. If the light is red, the audio stream is interrupted caused by one of the following problems:<ul><li>The network jitter buffer is not large enough for the current network/audio interface jitter.</li><li>The sound card buffer delay (buffer size) is set to a too small value.</li><li>The upload or download stream rate is too high for the current available internet bandwidth.</li><li>The CPU of the client or server is at 100%.</li></ul> - - - - - Buffers status LED indicator - - - - - &Connection Setup... - - - - - My &Profile... - - - - - C&hat... - - - - - &Settings... - - - - - &Analyzer Console... - - - - - E&xit - - - - - CClientDlgBase - - - Delay - - - - - Buffers - - - - - Input - - - - - L - - - - - R - - - - - Settings - - - - - Chat - - - - - Mute Myself - - - - - C&onnect - - - - - Pan - - - - - Center - - - - - Reverb - - - - - Left - - - - - Right - - - - - CClientSettingsDlg - - - <b>Jitter Buffer Size:</b> The jitter buffer compensates for network and sound card timing jitters. The size of this jitter buffer has therefore influence on the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay).<br>The jitter buffer size can be manually chosen for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light on the bottom of the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun took place and the audio stream is interrupted.<br>The jitter buffer setting is therefore a trade-off between audio quality and overall delay.<br>An auto setting of the jitter buffer size setting is available. If the check Auto is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If the <i>Auto</i> check is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). - - - - - In case the auto setting of the jitter buffer is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To <b>tweak the audio delay/latency</b> it is recommended to disable the auto setting functionality and to <b>lower the jitter buffer size manually</b> by using the sliders until your personal acceptable limit of the amount of dropouts is reached. The LED indicator will visualize the audio dropouts of the local jitter buffer by a red light - - - - - Local jitter buffer slider control - - - - - Server jitter buffer slider control - - - - - Auto jitter buffer switch - - - - - Jitter buffer status LED indicator - - - - - <b>Sound Card Device:</b> The ASIO driver (sound card) can be selected using - - - - - under the Windows operating system. Under MacOS/Linux, no sound card selection is possible. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected.<br>If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. - - - - - Sound card device selector combo box - - - - - In case the <b>ASIO4ALL</b> driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended.<br>If you are using the <b>kX ASIO</b> driver, make sure to connect the ASIO inputs in the kX DSP settings panel. - - - - - <b>Sound Card Channel Mapping:</b> In case the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible.<br>For each - - - - - input/output channel (Left and Right channel) a different actual sound card channel can be selected. - - - - - Left input channel selection combo box - - - - - Right input channel selection combo box - - - - - Left output channel selection combo box - - - - - Right output channel selection combo box - - - - - <b>Enable Small Network Buffers:</b> If enabled, the support for very small network audio packets is activated. Very small network packets are only actually used if the sound card buffer delay is smaller than - - - - - samples. The smaller the network buffers, the smaller the audio latency. But at the same time the network load increases and the probability of audio dropouts also increases. - - - - - Enable small network buffers check box - - - - - <b>Sound Card Buffer Delay:</b> The buffer delay setting is a fundamental setting of the - - - - - software. This setting has influence on many connection properties.<br>Three buffer sizes are supported:<ul><li>64 samples: This is the preferred setting since it gives lowest latency but does not work with all sound cards.</li><li>128 samples: This setting should work on most of the available sound cards.</li><li>256 samples: This setting should only be used if only a very slow computer or a slow internet connection is available.</li></ul>Some sound card driver do not allow the buffer delay to be changed from within the - - - - - software. In this case the buffer delay setting is disabled. To change the actual buffer delay, this setting has to be changed in the sound card driver. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size.<br>If no buffer size is selected and all settings are disabled, an unsupported buffer size is used by the driver. The - - - - - software will still work with this setting but with restricted performannce.<br>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 outs) and the higher the upload rate and the lower the overall delay.<br>The buffer setting is therefore a trade-off between audio quality and overall delay. - - - - - If the buffer delay settings are disabled, it is prohibited by the audio driver to modify this setting from within the - - - - - software. On Windows, press the ASIO Setup button to open the driver settings panel. On Linux, use the Jack configuration tool to change the buffer size. - - - - - 128 samples setting radio button - - - - - 256 samples setting radio button - - - - - 512 samples setting radio button - - - - - ASIO setup push button - - - - - <b>Fancy Skin:</b> If enabled, a fancy skin will be applied to the main window. - - - - - Fancy skin check box - - - - - <b>Display Channel Levels:</b> If enabled, each client channel will display a pre-fader level bar. - - - - - Display channel levels check box - - - - - <b>Audio Channels:</b> Select the number of audio channels to be used. There are three modes available. The mono and stereo modes use one and two audio channels respectively. In the mono-in/stereo-out mode the audio signal which is sent to the server is mono but the return signal is stereo. This is useful for the case that the sound card puts the instrument on one input channel and the microphone on the other channel. In that case the two input signals can be mixed to one mono channel but the server mix can be heard in stereo.<br>Enabling the stereo streaming mode will increase the stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection.<br>In case of the stereo streaming mode, no audio channel selection for the reverberation effect will be available on the main window since the effect is applied on both channels in this case. - - - - - Audio channels combo box - - - - - <b>Audio Quality:</b> Select the desired audio quality. A low, normal or high audio quality can be selected. The higher the audio quality, the higher the audio stream data rate. Make sure that the current upload rate does not exceed the available bandwidth of your internet connection. - - - - - Audio quality combo box - - - - - <b>New Client Level:</b> The new client level setting defines the fader level of a new connected client in percent. I.e. if a new client connects to the current server, it will get the specified initial fader level if no other fader level of a previous connection of that client was already stored. - - - - - New client level edit box - - - - - <b>Central Server Address:</b> The central server address is the IP address or URL of the central server at which the server list of the connection dialog is managed. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. - - - - - Default central server type combo box - - - - - Central server address line edit - - - - - <b>Current Connection Status Parameter:</b> The ping time is the time required for the audio stream to travel from the client to the server and backwards. This delay is introduced by the network. This delay should be as low as 20-30 ms. If this delay is higher (e.g., 50-60 ms), your distance to the server is too large or your internet connection is not sufficient.<br>The overall delay is calculated from the current ping time and the delay which is introduced by the current buffer settings.<br>The upstream rate depends on the current audio packet size and the audio compression setting. Make sure that the upstream rate is not higher than the available rate (check the upstream capabilities of your internet connection by, e.g., using speedtest.net). - - - - - If this LED indicator turns red, you will not have much fun using the - - - - - software. - - - - - The selected audio device could not be used because of the following error: - - - - - The previous driver will be selected. - - - - - CClientSettingsDlgBase - - - Settings - - - - - Soundcard - - - - - Device - - - - - Input Channel Mapping - - - - - - L - - - - - - R - - - - - Output Channel Mapping - - - - - Enable Small Network Buffers - - - - - Buffer Delay - - - - - (preferred) - - - - - (default) - - - - - (safe) - - - - - Driver Setup - - - - - Jitter Buffer - - - - - Auto - - - - - Local - - - - - Server - - - - - - Size - - - - - Misc - - - - - Audio Channels - - - - - Audio Quality - - - - - New Client Level - - - - - % - - - - - Fancy Skin - - - - - Display Channel Levels - - - - - Central Server Address: - - - - - Audio Stream Rate - - - - - - - val - - - - - Ping Time - - - - - Overall Delay - - - - - CConnectDlg - - - <b>Server List:</b> The server list shows a list of available servers which are registered at the central server. Select a server from the list and press the connect button to connect to this server. Alternatively, double click a server from the list to connect to it. If a server is occupied, a list of the connected musicians is available by expanding the list item. Permanent servers are shown in bold font.<br>Note that it may take some time to retrieve the server list from the central server. If no valid central server address is specified in the settings, no server list will be available. - - - - - Server list view - - - - - <b>Server Address:</b> The IP address or URL of the server running the - - - - - 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, <i>example.org: - - - - - </i>. A list of the most recent used server IP addresses or URLs is available for selection. - - - - - Server address edit box - - - - - Holds the current server IP address or URL. It also stores old URLs in the combo box list. - - - - - <b>Filter:</b> The server list is filered by the given text. Note that the filter is case insensitive. - - - - - Filter edit box - - - - - <b>Show All Musicians:</b> If you check this check box, the musicians of all servers are shown. If you uncheck the check box, all list view items are collapsed. - - - - - Show all musicians check box - - - - - CConnectDlgBase - - - Connection Setup - - - - - Filter - - - - - Show All Musicians - - - - - Server Name - - - - - Ping Time - - - - - Musicians - - - - - Location - - - - - Server Name/Address - - - - - C&ancel - - - - - &Connect - - - - - CHelpMenu - - - What's &This - - - - - &Download Link... - - - - - &About... - - - - - CLicenceDlg - - - By connecting to this server and agreeing to this notice, you agree to the following: - - - - - 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 <i><a href=http://creativecommons.org/licenses/by-nc-sa/4.0>http://creativecommons.org/licenses/by-nc-sa/4.0</a></i>): - - - - - You are free to: - - - - - Share - - - - - copy and redistribute the material in any medium or format - - - - - Adapt - - - - - remix, transform, and build upon the material - - - - - The licensor cannot revoke these freedoms as long as you follow the license terms. - - - - - Under the following terms: - - - - - Attribution - - - - - 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. - - - - - NonCommercial - - - - - You may not use the material for commercial purposes. - - - - - ShareAlike - - - - - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. - - - - - No additional restrictions - - - - - You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. - - - - - CMusProfDlg - - - <b>Musician Profile:</b> 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. -What you set here will appear at your fader on the mixer board when you are connected to a - - - - - 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. - - - - - Alias or name edit box - - - - - Instrument picture button - - - - - Country flag button - - - - - City edit box - - - - - Skill level combo box - - - - - CServerDlg - - - <b>Client List:</b> The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. - - - - - Connected clients list view - - - - - <b>Start Minimized on Operating System Start:</b> If the start minimized on operating system start check box is checked, the - - - - - server will be started when the operating system starts up and is automatically minimized to a system task bar icon. - - - - - <b>Show Creative Commons Licence Dialog:</b> If enabled, a Creative Commons Licence dialog is shown each time a new user connects the server. - - - - - <b>Make My Server Public:</b> If the Make My Server Public check box is checked, this server registers itself at the central server so that all - - - - - users can see the server in the connect dialog server list and connect to it. The registering of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. - - - - - <b>Register Server Status:</b> If the Make My Server Public check box is checked, this will show the success of registration with the central server. - - - - - <b>Central Server Address:</b> The Central server address is the IP address or URL of the central server at which this server is registered. With the central server address type either the local region can be selected of the default central servers or a manual address can be specified. - - - - - Default central server type combo box - - - - - Central server address line edit - - - - - <b>Server Name:</b> The server name identifies your server in the connect dialog server list at the clients. If no name is given, the IP address is shown instead. - - - - - Server name line edit - - - - - <b>Location City:</b> The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. - - - - - City where the server is located line edit - - - - - <b>Location country:</b> The country in which this server is located can be set here. If a country is entered, it will be shown in the connect dialog server list at the clients. - - - - - Country where the server is located combo box - - - - - - E&xit - - - - - &Hide - - - - - - - server - - - - - &Open - - - - - server - - - - - Server - - - - - CServerDlgBase - - - Client IP:Port - - - - - - Name - - - - - Jitter Buffer Size - - - - - Start Minimized on Windows Start - - - - - Show Creative Commons Licence Dialog - - - - - Make My Server Public (Register My Server in the Server List) - - - - - STATUS - - - - - Central Server Address: - - - - - My Server Info - - - - - Location: City - - - - - Location: Country - - - - - TextLabelNameVersion - - - - - CSound - - - The Jack server is not running. This software requires a Jack server to run. Normally if the Jack server is not running this software will automatically start the Jack server. It seems that this auto start has not worked. Try to start the Jack server manually. - - - - - The Jack server sample rate is different from the required one. The required sample rate is: <b> - - - - - Hz</b>. You can use a tool like <i><a href=http://qjackctl.sourceforge.net>QJackCtl</a></i> to adjust the Jack server sample rate.<br>Make sure to set the <b>Frames/Period</b> to a low value like <b> - - - - - </b> to achieve a low delay. - - - - - - The Jack port registering failed. - - - - - Cannot activate the Jack client. - - - - - - Cannot connect the Jack input ports - - - - - - Cannot connect the Jack output ports. - - - - - The Jack server was shut down. This software requires a Jack server to run. Try to restart the software to solve the issue. - - - - - CoreAudio input AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. - - - - - CoreAudio output AudioHardwareGetProperty call failed. It seems that no sound card is available in the system. - - - - - Current system audio input device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. - - - - - Current system audio output device sample rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in Applications->Utilities and try to set a sample rate of %2 Hz. - - - - - The audio input stream format for this audio device is not compatible with this software. - - - - - The audio output stream format for this audio device is not compatible with this software. - - - - - The buffer sizes of the current input and output audio device cannot be set to a common value. Please choose other input/output audio devices in your system settings. - - - - - The audio driver could not be initialized. - - - - - The audio device does not support the required sample rate. The required sample rate is: - - - - - The audio device does not support to set the required sampling rate. This error can happen if you have an audio interface like the Roland UA-25EX where you set the sample rate with a hardware switch on the audio device. If this is the case, please change the sample rate to - - - - - Hz on the device and restart the - - - - - software. - - - - - The audio device does not support the required number of channels. The required number of channels for input and output is: - - - - - - Required audio sample format not available. - - - - - <b>No ASIO audio device (driver) found.</b><br><br>The - - - - - software requires the low latency audio interface <b>ASIO</b> 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. - - - - - CSoundBase - - - Invalid device selection. - - - - - The audio driver properties have changed to a state which is incompatible to this software. The selected audio device could not be used because of the following error: <b> - - - - - </b><br><br>Please restart the software. - - - - - <b>No usable - - - - - audio device (driver) found.</b><br><br>In the following there is a list of all available drivers with the associated error message:<ul> - - - - - <br/>Do you want to open the ASIO driver setups? - - - - - could not be started because of audio interface issues. - - - - diff --git a/src/resources.qrc b/src/resources.qrc index 77f355ec..51b5fe74 100755 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -1,4 +1,16 @@ + + res/translation/translation_de_DE.qm + + + res/translation/translation_fr_FR.qm + + + res/translation/translation_pt_PT.qm + + + res/translation/translation_es_ES.qm + res/CLEDDisabledSmall.png res/CLEDGreenArrow.png @@ -50,10 +62,15 @@ res/instruments/instrguitarvocal.png res/instruments/instrkeyboardvocal.png res/instruments/bodhran.png + res/instruments/bassoon.png + res/instruments/oboe.png + res/instruments/harp.png + res/instruments/viola.png + res/instruments/congas.png + res/instruments/bongo.png res/fronticon.png - res/logopicture.png res/mainicon.png diff --git a/src/server.cpp b/src/server.cpp index 69288057..061b7325 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -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; @@ -400,11 +401,10 @@ CServer::CServer ( const int iNewMaxNumChan, QString().number( static_cast ( 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 @@ -468,6 +468,14 @@ CServer::CServer ( const int iNewMaxNumChan, SIGNAL ( SvrRegStatusChanged() ), this, SLOT ( OnSvrRegStatusChanged() ) ); + QObject::connect ( QCoreApplication::instance(), + SIGNAL ( aboutToQuit() ), + this, SLOT ( OnAboutToQuit() ) ); + + QObject::connect ( pSignalHandler, + SIGNAL ( ShutdownSignal ( int ) ), + this, SLOT ( OnShutdown ( int ) ) ); + #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) connectChannelSignalsToServerSlots(); @@ -804,14 +812,6 @@ void CServer::SendProtMessage ( int iChID, CVector 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.) @@ -910,6 +910,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 @@ -944,7 +977,7 @@ void CServer::Stop() void CServer::OnTimer() { - int i, j; + int i, j, iUnused; int iClientFrameSizeSamples; OpusCustomDecoder* CurOpusDecoder; OpusCustomEncoder* CurOpusEncoder; @@ -1099,11 +1132,11 @@ JitterMeas.Measure(); // OPUS decode received data stream if ( CurOpusDecoder != nullptr ) { - opus_custom_decode ( CurOpusDecoder, - pCurCodedData, - iCeltNumCodedBytes, - &vecvecsData[i][iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], - iClientFrameSizeSamples ); + iUnused = opus_custom_decode ( CurOpusDecoder, + pCurCodedData, + iCeltNumCodedBytes, + &vecvecsData[i][iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], + iClientFrameSizeSamples ); } } @@ -1247,11 +1280,11 @@ JitterMeas.Measure(); opus_custom_encoder_ctl ( CurOpusEncoder, OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iClientFrameSizeSamples ) ) ); - opus_custom_encode ( CurOpusEncoder, - &vecsSendData[iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], - iClientFrameSizeSamples, - &vecbyCodedData[0], - iCeltNumCodedBytes ); + iUnused = opus_custom_encode ( CurOpusEncoder, + &vecsSendData[iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], + iClientFrameSizeSamples, + &vecbyCodedData[0], + iCeltNumCodedBytes ); } // send separate mix to current clients @@ -1277,6 +1310,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. diff --git a/src/server.h b/src/server.h index 6060dd07..97fa404c 100755 --- a/src/server.h +++ b/src/server.h @@ -36,6 +36,7 @@ #endif #include "global.h" #include "buffer.h" +#include "signalhandler.h" #include "socket.h" #include "channel.h" #include "util.h" @@ -177,7 +178,7 @@ public: const QString& strNewWelcomeMessage, const QString& strRecordingDirName, const bool bNCentServPingServerInList, - const bool bNDisconnectAllClients, + const bool bNDisconnectAllClientsOnQuit, const bool bNUseDoubleSystemFrameSize, const ELicenceType eNLicenceType ); @@ -370,7 +371,9 @@ protected: // messaging QString strWelcomeMessage; ELicenceType eLicenceType; - bool bDisconnectAllClients; + bool bDisconnectAllClientsOnQuit; + + CSignalHandler* pSignalHandler; signals: void Started(); @@ -457,6 +460,10 @@ public slots: void OnCLDisconnection ( CHostAddress InetAddr ); + void OnAboutToQuit(); + + void OnShutdown ( int ); + #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!!! diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp index 0fbdf8c5..7df039ed 100755 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -42,28 +42,28 @@ CServerDlg::CServerDlg ( CServer* pNServP, // Add help text to controls ----------------------------------------------- // client list - lvwClients->setWhatsThis ( tr ( "Client List: The client list " - "shows all clients which are currently connected to this server. Some " - "information about the clients like the IP address and name are given " - "for each connected client." ) ); + lvwClients->setWhatsThis ( "" + tr ( "Client List" ) + ": " + tr ( + "The client list shows all clients which are currently connected to this " + "server. Some information about the clients like the IP address and name " + "are given for each connected client." ) ); lvwClients->setAccessibleName ( tr ( "Connected clients list view" ) ); // start minimized on operating system start - chbStartOnOSStart->setWhatsThis ( tr ( "Start Minimized on Operating " - "System Start: If the start minimized on operating system start " + chbStartOnOSStart->setWhatsThis ( "" + tr ( "Start Minimized on Operating " + "System Start" ) + ": " + tr ( "If the start minimized on operating system start " "check box is checked, the " ) + APP_NAME + tr ( " server will be " "started when the operating system starts up and is automatically " "minimized to a system task bar icon." ) ); // CC licence dialog switch - chbUseCCLicence->setWhatsThis ( tr ( "Show Creative Commons Licence " - "Dialog: If enabled, a Creative Commons BY-NC-SA 4.0 Licence " + chbUseCCLicence->setWhatsThis ( "" + tr ( "Show Creative Commons Licence " + "Dialog" ) + ": " + tr ( "If enabled, a Creative Commons BY-NC-SA 4.0 Licence " "dialog is shown each time a new user connects the server." ) ); // Make My Server Public flag - chbRegisterServer->setWhatsThis ( tr ( "Make My Server Public: If " - "the Make My Server Public check box is checked, this server registers " + chbRegisterServer->setWhatsThis ( "" + tr ( "Make My Server Public" ) + ": " + + tr ( "If the Make My Server Public check box is checked, this server registers " "itself at the central server so that all " ) + APP_NAME + tr ( " users can see the server in the connect dialog server list and " "connect to it. The registering of the server is renewed periodically " @@ -71,13 +71,13 @@ CServerDlg::CServerDlg ( CServer* pNServP, "actually available." ) ); // register server status label - lblRegSvrStatus->setWhatsThis ( tr ( "Register Server Status: If " - "the Make My Server Public check box is checked, this will show " + lblRegSvrStatus->setWhatsThis ( "" + tr ( "Register Server Status" ) + ": " + + tr ( "If the Make My Server Public check box is checked, this will show " "the success of registration with the central server." ) ); // central server address - QString strCentrServAddr = tr ( "Central Server Address: The " - "Central server address is the IP address or URL of the central server " + QString strCentrServAddr = "" + tr ( "Central Server Address" ) + ": " + + tr ( "The Central server address is the IP address or URL of the central server " "at which this server is registered. With the central server address " "type either the local region can be selected of the default central " "servers or a manual address can be specified." ); @@ -90,7 +90,7 @@ CServerDlg::CServerDlg ( CServer* pNServP, edtCentralServerAddress->setAccessibleName ( tr ( "Central server address line edit" ) ); // server name - QString strServName = tr ( "Server Name: The server name identifies " + QString strServName = "" + tr ( "Server Name" ) + ": " + tr ( "The server name identifies " "your server in the connect dialog server list at the clients. If no " "name is given, the IP address is shown instead." ); @@ -100,18 +100,17 @@ CServerDlg::CServerDlg ( CServer* pNServP, edtServerName->setAccessibleName ( tr ( "Server name line edit" ) ); // location city - QString strLocCity = tr ( "Location City: The city in which this " + QString strLocCity = "" + tr ( "Location City" ) + ": " + tr ( "The city in which this " "server is located can be set here. If a city name is entered, it " "will be shown in the connect dialog server list at the clients." ); lblLocationCity->setWhatsThis ( strLocCity ); edtLocationCity->setWhatsThis ( strLocCity ); - edtLocationCity->setAccessibleName ( tr ( - "City where the server is located line edit" ) ); + edtLocationCity->setAccessibleName ( tr ( "City where the server is located line edit" ) ); // location country - QString strLocCountry = tr ( "Location country: The country in " + QString strLocCountry = "" + tr ( "Location country" ) + ": " + tr ( "The country in " "which this server is located can be set here. If a country is " "entered, it will be shown in the connect dialog server list at the " "clients." ); @@ -189,9 +188,9 @@ lvwClients->setMinimumHeight ( 140 ); // central server address type combo box cbxCentServAddrType->clear(); - cbxCentServAddrType->addItem ( "Manual" ); // AT_MANUAL - cbxCentServAddrType->addItem ( "Default" ); // AT_DEFAULT - cbxCentServAddrType->addItem ( "Default (North America)" ); // AT_NORTH_AMERICA + cbxCentServAddrType->addItem ( tr ( "Manual" ) ); // AT_MANUAL + cbxCentServAddrType->addItem ( tr ( "Default" ) ); // AT_DEFAULT + cbxCentServAddrType->addItem ( tr ( "Default (North America)" ) ); // AT_NORTH_AMERICA cbxCentServAddrType->setCurrentIndex ( static_cast ( pServer->GetCentralServerAddressType() ) ); // update server name line edit @@ -273,7 +272,7 @@ lvwClients->setMinimumHeight ( 140 ); // View menu -------------------------------------------------------------- - QMenu* pViewMenu = new QMenu ( "&Window", this ); + QMenu* pViewMenu = new QMenu ( tr ( "&Window" ), this ); pViewMenu->addAction ( tr ( "E&xit" ), this, SLOT ( close() ), QKeySequence ( Qt::CTRL + Qt::Key_Q ) ); @@ -283,7 +282,7 @@ lvwClients->setMinimumHeight ( 140 ); pMenu = new QMenuBar ( this ); pMenu->addMenu ( pViewMenu ); - pMenu->addMenu ( new CHelpMenu ( this ) ); + pMenu->addMenu ( new CHelpMenu ( false, this ) ); // Now tell the layout about the menu layout()->setMenuBar ( pMenu ); @@ -343,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 ); @@ -447,6 +434,12 @@ void CServerDlg::OnLocationCountryActivated ( int iCntryListItem ) void CServerDlg::OnCentServAddrTypeActivated ( int iTypeIdx ) { + // if server was registered, unregister first + if ( pServer->GetServerListEnabled() ) + { + pServer->UnregisterSlaveServer(); + } + // apply new setting to the server and update it pServer->SetCentralServerAddressType ( static_cast ( iTypeIdx ) ); pServer->UpdateServerList(); diff --git a/src/serverdlg.h b/src/serverdlg.h index febb44ef..da06e0c4 100755 --- a/src/serverdlg.h +++ b/src/serverdlg.h @@ -58,7 +58,6 @@ public: protected: virtual void changeEvent ( QEvent* pEvent ); - virtual void closeEvent ( QCloseEvent* Event ); void UpdateGUIDependencies(); void UpdateSystemTrayIcon ( const bool bIsActive ); diff --git a/src/serverlist.cpp b/src/serverlist.cpp index c9127059..dc79c603 100755 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -31,7 +31,8 @@ CServerListManager::CServerListManager ( const quint16 iNPortNum, const int iNumChannels, const bool bNCentServPingServerInList, CProtocol* pNConLProt ) - : iNumPredefinedServers ( 0 ), + : tsConsoleStream ( *( ( new ConsoleWriterFactory() )->get() ) ), + iNumPredefinedServers ( 0 ), eCentralServerAddressType ( AT_MANUAL ), // must be AT_MANUAL for the "no GUI" case bCentServPingServerInList ( bNCentServPingServerInList ), pConnLessProtocol ( pNConLProt ), @@ -307,6 +308,8 @@ void CServerListManager::OnTimerPingServerInList() void CServerListManager::OnTimerPollList() { + CVector vecRemovedHostAddr; + QMutexLocker locker ( &Mutex ); // Check all list entries except of the very first one (which is the central @@ -319,6 +322,7 @@ void CServerListManager::OnTimerPollList() if ( ServerList[iIdx].RegisterTime.elapsed() > ( SERVLIST_TIME_OUT_MINUTES * 60000 ) ) { // remove this list entry + vecRemovedHostAddr.Add ( ServerList[iIdx].HostAddr ); ServerList.removeAt ( iIdx ); } else @@ -327,16 +331,27 @@ void CServerListManager::OnTimerPollList() iIdx++; } } + + locker.unlock(); + + foreach ( const CHostAddress HostAddr, vecRemovedHostAddr ) + { + tsConsoleStream << "Expired entry for " << HostAddr.toString() << endl; + } } void CServerListManager::CentralServerRegisterServer ( const CHostAddress& InetAddr, const CHostAddress& LInetAddr, const CServerCoreInfo& ServerInfo ) { - QMutexLocker locker ( &Mutex ); - if ( bIsCentralServer && bEnabled ) { + tsConsoleStream << "Requested to register entry for " + << InetAddr.toString() << " (" << LInetAddr.toString() << ")" + << ": " << ServerInfo.strName << endl; + + QMutexLocker locker ( &Mutex ); + const int iCurServerListSize = ServerList.size(); // define invalid index used as a flag @@ -394,10 +409,13 @@ void CServerListManager::CentralServerRegisterServer ( const CHostAddress& In void CServerListManager::CentralServerUnregisterServer ( const CHostAddress& InetAddr ) { - QMutexLocker locker ( &Mutex ); - if ( bIsCentralServer && bEnabled ) { + tsConsoleStream << "Requested to unregister entry for " + << InetAddr.toString() << endl; + + QMutexLocker locker ( &Mutex ); + const int iCurServerListSize = ServerList.size(); // Find the server to unregister in the list. The very first list entry @@ -587,7 +605,6 @@ void CServerListManager::SlaveServerRegisterServer ( const bool bIsRegister ) void CServerListManager::SetSvrRegStatus ( ESvrRegStatus eNSvrRegStatus ) { // output regirstation result/update on the console - QTextStream& tsConsoleStream = *( ( new ConsoleWriterFactory() )->get() ); tsConsoleStream << "Server Registration Status update: " << svrRegStatusToString ( eNSvrRegStatus ) << endl; // store the state and inform the GUI about the new status diff --git a/src/serverlist.h b/src/serverlist.h index 2c77055f..decf9d72 100755 --- a/src/serverlist.h +++ b/src/serverlist.h @@ -186,6 +186,7 @@ protected: QTimer TimerCLRegisterServerResp; QMutex Mutex; + QTextStream& tsConsoleStream; QList ServerList; diff --git a/src/signalhandler.cpp b/src/signalhandler.cpp new file mode 100755 index 00000000..4c37d018 --- /dev/null +++ b/src/signalhandler.cpp @@ -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(); + QReadLocker lock ( self->getLock() ); + return self->pSignalHandler->emitSignal ( static_cast( 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 diff --git a/src/signalhandler.h b/src/signalhandler.h new file mode 100755 index 00000000..1263ee6a --- /dev/null +++ b/src/signalhandler.h @@ -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 +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#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 pSignalBase; + + explicit CSignalHandler(); + ~CSignalHandler() override; +}; + +// ---------------------------------------------------------- + +class CSignalBase +{ + Q_DISABLE_COPY ( CSignalBase ) + +public: + static CSignalBase* withSignalHandler ( CSignalHandler* ); + virtual ~CSignalBase(); + + virtual QReadWriteLock* getLock() const = 0; + + QSet sHandledSigNums; + +protected: + CSignalBase ( CSignalHandler* ); + + CSignalHandler* pSignalHandler; + + template + static T *getSelf() + { + return static_cast( 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 diff --git a/src/socket.cpp b/src/socket.cpp index f4cdf5f1..ebcddb5d 100755 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -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 ) ) diff --git a/src/soundbase.cpp b/src/soundbase.cpp index 56ae94b2..bdc1c833 100755 --- a/src/soundbase.cpp +++ b/src/soundbase.cpp @@ -30,14 +30,12 @@ CSoundBase::CSoundBase ( const QString& strNewSystemDriverTechniqueName, const bool bNewIsCallbackAudioInterface, void (*fpNewProcessCallback) ( CVector& psData, void* pParg ), void* pParg, - const int iNewCtrlMIDIChannel, - const bool bNewNoAutoJackConnect ) : - fpProcessCallback ( fpNewProcessCallback ), - pProcessCallbackArg ( pParg ), bRun ( false ), - bIsCallbackAudioInterface ( bNewIsCallbackAudioInterface ), + const int iNewCtrlMIDIChannel ) : + fpProcessCallback ( fpNewProcessCallback ), + pProcessCallbackArg ( pParg ), bRun ( false ), + bIsCallbackAudioInterface ( bNewIsCallbackAudioInterface ), strSystemDriverTechniqueName ( strNewSystemDriverTechniqueName ), - iCtrlMIDIChannel ( iNewCtrlMIDIChannel ), - bNoAutoJackConnect ( bNewNoAutoJackConnect ) + iCtrlMIDIChannel ( iNewCtrlMIDIChannel ) { // initializations for the sound card names (default) lNumDevs = 1; @@ -143,10 +141,10 @@ QString CSoundBase::SetDev ( const int iNewDev ) nullptr, APP_NAME, QString ( tr ( "The audio driver properties " "have changed to a state which is incompatible to this " "software. The selected audio device could not be used " - "because of the following error: " ) ) + + "because of the following error:" ) + " " ) + strErrorMessage + - QString ( tr ( "

    Please restart the software." ) ), - "Close", nullptr ); + QString ( "


    " + tr ( "Please restart the software." ) ), + tr ( "Close" ), nullptr ); _exit ( 0 ); } @@ -188,11 +186,11 @@ QString CSoundBase::SetDev ( const int iNewDev ) if ( !vsErrorList.isEmpty() ) { // create error message with all details - QString sErrorMessage = tr ( "No usable " ) + + QString sErrorMessage = "" + tr ( "No usable " ) + strSystemDriverTechniqueName + tr ( " audio device " - "(driver) found.

    " + "(driver) found." ) + "


    " + tr ( "In the following there is a list of all available drivers " - "with the associated error message:
      " ); + "with the associated error message:" ) + "
        "; for ( int i = 0; i < lNumDevs; i++ ) { @@ -204,7 +202,7 @@ QString CSoundBase::SetDev ( const int iNewDev ) // to be able to access the ASIO driver setup for changing, e.g., the sample rate, we // offer the user under Windows that we open the driver setups of all registered // ASIO drivers - sErrorMessage = sErrorMessage + tr ( "
        Do you want to open the ASIO driver setups?" ); + sErrorMessage = sErrorMessage + "
        " + tr ( "Do you want to open the ASIO driver setups?" ); if ( QMessageBox::Yes == QMessageBox::information ( nullptr, APP_NAME, sErrorMessage, QMessageBox::Yes|QMessageBox::No ) ) { diff --git a/src/soundbase.h b/src/soundbase.h index 2a3bb6d2..f11d434c 100755 --- a/src/soundbase.h +++ b/src/soundbase.h @@ -51,8 +51,7 @@ public: const bool bNewIsCallbackAudioInterface, void (*fpNewProcessCallback) ( CVector& psData, void* pParg ), void* pParg, - const int iNewCtrlMIDIChannel, - const bool bNewNoAutoJackConnect ); + const int iNewCtrlMIDIChannel ); virtual int Init ( const int iNewPrefMonoBufferSize ); virtual void Start(); @@ -98,6 +97,27 @@ protected: virtual void UnloadCurrentDriver() {} QVector LoadAndInitializeFirstValidDriver ( const bool bOpenDriverSetup = false ); + static void GetSelCHAndAddCH ( const int iSelCH, const int iNumInChan, + int& iSelCHOut, int& iSelAddCHOut ) + { + // we have a mixed channel setup, definitions: + // - mixed channel setup only for 4 physical inputs: + // SelCH == 4: Ch 0 + Ch 2 + // SelCh == 5: Ch 0 + Ch 3 + // SelCh == 6: Ch 1 + Ch 2 + // SelCh == 7: Ch 1 + Ch 3 + if ( iSelCH >= iNumInChan ) + { + iSelAddCHOut = ( ( iSelCH - iNumInChan ) % 2 ) + 2; + iSelCHOut = ( iSelCH - iNumInChan ) / 2; + } + else + { + iSelAddCHOut = -1; // set it to an invalid number + iSelCHOut = iSelCH; + } + } + // function pointer to callback function void (*fpProcessCallback) ( CVector& psData, void* arg ); void* pProcessCallbackArg; @@ -121,7 +141,6 @@ protected: bool bIsCallbackAudioInterface; QString strSystemDriverTechniqueName; int iCtrlMIDIChannel; - bool bNoAutoJackConnect; CVector vecsAudioSndCrdStereo; diff --git a/src/util.cpp b/src/util.cpp index d7d6bc7e..44ceb1fd 100755 --- a/src/util.cpp +++ b/src/util.cpp @@ -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 ( - "

        " // general description of software - "" + tr ( "The " ) + APP_NAME + + // general description of software + txvAbout->setText ( + "

        " + 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." ) + "
        " + 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." ) + "


        " + "to each client." ) + "

        " "

        " // 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,48 @@ 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" - "


        " - "

        " + APP_NAME + // libraries used by this compilation + "

        " ); + + // libraries used by this compilation + txvLibraries->setText ( APP_NAME + tr ( " uses the following libraries, resources or code snippets:" ) + - "

        " - "" - "We would like to acknowledge the contributors listed in the " - "Github Contributors list" - "
        "); + "

        " + tr ( "Qt cross-platform application framework" ) + + ", http://www.qt.io

        " + "

        Opus Interactive Audio Codec" + ", http://www.opus-codec.org

        " + "

        " + tr ( "Audio reverberation code by Perry R. Cook and Gary P. Scavone" ) + + ", 1995 - 2004, " + "The Synthesis ToolKit in C++ (STK)

        " + "

        " + tr ( "Some pixmaps are from the" ) + " Open Clip Art Library (OCAL), " + "http://openclipart.org

        " + "

        " + tr ( "Country flag icons from Mark James" ) + + ", http://www.famfamfam.com

        " ); + + // contributors list + txvContributors->setText ( + "

        Peter L. Jones (pljones)

        " + "

        Jonathan Baker-Bates (gilgongo)

        " + "

        Daniele Masato (doloopuntil)

        " + "

        Simon Tomlinson (sthenos)

        " + "

        Marc jr. Landolt (braindef)

        " + "

        Olivier Humbert (trebmuh)

        " + "

        mirabilos (mirabilos)

        " + "

        newlaurent62 (newlaurent62)

        " + "

        Emlyn Bolton (emlynmac)

        " + "

        Jos van den Oever (vandenoever)

        " + "

        Tormod Volden (tormodvolden)

        " + "

        Stanislas Michalak (stanislas-m)

        " + "
        " + tr ( "For details on the contributions check out the " ) + + "" + tr ( "Github Contributors list" ) + "." ); + + // translators + txvTranslation->setText ( + "

        Spanish

        " + "

        Daryl Hanlon (ignotus666)

        " + "

        French

        " + "

        Olivier Humbert (trebmuh)

        " + "

        Portuguese

        " + "

        Miguel de Matos (Snayler)

        " ); // set version number in about dialog lblVersion->setText ( GetVersionAndNameStr() ); @@ -406,7 +425,7 @@ QString CAboutDlg::GetVersionAndNameStr ( const bool bWithHtml ) // name, short description and GPL hint if ( bWithHtml ) { - strVersionText += "
        "; + strVersionText += ""; } else { @@ -424,24 +443,14 @@ QString CAboutDlg::GetVersionAndNameStr ( const bool bWithHtml ) strVersionText += "\n *** "; } - strVersionText += tr ( "Internet Jam Session Software" ); - - if ( bWithHtml ) - { - strVersionText += "
        "; - } - else + if ( !bWithHtml ) { + strVersionText += tr ( "Internet Jam Session Software" ); strVersionText += "\n *** "; } strVersionText += tr ( "Under the GNU General Public License (GPL)" ); - if ( bWithHtml ) - { - strVersionText += "
        "; - } - return strVersionText; } @@ -462,9 +471,9 @@ CLicenceDlg::CLicenceDlg ( QWidget* parent ) : QDialog ( parent ) QVBoxLayout* pLayout = new QVBoxLayout ( this ); QHBoxLayout* pSubLayout = new QHBoxLayout; QTextBrowser* txvLicence = new QTextBrowser ( this ); - QCheckBox* chbAgree = new QCheckBox ( "I &agree to the above licence terms", this ); - butAccept = new QPushButton ( "Accept", this ); - QPushButton* butDecline = new QPushButton ( "Decline", this ); + QCheckBox* chbAgree = new QCheckBox ( tr ( "I &agree to the above licence terms" ), this ); + butAccept = new QPushButton ( tr ( "Accept" ), this ); + QPushButton* butDecline = new QPushButton ( tr ( "Decline" ), this ); pSubLayout->addStretch(); pSubLayout->addWidget ( chbAgree ); @@ -486,10 +495,10 @@ CLicenceDlg::CLicenceDlg ( QWidget* parent ) : QDialog ( parent ) "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 " + "License (for more information on this license, see " ) + "" - "http://creativecommons.org/licenses/by-nc-sa/4.0):" ) + "

        " + - "

        Attribution-NonCommercial-ShareAlike 4.0

        " + + "http://creativecommons.org/licenses/by-nc-sa/4.0):

        " + "

        Attribution-NonCommercial-ShareAlike 4.0

        " "

        " + tr ( "You are free to:" ) + "

          " "
        • " + tr ( "Share" ) + " - " + @@ -539,22 +548,22 @@ CMusProfDlg::CMusProfDlg ( CClient* pNCliP, - label with combo box for skill level - OK button */ - setWindowTitle ( "Musician Profile" ); + setWindowTitle ( tr ( "Musician Profile" ) ); setWindowIcon ( QIcon ( QString::fromUtf8 ( ":/png/main/res/fronticon.png" ) ) ); QVBoxLayout* pLayout = new QVBoxLayout ( this ); QHBoxLayout* pButSubLayout = new QHBoxLayout; - QLabel* plblAlias = new QLabel ( "Alias/Name", this ); + QLabel* plblAlias = new QLabel ( tr ( "Alias/Name" ), this ); pedtAlias = new QLineEdit ( this ); - QLabel* plblInstrument = new QLabel ( "Instrument", this ); + QLabel* plblInstrument = new QLabel ( tr ( "Instrument" ), this ); pcbxInstrument = new QComboBox ( this ); - QLabel* plblCountry = new QLabel ( "Country", this ); + QLabel* plblCountry = new QLabel ( tr ( "Country" ), this ); pcbxCountry = new QComboBox ( this ); - QLabel* plblCity = new QLabel ( "City", this ); + QLabel* plblCity = new QLabel ( tr ( "City" ), this ); pedtCity = new QLineEdit ( this ); - QLabel* plblSkill = new QLabel ( "Skill", this ); + QLabel* plblSkill = new QLabel ( tr ( "Skill" ), this ); pcbxSkill = new QComboBox ( this ); - QPushButton* butClose = new QPushButton ( "&Close", this ); + QPushButton* butClose = new QPushButton ( tr ( "&Close" ), this ); QGridLayout* pGridLayout = new QGridLayout; plblAlias->setSizePolicy ( QSizePolicy::Minimum, QSizePolicy::Expanding ); @@ -592,13 +601,31 @@ CMusProfDlg::CMusProfDlg ( CClient* pNCliP, // add an entry for all known instruments for ( int iCurInst = 0; iCurInst < CInstPictures::GetNumAvailableInst(); iCurInst++ ) { - // create a combo box item with text and image - pcbxInstrument->addItem ( - QIcon ( CInstPictures::GetResourceReference ( iCurInst ) ), - CInstPictures::GetName ( iCurInst ), - iCurInst ); + // create a combo box item with text, image and background color + QColor InstrColor; + + pcbxInstrument->addItem ( QIcon ( CInstPictures::GetResourceReference ( iCurInst ) ), + CInstPictures::GetName ( iCurInst ), + iCurInst ); + + switch ( CInstPictures::GetCategory ( iCurInst ) ) + { + case CInstPictures::IC_OTHER_INSTRUMENT: InstrColor = QColor ( Qt::blue ); break; + case CInstPictures::IC_WIND_INSTRUMENT: InstrColor = QColor ( Qt::green ); break; + case CInstPictures::IC_STRING_INSTRUMENT: InstrColor = QColor ( Qt::red ); break; + case CInstPictures::IC_PLUCKING_INSTRUMENT: InstrColor = QColor ( Qt::cyan ); break; + case CInstPictures::IC_PERCUSSION_INSTRUMENT: InstrColor = QColor ( Qt::white ); break; + case CInstPictures::IC_KEYBOARD_INSTRUMENT: InstrColor = QColor ( Qt::yellow ); break; + case CInstPictures::IC_MULTIPLE_INSTRUMENT: InstrColor = QColor ( Qt::black ); break; + } + + InstrColor.setAlpha ( 10 ); + pcbxInstrument->setItemData ( iCurInst, InstrColor, Qt::BackgroundRole ); } + // sort the items in alphabetical order + pcbxInstrument->model()->sort ( 0 ); + // Country flag icons combo box -------------------------------------------- // add an entry for all known country flags @@ -609,8 +636,7 @@ CMusProfDlg::CMusProfDlg ( CClient* pNCliP, if ( static_cast ( iCurCntry ) != QLocale::AnyCountry ) { // get current country enum - QLocale::Country eCountry = - static_cast ( iCurCntry ); + QLocale::Country eCountry = static_cast ( iCurCntry ); // try to load icon from resource file name QIcon CurFlagIcon; @@ -635,7 +661,7 @@ CMusProfDlg::CMusProfDlg ( CClient* pNCliP, FlagNoneIcon.addFile ( ":/png/flags/res/flags/flagnone.png" ); pcbxCountry->insertItem ( 0, FlagNoneIcon, - "None", + tr ( "None" ), static_cast ( QLocale::AnyCountry ) ); @@ -647,35 +673,35 @@ CMusProfDlg::CMusProfDlg ( CClient* pNCliP, RGBCOL_G_SL_NOT_SET, RGBCOL_B_SL_NOT_SET ) ); - pcbxSkill->addItem ( QIcon ( SLPixmap ), "None", SL_NOT_SET ); + pcbxSkill->addItem ( QIcon ( SLPixmap ), tr ( "None" ), SL_NOT_SET ); SLPixmap.fill ( QColor::fromRgb ( RGBCOL_R_SL_BEGINNER, RGBCOL_G_SL_BEGINNER, RGBCOL_B_SL_BEGINNER ) ); - pcbxSkill->addItem ( QIcon ( SLPixmap ), "Beginner", SL_BEGINNER ); + pcbxSkill->addItem ( QIcon ( SLPixmap ), tr ( "Beginner" ), SL_BEGINNER ); SLPixmap.fill ( QColor::fromRgb ( RGBCOL_R_SL_INTERMEDIATE, RGBCOL_G_SL_INTERMEDIATE, RGBCOL_B_SL_INTERMEDIATE ) ); - pcbxSkill->addItem ( QIcon ( SLPixmap ), "Intermediate", SL_INTERMEDIATE ); + pcbxSkill->addItem ( QIcon ( SLPixmap ), tr ( "Intermediate" ), SL_INTERMEDIATE ); SLPixmap.fill ( QColor::fromRgb ( RGBCOL_R_SL_SL_PROFESSIONAL, RGBCOL_G_SL_SL_PROFESSIONAL, RGBCOL_B_SL_SL_PROFESSIONAL ) ); - pcbxSkill->addItem ( QIcon ( SLPixmap ), "Expert", SL_PROFESSIONAL ); + pcbxSkill->addItem ( QIcon ( SLPixmap ), tr ( "Expert" ), SL_PROFESSIONAL ); // Add help text to controls ----------------------------------------------- // fader tag - QString strFaderTag = tr ( "Musician Profile: Set your name " - "or an alias here so that the other musicians you want to play with " + QString strFaderTag = "" + tr ( "Musician Profile" ) + ": " + tr ( + "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.\n" + "may also be added." ) + "
          " + tr ( "What you set here will appear at your fader on the mixer board when " "you are connected to a " ) + APP_NAME + tr ( " server. This tag will " "also show up at each client which is connected to the same server as " @@ -806,16 +832,20 @@ void CMusProfDlg::OnSkillActivated ( int iCntryListItem ) // Help menu ------------------------------------------------------------------- -CHelpMenu::CHelpMenu ( QWidget* parent ) : QMenu ( "&?", parent ) +CHelpMenu::CHelpMenu ( const bool bIsClient, QWidget* parent ) : QMenu ( tr ( "&Help" ), parent ) { // standard help menu consists of about and what's this help - addAction ( tr ( "What's &This" ), this, - SLOT ( OnHelpWhatsThis() ), QKeySequence ( Qt::SHIFT + Qt::Key_F1 ) ); - + if ( bIsClient ) + { + addAction ( tr ( "Getting &Started..." ), this, SLOT ( OnHelpClientGetStarted() ) ); + addAction ( tr ( "Software &Manual..." ), this, SLOT ( OnHelpSoftwareMan() ) ); + } + else + { + addAction ( tr ( "Getting &Started..." ), this, SLOT ( OnHelpServerGetStarted() ) ); + } addSeparator(); - addAction ( tr ( "&Download Link..." ), this, - SLOT ( OnHelpDownloadLink() ) ); - + addAction ( tr ( "What's &This" ), this, SLOT ( OnHelpWhatsThis() ), QKeySequence ( Qt::SHIFT + Qt::Key_F1 ) ); addSeparator(); addAction ( tr ( "&About..." ), this, SLOT ( OnHelpAbout() ) ); } @@ -935,35 +965,41 @@ CVector& CInstPictures::GetTable() // instrument picture data base initialization // NOTE: Do not change the order of any instrument in the future! // NOTE: The very first entry is the "not used" element per definition. - vecDataBase.Add ( CInstPictProps ( "None", ":/png/instr/res/instruments/instrnone.png", IC_OTHER_INSTRUMENT ) ); // special first element - vecDataBase.Add ( CInstPictProps ( "Drum Set", ":/png/instr/res/instruments/instrdrumset.png", IC_PERCUSSION_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Djembe", ":/png/instr/res/instruments/instrdjembe.png", IC_PERCUSSION_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Electric Guitar", ":/png/instr/res/instruments/instreguitar.png", IC_PLUCKING_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Acoustic Guitar", ":/png/instr/res/instruments/instraguitar.png", IC_PLUCKING_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Bass Guitar", ":/png/instr/res/instruments/instrbassguitar.png", IC_PLUCKING_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Keyboard", ":/png/instr/res/instruments/instrkeyboard.png", IC_KEYBOARD_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Synthesizer", ":/png/instr/res/instruments/instrsynthesizer.png", IC_KEYBOARD_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Grand Piano", ":/png/instr/res/instruments/instrgrandpiano.png", IC_KEYBOARD_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Accordion", ":/png/instr/res/instruments/instraccordeon.png", IC_KEYBOARD_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Vocal", ":/png/instr/res/instruments/instrvocal.png", IC_OTHER_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Microphone", ":/png/instr/res/instruments/instrmicrophone.png", IC_OTHER_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Harmonica", ":/png/instr/res/instruments/instrharmonica.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Trumpet", ":/png/instr/res/instruments/instrtrumpet.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Trombone", ":/png/instr/res/instruments/instrtrombone.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "French Horn", ":/png/instr/res/instruments/instrfrenchhorn.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Tuba", ":/png/instr/res/instruments/instrtuba.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Saxophone", ":/png/instr/res/instruments/instrsaxophone.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Clarinet", ":/png/instr/res/instruments/instrclarinet.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Flute", ":/png/instr/res/instruments/instrflute.png", IC_WIND_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Violin", ":/png/instr/res/instruments/instrviolin.png", IC_STRING_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Cello", ":/png/instr/res/instruments/instrcello.png", IC_STRING_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Double Bass", ":/png/instr/res/instruments/instrdoublebass.png", IC_STRING_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Recorder", ":/png/instr/res/instruments/instrrecorder.png", IC_OTHER_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Streamer", ":/png/instr/res/instruments/instrstreamer.png", IC_OTHER_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Listener", ":/png/instr/res/instruments/instrlistener.png", IC_OTHER_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Guitar+Vocal", ":/png/instr/res/instruments/instrguitarvocal.png", IC_MULTIPLE_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Keyboard+Vocal", ":/png/instr/res/instruments/instrkeyboardvocal.png", IC_MULTIPLE_INSTRUMENT ) ); - vecDataBase.Add ( CInstPictProps ( "Bodhran", ":/png/instr/res/instruments/bodhran.png", IC_PERCUSSION_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "None" ), ":/png/instr/res/instruments/instrnone.png", IC_OTHER_INSTRUMENT ) ); // special first element + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Drum Set" ), ":/png/instr/res/instruments/instrdrumset.png", IC_PERCUSSION_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Djembe" ), ":/png/instr/res/instruments/instrdjembe.png", IC_PERCUSSION_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Electric Guitar" ), ":/png/instr/res/instruments/instreguitar.png", IC_PLUCKING_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Acoustic Guitar" ), ":/png/instr/res/instruments/instraguitar.png", IC_PLUCKING_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bass Guitar" ), ":/png/instr/res/instruments/instrbassguitar.png", IC_PLUCKING_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Keyboard" ), ":/png/instr/res/instruments/instrkeyboard.png", IC_KEYBOARD_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Synthesizer" ), ":/png/instr/res/instruments/instrsynthesizer.png", IC_KEYBOARD_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Grand Piano" ), ":/png/instr/res/instruments/instrgrandpiano.png", IC_KEYBOARD_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Accordion" ), ":/png/instr/res/instruments/instraccordeon.png", IC_KEYBOARD_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Vocal" ), ":/png/instr/res/instruments/instrvocal.png", IC_OTHER_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Microphone" ), ":/png/instr/res/instruments/instrmicrophone.png", IC_OTHER_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Harmonica" ), ":/png/instr/res/instruments/instrharmonica.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Trumpet" ), ":/png/instr/res/instruments/instrtrumpet.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Trombone" ), ":/png/instr/res/instruments/instrtrombone.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "French Horn" ), ":/png/instr/res/instruments/instrfrenchhorn.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Tuba" ), ":/png/instr/res/instruments/instrtuba.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Saxophone" ), ":/png/instr/res/instruments/instrsaxophone.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Clarinet" ), ":/png/instr/res/instruments/instrclarinet.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Flute" ), ":/png/instr/res/instruments/instrflute.png", IC_WIND_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Violin" ), ":/png/instr/res/instruments/instrviolin.png", IC_STRING_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Cello" ), ":/png/instr/res/instruments/instrcello.png", IC_STRING_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Double Bass" ), ":/png/instr/res/instruments/instrdoublebass.png", IC_STRING_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Recorder" ), ":/png/instr/res/instruments/instrrecorder.png", IC_OTHER_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Streamer" ), ":/png/instr/res/instruments/instrstreamer.png", IC_OTHER_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Listener" ), ":/png/instr/res/instruments/instrlistener.png", IC_OTHER_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Guitar+Vocal" ), ":/png/instr/res/instruments/instrguitarvocal.png", IC_MULTIPLE_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Keyboard+Vocal" ), ":/png/instr/res/instruments/instrkeyboardvocal.png", IC_MULTIPLE_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bodhran" ), ":/png/instr/res/instruments/bodhran.png", IC_PERCUSSION_INSTRUMENT ) ); + vecDataBase.Add ( CInstPictProps ( QCoreApplication::translate ( "CMusProfDlg", "Bassoon" ), ":/png/instr/res/instruments/bassoon.png", IC_WIND_INSTRUMENT ) ); + 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; @@ -1006,6 +1042,20 @@ QString CInstPictures::GetName ( const int iInstrument ) } } +CInstPictures::EInstCategory CInstPictures::GetCategory ( const int iInstrument ) +{ + // range check + if ( IsInstIndexInRange ( iInstrument ) ) + { + // return the name of the instrument + return GetTable()[iInstrument].eInstCategory; + } + else + { + return IC_OTHER_INSTRUMENT; + } +} + // Locale management class ----------------------------------------------------- QString CLocale::GetCountryFlagIconsResourceReference ( const QLocale::Country eCountry ) diff --git a/src/util.h b/src/util.h index 99fff348..3c688f59 100755 --- a/src/util.h +++ b/src/util.h @@ -473,16 +473,17 @@ class CHelpMenu : public QMenu Q_OBJECT public: - CHelpMenu ( QWidget* parent = nullptr ); + CHelpMenu ( const bool bIsClient, QWidget* parent = nullptr ); protected: CAboutDlg AboutDlg; public slots: - void OnHelpWhatsThis() { QWhatsThis::enterWhatsThisMode(); } - void OnHelpAbout() { AboutDlg.exec(); } - void OnHelpDownloadLink() - { QDesktopServices::openUrl ( QUrl ( SOFTWARE_DOWNLOAD_URL ) ); } + void OnHelpWhatsThis() { QWhatsThis::enterWhatsThisMode(); } + void OnHelpAbout() { AboutDlg.exec(); } + void OnHelpClientGetStarted() { QDesktopServices::openUrl ( QUrl ( CLIENT_GETTING_STARTED_URL ) ); } + void OnHelpServerGetStarted() { QDesktopServices::openUrl ( QUrl ( SERVER_GETTING_STARTED_URL ) ); } + void OnHelpSoftwareMan() { QDesktopServices::openUrl ( QUrl ( SOFTWARE_MANUAL_URL ) ); } }; @@ -589,28 +590,28 @@ inline QString svrRegStatusToString ( ESvrRegStatus eSvrRegStatus ) switch ( eSvrRegStatus ) { case SRS_UNREGISTERED: - return "Unregistered"; + return QCoreApplication::translate ( "CServerDlg", "Unregistered" ); case SRS_BAD_ADDRESS: - return "Bad address"; + return QCoreApplication::translate ( "CServerDlg", "Bad address" ); case SRS_REQUESTED: - return "Registration requested"; + return QCoreApplication::translate ( "CServerDlg", "Registration requested" ); case SRS_TIME_OUT: - return "Registration failed"; + return QCoreApplication::translate ( "CServerDlg", "Registration failed" ); case SRS_UNKNOWN_RESP: - return "Check server version"; + return QCoreApplication::translate ( "CServerDlg", "Check server version" ); case SRS_REGISTERED: - return "Registered"; + return QCoreApplication::translate ( "CServerDlg", "Registered" ); case SRS_CENTRAL_SVR_FULL: - return "Central Server full"; + return QCoreApplication::translate ( "CServerDlg", "Central Server full" ); } - return QString ( "Unknown value " ).append ( eSvrRegStatus ); + return QString ( QCoreApplication::translate ( "CServerDlg", "Unknown value " ) ).append ( eSvrRegStatus ); } @@ -657,7 +658,7 @@ public: void Update ( const CVector& vecsAudio ); double MicLeveldBLeft() { return CalcLogResult ( dCurLevelL ); } double MicLeveldBRight() { return CalcLogResult ( dCurLevelR ); } - static double CalcLogResult ( const double& dLinearLevel ); + static double CalcLogResult ( const double& dLinearLevel ); void Reset() { @@ -761,9 +762,10 @@ public: static int GetNotUsedInstrument() { return 0; } static bool IsNotUsedInstrument ( const int iInstrument ) { return iInstrument == 0; } - static int GetNumAvailableInst() { return GetTable().Size(); } - static QString GetResourceReference ( const int iInstrument ); - static QString GetName ( const int iInstrument ); + static int GetNumAvailableInst() { return GetTable().Size(); } + static QString GetResourceReference ( const int iInstrument ); + static QString GetName ( const int iInstrument ); + static EInstCategory GetCategory ( const int iInstrument ); // TODO make use of instrument category (not yet implemented) diff --git a/windows/sound.cpp b/windows/sound.cpp index 65e9006f..19b44360 100755 --- a/windows/sound.cpp +++ b/windows/sound.cpp @@ -483,11 +483,12 @@ void CSound::Stop() } } -CSound::CSound ( void (*fpNewCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect) : - CSoundBase ( "ASIO", true, fpNewCallback, arg, iCtrlMIDIChannel, bNoAutoJackConnect ), +CSound::CSound ( void (*fpNewCallback) ( CVector& psData, void* arg ), + void* arg, + const int iCtrlMIDIChannel, + const bool , + const QString& ) : + CSoundBase ( "ASIO", true, fpNewCallback, arg, iCtrlMIDIChannel ), lNumInChan ( 0 ), lNumInChanPlusAddChan ( 0 ), lNumOutChan ( 0 ), @@ -514,9 +515,9 @@ CSound::CSound ( void (*fpNewCallback) ( CVector& psData, void* a // in case we do not have a driver available, throw error if ( lNumDevs == 0 ) { - throw CGenErr ( tr ( "No ASIO audio device (driver) found.

          " - "The " ) + APP_NAME + tr ( " software requires the low latency audio " - "interface ASIO to work properly. This is no standard " + throw CGenErr ( "" + tr ( "No ASIO audio device (driver) found." ) + "

          " + + tr ( "The " ) + APP_NAME + tr ( " 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 " diff --git a/windows/sound.h b/windows/sound.h index 5f6d96a7..46e078e7 100755 --- a/windows/sound.h +++ b/windows/sound.h @@ -46,10 +46,12 @@ class CSound : public CSoundBase { public: - CSound ( void (*fpNewCallback) ( CVector& psData, void* arg ), - void* arg, - const int iCtrlMIDIChannel, - const bool bNoAutoJackConnect ); + CSound ( void (*fpNewCallback) ( CVector& psData, void* arg ), + void* arg, + const int iCtrlMIDIChannel, + const bool , + const QString& ); + virtual ~CSound() { UnloadCurrentDriver(); } virtual int Init ( const int iNewPrefMonoBufferSize ); @@ -85,28 +87,6 @@ protected: bool CheckSampleTypeSupportedForCHMixing ( const ASIOSampleType SamType ); void ResetChannelMapping(); - static void GetSelCHAndAddCH ( const int iSelCH, const int iNumInChan, - int& iSelCHOut, int& iSelAddCHOut ) - { - // we have a mixed channel setup - // definitions: - // - mixed channel setup only for 4 physical inputs: - // SelCH == 4: Ch 0 + Ch 2 - // SelCh == 5: Ch 0 + Ch 3 - // SelCh == 6: Ch 1 + Ch 2 - // SelCh == 7: Ch 1 + Ch 3 - if ( iSelCH >= iNumInChan ) - { - iSelAddCHOut = ( ( iSelCH - iNumInChan ) % 2 ) + 2; - iSelCHOut = ( iSelCH - iNumInChan ) / 2; - } - else - { - iSelAddCHOut = -1; - iSelCHOut = iSelCH; - } - } - int iASIOBufferSizeMono; int iASIOBufferSizeStereo;