aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/sfx/fmodexsound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sword25/sfx/fmodexsound.cpp')
-rw-r--r--engines/sword25/sfx/fmodexsound.cpp886
1 files changed, 0 insertions, 886 deletions
diff --git a/engines/sword25/sfx/fmodexsound.cpp b/engines/sword25/sfx/fmodexsound.cpp
deleted file mode 100644
index c67db28401..0000000000
--- a/engines/sword25/sfx/fmodexsound.cpp
+++ /dev/null
@@ -1,886 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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; either version 2
- * of the License, or (at your option) any later version.
-
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/*
- * This code is based on Broken Sword 2.5 engine
- *
- * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
- *
- * Licensed under GNU GPL v2
- *
- */
-
-// Die von der Engine ausgegebenen Soundhandles werden intern auf FMOD Ex Handles gemapped.
-// Diese Handles sind nur solange gültig, wie der Sound spielt. Falls danach versucht wird manipulierend auf den Sound zuzugreifen,
-// schlägt dieses ohne Fehlermeldung fehl.
-
-// -----------------------------------------------------------------------------
-// Logging
-// -----------------------------------------------------------------------------
-
-#define BS_LOG_PREFIX "FMODEXSOUND"
-
-// -----------------------------------------------------------------------------
-// Includes
-// -----------------------------------------------------------------------------
-
-#include "sword25/kernel/inputpersistenceblock.h"
-#include "sword25/kernel/outputpersistenceblock.h"
-#include "sword25/package/packagemanager.h"
-#include "sword25/sfx/fmodexsound.h"
-
-// -----------------------------------------------------------------------------
-// Konstanten und lokale Funktionen
-// -----------------------------------------------------------------------------
-
-namespace Sword25 {
-const float DEFAULT_MUSIC_VOLUME = 1.0f;
-const float DEFAULT_SPEECH_VOLUME = 1.0f;
-const float DEFAULT_SFX_VOLUME = 1.0f;
-const uint SOUNDTYPE_COUNT = 3;
-const uint INVALID_SOUND_HANDLE = 0xffffffff;
-
-// -------------------------------------------------------------------------
-
-#if 0
-inline float NormalizePanning(float Panning) {
- bool Corrected = false;
- float Result = Panning;
- if (Result > 1.0f) {
- Result = 1.0f;
- Corrected = true;
- }
- if (Result < -1.0f) {
- Result = -1.0f;
- Corrected = true;
- }
-
- if (Corrected) BS_LOG_WARNINGLN("Tried to set an invalid panning value of %.2f. It was corrected to %.2f", Panning, Result);
-
- return Result;
-}
-
-// -------------------------------------------------------------------------
-
-inline float NormalizeVolume(float Volume) {
- bool Corrected = false;
- float Result = Volume;
- if (Result > 1.0f) {
- Result = 1.0f;
- Corrected = true;
- }
- if (Result < 0.0f) {
- Result = 0.0f;
- Corrected = true;
- }
-
- if (Corrected) BS_LOG_WARNINGLN("Tried to set an invalid volume value of %.2f. It was corrected to %.2f", Volume, Result);
-
- return Result;
-}
-
-// -------------------------------------------------------------------------
-
-inline FMOD_SOUND_FORMAT BitsPerSampleToFMODExSoundFormat(uint BitsPerSample) {
- switch (BitsPerSample) {
- case 8:
- return FMOD_SOUND_FORMAT_PCM8;
- case 16:
- return FMOD_SOUND_FORMAT_PCM16;
- case 24:
- return FMOD_SOUND_FORMAT_PCM24;
- case 32:
- return FMOD_SOUND_FORMAT_PCM32;
- default:
- return FMOD_SOUND_FORMAT_NONE;
- }
-}
-
-#endif
-
-FMODExSound::FMODExSound(Kernel *pKernel) :
- SoundEngine(pKernel)
- /* m_FMOD(0),
- m_NextHandle(1) */ {
- // Lautstärkeneinstellungen auf die Standardwerte setzen
-#if 0
- m_Volumes[MUSIC] = DEFAULT_MUSIC_VOLUME;
- m_Volumes[SPEECH] = DEFAULT_SPEECH_VOLUME;
- m_Volumes[SFX] = DEFAULT_SFX_VOLUME;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-FMODExSound::~FMODExSound() {
-#if 0
- // Alle noch spielenden Sounds stoppen und die Ressourcen freigeben
- for (PSM_ITER it = m_PlayingSoundsMap.begin(); it != m_PlayingSoundsMap.end(); ++it) {
- if (it->second.ChannelPtr) delete it->second.ChannelPtr;
- if (it->second.ResourcePtr) it->second.ResourcePtr->Release();
- }
-
- // FMOD Ex deinitialisieren
- if (m_FMOD) FMOD_System_Release(m_FMOD);
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-Service *FMODExSound_CreateObject(Kernel *pKernel) {
- return new FMODExSound(pKernel);
-}
-
-// -----------------------------------------------------------------------------
-
-bool FMODExSound::Init(uint SampleRate, uint Channels) {
-#if 0
- // Eine Warnung ausgeben, wenn dieser Service schon initialisiert wurde.
- // Allerdings wird trotzdem true zurückgegeben, weil kein Fehler aufgetreten ist, der Service ist noch benutzbar.
- if (m_FMOD) {
- BS_LOG_WARNINGLN("Tried to initialize again. Call ignored.");
- return true;
- } else {
- try {
- // Die FMOD Ex mit den übergebenen Werte initialisieren
- FMOD_RESULT Result = FMOD_System_Create(&m_FMOD);
- if (Result != FMOD_OK) throw(BS_FMODExException("FMOD_System_Create()", Result));
-
- Result = FMOD_System_SetSoftwareFormat(m_FMOD, SampleRate, FMOD_SOUND_FORMAT_PCM16, 0, 0, FMOD_DSP_RESAMPLER_LINEAR);
- if (Result != FMOD_OK) throw(BS_FMODExException("FMOD_System_SetSoftwareFormat()", Result));
-
- Result = FMOD_System_Init(m_FMOD, Channels, FMOD_INIT_NORMAL, 0);
- if (Result != FMOD_OK) throw(BS_FMODExException("FMOD_System_Init()", Result));
- }
-
- catch (BS_FMODExException Ex) {
- Ex.Log();
- BS_LOG_ERRORLN("FMOD Ex could not be initialized.");
-
- if (m_FMOD) {
- FMOD_System_Release(m_FMOD);
- m_FMOD = 0;
- }
-
- return false;
- }
-
- BS_LOGLN("FMOD Ex initialized. Sample rate: %d / Channels: %d", SampleRate, Channels);
- return true;
- }
-#else
- return true;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::Update() {
-#if 0
- BS_ASSERT(m_FMOD);
-
- FMOD_RESULT Result = FMOD_System_Update(m_FMOD);
- if (Result != FMOD_OK) BS_FMODExException("FMOD_System_Update()", Result).Log();
-
- RemoveInactiveSounds();
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// Sounds abspielen
-// -----------------------------------------------------------------------------
-
-bool FMODExSound::PlaySound(const Common::String &FileName,
- SOUND_TYPES Type,
- float Volume,
- float Pan,
- bool Loop,
- int LoopStart, int LoopEnd,
- uint Layer) {
-#if 0
- return PlaySoundInternal(FileName, Type, Volume, Pan, Loop, LoopStart, LoopEnd, Layer, 0, 0) != 0;
-#else
- return true;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-uint FMODExSound::PlaySoundEx(const Common::String &FileName,
- SOUND_TYPES Type,
- float Volume,
- float Pan,
- bool Loop,
- int LoopStart, int LoopEnd,
- uint Layer) {
-#if 0
- return PlaySoundInternal(FileName, Type, Volume, Pan, Loop, LoopStart, LoopEnd, Layer, 0, 0);
-#else
- return true;
-#endif
-}
-
-// -------------------------------------------------------------------------
-
-#if 0
-FMOD_RESULT F_CALLBACK BS_FMODExSound::FMODExDynamicSoundSetPosCallback(FMOD_SOUND *sound, int subsound, uint position, FMOD_TIMEUNIT postype) {
- // In dynamischen Sounds wird nicht gesprungen, daher tut dieses Funktion nichts.
- return FMOD_OK;
-}
-
-// -------------------------------------------------------------------------
-
-FMOD_RESULT F_CALLBACK BS_FMODExSound::FMODExDynamicSoundReadCallback(FMOD_SOUND *sound, void *data, uint datalen) {
- // Handle auf das aktuelle Soundsystem holen, dies ist wohl dieses hier.
- BS_FMODExSound *t = reinterpret_cast<BS_FMODExSound *>(BS_Kernel::GetInstance()->GetSfx());
-
- // Handle auf den richtigen Sound holen, wurde als FMOD Ex Benutzerdaten gesetzt.
- uint Handle;
- FMOD_RESULT Result = FMOD_Sound_GetUserData(sound, reinterpret_cast<void **>(&Handle));
- if (Result != FMOD_OK) {
- BS_FMODExException("FMOD_Sound_GetUserData()", Result).Log();
- return FMOD_OK;
- }
-
- // Sounddaten holen und Callbackfunktion aufrufen.
- PlayingSoundData *PSD = t->GetPlayingSoundDataByHandle(Handle);
- if (PSD) PSD->ReadCallback(PSD->UserData, data, datalen);
-
- return FMOD_OK;
-}
-#endif
-// -----------------------------------------------------------------------------
-
-uint FMODExSound::PlayDynamicSoundEx(DynamicSoundReadCallback ReadCallback,
- void *UserData,
- SOUND_TYPES Type,
- uint SampleRate,
- uint BitsPerSample,
- uint Channels,
- float Volume,
- float Pan,
- uint Layer) {
-#if 0
- // Parameter überprüfen
- if (BitsPerSampleToFMODExSoundFormat(BitsPerSample) == FMOD_SOUND_FORMAT_NONE) {
- BS_LOG_ERRORLN("Cannot create a dynamic sound with %d bits per sample.", BitsPerSample);
- return 0;
- }
- if (Channels == 0 || Channels > 2) {
- BS_LOG_ERRORLN("Cannot create a dynamic sound with %d channels.", Channels);
- return 0;
- }
-
- // Zu vergebendes Handle bestimmen
- uint Handle = m_NextHandle++;
-
- // Sound in die Sound-Map eintragen mit all den Informationen, die wir bisher haben.
- // Dies muss für dynamische Sounds so früh geschehen, da sofort nach dem Aufruf von FMOD_System_CreateSound der Callback aufgerufen wird um
- // den Decode-Buffer zu füllen. Unser Callback liest den BS-Callback aus der Sound-Map. Wenn wir den Sound später hinzufügen würden, würde der
- // BS-Callback zu diesem Sound nicht in der Map stehen und nicht aufgerufen werden können.
- // Den fehlenden ChannelPtr tragen wir später in dieser Funktion ein.
- m_PlayingSoundsMap[Handle] = PlayingSoundData(0, 0, Type, Layer, Volume, ReadCallback, UserData);
-
- // Dynamischen FMOD Ex Sound erstellen
- FMOD_CREATESOUNDEXINFO CreateSoundExInfo;
- memset(&CreateSoundExInfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
- CreateSoundExInfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
- CreateSoundExInfo.length = 0xffffffff;
- CreateSoundExInfo.numchannels = Channels;
- CreateSoundExInfo.defaultfrequency = SampleRate;
- CreateSoundExInfo.format = BitsPerSampleToFMODExSoundFormat(BitsPerSample);
- CreateSoundExInfo.pcmreadcallback = FMODExDynamicSoundReadCallback;
- CreateSoundExInfo.pcmsetposcallback = FMODExDynamicSoundSetPosCallback;
- CreateSoundExInfo.userdata = reinterpret_cast<void *>(Handle);
-
- FMOD_SOUND *FMODExSoundPtr;
- FMOD_RESULT Result = FMOD_System_CreateSound(m_FMOD,
- 0,
- FMOD_2D | FMOD_OPENUSER | FMOD_LOOP_NORMAL | FMOD_HARDWARE | FMOD_CREATESTREAM,
- &CreateSoundExInfo,
- &FMODExSoundPtr);
- if (Result != FMOD_OK) {
- BS_FMODExException("FMOD_System_CreateSound() from PlayDynamicSoundEx()", Result).Log();
- return 0;
- }
-
- // Neu erstellten Sound einem Kanal zuweisen
- FMOD_CHANNEL *FMODExChannelPtr;
- Result = FMOD_System_PlaySound(m_FMOD, FMOD_CHANNEL_FREE, FMODExSoundPtr, 1, &FMODExChannelPtr);
- if (Result != FMOD_OK) {
- BS_FMODExException("FMOD_System_PlaySound() from PlayDynamicSoundEx()", Result).Log();
- return 0;
- }
-
- // FMOD Ex Kanal an einen BS_FMODExChannel binden und abspielen
- BS_FMODExChannel *ChannelPtr = new BS_FMODExChannel(FMODExChannelPtr, FMODExSoundPtr);
- ChannelPtr->SetPaused(false);
-
- // ChannelPtr in die PlayingSoundData-Struktur eintragen
- PlayingSoundData *PSD = GetPlayingSoundDataByHandle(Handle);
- if (PSD) PSD->ChannelPtr = ChannelPtr;
-
- return Handle;
-#else
- return 0;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-#if 0
-uint BS_FMODExSound::PlaySoundInternal(const Common::String &FileName,
- SOUND_TYPES Type,
- float Volume,
- float Pan,
- bool Loop,
- int LoopStart, int LoopEnd,
- uint Layer,
- uint Position,
- uint Handle) {
- BS_ASSERT(m_FMOD);
- BS_ASSERT(Type < SOUNDTYPE_COUNT);
-
- // Resource anfordern
- BS_Resource *ResourcePtr = BS_Kernel::GetInstance()->GetResourceManager()->RequestResource(FileName);
- if (!ResourcePtr) {
- BS_LOG_ERRORLN("Could not request resource \"%s\".", FileName.c_str());
- return 0;
- }
- if (ResourcePtr->GetType() != BS_Resource::TYPE_SOUND) {
- BS_LOG_ERRORLN("Requested resource \"%s\" is not a sound.", FileName.c_str());
- return 0;
- }
- BS_FMODExResource *SoundResourcePtr = static_cast<BS_FMODExResource *>(ResourcePtr);
-
- // Sound im Pause-Modus starten
- BS_FMODExChannel *ChannelPtr = SoundResourcePtr->StartSound(m_FMOD);
-
- if (ChannelPtr) {
- try {
- // Falls der Sound gelooped wird, Loop-Points setzen
- if (Loop) {
- // Bestimmen, welche Loop-Points benutzt werden. Falls ein Loop-Point als Parameter nicht spezifiziert wurde (Wert -1),
- // wird der Loop-Point von FMOD Ex benutzt.
- uint RealLoopStart = (LoopStart > 0) ? LoopStart : ChannelPtr->GetLoopStart();
- uint RealLoopEnd = (LoopEnd > 0) ? LoopEnd : ChannelPtr->GetLoopEnd();
-
- // Loop-Points auf Gültigkeit überprüfen
- if (RealLoopStart > RealLoopEnd) {
- BS_LOG_ERRORLN("Loop start (%d) was placed after loop end (%d) for sound \"%s\".",
- RealLoopStart, RealLoopEnd,
- SoundResourcePtr->GetFileName().c_str());
- throw(0);
- }
- if (RealLoopStart > ChannelPtr->GetLoopEnd()) {
- BS_LOG_ERRORLN("Loop start (%d) was placed after end (%d) of sound \"%s\".",
- RealLoopStart,
- ChannelPtr->GetLoopEnd(),
- SoundResourcePtr->GetFileName().c_str());
- throw(0);
- }
- if (RealLoopEnd > ChannelPtr->GetLoopEnd()) {
- BS_LOG_ERRORLN("Loop end (%d) was placed after end (%d) of sound \"%s\".",
- RealLoopEnd,
- ChannelPtr->GetLoopEnd(),
- SoundResourcePtr->GetFileName().c_str());
- throw(0);
- }
-
- // Loop-Points setzen
- if (!ChannelPtr->SetLoopPoints(RealLoopStart, RealLoopEnd)) throw(0);
- }
-
- // Sound-Parameter gemäß der Übergabeparameter setzen
- if (!ChannelPtr->SetVolume(NormalizeVolume(Volume) * m_Volumes[Type])) throw(0);
- if (!ChannelPtr->SetPanning(NormalizePanning(Pan))) throw(0);
- if (!ChannelPtr->SetLoop(Loop)) throw(0);
- if (!ChannelPtr->SetPosition(Position)) throw(0);
- } catch (...) {
- delete ChannelPtr;
- SoundResourcePtr->Release();
- return 0;
- }
-
- uint MyLoopStart = ChannelPtr->GetLoopStart();
- uint MyLoopEnd = ChannelPtr->GetLoopEnd();
- ChannelPtr->SetLoopPoints(MyLoopStart, MyLoopEnd);
-
- // Sound abspielen
- ChannelPtr->SetPaused(false);
-
- // Sound in die Sound-Map eintragen
- uint NewHandle = (Handle != 0) ? Handle : m_NextHandle++;
- m_PlayingSoundsMap[NewHandle] = PlayingSoundData(SoundResourcePtr, ChannelPtr, Type, Layer, Volume);
-
- return NewHandle;
- } else {
- SoundResourcePtr->Release();
- return 0;
- }
-}
-#endif
-// -----------------------------------------------------------------------------
-// Sonstige Methoden
-// -----------------------------------------------------------------------------
-
-void FMODExSound::SetVolume(float Volume, SOUND_TYPES Type) {
-#if 0
- BS_ASSERT(m_FMOD);
- BS_ASSERT(Type < SOUNDTYPE_COUNT);
- m_Volumes[Type] = NormalizeVolume(Volume);
-
- // Alle Volumen der Sounds der Kategorie aktualisieren
- PSM_CONST_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- const PlayingSoundData &PSD = it->second;
- if (PSD.ChannelPtr && PSD.Type == Type) PSD.ChannelPtr->SetVolume(Volume * PSD.Volume);
-
- ++it;
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-float FMODExSound::GetVolume(SOUND_TYPES Type) {
-#if 0
- BS_ASSERT(m_FMOD);
- BS_ASSERT(Type < SOUNDTYPE_COUNT);
- return m_Volumes[Type];
-#else
- return 0;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::PauseAll() {
-#if 0
- BS_ASSERT(m_FMOD);
-
- // Alle Sounds durchgehen und alle pausieren.
- // Diese werden dann markiert, damit ResumeAll() feststellen kann, welche Sounds mit PauseAll() pausiert wurden.
- // ResumeAll() setzt dann nur diejenigen fort, die nur über PauseAll() pausiert wurden.
- PSM_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- PlayingSoundData &PSD = it->second;
-
- if (PSD.ChannelPtr) PSD.ChannelPtr->SetPaused(true);
- PSD.PausedGlobal = true;
-
- ++it;
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::ResumeAll() {
-#if 0
- BS_ASSERT(m_FMOD);
-
- // Alle Sounds durchgehen, die gloable Pause aufheben und diejenigen fortsetzen,
- // die keine Pause mehr haben (weder explizit, über den Layer oder global).
- PSM_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- PlayingSoundData &PSD = it->second;
-
- if (PSD.PausedGlobal) {
- PSD.PausedGlobal = false;
- if (PSD.ChannelPtr && !PSD.PausedLayer && !PSD.Paused) PSD.ChannelPtr->SetPaused(false);
- }
-
- ++it;
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::PauseLayer(uint Layer) {
-#if 0
- BS_ASSERT(m_FMOD);
-
- // Alle Sounds durchgehen und alle pausieren, die sich auf den angegebenen Layer befinden.
- // Diese werden dann markiert, damit ResumeLayer() feststellen kann, welche Sounds mit PauseLayer() pausiert wurden.
- // ResumeLayer() setzt dann nur diejenigen fort, die nur über PauseLayer() mit der entsprechenden Layer-Nummer pausiert wurden.
- PSM_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- PlayingSoundData &PSD = it->second;
-
- if (PSD.Layer == Layer) {
- if (PSD.ChannelPtr) PSD.ChannelPtr->SetPaused(true);
- PSD.PausedLayer = true;
- }
-
- ++it;
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::ResumeLayer(uint Layer) {
-#if 0
- BS_ASSERT(m_FMOD);
-
- // Alle Sounds durchgehen, die Layer-Pause aufheben und diejenigen fortsetzen,
- // die keine Pause mehr haben (weder explizit, über den Layer oder global).
- PSM_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- PlayingSoundData &PSD = it->second;
-
- if (PSD.PausedLayer && PSD.Layer == Layer) {
- PSD.PausedLayer = false;
- if (PSD.ChannelPtr && !PSD.PausedGlobal && !PSD.Paused) PSD.ChannelPtr->SetPaused(false);
- }
-
- ++it;
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// Sound Setter
-// -----------------------------------------------------------------------------
-
-void FMODExSound::SetSoundVolume(uint Handle, float Volume) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr) if (PSDPtr->ChannelPtr && PSDPtr->ChannelPtr->SetVolume(NormalizeVolume(Volume) * m_Volumes[PSDPtr->Type])) PSDPtr->Volume = Volume;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::SetSoundPanning(uint Handle, float Pan) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr && PSDPtr->ChannelPtr) PSDPtr->ChannelPtr->SetPanning(NormalizePanning(Pan));
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::PauseSound(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr) {
- PSDPtr->Paused = true;
- if (PSDPtr->ChannelPtr) PSDPtr->ChannelPtr->SetPaused(true);
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::ResumeSound(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr) {
- PSDPtr->Paused = false;
- if (PSDPtr->ChannelPtr && !PSDPtr->PausedGlobal && !PSDPtr->PausedLayer) PSDPtr->ChannelPtr->SetPaused(false);
- }
-#endif
-}
-
-// -----------------------------------------------------------------------------
-
-void FMODExSound::StopSound(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr && PSDPtr->ChannelPtr) PSDPtr->ChannelPtr->Stop();
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// Sound Getter
-// -----------------------------------------------------------------------------
-
-bool FMODExSound::IsSoundPaused(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr && PSDPtr->ChannelPtr) return PSDPtr->ChannelPtr->IsPaused();
-#endif
- return false;
-}
-
-// -----------------------------------------------------------------------------
-
-bool FMODExSound::IsSoundPlaying(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr && PSDPtr->ChannelPtr) return PSDPtr->ChannelPtr->IsPlaying();
-#endif
- return false;
-}
-
-// -----------------------------------------------------------------------------
-
-float FMODExSound::GetSoundVolume(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr) return PSDPtr->Volume;
-#endif
- return 0;
-}
-
-// -----------------------------------------------------------------------------
-
-float FMODExSound::GetSoundPanning(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr && PSDPtr->ChannelPtr) return PSDPtr->ChannelPtr->GetPanning();
-#endif
- return 0;
-}
-
-// -----------------------------------------------------------------------------
-
-float FMODExSound::GetSoundTime(uint Handle) {
-#if 0
- BS_ASSERT(m_FMOD);
- PlayingSoundData *PSDPtr = GetPlayingSoundDataByHandle(Handle);
- if (PSDPtr && PSDPtr->ChannelPtr) return static_cast<float>(PSDPtr->ChannelPtr->GetTime()) / 1000.0f;
-#endif
- return 0;
-}
-
-#if 0
-void BS_FMODExSound::RemoveInactiveSounds() {
- PSM_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- if (!it->second.ChannelPtr || !it->second.ChannelPtr->IsPlaying()) {
- PlayingSoundData &PSD = it->second;
-
- delete PSD.ChannelPtr;
- if (PSD.ResourcePtr) PSD.ResourcePtr->Release();
-
- it = m_PlayingSoundsMap.erase(it);
- } else
- ++it;
- }
-
- /*
- static size_t lastActiveChannels = 0;
- if (m_PlayingSoundsMap.size() != lastActiveChannels)
- {
- BS_LOGLN("Aktive Kanaele: %d", m_PlayingSoundsMap.size());
- lastActiveChannels = m_PlayingSoundsMap.size();
- }
- */
-}
-
-// -----------------------------------------------------------------------------
-
-BS_FMODExSound::PlayingSoundData *BS_FMODExSound::GetPlayingSoundDataByHandle(uint Handle) {
- // Zum Soundhandle gehörige Daten in der Hash-Map finden
- PSM_ITER it = m_PlayingSoundsMap.find(Handle);
- // Falls die Daten nicht gefunden werden konnten, Fehler zurückgebene, ansonsten ein Pointer auf die Daten.
- if (it == m_PlayingSoundsMap.end()) return 0;
- return &((*it).second);
-}
-
-// -----------------------------------------------------------------------------
-
-uint BS_FMODExSound::CountPlayingDynamicSounds() {
- uint Result = 0;
- for (PSM_CONST_ITER it = m_PlayingSoundsMap.begin(); it != m_PlayingSoundsMap.end(); ++it) if (!it->second.ResourcePtr) ++Result;
-
- return Result;
-}
-#endif
-
-// -----------------------------------------------------------------------------
-// Ressourcen-Verwaltung
-// -----------------------------------------------------------------------------
-
-Resource *FMODExSound::LoadResource(const Common::String &FileName) {
-#if 0
- BS_ASSERT(m_FMOD);
- BS_ASSERT(CanLoadResource(FileName));
-
- bool Success;
- BS_FMODExResource *ResourcePtr = new BS_FMODExResource(FileName, m_FMOD, Success);
- if (Success)
- return ResourcePtr;
- else {
- delete ResourcePtr;
- return 0;
- }
-#else
- return 0;
-#endif
-}
-bool FMODExSound::CanLoadResource(const Common::String &FileName) {
-#if 0
- if (FileName.size() >= 4) {
- Common::String Extension(FileName.end() - 4, FileName.end());
- BS_String::ToLower(Extension);
-
- return Extension == ".wav" ||
- Extension == ".ogg" ||
- Extension == ".mp3";
- } else
- return false;
-#else
- return true;
-#endif
-}
-
-// -----------------------------------------------------------------------------
-// Persistenz
-// -----------------------------------------------------------------------------
-
-bool FMODExSound::persist(OutputPersistenceBlock &writer) {
-#if 0
- BS_ASSERT(m_FMOD);
-
- // Alle inaktiven Sounds entfernen, damit kein unnötiger Ballast gespeichert wird
- RemoveInactiveSounds();
-
- // Warnung ausgeben, wenn dynamische Sounds abgespielt werden
- uint PlayingDynamicSounds = CountPlayingDynamicSounds();
- if (PlayingDynamicSounds) BS_LOG_WARNINGLN("There are currently dynamic sounds playing. These will not be persisted.");
-
- // Nächstes Handle speichern
- Writer.Write(m_NextHandle);
-
- // Anzahl spielender (nicht dynamischer) Sounds speichern
- Writer.Write(m_PlayingSoundsMap.size() - PlayingDynamicSounds);
-
- // Informationen für jeden spielenden (nicht dynamischen) Sound speichern
- PSM_CONST_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- const PlayingSoundData &PSD = it->second;
-
- if (PSD.ResourcePtr) {
- // Handle speichern
- Writer.Write(it->first);
-
- // Soundeigenschaften speichern
- Writer.Write(PSD.ResourcePtr->GetFileName());
- Writer.Write(static_cast<uint>(PSD.Type));
- Writer.Write(PSD.Layer);
-
- Writer.Write(PSD.Volume);
- Writer.Write(PSD.ChannelPtr->GetPanning());
- Writer.Write(PSD.ChannelPtr->IsLooping());
- Writer.Write(PSD.ChannelPtr->GetLoopStart());
- Writer.Write(PSD.ChannelPtr->GetLoopEnd());
- Writer.Write(PSD.ChannelPtr->GetPosition());
- Writer.Write(PSD.Paused);
- Writer.Write(PSD.PausedLayer);
- Writer.Write(PSD.PausedGlobal);
- }
-
- ++it;
- }
-
-#endif
- return true;
-}
-
-// -----------------------------------------------------------------------------
-
-bool FMODExSound::unpersist(InputPersistenceBlock &reader) {
-#if 0
- BS_ASSERT(m_FMOD);
-
- // Alle Sounds stoppen
- PSM_ITER it = m_PlayingSoundsMap.begin();
- while (it != m_PlayingSoundsMap.end()) {
- const PlayingSoundData &PSD = it->second;
- if (PSD.ChannelPtr) delete PSD.ChannelPtr;
- if (PSD.ResourcePtr) PSD.ResourcePtr->Release();
- ++it;
- }
-
- // Sound-Map leeren
- m_PlayingSoundsMap.clear();
-
- // Nächstes Handle laden
- Reader.Read(m_NextHandle);
-
- // Soundanzahl einlesen
- uint SoundCount = 0;
- Reader.Read(SoundCount);
-
- // Informationen über jeden spielenden Sound einlesen und ihn mit den Parametern abspielen
- for (uint i = 0; i < SoundCount; ++i) {
- uint Handle;
- Common::String FileName;
- uint Type;
- uint Layer;
-
- float Volume;
- float Pan;
- bool Loop;
- uint LoopStart;
- uint LoopEnd;
- uint Position;
- bool Paused;
- bool PausedLayer;
- bool PausedGlobal;
-
- Reader.Read(Handle);
- Reader.Read(FileName);
- Reader.Read(Type);
- Reader.Read(Layer);
-
- Reader.Read(Volume);
- Reader.Read(Pan);
- Reader.Read(Loop);
- Reader.Read(LoopStart);
- Reader.Read(LoopEnd);
- Reader.Read(Position);
- Reader.Read(Paused);
- Reader.Read(PausedLayer);
- Reader.Read(PausedGlobal);
-
- if (Reader.IsGood()) {
- PlaySoundInternal(FileName, (SOUND_TYPES) Type, Volume, Pan, Loop, LoopStart, LoopEnd, Layer, Position, Handle);
- } else {
- return false;
- }
- }
-
- return Reader.IsGood();
-#else
- return true;
-#endif
-}
-
-} // End of namespace Sword25