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::MakeItemFromDef(const soundItemDef& itemDef) { //! MakeItemFromDef is private. Only caller is LoadSoundDefs and it sets the mutex itself. //boost::recursive_mutex::scoped_lock lck(soundMutex); const size_t newid = sounds.size(); soundItemDef::const_iterator it = itemDef.find("file"); boost::shared_ptr<SoundBuffer> buffer = SoundBuffer::GetById(LoadSoundBuffer(it->second, false)); if (buffer) { SoundItem* buf = new SoundItem(buffer, itemDef); sounds.push_back(buf); soundMap[buf->Name()] = newid; return newid; } else 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; } } } } }