mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-09 12:37:02 +02:00
first cut at negotiating codecs
This commit is contained in:
parent
be37921845
commit
d7bffc3eab
11 changed files with 94 additions and 5 deletions
|
@ -90,6 +90,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) :
|
||||||
PacketType::AudioStreamStats },
|
PacketType::AudioStreamStats },
|
||||||
this, "handleNodeAudioPacket");
|
this, "handleNodeAudioPacket");
|
||||||
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
||||||
|
packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat");
|
||||||
|
|
||||||
connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled);
|
connect(nodeList.data(), &NodeList::nodeKilled, this, &AudioMixer::handleNodeKilled);
|
||||||
}
|
}
|
||||||
|
@ -446,6 +447,31 @@ void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> mes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioMixer::handleNegotiateAudioFormat(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) {
|
||||||
|
qDebug() << __FUNCTION__;
|
||||||
|
|
||||||
|
// read the codecs requested by the client
|
||||||
|
quint8 numberOfCodecs = 0;
|
||||||
|
message->readPrimitive(&numberOfCodecs);
|
||||||
|
QStringList codecList;
|
||||||
|
for (quint16 i = 0; i < numberOfCodecs; i++) {
|
||||||
|
QString requestedCodec = message->readString();
|
||||||
|
qDebug() << "requestedCodec:" << requestedCodec;
|
||||||
|
codecList.append(requestedCodec);
|
||||||
|
}
|
||||||
|
qDebug() << "all requested codecs:" << codecList;
|
||||||
|
|
||||||
|
auto replyPacket = NLPacket::create(PacketType::SelectedAudioFormat);
|
||||||
|
|
||||||
|
// write them to our packet
|
||||||
|
QString selectedCodec = codecList.front();
|
||||||
|
qDebug() << "selectedCodec:" << selectedCodec;
|
||||||
|
replyPacket->writeString(selectedCodec);
|
||||||
|
|
||||||
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
nodeList->sendPacket(std::move(replyPacket), *sendingNode);
|
||||||
|
}
|
||||||
|
|
||||||
void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) {
|
void AudioMixer::handleNodeKilled(SharedNodePointer killedNode) {
|
||||||
// enumerate the connected listeners to remove HRTF objects for the disconnected node
|
// enumerate the connected listeners to remove HRTF objects for the disconnected node
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
|
|
@ -45,6 +45,7 @@ private slots:
|
||||||
void broadcastMixes();
|
void broadcastMixes();
|
||||||
void handleNodeAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void handleNodeAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||||
|
void handleNegotiateAudioFormat(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
|
||||||
void handleNodeKilled(SharedNodePointer killedNode);
|
void handleNodeKilled(SharedNodePointer killedNode);
|
||||||
|
|
||||||
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
||||||
|
|
|
@ -1243,7 +1243,6 @@ QString Application::getUserAgent() {
|
||||||
userAgent += " " + formatPluginName(cp->getName());
|
userAgent += " " + formatPluginName(cp->getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << __FUNCTION__ << ":" << userAgent;
|
|
||||||
return userAgent;
|
return userAgent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4440,6 +4439,9 @@ void Application::nodeActivated(SharedNodePointer node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node->getType() == NodeType::AudioMixer) {
|
||||||
|
DependencyManager::get<AudioClient>()->negotiateAudioFormat();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::nodeKilled(SharedNodePointer node) {
|
void Application::nodeKilled(SharedNodePointer node) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
set(TARGET_NAME audio-client)
|
set(TARGET_NAME audio-client)
|
||||||
setup_hifi_library(Network Multimedia)
|
setup_hifi_library(Network Multimedia)
|
||||||
link_hifi_libraries(audio)
|
link_hifi_libraries(audio plugins)
|
||||||
|
|
||||||
# append audio includes to our list of includes to bubble
|
# append audio includes to our list of includes to bubble
|
||||||
target_include_directories(${TARGET_NAME} PUBLIC "${HIFI_LIBRARY_DIR}/audio/src")
|
target_include_directories(${TARGET_NAME} PUBLIC "${HIFI_LIBRARY_DIR}/audio/src")
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include <QtMultimedia/QAudioOutput>
|
#include <QtMultimedia/QAudioOutput>
|
||||||
|
|
||||||
#include <NodeList.h>
|
#include <NodeList.h>
|
||||||
|
#include <plugins/CodecPlugin.h>
|
||||||
|
#include <plugins/PluginManager.h>
|
||||||
#include <udt/PacketHeaders.h>
|
#include <udt/PacketHeaders.h>
|
||||||
#include <PositionalAudioStream.h>
|
#include <PositionalAudioStream.h>
|
||||||
#include <SettingHandle.h>
|
#include <SettingHandle.h>
|
||||||
|
@ -134,6 +136,7 @@ AudioClient::AudioClient() :
|
||||||
packetReceiver.registerListener(PacketType::MixedAudio, this, "handleAudioDataPacket");
|
packetReceiver.registerListener(PacketType::MixedAudio, this, "handleAudioDataPacket");
|
||||||
packetReceiver.registerListener(PacketType::NoisyMute, this, "handleNoisyMutePacket");
|
packetReceiver.registerListener(PacketType::NoisyMute, this, "handleNoisyMutePacket");
|
||||||
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
||||||
|
packetReceiver.registerListener(PacketType::SelectedAudioFormat, this, "handleSelectedAudioFormat");
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioClient::~AudioClient() {
|
AudioClient::~AudioClient() {
|
||||||
|
@ -474,6 +477,32 @@ void AudioClient::stop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioClient::negotiateAudioFormat() {
|
||||||
|
qDebug() << __FUNCTION__;
|
||||||
|
|
||||||
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
|
||||||
|
auto negotiateFormatPacket = NLPacket::create(PacketType::NegotiateAudioFormat);
|
||||||
|
|
||||||
|
auto codecPlugins = PluginManager::getInstance()->getCodecPlugins();
|
||||||
|
|
||||||
|
quint8 numberOfCodecs = (quint8)codecPlugins.size();
|
||||||
|
negotiateFormatPacket->writePrimitive(numberOfCodecs);
|
||||||
|
for (auto& plugin : codecPlugins) {
|
||||||
|
qDebug() << "Codec available:" << plugin->getName();
|
||||||
|
negotiateFormatPacket->writeString(plugin->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// grab our audio mixer from the NodeList, if it exists
|
||||||
|
SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer);
|
||||||
|
|
||||||
|
if (audioMixer) {
|
||||||
|
// send off this mute packet
|
||||||
|
nodeList->sendPacket(std::move(negotiateFormatPacket), *audioMixer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer<ReceivedMessage> message) {
|
void AudioClient::handleAudioEnvironmentDataPacket(QSharedPointer<ReceivedMessage> message) {
|
||||||
|
|
||||||
char bitset;
|
char bitset;
|
||||||
|
@ -528,6 +557,16 @@ void AudioClient::handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> me
|
||||||
emit muteEnvironmentRequested(position, radius);
|
emit muteEnvironmentRequested(position, radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioClient::handleSelectedAudioFormat(QSharedPointer<ReceivedMessage> message) {
|
||||||
|
qDebug() << __FUNCTION__;
|
||||||
|
|
||||||
|
// write them to our packet
|
||||||
|
QString selectedCodec = message->readString();
|
||||||
|
|
||||||
|
qDebug() << "selectedCodec:" << selectedCodec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QString AudioClient::getDefaultDeviceName(QAudio::Mode mode) {
|
QString AudioClient::getDefaultDeviceName(QAudio::Mode mode) {
|
||||||
QAudioDeviceInfo deviceInfo = defaultAudioDeviceForMode(mode);
|
QAudioDeviceInfo deviceInfo = defaultAudioDeviceForMode(mode);
|
||||||
return deviceInfo.deviceName();
|
return deviceInfo.deviceName();
|
||||||
|
@ -1227,6 +1266,13 @@ void AudioClient::loadSettings() {
|
||||||
windowSecondsForDesiredCalcOnTooManyStarves.get());
|
windowSecondsForDesiredCalcOnTooManyStarves.get());
|
||||||
_receivedAudioStream.setWindowSecondsForDesiredReduction(windowSecondsForDesiredReduction.get());
|
_receivedAudioStream.setWindowSecondsForDesiredReduction(windowSecondsForDesiredReduction.get());
|
||||||
_receivedAudioStream.setRepetitionWithFade(repetitionWithFade.get());
|
_receivedAudioStream.setRepetitionWithFade(repetitionWithFade.get());
|
||||||
|
|
||||||
|
qDebug() << "---- Initializing Audio Client ----";
|
||||||
|
auto codecPlugins = PluginManager::getInstance()->getCodecPlugins();
|
||||||
|
for (auto& plugin : codecPlugins) {
|
||||||
|
qDebug() << "Codec available:" << plugin->getName();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioClient::saveSettings() {
|
void AudioClient::saveSettings() {
|
||||||
|
|
|
@ -94,6 +94,8 @@ public:
|
||||||
int _unfulfilledReads;
|
int _unfulfilledReads;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void negotiateAudioFormat();
|
||||||
|
|
||||||
const MixedProcessedAudioStream& getReceivedAudioStream() const { return _receivedAudioStream; }
|
const MixedProcessedAudioStream& getReceivedAudioStream() const { return _receivedAudioStream; }
|
||||||
MixedProcessedAudioStream& getReceivedAudioStream() { return _receivedAudioStream; }
|
MixedProcessedAudioStream& getReceivedAudioStream() { return _receivedAudioStream; }
|
||||||
|
|
||||||
|
@ -139,6 +141,7 @@ public slots:
|
||||||
void handleAudioDataPacket(QSharedPointer<ReceivedMessage> message);
|
void handleAudioDataPacket(QSharedPointer<ReceivedMessage> message);
|
||||||
void handleNoisyMutePacket(QSharedPointer<ReceivedMessage> message);
|
void handleNoisyMutePacket(QSharedPointer<ReceivedMessage> message);
|
||||||
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> message);
|
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> message);
|
||||||
|
void handleSelectedAudioFormat(QSharedPointer<ReceivedMessage> message);
|
||||||
|
|
||||||
void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); }
|
void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); }
|
||||||
void handleAudioInput();
|
void handleAudioInput();
|
||||||
|
@ -292,6 +295,8 @@ private:
|
||||||
void checkDevices();
|
void checkDevices();
|
||||||
|
|
||||||
bool _hasReceivedFirstPacket = false;
|
bool _hasReceivedFirstPacket = false;
|
||||||
|
|
||||||
|
//CodecPluginPointer _codec { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,9 @@ public:
|
||||||
AssetMappingOperation,
|
AssetMappingOperation,
|
||||||
AssetMappingOperationReply,
|
AssetMappingOperationReply,
|
||||||
ICEServerHeartbeatACK,
|
ICEServerHeartbeatACK,
|
||||||
LAST_PACKET_TYPE = ICEServerHeartbeatACK
|
NegotiateAudioFormat,
|
||||||
|
SelectedAudioFormat,
|
||||||
|
LAST_PACKET_TYPE = SelectedAudioFormat
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,5 +15,6 @@
|
||||||
class CodecPlugin : public Plugin {
|
class CodecPlugin : public Plugin {
|
||||||
public:
|
public:
|
||||||
virtual void decode(const QByteArray& encodedBuffer, QByteArray& decodedBuffer) = 0;
|
virtual void decode(const QByteArray& encodedBuffer, QByteArray& decodedBuffer) = 0;
|
||||||
|
virtual void encode(const QByteArray& decodedBuffer, QByteArray& encodedBuffer) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -222,10 +222,11 @@ const CodecPluginList& PluginManager::getCodecPlugins() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& container = PluginContainer::getInstance();
|
|
||||||
for (auto plugin : codecPlugins) {
|
for (auto plugin : codecPlugins) {
|
||||||
plugin->setContainer(&container);
|
plugin->setContainer(_container);
|
||||||
plugin->init();
|
plugin->init();
|
||||||
|
|
||||||
|
qDebug() << "init codec:" << plugin->getName();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return codecPlugins;
|
return codecPlugins;
|
||||||
|
|
|
@ -43,3 +43,7 @@ void PCMCodecManager::decode(const QByteArray& encodedBuffer, QByteArray& decode
|
||||||
decodedBuffer = encodedBuffer;
|
decodedBuffer = encodedBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PCMCodecManager::encode(const QByteArray& decodedBuffer, QByteArray& encodedBuffer) {
|
||||||
|
// this codec doesn't actually do anything....
|
||||||
|
encodedBuffer = decodedBuffer;
|
||||||
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ public:
|
||||||
void deactivate() override;
|
void deactivate() override;
|
||||||
|
|
||||||
virtual void decode(const QByteArray& encodedBuffer, QByteArray& decodedBuffer) override;
|
virtual void decode(const QByteArray& encodedBuffer, QByteArray& decodedBuffer) override;
|
||||||
|
virtual void encode(const QByteArray& decodedBuffer, QByteArray& encodedBuffer) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const QString NAME;
|
static const QString NAME;
|
||||||
|
|
Loading…
Reference in a new issue