Mercurial > otakunoraifu
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);