refs #372 Replace voice connection methods to use audio mixer

Instead of connecting producers and consumers directly, they
are all connected to an audio mixer. In order to actually
route voice you have to configure the mixer and connect its
input with an output port.
This commit also silently adapts to some new vatlib methods,
which got introduced as a bug fix.
This commit is contained in:
Roland Winklmeier
2015-02-01 14:52:06 +01:00
committed by Klaus Basan
parent 8812f3ba28
commit 7ba3a50e18
3 changed files with 89 additions and 52 deletions

View File

@@ -50,18 +50,27 @@ namespace BlackCore
//! Create audio mixer object //! Create audio mixer object
virtual std::unique_ptr<IAudioMixer> createAudioMixer() = 0; virtual std::unique_ptr<IAudioMixer> createAudioMixer() = 0;
//! Connect voice channel to an audio output device
virtual void connectChannelOutputDevice(IVoiceChannel *channel, IAudioOutputDevice *device) = 0;
/*! //! Connect audio input device to audio mixer
* Connect input device to voice channel to start/stop voice transmission virtual void connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) = 0;
* \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 to an audio output to hear your own voice //! Connect voice channel to audio mixer
virtual void enableAudioLoopback(IAudioInputDevice *input, IAudioOutputDevice *output) = 0; 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 } // namespace BlackCore

View File

@@ -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<CAudioInputDeviceVatlib*>(device);
Q_ASSERT_X(audioInputVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioInputDeviceVatlib pointer.");
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(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<CVoiceChannelVatlib*>(channel); auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib*>(channel);
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectChannelOutputDevice", "No valid CVoiceChannelVatlib pointer."); Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
if (!device) auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
{ Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
Vat_VoiceConnect(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0);
return; Vat_ConnectProducerConsumerToProducerConsumer(voiceChannelVatlib->getVoiceChannel(), 0, audioMixerVatlib->getVatAudioMixer(), inputPort);
} }
void CVoiceVatlib::connectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort, IAudioOutputDevice *device)
{
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
auto audioDeviceVatlib = qobject_cast<CAudioOutputDeviceVatlib*>(device); auto audioDeviceVatlib = qobject_cast<CAudioOutputDeviceVatlib*>(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<CAudioMixerVatlib*>(mixer);
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib*>(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<CAudioInputDeviceVatlib*>(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<CVoiceChannelVatlib*>(channel); auto voiceChannelVatlib = qobject_cast<CVoiceChannelVatlib*>(channel);
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectChannelInputDevice", "No valid CVoiceChannelVatlib pointer."); Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectVoice", "No valid CVoiceChannelVatlib pointer.");
Vat_ConnectProducerConsumerToConsumer(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0);
if (!device)
{
Vat_VoiceConnect(voiceChannelVatlib->getVoiceChannel(), 0, nullptr, 0);
return;
}
auto audioDeviceVatlib = qobject_cast<CAudioInputDeviceVatlib*>(device);
Q_ASSERT_X(audioDeviceVatlib, "CVoiceVatlib::connectChannelInputDevice", "No valid CAudioInputDeviceVatlib pointer.");
Vat_VoiceConnect(audioDeviceVatlib->getVatLocalInputCodec(), 0, voiceChannelVatlib->getVoiceChannel(), 0);
} }
void CVoiceVatlib::enableAudioLoopback(IAudioInputDevice *input, IAudioOutputDevice *output) void CVoiceVatlib::disconnectVoice(IAudioMixer *mixer, IAudioMixer::OutputPort outputPort)
{ {
auto vatlibInput = qobject_cast<CAudioInputDeviceVatlib*>(input); auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
Q_ASSERT_X(vatlibInput, "CVoiceVatlib::enableAudioLoopback", "No valid CAudioInputDeviceVatlib pointer."); Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, nullptr, 0);
if (!output)
{
Vat_VoiceConnect(vatlibInput->getVatLocalInputCodec(), 0, nullptr, 0);
return;
}
auto vatlibOutput = qobject_cast<CAudioOutputDeviceVatlib*>(output);
Q_ASSERT_X(vatlibOutput, "CVoiceVatlib::enableAudioLoopback", "No valid CAudioOutputDeviceVatlib pointer.");
Vat_VoiceConnect(vatlibInput->getVatLocalInputCodec(), 0, vatlibOutput->getVatLocalOutputCodec(), 0);
} }
/* /*

View File

@@ -47,14 +47,27 @@ namespace BlackCore
//! \copydoc IVoice::createAudioMixer() //! \copydoc IVoice::createAudioMixer()
virtual std::unique_ptr<IAudioMixer> createAudioMixer() override; virtual std::unique_ptr<IAudioMixer> createAudioMixer() override;
//! \copydoc IVoice::connectChannelOutputDevice()
virtual void connectChannelOutputDevice(IVoiceChannel *channel, IAudioOutputDevice *device) override;
//! \copydoc IVoice::connectChannelInputDevice() //! \copydoc IVoice::connectVoice()
virtual void connectChannelInputDevice(IAudioInputDevice *device, IVoiceChannel *channel) override; virtual void connectVoice(IAudioInputDevice *device, IAudioMixer *mixer, IAudioMixer::InputPort inputPort) override;
//! \copydoc IVoice::enableAudioLoopback() //! \copydoc IVoice::connectVoice()
virtual void enableAudioLoopback(IAudioInputDevice *input, IAudioOutputDevice *output) override; 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 protected: // QObject overrides
@@ -84,6 +97,7 @@ namespace BlackCore
QScopedPointer<VatAudioService_tag, VatAudioServiceDeleter> m_audioService; QScopedPointer<VatAudioService_tag, VatAudioServiceDeleter> m_audioService;
QScopedPointer<VatUDPAudioPort_tag, VatUDPAudioPortDeleter> m_udpPort; QScopedPointer<VatUDPAudioPort_tag, VatUDPAudioPortDeleter> m_udpPort;
}; };
} // namespace } // namespace