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
virtual std::unique_ptr<IAudioMixer> 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

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);
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<CAudioMixerVatlib*>(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<CAudioMixerVatlib*>(mixer);
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
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);
Q_ASSERT_X(voiceChannelVatlib, "CVoiceVatlib::connectChannelInputDevice", "No valid CVoiceChannelVatlib pointer.");
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);
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<CAudioInputDeviceVatlib*>(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<CAudioOutputDeviceVatlib*>(output);
Q_ASSERT_X(vatlibOutput, "CVoiceVatlib::enableAudioLoopback", "No valid CAudioOutputDeviceVatlib pointer.");
Vat_VoiceConnect(vatlibInput->getVatLocalInputCodec(), 0, vatlibOutput->getVatLocalOutputCodec(), 0);
auto audioMixerVatlib = qobject_cast<CAudioMixerVatlib*>(mixer);
Q_ASSERT_X(audioMixerVatlib, "CVoiceVatlib::connectVoice", "No valid CAudioMixerVatlib pointer.");
Vat_ConnectProducerConsumerToConsumer(audioMixerVatlib->getVatAudioMixer(), outputPort, nullptr, 0);
}
/*

View File

@@ -47,14 +47,27 @@ namespace BlackCore
//! \copydoc IVoice::createAudioMixer()
virtual std::unique_ptr<IAudioMixer> 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<VatAudioService_tag, VatAudioServiceDeleter> m_audioService;
QScopedPointer<VatUDPAudioPort_tag, VatUDPAudioPortDeleter> m_udpPort;
};
} // namespace