first cut at negotiating codecs

This commit is contained in:
Brad Hefta-Gaub 2016-06-23 17:14:41 -07:00
parent be37921845
commit d7bffc3eab
11 changed files with 94 additions and 5 deletions

View file

@ -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>();

View file

@ -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);

View file

@ -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) {

View file

@ -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")

View file

@ -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() {

View file

@ -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 };
};

View file

@ -95,7 +95,9 @@ public:
AssetMappingOperation,
AssetMappingOperationReply,
ICEServerHeartbeatACK,
LAST_PACKET_TYPE = ICEServerHeartbeatACK
NegotiateAudioFormat,
SelectedAudioFormat,
LAST_PACKET_TYPE = SelectedAudioFormat
};
};

View file

@ -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;
};

View file

@ -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;

View file

@ -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;
}

View file

@ -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;