diff --git a/samples/voiceclient/client.cpp b/samples/voiceclient/client.cpp index 00b5f1c8c..877737371 100644 --- a/samples/voiceclient/client.cpp +++ b/samples/voiceclient/client.cpp @@ -11,7 +11,7 @@ using namespace BlackMisc::Audio; using namespace BlackMisc::Aviation; - +using namespace BlackCore; /* * Client @@ -24,15 +24,19 @@ Client::Client(QObject *parent) : m_channelCom1 = m_voice->createVoiceChannel(); m_inputDevice = m_voice->createInputDevice(); m_outputDevice = m_voice->createOutputDevice(); + m_audioMixer = m_voice->createAudioMixer(); - m_voice->connectChannelOutputDevice(m_channelCom1.get(), m_outputDevice.get()); + m_voice->connectVoice(m_inputDevice.get(), m_audioMixer.get(), IAudioMixer::InputMicrophone); + m_voice->connectVoice(m_channelCom1.data(), m_audioMixer.get(), IAudioMixer::InputVoiceChannel1); + m_voice->connectVoice(m_audioMixer.get(), IAudioMixer::OutputOutputDevice1, m_outputDevice.get()); + m_audioMixer->makeMixerConnection(IAudioMixer::InputVoiceChannel1, IAudioMixer::OutputOutputDevice1); using namespace BlackCore; - connect(m_channelCom1.get(), &IVoiceChannel::connectionStatusChanged, this, &Client::connectionStatusChanged); - connect(m_channelCom1.get(), &IVoiceChannel::audioStarted, this, &Client::audioStartedStream); - connect(m_channelCom1.get(), &IVoiceChannel::audioStopped, this, &Client::audioStoppedStream); - connect(m_channelCom1.get(), &IVoiceChannel::userJoinedRoom, this, &Client::userJoinedRoom); - connect(m_channelCom1.get(), &IVoiceChannel::userLeftRoom, this, &Client::userLeftRoom); + connect(m_channelCom1.data(), &IVoiceChannel::connectionStatusChanged, this, &Client::connectionStatusChanged); + connect(m_channelCom1.data(), &IVoiceChannel::audioStarted, this, &Client::audioStartedStream); + connect(m_channelCom1.data(), &IVoiceChannel::audioStopped, this, &Client::audioStoppedStream); + connect(m_channelCom1.data(), &IVoiceChannel::userJoinedRoom, this, &Client::userJoinedRoom); + connect(m_channelCom1.data(), &IVoiceChannel::userLeftRoom, this, &Client::userLeftRoom); using namespace std::placeholders; m_commands["help"] = std::bind(&Client::help, this, _1); @@ -167,7 +171,7 @@ void Client::enableLoopbackCmd(QTextStream &/*args*/) { m_stdout << endl; m_stdout << "Enabling audio loopback." << endl; - m_voice->enableAudioLoopback(m_inputDevice.get(), m_outputDevice.get()); + m_audioMixer->makeMixerConnection(IAudioMixer::InputMicrophone, IAudioMixer::OutputOutputDevice1); printLinePrefix(); } @@ -175,7 +179,7 @@ void Client::disableLoopbackCmd(QTextStream &/*args*/) { m_stdout << endl; m_stdout << "Disabling audio loopback." << endl; - m_voice->enableAudioLoopback(m_inputDevice.get(), nullptr); + m_audioMixer->removeMixerConnection(IAudioMixer::InputMicrophone, IAudioMixer::OutputOutputDevice1); printLinePrefix(); } diff --git a/samples/voiceclient/client.h b/samples/voiceclient/client.h index 5802ba719..43b55fabc 100644 --- a/samples/voiceclient/client.h +++ b/samples/voiceclient/client.h @@ -8,6 +8,7 @@ #include "blackcore/voice.h" #include "blackcore/voice_channel.h" +#include "blackcore/audio_mixer.h" #include #include @@ -15,6 +16,7 @@ #include #include #include +#include class Client : public QObject { @@ -62,7 +64,8 @@ private: BlackCore::IVoice *m_voice; std::unique_ptr m_inputDevice; std::unique_ptr m_outputDevice; - std::unique_ptr m_channelCom1; + std::unique_ptr m_audioMixer; + QSharedPointer m_channelCom1; QTextStream m_stdout; }; diff --git a/src/blackcore/context_audio_impl.cpp b/src/blackcore/context_audio_impl.cpp index f2be23d06..91e65219e 100644 --- a/src/blackcore/context_audio_impl.cpp +++ b/src/blackcore/context_audio_impl.cpp @@ -51,8 +51,17 @@ namespace BlackCore m_voiceInputDevice = m_voice->createInputDevice(); m_voiceOutputDevice = m_voice->createOutputDevice(); - m_voice->connectChannelOutputDevice(m_channelCom1.get(), m_voiceOutputDevice.get()); - m_voice->connectChannelOutputDevice(m_channelCom2.get(), m_voiceOutputDevice.get()); + m_audioMixer = m_voice->createAudioMixer(); + + m_voice->connectVoice(m_voiceInputDevice.get(), m_audioMixer.get(), IAudioMixer::InputMicrophone); + m_voice->connectVoice(m_channelCom1.get(), m_audioMixer.get(), IAudioMixer::InputVoiceChannel1); + m_voice->connectVoice(m_channelCom2.get(), m_audioMixer.get(), IAudioMixer::InputVoiceChannel2); + m_voice->connectVoice(m_audioMixer.get(), IAudioMixer::OutputOutputDevice1, m_voiceOutputDevice.get()); + m_voice->connectVoice(m_audioMixer.get(), IAudioMixer::OutputVoiceChannel1, m_channelCom1.get()); + m_voice->connectVoice(m_audioMixer.get(), IAudioMixer::OutputVoiceChannel2, m_channelCom2.get()); + + m_audioMixer->makeMixerConnection(IAudioMixer::InputVoiceChannel1, IAudioMixer::OutputOutputDevice1); + m_audioMixer->makeMixerConnection(IAudioMixer::InputVoiceChannel2, IAudioMixer::OutputOutputDevice1); // 4. load sounds (init), not possible in own thread QTimer::singleShot(10 * 1000, this, SLOT(ps_initNotificationSounds())); @@ -406,9 +415,9 @@ namespace BlackCore Q_ASSERT(this->m_voice); CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; if (enable) - m_voice->enableAudioLoopback(m_voiceInputDevice.get(), m_voiceOutputDevice.get()); + m_audioMixer->makeMixerConnection(IAudioMixer::InputMicrophone, IAudioMixer::OutputOutputDevice1); else - m_voice->enableAudioLoopback(m_voiceInputDevice.get(), nullptr); + m_audioMixer->removeMixerConnection(IAudioMixer::InputMicrophone, IAudioMixer::OutputOutputDevice1); } bool CContextAudio::parseCommandLine(const QString &commandLine) @@ -462,8 +471,8 @@ namespace BlackCore void CContextAudio::ps_setVoiceTransmission(bool enable) { // FIXME: Use the 'active' channel instead of hardcoded COM1 - if (enable) m_voice->connectChannelInputDevice(m_voiceInputDevice.get(), m_channelCom1.get()); - else m_voice->connectChannelInputDevice(nullptr, m_channelCom1.get()); + if (enable) m_audioMixer->makeMixerConnection(IAudioMixer::InputMicrophone, IAudioMixer::OutputVoiceChannel1); + else m_audioMixer->removeMixerConnection(IAudioMixer::InputMicrophone, IAudioMixer::OutputVoiceChannel1); } /* diff --git a/src/blackcore/context_audio_impl.h b/src/blackcore/context_audio_impl.h index ece8a18a6..83795238a 100644 --- a/src/blackcore/context_audio_impl.h +++ b/src/blackcore/context_audio_impl.h @@ -19,6 +19,7 @@ #include "voice.h" #include "voice_channel.h" #include "audio_device.h" +#include "audio_mixer.h" #include "input_manager.h" #include "blackinput/keyboard.h" #include "blackmisc/voiceroomlist.h" @@ -166,15 +167,19 @@ namespace BlackCore //! Connection in transition bool inTransitionState() const; - std::unique_ptr m_voice; //!< underlying voice lib - CInputManager *m_inputManager = nullptr; CInputManager::RegistrationHandle m_handlePtt; + + std::unique_ptr m_voice; //!< underlying voice lib + std::unique_ptr m_audioMixer; + + int m_outDeviceVolume = 100; std::unique_ptr m_channelCom1; std::unique_ptr m_channelCom2; std::unique_ptr m_voiceOutputDevice; - int m_outDeviceVolume = 100; std::unique_ptr m_voiceInputDevice; + + }; } // namespace