diff --git a/daemon/src/audio/codecs/audiocodecfactory.cpp b/daemon/src/audio/codecs/audiocodecfactory.cpp index 7bf87aa827a58aeeaea76367ab67e0c56e0fbe7c..c6e2cc53c8eeb4219ab0e71c26c439aebebf2cee 100644 --- a/daemon/src/audio/codecs/audiocodecfactory.cpp +++ b/daemon/src/audio/codecs/audiocodecfactory.cpp @@ -37,8 +37,7 @@ #include "audiocodecfactory.h" #include "fileutils.h" - -AudioCodecFactory::AudioCodecFactory() : _CodecsMap(), _defaultCodecOrder(), _Cache(), _nbCodecs(), _CodecInMemory() +AudioCodecFactory::AudioCodecFactory() : _CodecsMap(), _defaultCodecOrder(), _Cache(), _CodecInMemory() { } @@ -47,44 +46,25 @@ AudioCodecFactory::~AudioCodecFactory() } -//std::vector<std::string> CodecDescriptor::getAllMimeSubtypes() -//{ -// std::vector<std::string> output; -// IdentifierToCodecInstanceMapIterator it; -// -// for (it = _codecsMap.begin(); it != _codecsMap.end(); it++) { -// output.push_back ( ( (*it).second)->getMimeSubtype()); -// } -// -// return output; -//} - - void AudioCodecFactory::init() { std::vector<sfl::Codec*> CodecDynamicList = scanCodecDirectory(); - _nbCodecs = CodecDynamicList.size(); - - if (_nbCodecs <= 0) - _error ("CodecDescriptor: Error - No codecs available"); + if (CodecDynamicList.size() == 0) + _error ("Error - No codecs available"); - for (int i = 0 ; i < _nbCodecs ; i++) { + for (size_t i = 0 ; i < CodecDynamicList.size() ; i++) { _CodecsMap[ (AudioCodecType) CodecDynamicList[i]->getPayloadType() ] = CodecDynamicList[i]; - _debug ("CodecDescriptor: %s" , CodecDynamicList[i]->getMimeSubtype().c_str()); + _debug ("Loaded codec %s" , CodecDynamicList[i]->getMimeSubtype().c_str()); } } void AudioCodecFactory::setDefaultOrder() { - _defaultCodecOrder.clear(); - CodecsMap::iterator iter = _CodecsMap.begin(); - - while (iter != _CodecsMap.end()) { + CodecsMap::iterator iter; + for (iter = _CodecsMap.begin(); iter != _CodecsMap.end(); ++iter) _defaultCodecOrder.push_back (iter->first); - iter ++ ; - } } std::string @@ -93,9 +73,8 @@ AudioCodecFactory::getCodecName (AudioCodecType payload) std::string resNull = ""; CodecsMap::iterator iter = _CodecsMap.find (payload); - if (iter!=_CodecsMap.end()) { + if (iter!=_CodecsMap.end()) return (iter->second->getMimeSubtype()); - } return resNull; } @@ -108,20 +87,19 @@ AudioCodecFactory::getCodec (AudioCodecType payload) if (iter != _CodecsMap.end()) return iter->second; - _error ("CodecDescriptor: Error cannont found codec %i in _CodecsMap from codec descriptor", payload); + _error ("CodecDescriptor: cannot find codec %i", payload); return NULL; } double AudioCodecFactory::getBitRate (AudioCodecType payload) { - CodecsMap::iterator iter = _CodecsMap.find (payload); if (iter!=_CodecsMap.end()) return (iter->second->getBitRate()); - else - return 0.0; + + return 0.0; } @@ -132,37 +110,27 @@ int AudioCodecFactory::getSampleRate (AudioCodecType payload) if (iter!=_CodecsMap.end()) return (iter->second->getClockRate()); - else - return 0; + + return 0; } void AudioCodecFactory::saveActiveCodecs (const std::vector<std::string>& list) { - _defaultCodecOrder.clear(); // list contains the ordered payload of active codecs picked by the user // we used the CodecOrder vector to save the order. - int i=0; - int payload; - size_t size = list.size(); - while ( (unsigned int) i < size) { - payload = std::atoi (list[i].data()); - - if (isCodecLoaded (payload)) { + for (size_t i = 0; i < list.size(); i++) { + int payload = std::atoi (list[i].data()); + if (isCodecLoaded (payload)) _defaultCodecOrder.push_back ( (AudioCodecType) payload); - } - - i++; } } void AudioCodecFactory::deleteHandlePointer (void) { - _debug ("CodecDesccriptor: Delete codec handle pointers"); - - for (int i = 0 ; (unsigned int) i < _CodecInMemory.size() ; i++) { + for (size_t i = 0 ; i < _CodecInMemory.size() ; i++) { unloadCodec (_CodecInMemory[i]); } @@ -172,37 +140,33 @@ AudioCodecFactory::deleteHandlePointer (void) std::vector<sfl::Codec*> AudioCodecFactory::scanCodecDirectory (void) { std::vector<sfl::Codec*> codecs; + std::vector<std::string> dirToScan; - std::string libDir = std::string (CODECS_DIR).append ("/"); - std::string homeDir = std::string (HOMEDIR) + DIR_SEPARATOR_STR + "." + PROGDIR + "/"; - const char *progDir = get_program_dir(); - // look for a CODECS_PATH environment variable...used in tests + dirToScan.push_back (std::string(HOMEDIR) + DIR_SEPARATOR_STR "." PROGDIR "/"); + dirToScan.push_back (CODECS_DIR "/"); const char *envDir = getenv("CODECS_PATH"); - std::vector<std::string> dirToScan; - dirToScan.push_back (homeDir); - dirToScan.push_back (libDir); if (envDir) dirToScan.push_back(std::string(envDir) + DIR_SEPARATOR_STR); + const char *progDir = get_program_dir(); if (progDir) dirToScan.push_back(std::string(progDir) + DIR_SEPARATOR_STR + "audio/codecs/"); - for (int i = 0 ; (unsigned int) i < dirToScan.size() ; i++) { + for (size_t i = 0 ; i < dirToScan.size() ; i++) { std::string dirStr = dirToScan[i]; _debug ("CodecDescriptor: Scanning %s to find audio codecs....", dirStr.c_str()); - DIR *dir = opendir (dirStr.c_str()); - sfl::Codec* audioCodec; + DIR *dir = opendir (dirStr.c_str()); if (!dir) continue; dirent *dirStruct; while ( (dirStruct = readdir (dir))) { - std::string file = dirStruct -> d_name ; + std::string file = dirStruct->d_name ; if (file == CURRENT_DIR or file == PARENT_DIR) continue; if (seemsValid (file) && !alreadyInCache (file)) { - audioCodec = loadCodec (dirStr+file); + sfl::Codec* audioCodec = loadCodec (dirStr+file); if (audioCodec) { codecs.push_back (audioCodec); _Cache.push_back (file); @@ -218,10 +182,7 @@ std::vector<sfl::Codec*> AudioCodecFactory::scanCodecDirectory (void) sfl::Codec* AudioCodecFactory::loadCodec (std::string path) { - - CodecHandlePointer p; void * codecHandle = dlopen (path.c_str() , RTLD_LAZY); - if (!codecHandle) { _error("%s\n", dlerror()); return NULL; @@ -231,14 +192,14 @@ sfl::Codec* AudioCodecFactory::loadCodec (std::string path) create_t* createCodec = (create_t*) dlsym (codecHandle , "create"); char *error = dlerror(); - if (error) + if (error) { _error("%s\n", error); + return NULL; + } sfl::Codec* a = createCodec(); - p = CodecHandlePointer (a, codecHandle); - - _CodecInMemory.push_back (p); + _CodecInMemory.push_back (CodecHandlePointer (a, codecHandle)); return a; } @@ -246,12 +207,13 @@ sfl::Codec* AudioCodecFactory::loadCodec (std::string path) void AudioCodecFactory::unloadCodec (CodecHandlePointer p) { - destroy_t* destroyCodec = (destroy_t*) dlsym (p.second , "destroy"); char *error = dlerror(); - if (error) + if (error) { _error("%s\n", error); + return; + } destroyCodec (p.first); @@ -281,7 +243,6 @@ sfl::Codec* AudioCodecFactory::instantiateCodec (AudioCodecType payload) sfl::Codec* AudioCodecFactory::getFirstCodecAvailable (void) { - CodecsMap::iterator iter = _CodecsMap.begin(); if (iter != _CodecsMap.end()) @@ -292,93 +253,65 @@ sfl::Codec* AudioCodecFactory::getFirstCodecAvailable (void) bool AudioCodecFactory::seemsValid (std::string lib) { - // The name of the shared library seems valid <==> it looks like libcodec_xxx.so // We check this - std::string begin = SFL_CODEC_VALID_PREFIX; - std::string end = SFL_CODEC_VALID_EXTEN; - - // First : check the length of the file name. - // If it is shorter than begin.length() + end.length() , not a SFL shared library + std::string prefix = SFL_CODEC_VALID_PREFIX; + std::string suffix = SFL_CODEC_VALID_EXTEN; - if (lib.length() <= begin.length() + end.length()) + ssize_t len = lib.length() - prefix.length() - suffix.length(); + if (len < 0) return false; // Second: check the extension of the file name. // If it is different than SFL_CODEC_VALID_EXTEN , not a SFL shared library - if (lib.substr (lib.length() - end.length() , lib.length()) != end) + if (lib.substr (lib.length() - suffix.length() , lib.length()) != suffix) return false; -#ifdef HAVE_SPEEX_CODEC - // Nothing special -#else - - if (lib.substr (begin.length() , lib.length() - begin.length() - end.length()) == SPEEX_STRING_DESCRIPTION) +#ifndef HAVE_SPEEX_CODEC + if (lib.substr (prefix.length() , len) == SPEEX_STRING_DESCRIPTION) return false; - #endif -#ifdef HAVE_GSM_CODEC - // Nothing special -#else - - if (lib.substr (begin.length() , lib.length() - begin.length() - end.length()) == GSM_STRING_DESCRIPTION) +#ifndef HAVE_GSM_CODEC + if (lib.substr (prefix.length() , len) == GSM_STRING_DESCRIPTION) return false; - #endif -#ifdef BUILD_ILBC - // Nothing special -#else - - if (lib.substr (begin.length() , lib.length() - begin.length() - end.length()) == ILBC_STRING_DESCRIPTION) +#ifndef BUILD_ILBC + if (lib.substr (prefix.length() , len) == ILBC_STRING_DESCRIPTION) return false; - #endif - if (lib.substr (0, begin.length()) == begin) - if (lib.substr (lib.length() - end.length() , end.length()) == end) + if (lib.substr (0, prefix.length()) == prefix) + if (lib.substr (lib.length() - suffix.length() , suffix.length()) == suffix) return true; - else - return false; - else - return false; + + return false; } bool AudioCodecFactory::alreadyInCache (std::string lib) { - int i; - - for (i = 0 ; (unsigned int) i < _Cache.size() ; i++) { - if (_Cache[i] == lib) { + for (size_t i = 0 ; i < _Cache.size() ; i++) + if (_Cache[i] == lib) return true; - } - } return false; } bool AudioCodecFactory::isCodecLoaded (int payload) { - - CodecsMap::iterator iter = _CodecsMap.begin(); - - while (iter != _CodecsMap.end()) { + CodecsMap::iterator iter; + for (iter = _CodecsMap.begin(); iter != _CodecsMap.end(); ++iter) if (iter -> first == payload) return true; - iter++; - } - return false; } std::vector <std::string> AudioCodecFactory::getCodecSpecifications (const int32_t& payload) { - _debug ("CodecDescriptor: Gathering codec specifications for payload %i", payload); - std::vector<std::string> v; std::stringstream ss; diff --git a/daemon/src/audio/codecs/audiocodecfactory.h b/daemon/src/audio/codecs/audiocodecfactory.h index fa8c053f0124e979391ed677ddc582c1d4be1eb3..de91ac7b0fa477876de7a16a4d786250b6944770 100644 --- a/daemon/src/audio/codecs/audiocodecfactory.h +++ b/daemon/src/audio/codecs/audiocodecfactory.h @@ -69,7 +69,7 @@ class AudioCodecFactory * Accessor to data structures * @return CodecsMap& The available codec */ - CodecsMap& getCodecsMap() { + const CodecsMap& getCodecsMap() const { return _CodecsMap; } @@ -119,14 +119,6 @@ class AudioCodecFactory */ void saveActiveCodecs (const std::vector<std::string>& list); - /** - * Get the number of codecs loaded in dynamic memory - * @return int The number - */ - int getCodecsNumber (void) { - return _nbCodecs; - } - /** * Unreferences the codecs loaded in memory */ @@ -215,11 +207,6 @@ class AudioCodecFactory */ std::vector<std::string> _Cache; - /** - * Number of codecs loaded - */ - int _nbCodecs; - /** * Vector containing pairs * Pair between pointer on function handle and pointer on audiocodec object diff --git a/daemon/src/global.h b/daemon/src/global.h index 6929f96ef938224f9dbda9ec9f89f2cf93060ef8..87543c04401187896d6d8cba94d8983741d83033 100644 --- a/daemon/src/global.h +++ b/daemon/src/global.h @@ -159,8 +159,8 @@ typedef enum { /** The struct to reflect the order the user wants to use the codecs */ typedef std::vector<AudioCodecType> CodecOrder; -const char * const IP2IP_PROFILE = "IP2IP"; -const char * const DIR_SEPARATOR_STR = "/"; // Directory separator char -const char DIR_SEPARATOR_CH = '/'; /** Directory separator string */ +#define IP2IP_PROFILE "IP2IP" +#define DIR_SEPARATOR_STR "/" // Directory separator char +#define DIR_SEPARATOR_CH = '/' /** Directory separator string */ #endif // __GLOBAL_H__ diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index f302ac225ca99c907dc98caa1ad4db228ce60bd1..43b12f9668d9953c49db6c9cc479df616eb27936 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -97,7 +97,7 @@ void ManagerImpl::init () selectAudioDriver(); // Initialize the list of supported audio codecs - initAudioCodec(); + _audioCodecFactory.init(); audioLayerMutexLock(); @@ -2067,7 +2067,7 @@ void ManagerImpl::ringtone (const std::string& accountID) } std::string ringchoice = account->getRingtonePath(); - if (ringchoice.find (DIR_SEPARATOR_CH) == std::string::npos) { + if (ringchoice.find (DIR_SEPARATOR_STR) == std::string::npos) { // check inside global share directory ringchoice = std::string (PROGSHAREDIR) + DIR_SEPARATOR_STR + RINGDIR + DIR_SEPARATOR_STR + ringchoice; @@ -2259,19 +2259,6 @@ void ManagerImpl::initConfigFile (std::string alternate) } } -/** - * Initialization: Main Thread - */ -void ManagerImpl::initAudioCodec (void) -{ - _info ("Manager: Init audio codecs"); - - /* Init list of all supported codecs by the application. - * This is a global list. Every account will inherit it. - */ - _audioCodecFactory.init(); -} - std::vector<std::string> ManagerImpl::unserialize (std::string s) { std::vector<std::string> list; diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index 5f9b5dd51cf6900135ab1969aeeeea9de991dc04..1290f688a6b7642f9d1bb84313dfb86269d31646 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -1041,11 +1041,6 @@ class ManagerImpl */ std::string getConfigFile (void) const; - /* - * Initialize audiocodec with config setting - */ - void initAudioCodec (void); - /* * Initialize zeroconf module and scanning