Beispiel #1
0
	void cAudioManager::update()
	{
        updateSources.clear();

        {
            cAudioMutexBasicLock lock(Mutex);
            size_t count = audioSources.size();
            for(size_t i=0; i<count; i++)
            {
                IAudioSource* source = audioSources[i];
                if (source->isValid())
                {
                    source->grab();
                    updateSources.push_back(source);
                }
            }
        }

        // not holding the mutex because this might take a while!
        for (int i=0; i != updateSources.size(); i++)
        {
            IAudioSource *src = updateSources[i];
            src->update();
            src->drop();
        }

        cAudioMutexBasicLock lock(Mutex);
        
		if (!managedAudioSources.empty())
		{
			size_t count = managedAudioSources.size();
			for(size_t i=0; i<count; i++)
			{
				IAudioSource* source = managedAudioSources[i];
				if (source->isValid())
				{
					source->update();
					if (source->isStopped())
					{
						managedAudioSourcesDelBuffer.push_back(source);
					}
				}
			}

			count = managedAudioSourcesDelBuffer.size();
			for(size_t i=0; i<count; i++)
			{
				IAudioSource* source = managedAudioSourcesDelBuffer[i];
				cAudioVector<IAudioSource*>::Type::iterator it = std::find(managedAudioSources.begin(), managedAudioSources.end(), source);
				if (it != managedAudioSources.end())
				{
					managedAudioSources.erase(it);
					CAUDIO_DELETE source;
				}
			}
			managedAudioSourcesDelBuffer.clear();
		}		
	}
Beispiel #2
0
	IAudioSource* cAudioManager::createAudioSource(IAudioDecoder* decoder, const cAudioString& audioName, const cAudioString& dataSource)
	{
		if(decoder && decoder->isValid())
		{
#if CAUDIO_EFX_ENABLED == 1
			IAudioSource* audio = CAUDIO_NEW cAudioSource(decoder, AudioContext, ((cAudioEffects*)getEffects())->getEFXInterface());
#else
			IAudioSource* audio = CAUDIO_NEW cAudioSource(decoder, AudioContext);
#endif
			decoder->drop();

			if(audio && audio->isValid())
			{
				if(!audioName.empty())
					audioIndex[audioName] = audio;

				audioSources.push_back(audio);		
				getLogger()->logInfo("AudioManager", "Audio Source (%s) created from Data Source %s.", audioName.c_str(), dataSource.c_str());
				return audio;
			}

			getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Error creating audio source.", audioName.c_str());
			audio->drop();
			return NULL;
		}
		getLogger()->logError("AudioManager", "Failed to create Audio Source (%s): Audio data could not be decoded by (.%s) decoder.", audioName.c_str(), decoder->getType().c_str());
		decoder->drop();
		return NULL;
	}
Beispiel #3
0
	void cAudioManager::update()
	{
		cAudioMutexBasicLock lock(Mutex);
		size_t count = audioSources.size();
		for(size_t i=0; i<count; i++)
		{
			IAudioSource* source = audioSources[i];
			if (source->isValid())
			{
				source->update();
			}
		}

		if (!managedAudioSources.empty())
		{
			count = managedAudioSources.size();
			for(size_t i=0; i<count; i++)
			{
				IAudioSource* source = managedAudioSources[i];
				if (source->isValid())
				{
					source->update();
					if (source->isStopped())
					{
						managedAudioSourcesDelBuffer.push_back(source);
					}
				}
			}

			count = managedAudioSourcesDelBuffer.size();
			for(size_t i=0; i<count; i++)
			{
				IAudioSource* source = managedAudioSourcesDelBuffer[i];
				cAudioVector<IAudioSource*>::Type::iterator it = std::find(managedAudioSources.begin(), managedAudioSources.end(), source);
				if (it != managedAudioSources.end())
				{
					managedAudioSources.erase(it);
					CAUDIO_DELETE source;
				}
			}
			managedAudioSourcesDelBuffer.clear();
		}		
	}