size_t CSound::GetSoundId(const std::string& name) { boost::recursive_mutex::scoped_lock lck(soundMutex); if (sources.empty()) return 0; soundMapT::const_iterator it = soundMap.find(name); if (it != soundMap.end()) { // sounditem found return it->second; } else { soundItemDefMap::const_iterator itemDefIt = soundItemDefs.find(StringToLower(name)); if (itemDefIt != soundItemDefs.end()) { return MakeItemFromDef(itemDefIt->second); } else { if (LoadSoundBuffer(name) > 0) // maybe raw filename? { soundItemDef temp = defaultItem; temp["file"] = name; return MakeItemFromDef(temp); } else { LOG_L(L_ERROR, "CSound::GetSoundId: could not find sound: %s", name.c_str()); return 0; } } } }
size_t CSound::GetSoundId(const std::string& name, bool hardFail) { boost::recursive_mutex::scoped_lock lck(soundMutex); if (sources.empty()) return 0; soundMapT::const_iterator it = soundMap.find(name); if (it != soundMap.end()) { // sounditem found return it->second; } else { soundItemDefMap::const_iterator itemDefIt = soundItemDefs.find(name); if (itemDefIt != soundItemDefs.end()) { return MakeItemFromDef(itemDefIt->second); } else { if (LoadSoundBuffer(name, hardFail) > 0) // maybe raw filename? { soundItemDef temp = defaultItem; temp["file"] = name; return MakeItemFromDef(temp); } else { if (hardFail) { ErrorMessageBox("Couldn't open wav file", name, 0); return 0; } else { LOG_L(L_WARNING, "CSound::GetSoundId: could not find sound: %s", name.c_str()); return 0; } } } } }
bool CSound::LoadSoundDefs(const std::string& fileName) { //! can be called from LuaUnsyncedCtrl too boost::recursive_mutex::scoped_lock lck(soundMutex); LuaParser parser(fileName, SPRING_VFS_MOD, SPRING_VFS_ZIP); parser.SetLowerKeys(false); parser.SetLowerCppKeys(false); parser.Execute(); if (!parser.IsValid()) { LOG_L(L_WARNING, "Could not load %s: %s", fileName.c_str(), parser.GetErrorLog().c_str()); return false; } else { const LuaTable soundRoot = parser.GetRoot(); const LuaTable soundItemTable = soundRoot.SubTable("SoundItems"); if (!soundItemTable.IsValid()) { LOG_L(L_WARNING, "CSound(): could not parse SoundItems table in %s", fileName.c_str()); return false; } else { std::vector<std::string> keys; soundItemTable.GetKeys(keys); for (std::vector<std::string>::const_iterator it = keys.begin(); it != keys.end(); ++it) { const std::string name(*it); soundItemDef bufmap; const LuaTable buf(soundItemTable.SubTable(*it)); buf.GetMap(bufmap); bufmap["name"] = name; soundItemDefMap::const_iterator sit = soundItemDefs.find(name); if (sit != soundItemDefs.end()) LOG_L(L_WARNING, "Sound %s gets overwritten by %s", name.c_str(), fileName.c_str()); soundItemDef::const_iterator inspec = bufmap.find("file"); if (inspec == bufmap.end()) { // no file, drop LOG_L(L_WARNING, "Sound %s is missing file tag (ignoring)", name.c_str()); } else { soundItemDefs[name] = bufmap; } if (buf.KeyExists("preload")) { MakeItemFromDef(bufmap); } } LOG(" parsed %i sounds from %s", (int)keys.size(), fileName.c_str()); } } return true; }
bool CSound::LoadSoundDefsImpl(const std::string& fileName) { //! can be called from LuaUnsyncedCtrl too boost::recursive_mutex::scoped_lock lck(soundMutex); LuaParser parser(fileName, SPRING_VFS_MOD, SPRING_VFS_ZIP); parser.Execute(); if (!parser.IsValid()) { LOG_L(L_WARNING, "Could not load %s: %s", fileName.c_str(), parser.GetErrorLog().c_str()); return false; } else { const LuaTable soundRoot = parser.GetRoot(); const LuaTable soundItemTable = soundRoot.SubTable("SoundItems"); if (!soundItemTable.IsValid()) { LOG_L(L_WARNING, "CSound(): could not parse SoundItems table in %s", fileName.c_str()); return false; } else { std::vector<std::string> keys; soundItemTable.GetKeys(keys); for (std::vector<std::string>::const_iterator it = keys.begin(); it != keys.end(); ++it) { std::string name(*it); soundItemDef bufmap; const LuaTable buf(soundItemTable.SubTable(name)); buf.GetMap(bufmap); bufmap["name"] = name; soundItemDefMap::const_iterator sit = soundItemDefs.find(name); if (name == "default") { defaultItem = bufmap; defaultItem.erase("name"); //must be empty for default item defaultItem.erase("file"); continue; } if (sit != soundItemDefs.end()) LOG_L(L_WARNING, "Sound %s gets overwritten by %s", name.c_str(), fileName.c_str()); if (!buf.KeyExists("file")) { // no file, drop LOG_L(L_WARNING, "Sound %s is missing file tag (ignoring)", name.c_str()); continue; } else { soundItemDefs[name] = bufmap; } if (buf.KeyExists("preload")) { MakeItemFromDef(bufmap); } } LOG(" parsed %i sounds from %s", (int)keys.size(), fileName.c_str()); } } //FIXME why do sounds w/o an own soundItemDef create (!=pointer) a new one from the defaultItem? for (soundItemDefMap::iterator it = soundItemDefs.begin(); it != soundItemDefs.end(); ++it) { soundItemDef& snddef = it->second; if (snddef.find("name") == snddef.end()) { // uses defaultItem! update it! const std::string file = snddef["file"]; snddef = defaultItem; snddef["file"] = file; } } return true; }