void AudioMixerClientData::negotiateAudioFormat(ReceivedMessage& message, const SharedNodePointer& node) { quint8 numberOfCodecs; message.readPrimitive(&numberOfCodecs); std::vector<QString> codecs; for (auto i = 0; i < numberOfCodecs; i++) { codecs.push_back(message.readString()); } const std::pair<QString, CodecPluginPointer> codec = AudioMixer::negotiateCodec(codecs); setupCodec(codec.second, codec.first); sendSelectAudioFormat(node, codec.first); }
void AudioMixerClientData::handleMismatchAudioFormat(SharedNodePointer node, const QString& currentCodec, const QString& recievedCodec) { sendSelectAudioFormat(node, currentCodec); }
void AudioMixer::handleNegotiateAudioFormat(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) { QStringList availableCodecs; auto codecPlugins = PluginManager::getInstance()->getCodecPlugins(); if (codecPlugins.size() > 0) { for (auto& plugin : codecPlugins) { auto codecName = plugin->getName(); qDebug() << "Codec available:" << codecName; availableCodecs.append(codecName); } } else { qDebug() << "No Codecs available..."; } CodecPluginPointer selectedCodec; QString selectedCodecName; QStringList codecPreferenceList = _codecPreferenceOrder.split(","); // read the codecs requested by the client const int MAX_PREFERENCE = 99999; int preferredCodecIndex = MAX_PREFERENCE; QString preferredCodec; quint8 numberOfCodecs = 0; message->readPrimitive(&numberOfCodecs); qDebug() << "numberOfCodecs:" << numberOfCodecs; QStringList codecList; for (quint16 i = 0; i < numberOfCodecs; i++) { QString requestedCodec = message->readString(); int preferenceOfThisCodec = codecPreferenceList.indexOf(requestedCodec); bool codecAvailable = availableCodecs.contains(requestedCodec); qDebug() << "requestedCodec:" << requestedCodec << "preference:" << preferenceOfThisCodec << "available:" << codecAvailable; if (codecAvailable) { codecList.append(requestedCodec); if (preferenceOfThisCodec >= 0 && preferenceOfThisCodec < preferredCodecIndex) { qDebug() << "This codec is preferred..."; selectedCodecName = requestedCodec; preferredCodecIndex = preferenceOfThisCodec; } } } qDebug() << "all requested and available codecs:" << codecList; // choose first codec if (!selectedCodecName.isEmpty()) { if (codecPlugins.size() > 0) { for (auto& plugin : codecPlugins) { if (selectedCodecName == plugin->getName()) { qDebug() << "Selecting codec:" << selectedCodecName; selectedCodec = plugin; break; } } } } auto clientData = dynamic_cast<AudioMixerClientData*>(sendingNode->getLinkedData()); // FIXME - why would we not have client data at this point?? if (!clientData) { qDebug() << "UNEXPECTED -- didn't have node linked data in " << __FUNCTION__; sendingNode->setLinkedData(std::unique_ptr<NodeData> { new AudioMixerClientData(sendingNode->getUUID()) }); clientData = dynamic_cast<AudioMixerClientData*>(sendingNode->getLinkedData()); connect(clientData, &AudioMixerClientData::injectorStreamFinished, this, &AudioMixer::removeHRTFsForFinishedInjector); } clientData->setupCodec(selectedCodec, selectedCodecName); qDebug() << "selectedCodecName:" << selectedCodecName; clientData->sendSelectAudioFormat(sendingNode, selectedCodecName); }