diff --git a/src/blackcore/voice.h b/src/blackcore/voice.h index abd6e827d..5d4babfcc 100644 --- a/src/blackcore/voice.h +++ b/src/blackcore/voice.h @@ -50,18 +50,27 @@ namespace BlackCore //! Create audio mixer object virtual std::unique_ptr createAudioMixer() = 0; - //! Connect voice channel to an audio output device - virtual void connectChannelOutputDevice(IVoiceChannel *channel, IAudioOutputDevice *device) = 0; - /*! - * Connect input device to voice channel to start/stop voice transmission - * \param device Audio input device, e.g. a microphone. Pass nullptr to stop transmission - * \param channel Voice channel audio should be transmitted to - */ - virtual void connectChannelInputDevice(IAudioInputDevice *device, IVoiceChannel *channel) = 0; + //! Connect audio input device to audio mixer + virtual void connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) = 0; - //! Connect audio input to an audio output to hear your own voice - virtual void enableAudioLoopback(IAudioInputDevice *input, IAudioOutputDevice *output) = 0; + //! Connect voice channel to audio mixer + virtual void connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) = 0; + + //! Connect audio mixer to audio output device + virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device) = 0; + + //! Connect audio mixer to audio input device + virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel) = 0; + + //! Disconnect input device + virtual void disconnectVoice(IAudioInputDevice *device) = 0; + + //! Disconnect voice channel + virtual void disconnectVoice(IVoiceChannel *channel) = 0; + + //! Disconnect audio mixer output port + virtual void disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort) = 0; }; } // namespace BlackCore diff --git a/src/blackcore/voice_vatlib.cpp b/src/blackcore/voice_vatlib.cpp index 56e6d7f5a..48b6f0443 100644 --- a/src/blackcore/voice_vatlib.cpp +++ b/src/blackcore/voice_vatlib.cpp @@ -69,55 +69,69 @@ namespace BlackCore } */ - void CVoiceVatlib::connectChannelOutputDevice(IVoiceChannel *channel, IAudioOutputDevice *device) + void CVoiceVatlib::connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) + { + auto audioInputVatlib = qobject_cast(device); + Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer."); + + auto audioMixerVatlib = qobject_cast(mixer); + Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer."); + + Vat_ConnectProducerToProducerConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort); + } + + void CVoiceVatlib::connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) { auto voiceChannelVatlib = qobject_cast(channel); - Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectChannelOutputDevice", "No valid CVoiceChannelVatlib pointer."); + Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer."); - if (!device) - { - Vat_VoiceConnect(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0); - return; - } + auto audioMixerVatlib = qobject_cast(mixer); + Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer."); + + Vat_ConnectProducerConsumerToProducerConsumer(voiceChannelVatlib->getVoiceChannel(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort); + } + + void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device) + { + auto audioMixerVatlib = qobject_cast(mixer); + Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer."); auto audioDeviceVatlib = qobject_cast(device); - Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectOutputDevice", "No valid CAudioOutputDeviceVatlib pointer."); + Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioOutputDeviceVatlib pointer."); - Vat_VoiceConnect(voiceChannelVatlib->getVoiceChannel(), 0, audioDeviceVatlib->getVatLocalOutputCodec(), 0); + Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, audioDeviceVatlib->getVatLocalOutputCodec(), 0); } - void CVoiceVatlib::connectChannelInputDevice(IAudioInputDevice *device, IVoiceChannel *channel) + void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel) + { + auto audioMixerVatlib = qobject_cast(mixer); + Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer."); + + auto voiceChannelVatlib = qobject_cast(channel); + Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer."); + + Vat_ConnectProducerConsumerToProducerConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, voiceChannelVatlib->getVoiceChannel(), 0); + } + + void CVoiceVatlib::disconnectVoice(IAudioInputDevice *device) + { + auto audioInputVatlib = qobject_cast(device); + Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer."); + Vat_ConnectProducerToConsumer(audioInputVatlib->getVatLocalInputCodec(), 0, nullptr, 0); + } + + void CVoiceVatlib::disconnectVoice(IVoiceChannel *channel) { auto voiceChannelVatlib = qobject_cast(channel); - Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectChannelInputDevice", "No valid CVoiceChannelVatlib pointer."); - - if (!device) - { - Vat_VoiceConnect(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0); - return; - } - - auto audioDeviceVatlib = qobject_cast(device); - Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectChannelInputDevice", "No valid CAudioInputDeviceVatlib pointer."); - - Vat_VoiceConnect(audioDeviceVatlib->getVatLocalInputCodec(), 0, voiceChannelVatlib->getVoiceChannel(), 0); + Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer."); + Vat_ConnectProducerConsumerToConsumer(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0); } - void CVoiceVatlib::enableAudioLoopback(IAudioInputDevice *input, IAudioOutputDevice *output) + void CVoiceVatlib::disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort) { - auto vatlibInput = qobject_cast(input); - Q_ASSERT_X(vatlibInput, "CVoiceVatlib::enableAudioLoopback", "No valid CAudioInputDeviceVatlib pointer."); - - if (!output) - { - Vat_VoiceConnect(vatlibInput->getVatLocalInputCodec(), 0, nullptr, 0); - return; - } - - auto vatlibOutput = qobject_cast(output); - Q_ASSERT_X(vatlibOutput, "CVoiceVatlib::enableAudioLoopback", "No valid CAudioOutputDeviceVatlib pointer."); - - Vat_VoiceConnect(vatlibInput->getVatLocalInputCodec(), 0, vatlibOutput->getVatLocalOutputCodec(), 0); + auto audioMixerVatlib = qobject_cast(mixer); + Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer."); + Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, nullptr, 0); } /* diff --git a/src/blackcore/voice_vatlib.h b/src/blackcore/voice_vatlib.h index ec038f800..0ec75982b 100644 --- a/src/blackcore/voice_vatlib.h +++ b/src/blackcore/voice_vatlib.h @@ -47,14 +47,27 @@ namespace BlackCore //! \copydoc IVoice::createAudioMixer() virtual std::unique_ptr createAudioMixer() override; - //! \copydoc IVoice::connectChannelOutputDevice() - virtual void connectChannelOutputDevice(IVoiceChannel *channel, IAudioOutputDevice *device) override; - //! \copydoc IVoice::connectChannelInputDevice() - virtual void connectChannelInputDevice(IAudioInputDevice *device, IVoiceChannel *channel) override; + //! \copydoc IVoice::connectVoice() + virtual void connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override; - //! \copydoc IVoice::enableAudioLoopback() - virtual void enableAudioLoopback(IAudioInputDevice *input, IAudioOutputDevice *output) override; + //! \copydoc IVoice::connectVoice() + virtual void connectVoice(IVoiceChannel *channel, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override; + + //! \copydoc IVoice::connectVoice() + virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device) override; + + //! \copydoc IVoice::connectVoice() + virtual void connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IVoiceChannel *channel) override; + + //! \copydoc IVoice::disconnectVoice() + void disconnectVoice(IAudioInputDevice *device) override; + + //! \copydoc IVoice::disconnectVoice() + void disconnectVoice(IVoiceChannel *channel) override; + + //! \copydoc IVoice::disconnectVoice() + void disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort) override; protected: // QObject overrides @@ -84,6 +97,7 @@ namespace BlackCore QScopedPointer m_audioService; QScopedPointer m_udpPort; + }; } // namespace