diff music2/music.cc @ 53:ddbcbd000206

* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons * ParseMoji moved to TextStream * Some cleaning (0 -> NULL when needed, removal of useless returns, ...)
author thib
date Sun, 19 Apr 2009 11:44:05 +0000
parents 15a18fbe6f21
children 4416cfac86ae
line wrap: on
line diff
--- a/music2/music.cc
+++ b/music2/music.cc
@@ -34,8 +34,8 @@
 #include <fcntl.h>
 #include <ctype.h>
 #include <signal.h>
-#include"system/system_config.h"
-#include"system/file.h"
+#include "system/system_config.h"
+#include "system/file.h"
 #include "music.h"
 #include <SDL.h>
 #include <SDL_mixer.h>
@@ -43,11 +43,27 @@
 
 using namespace std;
 
-int pcm_enable = 0;
-Mix_Chunk *play_chunk[MIX_PCM_SIZE];
+MuSys * MuSys::_singleton = NULL;
+
+MuSys* MuSys::GetInstance(void)
+{
+	if (_singleton == NULL)
+		_singleton = new MuSys;
+	return _singleton;
+}
 
-MuSys::MuSys(AyuSysConfig& _config) : config(_config), movie_id(-1), music_enable(1) {
+void MuSys::Quit(void)
+{
+	if (_singleton != NULL) {
+		_singleton->FinalizeMusic();
+		delete _singleton;
+		_singleton = NULL;
+	}
+}
+
+MuSys::MuSys() : movie_id(-1), music_enable(1) {
 	int i;
+	config = AyuSysConfig::GetInstance();
 	for (i=0; i<MIX_PCM_SIZE; i++)
 		play_chunk[i] = 0;
 	cdrom_track[0] = 0;
@@ -57,12 +73,12 @@ MuSys::MuSys(AyuSysConfig& _config) : co
 
 // #define delete fprintf(stderr,"smus.cc: %d.",__LINE__), delete
 
-void bgm_start(const char* path, int loop_pt, int * volmod);
-void effec_start(int chn, const char* path, int loop, int fadein_time, int * volmod);
+void bgm_start(const char* path, int loop_pt);
+void effec_start(int chn, const char* path, int loop, int fadein_time);
 void bgm_fadeout(int time);
 
 void MuSys::PlayCDROM(char* name, int play_count) {
-	config.GetParam("#VOLMOD", 4, &volmod[0], &volmod[1], &volmod[2], &volmod[3]);
+	config->GetParam("#VOLMOD", 4, &volmod[0], &volmod[1], &volmod[2], &volmod[3]);
 
 	char wave[128];
 	wave[127] = '\0';
@@ -74,9 +90,10 @@ void MuSys::PlayCDROM(char* name, int pl
 	strcpy(cdrom_track, name);
 
 	/* name -> track */
-	int track =config.track_name.CDTrack(name);
+	int track =config->track_name.CDTrack(name);
 	if (track == -1) track = atoi(name);
-	if (config.track_name.WaveTrack(name) != NULL) strncpy(wave, config.track_name.WaveTrack(name), 127);
+	if (config->track_name.WaveTrack(name) != NULL)
+		strncpy(wave, config->track_name.WaveTrack(name), 127);
 	if (wave[0] == 0 && track != 0) { /* DSTRACK が見つからない場合、CDTRACKを使用する */
 		sprintf(wave, "audio_%02d", track);
 	}
@@ -84,9 +101,9 @@ void MuSys::PlayCDROM(char* name, int pl
 	// BGM 再生
 	if (!pcm_enable) return;
 	if (play_count == 0)
-		bgm_start(wave, -1, volmod);
+		bgm_start(wave, -1);
 	else
-		bgm_start(wave, config.track_name.TrackStart(name), volmod);
+		bgm_start(wave, config->track_name.TrackStart(name));
 	return;
 }
 
@@ -100,16 +117,16 @@ void MuSys::StopCDROM(int time)
 void MuSys::PlaySE(const char* se, int loop_flag, int channel) {
 	if (!pcm_enable) return;
 	if (loop_flag)
-		effec_start(MIX_PCM_EFFEC, se, 10000, 0, volmod);
+		effec_start(MIX_PCM_EFFEC, se, 10000, 0);
 	else
-		effec_start(MIX_PCM_EFFEC, se, 0, 0, volmod);
+		effec_start(MIX_PCM_EFFEC, se, 0, 0);
 	return;
 }
 void MuSys::PlaySE(int number) {
 	if (! pcm_enable) return;
-	const char* se_name = config.track_name.SETrack(number);
+	const char* se_name = config->track_name.SETrack(number);
 	if (se_name == NULL) return;
-	effec_start(MIX_PCM_EFFEC, se_name, 0, 0, volmod);
+	effec_start(MIX_PCM_EFFEC, se_name, 0, 0);
 	return;
 }
 void MuSys::StopSE(int time) {
@@ -148,8 +165,8 @@ void MuSys::InitMusic(void)
 	pcm_enable = 1;
 	Mix_AllocateChannels( MIX_PCM_SIZE);
 	music_enable = 2;
-	return;
 }
+
 void MuSys::FinalizeMusic(void)
 {
 	if (music_enable != 2) return;
@@ -235,8 +252,10 @@ void bgm_fadeout(int time) {
 
 static SDL_RWops* OpenSDLRW(const char* path);
 static WAVFILE* OpenWaveFile(const char* path);
-void bgm_start(const char* path, int loop_pt, int * volmod) {
-	if (! pcm_enable) return;
+void bgm_start(const char* path, int loop_pt) {
+	MuSys* mu = MuSys::GetInstance();
+
+	if (!mu->pcm_enable) return;
 fprintf(stderr,"bgm start %s\n",path);
 	WAVFILE* wav = OpenWaveFile(path);
 	if (wav == NULL) return;
@@ -250,35 +269,41 @@ fprintf(stderr,"bgm start %s\n",path);
 	}
 	wav_playing.wav = wav;
 	wav_playing.loop_pt = loop_pt;
-	wav_playing.volmod = &volmod[0];
+	wav_playing.volmod = mu->volmod;
 	fadetime_total = 0;
 	fadecount = 0;
 	Mix_HookMusic( &(WavChunk::callback), (void*)&wav_playing);
 }
 
-void effec_start(int chn, const char* path, int loop, int fadein_time, int * volmod) {
-	if (! pcm_enable) return;
+void effec_start(int chn, const char* path, int loop, int fadein_time) {
+	MuSys* mu = MuSys::GetInstance();
+
+	if (!mu->pcm_enable) return;
+
 	SDL_RWops* op = OpenSDLRW(path);
 	if (op == NULL) { // ファイルが見付からない
 		return;
 	}
 	Mix_Pause(chn);
 
-	if (play_chunk[chn]) {
-		Mix_FreeChunk(play_chunk[chn]);
+	if (mu->play_chunk[chn] != NULL) {
+		Mix_FreeChunk(mu->play_chunk[chn]);
 	}
-	play_chunk[chn] = Mix_LoadWAV_RW(op, 1);
+	mu->play_chunk[chn] = Mix_LoadWAV_RW(op, 1);
 	if (fadein_time <= 0) {
-		Mix_Volume(chn, volmod[3]*SDL_MIX_MAXVOLUME/255);
-		Mix_PlayChannel(chn, play_chunk[chn], loop);
+		Mix_Volume(chn, mu->volmod[3]*SDL_MIX_MAXVOLUME/255);
+		Mix_PlayChannel(chn, mu->play_chunk[chn], loop);
 	} else {
-		Mix_Volume(chn, volmod[3]*SDL_MIX_MAXVOLUME/255);
-		Mix_FadeInChannel(chn, play_chunk[chn], loop, fadein_time);
+		Mix_Volume(chn, mu->volmod[3]*SDL_MIX_MAXVOLUME/255);
+		Mix_FadeInChannel(chn, mu->play_chunk[chn], loop, fadein_time);
 	}
 }
 
 void MuSys::PlayKoe(const char* path) {
 	if (!pcm_enable) return;
+
+	MuSys* mu = MuSys::GetInstance();
+
 	static char* playing_koedata = NULL;
 	int len = 0;
 	AvgKoeInfo koeinfo;
@@ -286,14 +311,14 @@ void MuSys::PlayKoe(const char* path) {
 
 	Mix_Pause(chn);
 	Mix_HaltChannel(chn); // これで RWop が解放されるはず…
-	if (play_chunk[chn]) {
-		Mix_FreeChunk(play_chunk[chn]);
-		play_chunk[chn] = 0;
+	if (mu->play_chunk[chn] != NULL) {
+		Mix_FreeChunk(mu->play_chunk[chn]);
+		mu->play_chunk[chn] = NULL;
 	}
 
-	if (playing_koedata) {
+	if (playing_koedata != NULL) {
 		free(playing_koedata);
-		playing_koedata = 0;
+		playing_koedata = NULL;
 	}
 
 	koeinfo = OpenKoeFile(path);
@@ -304,9 +329,9 @@ void MuSys::PlayKoe(const char* path) {
 	if (playing_koedata == NULL) {
 		return;
 	}
-	Mix_Volume(chn, volmod[1]*SDL_MIX_MAXVOLUME/255);
-	play_chunk[chn] = Mix_LoadWAV_RW(SDL_RWFromMem(playing_koedata, len+0x2c), 1);
-	Mix_PlayChannel(chn, play_chunk[chn], 0);
+	Mix_Volume(chn, mu->volmod[1]*SDL_MIX_MAXVOLUME/255);
+	mu->play_chunk[chn] = Mix_LoadWAV_RW(SDL_RWFromMem(playing_koedata, len+0x2c), 1);
+	Mix_PlayChannel(chn, mu->play_chunk[chn], 0);
 }
 
 AvgKoeInfo OpenKoeFile(const char* path) {
@@ -324,7 +349,7 @@ AvgKoeInfo OpenKoeFile(const char* path)
 		info = FindKoe(file_no, index);
 	} else { // ファイル
 		int length;
-		ARCINFO* arcinfo = file_searcher.Find(FILESEARCH::KOE, path, ".WPD");
+		ARCINFO* arcinfo = FileSearcher::GetInstance()->Find(FileSearcher::KOE, path, ".WPD");
 		if (arcinfo == NULL) return info;
 		info.stream = arcinfo->OpenFile(&length);
 		info.rate = 22050;
@@ -338,10 +363,11 @@ AvgKoeInfo OpenKoeFile(const char* path)
 
 static SDL_RWops* OpenSDLRW(const char* path) {
 	/* まず wav ファイルを探す */
-	ARCINFO* info = file_searcher.Find(FILESEARCH::WAV, path, ".wav");
+	FileSearcher* file_searcher = FileSearcher::GetInstance();
+	ARCINFO* info = file_searcher->Find(FileSearcher::WAV, path, ".wav");
 	if (info == NULL) {
-		info = file_searcher.Find(FILESEARCH::WAV, path, ".nwa");
-		if (info == NULL) info = file_searcher.Find(FILESEARCH::BGM, path, "nwa");
+		info = file_searcher->Find(FileSearcher::WAV, path, ".nwa");
+		if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "nwa");
 		if (info != NULL) { // read NWA file
 			int dummy;
 			FILE* f = info->OpenFile(&dummy);
@@ -352,8 +378,8 @@ static SDL_RWops* OpenSDLRW(const char* 
 			return SDL_RWFromMem(d, sz);
 		}
 	}
-	if (info == NULL) info = file_searcher.Find(FILESEARCH::BGM, path, "wav");
-	if (info == NULL) info = file_searcher.Find(FILESEARCH::WAV, path, ".ogg");
+	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "wav");
+	if (info == NULL) info = file_searcher->Find(FileSearcher::WAV, path, ".ogg");
 	if (info != NULL) {
 		int dummy;
 		FILE* f = info->OpenFile(&dummy);
@@ -367,8 +393,9 @@ static SDL_RWops* OpenSDLRW(const char* 
 
 static WAVFILE* OpenWaveFile(const char* path) {
 	/* まず wav ファイルを探す */
-	ARCINFO* info = file_searcher.Find(FILESEARCH::WAV, path, ".wav");
-	if (info == NULL) info = file_searcher.Find(FILESEARCH::BGM, path, "wav");
+	FileSearcher* file_searcher = FileSearcher::GetInstance();
+	ARCINFO* info = file_searcher->Find(FileSearcher::WAV, path, ".wav");
+	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "wav");
 	if (info != NULL) {
 		int size;
 		FILE* f = info->OpenFile(&size);
@@ -378,8 +405,8 @@ static WAVFILE* OpenWaveFile(const char*
 		return w;
 	}
 	/* 次に nwa ファイル */
-	info = file_searcher.Find(FILESEARCH::WAV, path, ".nwa");
-	if (info == NULL) info = file_searcher.Find(FILESEARCH::BGM, path, "nwa");
+	info = file_searcher->Find(FileSearcher::WAV, path, ".nwa");
+	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "nwa");
 	if (info != NULL) {
 		int size;
 		FILE* f = info->OpenFile(&size);
@@ -390,8 +417,8 @@ static WAVFILE* OpenWaveFile(const char*
 	}
 
 	/* 次に mp3 ファイル */
-	info = file_searcher.Find(FILESEARCH::WAV, path, ".mp3");
-	if (info == NULL) info = file_searcher.Find(FILESEARCH::BGM, path, "mp3");
+	info = file_searcher->Find(FileSearcher::WAV, path, ".mp3");
+	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "mp3");
 	if (info != NULL) {
 		int size;
 		FILE* f = info->OpenFile(&size);
@@ -405,8 +432,8 @@ static WAVFILE* OpenWaveFile(const char*
 	}
 
 	/* 次に ogg ファイル */
-	info = file_searcher.Find(FILESEARCH::WAV, path, ".ogg");
-	if (info == NULL) info = file_searcher.Find(FILESEARCH::BGM, path, "ogg");
+	info = file_searcher->Find(FileSearcher::WAV, path, ".ogg");
+	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "ogg");
 	if (info != NULL) {
 		int size;
 		FILE* f = info->OpenFile(&size);