mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-31 21:15:33 +08:00
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:
committed by
Klaus Basan
parent
8812f3ba28
commit
7ba3a50e18
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user