Hello community, here is the log from the commit of package Jamulus for openSUSE:Factory checked in at 2019-04-23 14:35:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/Jamulus (Old) and /work/SRC/openSUSE:Factory/.Jamulus.new.5536 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "Jamulus" Tue Apr 23 14:35:55 2019 rev:3 rq:696757 version:3.4.3 Changes: -------- --- /work/SRC/openSUSE:Factory/Jamulus/Jamulus.changes 2018-03-19 23:38:11.817745661 +0100 +++ /work/SRC/openSUSE:Factory/.Jamulus.new.5536/Jamulus.changes 2019-04-23 14:35:57.877469038 +0200 @@ -1,0 +2,7 @@ +Mon Apr 22 11:58:26 UTC 2019 - Luigi Baldoni <[email protected]> + +- Update to version 3.4.3 + * for ASIO and 4 channel input, support mixing channels 1&2 + with 3&4 + +------------------------------------------------------------------- Old: ---- Jamulus-3.4.2.tar.gz New: ---- Jamulus-3.4.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ Jamulus.spec ++++++ --- /var/tmp/diff_new_pack.thoGQa/_old 2019-04-23 14:35:58.477469462 +0200 +++ /var/tmp/diff_new_pack.thoGQa/_new 2019-04-23 14:35:58.477469462 +0200 @@ -1,7 +1,7 @@ # # spec file for package Jamulus # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2014 Pascal Bleser <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -13,15 +13,15 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: Jamulus -Version: 3.4.2 +Version: 3.4.3 Release: 0 Summary: Low-latency internet connection tool for real-time jam sessions -License: GPL-2.0+ +License: GPL-2.0-or-later Group: Productivity/Multimedia/Sound/Utilities URL: http://llcon.sourceforge.net/index.html Source0: https://sourceforge.net/projects/llcon/files/Jamulus/%{version}/Jamulus-%{version}.tar.gz ++++++ Jamulus-3.4.2.tar.gz -> Jamulus-3.4.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/ChangeLog new/Jamulus3.4.3/ChangeLog --- old/Jamulus3.4.2/ChangeLog 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/ChangeLog 2018-05-17 19:39:34.000000000 +0200 @@ -1,10 +1,21 @@ + + + + +3.4.3 (2018-05-17) + +- for ASIO and 4 channel input, support mixing channels 1&2 with 3&4 + +- bug fix: fixed a crash, running Jamulus on MacOS version "High Sierra" + + 3.4.2 (2017-08-11) - removed old CELT library (minimum compatible version is now 3.3.1) - show server name in the server list in bold font if it is a permanent server -- Jack can be used instead of CoreAudio on MacOs (using qmake "CONFIG+=jackonmac") +- Jack can be used instead of CoreAudio on MacOS (using qmake "CONFIG+=jackonmac") 3.4.1 (2016-02-10) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/INSTALL new/Jamulus3.4.3/INSTALL --- old/Jamulus3.4.2/INSTALL 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/INSTALL 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/Jamulus.pro new/Jamulus3.4.3/Jamulus.pro --- old/Jamulus3.4.2/Jamulus.pro 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/Jamulus.pro 2018-05-17 19:39:34.000000000 +0200 @@ -1,4 +1,4 @@ -VERSION = 3.4.2 +VERSION = 3.4.3 # use target name which does not use a captital letter at the beginning contains(CONFIG, "noupcasename") { @@ -44,6 +44,25 @@ advapi32.lib \ winmm.lib \ ws2_32.lib + + # replace ASIO with jack if requested + contains(CONFIG, "jackonwindows") { + message(Using Jack instead of ASIO.) + + !exists("C:/Program Files (x86)/Jack/includes/jack/jack.h") { + message(Warning: jack.h was not found at the usual place, maybe jack is not installed) + } + + HEADERS -= windows/sound.h + SOURCES -= windows/sound.cpp + HEADERS += linux/sound.h + SOURCES += linux/sound.cpp + DEFINES += WITH_SOUND + DEFINES += JACK_REPLACES_ASIO + DEFINES += _STDINT_H # supposed to solve compilation error in systemdeps.h + INCLUDEPATH += "C:/Program Files (x86)/Jack/includes" + LIBS += "C:/Program Files (x86)/Jack/lib/libjack64.lib" + } } else:macx { QT += macextras HEADERS += mac/sound.h diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/README new/Jamulus3.4.3/README --- old/Jamulus3.4.2/README 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/README 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/android/sound.cpp new/Jamulus3.4.3/android/sound.cpp --- old/Jamulus3.4.2/android/sound.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/android/sound.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/android/sound.h new/Jamulus3.4.3/android/sound.h --- old/Jamulus3.4.2/android/sound.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/android/sound.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/linux/sound.cpp new/Jamulus3.4.3/linux/sound.cpp --- old/Jamulus3.4.2/linux/sound.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/linux/sound.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/linux/sound.h new/Jamulus3.4.3/linux/sound.h --- old/Jamulus3.4.2/linux/sound.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/linux/sound.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -25,10 +25,12 @@ #if !defined(_SOUND_H__9518A621345F78_3634567_8C0D_EEBF182CF549__INCLUDED_) #define _SOUND_H__9518A621345F78_3634567_8C0D_EEBF182CF549__INCLUDED_ -#include <unistd.h> +#ifndef JACK_REPLACES_ASIO // these headers are not available in Windows OS +# include <unistd.h> +# include <sys/ioctl.h> +#endif #include <fcntl.h> #include <sys/types.h> -#include <sys/ioctl.h> #include <stdlib.h> #include <stdio.h> #include <QThread> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/mac/sound.cpp new/Jamulus3.4.3/mac/sound.cpp --- old/Jamulus3.4.2/mac/sound.cpp 2017-08-11 14:25:05.000000000 +0200 +++ new/Jamulus3.4.3/mac/sound.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -161,6 +161,12 @@ lCurDev = INVALID_SNC_CARD_DEVICE; CurrentAudioInputDeviceID = 0; CurrentAudioOutputDeviceID = 0; + iNumInChan = 0; + iNumOutChan = 0; + iSelInputLeftChannel = 0; + iSelInputRightChannel = 0; + iSelOutputLeftChannel = 0; + iSelOutputRightChannel = 0; } void CSound::GetAudioDeviceInfos ( const AudioDeviceID DeviceID, @@ -771,6 +777,23 @@ // 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] ); +} +*/ + + } } else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/mac/sound.h new/Jamulus3.4.3/mac/sound.h --- old/Jamulus3.4.2/mac/sound.h 2017-08-11 14:25:05.000000000 +0200 +++ new/Jamulus3.4.3/mac/sound.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/aboutdlgbase.ui new/Jamulus3.4.3/src/aboutdlgbase.ui --- old/Jamulus3.4.2/src/aboutdlgbase.ui 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/aboutdlgbase.ui 2018-05-17 19:39:34.000000000 +0200 @@ -135,7 +135,7 @@ <item> <widget class="QLabel" name="lblCopyright"> <property name="text"> - <string>Copyright (C) 2005-2016</string> + <string>Copyright (C) 2005-2018</string> </property> <property name="wordWrap"> <bool>false</bool> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/analyzerconsole.cpp new/Jamulus3.4.3/src/analyzerconsole.cpp --- old/Jamulus3.4.2/src/analyzerconsole.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/analyzerconsole.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/analyzerconsole.h new/Jamulus3.4.3/src/analyzerconsole.h --- old/Jamulus3.4.2/src/analyzerconsole.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/analyzerconsole.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/audiomixerboard.cpp new/Jamulus3.4.3/src/audiomixerboard.cpp --- old/Jamulus3.4.2/src/audiomixerboard.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/audiomixerboard.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/audiomixerboard.h new/Jamulus3.4.3/src/audiomixerboard.h --- old/Jamulus3.4.2/src/audiomixerboard.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/audiomixerboard.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/buffer.cpp new/Jamulus3.4.3/src/buffer.cpp --- old/Jamulus3.4.2/src/buffer.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/buffer.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/buffer.h new/Jamulus3.4.3/src/buffer.h --- old/Jamulus3.4.2/src/buffer.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/buffer.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/channel.cpp new/Jamulus3.4.3/src/channel.cpp --- old/Jamulus3.4.2/src/channel.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/channel.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/channel.h new/Jamulus3.4.3/src/channel.h --- old/Jamulus3.4.2/src/channel.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/channel.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/chatdlg.cpp new/Jamulus3.4.3/src/chatdlg.cpp --- old/Jamulus3.4.2/src/chatdlg.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/chatdlg.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/chatdlg.h new/Jamulus3.4.3/src/chatdlg.h --- old/Jamulus3.4.2/src/chatdlg.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/chatdlg.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/client.cpp new/Jamulus3.4.3/src/client.cpp --- old/Jamulus3.4.2/src/client.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/client.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/client.h new/Jamulus3.4.3/src/client.h --- old/Jamulus3.4.2/src/client.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/client.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -43,7 +43,7 @@ #ifdef LLCON_VST_PLUGIN # include "vstsound.h" #else -# ifdef _WIN32 +# if defined ( _WIN32 ) && !defined ( JACK_REPLACES_ASIO ) # include "../windows/sound.h" # else # if ( defined ( __APPLE__ ) || defined ( __MACOSX ) ) && !defined ( JACK_REPLACES_COREAUDIO ) @@ -53,9 +53,11 @@ # include "../android/sound.h" # else # include "../linux/sound.h" -# include <sched.h> +# ifndef JACK_REPLACES_ASIO // these headers are not available in Windows OS +# include <sched.h> +# include <netdb.h> +# endif # include <socket.h> -# include <netdb.h> # endif # endif # endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/clientdlg.cpp new/Jamulus3.4.3/src/clientdlg.cpp --- old/Jamulus3.4.2/src/clientdlg.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/clientdlg.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/clientdlg.h new/Jamulus3.4.3/src/clientdlg.h --- old/Jamulus3.4.2/src/clientdlg.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/clientdlg.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/clientsettingsdlg.cpp new/Jamulus3.4.3/src/clientsettingsdlg.cpp --- old/Jamulus3.4.2/src/clientsettingsdlg.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/clientsettingsdlg.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -542,8 +542,11 @@ cbxLInChan->addItem ( pClient->GetSndCrdInputChannelName ( iSndChanIdx ) ); cbxRInChan->addItem ( pClient->GetSndCrdInputChannelName ( iSndChanIdx ) ); } - cbxLInChan->setCurrentIndex ( pClient->GetSndCrdLeftInputChannel() ); - cbxRInChan->setCurrentIndex ( pClient->GetSndCrdRightInputChannel() ); + if ( pClient->GetSndCrdNumInputChannels() > 0 ) + { + cbxLInChan->setCurrentIndex ( pClient->GetSndCrdLeftInputChannel() ); + cbxRInChan->setCurrentIndex ( pClient->GetSndCrdRightInputChannel() ); + } // output cbxLOutChan->clear(); @@ -553,8 +556,11 @@ cbxLOutChan->addItem ( pClient->GetSndCrdOutputChannelName ( iSndChanIdx ) ); cbxROutChan->addItem ( pClient->GetSndCrdOutputChannelName ( iSndChanIdx ) ); } - cbxLOutChan->setCurrentIndex ( pClient->GetSndCrdLeftOutputChannel() ); - cbxROutChan->setCurrentIndex ( pClient->GetSndCrdRightOutputChannel() ); + if ( pClient->GetSndCrdNumOutputChannels() > 0 ) + { + cbxLOutChan->setCurrentIndex ( pClient->GetSndCrdLeftOutputChannel() ); + cbxROutChan->setCurrentIndex ( pClient->GetSndCrdRightOutputChannel() ); + } } #else // for other OS, no sound card channel selection is supported diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/clientsettingsdlg.h new/Jamulus3.4.3/src/clientsettingsdlg.h --- old/Jamulus3.4.2/src/clientsettingsdlg.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/clientsettingsdlg.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/connectdlg.cpp new/Jamulus3.4.3/src/connectdlg.cpp --- old/Jamulus3.4.2/src/connectdlg.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/connectdlg.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -88,9 +88,13 @@ lvwServers->setColumnWidth ( 0, 180 ); lvwServers->setColumnWidth ( 1, 65 ); lvwServers->setColumnWidth ( 2, 60 ); + lvwServers->setColumnWidth ( 3, 220 ); #endif lvwServers->clear(); + // make sure we do not get a too long horizontal scroll bar + lvwServers->header()->setStretchLastSection ( false ); + // add invisible columns which are used for sorting the list and storing // the current/maximum number of clients // 0: server name diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/connectdlg.h new/Jamulus3.4.3/src/connectdlg.h --- old/Jamulus3.4.2/src/connectdlg.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/connectdlg.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/global.h new/Jamulus3.4.3/src/global.h --- old/Jamulus3.4.2/src/global.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/global.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * \Copyright (c) 2004-2016 + * \Copyright (c) 2004-2018 * \author Volker Fischer * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/main.cpp new/Jamulus3.4.3/src/main.cpp --- old/Jamulus3.4.2/src/main.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/main.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/multicolorled.cpp new/Jamulus3.4.3/src/multicolorled.cpp --- old/Jamulus3.4.2/src/multicolorled.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/multicolorled.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/multicolorled.h new/Jamulus3.4.3/src/multicolorled.h --- old/Jamulus3.4.2/src/multicolorled.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/multicolorled.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/multicolorledbar.cpp new/Jamulus3.4.3/src/multicolorledbar.cpp --- old/Jamulus3.4.2/src/multicolorledbar.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/multicolorledbar.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/multicolorledbar.h new/Jamulus3.4.3/src/multicolorledbar.h --- old/Jamulus3.4.2/src/multicolorledbar.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/multicolorledbar.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/protocol.cpp new/Jamulus3.4.3/src/protocol.cpp --- old/Jamulus3.4.2/src/protocol.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/protocol.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/protocol.h new/Jamulus3.4.3/src/protocol.h --- old/Jamulus3.4.2/src/protocol.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/protocol.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/server.cpp new/Jamulus3.4.3/src/server.cpp --- old/Jamulus3.4.2/src/server.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/server.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/server.h new/Jamulus3.4.3/src/server.h --- old/Jamulus3.4.2/src/server.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/server.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/serverdlg.cpp new/Jamulus3.4.3/src/serverdlg.cpp --- old/Jamulus3.4.2/src/serverdlg.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/serverdlg.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/serverdlg.h new/Jamulus3.4.3/src/serverdlg.h --- old/Jamulus3.4.2/src/serverdlg.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/serverdlg.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/serverlist.cpp new/Jamulus3.4.3/src/serverlist.cpp --- old/Jamulus3.4.2/src/serverlist.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/serverlist.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/serverlist.h new/Jamulus3.4.3/src/serverlist.h --- old/Jamulus3.4.2/src/serverlist.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/serverlist.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/serverlogging.cpp new/Jamulus3.4.3/src/serverlogging.cpp --- old/Jamulus3.4.2/src/serverlogging.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/serverlogging.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/serverlogging.h new/Jamulus3.4.3/src/serverlogging.h --- old/Jamulus3.4.2/src/serverlogging.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/serverlogging.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/settings.cpp new/Jamulus3.4.3/src/settings.cpp --- old/Jamulus3.4.2/src/settings.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/settings.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/settings.h new/Jamulus3.4.3/src/settings.h --- old/Jamulus3.4.2/src/settings.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/settings.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/socket.cpp new/Jamulus3.4.3/src/socket.cpp --- old/Jamulus3.4.2/src/socket.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/socket.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -66,9 +66,9 @@ { UdpSocketInAddr.sin_port = htons ( iPortNumber + iClientPortIncrement ); - bSuccess = ( bind ( UdpSocket , - (sockaddr*) &UdpSocketInAddr, - sizeof ( sockaddr_in ) ) == 0 ); + bSuccess = ( ::bind ( UdpSocket , + (sockaddr*) &UdpSocketInAddr, + sizeof ( sockaddr_in ) ) == 0 ); iClientPortIncrement++; } @@ -80,9 +80,9 @@ // gets the desired port number UdpSocketInAddr.sin_port = htons ( iPortNumber ); - bSuccess = ( bind ( UdpSocket , - (sockaddr*) &UdpSocketInAddr, - sizeof ( sockaddr_in ) ) == 0 ); + bSuccess = ( ::bind ( UdpSocket , + (sockaddr*) &UdpSocketInAddr, + sizeof ( sockaddr_in ) ) == 0 ); } if ( !bSuccess ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/socket.h new/Jamulus3.4.3/src/socket.h --- old/Jamulus3.4.2/src/socket.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/socket.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/soundbase.cpp new/Jamulus3.4.3/src/soundbase.cpp --- old/Jamulus3.4.2/src/soundbase.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/soundbase.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/soundbase.h new/Jamulus3.4.3/src/soundbase.h --- old/Jamulus3.4.2/src/soundbase.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/soundbase.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/testbench.h new/Jamulus3.4.3/src/testbench.h --- old/Jamulus3.4.2/src/testbench.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/testbench.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/util.cpp new/Jamulus3.4.3/src/util.cpp --- old/Jamulus3.4.2/src/util.cpp 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/util.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/src/util.h new/Jamulus3.4.3/src/util.h --- old/Jamulus3.4.2/src/util.h 2017-08-11 14:25:06.000000000 +0200 +++ new/Jamulus3.4.3/src/util.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -139,7 +139,7 @@ const bool bDoAdding = true ); // this function simply converts the type of size to integer - inline int Size() const { return std::vector<TData>::size(); } + inline int Size() const { return static_cast<int> ( std::vector<TData>::size() ); } // This operator allows for a l-value assignment of this object: // CVector[x] = y is possible diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/windows/sound.cpp new/Jamulus3.4.3/windows/sound.cpp --- old/Jamulus3.4.2/windows/sound.cpp 2017-08-11 14:25:05.000000000 +0200 +++ new/Jamulus3.4.3/windows/sound.cpp 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -44,6 +44,7 @@ { // load driver loadAsioDriver ( cDriverNames[iDriverIdx] ); + if ( ASIOInit ( &driverInfo ) != ASE_OK ) { // clean up and return error string @@ -91,6 +92,7 @@ // check the sample rate const ASIOError CanSaRateReturn = ASIOCanSampleRate ( SYSTEM_SAMPLE_RATE_HZ ); + if ( ( CanSaRateReturn == ASE_NoClock ) || ( CanSaRateReturn == ASE_NotPresent ) ) { @@ -102,6 +104,7 @@ // check the number of available channels ASIOGetChannels ( &lNumInChan, &lNumOutChan ); + if ( ( lNumInChan < NUM_IN_OUT_CHANNELS ) || ( lNumOutChan < NUM_IN_OUT_CHANNELS ) ) { @@ -123,6 +126,8 @@ } // query channel infos for all available input channels + bool bInputChMixingSupported = true; + for ( int i = 0; i < lNumInChan; i++ ) { // setup for input channels @@ -142,6 +147,14 @@ // return error string return tr ( "Required audio sample format not available." ); } + + // store the name of the channel and check if channel mixing is supported + channelInputName[i] = channelInfosInput[i].name; + + if ( !CheckSampleTypeSupportedForCHMixing ( channelInfosInput[i].type ) ) + { + bInputChMixingSupported = false; + } } // query channel infos for all available output channels @@ -166,6 +179,32 @@ } } + // special case with 4 input channels: support adding channels + if ( ( lNumInChan == 4 ) && bInputChMixingSupported ) + { + // add four mixed channels (i.e. 4 normal, 4 mixed channels) + lNumInChanPlusAddChan = 8; + + for ( int iCh = 0; iCh < lNumInChanPlusAddChan; iCh++ ) + { + int iSelCH, iSelAddCH; + + GetSelCHAndAddCH ( iCh, lNumInChan, iSelCH, iSelAddCH ); + + if ( iSelAddCH >= 0 ) + { + // for mixed channels, show both audio channel names to be mixed + channelInputName[iCh] = + channelInputName[iSelCH] + " + " + channelInputName[iSelAddCH]; + } + } + } + else + { + // regular case: no mixing input channels used + lNumInChanPlusAddChan = lNumInChan; + } + // everything is ok, return empty string for "no error" case return ""; } @@ -173,8 +212,7 @@ void CSound::SetLeftInputChannel ( const int iNewChan ) { // apply parameter after input parameter check - if ( ( iNewChan >= 0 ) && ( iNewChan < lNumInChan ) && - ( iNewChan != vSelectedInputChannels[1] ) ) + if ( ( iNewChan >= 0 ) && ( iNewChan < lNumInChanPlusAddChan ) ) { vSelectedInputChannels[0] = iNewChan; } @@ -183,8 +221,7 @@ void CSound::SetRightInputChannel ( const int iNewChan ) { // apply parameter after input parameter check - if ( ( iNewChan >= 0 ) && ( iNewChan < lNumInChan ) && - ( iNewChan != vSelectedInputChannels[0] ) ) + if ( ( iNewChan >= 0 ) && ( iNewChan < lNumInChanPlusAddChan ) ) { vSelectedInputChannels[1] = iNewChan; } @@ -193,8 +230,7 @@ void CSound::SetLeftOutputChannel ( const int iNewChan ) { // apply parameter after input parameter check - if ( ( iNewChan >= 0 ) && ( iNewChan < lNumOutChan ) && - ( iNewChan != vSelectedOutputChannels[1] ) ) + if ( ( iNewChan >= 0 ) && ( iNewChan < lNumOutChan ) ) { vSelectedOutputChannels[0] = iNewChan; } @@ -203,8 +239,7 @@ void CSound::SetRightOutputChannel ( const int iNewChan ) { // apply parameter after input parameter check - if ( ( iNewChan >= 0 ) && ( iNewChan < lNumOutChan ) && - ( iNewChan != vSelectedOutputChannels[0] ) ) + if ( ( iNewChan >= 0 ) && ( iNewChan < lNumOutChan ) ) { vSelectedOutputChannels[1] = iNewChan; } @@ -323,8 +358,7 @@ { // get the actual sound card buffer size which is supported // by the audio hardware - iASIOBufferSizeMono = - GetActualBufferSize ( iNewPrefMonoBufferSize ); + iASIOBufferSizeMono = GetActualBufferSize ( iNewPrefMonoBufferSize ); // init base class CSoundBase::Init ( iASIOBufferSizeMono ); @@ -342,26 +376,26 @@ // dispose old buffers (if any) ASIODisposeBuffers(); - // init buffer infos, we always want to have two input and - // two output channels - for ( int i = 0; i < NUM_IN_OUT_CHANNELS; i++ ) + // prepare input channels + for ( int i = 0; i < lNumInChan; i++ ) { - // prepare input channels bufferInfos[i].isInput = ASIOTrue; - bufferInfos[i].channelNum = vSelectedInputChannels[i]; + bufferInfos[i].channelNum = i; bufferInfos[i].buffers[0] = 0; bufferInfos[i].buffers[1] = 0; + } - // prepare output channels - bufferInfos[NUM_IN_OUT_CHANNELS + i].isInput = ASIOFalse; - bufferInfos[NUM_IN_OUT_CHANNELS + i].channelNum = vSelectedOutputChannels[i]; - bufferInfos[NUM_IN_OUT_CHANNELS + i].buffers[0] = 0; - bufferInfos[NUM_IN_OUT_CHANNELS + i].buffers[1] = 0; + // prepare output channels + for ( int i = 0; i < lNumOutChan; i++ ) + { + bufferInfos[lNumInChan + i].isInput = ASIOFalse; + bufferInfos[lNumInChan + i].channelNum = i; + bufferInfos[lNumInChan + i].buffers[0] = 0; + bufferInfos[lNumInChan + i].buffers[1] = 0; } - ASIOCreateBuffers ( bufferInfos, - 2 /* in/out */ * NUM_IN_OUT_CHANNELS /* stereo */, - iASIOBufferSizeMono, &asioCallbacks ); + ASIOCreateBuffers ( bufferInfos, lNumInChan + lNumOutChan, + iASIOBufferSizeMono, &asioCallbacks ); // query the latency of the driver long lInputLatency = 0; @@ -420,6 +454,7 @@ vSelectedInputChannels ( NUM_IN_OUT_CHANNELS ), vSelectedOutputChannels ( NUM_IN_OUT_CHANNELS ), lNumInChan ( 0 ), + lNumInChanPlusAddChan ( 0 ), lNumOutChan ( 0 ), dInOutLatencyMs ( 0.0 ) // "0.0" means that no latency value is available { @@ -515,12 +550,20 @@ ( SamType == ASIOSTInt32MSB24 ) ); } +bool CSound::CheckSampleTypeSupportedForCHMixing ( const ASIOSampleType SamType ) +{ + // check for supported sample types for audio channel mixing (see bufferSwitch) + return ( ( SamType == ASIOSTInt16LSB ) || + ( SamType == ASIOSTInt24LSB ) || + ( SamType == ASIOSTInt32LSB ) ); +} + void CSound::bufferSwitch ( long index, ASIOBool ) { int iCurSample; // get references to class members - int& iASIOBufferSizeMono = pSound->iASIOBufferSizeMono; + int& iASIOBufferSizeMono = pSound->iASIOBufferSizeMono; CVector<int16_t>& vecsTmpAudioSndCrdStereo = pSound->vecsTmpAudioSndCrdStereo; // perform the processing for input and output @@ -529,49 +572,88 @@ // CAPTURE ------------------------------------------------------------- for ( int i = 0; i < NUM_IN_OUT_CHANNELS; i++ ) { - const int iInChNum = i; + int iSelCH, iSelAddCH; + + GetSelCHAndAddCH ( pSound->vSelectedInputChannels[i], pSound->lNumInChan, + iSelCH, iSelAddCH ); // copy new captured block in thread transfer buffer (copy // mono data interleaved in stereo buffer) - switch ( pSound->channelInfosInput[pSound->vSelectedInputChannels[i]].type ) + switch ( pSound->channelInfosInput[iSelCH].type ) { case ASIOSTInt16LSB: { // no type conversion required, just copy operation - int16_t* pASIOBuf = - static_cast<int16_t*> ( pSound->bufferInfos[i].buffers[index] ); + int16_t* pASIOBuf = static_cast<int16_t*> ( pSound->bufferInfos[iSelCH].buffers[index] ); for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = - pASIOBuf[iCurSample]; + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = pASIOBuf[iCurSample]; + } + + if ( iSelAddCH >= 0 ) + { + // mix input channels case: + int16_t* pASIOBufAdd = static_cast<int16_t*> ( pSound->bufferInfos[iSelAddCH].buffers[index] ); + + for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) + { + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = + Double2Short ( (double) vecsTmpAudioSndCrdStereo[2 * iCurSample + i] + + (double) pASIOBufAdd[iCurSample] ); + } } break; } case ASIOSTInt24LSB: -// NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { int iCurSam = 0; - memcpy ( &iCurSam, ( (char*) pSound->bufferInfos[i].buffers[index] ) + iCurSample * 3, 3 ); + memcpy ( &iCurSam, ( (char*) pSound->bufferInfos[iSelCH].buffers[index] ) + iCurSample * 3, 3 ); iCurSam >>= 8; - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = - static_cast<int16_t> ( iCurSam ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( iCurSam ); + } + + if ( iSelAddCH >= 0 ) + { + // mix input channels case: + for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) + { + int iCurSam = 0; + memcpy ( &iCurSam, ( (char*) pSound->bufferInfos[iSelAddCH].buffers[index] ) + iCurSample * 3, 3 ); + iCurSam >>= 8; + + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = + Double2Short ( (double) vecsTmpAudioSndCrdStereo[2 * iCurSample + i] + + (double) static_cast<int16_t> ( iCurSam ) ); + } } break; case ASIOSTInt32LSB: { - int32_t* pASIOBuf = - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] ); + int32_t* pASIOBuf = static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] ); for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( pASIOBuf[iCurSample] >> 16 ); } + + if ( iSelAddCH >= 0 ) + { + // mix input channels case: + int32_t* pASIOBufAdd = static_cast<int32_t*> ( pSound->bufferInfos[iSelAddCH].buffers[index] ); + + for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) + { + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = + Double2Short ( (double) vecsTmpAudioSndCrdStereo[2 * iCurSample + i] + + (double) static_cast<int16_t> ( pASIOBufAdd[iCurSample] >> 16 ) ); + } + } break; } @@ -579,9 +661,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( static_cast<float*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] * _MAXSHORT ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] * _MAXSHORT ); } break; @@ -589,9 +671,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( static_cast<double*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] * _MAXSHORT ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] * _MAXSHORT ); } break; @@ -599,9 +681,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] & 0xFFFF ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] & 0xFFFF ); } break; @@ -609,9 +691,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] & 0x3FFFF ) >> 2 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] & 0x3FFFF ) >> 2 ); } break; @@ -619,9 +701,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] & 0xFFFFF ) >> 4 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] & 0xFFFFF ) >> 4 ); } break; @@ -629,9 +711,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] & 0xFFFFFF ) >> 8 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] & 0xFFFFFF ) >> 8 ); } break; @@ -640,9 +722,9 @@ // flip bits for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = Flip16Bits ( ( static_cast<int16_t*> ( - pSound->bufferInfos[i].buffers[index] ) )[iCurSample] ); + pSound->bufferInfos[iSelCH].buffers[index] ) )[iCurSample] ); } break; @@ -653,9 +735,9 @@ // because the bits are flipped, we do not have to perform the // shift by 8 bits int iCurSam = 0; - memcpy ( &iCurSam, ( (char*) pSound->bufferInfos[i].buffers[index] ) + iCurSample * 3, 3 ); + memcpy ( &iCurSam, ( (char*) pSound->bufferInfos[iSelCH].buffers[index] ) + iCurSample * 3, 3 ); - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = Flip16Bits ( static_cast<int16_t> ( iCurSam ) ); } break; @@ -665,9 +747,9 @@ for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { // flip bits and convert to 16 bit - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( Flip32Bits ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) >> 16 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) >> 16 ); } break; @@ -675,10 +757,10 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( static_cast<float> ( Flip32Bits ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) ) * _MAXSHORT ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) ) * _MAXSHORT ); } break; @@ -686,10 +768,10 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( static_cast<double> ( Flip64Bits ( static_cast<int64_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) ) * _MAXSHORT ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) ) * _MAXSHORT ); } break; @@ -697,9 +779,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( Flip32Bits ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) & 0xFFFF ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) & 0xFFFF ); } break; @@ -707,9 +789,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( ( Flip32Bits ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) & 0x3FFFF ) >> 2 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) & 0x3FFFF ) >> 2 ); } break; @@ -717,9 +799,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( ( Flip32Bits ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) & 0xFFFFF ) >> 4 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) & 0xFFFFF ) >> 4 ); } break; @@ -727,9 +809,9 @@ // NOT YET TESTED for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - vecsTmpAudioSndCrdStereo[2 * iCurSample + iInChNum] = + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] = static_cast<int16_t> ( ( Flip32Bits ( static_cast<int32_t*> ( - pSound->bufferInfos[i].buffers[index] )[iCurSample] ) & 0xFFFFFF ) >> 8 ); + pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] ) & 0xFFFFFF ) >> 8 ); } break; } @@ -739,24 +821,22 @@ pSound->ProcessCallback ( vecsTmpAudioSndCrdStereo ); // PLAYBACK ------------------------------------------------------------ - for ( int i = NUM_IN_OUT_CHANNELS; i < 2 * NUM_IN_OUT_CHANNELS; i++ ) + for ( int i = 0; i < NUM_IN_OUT_CHANNELS; i++ ) { - const int iOutChNum = i - NUM_IN_OUT_CHANNELS; + const int iSelCH = pSound->lNumInChan + pSound->vSelectedOutputChannels[i]; // copy data from sound card in output buffer (copy // interleaved stereo data in mono sound card buffer) - switch ( pSound->channelInfosOutput[pSound->vSelectedOutputChannels[iOutChNum]].type ) + switch ( pSound->channelInfosOutput[pSound->vSelectedOutputChannels[i]].type ) { case ASIOSTInt16LSB: { // no type conversion required, just copy operation - int16_t* pASIOBuf = - static_cast<int16_t*> ( pSound->bufferInfos[i].buffers[index] ); + int16_t* pASIOBuf = static_cast<int16_t*> ( pSound->bufferInfos[iSelCH].buffers[index] ); for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - pASIOBuf[iCurSample] = - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum]; + pASIOBuf[iCurSample] = vecsTmpAudioSndCrdStereo[2 * iCurSample + i]; } break; } @@ -767,24 +847,23 @@ { // convert current sample in 24 bit format int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); iCurSam <<= 8; - memcpy ( ( (char*) pSound->bufferInfos[i].buffers[index] ) + iCurSample * 3, &iCurSam, 3 ); + memcpy ( ( (char*) pSound->bufferInfos[iSelCH].buffers[index] ) + iCurSample * 3, &iCurSam, 3 ); } break; case ASIOSTInt32LSB: { - int32_t* pASIOBuf = - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] ); + int32_t* pASIOBuf = static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] ); for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); pASIOBuf[iCurSample] = ( iCurSam << 16 ); } @@ -796,9 +875,9 @@ for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { const float fCurSam = static_cast<float> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<float*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<float*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = fCurSam / _MAXSHORT; } break; @@ -808,9 +887,9 @@ for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { const double fCurSam = static_cast<double> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<double*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<double*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = fCurSam / _MAXSHORT; } break; @@ -821,9 +900,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = iCurSam; } break; @@ -834,9 +913,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = ( iCurSam << 2 ); } break; @@ -847,9 +926,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = ( iCurSam << 4 ); } break; @@ -860,9 +939,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = ( iCurSam << 8 ); } break; @@ -872,8 +951,8 @@ // flip bits for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { - ( (int16_t*) pSound->bufferInfos[i].buffers[index] )[iCurSample] = - Flip16Bits ( vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + ( (int16_t*) pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = + Flip16Bits ( vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); } break; @@ -884,9 +963,9 @@ // because the bits are flipped, we do not have to perform the // shift by 8 bits int32_t iCurSam = static_cast<int32_t> ( Flip16Bits ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ) ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ) ); - memcpy ( ( (char*) pSound->bufferInfos[i].buffers[index] ) + iCurSample * 3, &iCurSam, 3 ); + memcpy ( ( (char*) pSound->bufferInfos[iSelCH].buffers[index] ) + iCurSample * 3, &iCurSam, 3 ); } break; @@ -896,9 +975,9 @@ { // convert to 32 bit and flip bits int iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = Flip32Bits ( iCurSam << 16 ); } break; @@ -908,9 +987,9 @@ for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { const float fCurSam = static_cast<float> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<float*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<float*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = static_cast<float> ( Flip32Bits ( static_cast<int32_t> ( fCurSam / _MAXSHORT ) ) ); } @@ -921,9 +1000,9 @@ for ( iCurSample = 0; iCurSample < iASIOBufferSizeMono; iCurSample++ ) { const double fCurSam = static_cast<double> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<float*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<float*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = static_cast<double> ( Flip64Bits ( static_cast<int64_t> ( fCurSam / _MAXSHORT ) ) ); } @@ -935,9 +1014,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = Flip32Bits ( iCurSam ); } break; @@ -948,9 +1027,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = Flip32Bits ( iCurSam << 2 ); } break; @@ -961,9 +1040,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = Flip32Bits ( iCurSam << 4 ); } break; @@ -974,9 +1053,9 @@ { // convert to 32 bit const int32_t iCurSam = static_cast<int32_t> ( - vecsTmpAudioSndCrdStereo[2 * iCurSample + iOutChNum] ); + vecsTmpAudioSndCrdStereo[2 * iCurSample + i] ); - static_cast<int32_t*> ( pSound->bufferInfos[i].buffers[index] )[iCurSample] = + static_cast<int32_t*> ( pSound->bufferInfos[iSelCH].buffers[index] )[iCurSample] = Flip32Bits ( iCurSam << 8 ); } break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Jamulus3.4.2/windows/sound.h new/Jamulus3.4.3/windows/sound.h --- old/Jamulus3.4.2/windows/sound.h 2017-08-11 14:25:05.000000000 +0200 +++ new/Jamulus3.4.3/windows/sound.h 2018-05-17 19:39:34.000000000 +0200 @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2016 + * Copyright (c) 2004-2018 * * Author(s): * Volker Fischer @@ -58,8 +58,8 @@ virtual void OpenDriverSetup() { ASIOControlPanel(); } // channel selection - virtual int GetNumInputChannels() { return static_cast<int> ( lNumInChan ); } - virtual QString GetInputChannelName ( const int iDiD ) { return channelInfosInput[iDiD].name; } + virtual int GetNumInputChannels() { return static_cast<int> ( lNumInChanPlusAddChan ); } + virtual QString GetInputChannelName ( const int iDiD ) { return channelInputName[iDiD]; } virtual void SetLeftInputChannel ( const int iNewChan ); virtual void SetRightInputChannel ( const int iNewChan ); virtual int GetLeftInputChannel() { return vSelectedInputChannels[0]; } @@ -80,12 +80,36 @@ int GetActualBufferSize ( const int iDesiredBufferSizeMono ); QString CheckDeviceCapabilities(); bool CheckSampleTypeSupported ( const ASIOSampleType SamType ); + 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; long lNumInChan; + long lNumInChanPlusAddChan; // includes additional "added" channels long lNumOutChan; double dInOutLatencyMs; CVector<int> vSelectedInputChannels; @@ -111,8 +135,9 @@ // ASIO stuff ASIODriverInfo driverInfo; - ASIOBufferInfo bufferInfos[2 * NUM_IN_OUT_CHANNELS]; // for input and output buffers -> "2 *" + ASIOBufferInfo bufferInfos[2 * MAX_NUM_IN_OUT_CHANNELS]; // for input and output buffers -> "2 *" ASIOChannelInfo channelInfosInput[MAX_NUM_IN_OUT_CHANNELS]; + QString channelInputName[MAX_NUM_IN_OUT_CHANNELS]; ASIOChannelInfo channelInfosOutput[MAX_NUM_IN_OUT_CHANNELS]; bool bASIOPostOutput; ASIOCallbacks asioCallbacks;
