diff --git a/daemon/bin/dbus/configurationmanager-introspec.xml b/daemon/bin/dbus/configurationmanager-introspec.xml index 1bebf00e8321b92a722d0f3cb7fa109fd3968af4..ca19ba2646dab96b9aa5ecba2810c6733923a57f 100644 --- a/daemon/bin/dbus/configurationmanager-introspec.xml +++ b/daemon/bin/dbus/configurationmanager-introspec.xml @@ -382,6 +382,15 @@ </arg> </method> + <method name="setCodecDetails" tp:name-for-bindings="setCodecDetails"> + <arg type="b" name="result" direction="out"></arg> + <arg type="s" name="accountID" direction="in"></arg> + <arg type="u" name="codecId" direction="in"></arg> + <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="MapStringString"/> + <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map"> + </arg> + </method> + <method name="getActiveCodecList" tp:name-for-bindings="getActiveCodecList"> <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorUInt"/> <arg type="s" name="accountID" direction="in"> diff --git a/daemon/bin/dbus/dbusconfigurationmanager.cpp b/daemon/bin/dbus/dbusconfigurationmanager.cpp index 5099912e05f495288e42c3fe6c7a293973c944b0..0587b7251ea75762a970723619fb4d3d3bc1f56a 100644 --- a/daemon/bin/dbus/dbusconfigurationmanager.cpp +++ b/daemon/bin/dbus/dbusconfigurationmanager.cpp @@ -121,6 +121,13 @@ DBusConfigurationManager::getCodecDetails(const std::string& accountID, const un return DRing::getCodecDetails(accountID, codecId); } +auto +DBusConfigurationManager::setCodecDetails(const std::string& accountID, const unsigned& codecId, const std::map<std::string, std::string>& details) +-> decltype(DRing::setCodecDetails(accountID, codecId, details)) +{ + return DRing::setCodecDetails(accountID, codecId, details); +} + auto DBusConfigurationManager::getActiveCodecList(const std::string& accountID) -> decltype(DRing::getActiveCodecList(accountID)) { diff --git a/daemon/bin/dbus/dbusconfigurationmanager.h b/daemon/bin/dbus/dbusconfigurationmanager.h index 4ebba7a264683a2848fa6b8baef5d4dcc46394b6..7368abb518e992313ca681d745bf9630765f84d5 100644 --- a/daemon/bin/dbus/dbusconfigurationmanager.h +++ b/daemon/bin/dbus/dbusconfigurationmanager.h @@ -79,6 +79,7 @@ class DBusConfigurationManager : std::vector<unsigned> getCodecList(); std::vector<std::string> getSupportedTlsMethod(); std::map<std::string, std::string> getCodecDetails(const std::string& accountID, const unsigned& codecId); + bool setCodecDetails(const std::string& accountID, const unsigned& codecId, const std::map<std::string, std::string>& details); std::vector<unsigned> getActiveCodecList(const std::string& accountID); void setActiveCodecList(const std::string& accountID, const std::vector<unsigned>& list); std::vector<std::string> getAudioPluginList(); diff --git a/daemon/src/client/configurationmanager.cpp b/daemon/src/client/configurationmanager.cpp index 792b9c96fce130d80682b2bbce471fca9896a722..2fa897440dac681cdef6a75fa7041fc8b681a959 100644 --- a/daemon/src/client/configurationmanager.cpp +++ b/daemon/src/client/configurationmanager.cpp @@ -289,6 +289,40 @@ getSupportedCiphers(const std::string& accountID) } +bool +setCodecDetails(const std::string& accountID, + const unsigned& codecId, + const std::map<std::string, std::string>& details) +{ + auto acc = ring::Manager::instance().getAccount(accountID); + if (!acc) { + RING_ERR("Could not find account %s. can not set codec details" + , accountID.c_str()); + return false; + } + + auto codec = acc->searchCodecById(codecId, ring::MEDIA_ALL); + if (!codec) { + RING_ERR("can not find codec %d", codecId); + return false; + + } + if (codec->systemCodecInfo.mediaType & ring::MEDIA_AUDIO) { + if (auto foundCodec = std::static_pointer_cast<ring::AccountAudioCodecInfo>(codec)) { + foundCodec->setCodecSpecifications(details); + return true; + } + } + + if (codec->systemCodecInfo.mediaType & ring::MEDIA_VIDEO) { + if (auto foundCodec = std::static_pointer_cast<ring::AccountVideoCodecInfo>(codec)) { + foundCodec->setCodecSpecifications(details); + return true; + } + } + return false; +} + std::map<std::string, std::string> getCodecDetails(const std::string& accountID, const unsigned& codecId) { diff --git a/daemon/src/dring/configurationmanager_interface.h b/daemon/src/dring/configurationmanager_interface.h index 71db74f5e74edf2d100fb068bc9005134a4833ea..9bdf42a2e4ab584e527dcad6d38c1490752e58ef 100644 --- a/daemon/src/dring/configurationmanager_interface.h +++ b/daemon/src/dring/configurationmanager_interface.h @@ -63,6 +63,7 @@ std::vector<unsigned> getCodecList(); std::vector<std::string> getSupportedTlsMethod(); std::vector<std::string> getSupportedCiphers(const std::string& accountID); std::map<std::string, std::string> getCodecDetails(const std::string& accountID, const unsigned& codecId); +bool setCodecDetails(const std::string& accountID, const unsigned& codecId, const std::map<std::string, std::string>& details); std::vector<unsigned> getActiveCodecList(const std::string& accountID); void setActiveCodecList(const std::string& accountID, const std::vector<unsigned>& list); diff --git a/daemon/src/media/media_codec.cpp b/daemon/src/media/media_codec.cpp index e871734ab6422caf948c2528c96d59fe269414a0..f870bc94073719d1c1d8969de46441fc620c597b 100644 --- a/daemon/src/media/media_codec.cpp +++ b/daemon/src/media/media_codec.cpp @@ -165,6 +165,22 @@ AccountAudioCodecInfo::getCodecSpecifications() }; } +void +AccountAudioCodecInfo::setCodecSpecifications(const std::map<std::string, std::string>& details) +{ + auto it = details.find(DRing::Account::ConfProperties::CodecInfo::BITRATE); + if (it != details.end()) + bitrate = std::stoi(it->second); + + it = details.find(DRing::Account::ConfProperties::CodecInfo::SAMPLE_RATE); + if (it != details.end()) + audioformat.sample_rate = std::stoi(it->second); + + it = details.find(DRing::Account::ConfProperties::CodecInfo::CHANNEL_NUMBER); + if (it != details.end()) + audioformat.nb_channels = std::stoi(it->second); +} + bool AccountAudioCodecInfo::isPCMG722() const { @@ -192,6 +208,18 @@ AccountVideoCodecInfo::getCodecSpecifications() }; } +void +AccountVideoCodecInfo::setCodecSpecifications(const std::map<std::string, std::string>& details) +{ + auto it = details.find(DRing::Account::ConfProperties::CodecInfo::BITRATE); + if (it != details.end()) + bitrate = stoi(it->second); + + it = details.find(DRing::Account::ConfProperties::CodecInfo::FRAME_RATE); + if (it != details.end()) + frameRate = stoi(it->second); +} + AccountVideoCodecInfo::~AccountVideoCodecInfo() {} diff --git a/daemon/src/media/media_codec.h b/daemon/src/media/media_codec.h index 343b05a9d1ceaa83f5474af6af89171c218cffec..5b2de4e6c317ac6db832d3b6d69bf3f1d772b6cf 100644 --- a/daemon/src/media/media_codec.h +++ b/daemon/src/media/media_codec.h @@ -152,6 +152,7 @@ struct AccountAudioCodecInfo : AccountCodecInfo ~AccountAudioCodecInfo(); std::map<std::string, std::string> getCodecSpecifications(); + void setCodecSpecifications(const std::map<std::string, std::string>& details); /* account custom values */ AudioFormat audioformat {AudioFormat::NONE()}; @@ -163,6 +164,7 @@ struct AccountVideoCodecInfo : AccountCodecInfo AccountVideoCodecInfo(const SystemVideoCodecInfo& sysCodecInfo); ~AccountVideoCodecInfo(); + void setCodecSpecifications(const std::map<std::string, std::string>& details); std::map<std::string, std::string> getCodecSpecifications(); /* account custom values */