Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37730134
en ru br
Репозитории ALT

Группа :: Игры/Прочее
Пакет: scorchwentbonkers

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: scorchwentbonkers-no-fmod.patch
Скачать


diff -ur scorchwentbonkers.orig/Makefile.linux scorchwentbonkers/Makefile.linux
--- scorchwentbonkers.orig/Makefile.linux	2005-07-25 23:23:52.000000000 +0200
+++ scorchwentbonkers/Makefile.linux	2007-02-03 22:24:17.000000000 +0100
@@ -52,14 +52,13 @@
 DEPENDS = Makefile.dep
 EXENAME = swb
 
-FMOD = -lfmod-3.74
-LIBS = $(FMOD) -ljpgal -lagl `allegro-config --libs` -lGL -lGLU
+LIBS = -ljpgal -lagl `allegro-config --libs` `pkg-config --libs AllegroOGG` -lGL -lGLU -ldumb -laldmb -lpthread
 
 CXX = g++
 RM = rm -f
 MV = mv
 
-CXXFLAGS = -Wall -O3
+CXXFLAGS = -g -Wall -O2 `pkg-config --cflags AllegroOGG`
 DEPFLAGS = -MM
 
 $(EXENAME): $(OBJS)
diff -ur scorchwentbonkers.orig/src/sound/SoundSystem.cpp scorchwentbonkers/src/sound/SoundSystem.cpp
--- scorchwentbonkers.orig/src/sound/SoundSystem.cpp	2005-07-25 23:25:12.000000000 +0200
+++ scorchwentbonkers/src/sound/SoundSystem.cpp	2007-02-03 22:29:39.000000000 +0100
@@ -1,7 +1,8 @@
-#include <allegro.h>
-#include <fmod.h>
-#include <fmod_errors.h>
-
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <alogg.h>
+ 
 #include "../misc/Settings.h"
 
 #include "SoundSystem.h"
@@ -13,10 +14,14 @@
 //  STATICS
 // *********
 
-FSOUND_SAMPLE *SoundSystem::sounds[SND_MAX];
-FMUSIC_MODULE *SoundSystem::modules[MOD_MAX];
+SAMPLE *SoundSystem::sounds[SND_MAX];
+DUH *SoundSystem::modules[MOD_MAX];
 bool SoundSystem::loadFlag = false;
 
+AL_DUH_PLAYER *SoundSystem::duh_player = NULL;
+pthread_t SoundSystem::duh_player_thread;
+pthread_mutex_t SoundSystem::duh_player_mutex;
+
 //  CONSTRUCTORS AND DESTRUCTORS
 // ******************************
 
@@ -38,29 +43,49 @@
 	static const char *moduleFileNames[MOD_MAX] = {"mus/menu.mod"};
 	
 	loadFlag = true;
- 	if (!FSOUND_Init(44100, 32, 0))
+	reserve_voices(32, 0);
+	if(install_sound(DIGI_AUTODETECT, MIDI_NONE, NULL))
  	{
- 		allegro_message("Couldn't initialize FMOD sound.\n%s", FMOD_ErrorString(FSOUND_GetError()));
+		if (Settings::setting[GFX_FULLSCREEN]) /* don't use allegro_message when fullscreen! */
+			fprintf(stderr, "Couldn't initialize sound.\n%s\n", allegro_error);
+		else
+ 			allegro_message("Couldn't initialize sound.\n%s", allegro_error);
  		loadFlag = false;
  	}
  	
 	if (loadFlag)
 	{
+		dumb_register_packfiles();
+		pthread_mutex_init(&duh_player_mutex, NULL);
 		for (int i = 0; i < SND_MAX; i++)
 		{
-			sounds[i] = FSOUND_Sample_Load(FSOUND_UNMANAGED, Settings::path(sampleFileNames[i]), FSOUND_LOOP_OFF, 0, 0);
+			ALOGG_OGG *ogg;
+			FILE *f = fopen(Settings::path(sampleFileNames[i]), "r");
+			sounds[i] = NULL;
+			if (!f)
+			{
+				allegro_message("Couldn't load sound file: '%s': %s", sampleFileNames[i], strerror(errno));
+				continue;
+			}
+			ogg = alogg_create_ogg_from_file(f);
+			if (!ogg)
+			{
+				fclose(f);
+				allegro_message("Couldn't load sound file: '%s'", sampleFileNames[i]);
+				continue;
+			}
+			sounds[i] = alogg_create_sample_from_ogg(ogg);
+			alogg_destroy_ogg(ogg);
 			if (!sounds[i])
 				allegro_message("Couldn't load sound file: '%s'", sampleFileNames[i]);
 		}
 		
 		for (int i = 0; i < MOD_MAX; i++)
 		{
-			modules[i] = FMUSIC_LoadSong(moduleFileNames[i]);
+			modules[i] = dumb_load_mod_quick(Settings::path(moduleFileNames[i]));
 			if (!modules[i])
 			{
-				int error = FSOUND_GetError();
-				if (error != FMOD_ERR_FILE_NOTFOUND)
-					allegro_message("Error loading '%s'\n%s", Settings::path(moduleFileNames[i]), FMOD_ErrorString(error));
+				allegro_message("Error loading '%s'\n", Settings::path(moduleFileNames[i]));
 			}
 		}
 	}
@@ -70,21 +92,24 @@
 
 void SoundSystem::freeAll()
 {
+	if (!loadFlag) return;
+	
 	for (int i = 0; i < SND_MAX; i++)
 	{
 		if (sounds[i])
-			FSOUND_Sample_Free(sounds[i]);
+			destroy_sample(sounds[i]);
 		sounds[i] = NULL;
 	}
 	
 	for (int i = 0; i < MOD_MAX; i++)
 	{
 		if (modules[i])
-			FMUSIC_FreeSong(modules[i]);
+			unload_duh(modules[i]);
 		modules[i] = NULL;
 	}
 	
-	FSOUND_Close();
+	dumb_exit();
+	remove_sound();
 	
 	loadFlag = false;
 }
@@ -105,9 +130,12 @@
 		percent = 0;
 	
 	musicVolume = ((float)percent) / 100.0;
-	
-	for (int i = 0; i < MOD_MAX; i++)
-		FMUSIC_SetMasterVolume(modules[i], (int)(masterVolume * musicVolume * moduleAtVolume[i] * 256.0));
+	if (SoundSystem::duh_player)
+	{
+	    pthread_mutex_lock(&SoundSystem::duh_player_mutex);
+	    al_duh_set_volume(SoundSystem::duh_player, musicVolume);
+	    pthread_mutex_unlock(&SoundSystem::duh_player_mutex);
+	}
 }
 
 /********************************/
@@ -115,25 +143,59 @@
 void SoundSystem::setMasterVolume(int percent)
 {
 	masterVolume = ((float)percent) / 100.0;
-	setMusicVolume((int)(musicVolume * 100));
+	set_volume((int)(masterVolume * 255.0), 0);
 }
 
 //  MUSIC HANDLING
 // ****************
 
+static void *duh_player_thread_function(void *arg)
+{
+    while(1)
+    {
+	pthread_mutex_lock(&SoundSystem::duh_player_mutex);
+	/* this may be nuked if things fail in set_music_pattern */
+	if (SoundSystem::duh_player)
+	    al_poll_duh(SoundSystem::duh_player);
+	pthread_mutex_unlock(&SoundSystem::duh_player_mutex);
+	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+	usleep(10000);
+	pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
+    }
+    return NULL;
+}
+
 void SoundSystem::playMusic(int id, bool looped, float volume)
 {
+  stopMusic();
+  
   if ((!modules[id]) || (!loadFlag)) return;
 
-  int realVolume = (int)(masterVolume * musicVolume * volume * 256.0);
-
-  FMUSIC_SetMasterVolume(modules[id], realVolume);
-  FMUSIC_SetLooping(modules[id], looped);
-
-  if (!FMUSIC_PlaySong(modules[id]))
-    allegro_message("FMOD Error: %s %d", FMOD_ErrorString(FSOUND_GetError()), realVolume);
-
-  moduleAtVolume[id] = volume;
+  duh_player = al_start_duh(modules[id], 2, 0, musicVolume, 4096, 44100);
+  if (!looped)
+    dumb_it_set_loop_callback(
+      duh_get_it_sigrenderer(al_duh_get_sigrenderer(duh_player)),
+      dumb_it_callback_terminate, NULL);
+
+  if (pthread_create(&duh_player_thread, NULL,
+          duh_player_thread_function, NULL))
+  {
+    al_stop_duh(duh_player);
+    duh_player = NULL;
+  }
+}
+
+void SoundSystem::stopMusic()
+{
+    if (duh_player)
+    {
+        /* stop the player thread */
+        pthread_cancel(duh_player_thread);
+        pthread_join(duh_player_thread, NULL);
+        /* and clean up */
+        al_stop_duh(duh_player);
+        duh_player = NULL;
+    }
 }
 
 //  SOUND HANDLING
@@ -143,19 +205,9 @@
 {
   if ((!sounds[id]) || (!loadFlag)) return;
   if (!Settings::setting[SND_SFX]) return;
-
-  int realVolume = (int)(masterVolume * soundVolume * volume * 255.0);
-  int realFreq = (int)(44100.0 * freq);
-
-  int channel = FSOUND_PlaySoundEx(FSOUND_FREE, sounds[id], NULL, true);
-
-  if (channel == -1)
-    allegro_message("FMOD Error: %s", FMOD_ErrorString(FSOUND_GetError()));
-
-  FSOUND_SetPan(channel, pan);
-  FSOUND_SetFrequency(channel, realFreq);
-  FSOUND_SetVolume(channel, realVolume);
-  FSOUND_SetPaused(channel, false);
+  
+  play_sample(sounds[id], (int)(soundVolume * volume * 255.0), pan,
+    (int)(freq * 1000.0), 0);
 }
 
 /********************************/
@@ -163,13 +215,14 @@
 void SoundSystem::cutAllSounds()
 {
   if (!loadFlag) return;
-
-  FSOUND_StopSound(FSOUND_ALL);
+  
+  for (int i = 0; i < SND_MAX; i++)
+  {
+    if (sounds[i])
+      stop_sample(sounds[i]);
+  }
 }
 
 /*******************************************************************************/
 
 SoundSystem *soundSys;
-
-
-
diff -ur scorchwentbonkers.orig/src/sound/SoundSystem.h scorchwentbonkers/src/sound/SoundSystem.h
--- scorchwentbonkers.orig/src/sound/SoundSystem.h	2005-05-11 14:13:18.000000000 +0200
+++ scorchwentbonkers/src/sound/SoundSystem.h	2007-01-28 17:53:12.000000000 +0100
@@ -3,7 +3,10 @@
 
 /****************************************************************************/
 
-#include <fmod.h>
+#include <allegro.h>
+#include <aldumb.h>
+#include <unistd.h>
+#include <pthread.h>
 
 /****************************************************************************/
 
@@ -24,16 +27,20 @@
     
     // an array of all samples
 
-    static FSOUND_SAMPLE *sounds[SND_MAX];
-    static FMUSIC_MODULE *modules[MOD_MAX];
+    static SAMPLE *sounds[SND_MAX];
+    static DUH *modules[MOD_MAX];
 
     // volumes
 
     float soundVolume, musicVolume, masterVolume;
-    float moduleAtVolume[MOD_MAX];
-
+    
   public:
 
+    // dumb stuff, must be public and static for the thread function
+    static AL_DUH_PLAYER *duh_player;
+    static pthread_t duh_player_thread;
+    static pthread_mutex_t duh_player_mutex;
+
     // standard load-s and free-s
 
     static void loadAll();
@@ -49,6 +56,7 @@
 
     void playSound(int id, int pan = 128, float freq = 1.0, float volume = 1.0);
     void playMusic(int id, bool looped = true, float volume = 1.0);
+    void stopMusic();
     void cutAllSounds();
 
     // constructors and destructors
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin