size_t CSound::GetSoundId(const std::string& name, bool hardFail) { GML_RECMUTEX_LOCK(sound); // GetSoundId if (sources.empty()) return 0; soundMapT::const_iterator it = soundMap.find(name); if (it != soundMap.end()) { // sounditem found return it->second; } else { size_t newid = sounds.size(); soundItemDefMap::iterator itemDefIt = soundItemDefs.find(name); if (itemDefIt != soundItemDefs.end()) { //logOutput.Print("CSound::GetSoundId: %s points to %s", name.c_str(), it->second.c_str()); sounds.push_back(new SoundItem(GetWaveBuffer(itemDefIt->second["file"], hardFail), itemDefIt->second)); soundMap[name] = newid; return newid; } else { if (GetWaveId(name, hardFail) > 0) // maybe raw filename? { soundItemDef temp = defaultItem; temp["name"] = name; sounds.push_back(new SoundItem(GetWaveBuffer(name, hardFail), temp)); // use raw file with default values soundMap[name] = newid; return newid; } else { if (hardFail) ErrorMessageBox("Couldn't open wav file", name, 0); else { LogObject(LOG_SOUND) << "CSound::GetSoundId: could not find sound: " << name; return 0; } } } } return 0; }
bool CSound::LoadSoundDefs(const std::string& filename) { //! can be called from LuaUnsyncedCtrl too boost::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()) { LogObject(LOG_SOUND) << "Could not load " << filename << ": " << parser.GetErrorLog(); return false; } else { const LuaTable soundRoot = parser.GetRoot(); const LuaTable soundItemTable = soundRoot.SubTable("SoundItems"); if (!soundItemTable.IsValid()) { LogObject(LOG_SOUND) << "CSound(): could not parse SoundItems table in " << filename; 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()) LogObject(LOG_SOUND) << "CSound(): two SoundItems have the same name: " << name; soundItemDef::const_iterator inspec = bufmap.find("file"); if (inspec == bufmap.end()) // no file, drop LogObject(LOG_SOUND) << "CSound(): SoundItem has no file tag: " << name; else soundItemDefs[name] = bufmap; if (buf.KeyExists("preload")) { LogObject(LOG_SOUND) << "CSound(): preloading " << name; const size_t newid = sounds.size(); sounds.push_back(new SoundItem(GetWaveBuffer(bufmap["file"], true), bufmap)); soundMap[name] = newid; } } LogObject(LOG_SOUND) << "CSound(): Sucessfully parsed " << keys.size() << " SoundItems from " << filename; } } return true; }