Fixed: Sound CSheetID implementation (part 3) (partially tested)

This commit is contained in:
kaetemi 2012-06-02 16:06:10 +02:00
parent fe90c89d9a
commit 75936288f5
7 changed files with 53 additions and 19 deletions

View file

@ -49,6 +49,7 @@ void Init()
{
try
{
CSheetId::initWithoutSheet();
CPath::addSearchPath(NL_SOUND_DATA"/data", true, false);

View file

@ -62,6 +62,7 @@ static void initSample()
{
if (!INelContext::isContextInitialised())
new CApplicationContext();
CSheetId::initWithoutSheet();
CPath::addSearchPath(NL_SOUND_DATA"/data", true, false);
printf("Sample demonstrating OGG playback using stream file .sound sheets.");

View file

@ -59,6 +59,7 @@ static void initSample()
{
if (!INelContext::isContextInitialised())
new CApplicationContext();
CSheetId::initWithoutSheet();
CPath::addSearchPath(NL_SOUND_DATA"/database/build/", true, false);
printf("Sample demonstrating OGG playback using UStreamSource.");

View file

@ -109,7 +109,11 @@ CSheetId::CSheetId( const string& sheetName )
CSheetId::CSheetId( const std::string& sheetName, const std::string &defaultType )
{
if (CFile::getExtension(sheetName) == "" && defaultType != "")
*this = CSheetId(sheetName + "." + defaultType);
{
std::string withType = sheetName + "." + defaultType;
*this = CSheetId(withType);
nldebug("SHEETID: Constructing CSheetId from name '%s' without explicit type, defaulting as '%s' to '%s'", sheetName.c_str(), defaultType.c_str(), withType.c_str());
}
else
*this = CSheetId(sheetName);
}
@ -131,6 +135,7 @@ bool CSheetId::buildSheetId(const std::string& sheetName)
if (it == _DevSheetNameToId.end())
{
// Create a new dynamic sheet ID.
nldebug("SHEETID: Creating a new dynamic sheet id for '%s'", sheetName.c_str());
std::string sheetType = CFile::getExtension(sheetNameLc);
std::string sheetName = CFile::getFilenameWithoutExtension(sheetNameLc);
std::map<std::string, uint32>::iterator tit = _DevTypeNameToId.find(sheetType);
@ -149,7 +154,9 @@ bool CSheetId::buildSheetId(const std::string& sheetName)
_DevSheetIdToName[typeId].push_back(sheetName);
_Id.IdInfos.Type = typeId;
_Id.IdInfos.Id = _DevSheetIdToName[typeId].size() - 1;
// nldebug("SHEETID: Type %i, id %i, sheetid %i", _Id.IdInfos.Type, _Id.IdInfos.Id, _Id.Id);
_DevSheetNameToId[sheetNameLc] = _Id.Id;
return true;
}
_Id.Id = it->second;
return true;
@ -326,7 +333,8 @@ void CSheetId::init(bool removeUnknownSheet)
// allow multiple calls to init in case libraries depending on sheetid call this init from their own
if (_Initialised)
{
nlassert(!_DontHaveSheetKnowledge);
if (_DontHaveSheetKnowledge)
nlinfo("SHEETID: CSheetId is already initialized without sheet_id.bin");
return;
}
@ -357,8 +365,9 @@ void CSheetId::initWithoutSheet()
_DevSheetIdToName[0].push_back("unknown");
_DevSheetNameToId["unknown.unknown"] = 0;*/
CSheetId unknown = CSheetId("unknown.unknown");
nlassert(unknown == CSheetId::Unknown);
CSheetId unknownunknown = CSheetId("unknown.unknown");
// nldebug("SHEETID: unknown: %i, Unknown: %i", unknownunknown._Id, Unknown._Id);
nlassert(unknownunknown == CSheetId::Unknown);
}

View file

@ -123,7 +123,9 @@ CSoundBank::~CSoundBank()
void CSoundBank::addSound(CSound *sound)
{
nlassert(_Sounds.size() > sound->getName().getShortId());
// nlassert(_Sounds.size() > sound->getName().getShortId());
if (_Sounds.size() <= sound->getName().getShortId())
_Sounds.resize(sound->getName().getShortId() + 1);
_Sounds[sound->getName().getShortId()] = sound;
}
@ -274,10 +276,17 @@ void CSoundBank::load(const std::string &packedSheetDir, bool packedSheetUpdate)
maxShortId = first->first.getShortId();
}
++maxShortId; // inc for size = last idx + 1
if (container.size() == 0)
{
nlwarning("NLSOUND: No sound sheets have been loaded, missing sound sheet directory or packed sound sheets file");
}
else
{
nlassert(maxShortId < (container.size() * 8)); // ensure no ridiculous sheet id values
if (maxShortId > _Sounds.size())
_Sounds.resize(maxShortId);
}
}
// add all the loaded sound in the sound banks
{
@ -349,7 +358,13 @@ CSound* CSoundBank::getSound(const NLMISC::CSheetId &sheetId)
if (sheetId == NLMISC::CSheetId::Unknown)
return NULL;
nlassert(sheetId.getShortId() < _Sounds.size());
// nlassert(sheetId.getShortId() < _Sounds.size());
if (sheetId.getShortId() >= _Sounds.size())
{
std::string sheetName = sheetId.toString();
nlwarning("NLSOUND: Sound sheet id '%s' exceeds loaded sound sheets", sheetName.c_str());
return NULL;
}
return _Sounds[sheetId.getShortId()];
}

View file

@ -86,7 +86,7 @@ void CSoundPage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindab
_ui.pitchWidget->setWorkspaceNode(_Node);
_ui.pitchWidget->updateUi();
_ui.soundNameLineEdit->setText(QString(NLMISC::CStringMapper::unmap(_Sound->getSoundName()).c_str()));
_ui.soundNameLineEdit->setText(QString(_Sound->getSoundName().toString().c_str()));
_ui.spawnCheckBox->setChecked(_Sound->getSpawn());
_ui.muteCheckBox->setChecked(_Sound->getMute());
@ -95,7 +95,7 @@ void CSoundPage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindab
void CSoundPage::browse()
{
std::vector<NLMISC::TStringId> names;
std::vector<NLMISC::CSheetId> names;
NLSOUND::UAudioMixer *audioMixer = Modules::sound().getAudioMixer();
@ -108,7 +108,7 @@ void CSoundPage::browse()
QStringList items;
items << tr("");
for(size_t i = 0; i < names.size(); ++i)
items << QString(names[i]->c_str());
items << QString(names[i].toString().c_str());
bool ok;
QString item = QInputDialog::getItem(this, tr("Select your sound"),
@ -162,7 +162,7 @@ void CSoundPage::setKeepPitch(bool state)
void CSoundPage::setSoundName(const QString &text)
{
_Sound->setSoundName(NLMISC::CStringMapper::map(text.toStdString()));
_Sound->setSoundName(NLMISC::CSheetId(text.toStdString()));
}
void CSoundPage::setEmissionPercent(float value)

View file

@ -30,6 +30,8 @@
#include <nel/sound/sound_animation.h>
#include <nel/3d/u_particle_system_sound.h>
#include <nel/misc/path.h>
#include <nel/misc/sheet_id.h>
// Qt includes
#include <QtCore/QSettings>
@ -68,6 +70,9 @@ void CSoundSystem::init()
//H_AUTO2
nldebug("CSoundSystem::init");
// require sheet id without sheet id bin
NLMISC::CSheetId::initWithoutSheet();
// create audiomixer
_AudioMixer = NULL;
_AnimManager = NULL;
@ -153,9 +158,10 @@ void CSoundSystem::play(const std::string &soundName)
{
if (_AudioMixer)
{
NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CStringMapper::map(soundName), true);
NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CSheetId(soundName, "sound"), true);
if (src)
{
// FIXME: Use relative positioning, and set pos to 0,0,0
src->setLooping(false);
const NLMISC::CVector &pos = _AudioMixer->getListener()->getPos();
src->setPos(pos);
@ -172,9 +178,10 @@ NLSOUND::USource *CSoundSystem::create(const std::string &soundName)
{
if (_AudioMixer)
{
NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CStringMapper::map(soundName), false);
NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CSheetId(soundName, "sound"), false);
if (src)
{
// FIXME: Use relative positioning, and set pos to 0,0,0
src->setLooping(false);
const NLMISC::CVector &pos = _AudioMixer->getListener()->getPos();
src->setPos(pos);