From: <wha...@us...> - 2011-06-11 02:48:48
|
Revision: 7392 http://planeshift.svn.sourceforge.net/planeshift/?rev=7392&view=rev Author: whacko88 Date: 2011-06-11 02:48:42 +0000 (Sat, 11 Jun 2011) Log Message: ----------- Added event support to the plugin Handled the dependency on the "application open" event of iSndSysRenderer Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h soc/2011/sound/src/plugins/common/soundmanager/soundmngr.csplugin Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-10 22:00:47 UTC (rev 7391) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-11 02:48:42 UTC (rev 7392) @@ -46,9 +46,10 @@ SoundManager::SoundManager(iBase* parent): scfImplementationType(this, parent) { // initializing pointers to null - activeSector = 0; + mainSndCtrl = 0; ambientSndCtrl = 0; musicSndCtrl = 0; + activeSector = 0; combat = PEACE; weather = 1; // 1 is sunshine @@ -79,33 +80,75 @@ soundQueues.DeleteAll(); } +//----------------- +// FROM iComponent +//----------------- bool SoundManager::Initialize(iObjectRegistry* objReg) { objectReg = objReg; - sndSysMgr = new SoundSystemManager(objectReg); - - // Inizializing main SoundControls - mainSndCtrl = sndSysMgr->mainSndCtrl; - AddSndCtrl(iSoundManager::AMBIENT_SNDCTRL, iSoundControl::AMBIENT); - AddSndCtrl(iSoundManager::MUSIC_SNDCTRL, iSoundControl::MUSIC); - AddSndCtrl(iSoundManager::ACTION_SNDCTRL, iSoundControl::NORMAL); - AddSndCtrl(iSoundManager::EFFECT_SNDCTRL, iSoundControl::NORMAL); - AddSndCtrl(iSoundManager::GUI_SNDCTRL, iSoundControl::NORMAL); - AddSndCtrl(iSoundManager::VOICE_SNDCTRL, iSoundControl::NORMAL); - - // Initializing voice queue - AddSndQueue(iSoundManager::VOICE_QUEUE, GetSndCtrl(iSoundManager::VOICE_SNDCTRL)); - + loopBGM.SetCallback(this, &UpdateMusicCallback); combatMusic.SetCallback(this, &UpdateMusicCallback); lastUpdateTime = csGetTicks(); + // Registering for event callbacks + csRef<iEventQueue> q = csQueryRegistry<iEventQueue>(objectReg); + evSystemOpen = csevSystemOpen(objectReg); + if (q != 0) + { + q->RegisterListener(this, evSystemOpen); + } + else + { + // If we cannot register for the event it's better to + // initialize sndSysMgr here to prevent using a null pointer + Init(); + } + //TODO: NEED TO INITIALIZE ALL VARIABLES! return true; } +//-------------------- +// FROM iEventhandler +//-------------------- + +/* + * To get the listener (and so to initialize SoundSystemManager and + * SoundSystem) iSndSysRenderer must receive the evSystemOpen event, + * then we can initialize everything. + */ +bool SoundManager::HandleEvent(iEvent &e) +{ + if (e.Name == evSystemOpen) + { + Init(); + } + + return false; +} + +const csHandlerID* SoundManager::GenericPrec(csRef<iEventHandlerRegistry> &ehr, + csRef<iEventNameRegistry> &enr, csEventID id) const +{ + if(id == evSystemOpen) + { + static csHandlerID precConstraint[2]; // TODO not thread safe + + precConstraint[0] = ehr->GetGenericID("crystalspace.sndsys.renderer"); + precConstraint[1] = CS_HANDLERLIST_END; + return precConstraint; + } + + return 0; +} + +//-------------------- +// FROM iSoundManager +//-------------------- + bool SoundManager::InitializeSectors() { LoadSectors(); @@ -556,6 +599,22 @@ sndSysMgr->Update(); } +void SoundManager::Init() +{ + sndSysMgr = new SoundSystemManager(objectReg); + + // Inizializing main SoundControls + mainSndCtrl = sndSysMgr->mainSndCtrl; + AddSndCtrl(iSoundManager::AMBIENT_SNDCTRL, iSoundControl::AMBIENT); + AddSndCtrl(iSoundManager::MUSIC_SNDCTRL, iSoundControl::MUSIC); + AddSndCtrl(iSoundManager::ACTION_SNDCTRL, iSoundControl::NORMAL); + AddSndCtrl(iSoundManager::EFFECT_SNDCTRL, iSoundControl::NORMAL); + AddSndCtrl(iSoundManager::GUI_SNDCTRL, iSoundControl::NORMAL); + AddSndCtrl(iSoundManager::VOICE_SNDCTRL, iSoundControl::NORMAL); + + // Initializing voice queue + AddSndQueue(iSoundManager::VOICE_QUEUE, GetSndCtrl(iSoundManager::VOICE_SNDCTRL)); +} void SoundManager::UpdateMusicCallback(void* object) { SoundManager* which = (SoundManager*) object; Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h 2011-06-10 22:00:47 UTC (rev 7391) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h 2011-06-11 02:48:42 UTC (rev 7392) @@ -44,7 +44,7 @@ * Implement iSoundManager. * @see iSoundManager */ -class SoundManager: public scfImplementation2<SoundManager, iSoundManager, iComponent> +class SoundManager: public scfImplementation3<SoundManager, iSoundManager, iComponent, iEventHandler> { public: SoundManager(iBase* parent); @@ -53,6 +53,15 @@ //From iComponent virtual bool Initialize(iObjectRegistry* objReg); + //From iEventHandler + virtual bool HandleEvent(iEvent &e); + CS_EVENTHANDLER_NAMES("crystalspace.planeshift.sound") + virtual const csHandlerID* GenericPrec(csRef<iEventHandlerRegistry> &ehr, + csRef<iEventNameRegistry> &enr, csEventID id) const; + virtual const csHandlerID* GenericSucc(csRef<iEventHandlerRegistry> &ehr, + csRef<iEventNameRegistry> &enr, csEventID id) const { return 0; } + CS_EVENTHANDLER_DEFAULT_INSTANCE_CONSTRAINTS + //From iSoundManager //Sectors managing virtual bool InitializeSectors(); @@ -105,6 +114,7 @@ private: bool isSectorLoaded; ///< true if the sectors are loaded csRef<iObjectRegistry> objectReg; ///< object registry + csEventID evSystemOpen; ///< ID of the 'Open' event fired on system startup SoundControl* mainSndCtrl; ///< soundcontrol of our soundmanager SoundControl* ambientSndCtrl; ///< soundcontrol for ambient sounds @@ -126,6 +136,11 @@ csRandomGen rng; ///< random generator /** + * Initialize the SoundSystemManager and the default SoundControls and queues. + */ + void Init(); + + /** * Callback function that makes a music update. */ static void UpdateMusicCallback(void* object); Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmngr.csplugin =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmngr.csplugin 2011-06-10 22:00:47 UTC (rev 7391) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmngr.csplugin 2011-06-11 02:48:42 UTC (rev 7392) @@ -6,9 +6,6 @@ <name>crystalspace.planeshift.sound.soundmngr</name> <implementation>SoundManager</implementation> <description>Sound Manager</description> - <requires> - <class>crystalspace.sndsys.renderer.</class> - </requires> </class> </classes> </scf> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-13 14:17:11
|
Revision: 7403 http://planeshift.svn.sourceforge.net/planeshift/?rev=7403&view=rev Author: whacko88 Date: 2011-06-13 14:17:01 +0000 (Mon, 13 Jun 2011) Log Message: ----------- * fixed destructor of SoundSystemManager * changed variables and constructor of psEntity * added constructor to build an empty psSoundSector * added a common psSoundSector to SystemManager (not working yet) Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.h soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-13 14:17:01 UTC (rev 7403) @@ -85,6 +85,8 @@ soundHandles.DeleteAll(); soundControllers.DeleteAll(); + + delete mainSndCtrl; delete soundSystem; delete soundData; Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-13 14:17:01 UTC (rev 7403) @@ -3,7 +3,8 @@ * * Copyright (C) 2001-2010 Atomic Blue (in...@pl..., http://www.planeshift.it) * - * Credits : Saul Leite <le...@en...> + * Credits : Andrea Rizzi <88w...@gm...> + * Saul Leite <le...@en...> * Mathias 'AgY' Voeroes <ag...@op...> * and all past and present planeshift coders * @@ -26,17 +27,25 @@ extern SoundSystemManager* sndSysMgr; -psEntity::psEntity() +psEntity::psEntity(const char* factory, int delayBefore) { - minvol = VOLUME_ZERO; - maxvol = VOLUME_ZERO; - minrange = 0.0f; - maxrange = 0.0f; + factoryName = factory; + + // default values for other parameters + minVol = VOLUME_ZERO; + maxVol = VOLUME_ZERO; + minRange = 0.0f; + maxRange = 0.0f; probability = 0; - active = false; - timeofday = -1; - timeofdayrange = -1; - handle = NULL; + when = delayBefore; + delayAfter = 0; + timeOfDay = -1; + timeOfDayRange = 25; + + isActive = false; + + state = 0; + handle = 0; } psEntity::psEntity(psEntity* const& /*entity*/) @@ -53,8 +62,8 @@ bool psEntity::CheckTimeOfDay(int time) { - if((timeofday <= time) - && (timeofdayrange >= time)) + if((timeOfDay <= time) + && (timeOfDayRange >= time)) { return true; } @@ -62,22 +71,22 @@ return false; } -bool psEntity::Play(SoundControl* &ctrl, csVector3 entityposition) +bool psEntity::Play(SoundControl* &ctrl, csVector3 entityPosition) { if(handle != NULL) { handle->RemoveCallback(); // stop previous play } - if(sndSysMgr->Play3DSound(resource, DONT_LOOP, 0, 0, - maxvol, ctrl, - entityposition, 0, - minrange, maxrange, + if(sndSysMgr->Play3DSound(resources.Get(state, ""), DONT_LOOP, 0, 0, + maxVol, ctrl, + entityPosition, 0, + minRange, maxRange, VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle)) { - active = true; - when = (delay_after*1000); + isActive = true; + when = (delayAfter*1000); handle->SetCallback(this, &StopCallback); return true; } @@ -88,7 +97,7 @@ void psEntity::StopCallback(void* object) { psEntity* which = (psEntity*) object; - which->active = false; + which->isActive = false; which->handle = NULL; } Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-13 14:17:01 UTC (rev 7403) @@ -3,7 +3,8 @@ * * Copyright (C) 2001-2010 Atomic Blue (in...@pl..., http://www.planeshift.it) * - * Credits : Saul Leite <le...@en...> + * Credits : Andrea Rizzi <88w...@gm...> + * Saul Leite <le...@en...> * Mathias 'AgY' Voeroes <ag...@op...> * and all past and present planeshift coders * @@ -34,33 +35,43 @@ class psEntity { public: - csString name; ///< name of the entity - csString resource; ///< resource name of the sound - float minvol; ///< vol at maxrange - float maxvol; ///< vol at minrange - float minrange; ///< range when it should reach maxvol - float maxrange; ///< range when it should reach maxvol - int delay_before; ///< number of seconds till first time this sound is played - int delay_after; ///< number of seconds till played again - float probability; ///< how high is the probability that this entity makes this sound - int when; ///< counter to keep track when it has been played - zero means i may play at any time - bool active; ///< is the sound active? - SoundHandle* handle; ///< pointer to the SoundHandle if active - int timeofday; ///< time when this entity starts playing - int timeofdayrange; ///< time when this entity stops + csString factoryName; ///< name of this entity's factory + csString meshName; ///< name of this entity's mesh + csHash<csString, int> resources; ///< resource name of the sound associated to its state + csHash<csString, int> openResources; ///< resource to be played when the entity status change to its key value + + float minVol; ///< vol at maxrange + float maxVol; ///< vol at minrange + float minRange; ///< range when it should reach maxvol + float maxRange; ///< range when it should reach maxvol + float probability; ///< how high is the probability that this entity makes this sound + int when; ///< counter to keep track when it has been played - zero means i may play at any time + int delayAfter; ///< number of seconds till played again + int timeOfDay; ///< time when this entity starts playing + int timeOfDayRange; ///< time when this entity stops. + + bool isActive; ///< is the sound active? /** - * Constructer + * Constructor. The defaul values are 0 for everything not specified in the + * parameters, timeOfDay = -1, timeOfDayRange = 25, isActive = false. + * + * @param factoryName the name of the factory associated to this psEntity. + * @param delayBefore the initial value of when, so the number of seconds + * needed before the sound can be played the first time. */ - psEntity(); + psEntity(const char* factoryName, int delayBefore = 0); + /** * Destructor */ ~psEntity(); + /** * Copy Constructor - WARNING INCOMPLETE */ psEntity(psEntity* const &entity); + /** * Check time of day. * Checks if time is within this entitys timewindow. @@ -68,18 +79,24 @@ * @param time <24 && >0 is resonable but can be any valid int */ bool CheckTimeOfDay(int time); + /** * Play this entity sound. * You need to supply a SoundControl and the position for this sound. * @param ctrl SoundControl * @param entityposition position of this entity */ - bool Play(SoundControl* &ctrl, csVector3 entityposition); + bool Play(SoundControl* &ctrl, csVector3 entityPosition); + /** * The Callback gets called if the SoundHandle is destroyed. - * It sets active to false and handle to NULL + * It sets isActive to false and handle to NULL */ static void StopCallback(void* object); + +private: + int state; ///< current state of this entity + SoundHandle* handle; ///< pointer to the SoundHandle if active }; #endif /*_PSENTITY_H_*/ Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-13 14:17:01 UTC (rev 7403) @@ -25,6 +25,20 @@ #include "pssound.h" +psSoundSector::psSoundSector(const char* sectorName, iObjectRegistry* objReg) +{ + name = sectorName; + objectReg = objReg; + + playerposition = csVector3(0); + timeofday = 12; + active = false; + + // initializing pointers to null + activeambient = 0; + activemusic = 0; +} + psSoundSector::psSoundSector(csRef<iDocumentNode> sector, iObjectRegistry* objReg) { name = sector->GetAttributeValue("NAME"); @@ -293,25 +307,23 @@ { psEntity* entity; - entity = new psEntity; + entity = new psEntity(Node->GetAttributeValue("NAME")); // TODO factory name here and delayBefore - entity->resource = Node->GetAttributeValue("RESOURCE"); - entity->name = Node->GetAttributeValue("NAME"); - entity->minvol = Node->GetAttributeValueAsFloat("MINVOL"); - entity->maxvol = Node->GetAttributeValueAsFloat("MAXVOL"); - entity->minrange = Node->GetAttributeValueAsFloat("MIN_RANGE"); - entity->maxrange = Node->GetAttributeValueAsFloat("MAX_RANGE"); - entity->delay_before = Node->GetAttributeValueAsInt("DELAY_BEFORE"); - entity->delay_after = Node->GetAttributeValueAsInt("DELAY_AFTER"); + entity->resources.Put(0, Node->GetAttributeValue("RESOURCE")); + + entity->minVol = Node->GetAttributeValueAsFloat("MINVOL"); + entity->maxVol = Node->GetAttributeValueAsFloat("MAXVOL"); + entity->minRange = Node->GetAttributeValueAsFloat("MIN_RANGE"); + entity->maxRange = Node->GetAttributeValueAsFloat("MAX_RANGE"); + entity->delayAfter = Node->GetAttributeValueAsInt("DELAY_AFTER"); entity->probability = Node->GetAttributeValueAsFloat("PROBABILITY"); - entity->timeofday = Node->GetAttributeValueAsInt("TIME"); - entity->timeofdayrange = Node->GetAttributeValueAsInt("TIME_RANGE"); - entity->active = false; + entity->timeOfDay = Node->GetAttributeValueAsInt("TIME"); + entity->timeOfDayRange = Node->GetAttributeValueAsInt("TIME_RANGE"); - if(entity->timeofday == -1) + if(entity->timeOfDay == -1) { - entity->timeofday = 0; - entity->timeofdayrange = 24; + entity->timeOfDay = 0; + entity->timeOfDayRange = 24; } entityarray.Push(entity); @@ -339,12 +351,12 @@ { entity = entityarray[i]; - if(entity->active == true) + if(entity->isActive == true) { if(entity->when <= 0) { // sndSysMgr will pick the dead sound up - entity->active = false; + entity->isActive = false; } else { @@ -364,12 +376,12 @@ rangeVec = entities->Get(a)->GetMovable()->GetFullPosition() - (const csVector3&) playerposition; range = rangeVec.Norm(); - if(range <= entity->maxrange - && csStrCaseCmp(entity->name, mesh->QueryObject()->GetName()) == 0 + if(range <= entity->maxRange + && csStrCaseCmp(entity->meshName, mesh->QueryObject()->GetName()) == 0 && rng.Get() <= entity->probability && entity->CheckTimeOfDay(timeofday) == true) { - csPrintf("iobject name %s %f %f\n", mesh->QueryObject()->GetName(), range, entity->maxrange); + csPrintf("iobject name %s %f %f\n", mesh->QueryObject()->GetName(), range, entity->maxRange); if(!entity->Play(ctrl, entities->Get(a)->GetMovable()->GetFullPosition())) { DeleteEntity(entity); Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-13 14:17:01 UTC (rev 7403) @@ -46,6 +46,13 @@ csRandomGen rng; ///< random number generator /** + * Create an empty psSoundSector with no musics, ambients, emitters and entities. + * @param name the psSoundSector's name + * @param objReg the object registry + */ + psSoundSector(const char* name, iObjectRegistry* objReg); + + /** * Constructor * @param sector documentnode that contains all sector data */ Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-13 14:17:01 UTC (rev 7403) @@ -51,6 +51,7 @@ musicSndCtrl = 0; activeSector = 0; + commonSector = 0; combat = PEACE; weather = 1; // 1 is sunshine @@ -103,7 +104,7 @@ } else { - // If we cannot register for the event it's better to + // If this cannot be registered for the event it's better to // initialize sndSysMgr here to prevent using a null pointer Init(); } @@ -870,10 +871,11 @@ /* -* load a all sector xmls and make them usable -* will overwrite the target sector if it exists -* its only parsing the xml most of it is hardcoded +* Load a all sector xmls and make them usable. Will overwrite the target +* sector if it exists. It's only parsing the xml most of it is hardcoded. * +* If a common sector it's not found, commonSector will is initalized as +* an empty psSoundSector. */ bool SoundManager::LoadSectors() @@ -886,6 +888,7 @@ csRef<iDataBuffer> xpath; const char* dir; + const char* sectorName; csRef<iStringArray> files; psSoundSector* tmpsector; csRef<iVFS> vfs; @@ -922,10 +925,16 @@ { csRef<iDocumentNode> sector = sectorIter->Next(); - if(FindSector(sector->GetAttributeValue("NAME"), tmpsector) == true) + sectorName = sector->GetAttributeValue("NAME"); + + if(FindSector(sectorName, tmpsector) == true) { tmpsector->Reload(sector); } + else if(strcmp(sectorName, "common") == 0) // TODO make this configurable + { + commonSector = new psSoundSector(sector, objectReg); + } else { tmpsector = new psSoundSector(sector, objectReg); @@ -935,6 +944,13 @@ } } + // checking if a common sector could be found + if(commonSector == 0) + { + commonSector = new psSoundSector("common", objectReg); // TODO make configurable as before + } + commonSector->active = true; // commonSector must always be active + isSectorLoaded = true; return true; } @@ -951,6 +967,9 @@ LoadSectors(); } +/** + * Delete both the sectors in sectorData and commonSector + */ void SoundManager::UnloadSectors() { // check if the sectors are initialized @@ -965,6 +984,7 @@ } sectorData.DeleteAll(); + delete commonSector; isSectorLoaded = false; } \ No newline at end of file Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h 2011-06-13 12:34:32 UTC (rev 7402) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h 2011-06-13 14:17:01 UTC (rev 7403) @@ -128,6 +128,7 @@ csTicks lastUpdateTime; ///< csticks when the last update happend csArray<psSoundSector*> sectorData; ///< array which contains all sector xmls - parsed psSoundSector* activeSector; ///< points to our active sector + psSoundSector* commonSector; ///< sector that keeps features common to all sectors csVector3 playerPosition; ///< current playerposition int weather; ///< current weather state from weather.h int combat; ///< current stance This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-13 21:55:44
|
Revision: 7410 http://planeshift.svn.sourceforge.net/planeshift/?rev=7410&view=rev Author: whacko88 Date: 2011-06-13 21:55:38 +0000 (Mon, 13 Jun 2011) Log Message: ----------- Changed data structures for entities in psSoundSector Fixed psSoundSector::AddEntity to read the data from xml areas Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.h soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-13 20:27:41 UTC (rev 7409) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-13 21:55:38 UTC (rev 7410) @@ -32,12 +32,12 @@ factoryName = factory; // default values for other parameters - minVol = VOLUME_ZERO; - maxVol = VOLUME_ZERO; + minVol = VOLUME_MIN; + maxVol = VOLUME_MAX; minRange = 0.0f; maxRange = 0.0f; probability = 0; - when = delayBefore; + when = delayBefore * 1000; // delayBefore is in s, when in ms delayAfter = 0; timeOfDay = -1; timeOfDayRange = 25; @@ -86,7 +86,7 @@ handle)) { isActive = true; - when = (delayAfter*1000); + when = (delayAfter * 1000); handle->SetCallback(this, &StopCallback); return true; } Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-13 20:27:41 UTC (rev 7409) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-13 21:55:38 UTC (rev 7410) @@ -38,14 +38,14 @@ csString factoryName; ///< name of this entity's factory csString meshName; ///< name of this entity's mesh csHash<csString, int> resources; ///< resource name of the sound associated to its state - csHash<csString, int> openResources; ///< resource to be played when the entity status change to its key value + csHash<csString, int> startResources; ///< resource to be played when the entity status change to its key value float minVol; ///< vol at maxrange float maxVol; ///< vol at minrange float minRange; ///< range when it should reach maxvol float maxRange; ///< range when it should reach maxvol float probability; ///< how high is the probability that this entity makes this sound - int when; ///< counter to keep track when it has been played - zero means i may play at any time + int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) int delayAfter; ///< number of seconds till played again int timeOfDay; ///< time when this entity starts playing int timeOfDayRange; ///< time when this entity stops. @@ -60,7 +60,7 @@ * @param delayBefore the initial value of when, so the number of seconds * needed before the sound can be played the first time. */ - psEntity(const char* factoryName, int delayBefore = 0); + psEntity(const char* factoryName, int delayBefore); /** * Destructor Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-13 20:27:41 UTC (rev 7409) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-13 21:55:38 UTC (rev 7410) @@ -305,33 +305,89 @@ void psSoundSector::AddEntity(csRef<iDocumentNode> Node) { + const char* factoryName; + const char* meshName; + const char* resource; + const char* startResource; + float maxRange; + float prob; + int state; psEntity* entity; - - entity = new psEntity(Node->GetAttributeValue("NAME")); // TODO factory name here and delayBefore - entity->resources.Put(0, Node->GetAttributeValue("RESOURCE")); + factoryName = Node->GetAttributeValue("FACTORY"); + meshName = Node->GetAttributeValue("MESH"); + resource = Node->GetAttributeValue("RESOURCE"); + startResource = Node->GetAttributeValue("STARTING_RESOURCE"); + maxRange = Node->GetAttributeValueAsFloat("MAX_RANGE", -1.0); + prob = Node->GetAttributeValueAsFloat("PROBABILITY", -1.0); + state = Node->GetAttributeValueAsInt("STATE", -1); - entity->minVol = Node->GetAttributeValueAsFloat("MINVOL"); - entity->maxVol = Node->GetAttributeValueAsFloat("MAXVOL"); + // checking that all mandatory parameters are present + if(factoryName == 0 || state < 0 || prob < 0.0 || maxRange < 0.0) + { + return; + } + if(resource == 0 && startResource == 0) + { + return; + } + + // check if an entity with the same name is already defined + if(meshName == 0) + { + entity = factories.Get(factoryName, 0); + } + else + { + entity = meshes.Get(meshName, 0); + } + + // if it doesn't exist create it otherwise check the state + if(entity == 0) + { + entity = new psEntity(factoryName, Node->GetAttributeValueAsInt("DELAY_BEFORE")); + } + else if(entity->resources.Contains(state) || entity->startResources.Contains(state)) + { + return; + } + + // set all parameters + entity->minVol = Node->GetAttributeValueAsFloat("MINVOL", VOLUME_MIN); + entity->maxVol = Node->GetAttributeValueAsFloat("MAXVOL", VOLUME_MAX); entity->minRange = Node->GetAttributeValueAsFloat("MIN_RANGE"); - entity->maxRange = Node->GetAttributeValueAsFloat("MAX_RANGE"); - entity->delayAfter = Node->GetAttributeValueAsInt("DELAY_AFTER"); - entity->probability = Node->GetAttributeValueAsFloat("PROBABILITY"); - entity->timeOfDay = Node->GetAttributeValueAsInt("TIME"); - entity->timeOfDayRange = Node->GetAttributeValueAsInt("TIME_RANGE"); + entity->maxRange = maxRange; + entity->probability = prob; + entity->delayAfter = Node->GetAttributeValueAsInt("DELAY_AFTER"); + entity->timeOfDay = Node->GetAttributeValueAsInt("TIME", -1); + entity->timeOfDayRange = Node->GetAttributeValueAsInt("TIME_RANGE", 25); - if(entity->timeOfDay == -1) + if(resource != 0) { - entity->timeOfDay = 0; - entity->timeOfDayRange = 24; + entity->resources.Put(state, resource); } + if(startResource != 0) + { + entity->startResources.Put(state, startResource); + } - entityarray.Push(entity); + // handle mesh/factory entities + if(meshName == 0) + { + factories.Put(factoryName, entity); + } + else + { + entity->meshName = meshName; + meshes.Put(meshName, entity); + } + } void psSoundSector::UpdateEntity(SoundControl* &ctrl) { csRef<iEngine> engine; + csHash<psEntity*, csString>::GlobalIterator entityIter(factories.GetIterator()); psEntity* entity; iMeshWrapper* mesh; iMeshList* entities; @@ -347,9 +403,9 @@ entities = engine->GetMeshes(); - for(size_t i = 0; i < entityarray.GetSize(); i++) + while(entityIter.HasNext()) { - entity = entityarray[i]; + entity = entityIter.Next(); if(entity->isActive == true) { @@ -394,7 +450,10 @@ void psSoundSector::DeleteEntity(psEntity* &entity) { - entityarray.Delete(entity); + if(!factories.Delete(entity->factoryName, entity)) + { + meshes.Delete(entity->meshName, entity); + } delete entity; } @@ -454,8 +513,23 @@ DeleteEmitter(emitterarray[i]); } - for(size_t i = 0; i < entityarray.GetSize(); i++) + // Deleting factories and meshes entities + csHash<psEntity*, csString>::GlobalIterator entityIter(factories.GetIterator()); + psEntity* entity; + + while(entityIter.HasNext()) { - DeleteEntity(entityarray[i]); + entity = entityIter.Next(); + delete entity; } + + entityIter = meshes.GetIterator(); + while(entityIter.HasNext()) + { + entity = entityIter.Next(); + delete entity; + } + + factories.DeleteAll(); + meshes.DeleteAll(); } Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-13 20:27:41 UTC (rev 7409) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-13 21:55:38 UTC (rev 7410) @@ -31,19 +31,20 @@ class psSoundSector { public: - csString name; ///< name of this sector - bool active; ///< is this sector active? - psMusic* activeambient; ///< active ambient music - psMusic* activemusic; ///< active music - csArray<psMusic*> ambientarray; ///< array of available ambients - csArray<psMusic*> musicarray; ///< array of available musics - csArray<psEmitter*> emitterarray; ///< array of emitters - csArray<psEntity*> entityarray; ///< array of entitys + csString name; ///< name of this sector + bool active; ///< is this sector active? + psMusic* activeambient; ///< active ambient music + psMusic* activemusic; ///< active music + csArray<psMusic*> ambientarray; ///< array of available ambients + csArray<psMusic*> musicarray; ///< array of available musics + csArray<psEmitter*> emitterarray; ///< array of emitters + csHash<psEntity*, csString> factories; ///< hash of factory entities (i.e. with meshName empty) + csHash<psEntity*, csString> meshes; ///< hash of mesh entities - csVector3 playerposition; ///< current playerposition - int timeofday; ///< sector time of day + csVector3 playerposition; ///< current playerposition + int timeofday; ///< sector time of day - csRandomGen rng; ///< random number generator + csRandomGen rng; ///< random number generator /** * Create an empty psSoundSector with no musics, ambients, emitters and entities. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-14 12:58:15
|
Revision: 7412 http://planeshift.svn.sourceforge.net/planeshift/?rev=7412&view=rev Author: whacko88 Date: 2011-06-14 12:58:09 +0000 (Tue, 14 Jun 2011) Log Message: ----------- changes to psEntity and fixed psSoundSector::UpdateEntity Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.h soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-13 22:08:00 UTC (rev 7411) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-14 12:58:09 UTC (rev 7412) @@ -27,29 +27,44 @@ extern SoundSystemManager* sndSysMgr; -psEntity::psEntity(const char* factory, int delayBefore) +psEntity::psEntity() { - factoryName = factory; - - // default values for other parameters - minVol = VOLUME_MIN; - maxVol = VOLUME_MAX; + volume = VOLUME_NORM; minRange = 0.0f; maxRange = 0.0f; probability = 0; - when = delayBefore * 1000; // delayBefore is in s, when in ms + when = 0; delayAfter = 0; timeOfDay = -1; timeOfDayRange = 25; - isActive = false; + active = false; state = 0; handle = 0; } -psEntity::psEntity(psEntity* const& /*entity*/) +psEntity::psEntity(psEntity* const& entity) { + factoryName = entity->factoryName; + meshName = entity->meshName; + + resources = csHash<csString, int>(entity->resources); + startResources = csHash<csString, int>(entity->startResources); + + volume = entity->volume; + minRange = entity->minRange; + maxRange = entity->maxRange; + probability = entity->probability; + when = entity->when; + delayAfter = entity->delayAfter; + timeOfDay = entity->timeOfDay; + timeOfDayRange = entity->timeOfDayRange; + + active = entity->active; + state = entity->state; + + handle = 0; } psEntity::~psEntity() @@ -58,8 +73,16 @@ { handle->RemoveCallback(); } + + resources.DeleteAll(); + startResources.DeleteAll(); } +bool psEntity::IsPlaying() +{ + return (handle != 0); +} + bool psEntity::CheckTimeOfDay(int time) { if((timeOfDay <= time) @@ -71,22 +94,31 @@ return false; } +bool psEntity::CheckRange(float range) +{ + if(minRange <= range && range <= maxRange) + { + return true; + } + + return false; +} + bool psEntity::Play(SoundControl* &ctrl, csVector3 entityPosition) { if(handle != NULL) { - handle->RemoveCallback(); // stop previous play + return false; // a sound is still playing } if(sndSysMgr->Play3DSound(resources.Get(state, ""), DONT_LOOP, 0, 0, - maxVol, ctrl, + volume, ctrl, entityPosition, 0, minRange, maxRange, VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle)) { - isActive = true; - when = (delayAfter * 1000); + when = delayAfter * 1000; handle->SetCallback(this, &StopCallback); return true; } @@ -94,10 +126,10 @@ return false; } + void psEntity::StopCallback(void* object) { psEntity* which = (psEntity*) object; - which->isActive = false; which->handle = NULL; } Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-13 22:08:00 UTC (rev 7411) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-14 12:58:09 UTC (rev 7412) @@ -40,27 +40,27 @@ csHash<csString, int> resources; ///< resource name of the sound associated to its state csHash<csString, int> startResources; ///< resource to be played when the entity status change to its key value - float minVol; ///< vol at maxrange - float maxVol; ///< vol at minrange - float minRange; ///< range when it should reach maxvol - float maxRange; ///< range when it should reach maxvol + float volume; ///< volume of the sound + float minRange; ///< minimum distance where the sound is heard + float maxRange; ///< maximum distance where the sound is heard float probability; ///< how high is the probability that this entity makes this sound - int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) - int delayAfter; ///< number of seconds till played again int timeOfDay; ///< time when this entity starts playing int timeOfDayRange; ///< time when this entity stops. - bool isActive; ///< is the sound active? + int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) + int delayAfter; ///< number of seconds till played again + + bool active; ///< is this psEntity active, used for caching purposes + int state; ///< current state of this entity /** * Constructor. The defaul values are 0 for everything not specified in the - * parameters, timeOfDay = -1, timeOfDayRange = 25, isActive = false. + * parameters, timeOfDay = -1, timeOfDayRange = 25, active = false. * - * @param factoryName the name of the factory associated to this psEntity. * @param delayBefore the initial value of when, so the number of seconds * needed before the sound can be played the first time. */ - psEntity(const char* factoryName, int delayBefore); + psEntity(); /** * Destructor @@ -68,11 +68,17 @@ ~psEntity(); /** - * Copy Constructor - WARNING INCOMPLETE + * Copy Constructor. It copies everthing but not the handle that is set to 0. */ psEntity(psEntity* const &entity); /** + * Check if the sound associated to this entity is still working. + * @return true if it is still playing, false otherwise. + */ + bool IsPlaying(); + + /** * Check time of day. * Checks if time is within this entitys timewindow. * Returns true if it is. @@ -81,6 +87,13 @@ bool CheckTimeOfDay(int time); /** + * Check if the range is between the minimum and maximum range. + * @param the range to test. + * @return true if the range is in this entity's range window, false otherwise. + */ + bool CheckRange(float range); + + /** * Play this entity sound. * You need to supply a SoundControl and the position for this sound. * @param ctrl SoundControl @@ -90,13 +103,12 @@ /** * The Callback gets called if the SoundHandle is destroyed. - * It sets isActive to false and handle to NULL + * It sets handle to NULL. */ static void StopCallback(void* object); private: - int state; ///< current state of this entity - SoundHandle* handle; ///< pointer to the SoundHandle if active + SoundHandle* handle; ///< pointer to the SoundHandle if playing }; #endif /*_PSENTITY_H_*/ Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-13 22:08:00 UTC (rev 7411) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-14 12:58:09 UTC (rev 7412) @@ -323,10 +323,15 @@ state = Node->GetAttributeValueAsInt("STATE", -1); // checking that all mandatory parameters are present - if(factoryName == 0 || state < 0 || prob < 0.0 || maxRange < 0.0) + if(factoryName == 0 && meshName == 0 + || factoryName != 0 && meshName != 0) { return; } + if(state < 0 || prob < 0.0 || maxRange < 0.0) + { + return; + } if(resource == 0 && startResource == 0) { return; @@ -345,7 +350,7 @@ // if it doesn't exist create it otherwise check the state if(entity == 0) { - entity = new psEntity(factoryName, Node->GetAttributeValueAsInt("DELAY_BEFORE")); + entity = new psEntity(); } else if(entity->resources.Contains(state) || entity->startResources.Contains(state)) { @@ -353,9 +358,8 @@ } // set all parameters - entity->minVol = Node->GetAttributeValueAsFloat("MINVOL", VOLUME_MIN); - entity->maxVol = Node->GetAttributeValueAsFloat("MAXVOL", VOLUME_MAX); - entity->minRange = Node->GetAttributeValueAsFloat("MIN_RANGE"); + entity->volume = Node->GetAttributeValueAsFloat("VOLUME", VOLUME_NORM); + entity->minRange = Node->GetAttributeValueAsFloat("Min_RANGE"); entity->maxRange = maxRange; entity->probability = prob; entity->delayAfter = Node->GetAttributeValueAsInt("DELAY_AFTER"); @@ -374,6 +378,7 @@ // handle mesh/factory entities if(meshName == 0) { + entity->factoryName = factoryName; factories.Put(factoryName, entity); } else @@ -384,15 +389,15 @@ } -void psSoundSector::UpdateEntity(SoundControl* &ctrl) +void psSoundSector::UpdateEntity(SoundControl* &ctrl, psSoundSector* commonSector) { csRef<iEngine> engine; - csHash<psEntity*, csString>::GlobalIterator entityIter(factories.GetIterator()); + iMeshList* entities; psEntity* entity; iMeshWrapper* mesh; - iMeshList* entities; - csVector3 rangeVec; - float range; + const char* meshName; + const char* factoryName; + engine = csQueryRegistry<iEngine>(objectReg); if(!engine) @@ -403,57 +408,63 @@ entities = engine->GetMeshes(); - while(entityIter.HasNext()) + for(size_t a = 0; a < entities->GetCount(); a++) { - entity = entityIter.Next(); - - if(entity->isActive == true) + if((mesh = entities->Get(a)) == 0) { - if(entity->when <= 0) - { - // sndSysMgr will pick the dead sound up - entity->isActive = false; - } - else - { - entity->when = (entity->when - 50); - } - continue; } + meshName = mesh->QueryObject()->GetName(); + factoryName = mesh->GetFactory()->QueryObject()->GetName(); - for(size_t a = 0; a < entities->GetCount(); a++) + // first it look in the meshes and factories of this sector + if((entity = meshes.Get(meshName, 0)) == 0) { - if((mesh = entities->Get(a)) == NULL) + UpdateEntityValues(ctrl, entity, mesh); + } + else if((entity = factories.Get(factoryName, 0)) == 0) + { + UpdateEntityValues(ctrl, entity, mesh); + } + + // nothing found here: look in the commonSector + else if(commonSector != 0) + { + if((entity = commonSector->meshes.Get(meshName, 0)) == 0) { - continue; + UpdateEntityValues(ctrl, entity, mesh); } - - rangeVec = entities->Get(a)->GetMovable()->GetFullPosition() - (const csVector3&) playerposition; - range = rangeVec.Norm(); - - if(range <= entity->maxRange - && csStrCaseCmp(entity->meshName, mesh->QueryObject()->GetName()) == 0 - && rng.Get() <= entity->probability - && entity->CheckTimeOfDay(timeofday) == true) + else if((entity = commonSector->factories.Get(factoryName, 0)) == 0) { - csPrintf("iobject name %s %f %f\n", mesh->QueryObject()->GetName(), range, entity->maxRange); - if(!entity->Play(ctrl, entities->Get(a)->GetMovable()->GetFullPosition())) - { - DeleteEntity(entity); - break; - } + UpdateEntityValues(ctrl, entity, mesh); } } } + + // Cleaning up meshes (factories don't need neither caching nor "when" decreasing) + csHash<psEntity*, csString>::GlobalIterator entityIter(meshes.GetIterator()); + + CleanUpMeshes(entityIter); + + if(commonSector != 0) + { + entityIter = commonSector->meshes.GetIterator(); + CleanUpMeshes(entityIter); + } + } void psSoundSector::DeleteEntity(psEntity* &entity) { - if(!factories.Delete(entity->factoryName, entity)) + if(entity->meshName == 0) { + factories.Delete(entity->factoryName, entity); + } + else + { meshes.Delete(entity->meshName, entity); } + delete entity; } @@ -533,3 +544,63 @@ factories.DeleteAll(); meshes.DeleteAll(); } + +void psSoundSector::UpdateEntityValues(SoundControl* &ctrl, psEntity* entity, iMeshWrapper* mesh) +{ + csVector3 rangeVec; + float range; + + rangeVec = mesh->GetMovable()->GetFullPosition() - playerposition; + range = rangeVec.Norm(); + + if(active == true + && entity->CheckTimeOfDay(timeofday) + && entity->CheckRange(range)) + { + if(!(entity->IsPlaying()) + && rng.Get() <= entity->probability + && entity->when <= 0) + { + // if it's a factory entity creates a temporary entity to handle the sound + if(entity->meshName == 0) + { + entity = new psEntity(entity); + entity->meshName = mesh->QueryObject()->GetName(); + meshes.Put(entity->meshName, entity); + } + + entity->Play(ctrl, mesh->GetMovable()->GetFullPosition()); + } + + entity->active = true; + } +} + +void psSoundSector::CleanUpMeshes(csHash<psEntity*, csString>::GlobalIterator &entityIter) +{ + psEntity* entity; + + while(entityIter.HasNext()) + { + entity = entityIter.Next(); + + // caching + if(entity->factoryName != 0) + { + if(entity->active == true) + { + entity->active = false; + } + else + { + DeleteEntity(entity); + continue; + } + } + + if(entity->when > 0 && !(entity->IsPlaying())) + { + entity->when -= 50; // TODO making this consistent with its update + } + } +} \ No newline at end of file Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-13 22:08:00 UTC (rev 7411) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-14 12:58:09 UTC (rev 7412) @@ -74,7 +74,7 @@ void UpdateEmitter(SoundControl* &ctrl); void DeleteEmitter(psEmitter* &emitter); void AddEntity(csRef<iDocumentNode> Node); - void UpdateEntity(SoundControl* &ctrl); + void UpdateEntity(SoundControl* &ctrl, psSoundSector* commonSector); void DeleteEntity(psEntity* &entity); void Load(csRef<iDocumentNode> sector); void Reload(csRef<iDocumentNode> sector); @@ -82,6 +82,9 @@ private: csRef<iObjectRegistry> objectReg; + + void UpdateEntityValues(SoundControl* &ctrl, psEntity* entity, iMeshWrapper* mesh); + void CleanUpMeshes(csHash<psEntity*, csString>::GlobalIterator &entityIter); }; #endif /*_PSSOUNDSECTOR_H_*/ Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-13 22:08:00 UTC (rev 7411) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-14 12:58:09 UTC (rev 7412) @@ -590,7 +590,7 @@ if(activeSector != 0) { activeSector->UpdateEmitter(ambientSndCtrl); - activeSector->UpdateEntity(ambientSndCtrl); + activeSector->UpdateEntity(ambientSndCtrl, commonSector); } lastUpdateTime = csGetTicks(); @@ -827,7 +827,7 @@ sector->UpdateMusic(loopBGM.GetToggle(), combat, musicSndCtrl); sector->UpdateAmbient(weather, ambientSndCtrl); sector->UpdateEmitter(ambientSndCtrl); - sector->UpdateEntity(ambientSndCtrl); + sector->UpdateEntity(ambientSndCtrl, commonSector); } @@ -931,7 +931,7 @@ { tmpsector->Reload(sector); } - else if(strcmp(sectorName, "common") == 0) // TODO make this configurable + else if(csStrCaseCmp(sectorName, "common") == 0) // TODO make this configurable { commonSector = new psSoundSector(sector, objectReg); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-14 19:07:22
|
Revision: 7415 http://planeshift.svn.sourceforge.net/planeshift/?rev=7415&view=rev Author: whacko88 Date: 2011-06-14 19:07:15 +0000 (Tue, 14 Jun 2011) Log Message: ----------- Improved psEntity interface and data structures and adjusted psSoundSector consequently Fixed a bug in SoundManager that could lead to the use of a null pointer Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/manager.h soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.h soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-14 14:57:06 UTC (rev 7414) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-14 19:07:15 UTC (rev 7415) @@ -44,6 +44,7 @@ soundSystem = new SoundSystem; soundData = new SoundData; mainSndCtrl = new SoundControl(-1, iSoundControl::NORMAL); + defaultSndCtrl = new SoundControl(-1, iSoundControl::NORMAL); if(soundSystem->Initialize(objectReg) && soundData->Initialize(objectReg)) @@ -87,6 +88,7 @@ soundControllers.DeleteAll(); delete mainSndCtrl; + delete defaultSndCtrl; delete soundSystem; delete soundData; Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-14 14:57:06 UTC (rev 7414) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-14 19:07:15 UTC (rev 7415) @@ -65,6 +65,7 @@ public: bool Initialised; ///< is initialized ? SoundControl* mainSndCtrl; ///< sound control for this manager + SoundControl* defaultSndCtrl; ///< sound control always available, used when there is no other /** * Constructor initializes this SoundSystemManager. Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-14 14:57:06 UTC (rev 7414) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-14 19:07:15 UTC (rev 7415) @@ -29,17 +29,8 @@ psEntity::psEntity() { - volume = VOLUME_NORM; - minRange = 0.0f; - maxRange = 0.0f; - probability = 0; + active = false; when = 0; - delayAfter = 0; - timeOfDay = -1; - timeOfDayRange = 25; - - active = false; - state = 0; handle = 0; } @@ -49,79 +40,219 @@ factoryName = entity->factoryName; meshName = entity->meshName; - resources = csHash<csString, int>(entity->resources); - startResources = csHash<csString, int>(entity->startResources); + // updating statPar references + csHash<StateParameters*, int>::GlobalIterator statIter(statePar.GetIterator()); + StateParameters* sp; - volume = entity->volume; - minRange = entity->minRange; - maxRange = entity->maxRange; - probability = entity->probability; - when = entity->when; - delayAfter = entity->delayAfter; - timeOfDay = entity->timeOfDay; - timeOfDayRange = entity->timeOfDayRange; + while(statIter.HasNext()) + { + sp = statIter.Next(); + sp->references++; + } + statePar = csHash<StateParameters*, int>(entity->statePar); + active = entity->active; + when = entity->when; state = entity->state; - handle = 0; } psEntity::~psEntity() { - if(handle != NULL) + if(handle != 0) { handle->RemoveCallback(); } - resources.DeleteAll(); - startResources.DeleteAll(); + // removing state parameters but only if there are no more references + csHash<StateParameters*, int>::GlobalIterator statIter(statePar.GetIterator()); + StateParameters* sp; + + while(statIter.HasNext()) + { + sp = statIter.Next(); + + if(sp->references == 1) + { + delete sp; + } + } + + statePar.DeleteAll(); } -bool psEntity::IsPlaying() +float psEntity::GetProbability() const { + StateParameters* sp; + + if(state < 0) + { + return 0.0f; + } + + sp = statePar.Get(state, 0); + + return sp->probability; +} + +bool psEntity::DefineState(int state, const char* resource, const char* startResource, + float volume, float minRange, float maxRange, float probability, + int timeOfDayStart, int timeOfDayEnd, int delayAfter) +{ + StateParameters* sp; + + sp = statePar.Get(state, 0); + + if(sp == 0) + { + return false; + } + + sp = new StateParameters(); + + sp->resource = resource; + sp->startResource = startResource; + sp->volume = volume; + sp->minRange = minRange; + sp->maxRange = maxRange; + sp->probability = probability; + sp->timeOfDayStart = timeOfDayStart; + sp->timeOfDayEnd = timeOfDayEnd; + sp->delayAfter = delayAfter; + + sp->references = 1; + + statePar.Put(state, sp); + + return true; +} + +void psEntity::ReduceDelay(int interval) +{ + if(when > 0) + { + when -= 50; + } +} + +bool psEntity::IsPlaying() const +{ return (handle != 0); } -bool psEntity::CheckTimeOfDay(int time) +bool psEntity::IsReadyToPlay() const { - if((timeOfDay <= time) - && (timeOfDayRange >= time)) + if(state < 0) { - return true; + return false; } + if(when <= 0) + { + return true; + } return false; } -bool psEntity::CheckRange(float range) +bool psEntity::CheckTimeAndRange(int time, float range) const { - if(minRange <= range && range <= maxRange) + StateParameters* sp; + + // checking if it is in the undefined state + if(state < 0) { return true; } + sp = statePar.Get(state, 0); + + // checking time and range + if(range < sp->minRange || range > sp->maxRange) + { + return false; + } + if(sp->timeOfDayStart <= time && time <= sp->timeOfDayEnd) + { + return true; + } + return false; } +void psEntity::SetState(int stat, SoundControl* ctrl, csVector3 entityPosition, bool forceChange) +{ + StateParameters* sp; + + // check if it's already in this state or if it's defined + if(state == stat) + { + return; + } + + sp = statePar.Get(stat, 0); + if(sp == 0) + { + if(forceChange) + { + state = -1; // undefined state + } + + return; + } + + // stopping previous sound if any + if(handle != 0) + { + handle->RemoveCallback(); + sndSysMgr->StopSound(handle->name); + handle = 0; + } + + // setting and playing the starting sound + state = stat; + + if(sp->startResource != 0) + { + if(sndSysMgr->Play3DSound(sp->startResource, DONT_LOOP, 0, 0, + sp->volume, ctrl, entityPosition, 0, sp->minRange, sp->maxRange, + VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle)) + { + when = sp->delayAfter * 1000; + handle->SetCallback(this, &StopCallback); + } + } +} + bool psEntity::Play(SoundControl* &ctrl, csVector3 entityPosition) { + StateParameters* sp; + + // checking if a sound is still playing if(handle != NULL) { - return false; // a sound is still playing + return false; } - if(sndSysMgr->Play3DSound(resources.Get(state, ""), DONT_LOOP, 0, 0, - volume, ctrl, - entityPosition, 0, - minRange, maxRange, - VOLUME_ZERO, CS_SND3D_ABSOLUTE, - handle)) + // checking if the state is defined + if(state < 0) { - when = delayAfter * 1000; - handle->SetCallback(this, &StopCallback); - return true; + return false; } + + sp = statePar.Get(state, 0); + + if(sp->resource != 0) + { + if(sndSysMgr->Play3DSound(sp->resource, DONT_LOOP, 0, 0, + sp->volume, ctrl, entityPosition, 0, sp->minRange, sp->maxRange, + VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle)) + { + when = sp->delayAfter * 1000; + handle->SetCallback(this, &StopCallback); + return true; + } + } return false; } Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-14 14:57:06 UTC (rev 7414) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-14 19:07:15 UTC (rev 7415) @@ -28,8 +28,8 @@ /** * This object represents a planeshift entity sound. - * this class is a thin class as this is work in progress - * and everything is subject to change. + * + * @see psSoundSector psEntity main user. */ class psEntity @@ -37,78 +37,144 @@ public: csString factoryName; ///< name of this entity's factory csString meshName; ///< name of this entity's mesh - csHash<csString, int> resources; ///< resource name of the sound associated to its state - csHash<csString, int> startResources; ///< resource to be played when the entity status change to its key value - float volume; ///< volume of the sound - float minRange; ///< minimum distance where the sound is heard - float maxRange; ///< maximum distance where the sound is heard - float probability; ///< how high is the probability that this entity makes this sound - int timeOfDay; ///< time when this entity starts playing - int timeOfDayRange; ///< time when this entity stops. - - int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) - int delayAfter; ///< number of seconds till played again - bool active; ///< is this psEntity active, used for caching purposes - int state; ///< current state of this entity + /** - * Constructor. The defaul values are 0 for everything not specified in the - * parameters, timeOfDay = -1, timeOfDayRange = 25, active = false. - * - * @param delayBefore the initial value of when, so the number of seconds - * needed before the sound can be played the first time. + * Create an empty psEntity. The initial state is set to 0. */ psEntity(); /** - * Destructor + * Destructor. When destroyed the sounds is not stopped and it is removed + * by the SoundSystemManager when it is done. */ ~psEntity(); /** * Copy Constructor. It copies everthing but not the handle that is set to 0. + * + * @note the data of each possible state is copied by reference to save time + * so any change on that data will affect also its clone. */ psEntity(psEntity* const &entity); /** + * Gets the probability to play a sound in the current state. + * return the probability to play a sound. + */ + float GetProbability() const; + + /** + * Define a new state and its parameters. If the same state has already been + * defined the method do nothing and returns false. + * + * @param state the state id. + * @param resource the sound to be played when in this state. + * @param startResource the sound to be played when the entity change its + * state into this one. + * @param volume the volume at which this sound is played. + * @param minRange minimum distance at which the sound is heard. + * @param maxRange maximum distance at which the sound is heard + * @param probability the probability that resource is played when in this + * state. + * @param timeOfDayStart time when this entity starts playing. + * @param timeOfDayEnd timewhen this entity stops playing. + * @param delayAfter how much time this entity waits before playing again + * from the moment the sound ends in seconds. + * @return true if the state has been defined, false if already exists. + */ + bool DefineState(int state, const char* resource, const char* startResource, + float volume, float minRange, float maxRange, float probability, + int timeOfDayStart, int timeOfDayEnd, int delayAfter); + + /** + * Decrease by the given interval the time that this entity have to wait + * before play again. + * @param interval the time elapsed in milliseconds. + */ + void ReduceDelay(int interval); + + /** * Check if the sound associated to this entity is still working. * @return true if it is still playing, false otherwise. */ - bool IsPlaying(); + bool IsPlaying() const; /** - * Check time of day. - * Checks if time is within this entitys timewindow. - * Returns true if it is. - * @param time <24 && >0 is resonable but can be any valid int + * Checks if the delay is done and if the state is defined. + * @return true if the dalayed is done and if the entity is not in + * an undefined state, false otherwise. */ - bool CheckTimeOfDay(int time); + bool IsReadyToPlay() const; /** - * Check if the range is between the minimum and maximum range. - * @param the range to test. - * @return true if the range is in this entity's range window, false otherwise. + * Check if time is within this entity's timewindow and if the distance + * is between the minimum and maximum range. + * + * @param time <24 && >0 is resonable but can be any valid int. + * @param range the distance to test. + * @return true if conditions are satisfied or if the entity is in an + * undefined state, false otherwise. */ - bool CheckRange(float range); + bool CheckTimeAndRange(int time, float range) const; + + /** + * Set the new state for the entity and play the start resource (if any) + * with the given SoundControl. If it is already playing a sound, it is + * stopped. + * + * If the given state is undefined for this entity the change of state + * is not forced, the state does not change. On the other hand if the + * change is forced the entity goes in a special "undefined state". In + * this state psEntity cannot play anything. + * + * @param state the new state > 0 for this entity. For negative value the + * function is not defined. + * @param ctrl the SoundControl for playing the starting sound. + * @param entityPosition the position of the starting sound to play. + * @param forceChange true to force the state change, false otherwise. + */ + void SetState(int state, SoundControl* ctrl, csVector3 entityPostion, bool forceChange); /** * Play this entity sound. * You need to supply a SoundControl and the position for this sound. - * @param ctrl SoundControl - * @param entityposition position of this entity + * + * @param ctrl the SoundControl to control this sound. + * @param entityposition position of this entity. + * @return true if the sound is played, false if it is not or if this + * entity is already playing a sound. */ bool Play(SoundControl* &ctrl, csVector3 entityPosition); +private: + struct StateParameters + { + csString resource; ///< resource name of the sound associated to the state + csString startResource; ///< resource to be played when the entity state chage + float volume; ///< volume of the sound + float minRange; ///< minimum distance at which the sound is heard + float maxRange ; ///< maximum distance at which the sound is heard + float probability; ///< how high is the probability that this entity makes this sound + int timeOfDayStart; ///< time when this entity starts playing + int timeOfDayEnd; ///< time when this entity stops. + int delayAfter; ///< number of seconds till played again + + int references; ///< how many psEntity point to this StateParameters + }; + + csHash<StateParameters*, int> statePar; ///< all the parameters associated to their state + SoundHandle* handle; ///< pointer to the SoundHandle if playing + int state; ///< current state of this entity. A negative value means that this entity is in an undefined state. + int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) + /** * The Callback gets called if the SoundHandle is destroyed. * It sets handle to NULL. */ static void StopCallback(void* object); - -private: - SoundHandle* handle; ///< pointer to the SoundHandle if playing }; #endif /*_PSENTITY_H_*/ Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-14 14:57:06 UTC (rev 7414) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-14 19:07:15 UTC (rev 7415) @@ -307,20 +307,25 @@ { const char* factoryName; const char* meshName; + int state; const char* resource; const char* startResource; + float volume; + float minRange; float maxRange; float prob; - int state; + int timeOfDayStart; + int timeOfDayEnd; + int delayAfter; psEntity* entity; factoryName = Node->GetAttributeValue("FACTORY"); meshName = Node->GetAttributeValue("MESH"); + state = Node->GetAttributeValueAsInt("STATE", -1); resource = Node->GetAttributeValue("RESOURCE"); startResource = Node->GetAttributeValue("STARTING_RESOURCE"); maxRange = Node->GetAttributeValueAsFloat("MAX_RANGE", -1.0); prob = Node->GetAttributeValueAsFloat("PROBABILITY", -1.0); - state = Node->GetAttributeValueAsInt("STATE", -1); // checking that all mandatory parameters are present if(factoryName == 0 && meshName == 0 @@ -352,28 +357,19 @@ { entity = new psEntity(); } - else if(entity->resources.Contains(state) || entity->startResources.Contains(state)) - { - return; - } // set all parameters - entity->volume = Node->GetAttributeValueAsFloat("VOLUME", VOLUME_NORM); - entity->minRange = Node->GetAttributeValueAsFloat("Min_RANGE"); - entity->maxRange = maxRange; - entity->probability = prob; - entity->delayAfter = Node->GetAttributeValueAsInt("DELAY_AFTER"); - entity->timeOfDay = Node->GetAttributeValueAsInt("TIME", -1); - entity->timeOfDayRange = Node->GetAttributeValueAsInt("TIME_RANGE", 25); + volume = Node->GetAttributeValueAsFloat("VOLUME", VOLUME_NORM); + minRange = Node->GetAttributeValueAsFloat("MIN_RANGE"); + delayAfter = Node->GetAttributeValueAsInt("DELAY_AFTER"); + timeOfDayStart = Node->GetAttributeValueAsInt("TIME_START", -1); + timeOfDayEnd = Node->GetAttributeValueAsInt("TIME_END", 25); - if(resource != 0) + if(!(entity->DefineState(state, resource, startResource, volume, + minRange, maxRange, prob, timeOfDayStart, timeOfDayEnd, delayAfter))) { - entity->resources.Put(state, resource); + return; } - if(startResource != 0) - { - entity->startResources.Put(state, startResource); - } // handle mesh/factory entities if(meshName == 0) @@ -456,7 +452,7 @@ void psSoundSector::DeleteEntity(psEntity* &entity) { - if(entity->meshName == 0) + if(entity->meshName.IsEmpty()) { factories.Delete(entity->factoryName, entity); } @@ -553,16 +549,14 @@ rangeVec = mesh->GetMovable()->GetFullPosition() - playerposition; range = rangeVec.Norm(); - if(active == true - && entity->CheckTimeOfDay(timeofday) - && entity->CheckRange(range)) + if(active && entity->CheckTimeAndRange(timeofday, range)) { if(!(entity->IsPlaying()) - && rng.Get() <= entity->probability - && entity->when <= 0) + && rng.Get() <= entity->GetProbability() + && entity->IsReadyToPlay()) { // if it's a factory entity creates a temporary entity to handle the sound - if(entity->meshName == 0) + if(entity->meshName.IsEmpty()) { entity = new psEntity(entity); entity->meshName = mesh->QueryObject()->GetName(); @@ -585,7 +579,7 @@ entity = entityIter.Next(); // caching - if(entity->factoryName != 0) + if(!(entity->factoryName.IsEmpty())) { if(entity->active == true) { @@ -598,9 +592,9 @@ } } - if(entity->when > 0 && !(entity->IsPlaying())) + if(!(entity->IsPlaying())) { - entity->when -= 50; // TODO making this consistent with its update + entity->ReduceDelay(50); // TODO making this consistent with its update } } } \ No newline at end of file Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-14 14:57:06 UTC (rev 7414) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-14 19:07:15 UTC (rev 7415) @@ -290,7 +290,7 @@ { case iSoundControl::AMBIENT: sc->SetCallback(this, &UpdateAmbientCallback); - if(ambientSndCtrl != 0) + if(ambientSndCtrl == sndSysMgr->defaultSndCtrl) { ambientSndCtrl->SetType(iSoundControl::NORMAL); ambientSndCtrl->RemoveCallback(); @@ -300,7 +300,7 @@ case iSoundControl::MUSIC: sc->SetCallback(this, &UpdateMusicCallback); - if(musicSndCtrl != 0) + if(musicSndCtrl == sndSysMgr->defaultSndCtrl) { musicSndCtrl->SetType(iSoundControl::NORMAL); musicSndCtrl->RemoveCallback(); @@ -324,11 +324,12 @@ switch(sndCtrl->GetType()) { case iSoundControl::AMBIENT: - ambientSndCtrl = 0; + // use default sound control to avoid null pointers + ambientSndCtrl = sndSysMgr->defaultSndCtrl; break; case iSoundControl::MUSIC: - musicSndCtrl = 0; + musicSndCtrl = sndSysMgr->defaultSndCtrl; break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-14 23:36:41
|
Revision: 7416 http://planeshift.svn.sourceforge.net/planeshift/?rev=7416&view=rev Author: whacko88 Date: 2011-06-14 23:36:35 +0000 (Tue, 14 Jun 2011) Log Message: ----------- fixed some bugs that brought to the client crash Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-14 19:07:15 UTC (rev 7415) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-14 23:36:35 UTC (rev 7416) @@ -258,12 +258,12 @@ void SoundSystemManager::UpdateSound() { float vol; - csHash<SoundHandle*, csString>::GlobalIterator handleIter(soundHandles.GetIterator()); SoundHandle* sh; + csArray<SoundHandle*> handles = soundHandles.GetAll(); - while(handleIter.HasNext()) + for(int i = 0; i < handles.GetSize(); i++) { - sh = handleIter.Next(); + sh = handles[i]; if(sh->sndstream->GetPauseState() == CS_SNDSYS_STREAM_PAUSED && sh->GetAutoRemove() == true) Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-14 19:07:15 UTC (rev 7415) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-14 23:36:35 UTC (rev 7416) @@ -104,7 +104,7 @@ sp = statePar.Get(state, 0); - if(sp == 0) + if(sp != 0) { return false; } Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-14 19:07:15 UTC (rev 7415) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-14 23:36:35 UTC (rev 7416) @@ -411,14 +411,21 @@ continue; } meshName = mesh->QueryObject()->GetName(); - factoryName = mesh->GetFactory()->QueryObject()->GetName(); + // check if the factory is defined for this mesh + iMeshFactoryWrapper* mfw = mesh->GetFactory(); + if(mfw == 0) + { + return; + } + factoryName = mfw->QueryObject()->GetName(); + // first it look in the meshes and factories of this sector - if((entity = meshes.Get(meshName, 0)) == 0) + if((entity = meshes.Get(meshName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); } - else if((entity = factories.Get(factoryName, 0)) == 0) + else if((entity = factories.Get(factoryName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); } @@ -426,11 +433,11 @@ // nothing found here: look in the commonSector else if(commonSector != 0) { - if((entity = commonSector->meshes.Get(meshName, 0)) == 0) + if((entity = commonSector->meshes.Get(meshName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); } - else if((entity = commonSector->factories.Get(factoryName, 0)) == 0) + else if((entity = commonSector->factories.Get(factoryName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-15 13:10:23
|
Revision: 7417 http://planeshift.svn.sourceforge.net/planeshift/?rev=7417&view=rev Author: whacko88 Date: 2011-06-15 13:10:14 +0000 (Wed, 15 Jun 2011) Log Message: ----------- The entity's probability is now the probability to emit a sound in a second Tested the factory sounds and fixed some bugs Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/manager.h soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-14 23:36:35 UTC (rev 7416) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-15 13:10:14 UTC (rev 7417) @@ -65,7 +65,7 @@ public: bool Initialised; ///< is initialized ? SoundControl* mainSndCtrl; ///< sound control for this manager - SoundControl* defaultSndCtrl; ///< sound control always available, used when there is no other + SoundControl* defaultSndCtrl; ///< sound control always available, used when there is no other /** * Constructor initializes this SoundSystemManager. Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-14 23:36:35 UTC (rev 7416) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-15 13:10:14 UTC (rev 7417) @@ -40,7 +40,9 @@ factoryName = entity->factoryName; meshName = entity->meshName; - // updating statPar references + statePar = csHash<StateParameters*, int>(entity->statePar); + + // updating statePar references csHash<StateParameters*, int>::GlobalIterator statIter(statePar.GetIterator()); StateParameters* sp; @@ -50,8 +52,6 @@ sp->references++; } - statePar = csHash<StateParameters*, int>(entity->statePar); - active = entity->active; when = entity->when; state = entity->state; @@ -113,6 +113,7 @@ sp->resource = resource; sp->startResource = startResource; + sp->volume = volume; sp->minRange = minRange; sp->maxRange = maxRange; @@ -212,7 +213,7 @@ // setting and playing the starting sound state = stat; - if(sp->startResource != 0) + if(!(sp->startResource.IsEmpty())) { if(sndSysMgr->Play3DSound(sp->startResource, DONT_LOOP, 0, 0, sp->volume, ctrl, entityPosition, 0, sp->minRange, sp->maxRange, @@ -242,7 +243,7 @@ sp = statePar.Get(state, 0); - if(sp->resource != 0) + if(!(sp->resource.IsEmpty())) { if(sndSysMgr->Play3DSound(sp->resource, DONT_LOOP, 0, 0, sp->volume, ctrl, entityPosition, 0, sp->minRange, sp->maxRange, Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-14 23:36:35 UTC (rev 7416) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-15 13:10:14 UTC (rev 7417) @@ -365,6 +365,9 @@ timeOfDayStart = Node->GetAttributeValueAsInt("TIME_START", -1); timeOfDayEnd = Node->GetAttributeValueAsInt("TIME_END", 25); + // adjusting the probability/s on the update time + prob = prob / 1000 * 50; // TODO make this coherent with the update throttle (now 50) + if(!(entity->DefineState(state, resource, startResource, volume, minRange, maxRange, prob, timeOfDayStart, timeOfDayEnd, delayAfter))) { @@ -410,14 +413,14 @@ { continue; } - meshName = mesh->QueryObject()->GetName(); - + // check if the factory is defined for this mesh iMeshFactoryWrapper* mfw = mesh->GetFactory(); if(mfw == 0) { - return; + continue; } + meshName = mesh->QueryObject()->GetName(); factoryName = mfw->QueryObject()->GetName(); // first it look in the meshes and factories of this sector Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-14 23:36:35 UTC (rev 7416) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-15 13:10:14 UTC (rev 7417) @@ -290,7 +290,7 @@ { case iSoundControl::AMBIENT: sc->SetCallback(this, &UpdateAmbientCallback); - if(ambientSndCtrl == sndSysMgr->defaultSndCtrl) + if(ambientSndCtrl != sndSysMgr->defaultSndCtrl) { ambientSndCtrl->SetType(iSoundControl::NORMAL); ambientSndCtrl->RemoveCallback(); @@ -300,7 +300,7 @@ case iSoundControl::MUSIC: sc->SetCallback(this, &UpdateMusicCallback); - if(musicSndCtrl == sndSysMgr->defaultSndCtrl) + if(musicSndCtrl != sndSysMgr->defaultSndCtrl) { musicSndCtrl->SetType(iSoundControl::NORMAL); musicSndCtrl->RemoveCallback(); @@ -606,6 +606,11 @@ { sndSysMgr = new SoundSystemManager(objectReg); + // initializing ambient and music controller to something different + // than null before AddSndCtrl is called + ambientSndCtrl = sndSysMgr->defaultSndCtrl; + musicSndCtrl = sndSysMgr->defaultSndCtrl; + // Inizializing main SoundControls mainSndCtrl = sndSysMgr->mainSndCtrl; AddSndCtrl(iSoundManager::AMBIENT_SNDCTRL, iSoundControl::AMBIENT); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-16 16:35:19
|
Revision: 7418 http://planeshift.svn.sourceforge.net/planeshift/?rev=7418&view=rev Author: whacko88 Date: 2011-06-16 16:35:12 +0000 (Thu, 16 Jun 2011) Log Message: ----------- Handled meshes with the same name Improved handling meshes with no factory name Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.h soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-15 13:10:14 UTC (rev 7417) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-16 16:35:12 UTC (rev 7418) @@ -261,7 +261,7 @@ SoundHandle* sh; csArray<SoundHandle*> handles = soundHandles.GetAll(); - for(int i = 0; i < handles.GetSize(); i++) + for(size_t i = 0; i < handles.GetSize(); i++) { sh = handles[i]; Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-15 13:10:14 UTC (rev 7417) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-16 16:35:12 UTC (rev 7418) @@ -32,6 +32,7 @@ active = false; when = 0; state = 0; + id = 0; handle = 0; } @@ -55,6 +56,7 @@ active = entity->active; when = entity->when; state = entity->state; + id = 0; handle = 0; } @@ -96,6 +98,16 @@ return sp->probability; } +uint psEntity::GetMeshID() const +{ + return id; +} + +void psEntity::SetMeshID(uint identifier) +{ + id = identifier; +} + bool psEntity::DefineState(int state, const char* resource, const char* startResource, float volume, float minRange, float maxRange, float probability, int timeOfDayStart, int timeOfDayEnd, int delayAfter) @@ -137,6 +149,11 @@ } } +bool psEntity::IsTemporary() const +{ + return (id != 0); +} + bool psEntity::IsPlaying() const { return (handle != 0); Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-15 13:10:14 UTC (rev 7417) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-16 16:35:12 UTC (rev 7418) @@ -67,6 +67,18 @@ float GetProbability() const; /** + * Get the ID of the mesh associated to this entity. + * @return the ID of the mesh. + */ + uint GetMeshID() const; + + /** + * Set the ID of the mesh associated to this entity. + * @param id the new id of this entity. + */ + void SetMeshID(uint id); + + /** * Define a new state and its parameters. If the same state has already been * defined the method do nothing and returns false. * @@ -97,6 +109,13 @@ void ReduceDelay(int interval); /** + * Used to determine if this is a temporary entity associated to a specific mesh + * object or if it is a factory/mesh entity that is not associated to any mesh. + * @return true if this entity is temporary, false otherwise. + */ + bool IsTemporary() const; + + /** * Check if the sound associated to this entity is still working. * @return true if it is still playing, false otherwise. */ @@ -169,6 +188,7 @@ SoundHandle* handle; ///< pointer to the SoundHandle if playing int state; ///< current state of this entity. A negative value means that this entity is in an undefined state. int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) + uint id; ///< the id of the mesh object whose sound is controlled by this entity . /** * The Callback gets called if the SoundHandle is destroyed. Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-15 13:10:14 UTC (rev 7417) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-16 16:35:12 UTC (rev 7418) @@ -394,8 +394,9 @@ iMeshList* entities; psEntity* entity; iMeshWrapper* mesh; + uint meshID; const char* meshName; - const char* factoryName; + const char* factoryName = 0; engine = csQueryRegistry<iEngine>(objectReg); @@ -407,63 +408,99 @@ entities = engine->GetMeshes(); - for(size_t a = 0; a < entities->GetCount(); a++) + for(int a = 0; a < entities->GetCount(); a++) { if((mesh = entities->Get(a)) == 0) { continue; } - + + // checking if we already have a temporary entity for the mesh + // here we don't check the common sector because the common do + // not have temporary entities + meshID = mesh->QueryObject()->GetID(); + if((entity = tempEntities.Get(meshID, 0)) != 0) + { + UpdateEntityValues(ctrl, entity, mesh); + continue; + } + + // check if the factory is defined for this mesh + meshName = mesh->QueryObject()->GetName(); iMeshFactoryWrapper* mfw = mesh->GetFactory(); - if(mfw == 0) + if(mfw != 0) { - continue; + factoryName = mfw->QueryObject()->GetName(); } - meshName = mesh->QueryObject()->GetName(); - factoryName = mfw->QueryObject()->GetName(); // first it look in the meshes and factories of this sector if((entity = meshes.Get(meshName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); + continue; } - else if((entity = factories.Get(factoryName, 0)) != 0) + else if(factoryName != 0) { - UpdateEntityValues(ctrl, entity, mesh); + if((entity = factories.Get(factoryName, 0)) != 0) + { + UpdateEntityValues(ctrl, entity, mesh); + continue; + } } // nothing found here: look in the commonSector - else if(commonSector != 0) + if(commonSector != 0) { if((entity = commonSector->meshes.Get(meshName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); } - else if((entity = commonSector->factories.Get(factoryName, 0)) != 0) + else if(factoryName != 0) { - UpdateEntityValues(ctrl, entity, mesh); + if((entity = commonSector->factories.Get(factoryName, 0)) != 0) + { + UpdateEntityValues(ctrl, entity, mesh); + } } } } - // Cleaning up meshes (factories don't need neither caching nor "when" decreasing) - csHash<psEntity*, csString>::GlobalIterator entityIter(meshes.GetIterator()); + // Cleaning up temporary entities (common sector does't have them) + csArray<psEntity*> tempEnt = tempEntities.GetAll(); + size_t tempEntSize = tempEnt.GetSize(); - CleanUpMeshes(entityIter); + for(size_t i = 0; i < tempEntSize; i++) + { + entity = tempEnt[i]; - if(commonSector != 0) - { - entityIter = commonSector->meshes.GetIterator(); - CleanUpMeshes(entityIter); + if(entity->active == true) + { + entity->active = false; + } + else + { + tempEntities.Delete(entity->GetMeshID(), entity); + delete entity; + continue; + } + + if(!(entity->IsPlaying())) + { + entity->ReduceDelay(50); // TODO making this consistent with its update's throttle + } } } void psSoundSector::DeleteEntity(psEntity* &entity) { - if(entity->meshName.IsEmpty()) + if(entity->IsTemporary()) { + tempEntities.Delete(entity->GetMeshID(), entity); + } + else if(entity->meshName.IsEmpty()) + { factories.Delete(entity->factoryName, entity); } else @@ -549,6 +586,17 @@ factories.DeleteAll(); meshes.DeleteAll(); + + // Deleting temporary entities + csHash<psEntity*, uint>::GlobalIterator tempEntityIter(tempEntities.GetIterator()); + + while(tempEntityIter.HasNext()) + { + entity = tempEntityIter.Next(); + delete entity; + } + + tempEntities.DeleteAll(); } void psSoundSector::UpdateEntityValues(SoundControl* &ctrl, psEntity* entity, iMeshWrapper* mesh) @@ -565,12 +613,11 @@ && rng.Get() <= entity->GetProbability() && entity->IsReadyToPlay()) { - // if it's a factory entity creates a temporary entity to handle the sound - if(entity->meshName.IsEmpty()) + if(!(entity->IsTemporary())) { entity = new psEntity(entity); - entity->meshName = mesh->QueryObject()->GetName(); - meshes.Put(entity->meshName, entity); + entity->SetMeshID(mesh->QueryObject()->GetID()); + tempEntities.Put(entity->GetMeshID(), entity); } entity->Play(ctrl, mesh->GetMovable()->GetFullPosition()); @@ -579,32 +626,3 @@ entity->active = true; } } - -void psSoundSector::CleanUpMeshes(csHash<psEntity*, csString>::GlobalIterator &entityIter) -{ - psEntity* entity; - - while(entityIter.HasNext()) - { - entity = entityIter.Next(); - - // caching - if(!(entity->factoryName.IsEmpty())) - { - if(entity->active == true) - { - entity->active = false; - } - else - { - DeleteEntity(entity); - continue; - } - } - - if(!(entity->IsPlaying())) - { - entity->ReduceDelay(50); // TODO making this consistent with its update - } - } -} \ No newline at end of file Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-15 13:10:14 UTC (rev 7417) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.h 2011-06-16 16:35:12 UTC (rev 7418) @@ -40,6 +40,7 @@ csArray<psEmitter*> emitterarray; ///< array of emitters csHash<psEntity*, csString> factories; ///< hash of factory entities (i.e. with meshName empty) csHash<psEntity*, csString> meshes; ///< hash of mesh entities + csHash<psEntity*, uint> tempEntities; ///< hash of all the temporary psEntites (i.e. associated to a specific mesh) csVector3 playerposition; ///< current playerposition int timeofday; ///< sector time of day @@ -84,7 +85,6 @@ csRef<iObjectRegistry> objectReg; void UpdateEntityValues(SoundControl* &ctrl, psEntity* entity, iMeshWrapper* mesh); - void CleanUpMeshes(csHash<psEntity*, csString>::GlobalIterator &entityIter); }; #endif /*_PSSOUNDSECTOR_H_*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-16 22:15:27
|
Revision: 7421 http://planeshift.svn.sourceforge.net/planeshift/?rev=7421&view=rev Author: whacko88 Date: 2011-06-16 22:15:21 +0000 (Thu, 16 Jun 2011) Log Message: ----------- removed unnecessary control Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-16 22:03:03 UTC (rev 7420) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-16 22:15:21 UTC (rev 7421) @@ -446,23 +446,20 @@ } // nothing found here: look in the commonSector - if(commonSector != 0) + if((entity = commonSector->meshes.Get(meshName, 0)) != 0) { - if((entity = commonSector->meshes.Get(meshName, 0)) != 0) + UpdateEntityValues(ctrl, entity, mesh); + } + else if(factoryName != 0) + { + if((entity = commonSector->factories.Get(factoryName, 0)) != 0) { UpdateEntityValues(ctrl, entity, mesh); } - else if(factoryName != 0) - { - if((entity = commonSector->factories.Get(factoryName, 0)) != 0) - { - UpdateEntityValues(ctrl, entity, mesh); - } - } } } - // Cleaning up temporary entities (common sector does't have them) + // Cleaning up temporary entities (common sector doesn't have them) csArray<psEntity*> tempEnt = tempEntities.GetAll(); size_t tempEntSize = tempEnt.GetSize(); Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-16 22:03:03 UTC (rev 7420) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-16 22:15:21 UTC (rev 7421) @@ -884,7 +884,7 @@ * Load a all sector xmls and make them usable. Will overwrite the target * sector if it exists. It's only parsing the xml most of it is hardcoded. * -* If a common sector it's not found, commonSector will is initalized as +* If a common sector it's not found, commonSector will be initialized as * an empty psSoundSector. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-19 18:28:39
|
Revision: 7429 http://planeshift.svn.sourceforge.net/planeshift/?rev=7429&view=rev Author: whacko88 Date: 2011-06-19 18:28:32 +0000 (Sun, 19 Jun 2011) Log Message: ----------- Fixed a couple of bug that brings the plugin to crash when setting the entity state and removing handles Implementing the basic structure for the delayed 3D sound to simulate the speed of the sound There are a couple of variables in SoundHandle that I'm using to test the new system performance, I'll remove them later Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp soc/2011/sound/src/plugins/common/soundmanager/handle.h soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/manager.h soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-18 21:12:25 UTC (rev 7428) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-19 18:28:32 UTC (rev 7429) @@ -35,6 +35,7 @@ */ SoundHandle::SoundHandle(SoundSystemManager* manager) + : scfImplementationType(this) { fade = 0; fade_stop = false; @@ -67,6 +68,8 @@ manager->GetSoundSystem()->RemoveSource(sndsource); } + csRef<iEventTimer> eventTimer = csEventTimer::GetStandardTimer(manager->objectReg); + eventTimer->RemoveTimerEvent(this); } /* @@ -103,6 +106,22 @@ return true; } +bool SoundHandle::Perform(iTimerEvent* /*ev*/) +{ + unsigned int diff = csGetTicks() - createTime; + csPrintf("expected %u, obtained %u, diff %u\n", del, diff, diff - del); + autoremove = true; + csRef<iEventTimer> eventTimer = csEventTimer::GetStandardTimer(manager->objectReg); + eventTimer->RemoveTimerEvent(this); + + if(sndstream.IsValid()) + { + return sndstream->Unpause(); + } + + return false; +} + /* * This is a utility function to calculate fading * @@ -170,6 +189,16 @@ return autoremove; } +void SoundHandle::Unpause(unsigned int delay) +{ + createTime = csGetTicks(); + del = delay; + + autoremove = false; + csRef<iEventTimer> eventTimer = csEventTimer::GetStandardTimer(manager->objectReg); + eventTimer->AddTimerEvent(this, delay); +} + void SoundHandle::SetCallback(void (*object), void (*function) (void *)) { callbackobject = object; Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-18 21:12:25 UTC (rev 7428) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-19 18:28:32 UTC (rev 7429) @@ -24,8 +24,7 @@ #ifndef _SOUND_HANDLE_H_ #define _SOUND_HANDLE_H_ -#include <isndsys.h> -#include <csutil/csstring.h> +#include <crystalspace.h> class SoundControl; class SoundSystemManager; @@ -37,7 +36,7 @@ FADE_STOP = -1 }; -class SoundHandle +class SoundHandle: public scfImplementation1<SoundHandle, iTimerEvent> { public: csString name; ///< name of the resource or the file - not unique @@ -56,6 +55,7 @@ SoundHandle(SoundSystemManager*); ///< constructor ~SoundHandle(); ///< destructor + /** * Does fading calculation for this Handle * @param volume volume to add / substract @@ -77,6 +77,11 @@ SoundControl* &ctrl); /** + * Unpause the sound after the given delay has elapsed. + */ + virtual bool Perform(iTimerEvent* /*ev*/); + + /** * Converts this Handle to a 3D Handle. * Note: doesnt work when type is CS_SND3D_DISABLE * Also created directional sources if rad > 0 @@ -103,6 +108,12 @@ bool GetAutoRemove(); /** + * Unpause the sound stream of this header after the given delay. + * @param delay the delay in milliseconds. + */ + void Unpause(unsigned int delay); + + /** * Sets a Callback to a object function. * @param object pointer to the object * @param function pointer to a static void function within the object @@ -119,6 +130,9 @@ void (*callbackobject); ///< pointer to the callback object void (*callbackfunction) (void *); ///< pointer to the callback function + unsigned int del; // TODO REMOVE ME + unsigned int createTime; // TODO REMOVE ME + /** * Makes the callback if set. * Calls callbackfunction of callbackobject. Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-18 21:12:25 UTC (rev 7428) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-19 18:28:32 UTC (rev 7429) @@ -35,11 +35,13 @@ * Set Initialized to true if successfull / to false if not */ -SoundSystemManager::SoundSystemManager(iObjectRegistry* objectReg) +SoundSystemManager::SoundSystemManager(iObjectRegistry* objReg) { // Initialised to false to make sure it is .. Initialised = false; + objectReg = objReg; + // Create a new SoundSystem, SoundData Instance and the main SoundControl soundSystem = new SoundSystem; soundData = new SoundData; @@ -214,8 +216,12 @@ /* make it 3d */ handle->ConvertTo3D(mindist, maxdist, pos, dir, rad); - handle->sndstream->Unpause(); + csVector3 diff = pos - soundSystem->GetListenerPosition(); + float distance = diff.Norm(); + unsigned int delay = distance * 1000 / 331; + handle->Unpause(delay); + soundHandles.Put(name, handle); return true; } @@ -265,11 +271,18 @@ { sh = handles[i]; - if(sh->sndstream->GetPauseState() == CS_SNDSYS_STREAM_PAUSED - && sh->GetAutoRemove() == true) + if(sh->GetAutoRemove() == true) { - RemoveHandle(sh->name); - continue; + if(!(sh->sndstream.IsValid())) + { + RemoveHandle(sh->name); + continue; + } + if(sh->sndstream->GetPauseState() == CS_SNDSYS_STREAM_PAUSED) + { + RemoveHandle(sh->name); + continue; + } } // fade in or out Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-18 21:12:25 UTC (rev 7428) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-19 18:28:32 UTC (rev 7429) @@ -63,9 +63,10 @@ class SoundSystemManager { public: - bool Initialised; ///< is initialized ? - SoundControl* mainSndCtrl; ///< sound control for this manager - SoundControl* defaultSndCtrl; ///< sound control always available, used when there is no other + bool Initialised; ///< is initialized ? + SoundControl* mainSndCtrl; ///< sound control for this manager + SoundControl* defaultSndCtrl; ///< sound control always available, used when there is no other + csRef<iObjectRegistry> objectReg; ///< object registry /** * Constructor initializes this SoundSystemManager. Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-18 21:12:25 UTC (rev 7428) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-19 18:28:32 UTC (rev 7429) @@ -477,7 +477,10 @@ void SoundManager::SetEntityState(int state, iMeshWrapper* mesh, bool forceChange) { - activeSector->SetEntityState(state, ambientSndCtrl, mesh, forceChange); + if(activeSector != 0) + { + activeSector->SetEntityState(state, ambientSndCtrl, mesh, forceChange); + } } void SoundManager::SetLoopBGMToggle(bool toggle) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-21 21:51:50
|
Revision: 7439 http://planeshift.svn.sourceforge.net/planeshift/?rev=7439&view=rev Author: whacko88 Date: 2011-06-21 21:51:44 +0000 (Tue, 21 Jun 2011) Log Message: ----------- tested new handle management and corrected the introduced bugs Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp soc/2011/sound/src/plugins/common/soundmanager/handle.h soc/2011/sound/src/plugins/common/soundmanager/manager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-21 15:16:54 UTC (rev 7438) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-21 21:51:44 UTC (rev 7439) @@ -199,7 +199,7 @@ return (!delayActive && autoremove); } -void SoundHandle::Unpause(unsigned int delay) +void SoundHandle::UnpauseAfterDelay(unsigned int delay) { if(delay == 0) { Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-21 15:16:54 UTC (rev 7438) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-21 21:51:44 UTC (rev 7439) @@ -117,7 +117,7 @@ * Unpause the sound stream of this header after the given delay. * @param delay the delay in milliseconds. */ - void Unpause(unsigned int delay); + void UnpauseAfterDelay(unsigned int delay); /** * Sets a Callback to a object function. Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-21 15:16:54 UTC (rev 7438) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-21 21:51:44 UTC (rev 7439) @@ -228,7 +228,7 @@ csVector3 diff = pos - soundSystem->GetListenerPosition(); float distance = diff.Norm(); unsigned int delay = distance * 1000 / 331; - handle->Unpause(delay); + handle->UnpauseAfterDelay(delay); soundHandles.Put(handleID, handle); return true; @@ -393,8 +393,8 @@ do { handleID = randomGen.Get(10000); - } while(soundHandles.Get(handleID, 0) == 0 - && handleID != 0); + } while(soundHandles.Get(handleID, 0) != 0 + || handleID == 0); return handleID; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-23 22:33:51
|
Revision: 7443 http://planeshift.svn.sourceforge.net/planeshift/?rev=7443&view=rev Author: whacko88 Date: 2011-06-23 22:33:45 +0000 (Thu, 23 Jun 2011) Log Message: ----------- removed temporary variables Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp soc/2011/sound/src/plugins/common/soundmanager/handle.h Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-23 17:22:17 UTC (rev 7442) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-23 22:33:45 UTC (rev 7443) @@ -119,9 +119,6 @@ bool SoundHandle::Perform(iTimerEvent* /*ev*/) { - unsigned int diff = csGetTicks() - createTime; // TODO REMOVE ME - //csPrintf("expected %u, obtained %u, diff %u\n", del, diff, diff - del); // TODO REMOVE ME - manager->eventTimer->RemoveTimerEvent(this); delayActive = false; @@ -228,9 +225,6 @@ } else { - createTime = csGetTicks(); - del = delay; - delayActive = true; manager->eventTimer->AddTimerEvent(this, delay); } Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-23 17:22:17 UTC (rev 7442) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-23 22:33:45 UTC (rev 7443) @@ -154,9 +154,6 @@ bool autoremove; ///< remove this handle when pause? bool delayActive; ///< true if the handle is waiting for the end of delay to unpause - unsigned int del; // TODO REMOVE ME - unsigned int createTime; // TODO REMOVE ME - /** * Makes the callback if set. * Calls callbackfunction of callbackobject. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-24 16:42:38
|
Revision: 7446 http://planeshift.svn.sourceforge.net/planeshift/?rev=7446&view=rev Author: whacko88 Date: 2011-06-24 16:42:31 +0000 (Fri, 24 Jun 2011) Log Message: ----------- added support for not applying doppler effect Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp soc/2011/sound/src/plugins/common/soundmanager/handle.h soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/manager.h Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-24 14:01:37 UTC (rev 7445) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-24 16:42:31 UTC (rev 7446) @@ -94,7 +94,7 @@ */ bool SoundHandle::Init(const char* resname, bool loop, float volume_preset, - int type, SoundControl* &ctrl) + int type, SoundControl* &ctrl, bool doppler) { csRef<iSndSysData> snddata; @@ -114,6 +114,8 @@ sndCtrl = ctrl; name = csString(resname); + dopplerEffect = doppler; + return true; } @@ -197,6 +199,11 @@ return false; } +bool SoundHandle::IsDopplerEffectEnabled() +{ + return dopplerEffect; +} + uint SoundHandle::GetID() { return id; Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-24 14:01:37 UTC (rev 7445) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-24 16:42:31 UTC (rev 7446) @@ -70,10 +70,11 @@ * @param volume_preset volume which all calculation are based upon * @param type 3d type: can be CS_SND3D_DISABLE=0. CS_SND3D_RELATIVE=1 or CS_SND3D_ABSOLUTE=2 * @param ctrl SoundControl which controls this Handle + * @param dopplerEffect true to apply the doppler effect to this sound, false otherwise. */ bool Init(const char* resname, bool loop, float volume_preset, int type, - SoundControl* &ctrl); + SoundControl* &ctrl, bool dopplerEffect); /** * Unpause the sound after the given delay has elapsed. @@ -101,6 +102,12 @@ bool Is3D(); /** + * Check if the doppler effect is enabled for this sound. + * @return true if the doppler effect is enabled, false otherwise. + */ + bool IsDopplerEffectEnabled(); + + /** * Gets the ID of this handle. * @return the ID of this handle. */ @@ -153,6 +160,7 @@ bool autoremove; ///< remove this handle when pause? bool delayActive; ///< true if the handle is waiting for the end of delay to unpause + bool dopplerEffect; ///< true if the doppler effect is enabled for this sound /** * Makes the callback if set. Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-24 14:01:37 UTC (rev 7445) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-24 16:42:31 UTC (rev 7446) @@ -140,7 +140,7 @@ Play2DSound(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, SoundControl* &sndCtrl, SoundHandle* &handle) { - CreateSoundHandle(name, loop, loopstart, loopend, volume_preset, CS_SND3D_DISABLE, sndCtrl, handle); + CreateSoundHandle(name, loop, loopstart, loopend, volume_preset, CS_SND3D_DISABLE, sndCtrl, handle, false); if(handle == 0) { @@ -164,9 +164,9 @@ Play3DSound(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, SoundControl* &sndCtrl, csVector3 pos, csVector3 dir, float mindist, float maxdist, float rad, - int type3d, SoundHandle* &handle) + int type3d, SoundHandle* &handle, bool dopplerEffect) { - CreateSoundHandle(name, loop, loopstart, loopend, volume_preset, type3d, sndCtrl, handle); + CreateSoundHandle(name, loop, loopstart, loopend, volume_preset, type3d, sndCtrl, handle, dopplerEffect); if(handle == 0) { @@ -176,12 +176,19 @@ /* make it 3d */ handle->ConvertTo3D(mindist, maxdist, pos, dir, rad); - // computing the delay caused by the speed of sound - csVector3 diff = pos - soundSystem->GetListenerPosition(); - float distance = diff.Norm(); - unsigned int delay = distance * 1000 / SPEED_OF_SOUND; + if(dopplerEffect) + { + // computing the delay caused by the speed of sound + csVector3 diff = pos - soundSystem->GetListenerPosition(); + float distance = diff.Norm(); + unsigned int delay = distance * 1000 / SPEED_OF_SOUND; - handle->UnpauseAfterDelay(delay); + handle->UnpauseAfterDelay(delay); + } + else + { + handle->sndstream->Unpause(); + } return true; } @@ -254,7 +261,7 @@ } // applying Doppler effect - if(sh->Is3D()) + if(sh->Is3D() && sh->IsDopplerEffectEnabled()) { ChangePlayRate(sh); } @@ -403,7 +410,7 @@ void SoundSystemManager:: CreateSoundHandle(const char* name, bool loop, size_t loopstart, size_t loopend, - float volume_preset, int type3d, SoundControl* &sndCtrl, SoundHandle* &handle) + float volume_preset, int type3d, SoundControl* &sndCtrl, SoundHandle* &handle, bool dopplerEffect) { uint handleID; handle = 0; // make sure that if the handle is not valid it is null @@ -428,7 +435,7 @@ handleID = FindHandleID(); handle = new SoundHandle(this, handleID); - if(!handle->Init(name, loop, volume_preset, type3d, sndCtrl)) + if(!handle->Init(name, loop, volume_preset, type3d, sndCtrl, dopplerEffect)) { delete handle; handle = 0; Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-24 14:01:37 UTC (rev 7445) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-24 16:42:31 UTC (rev 7446) @@ -58,8 +58,6 @@ * You may discard the Handle or use it the manage your sound. * SoundControl and SoundHandle have many Interface functions which help you todo what * ever you want. Access to the underlaying sources is also granted. - * - * TODO merge Play* functions */ class SoundSystemManager @@ -120,12 +118,13 @@ * @param maxdist distance when minvolume is applied * @param rad radiation of the directional cone. Set it to 0 if you dont want a directional sound. * @param handle a Handle you have to supply. You may discard it if you dont want to manage this sound. + * @param dopplerEffect true to apply the doppler effect to this sound, false otherwise. * */ bool Play3DSound(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, SoundControl* &sndCtrl, csVector3 pos, csVector3 dir, float mindist, float maxdist, float rad, int type3d, - SoundHandle* &handle); + SoundHandle* &handle, bool dopplerEffect = true); /** * Pause a sound and set the autoremove. The handle is picked up in the next update. @@ -233,10 +232,11 @@ * @param sndCtrl SoundControl to control this sound * @param handle the SoundHandle that will be initialized. After the method's call * it is a null pointer if it could not be created. + * @param dopplerEffect true to apply the doppler effect to this sound, false otherwise. */ void CreateSoundHandle(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, int type3d, - SoundControl* &sndCtrl, SoundHandle* &handle); + SoundControl* &sndCtrl, SoundHandle* &handle, bool dopplerEffect); }; #endif /*_SOUND_MANAGER_H_*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-24 17:22:52
|
Revision: 7447 http://planeshift.svn.sourceforge.net/planeshift/?rev=7447&view=rev Author: whacko88 Date: 2011-06-24 17:22:46 +0000 (Fri, 24 Jun 2011) Log Message: ----------- added support for non doppler emitters Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp soc/2011/sound/src/plugins/common/soundmanager/psemitter.h soc/2011/sound/src/plugins/common/soundmanager/psentity.h soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp 2011-06-24 16:42:31 UTC (rev 7446) +++ soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp 2011-06-24 17:22:46 UTC (rev 7447) @@ -38,6 +38,7 @@ position = csVector3(0); direction = csVector3(0); active = false; + dopplerEffect = true; timeofday = -1; timeofdayrange = -1; handle = NULL; @@ -52,6 +53,7 @@ minrange = emitter->minrange; maxrange = emitter->maxrange; probability = emitter->probability; + dopplerEffect = emitter->dopplerEffect; timeofday = emitter->timeofday; timeofdayrange = emitter->timeofdayrange; loop = emitter->loop; @@ -102,7 +104,7 @@ position, direction, minrange, maxrange, VOLUME_ZERO, CS_SND3D_ABSOLUTE, - handle)) + handle, dopplerEffect)) { active = true; handle->SetCallback(this, &StopCallback); Modified: soc/2011/sound/src/plugins/common/soundmanager/psemitter.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psemitter.h 2011-06-24 16:42:31 UTC (rev 7446) +++ soc/2011/sound/src/plugins/common/soundmanager/psemitter.h 2011-06-24 17:22:46 UTC (rev 7447) @@ -49,6 +49,7 @@ csVector3 position; ///< position of the emitter csVector3 direction; ///< direction were emitting to bool active; ///< is this emitter active? + bool dopplerEffect; ///< true if the doppler effect must be applied for this emitter int timeofday; ///< time when this emitter starts playing int timeofdayrange; ///< time when this emitter stops SoundHandle* handle; ///< @see SoundHandle if it is active Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-24 16:42:31 UTC (rev 7446) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.h 2011-06-24 17:22:46 UTC (rev 7447) @@ -195,7 +195,7 @@ SoundHandle* handle; ///< pointer to the SoundHandle if playing int state; ///< current state of this entity. A negative value means that this entity is in an undefined state. int when; ///< counter to keep track when it has been played - zero means i may play at any time (in ms) - uint id; ///< the id of the mesh object whose sound is controlled by this entity . + uint id; ///< the id of the mesh object whose sound is controlled by this entity. float minMinRange; ///< minimum minRange between all the defined state of this entity float maxMaxRange; ///< maximum maxRange between all the defined state of this entity Modified: soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-24 16:42:31 UTC (rev 7446) +++ soc/2011/sound/src/plugins/common/soundmanager/pssoundsector.cpp 2011-06-24 17:22:46 UTC (rev 7447) @@ -242,6 +242,7 @@ emitter->minrange = Node->GetAttributeValueAsFloat("MIN_RANGE"); emitter->probability = Node->GetAttributeValueAsFloat("PROBABILITY", 1.0); emitter->loop = Node->GetAttributeValueAsBool("LOOP", true); + emitter->dopplerEffect = Node->GetAttributeValueAsBool("DOPPLER_ENABLED", true); emitter->fadedelay = Node->GetAttributeValueAsInt("FADEDELAY"); emitter->factory = Node->GetAttributeValue("FACTORY"); emitter->factory_prob = Node->GetAttributeValueAsFloat("FACTORY_PROBABILITY"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-27 14:40:31
|
Revision: 7457 http://planeshift.svn.sourceforge.net/planeshift/?rev=7457&view=rev Author: whacko88 Date: 2011-06-27 14:40:23 +0000 (Mon, 27 Jun 2011) Log Message: ----------- Added basic class Instrument Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp Added Paths: ----------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-26 23:14:10 UTC (rev 7456) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-27 14:40:23 UTC (rev 7457) @@ -96,7 +96,7 @@ bool SoundHandle::Init(const char* resname, bool loop, float volume_preset, int type, SoundControl* &ctrl, bool doppler) { - csRef<iSndSysData> snddata; + csRef<iSndSysData> snddata; if(!manager->GetSoundData()->LoadSoundFile(resname, snddata)) { Added: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-27 14:40:23 UTC (rev 7457) @@ -0,0 +1,161 @@ +/* + * instrument.cpp, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "instrument.h" + +//==================================================================================== +// Crystal Space Includes +//==================================================================================== +#include <isndsys/ss_structs.h> +#include <isndsys/ss_stream.h> + +//==================================================================================== +// Project Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Local Includes +//==================================================================================== +// TODO needed? + +//------------------------------------------------------------------------------------ +// Forward Declarations +//------------------------------------------------------------------------------------ +// TODO needed? + +Instrument::Instrument() +{ + format = 0; +} + +Instrument::~Instrument() +{ + delete format; +} + +void Instrument::GetNoteBuffer(char note, int alter, int oct, uint duration, uint8* &buffer, size_t &length) +{ + size_t positionMarker; + size_t requestedBytes; + uint8* buffer2; + size_t length2; + int streamIndex; + csRef<iSndSysStream> noteStream; + csRefArray<iSndSysStream> octave; + + // if there isn't the octave return null + octave = notes.Get(oct, 0); + if(octave.GetSize() == 0) + { + length = 0; + return; + } + + // getting the index of the note + switch(note) + { + case('C'): + streamIndex = 0; + break; + case('D'): + streamIndex = 2; + break; + case('E'): + streamIndex = 4; + break; + case('F'): + streamIndex = 5; + break; + case('G'): + streamIndex = 7; + break; + case('A'): + streamIndex = 9; + break; + case('B'): + streamIndex = 11; + break; + } + + streamIndex += alter; + + // if the note is not in this octave return the right one + if(streamIndex > 11) + { + return GetNoteBuffer(note, alter - 12, oct + 1, duration, buffer, length); + } + if(streamIndex < 0) + { + return GetNoteBuffer(note, alter + 12, oct - 1, duration, buffer, length); + } + + // if the note of this octave is not defined return null + noteStream = octave.Get(streamIndex); + if(noteStream == 0) + { + length = 0; + return; + } + + // computing the number of requested bytes + // #bytes = sample frequency * duration of the notes in seconds * number of bytes per sample + requestedBytes = format->Freq * (duration / 1000.0) * (format->Bits / 8); + + requestedBytes -= requestedBytes % format->Bits; + + // getting the data TODO + return; +} + +bool Instrument::CheckSameFormat(const csSndSysSoundFormat* f) +{ + // If format is null this is the first added note: create format + if(format == 0) + { + format = new csSndSysSoundFormat(); + format->Bits = f->Bits; + format->Channels = f->Channels; + format->Flags = f->Flags; + format->Freq = f->Freq; + return true; + } + + // checking format's fields + if(format->Bits != f->Bits) + { + return false; + } + if(format->Channels != f->Channels) + { + return false; + } + if(format->Flags != f->Flags) + { + return false; + } + if(format->Freq != f->Freq) + { + return false; + } + + // everything is correct + return true; +} + Property changes on: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-27 14:40:23 UTC (rev 7457) @@ -0,0 +1,109 @@ +/* + * instrument.h, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef INSTRUMENT_H +#define INSTRUMENT_H + +//==================================================================================== +// Crystal Space Includes +//==================================================================================== +#include <cssysdef.h> +#include <csutil/hash.h> +#include <csutil/refarr.h> + +//==================================================================================== +// Project Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Local Includes +//==================================================================================== +// TODO needed? + +//------------------------------------------------------------------------------------ +// Forward Declarations +//------------------------------------------------------------------------------------ +struct iSndSysStream; +struct csSndSysSoundFormat; + +/** +* This class represent a musical general instrument. +*/ +class Instrument +{ +public: + + /** + * Constructor. Load sounds of the notes of this instrument following the directions + * of the plugin's configuration file. + */ + Instrument(); + + /** + * Destructor. + */ + ~Instrument(); + + /** + * Gets the csSndSysSoundFormat for the notes in this instrument. + * return the csSndSysSoundFormat. + */ + virtual const csSndSysSoundFormat* GetFormat() const { return format; } + + /** + * Provide a buffer containing the decoded data for the given note of this + * instrument. + * + * @param note a char representing the note in the British English notation + * (i.e. A, B, C, ..., G). + * @param alter 1 if the note is altered by a sharp (2 for double sharp), + * -1 for a flat (-2 for double flat) and 0 if it is note altered. + * @param duration the duration of the note in milliseconds. + * @param length when the method is done this will contain the length of + * the buffer. + * @return the buffer containing the decoded data for the given note, or a + * null pointer if the note does not exist. + */ + virtual void GetNoteBuffer(char note, int alter, int octave, uint duration, uint8* &buffer, size_t &length); + +private: + csSndSysSoundFormat* format; ///< the format shared by all the notes' streams + csHash<csRefArray<iSndSysStream>, int> notes; ///< the notes' streams + + /** + * Load sounds of the notes of this instrument following the directions of + * the plugin's configuration file. (youhitnodmg) + */ + virtual void LoadNotes() = 0; + + /** + * Checks if the given format is the same as the format of all the other notes + * of this instrument. If there is not already a format for the instrument it + * creates one by copying the given one. + * + * @param format the format to compare. + * @return true if the given format is the same as the format of all the other + * notes, false otherwise. + */ + virtual bool CheckSameFormat(const csSndSysSoundFormat* format); +}; + +#endif /* INSTRUMENT_H */ + Property changes on: soc/2011/sound/src/plugins/common/soundmanager/instrument.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-28 08:25:17
|
Revision: 7464 http://planeshift.svn.sourceforge.net/planeshift/?rev=7464&view=rev Author: whacko88 Date: 2011-06-28 08:25:10 +0000 (Tue, 28 Jun 2011) Log Message: ----------- Instrument: changed notes structure, added polyphony option Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-27 23:18:49 UTC (rev 7463) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-28 08:25:10 UTC (rev 7464) @@ -42,86 +42,103 @@ Instrument::Instrument() { + polyphony = 1; format = 0; } Instrument::~Instrument() { - delete format; + if(format != 0) + { + delete format; + } + + // deleting notes + csHash<csHash<Note*, char>, uint>::GlobalIterator octaveIter(notes.GetIterator()); + csHash<Note*, char> oct; + Note* note; + + while(octaveIter.HasNext()) + { + oct = octaveIter.Next(); + csHash<Note*, char>::GlobalIterator noteIter(oct.GetIterator()); + while(noteIter.HasNext()) + { + note = noteIter.Next(); + delete note; + } + + oct.DeleteAll(); + } + notes.DeleteAll(); } -void Instrument::GetNoteBuffer(char note, int alter, int oct, uint duration, uint8* &buffer, size_t &length) +size_t Instrument::GetNoteBuffer(char pitch, int alter, uint octave, uint duration, uint8* &buffer, size_t &length) { - size_t positionMarker; - size_t requestedBytes; - uint8* buffer2; - size_t length2; - int streamIndex; - csRef<iSndSysStream> noteStream; - csRefArray<iSndSysStream> octave; + Note* note; + size_t requestedBytes; // the number of bytes that are needed for the given duration - // if there isn't the octave return null - octave = notes.Get(oct, 0); - if(octave.GetSize() == 0) + // check if notes have been loaded + if(format == 0) { length = 0; - return; + return 0; } - // getting the index of the note - switch(note) + // computing the number of requested bytes + // #bytes = sample frequency * duration of the notes in seconds * number of bytes per sample + requestedBytes = format->Freq * (duration / 1000.0f) * (format->Bits / 8); + + // check if this note is defined + if(notes.Contains(octave)) { - case('C'): - streamIndex = 0; - break; - case('D'): - streamIndex = 2; - break; - case('E'): - streamIndex = 4; - break; - case('F'): - streamIndex = 5; - break; - case('G'): - streamIndex = 7; - break; - case('A'): - streamIndex = 9; - break; - case('B'): - streamIndex = 11; - break; + note = notes.Get(octave, 0).Get(pitch, 0); + if(note == 0) + { + length = 0; + return requestedBytes; + } } - - streamIndex += alter; - // if the note is not in this octave return the right one - if(streamIndex > 11) + // selecting the note + if(alter == 0) { - return GetNoteBuffer(note, alter - 12, oct + 1, duration, buffer, length); + buffer = note->normal; + length = note->normalLength; } - if(streamIndex < 0) + else if(alter > 0) { - return GetNoteBuffer(note, alter + 12, oct - 1, duration, buffer, length); + buffer = note->sharp; + length = note->sharpLength; } + else + { + buffer = note->flat; + length = note->flatLength; + } - // if the note of this octave is not defined return null - noteStream = octave.Get(streamIndex); - if(noteStream == 0) + // checking length + if(length > requestedBytes) { - length = 0; - return; + length = requestedBytes; + requestedBytes = 0; } + else if(length < requestedBytes) + { + requestedBytes -= length; + } + else + { + requestedBytes = 0; + } - // computing the number of requested bytes - // #bytes = sample frequency * duration of the notes in seconds * number of bytes per sample - requestedBytes = format->Freq * (duration / 1000.0) * (format->Bits / 8); + return requestedBytes; +} - requestedBytes -= requestedBytes % format->Bits; - - // getting the data TODO - return; +bool Instrument::AddNote(const char* fileName, char note, int alter, uint octave) +{ + // TODO + return false; } bool Instrument::CheckSameFormat(const csSndSysSoundFormat* f) Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-27 23:18:49 UTC (rev 7463) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-28 08:25:10 UTC (rev 7464) @@ -25,7 +25,6 @@ //==================================================================================== #include <cssysdef.h> #include <csutil/hash.h> -#include <csutil/refarr.h> //==================================================================================== // Project Includes @@ -43,8 +42,38 @@ struct iSndSysStream; struct csSndSysSoundFormat; + /** -* This class represent a musical general instrument. + * This struct represents a musical note. It keeps the stream buffer of the normal + * note, the sharp and the flat ones when available; + */ +struct Note +{ + uint8* normal; ///< the buffer of the unaltered note. + uint8* sharp; ///< the buffer of the sharp note. + uint8* flat; ///< the buffer of the flat note. + + size_t normalLength; ///< the length of the buffer of the unaltered note. + size_t sharpLength; ///< the length of the buffer of the sharp note. + size_t flatLength; ///< the length of the buffer of the flat note. + + /** + * Constructor. It initializes everything to 0. + */ + Note() + { + normal = 0; + sharp = 0; + flat = 0; + + normalLength = 0; + sharpLength = 0; + flatLength = 0; + } +}; + +/** +* This class represent a general musical instrument. */ class Instrument { @@ -62,38 +91,63 @@ ~Instrument(); /** - * Gets the csSndSysSoundFormat for the notes in this instrument. + * Gets the number of notes that this instrument can play at the same time. + * @return the number of notes that this instrument can play at the same time. + */ + virtual uint GetPolyphony() const { return polyphony; } + + /** + * Gets the csSndSysSoundFormat of the notes of this instrument. * return the csSndSysSoundFormat. */ virtual const csSndSysSoundFormat* GetFormat() const { return format; } /** * Provide a buffer containing the decoded data for the given note of this - * instrument. + * instrument. If there are no notes loaded, at the end of the method both + * the return value and length are 0. * * @param note a char representing the note in the British English notation * (i.e. A, B, C, ..., G). - * @param alter 1 if the note is altered by a sharp (2 for double sharp), - * -1 for a flat (-2 for double flat) and 0 if it is note altered. + * @param alter > 0 if the note is altered by a sharp, < 0 for a flat and 0 + * if it is not altered. + * @param octave 4 for the central octave in piano. * @param duration the duration of the note in milliseconds. + * @param buffer when the method is done this will contain the decoded data + * for the given note, or a null pointer if the note does not exist. * @param length when the method is done this will contain the length of - * the buffer. - * @return the buffer containing the decoded data for the given note, or a - * null pointer if the note does not exist. + * the provided buffer. + * @return the number of bytes that are missing to reach the duration. This + * can be greater than 0 if the sound in the file used to load the note data + * does not last enough. */ - virtual void GetNoteBuffer(char note, int alter, int octave, uint duration, uint8* &buffer, size_t &length); + virtual size_t GetNoteBuffer(char note, int alter, uint octave, uint duration, uint8* &buffer, size_t &length); private: - csSndSysSoundFormat* format; ///< the format shared by all the notes' streams - csHash<csRefArray<iSndSysStream>, int> notes; ///< the notes' streams + uint polyphony; ///< number of notes that this instrument can play at the same time. + csSndSysSoundFormat* format; ///< the format shared by all the notes' streams. + csHash<csHash<Note*, char>, uint> notes; ///< the notes' streams. /** * Load sounds of the notes of this instrument following the directions of - * the plugin's configuration file. (youhitnodmg) + * the plugin's configuration file. */ virtual void LoadNotes() = 0; /** + * Add the given note to the sounds that this instruments can play. + * + * @param fileName the file that contain the note sound. + * @param note a char representing the note in the British English notation + * (i.e. A, B, C, ..., G). + * @param alter > 0 if the note is altered by a sharp, < 0 for a flat and 0 + * if it is not altered. + * @param octave 4 for the central octave in piano. + * @return true if the note could be loaded, false otherwise. + */ + virtual bool AddNote(const char* fileName, char note, int alter, uint octave); + + /** * Checks if the given format is the same as the format of all the other notes * of this instrument. If there is not already a format for the instrument it * creates one by copying the given one. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-28 08:45:39
|
Revision: 7465 http://planeshift.svn.sourceforge.net/planeshift/?rev=7465&view=rev Author: whacko88 Date: 2011-06-28 08:45:33 +0000 (Tue, 28 Jun 2011) Log Message: ----------- singleton implementation of SoundSystemManager Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/manager.h soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp soc/2011/sound/src/plugins/common/soundmanager/queue.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-28 08:45:33 UTC (rev 7465) @@ -32,6 +32,8 @@ #include <csutil/timer.h> #include <csutil/randomgen.h> +#include "util/singleton.h" + class SoundSystem; class SoundData; class SoundHandle; @@ -60,7 +62,7 @@ * ever you want. Access to the underlaying sources is also granted. */ -class SoundSystemManager +class SoundSystemManager: public Singleton<SoundSystemManager> { public: bool Initialised; ///< is initialized ? Modified: soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp 2011-06-28 08:45:33 UTC (rev 7465) @@ -23,7 +23,6 @@ #include "pssound.h" -extern SoundSystemManager* sndSysMgr; psEmitter::psEmitter() { @@ -99,12 +98,9 @@ bool psEmitter::Play(SoundControl* &ctrl) { Stop(); // stop any previous play - if(sndSysMgr->Play3DSound(resource, loop, 0, 0, - maxvol, ctrl, - position, direction, - minrange, maxrange, - VOLUME_ZERO, CS_SND3D_ABSOLUTE, - handle, dopplerEffect)) + if(SoundSystemManager::GetSingleton().Play3DSound(resource, loop, 0, 0, + maxvol, ctrl, position, direction, minrange, maxrange, + VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle, dopplerEffect)) { active = true; handle->SetCallback(this, &StopCallback); @@ -120,7 +116,7 @@ if(handle != NULL) { - sndSysMgr->StopSound(handle->GetID()); + SoundSystemManager::GetSingleton().StopSound(handle->GetID()); } } Modified: soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/psentity.cpp 2011-06-28 08:45:33 UTC (rev 7465) @@ -25,7 +25,6 @@ #include "pssound.h" -extern SoundSystemManager* sndSysMgr; psEntity::psEntity() { @@ -249,7 +248,7 @@ if(handle != 0) { handle->RemoveCallback(); - sndSysMgr->StopSound(handle->GetID()); + SoundSystemManager::GetSingleton().StopSound(handle->GetID()); handle = 0; } @@ -270,7 +269,7 @@ // playing the starting sound if(!(sp->startResource.IsEmpty())) { - if(sndSysMgr->Play3DSound(sp->startResource, DONT_LOOP, 0, 0, + if(SoundSystemManager::GetSingleton().Play3DSound(sp->startResource, DONT_LOOP, 0, 0, sp->volume, ctrl, entityPosition, 0, sp->minRange, sp->maxRange, VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle)) { @@ -300,7 +299,7 @@ if(!(sp->resource.IsEmpty())) { - if(sndSysMgr->Play3DSound(sp->resource, DONT_LOOP, 0, 0, + if(SoundSystemManager::GetSingleton().Play3DSound(sp->resource, DONT_LOOP, 0, 0, sp->volume, ctrl, entityPosition, 0, sp->minRange, sp->maxRange, VOLUME_ZERO, CS_SND3D_ABSOLUTE, handle)) { Modified: soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp 2011-06-28 08:45:33 UTC (rev 7465) @@ -22,9 +22,8 @@ */ #include "pssound.h" - -extern SoundSystemManager* sndSysMgr; + psMusic::psMusic() { active = false; @@ -88,10 +87,8 @@ bool psMusic::Play(bool loopToggle, SoundControl* &ctrl) { Stop(); // stop any previous sound - if(sndSysMgr->Play2DSound(resource, loopToggle, - loopstart, loopend, - minvol, ctrl, - handle)) + if(SoundSystemManager::GetSingleton().Play2DSound(resource, loopToggle, + loopstart, loopend, minvol, ctrl, handle)) { active = true; handle->preset_volume = maxvol; @@ -108,7 +105,7 @@ if(handle != NULL) { - sndSysMgr->StopSound(handle->GetID()); + SoundSystemManager::GetSingleton().StopSound(handle->GetID()); } } Modified: soc/2011/sound/src/plugins/common/soundmanager/queue.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/queue.cpp 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/queue.cpp 2011-06-28 08:45:33 UTC (rev 7465) @@ -25,7 +25,6 @@ #include "handle.h" #include "manager.h" -extern SoundSystemManager* sndSysMgr; SoundQueueItem::SoundQueueItem(const char* file) { @@ -94,9 +93,8 @@ if(item->handle == NULL) { // item will be played - if(sndSysMgr->Play2DSound(item->filename, false, 0, 0, - volume, sndCtrl, - item->handle)) + if(SoundSystemManager::GetSingleton().Play2DSound(item->filename, false, 0, 0, + volume, sndCtrl, item->handle)) { item->handle->SetAutoRemove(false); } Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-28 08:45:33 UTC (rev 7465) @@ -34,12 +34,7 @@ //==================================================================================== #include "soundmanager.h" -//------------------------------------------------------------------------------------ -// Forward Declarations -//------------------------------------------------------------------------------------ -SoundSystemManager* sndSysMgr; - SCF_IMPLEMENT_FACTORY(SoundManager) Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h 2011-06-28 08:25:10 UTC (rev 7464) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.h 2011-06-28 08:45:33 UTC (rev 7465) @@ -115,6 +115,7 @@ private: bool isSectorLoaded; ///< true if the sectors are loaded csRef<iObjectRegistry> objectReg; ///< object registry + SoundSystemManager* sndSysMgr; ///< the sound system manager used to play sounds SoundControl* mainSndCtrl; ///< soundcontrol of our soundmanager SoundControl* ambientSndCtrl; ///< soundcontrol for ambient sounds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-28 14:05:24
|
Revision: 7468 http://planeshift.svn.sourceforge.net/planeshift/?rev=7468&view=rev Author: whacko88 Date: 2011-06-28 14:05:17 +0000 (Tue, 28 Jun 2011) Log Message: ----------- completed class Instrument (untested) Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-28 10:14:51 UTC (rev 7467) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-28 14:05:17 UTC (rev 7468) @@ -28,7 +28,8 @@ //==================================================================================== // Project Includes //==================================================================================== -// TODO needed? +#include "manager.h" +#include "data.h" //==================================================================================== // Local Includes @@ -40,9 +41,9 @@ //------------------------------------------------------------------------------------ // TODO needed? -Instrument::Instrument() +Instrument::Instrument(uint pol) { - polyphony = 1; + polyphony = pol; format = 0; } @@ -86,18 +87,16 @@ } // computing the number of requested bytes - // #bytes = sample frequency * duration of the notes in seconds * number of bytes per sample - requestedBytes = format->Freq * (duration / 1000.0f) * (format->Bits / 8); + // #bytes = sample frequency * duration of the notes in seconds * + // number of bytes per sample * number of channels + requestedBytes = format->Freq * (duration / 1000.0f) * (format->Bits / 8) * format->Channels; // check if this note is defined - if(notes.Contains(octave)) + note = notes.Get(octave, 0).Get(pitch, 0); + if(note == 0) { - note = notes.Get(octave, 0).Get(pitch, 0); - if(note == 0) - { - length = 0; - return requestedBytes; - } + length = 0; + return requestedBytes; } // selecting the note @@ -135,10 +134,125 @@ return requestedBytes; } -bool Instrument::AddNote(const char* fileName, char note, int alter, uint octave) +bool Instrument::AddNote(const char* fileName, char pitch, int alter, uint octave) { - // TODO - return false; + Note* note; + Note* enharmonicNote; + size_t streamSize; + uint8* buffer; + csRef<iSndSysData> noteData; + csRef<iSndSysStream> noteStream; + + // variables used to get the stream data + void* data1; + void* data2; + size_t length1; + size_t length2; + size_t positionMarker; + + // loading data + if(!SoundSystemManager::GetSingleton().GetSoundData()->LoadSoundFile(fileName, noteData)) + { + return false; + } + + if(!CheckSameFormat(noteData->GetFormat())) + { + return false; + } + + noteStream = noteData->CreateStream(format, CS_SND3D_ABSOLUTE); + noteStream->SetLoopState(CS_SNDSYS_STREAM_DONTLOOP); + streamSize = noteStream->GetFrameCount() * (format->Bits / 8) * format->Channels; + + // getting the note and its eharmonic if necessary + note = notes.Get(octave, 0).Get(pitch, 0); + if(note == 0) + { + note = new Note(); + if(!notes.Contains(octave)) + { + notes.Put(octave, 0); + } + notes[octave]->Put(pitch, note); + } + + if(alter != 0) + { + enharmonicNote = notes.Get(octave, 0).Get(pitch, 0); + if(enharmonicNote == 0) + { + enharmonicNote = new Note(); + if(!notes.Contains(octave)) + { + notes.Put(octave, 0); + } + notes[octave]->Put(pitch, enharmonicNote); + } + } + + // initializing notes' buffer + if(alter == 0) + { + if(note->normal != 0) + { + return false; // the note already exists + } + note->normalLength = streamSize; + note->normal = new uint8[streamSize]; + buffer = note->normal; + } + else if(alter < 0) + { + if(note->flat != 0) + { + return false; + } + note->flatLength = streamSize; + note->flat = new uint8[streamSize]; + buffer = note->flat; + + enharmonicNote->flatLength = streamSize; + enharmonicNote->flat = new uint8[streamSize]; + } + else + { + if(note->sharp != 0) + { + return false; + } + note->sharpLength = streamSize; + note->sharp = new uint8[streamSize]; + buffer = note->sharp; + + enharmonicNote->sharpLength = streamSize; + enharmonicNote->sharp = new uint8[streamSize]; + } + + // reading and copying data + noteStream->ResetPosition(); // the position of the stream is now 0 + positionMarker = 0; + do + { + noteStream->AdvancePosition(streamSize); + noteStream->GetDataPointers(&positionMarker, streamSize, &data1, &length1, &data2, &length2); + + // copying buffer 1 + for(int i = 0; i < length1; i++) + { + (*buffer) = ((uint8*)data1)[i]; + buffer++; + } + + // copying buffer 2 + for(int i = 0; i < length2; i++) + { + (*buffer) = ((uint8*)data2)[i]; + buffer++; + } + }while(noteStream->GetPauseState() == CS_SNDSYS_STREAM_UNPAUSED); + + return true; } bool Instrument::CheckSameFormat(const csSndSysSoundFormat* f) Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-28 10:14:51 UTC (rev 7467) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-28 14:05:17 UTC (rev 7468) @@ -73,17 +73,18 @@ }; /** -* This class represent a general musical instrument. +* This class represent a musical instrument. */ class Instrument { public: /** - * Constructor. Load sounds of the notes of this instrument following the directions - * of the plugin's configuration file. + * Constructor. It sets the polyphony capabilities of this instrument. + * @param polyphony the maximum number of notes that this instrument can + * play at the same time. */ - Instrument(); + Instrument(uint polyphony); /** * Destructor. @@ -103,6 +104,20 @@ virtual const csSndSysSoundFormat* GetFormat() const { return format; } /** + * Add the given note to the sounds that this instruments can play. If the + * given note has already been defined, nothing happens. + * + * @param fileName the file that contain the note's sound. + * @param note a char representing the note in the British English notation + * (i.e. A, B, C, ..., G). + * @param alter > 0 if the note is altered by a sharp, < 0 for a flat and 0 + * if it is not altered. + * @param octave 4 for the central octave in piano. + * @return true if the note could be loaded, false otherwise. + */ + virtual bool AddNote(const char* fileName, char note, int alter, uint octave); + + /** * Provide a buffer containing the decoded data for the given note of this * instrument. If there are no notes loaded, at the end of the method both * the return value and length are 0. @@ -127,27 +142,8 @@ uint polyphony; ///< number of notes that this instrument can play at the same time. csSndSysSoundFormat* format; ///< the format shared by all the notes' streams. csHash<csHash<Note*, char>, uint> notes; ///< the notes' streams. - - /** - * Load sounds of the notes of this instrument following the directions of - * the plugin's configuration file. - */ - virtual void LoadNotes() = 0; /** - * Add the given note to the sounds that this instruments can play. - * - * @param fileName the file that contain the note sound. - * @param note a char representing the note in the British English notation - * (i.e. A, B, C, ..., G). - * @param alter > 0 if the note is altered by a sharp, < 0 for a flat and 0 - * if it is not altered. - * @param octave 4 for the central octave in piano. - * @return true if the note could be loaded, false otherwise. - */ - virtual bool AddNote(const char* fileName, char note, int alter, uint octave); - - /** * Checks if the given format is the same as the format of all the other notes * of this instrument. If there is not already a format for the instrument it * creates one by copying the given one. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-28 17:13:57
|
Revision: 7469 http://planeshift.svn.sourceforge.net/planeshift/?rev=7469&view=rev Author: whacko88 Date: 2011-06-28 17:13:50 +0000 (Tue, 28 Jun 2011) Log Message: ----------- Fixed enharmonic notes in Instrument and added SongExecution skeleton Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h Added Paths: ----------- soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp soc/2011/sound/src/plugins/common/soundmanager/songexec.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-28 14:05:17 UTC (rev 7468) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-28 17:13:50 UTC (rev 7469) @@ -100,20 +100,23 @@ } // selecting the note - if(alter == 0) + switch(alter) { + case 0: buffer = note->normal; length = note->normalLength; - } - else if(alter > 0) - { + break; + case 1: buffer = note->sharp; length = note->sharpLength; - } - else - { + break; + case 2: buffer = note->flat; length = note->flatLength; + break; + default: + length = 0; + return requestedBytes; } // checking length @@ -137,7 +140,6 @@ bool Instrument::AddNote(const char* fileName, char pitch, int alter, uint octave) { Note* note; - Note* enharmonicNote; size_t streamSize; uint8* buffer; csRef<iSndSysData> noteData; @@ -150,6 +152,12 @@ size_t length2; size_t positionMarker; + // checking if parameters are correct + if(!(alter == 0 || alter == 1 || alter == -1)) + { + return false; + } + // loading data if(!SoundSystemManager::GetSingleton().GetSoundData()->LoadSoundFile(fileName, noteData)) { @@ -161,49 +169,27 @@ return false; } + // creating the decoded stream noteStream = noteData->CreateStream(format, CS_SND3D_ABSOLUTE); noteStream->SetLoopState(CS_SNDSYS_STREAM_DONTLOOP); streamSize = noteStream->GetFrameCount() * (format->Bits / 8) * format->Channels; - // getting the note and its eharmonic if necessary - note = notes.Get(octave, 0).Get(pitch, 0); - if(note == 0) - { - note = new Note(); - if(!notes.Contains(octave)) - { - notes.Put(octave, 0); - } - notes[octave]->Put(pitch, note); - } + note = GetNote(pitch, octave); - if(alter != 0) - { - enharmonicNote = notes.Get(octave, 0).Get(pitch, 0); - if(enharmonicNote == 0) - { - enharmonicNote = new Note(); - if(!notes.Contains(octave)) - { - notes.Put(octave, 0); - } - notes[octave]->Put(pitch, enharmonicNote); - } - } - // initializing notes' buffer - if(alter == 0) + switch(alter) { + case 0: if(note->normal != 0) { - return false; // the note already exists + return false; // the note and its enharmonic already exist } note->normalLength = streamSize; note->normal = new uint8[streamSize]; buffer = note->normal; - } - else if(alter < 0) - { + break; + + case -1: if(note->flat != 0) { return false; @@ -211,12 +197,9 @@ note->flatLength = streamSize; note->flat = new uint8[streamSize]; buffer = note->flat; + break; - enharmonicNote->flatLength = streamSize; - enharmonicNote->flat = new uint8[streamSize]; - } - else - { + case 1: if(note->sharp != 0) { return false; @@ -224,11 +207,12 @@ note->sharpLength = streamSize; note->sharp = new uint8[streamSize]; buffer = note->sharp; - - enharmonicNote->sharpLength = streamSize; - enharmonicNote->sharp = new uint8[streamSize]; + break; + // we checked before that alter is right, no need for default } + SetEnharmonic(pitch, alter, octave, buffer, streamSize); + // reading and copying data noteStream->ResetPosition(); // the position of the stream is now 0 positionMarker = 0; @@ -238,14 +222,14 @@ noteStream->GetDataPointers(&positionMarker, streamSize, &data1, &length1, &data2, &length2); // copying buffer 1 - for(int i = 0; i < length1; i++) + for(size_t i = 0; i < length1; i++) { (*buffer) = ((uint8*)data1)[i]; buffer++; } // copying buffer 2 - for(int i = 0; i < length2; i++) + for(size_t i = 0; i < length2; i++) { (*buffer) = ((uint8*)data2)[i]; buffer++; @@ -290,3 +274,137 @@ return true; } +Note* Instrument::GetNote(char pitch, uint octave) +{ + Note* note = notes.Get(octave, 0).Get(pitch, 0); + if(note == 0) + { + note = new Note(); + if(!notes.Contains(octave)) + { + notes.Put(octave, 0); + } + notes[octave]->Put(pitch, note); + } + + return note; +} + +void Instrument::SetEnharmonic(char pitch, int alter, uint octave, uint8* buffer, size_t length) +{ + Note* enharmonicNote; + + switch(alter) + { + case 0: + switch(pitch) + { + case 'E': + enharmonicNote = GetNote('F', octave); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'F': + enharmonicNote = GetNote('E', octave); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + case 'C': + enharmonicNote = GetNote('B', octave - 1); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'B': + enharmonicNote = GetNote('C', octave + 1); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + } + + break; // first switch + + case -1: + switch(pitch) + { + case 'C': + enharmonicNote = GetNote('B', octave - 1); + enharmonicNote->normalLength = length; + enharmonicNote->normal = buffer; + break; + case 'D': + enharmonicNote = GetNote('C', octave); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + case 'E': + enharmonicNote = GetNote('D', octave); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + case 'F': + enharmonicNote = GetNote('E', octave); + enharmonicNote->normalLength = length; + enharmonicNote->normal = buffer; + break; + case 'G': + enharmonicNote = GetNote('F', octave); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + case 'A': + enharmonicNote = GetNote('G', octave); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + case 'B': + enharmonicNote = GetNote('A', octave); + enharmonicNote->sharpLength = length; + enharmonicNote->sharp = buffer; + break; + } + + break; // first switch + + case 1: + switch(pitch) + { + case 'C': + enharmonicNote = GetNote('D', octave); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'D': + enharmonicNote = GetNote('E', octave); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'E': + enharmonicNote = GetNote('F', octave); + enharmonicNote->normalLength = length; + enharmonicNote->normal = buffer; + break; + case 'F': + enharmonicNote = GetNote('G', octave); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'G': + enharmonicNote = GetNote('A', octave); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'A': + enharmonicNote = GetNote('B', octave); + enharmonicNote->flatLength = length; + enharmonicNote->flat = buffer; + break; + case 'B': + enharmonicNote = GetNote('C', octave); + enharmonicNote->normalLength = length; + enharmonicNote->normal = buffer; + break; + } + + break; // first switch + } +} Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-28 14:05:17 UTC (rev 7468) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-28 17:13:50 UTC (rev 7469) @@ -95,13 +95,13 @@ * Gets the number of notes that this instrument can play at the same time. * @return the number of notes that this instrument can play at the same time. */ - virtual uint GetPolyphony() const { return polyphony; } + uint GetPolyphony() const { return polyphony; } /** * Gets the csSndSysSoundFormat of the notes of this instrument. * return the csSndSysSoundFormat. */ - virtual const csSndSysSoundFormat* GetFormat() const { return format; } + const csSndSysSoundFormat* GetFormat() const { return format; } /** * Add the given note to the sounds that this instruments can play. If the @@ -110,12 +110,12 @@ * @param fileName the file that contain the note's sound. * @param note a char representing the note in the British English notation * (i.e. A, B, C, ..., G). - * @param alter > 0 if the note is altered by a sharp, < 0 for a flat and 0 - * if it is not altered. + * @param alter 1 if the note is altered by a sharp, -1 for a flat and 0 if + * it is not altered. * @param octave 4 for the central octave in piano. * @return true if the note could be loaded, false otherwise. */ - virtual bool AddNote(const char* fileName, char note, int alter, uint octave); + bool AddNote(const char* fileName, char note, int alter, uint octave); /** * Provide a buffer containing the decoded data for the given note of this @@ -124,8 +124,8 @@ * * @param note a char representing the note in the British English notation * (i.e. A, B, C, ..., G). - * @param alter > 0 if the note is altered by a sharp, < 0 for a flat and 0 - * if it is not altered. + * @param alter 1 if the note is altered by a sharp, -1 for a flat and 0 if + * it is not altered. * @param octave 4 for the central octave in piano. * @param duration the duration of the note in milliseconds. * @param buffer when the method is done this will contain the decoded data @@ -136,7 +136,7 @@ * can be greater than 0 if the sound in the file used to load the note data * does not last enough. */ - virtual size_t GetNoteBuffer(char note, int alter, uint octave, uint duration, uint8* &buffer, size_t &length); + size_t GetNoteBuffer(char note, int alter, uint octave, uint duration, uint8* &buffer, size_t &length); private: uint polyphony; ///< number of notes that this instrument can play at the same time. @@ -152,7 +152,30 @@ * @return true if the given format is the same as the format of all the other * notes, false otherwise. */ - virtual bool CheckSameFormat(const csSndSysSoundFormat* format); + bool CheckSameFormat(const csSndSysSoundFormat* format); + + /** + * Get the given note in the hash notes. If it is not defined it is created + * and added to the data structure. + * + * @param pitch a char representing the note in the British English notation + * (i.e. A, B, C, ..., G). + * @param octave 4 for the central octave in piano. + * @return the asked note. + */ + Note* GetNote(char pitch, uint octave); + + /** + * Set the buffer of the enharmonic note of the given one. + * + * @param pitch the pitch of the given note. + * @param alter 1 if the given note is altered by a sharp, -1 a flat and 0 + * if it is not altered. + * @param octave the octave of the given note. + * @param buffer the buffer containing the sound data of the note. + * @param length the length of the buffer. + */ + void SetEnharmonic(char pitch, int alter, uint octave, uint8* buffer, size_t length); }; #endif /* INSTRUMENT_H */ Added: soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp 2011-06-28 17:13:50 UTC (rev 7469) @@ -0,0 +1,20 @@ +/* + * songexec.h, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "songexec.h" \ No newline at end of file Property changes on: soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: soc/2011/sound/src/plugins/common/soundmanager/songexec.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songexec.h (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/songexec.h 2011-06-28 17:13:50 UTC (rev 7469) @@ -0,0 +1,63 @@ +/* + * songexec.h, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef INSTRUMENT_H +#define INSTRUMENT_H + +//==================================================================================== +// Crystal Space Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Project Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Local Includes +//==================================================================================== +// TODO needed? + +//------------------------------------------------------------------------------------ +// Forward Declarations +//------------------------------------------------------------------------------------ +class Instrument; +struct iDocumentNode; +struct csSndSysSoundFormat; + +class SongExecution: public SndSysBasicStream +{ +public: + SongExecution(csRef<iDocumentNode> musicalSheet, Instrument* instrument); + virtual ~SongExecution(); + + // From iSndSysStream + virtual const char* GetDescription(); + virtual size_t GetFrameCount(); + virtual void AdvancePosition(size_t frame_delta); + virtual void GetDataPointers(size_t* positionMarker, size_t maxRequestedLength, + void** buffer1, size_t* buffer1Bytes, void** buffer2, size_t* buffer2Bytes); + +private: + csRef<iDocumentNode> sheet; ///< the musical sheet that this song is playing. + Instrument* instrument; ///< the musical instrument that the player uses to play this song. +}; + +#endif /* INSTRUMENT_H */ \ No newline at end of file Property changes on: soc/2011/sound/src/plugins/common/soundmanager/songexec.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-28 23:39:14
|
Revision: 7474 http://planeshift.svn.sourceforge.net/planeshift/?rev=7474&view=rev Author: whacko88 Date: 2011-06-28 23:39:08 +0000 (Tue, 28 Jun 2011) Log Message: ----------- Substituted SongExecution with SndSysSongStream Added SndSysSongData Added Paths: ----------- soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp soc/2011/sound/src/plugins/common/soundmanager/songdata.h soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp soc/2011/sound/src/plugins/common/soundmanager/songstream.h Removed Paths: ------------- soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp soc/2011/sound/src/plugins/common/soundmanager/songexec.h Added: soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp 2011-06-28 23:39:08 UTC (rev 7474) @@ -0,0 +1,110 @@ +/* + * songdata.cpp, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "songdata.h" + +//==================================================================================== +// Crystal Space Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Project Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Local Includes +//==================================================================================== +#include "instrument.h" + +//------------------------------------------------------------------------------------ +// Forward Declarations +//------------------------------------------------------------------------------------ +// TODO needed? + +SndSysSongData::SndSysSongData(csRef<iDocumentNode> musicalSheet, Instrument* instrument) +{ + csRef<iDocumentNode> part; + csRef<iDocumentNodeIterator> measureIter; + + // initializing SongData + songData = new SongData(); + songData->instrument = instrument; + + // reading the musical sheet + if(part = musicalSheet->GetNode("part")) + { + measureIter = part->GetNodes("measure"); + while(measureIter->HasNext()) + { + csRef<iDocumentNode> measure = measureIter->Next(); + + // if it is the first measure read the attributes and direction tags + if(measure->GetAttributeValueAsInt("number") == 1) + { + csRef<iDocumentNode> attributes = measure->GetNode("attributes"); + csRef<iDocumentNode> direction = measure->GetNode("direction"); + + songData->divisions = attributes->GetNode("divisions")->GetContentsValueAsInt(); + songData->fifths = attributes->GetNode("key")->GetNode("fifths")->GetContentsValueAsInt(); + songData->beats = attributes->GetNode("time")->GetNode("beats")->GetContentsValueAsInt(); + songData->beatType = attributes->GetNode("time")->GetNode("beat-type")->GetContentsValueAsInt(); + songData->tempo = direction->GetNode("sound")->GetAttributeValueAsInt("tempo", 90); + } + + songData->measures.Push(measure); + } + } +} + +SndSysSongData::~SndSysSongData() +{ + delete songData; +} + +size_t SndSysSongData::GetDataSize() +{ + return 0; // TODO +} + +size_t SndSysSongData::GetFrameCount() +{ + return 0; // TODO +} + +const char* SndSysSongData::GetDescription() +{ + return 0; // TODO +} + +const csSndSysSoundFormat* SndSysSongData::GetFormat() +{ + return songData->instrument->GetFormat(); +} + +void SndSysSongData::SetDescription(const char* description) +{ + return; // TODO +} + +iSndSysStream* SndSysSongData::CreateStream(csSndSysSoundFormat* renderFormat, int mode3D) +{ + return 0; // TODO +} Property changes on: soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: soc/2011/sound/src/plugins/common/soundmanager/songdata.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.h (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-28 23:39:08 UTC (rev 7474) @@ -0,0 +1,119 @@ +/* + * songdata.h, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef SONGDATA_H +#define SONGDATA_H + +//==================================================================================== +// Crystal Space Includes +//==================================================================================== +#include <cssysdef.h> +#include <csutil/refarr.h> +#include <iutil/document.h> +#include <isndsys/ss_data.h> + +//==================================================================================== +// Project Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Local Includes +//==================================================================================== +// TODO needed? + +//------------------------------------------------------------------------------------ +// Forward Declarations +//------------------------------------------------------------------------------------ +class Instrument; + + +/** + * This struct keeps the data about the instrument and the musical sheet. + */ +struct SongData +{ + Instrument* instrument; ///< the instrument that the player uses to play this song. + uint divisions; ///< number of divisions of the quarter coded in the sheet. + int fifths; ///< > 0 is the number of sharps, < 0 the number of flats. + uint beats; ///< numerator of the time signature. + uint beatType; ///< denumerator of the time signature. + uint tempo; ///< suggested tempo in quarter notes per minute. + csRefArray<iDocumentNode> measures; ///< the measures of the musical sheet. + + /** + * Constructor. Initialize everything to 0. + */ + SongData() + { + instrument = 0; + divisions = 0; + fifths = 0; + beats = 0; + beatType = 0; + tempo = 0; + } + + /** + * Copy constructor. + */ + SongData(SongData* sd): measures(sd->measures) + { + instrument = sd->instrument; + divisions = sd->divisions; + fifths = sd->fifths; + beats = sd->beats; + beatType = sd->beatType; + tempo = sd->tempo; + } +}; + + +/** + * This implements a data class that can be used for the CS sound system to play a song + * from a musical sheet. + */ +class SndSysSongData: public iSndSysData +{ +public: + /** + * Constructor. + * @param musicalSheet the root tag of the xml musicalSheet. + * @param instrument the instrument used to play the song. + */ + SndSysSongData(csRef<iDocumentNode> musicalSheet, Instrument* instrument); + ~SndSysSongData(); + + // From iSndSysData + //------------------ + virtual size_t GetDataSize(); + virtual size_t GetFrameCount(); + virtual const char* GetDescription(); + virtual const csSndSysSoundFormat* GetFormat(); + virtual void SetDescription(const char* description); + + // This function is called by the renderer + virtual iSndSysStream* CreateStream(csSndSysSoundFormat* renderFormat, int mode3D); + +private: + SongData* songData; +}; + +#endif /* SONGDATA_H */ + Property changes on: soc/2011/sound/src/plugins/common/soundmanager/songdata.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Deleted: soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp 2011-06-28 22:14:47 UTC (rev 7473) +++ soc/2011/sound/src/plugins/common/soundmanager/songexec.cpp 2011-06-28 23:39:08 UTC (rev 7474) @@ -1,20 +0,0 @@ -/* - * songexec.h, Author: Andrea Rizzi <88w...@gm...> - * - * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation (version 2 of the License) - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#include "songexec.h" \ No newline at end of file Deleted: soc/2011/sound/src/plugins/common/soundmanager/songexec.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songexec.h 2011-06-28 22:14:47 UTC (rev 7473) +++ soc/2011/sound/src/plugins/common/soundmanager/songexec.h 2011-06-28 23:39:08 UTC (rev 7474) @@ -1,63 +0,0 @@ -/* - * songexec.h, Author: Andrea Rizzi <88w...@gm...> - * - * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation (version 2 of the License) - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef INSTRUMENT_H -#define INSTRUMENT_H - -//==================================================================================== -// Crystal Space Includes -//==================================================================================== -// TODO needed? - -//==================================================================================== -// Project Includes -//==================================================================================== -// TODO needed? - -//==================================================================================== -// Local Includes -//==================================================================================== -// TODO needed? - -//------------------------------------------------------------------------------------ -// Forward Declarations -//------------------------------------------------------------------------------------ -class Instrument; -struct iDocumentNode; -struct csSndSysSoundFormat; - -class SongExecution: public SndSysBasicStream -{ -public: - SongExecution(csRef<iDocumentNode> musicalSheet, Instrument* instrument); - virtual ~SongExecution(); - - // From iSndSysStream - virtual const char* GetDescription(); - virtual size_t GetFrameCount(); - virtual void AdvancePosition(size_t frame_delta); - virtual void GetDataPointers(size_t* positionMarker, size_t maxRequestedLength, - void** buffer1, size_t* buffer1Bytes, void** buffer2, size_t* buffer2Bytes); - -private: - csRef<iDocumentNode> sheet; ///< the musical sheet that this song is playing. - Instrument* instrument; ///< the musical instrument that the player uses to play this song. -}; - -#endif /* INSTRUMENT_H */ \ No newline at end of file Added: soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-28 23:39:08 UTC (rev 7474) @@ -0,0 +1,61 @@ +/* + * songstream.cpp, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#include "songstream.h" + +//==================================================================================== +// Local Includes +//==================================================================================== +#include "songdata.h" + +SndSysSongStream::SndSysSongStream(csRef<SndSysSongData> songData, SongData* data, csSndSysSoundFormat* renderFormat, int mode3D): + SndSysBasicStream(renderFormat, mode3D) +{ + sndData = songData; + song = data; +} + +SndSysSongStream::~SndSysSongStream() +{ + // song->instrument is deleted by InstrumentManager + // song is deleted by SndSysSongData +} + +const char* SndSysSongStream::GetDescription() +{ + // TODO check the SndSysSongData description + return "Song Stream"; +} + +size_t SndSysSongStream::GetFrameCount() +{ + // TODO adapth the data format to this one + return 0; +} + +void SndSysSongStream::AdvancePosition(size_t frame_delta) +{ + // TODO +} + +void SndSysSongStream::GetDataPointers(size_t* positionMarker, size_t maxRequestedLength, + void** buffer1, size_t* buffer1Bytes, void** buffer2, size_t* buffer2Bytes) +{ + // TODO +} Property changes on: soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: soc/2011/sound/src/plugins/common/soundmanager/songstream.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.h (rev 0) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-28 23:39:08 UTC (rev 7474) @@ -0,0 +1,69 @@ +/* + * songstream.h, Author: Andrea Rizzi <88w...@gm...> + * + * Copyright (C) 2001-2011 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef SONGSTREAM_H +#define SONGSTREAM_H + + +//==================================================================================== +// Crystal Space Includes +//==================================================================================== +#include <cssysdef.h> +#include <csutil/ref.h> +#include <csplugincommon/sndsys/sndstream.h> + +//==================================================================================== +// Project Includes +//==================================================================================== +// TODO needed? + +//==================================================================================== +// Local Includes +//==================================================================================== +// TODO needed? + +//------------------------------------------------------------------------------------ +// Forward Declarations +//------------------------------------------------------------------------------------ +class Instrument; +class SndSysSongData; +struct SongData; +struct csSndSysSoundFormat; + +using namespace CS::SndSys; + +class SndSysSongStream: public SndSysBasicStream +{ +public: + SndSysSongStream(csRef<SndSysSongData> songData, SongData* data, csSndSysSoundFormat* renderFormat, int mode3D); + virtual ~SndSysSongStream(); + + // From iSndSysStream + virtual const char* GetDescription(); + virtual size_t GetFrameCount(); + virtual void AdvancePosition(size_t frame_delta); + virtual void GetDataPointers(size_t* positionMarker, size_t maxRequestedLength, + void** buffer1, size_t* buffer1Bytes, void** buffer2, size_t* buffer2Bytes); + +private: + SongData* song; + csRef<SndSysSongData> sndData; +}; + +#endif /* SONGSTREAM_H */ \ No newline at end of file Property changes on: soc/2011/sound/src/plugins/common/soundmanager/songstream.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-29 13:09:08
|
Revision: 7475 http://planeshift.svn.sourceforge.net/planeshift/?rev=7475&view=rev Author: whacko88 Date: 2011-06-29 13:09:02 +0000 (Wed, 29 Jun 2011) Log Message: ----------- Implemented SndSysSongData Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp soc/2011/sound/src/plugins/common/soundmanager/songdata.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-28 23:39:08 UTC (rev 7474) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-29 13:09:02 UTC (rev 7475) @@ -74,7 +74,7 @@ notes.DeleteAll(); } -size_t Instrument::GetNoteBuffer(char pitch, int alter, uint octave, uint duration, uint8* &buffer, size_t &length) +size_t Instrument::GetNoteBuffer(char pitch, int alter, uint octave, float duration, uint8* &buffer, size_t &length) { Note* note; size_t requestedBytes; // the number of bytes that are needed for the given duration @@ -87,9 +87,9 @@ } // computing the number of requested bytes - // #bytes = sample frequency * duration of the notes in seconds * - // number of bytes per sample * number of channels - requestedBytes = format->Freq * (duration / 1000.0f) * (format->Bits / 8) * format->Channels; + // #bytes = sample frequency * duration of the note * + // * number of bytes per sample * number of channels + requestedBytes = format->Freq * duration * (format->Bits / 8) * format->Channels; // check if this note is defined note = notes.Get(octave, 0).Get(pitch, 0); Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-28 23:39:08 UTC (rev 7474) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-29 13:09:02 UTC (rev 7475) @@ -127,7 +127,7 @@ * @param alter 1 if the note is altered by a sharp, -1 for a flat and 0 if * it is not altered. * @param octave 4 for the central octave in piano. - * @param duration the duration of the note in milliseconds. + * @param duration the duration of the note in seconds. * @param buffer when the method is done this will contain the decoded data * for the given note, or a null pointer if the note does not exist. * @param length when the method is done this will contain the length of @@ -136,7 +136,7 @@ * can be greater than 0 if the sound in the file used to load the note data * does not last enough. */ - size_t GetNoteBuffer(char note, int alter, uint octave, uint duration, uint8* &buffer, size_t &length); + size_t GetNoteBuffer(char note, int alter, uint octave, float duration, uint8* &buffer, size_t &length); private: uint polyphony; ///< number of notes that this instrument can play at the same time. Modified: soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp 2011-06-28 23:39:08 UTC (rev 7474) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp 2011-06-29 13:09:02 UTC (rev 7475) @@ -22,7 +22,7 @@ //==================================================================================== // Crystal Space Includes //==================================================================================== -// TODO needed? +#include <isndsys/ss_structs.h> //==================================================================================== // Project Includes @@ -33,6 +33,7 @@ // Local Includes //==================================================================================== #include "instrument.h" +#include "songstream.h" //------------------------------------------------------------------------------------ // Forward Declarations @@ -81,17 +82,23 @@ size_t SndSysSongData::GetDataSize() { - return 0; // TODO + const csSndSysSoundFormat* format = songData->instrument->GetFormat(); + + return GetFrameCount() * (format->Bits / 8) * format->Channels; } size_t SndSysSongData::GetFrameCount() { - return 0; // TODO + float quarterDuration = 60.0f / songData->tempo; + float numberOfQuarter = 4.0f * (songData->beats / songData->beatType) * songData->measures.GetSize(); + size_t numberOfSamples = quarterDuration * numberOfQuarter * songData->instrument->GetFormat()->Freq; + + return numberOfSamples; } const char* SndSysSongData::GetDescription() { - return 0; // TODO + return description.GetData(); } const csSndSysSoundFormat* SndSysSongData::GetFormat() @@ -99,12 +106,13 @@ return songData->instrument->GetFormat(); } -void SndSysSongData::SetDescription(const char* description) +void SndSysSongData::SetDescription(const char* desc) { - return; // TODO + description = desc; } iSndSysStream* SndSysSongData::CreateStream(csSndSysSoundFormat* renderFormat, int mode3D) { - return 0; // TODO + SndSysSongStream* s = new SndSysSongStream(this, songData, renderFormat, mode3D); + return s; } Modified: soc/2011/sound/src/plugins/common/soundmanager/songdata.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-28 23:39:08 UTC (rev 7474) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-29 13:09:02 UTC (rev 7475) @@ -27,6 +27,7 @@ #include <csutil/refarr.h> #include <iutil/document.h> #include <isndsys/ss_data.h> +#include <csutil/csstring.h> //==================================================================================== // Project Includes @@ -69,19 +70,6 @@ beatType = 0; tempo = 0; } - - /** - * Copy constructor. - */ - SongData(SongData* sd): measures(sd->measures) - { - instrument = sd->instrument; - divisions = sd->divisions; - fifths = sd->fifths; - beats = sd->beats; - beatType = sd->beatType; - tempo = sd->tempo; - } }; @@ -102,7 +90,21 @@ // From iSndSysData //------------------ + + /** + * Return the size of the song in bytes. This is just an estimation of the data size + * since the data is generated dinamically by SndSysSongStream depending on the sheet. + * With the current implementation of Instrument the result of this method is revised + * upwards. + */ virtual size_t GetDataSize(); + + /** + * Return the size of the song in frames. This is just an estimation of the data size + * since the data is generated dinamically by SndSysSongStream depending on the sheet. + * With the current implementation of Instrument the result of this method is revised + * upwards. + */ virtual size_t GetFrameCount(); virtual const char* GetDescription(); virtual const csSndSysSoundFormat* GetFormat(); @@ -113,6 +115,7 @@ private: SongData* songData; + csString description; }; #endif /* SONGDATA_H */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-29 21:00:05
|
Revision: 7477 http://planeshift.svn.sourceforge.net/planeshift/?rev=7477&view=rev Author: whacko88 Date: 2011-06-29 20:59:59 +0000 (Wed, 29 Jun 2011) Log Message: ----------- Implemented SndSysSongStream, only the musical sheet parsing is now missing Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp soc/2011/sound/src/plugins/common/soundmanager/songstream.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-29 14:24:17 UTC (rev 7476) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-29 20:59:59 UTC (rev 7477) @@ -213,6 +213,12 @@ SetEnharmonic(pitch, alter, octave, buffer, streamSize); + // updating longestBufferSize + if(longestBufferSize < streamSize) + { + longestBufferSize = streamSize; + } + // reading and copying data noteStream->ResetPosition(); // the position of the stream is now 0 positionMarker = 0; Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-29 14:24:17 UTC (rev 7476) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-29 20:59:59 UTC (rev 7477) @@ -104,6 +104,12 @@ const csSndSysSoundFormat* GetFormat() const { return format; } /** + * Gets the size of the note with the longest buffer. + * @return the size of the note with the longest buffer. + */ + size_t GetLongestNoteSize() const { return longestBufferSize; } + + /** * Add the given note to the sounds that this instruments can play. If the * given note has already been defined, nothing happens. * @@ -140,6 +146,7 @@ private: uint polyphony; ///< number of notes that this instrument can play at the same time. + size_t longestBufferSize; ///< keeps the size of note with the longest buffer. csSndSysSoundFormat* format; ///< the format shared by all the notes' streams. csHash<csHash<Note*, char>, uint> notes; ///< the notes' streams. Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-29 14:24:17 UTC (rev 7476) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-29 20:59:59 UTC (rev 7477) @@ -24,38 +24,184 @@ //==================================================================================== #include "songdata.h" -SndSysSongStream::SndSysSongStream(csRef<SndSysSongData> songData, SongData* data, csSndSysSoundFormat* renderFormat, int mode3D): - SndSysBasicStream(renderFormat, mode3D) + +SndSysSongStream::SndSysSongStream(csRef<SndSysSongData> sndData, SongData* data, csSndSysSoundFormat* renderFormat, int mode3D): + SndSysBasicStream(renderFormat, mode3D), soundData(sndData) { - sndData = songData; - song = data; + isFinished = false; + currentMeasure = 0; + currentNote = 0; + + noteBuffer = new uint8[songData->instrument->GetLongestNoteSize()]; + noteBufferSize = 0; + lastNoteDuration = 0; + + songData = data; + + // conversion variables are set during the first AdvancePosition() because m_OutputFrequency = 0 + conversionFactor = 0; + conversionNeeded = false; + + // TODO create cyclic buffer } SndSysSongStream::~SndSysSongStream() { - // song->instrument is deleted by InstrumentManager - // song is deleted by SndSysSongData + // songData is deleted by SndSysSongData + delete[] noteBuffer; } const char* SndSysSongStream::GetDescription() { - // TODO check the SndSysSongData description - return "Song Stream"; + const char* desc = soundData->GetDescription(); + if(desc == 0) + { + return "Song Stream"; + } + return desc; } size_t SndSysSongStream::GetFrameCount() { - // TODO adapth the data format to this one - return 0; + // Note that the stream's format can be different from + // the data's one. The count must be adjusted according + // to the frequencies + const csSndSysSoundFormat* dataFormat = soundData->GetFormat(); + + uint64 frameCount = soundData->GetFrameCount(); + frameCount *= m_RenderFormat.Freq; + frameCount /= dataFormat->Freq; + + return frameCount; } -void SndSysSongStream::AdvancePosition(size_t frame_delta) +void SndSysSongStream::AdvancePosition(size_t frameDelta) { - // TODO + bool isFinished; + size_t neededBytes; + size_t neededBuffer; + const csSndSysSoundFormat* dataFormat = soundData->GetFormat(); + + // if the stream is in pause or we have already finished to read don't advance + if(m_bPaused || m_bPlaybackReadComplete || frameDelta == 0) + { + return; + } + + // Computing how many bytes we need to fill for this advancement + neededBytes = frameDelta * (m_RenderFormat.Bits / 8) * m_RenderFormat.Channels; + + // If we need more space than is available in the whole cyclic buffer, then we already underbuffered, reduce to just 1 cycle full + if((size_t)neededBytes > m_pCyclicBuffer->GetLength()) + { + needed_bytes=(size_t)(m_pCyclicBuffer->GetLength() & 0x7FFFFFFF); + } + + // Free space in the cyclic buffer if necessary + if ((size_t)needed_bytes > m_pCyclicBuffer->GetFreeBytes()) + { + m_pCyclicBuffer->AdvanceStartValue(neededBytes - (size_t)(m_pCyclicBuffer->GetFreeBytes() & 0x7FFFFFFF)); + } + + // Fill in leftover decoded data if needed + if (m_PreparedDataBufferUsage > 0) + { + neededBytes -= CopyBufferBytes(neededBytes); + } + + // if the end of the sheet has been reached and the prepared buffer + // is empty no more data cab be copied to the cyclic buffer + if(isFinished && m_PreparedDataBufferUsage == 0) + { + if(!m_bLooping) + { + m_bPlaybackReadComplete = true; + neededBytes = 0; // no more data + } + else + { + currentMeasure = 0; + currentNote = 0; + } + } + + // set back m_NewPosition to invalid if the last note has been + // completely copied. Needed for PendingSeek() to work. + if(m_PreparedDataBufferUsage == 0 && m_NewPosition != InvalidPosition) + { + m_NewPosition = InvalidPosition; + } + + while(neededBytes > 0) + { + // Handle a frequency change + if (m_NewOutputFrequency != m_OutputFrequency) + { + m_OutputFrequency = m_NewOutputFrequency; + + // Create the pcm sample converter if it's not yet created + if (m_pPCMConverter == 0) + { + m_pPCMConverter = new PCMSampleConverter(dataFormat->Channels, dataFormat->Bits, dataFormat->Freq); + } + + // check if the conversion is needed + if((dataFormat->Bits == m_RenderFormat.Bits) && + (dataFormat->Channels == m_RenderFormat.Channels) && + (dataFormat->Freq == m_RenderFormat.Freq)) + { + conversionFactor = 1; + conversionNeeded = false; + } + else + { + conversionFactor = m_pPCMConverter->GetRequiredOutputBufferMultiple(m_RenderFormat.Channels,m_RenderFormat.Bits,m_OutputFrequency)/1024; + conversionNeeded = true; + } + } + + // converting the musical sheet + isFinished = GetNextChord(); + + // expanding m_pPreparedDataBuffer if needed (it's empty at this point so it can be deleted) + neededBuffer = conversionFactor * (lastNoteDuration + (dataFormat->Bits / 8) * dataFormat->Channels); + if(m_PreparedDataBufferSize < neededBuffer) + { + delete[] m_pPreparedDataBuffer; + m_pPreparedDataBuffer = new char[neededBuffer]; + m_PreparedDataBufferSize=neededBuffer; + } + + // copying to m_pPreparedDataBuffer + CopyNoteIntoBuffer(); + + // copying to the cyclic buffer + if(m_PreparedDataBufferUsage > 0) + { + neededBytes -= CopyBufferBytes(neededBytes); + } + } } -void SndSysSongStream::GetDataPointers(size_t* positionMarker, size_t maxRequestedLength, - void** buffer1, size_t* buffer1Bytes, void** buffer2, size_t* buffer2Bytes) +bool SndSysSongStream::ResetPosition() { + currentMeasure = 0; + currentNote = 0; + + // this will be set to invalid in AdvancePosition() + // it's need for PendingSeek() to work + m_NewPosition = 0; + + return true; +} + +bool SndSysSongStream::GetNextChord() +{ + // TODO support loop notes + return true; +} + +void SndSysSongStream::CopyNoteIntoBuffer() +{ // TODO } Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-29 14:24:17 UTC (rev 7476) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-29 20:59:59 UTC (rev 7477) @@ -51,19 +51,52 @@ class SndSysSongStream: public SndSysBasicStream { public: - SndSysSongStream(csRef<SndSysSongData> songData, SongData* data, csSndSysSoundFormat* renderFormat, int mode3D); + SndSysSongStream(csRef<SndSysSongData> soundData, SongData* songData, csSndSysSoundFormat* renderFormat, int mode3D); virtual ~SndSysSongStream(); // From iSndSysStream + //-------------------- + virtual void AdvancePosition(size_t frameDelta); virtual const char* GetDescription(); virtual size_t GetFrameCount(); - virtual void AdvancePosition(size_t frame_delta); - virtual void GetDataPointers(size_t* positionMarker, size_t maxRequestedLength, - void** buffer1, size_t* buffer1Bytes, void** buffer2, size_t* buffer2Bytes); + // SndSysBasicStream overriding + //------------------------------ + virtual bool AlwaysStream() const { return true; } + virtual bool ResetPosition(); + virtual bool SetPosition(size_t newPosition) { return false; } // not supported + virtual bool SetLoopBoundaries(size_t &startPosition, size_t &endPosition) { return false; } // not supported + private: - SongData* song; - csRef<SndSysSongData> sndData; + bool isFinished; ///< true if it has been reach the end of the musical sheet. + size_t currentMeasure; ///< keeps track of the current measure of the musical sheet. + size_t currentNote; ///< keeps track of the current note in the current measure. + + uint8* noteBuffer; ///< temporary buffer used to get the note from the instrument. + size_t noteBufferSize; ///< current size of noteBuffer in bytes. + size_t lastNoteDuration; ///< duration of the last chord read by GetNextChord() in bytes. + + SongData* songData; ///< the song's data. + csRef<SndSysSongData> soundData; ///< the sound data object. + + int conversionFactor; ///< the multiplier used to get the data size from the data's format to the stream's one. + bool conversionNeeded; ///< true if the data from the instrument must be converted into the stream's format. + + /** + * Fills noteBuffer with the next chord of the song if it is not finished yet. + * Updates noteBuffer, noteBufferSize, lastDuration, currentMeasure and + * currentNote. + * + * @return true if the noteBuffer has been filled, false if the song is ended. + */ + bool GetNextChord(); + + /** + * Copies the note in noteBuffer into m_pPreparedDataBuffer and add 0 at its + * end if lastNoteDuration > noteBufferSize. This method assumes that the + * prepared data buffer is already large enough. + */ + void CopyNoteIntoBuffer(); }; #endif /* SONGSTREAM_H */ \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-29 21:27:07
|
Revision: 7478 http://planeshift.svn.sourceforge.net/planeshift/?rev=7478&view=rev Author: whacko88 Date: 2011-06-29 21:27:00 +0000 (Wed, 29 Jun 2011) Log Message: ----------- Added copy buffer method to SndSysSongStream Fixed compilation error Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp soc/2011/sound/src/plugins/common/soundmanager/songstream.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-29 20:59:59 UTC (rev 7477) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-29 21:27:00 UTC (rev 7478) @@ -74,7 +74,7 @@ notes.DeleteAll(); } -size_t Instrument::GetNoteBuffer(char pitch, int alter, uint octave, float duration, uint8* &buffer, size_t &length) +size_t Instrument::GetNoteBuffer(char pitch, int alter, uint octave, float duration, char* &buffer, size_t &length) { Note* note; size_t requestedBytes; // the number of bytes that are needed for the given duration @@ -141,7 +141,7 @@ { Note* note; size_t streamSize; - uint8* buffer; + char* buffer; csRef<iSndSysData> noteData; csRef<iSndSysStream> noteStream; @@ -185,7 +185,7 @@ return false; // the note and its enharmonic already exist } note->normalLength = streamSize; - note->normal = new uint8[streamSize]; + note->normal = new char[streamSize]; buffer = note->normal; break; @@ -195,7 +195,7 @@ return false; } note->flatLength = streamSize; - note->flat = new uint8[streamSize]; + note->flat = new char[streamSize]; buffer = note->flat; break; @@ -205,7 +205,7 @@ return false; } note->sharpLength = streamSize; - note->sharp = new uint8[streamSize]; + note->sharp = new char[streamSize]; buffer = note->sharp; break; // we checked before that alter is right, no need for default @@ -230,14 +230,14 @@ // copying buffer 1 for(size_t i = 0; i < length1; i++) { - (*buffer) = ((uint8*)data1)[i]; + (*buffer) = ((char*)data1)[i]; buffer++; } // copying buffer 2 for(size_t i = 0; i < length2; i++) { - (*buffer) = ((uint8*)data2)[i]; + (*buffer) = ((char*)data2)[i]; buffer++; } }while(noteStream->GetPauseState() == CS_SNDSYS_STREAM_UNPAUSED); @@ -296,7 +296,7 @@ return note; } -void Instrument::SetEnharmonic(char pitch, int alter, uint octave, uint8* buffer, size_t length) +void Instrument::SetEnharmonic(char pitch, int alter, uint octave, char* buffer, size_t length) { Note* enharmonicNote; Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-29 20:59:59 UTC (rev 7477) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-29 21:27:00 UTC (rev 7478) @@ -49,9 +49,9 @@ */ struct Note { - uint8* normal; ///< the buffer of the unaltered note. - uint8* sharp; ///< the buffer of the sharp note. - uint8* flat; ///< the buffer of the flat note. + char* normal; ///< the buffer of the unaltered note. + char* sharp; ///< the buffer of the sharp note. + char* flat; ///< the buffer of the flat note. size_t normalLength; ///< the length of the buffer of the unaltered note. size_t sharpLength; ///< the length of the buffer of the sharp note. @@ -142,7 +142,7 @@ * can be greater than 0 if the sound in the file used to load the note data * does not last enough. */ - size_t GetNoteBuffer(char note, int alter, uint octave, float duration, uint8* &buffer, size_t &length); + size_t GetNoteBuffer(char note, int alter, uint octave, float duration, char* &buffer, size_t &length); private: uint polyphony; ///< number of notes that this instrument can play at the same time. @@ -182,7 +182,7 @@ * @param buffer the buffer containing the sound data of the note. * @param length the length of the buffer. */ - void SetEnharmonic(char pitch, int alter, uint octave, uint8* buffer, size_t length); + void SetEnharmonic(char pitch, int alter, uint octave, char* buffer, size_t length); }; #endif /* INSTRUMENT_H */ Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-29 20:59:59 UTC (rev 7477) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-29 21:27:00 UTC (rev 7478) @@ -23,6 +23,7 @@ // Local Includes //==================================================================================== #include "songdata.h" +#include "instrument.h" SndSysSongStream::SndSysSongStream(csRef<SndSysSongData> sndData, SongData* data, csSndSysSoundFormat* renderFormat, int mode3D): @@ -32,9 +33,9 @@ currentMeasure = 0; currentNote = 0; - noteBuffer = new uint8[songData->instrument->GetLongestNoteSize()]; + noteBuffer = new char[songData->instrument->GetLongestNoteSize()]; noteBufferSize = 0; - lastNoteDuration = 0; + lastNoteSize = 0; songData = data; @@ -77,7 +78,6 @@ void SndSysSongStream::AdvancePosition(size_t frameDelta) { - bool isFinished; size_t neededBytes; size_t neededBuffer; const csSndSysSoundFormat* dataFormat = soundData->GetFormat(); @@ -94,11 +94,11 @@ // If we need more space than is available in the whole cyclic buffer, then we already underbuffered, reduce to just 1 cycle full if((size_t)neededBytes > m_pCyclicBuffer->GetLength()) { - needed_bytes=(size_t)(m_pCyclicBuffer->GetLength() & 0x7FFFFFFF); + neededBytes=(size_t)(m_pCyclicBuffer->GetLength() & 0x7FFFFFFF); } // Free space in the cyclic buffer if necessary - if ((size_t)needed_bytes > m_pCyclicBuffer->GetFreeBytes()) + if ((size_t)neededBytes > m_pCyclicBuffer->GetFreeBytes()) { m_pCyclicBuffer->AdvanceStartValue(neededBytes - (size_t)(m_pCyclicBuffer->GetFreeBytes() & 0x7FFFFFFF)); } @@ -164,7 +164,7 @@ isFinished = GetNextChord(); // expanding m_pPreparedDataBuffer if needed (it's empty at this point so it can be deleted) - neededBuffer = conversionFactor * (lastNoteDuration + (dataFormat->Bits / 8) * dataFormat->Channels); + neededBuffer = conversionFactor * (lastNoteSize + (dataFormat->Bits / 8) * dataFormat->Channels); if(m_PreparedDataBufferSize < neededBuffer) { delete[] m_pPreparedDataBuffer; @@ -197,11 +197,31 @@ bool SndSysSongStream::GetNextChord() { - // TODO support loop notes + // TODO support loop notes (like organ, the sound can be persisent and does not end into silence) return true; } void SndSysSongStream::CopyNoteIntoBuffer() { - // TODO + // copying noteBuffer into preparedDataBuffer + if(!conversionNeeded) + { + memcpy(m_pPreparedDataBuffer, noteBuffer, noteBufferSize); + m_PreparedDataBufferUsage = noteBufferSize; + } + else + { + m_PreparedDataBufferUsage = m_pPCMConverter->ConvertBuffer(noteBuffer, noteBufferSize, + m_pPreparedDataBuffer, m_RenderFormat.Channels, m_RenderFormat.Bits, m_OutputFrequency); + } + + // adding silence if needed + // TODO support loop notes (like organ, the sound can be persisent and does not end into silence) + if(lastNoteSize > noteBufferSize) + { + for(size_t i = noteBufferSize; i < lastNoteSize; i++) + { + m_pPreparedDataBuffer[i] = 0; + } + } } Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-29 20:59:59 UTC (rev 7477) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-29 21:27:00 UTC (rev 7478) @@ -72,9 +72,9 @@ size_t currentMeasure; ///< keeps track of the current measure of the musical sheet. size_t currentNote; ///< keeps track of the current note in the current measure. - uint8* noteBuffer; ///< temporary buffer used to get the note from the instrument. + char* noteBuffer; ///< temporary buffer used to get the note from the instrument. size_t noteBufferSize; ///< current size of noteBuffer in bytes. - size_t lastNoteDuration; ///< duration of the last chord read by GetNextChord() in bytes. + size_t lastNoteSize; ///< duration of the last chord read by GetNextChord() in bytes. SongData* songData; ///< the song's data. csRef<SndSysSongData> soundData; ///< the sound data object. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-30 07:56:18
|
Revision: 7479 http://planeshift.svn.sourceforge.net/planeshift/?rev=7479&view=rev Author: whacko88 Date: 2011-06-30 07:56:11 +0000 (Thu, 30 Jun 2011) Log Message: ----------- Implemented parser in SndSysSongStream Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp soc/2011/sound/src/plugins/common/soundmanager/instrument.h soc/2011/sound/src/plugins/common/soundmanager/songdata.h soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp soc/2011/sound/src/plugins/common/soundmanager/songstream.h Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-29 21:27:00 UTC (rev 7478) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.cpp 2011-06-30 07:56:11 UTC (rev 7479) @@ -110,7 +110,7 @@ buffer = note->sharp; length = note->sharpLength; break; - case 2: + case -1: buffer = note->flat; length = note->flatLength; break; @@ -137,6 +137,57 @@ return requestedBytes; } +void Instrument::AddNoteToChord(char pitch, int alter, uint octave, char* buffer, size_t bufferLength) +{ + Note* note; + char* noteBuffer; + size_t noteLength; + + // check if notes have been loaded + if(format == 0) + { + return; + } + + // check if this note is defined + note = notes.Get(octave, 0).Get(pitch, 0); + if(note == 0) + { + return; + } + + // selecting the note + switch(alter) + { + case 0: + noteBuffer = note->normal; + noteLength = note->normalLength; + break; + case 1: + noteBuffer = note->sharp; + noteLength = note->sharpLength; + break; + case -1: + noteBuffer = note->flat; + noteLength = note->flatLength; + break; + default: + return; + } + + // adjust the copy size on the given note length + if(bufferLength > noteLength) + { + bufferLength = noteLength; + } + + // adding data + for(size_t i = 0; i < bufferLength; i++) + { + buffer[i] += noteBuffer[i]; + } +} + bool Instrument::AddNote(const char* fileName, char pitch, int alter, uint octave) { Note* note; Modified: soc/2011/sound/src/plugins/common/soundmanager/instrument.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-29 21:27:00 UTC (rev 7478) +++ soc/2011/sound/src/plugins/common/soundmanager/instrument.h 2011-06-30 07:56:11 UTC (rev 7479) @@ -126,7 +126,10 @@ /** * Provide a buffer containing the decoded data for the given note of this * instrument. If there are no notes loaded, at the end of the method both - * the return value and length are 0. + * the return value and length are 0. DO NOT MODIFY THE OBTAINED BUFFER + * because the data is not copied to save time and modifying it would damage + * the instrument's data. If you must modify it, copy it first and work on + * the copy. * * @param note a char representing the note in the British English notation * (i.e. A, B, C, ..., G). @@ -144,6 +147,19 @@ */ size_t GetNoteBuffer(char note, int alter, uint octave, float duration, char* &buffer, size_t &length); + /** + * Add a note to an already existing buffer. + * + * @param note a char representing the note in the British English notation + * (i.e. A, B, C, ..., G). + * @param alter 1 if the note is altered by a sharp, -1 for a flat and 0 if + * it is not altered. + * @param octave 4 for the central octave in piano. + * @param buffer the buffer where the note is added for the given length. + * @param length the length of the buffer where the data must be added. + */ + void AddNoteToChord(char note, int alter, uint octave, char* buffer, size_t bufferLength); + private: uint polyphony; ///< number of notes that this instrument can play at the same time. size_t longestBufferSize; ///< keeps the size of note with the longest buffer. Modified: soc/2011/sound/src/plugins/common/soundmanager/songdata.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-29 21:27:00 UTC (rev 7478) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-30 07:56:11 UTC (rev 7479) @@ -94,16 +94,14 @@ /** * Return the size of the song in bytes. This is just an estimation of the data size * since the data is generated dinamically by SndSysSongStream depending on the sheet. - * With the current implementation of Instrument the result of this method is revised - * upwards. + * For example this does not take into account repeats. */ virtual size_t GetDataSize(); /** * Return the size of the song in frames. This is just an estimation of the data size * since the data is generated dinamically by SndSysSongStream depending on the sheet. - * With the current implementation of Instrument the result of this method is revised - * upwards. + * For example this does not take into account repeats. */ virtual size_t GetFrameCount(); virtual const char* GetDescription(); Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-29 21:27:00 UTC (rev 7478) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-30 07:56:11 UTC (rev 7479) @@ -33,11 +33,24 @@ currentMeasure = 0; currentNote = 0; - noteBuffer = new char[songData->instrument->GetLongestNoteSize()]; + lastRepeatStart = 0; + lastRepeatEnd = 0; + repeatCounter = -1; + + noteBuffer = 0; + if(data->instrument->GetPolyphony() > 1) + { + copyNoteBuffer = new char[songData->instrument->GetLongestNoteSize()]; + } + else + { + copyNoteBuffer = 0; + } noteBufferSize = 0; lastNoteSize = 0; songData = data; + timePerDivision = 60 / songData->tempo / songData->divisions; // conversion variables are set during the first AdvancePosition() because m_OutputFrequency = 0 conversionFactor = 0; @@ -49,7 +62,11 @@ SndSysSongStream::~SndSysSongStream() { // songData is deleted by SndSysSongData - delete[] noteBuffer; + // noteBuffer SHOULD BE NEVER ALLOCATED + if(copyNoteBuffer != 0) + { + delete[] copyNoteBuffer; + } } const char* SndSysSongStream::GetDescription() @@ -64,16 +81,7 @@ size_t SndSysSongStream::GetFrameCount() { - // Note that the stream's format can be different from - // the data's one. The count must be adjusted according - // to the frequencies - const csSndSysSoundFormat* dataFormat = soundData->GetFormat(); - - uint64 frameCount = soundData->GetFrameCount(); - frameCount *= m_RenderFormat.Freq; - frameCount /= dataFormat->Freq; - - return frameCount; + return CS_SNDSYS_STREAM_UNKNOWN_LENGTH; } void SndSysSongStream::AdvancePosition(size_t frameDelta) @@ -108,21 +116,9 @@ { neededBytes -= CopyBufferBytes(neededBytes); } - - // if the end of the sheet has been reached and the prepared buffer - // is empty no more data cab be copied to the cyclic buffer - if(isFinished && m_PreparedDataBufferUsage == 0) + if(CheckPlaybackReadComplete()) { - if(!m_bLooping) - { - m_bPlaybackReadComplete = true; - neededBytes = 0; // no more data - } - else - { - currentMeasure = 0; - currentNote = 0; - } + neededBytes = 0; // no more data } // set back m_NewPosition to invalid if the last note has been @@ -180,6 +176,10 @@ { neededBytes -= CopyBufferBytes(neededBytes); } + if(CheckPlaybackReadComplete()) + { + neededBytes = 0; // no more data + } } } @@ -195,10 +195,178 @@ return true; } +bool SndSysSongStream::CheckPlaybackReadComplete() +{ + // if the end of the sheet has been reached and the prepared buffer + // is empty no more data can be copied to the cyclic buffer + if(isFinished && m_PreparedDataBufferUsage == 0) + { + if(!m_bLooping) + { + m_bPlaybackReadComplete = true; + } + else + { + currentMeasure = 0; + currentNote = 0; + } + } + + return m_bPlaybackReadComplete; +} bool SndSysSongStream::GetNextChord() { - // TODO support loop notes (like organ, the sound can be persisent and does not end into silence) - return true; + bool notesLeft = false; + + char step; + int alter; + uint octave; + uint divisions; + float duration; + csRef<iDocumentNode> measure; + csRef<iDocumentNode> barline; + csRef<iDocumentNode> note; + csRef<iDocumentNode> pitch; + csRef<iDocumentNodeIterator> notes; + + measure = songData->measures.Get(currentMeasure); + barline = measure->GetNode("barline"); + notes = measure->GetNodes("note"); + + // checking if this measure is the beginning of a repeat or an ending to skip + if(barline.IsValid()) + { + csRef<iDocumentNode> repeat = barline->GetNode("repeat"); + if(csStrCaseCmp(repeat->GetAttributeValue("direction"), "forward")) + { + lastRepeatStart = currentMeasure; + } + else if(currentNote == 0) // repeat has direction backward + { + csRef<iDocumentNode> ending = barline->GetNode("ending"); + if(ending.IsValid() && repeatCounter == 0) + { + // skip the measure + if(currentMeasure + 1 < songData->measures.GetSize()) + { + currentMeasure++; + return false; + } + else + { + currentNote = 0; + currentMeasure = 0; + return true; // end reached + } + } + } + } + + // getting the right note + while(notes->HasNext()) + { + if(notes->GetNextPosition() == currentNote) + { + note = notes->Next(); + break; + } + notes->Next(); + } + + // getting note's data + pitch = note->GetNode("pitch"); + step = *(pitch->GetNode("step")->GetContentsValue()); + alter = pitch->GetNode("alter")->GetContentsValueAsInt(); + octave = pitch->GetNode("octave")->GetContentsValueAsInt(); + divisions = note->GetNode("duration")->GetContentsValueAsInt(); + + // computing note duration in seconds + duration = timePerDivision * divisions; + + // getting first note buffer and length + lastNoteSize = songData->instrument->GetNoteBuffer(step, alter, octave, duration, noteBuffer, noteBufferSize); + lastNoteSize += noteBufferSize; + + // handling chords + if(songData->instrument->GetPolyphony() > 1) + { + bool chordFound = true; + + while(notes->HasNext()) + { + note = notes->Next(); + if(note->GetNode("chord") == 0) + { + notesLeft = true; + break; + } + + // copying buffer if needed + // remember that noteBuffer can't be modified, otherwise the instrument's data will be damaged + if(!chordFound) + { + memcpy(copyNoteBuffer, noteBuffer, noteBufferSize); + } + + // getting data of the new note + pitch = note->GetNode("pitch"); + step = *(pitch->GetNode("step")->GetContentsValue()); + alter = pitch->GetNode("alter")->GetContentsValueAsInt(); + octave = pitch->GetNode("octave")->GetContentsValueAsInt(); + songData->instrument->AddNoteToChord(step, alter, octave, copyNoteBuffer, noteBufferSize); + } + + // fixing noteBuffer if a chord has been found + if(chordFound) + { + noteBuffer = copyNoteBuffer; + } + } + + // is this the end of the measure? + if(notesLeft) + { + currentNote++; + return false; + } + + // here it's the end of the musical sheet + // checking if this measure is the end of a repeat + if(barline.IsValid()) + { + csRef<iDocumentNode> repeat = barline->GetNode("repeat"); + + if(repeat.IsValid() && csStrCaseCmp(repeat->GetAttributeValue("direction"), "backward") == 0) + { + if(repeatCounter < 0) // no repeats active + { + repeatCounter = repeat->GetAttributeValueAsInt("times"); + } + + repeatCounter--; // if it's 0 it becomes -1 and don't repeat + + if(repeatCounter >= 0) // bring the position back + { + currentMeasure = lastRepeatStart; + currentNote = 0; + return false; + } + } + } + + // end of sheet, no repeats + if(currentMeasure + 1 < songData->measures.GetSize()) + { + currentNote = 0; + currentMeasure++; + return false; + } + else + { + currentNote = 0; + currentMeasure = 0; + return true; // end reached + } } void SndSysSongStream::CopyNoteIntoBuffer() Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-29 21:27:00 UTC (rev 7478) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.h 2011-06-30 07:56:11 UTC (rev 7479) @@ -72,17 +72,38 @@ size_t currentMeasure; ///< keeps track of the current measure of the musical sheet. size_t currentNote; ///< keeps track of the current note in the current measure. - char* noteBuffer; ///< temporary buffer used to get the note from the instrument. + size_t lastRepeatStart; ///< keeps track of where the repeat start. + size_t lastRepeatEnd; ///< keeps track of where the repeat end. + int repeatCounter; ///< how many times the repeat must be execute again. -1 means no repeats active, 0 means no more repeats. + + /** + * Temporary buffer used to get the notes from the instrument. + * THIS BUFFER SHOULD NEVER BE ALLOCATED AND ITS CONTENTS SHOULD NEVER BE MODIFIED DIRECTLY. + * It just "jumps" from a instrument's note buffer to another and modifying it would damage + * the instrument's data. If you need to modify its content, copy it first into copyNoteBuffer + * and modify this one instead. + */ + char* noteBuffer; + char* copyNoteBuffer; ///< temporary buffer used for copying purposes. Allocated only if the instrument support polyphony. size_t noteBufferSize; ///< current size of noteBuffer in bytes. size_t lastNoteSize; ///< duration of the last chord read by GetNextChord() in bytes. SongData* songData; ///< the song's data. + float timePerDivision; ///< the time per divisionin seconds of this song. csRef<SndSysSongData> soundData; ///< the sound data object. int conversionFactor; ///< the multiplier used to get the data size from the data's format to the stream's one. bool conversionNeeded; ///< true if the data from the instrument must be converted into the stream's format. /** + * Check if m_bPlaybackReadComplete must be set to true and if it must it does + * it. This function should be called everytime CopyBufferBytes() is used. + * + * @return the new value of m_bPlaybackReadComplete. + */ + bool CheckPlaybackReadComplete(); + + /** * Fills noteBuffer with the next chord of the song if it is not finished yet. * Updates noteBuffer, noteBufferSize, lastDuration, currentMeasure and * currentNote. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2011-06-30 09:33:24
|
Revision: 7480 http://planeshift.svn.sourceforge.net/planeshift/?rev=7480&view=rev Author: whacko88 Date: 2011-06-30 09:33:17 +0000 (Thu, 30 Jun 2011) Log Message: ----------- Added support to play different types of SoundHandle Modified Paths: -------------- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp soc/2011/sound/src/plugins/common/soundmanager/handle.h soc/2011/sound/src/plugins/common/soundmanager/manager.cpp soc/2011/sound/src/plugins/common/soundmanager/manager.h soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp soc/2011/sound/src/plugins/common/soundmanager/songdata.h soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -34,16 +34,15 @@ * volumes, fading parameters */ -SoundHandle::SoundHandle(SoundSystemManager* manager, uint identifier) +SoundHandle::SoundHandle() : scfImplementationType(this) { - id = identifier; + id = 0; // this parameter makes sense only for SoundSystemManager fade = 0; fade_stop = false; hasCallback = false; - this->manager = manager; autoremove = true; delayActive = false; @@ -69,17 +68,17 @@ */ if(sndstream != NULL) { - manager->GetSoundSystem()->RemoveStream(sndstream); + SoundSystemManager::GetSingleton().GetSoundSystem()->RemoveStream(sndstream); } if(sndsource != NULL) { - manager->GetSoundSystem()->RemoveSource(sndsource); + SoundSystemManager::GetSingleton().GetSoundSystem()->RemoveSource(sndsource); } if(delayActive) { - manager->eventTimer->RemoveTimerEvent(this); + SoundSystemManager::GetSingleton().eventTimer->RemoveTimerEvent(this); } } @@ -98,18 +97,18 @@ { csRef<iSndSysData> snddata; - if(!manager->GetSoundData()->LoadSoundFile(resname, snddata)) + if(!SoundSystemManager::GetSingleton().GetSoundData()->LoadSoundFile(resname, snddata)) { return false; } - if(!manager->GetSoundSystem()->CreateStream(snddata, loop, type, sndstream)) + if(!SoundSystemManager::GetSingleton().GetSoundSystem()->CreateStream(snddata, loop, type, sndstream)) { - manager->GetSoundData()->UnloadSoundFile(resname); + SoundSystemManager::GetSingleton().GetSoundData()->UnloadSoundFile(resname); return false; } - manager->GetSoundSystem()->CreateSource(sndstream, sndsource); + SoundSystemManager::GetSingleton().GetSoundSystem()->CreateSource(sndstream, sndsource); preset_volume = volume_preset; sndCtrl = ctrl; name = csString(resname); @@ -121,7 +120,7 @@ bool SoundHandle::Perform(iTimerEvent* /*ev*/) { - manager->eventTimer->RemoveTimerEvent(this); + SoundSystemManager::GetSingleton().eventTimer->RemoveTimerEvent(this); delayActive = false; if(sndstream.IsValid()) @@ -178,13 +177,13 @@ void SoundHandle::ConvertTo3D(float mindist, float maxdist, csVector3 pos, csVector3 dir, float rad) { - manager->GetSoundSystem()->Create3dSource(sndsource, sndsource3d, mindist, maxdist, + SoundSystemManager::GetSingleton().GetSoundSystem()->Create3dSource(sndsource, sndsource3d, mindist, maxdist, pos); /* create a directional source if rad > 0 */ if(rad > 0) { - manager->GetSoundSystem()->CreateDirectional3dSource(sndsource3d, sndsourcedir, + SoundSystemManager::GetSingleton().GetSoundSystem()->CreateDirectional3dSource(sndsource3d, sndsourcedir, dir, rad); } } @@ -204,11 +203,6 @@ return dopplerEffect; } -uint SoundHandle::GetID() -{ - return id; -} - csVector3 SoundHandle::GetSourcePosition() { return sndsource3d->GetPosition(); @@ -233,7 +227,7 @@ else { delayActive = true; - manager->eventTimer->AddTimerEvent(this, delay); + SoundSystemManager::GetSingleton().eventTimer->AddTimerEvent(this, delay); } } Modified: soc/2011/sound/src/plugins/common/soundmanager/handle.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/handle.h 2011-06-30 09:33:17 UTC (rev 7480) @@ -52,7 +52,7 @@ csRef<iSndSysSource3D> sndsource3d; ///< sndsource if 3D csRef<iSndSysSource3DDirectionalSimple> sndsourcedir; ///< additional source if 3D and directional - SoundHandle(SoundSystemManager*, uint id); ///< constructor + SoundHandle(); ///< constructor ~SoundHandle(); ///< destructor /** @@ -62,6 +62,7 @@ * @param direction FADE_DOWN / FADE_UP or FADE_STOP */ void Fade(float volume, int time, int direction); + /** * Initialize this Handle. * Done within this because its not failsave. Returns true or false. @@ -72,7 +73,7 @@ * @param ctrl SoundControl which controls this Handle * @param dopplerEffect true to apply the doppler effect to this sound, false otherwise. */ - bool Init(const char* resname, bool loop, + virtual bool Init(const char* resname, bool loop, float volume_preset, int type, SoundControl* &ctrl, bool dopplerEffect); @@ -111,9 +112,15 @@ * Gets the ID of this handle. * @return the ID of this handle. */ - uint GetID(); + uint GetID() const { return id; } /** + * Sets the ID of this handle. + * @param id the new ID of this handle. + */ + void SetID(uint identifier) { id = identifier; } + + /** * Gets the position of the source. * @note: always call SoundHandle::Is3D() before calling this method. * @@ -153,7 +160,6 @@ private: uint id; ///< id of this handle - SoundSystemManager* manager; ///< sound system manager bool hasCallback; ///< true of theres a callback set, false of not void (*callbackobject); ///< pointer to the callback object void (*callbackfunction) (void *); ///< pointer to the callback function Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -140,7 +140,7 @@ Play2DSound(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, SoundControl* &sndCtrl, SoundHandle* &handle) { - CreateSoundHandle(name, loop, loopstart, loopend, volume_preset, CS_SND3D_DISABLE, sndCtrl, handle, false); + InitSoundHandle(name, loop, loopstart, loopend, volume_preset, CS_SND3D_DISABLE, sndCtrl, handle, false); if(handle == 0) { @@ -166,7 +166,7 @@ csVector3 dir, float mindist, float maxdist, float rad, int type3d, SoundHandle* &handle, bool dopplerEffect) { - CreateSoundHandle(name, loop, loopstart, loopend, volume_preset, type3d, sndCtrl, handle, dopplerEffect); + InitSoundHandle(name, loop, loopstart, loopend, volume_preset, type3d, sndCtrl, handle, dopplerEffect); if(handle == 0) { @@ -409,11 +409,10 @@ } void SoundSystemManager:: -CreateSoundHandle(const char* name, bool loop, size_t loopstart, size_t loopend, +InitSoundHandle(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, int type3d, SoundControl* &sndCtrl, SoundHandle* &handle, bool dopplerEffect) { uint handleID; - handle = 0; // make sure that if the handle is not valid it is null if(Initialised == false) { @@ -433,7 +432,11 @@ } handleID = FindHandleID(); - handle = new SoundHandle(this, handleID); + if(handle == 0) + { + handle = new SoundHandle(); + } + handle->SetID(handleID); if(!handle->Init(name, loop, volume_preset, type3d, sndCtrl, dopplerEffect)) { Modified: soc/2011/sound/src/plugins/common/soundmanager/manager.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/manager.h 2011-06-30 09:33:17 UTC (rev 7480) @@ -101,7 +101,9 @@ * @param loopend when reach it will jump to startframe * @param volume_preset volume for this sound, all volume calculations are based upon this * @param sndCtrl SoundControl to control this sound - * @param handle a Handle you have to supply. You may discard it if you dont want to manage this sound. + * @param handle a Handle you have to supply. If the handle is null a new one is created. You may discard + * it if you dont want to manage this sound. + * @return true if the handle could be played, false otherwise. */ bool Play2DSound(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, @@ -119,8 +121,10 @@ * @param mindist distance when maxvolume should be reached * @param maxdist distance when minvolume is applied * @param rad radiation of the directional cone. Set it to 0 if you dont want a directional sound. - * @param handle a Handle you have to supply. You may discard it if you dont want to manage this sound. + * @param handle a Handle you have to supply. If the handle is null a new one is created. You may discard + * it if you dont want to manage this sound. * @param dopplerEffect true to apply the doppler effect to this sound, false otherwise. + * @return true if the handle could be played, false otherwise. * */ bool Play3DSound(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, @@ -224,8 +228,8 @@ void ChangePlayRate(SoundHandle* handle); /** - * Create a SoundHandle ready to be played with Unpause(). If its creation fails - * handle is a null pointer. + * Create a SoundHandle if the given one is null and it initializes it. If its + * creation fails handle is a null pointer. * @param name name of the resource you want to play @see SoundData for details * @param loop LOOP or DONT_LOOP * @param loopstart startframe when looping @@ -236,7 +240,7 @@ * it is a null pointer if it could not be created. * @param dopplerEffect true to apply the doppler effect to this sound, false otherwise. */ - void CreateSoundHandle(const char* name, bool loop, size_t loopstart, + void InitSoundHandle(const char* name, bool loop, size_t loopstart, size_t loopend, float volume_preset, int type3d, SoundControl* &sndCtrl, SoundHandle* &handle, bool dopplerEffect); }; Modified: soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/psemitter.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -118,6 +118,8 @@ { SoundSystemManager::GetSingleton().StopSound(handle->GetID()); } + + handle = 0; } void psEmitter::StopCallback(void* object) Modified: soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/psmusic.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -107,6 +107,8 @@ { SoundSystemManager::GetSingleton().StopSound(handle->GetID()); } + + handle = 0; } void psMusic::SetManaged() Modified: soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -41,6 +41,7 @@ // TODO needed? SndSysSongData::SndSysSongData(csRef<iDocumentNode> musicalSheet, Instrument* instrument) + : scfImplementationType(this) { csRef<iDocumentNode> part; csRef<iDocumentNodeIterator> measureIter; Modified: soc/2011/sound/src/plugins/common/soundmanager/songdata.h =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/songdata.h 2011-06-30 09:33:17 UTC (rev 7480) @@ -28,6 +28,7 @@ #include <iutil/document.h> #include <isndsys/ss_data.h> #include <csutil/csstring.h> +#include <csutil/scf_implementation.h> //==================================================================================== // Project Includes @@ -77,7 +78,7 @@ * This implements a data class that can be used for the CS sound system to play a song * from a musical sheet. */ -class SndSysSongData: public iSndSysData +class SndSysSongData: public scfImplementation1<SndSysSongData, iSndSysData> { public: /** Modified: soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/songstream.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -214,6 +214,7 @@ return m_bPlaybackReadComplete; } + bool SndSysSongStream::GetNextChord() { bool notesLeft = false; Modified: soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp =================================================================== --- soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-30 07:56:11 UTC (rev 7479) +++ soc/2011/sound/src/plugins/common/soundmanager/soundmanager.cpp 2011-06-30 09:33:17 UTC (rev 7480) @@ -529,7 +529,7 @@ uint SoundManager::PlaySound(const char* fileName, bool loop, iSoundControl* &ctrl) { - SoundHandle* handle; + SoundHandle* handle = 0; SoundControl* sndCtrl = static_cast<SoundControl*>(ctrl); if(sndSysMgr->Play2DSound(fileName, loop, 0, 0, VOLUME_NORM, @@ -546,7 +546,7 @@ uint SoundManager::PlaySound(const char* fileName, bool loop, iSoundControl* &ctrl, csVector3 pos, csVector3 dir, float minDist, float maxDist) { - SoundHandle* handle; + SoundHandle* handle = 0; SoundControl* sndCtrl = static_cast<SoundControl*>(ctrl); if(sndSysMgr->Play3DSound(fileName, loop, 0, 0, VOLUME_NORM, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |