mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-07 08:23:17 +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 },
|
||||
this, "handleNodeAudioPacket");
|
||||
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
||||
packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat");
|
||||
|
||||
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) {
|
||||
// enumerate the connected listeners to remove HRTF objects for the disconnected node
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
|
|
|
@ -45,6 +45,7 @@ private slots:
|
|||
void broadcastMixes();
|
||||
void handleNodeAudioPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||
void handleNegotiateAudioFormat(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode);
|
||||
void handleNodeKilled(SharedNodePointer killedNode);
|
||||
|
||||
void removeHRTFsForFinishedInjector(const QUuid& streamID);
|
||||
|
|
|
@ -1243,7 +1243,6 @@ QString Application::getUserAgent() {
|
|||
userAgent += " " + formatPluginName(cp->getName());
|
||||
}
|
||||
|
||||
qDebug() << __FUNCTION__ << ":" << 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) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
set(TARGET_NAME audio-client)
|
||||
setup_hifi_library(Network Multimedia)
|
||||
link_hifi_libraries(audio)
|
||||
link_hifi_libraries(audio plugins)
|
||||
|
||||
# append audio includes to our list of includes to bubble
|
||||
target_include_directories(${TARGET_NAME} PUBLIC "${HIFI_LIBRARY_DIR}/audio/src")
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#include <QtMultimedia/QAudioOutput>
|
||||
|
||||
#include <NodeList.h>
|
||||
#include <plugins/CodecPlugin.h>
|
||||
#include <plugins/PluginManager.h>
|
||||
#include <udt/PacketHeaders.h>
|
||||
#include <PositionalAudioStream.h>
|
||||
#include <SettingHandle.h>
|
||||
|
@ -134,6 +136,7 @@ AudioClient::AudioClient() :
|
|||
packetReceiver.registerListener(PacketType::MixedAudio, this, "handleAudioDataPacket");
|
||||
packetReceiver.registerListener(PacketType::NoisyMute, this, "handleNoisyMutePacket");
|
||||
packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
||||
packetReceiver.registerListener(PacketType::SelectedAudioFormat, this, "handleSelectedAudioFormat");
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
char bitset;
|
||||
|
@ -528,6 +557,16 @@ void AudioClient::handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> me
|
|||
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) {
|
||||
QAudioDeviceInfo deviceInfo = defaultAudioDeviceForMode(mode);
|
||||
return deviceInfo.deviceName();
|
||||
|
@ -1227,6 +1266,13 @@ void AudioClient::loadSettings() {
|
|||
windowSecondsForDesiredCalcOnTooManyStarves.get());
|
||||
_receivedAudioStream.setWindowSecondsForDesiredReduction(windowSecondsForDesiredReduction.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() {
|
||||
|
|
|
@ -94,6 +94,8 @@ public:
|
|||
int _unfulfilledReads;
|
||||
};
|
||||
|
||||
void negotiateAudioFormat();
|
||||
|
||||
const MixedProcessedAudioStream& getReceivedAudioStream() const { return _receivedAudioStream; }
|
||||
MixedProcessedAudioStream& getReceivedAudioStream() { return _receivedAudioStream; }
|
||||
|
||||
|
@ -139,6 +141,7 @@ public slots:
|
|||
void handleAudioDataPacket(QSharedPointer<ReceivedMessage> message);
|
||||
void handleNoisyMutePacket(QSharedPointer<ReceivedMessage> message);
|
||||
void handleMuteEnvironmentPacket(QSharedPointer<ReceivedMessage> message);
|
||||
void handleSelectedAudioFormat(QSharedPointer<ReceivedMessage> message);
|
||||
|
||||
void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); }
|
||||
void handleAudioInput();
|
||||
|
@ -292,6 +295,8 @@ private:
|
|||
void checkDevices();
|
||||
|
||||
bool _hasReceivedFirstPacket = false;
|
||||
|
||||
//CodecPluginPointer _codec { nullptr };
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -95,7 +95,9 @@ public:
|
|||
AssetMappingOperation,
|
||||
AssetMappingOperationReply,
|
||||
ICEServerHeartbeatACK,
|
||||
LAST_PACKET_TYPE = ICEServerHeartbeatACK
|
||||
NegotiateAudioFormat,
|
||||
SelectedAudioFormat,
|
||||
LAST_PACKET_TYPE = SelectedAudioFormat
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -15,5 +15,6 @@
|
|||
class CodecPlugin : public Plugin {
|
||||
public:
|
||||
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) {
|
||||
plugin->setContainer(&container);
|
||||
plugin->setContainer(_container);
|
||||
plugin->init();
|
||||
|
||||
qDebug() << "init codec:" << plugin->getName();
|
||||
}
|
||||
});
|
||||
return codecPlugins;
|
||||
|
|
|
@ -43,3 +43,7 @@ void PCMCodecManager::decode(const QByteArray& encodedBuffer, QByteArray& decode
|
|||
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;
|
||||
|
||||
virtual void decode(const QByteArray& encodedBuffer, QByteArray& decodedBuffer) override;
|
||||
virtual void encode(const QByteArray& decodedBuffer, QByteArray& encodedBuffer) override;
|
||||
|
||||
private:
|
||||
static const QString NAME;
|
||||
|
|
Loading…
Reference in a new issue