void Game_System::BgmPlay(RPG::Music const& bgm) { RPG::Music previous_music = data.current_music; data.current_music = bgm; // (OFF) means play nothing // A Polish RPG Maker translation overtranslated the (OFF) reserved string. // This particular translation uses (Brak) in editor for these cases. // Because RPG_RT doesn't show warnings about audios not found, // theses strings are ignored to prevent filling the log. // Though RPG_RT plays files named (Brak) is still preferred to ignore it. if (!bgm.name.empty() && bgm.name != "(OFF)" && bgm.name != "(Brak)") { // Same music: Only adjust volume and speed if (previous_music.name == bgm.name) { if (previous_music.volume != bgm.volume) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Volume(bgm.volume); } } if (previous_music.tempo != bgm.tempo) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Pitch(bgm.tempo); } } } else { Audio().BGM_Stop(); bgm_pending = true; FileRequestAsync* request = AsyncHandler::RequestFile("Music", bgm.name); request->Bind(&Game_System::OnBgmReady); request->Start(); } } else { BgmStop(); } }
static void* bgmFunc(unsigned int command, void *data, int size) { int ch; // asm volatile( "break 1"); // PRINTF(( " bgmfunc %x, %x, %x, %x\n", *((int*)data + 0), // *((int*)data + 1), *((int*)data + 2),*((int*)data + 3) )); ch = command&0x000F; switch( command&0xFFF0 ) { case EzBGM_INIT: ret = BgmInit( ch, *((int*)data) ); break; case EzBGM_QUIT: BgmQuit ( ch, *((int*)data) ); break; case EzBGM_OPEN: ret = BgmOpen ( ch, (char*)((int*)data) ); break; case EzBGM_CLOSE: BgmClose( ch, *((int*)data) ); break; case EzBGM_CLOSE_NO_WAIT: BgmCloseNoWait( ch, *((int*)data) ); break; case EzBGM_PRELOAD: ret = BgmPreLoad ( ch, *((int*)data) ); break; case EzBGM_START: BgmStart( ch, *((int*)data) ); break; case EzBGM_STOP: BgmStop( ch, *((int*)data) ); break; case EzBGM_SEEK: BgmSeek( ch, (unsigned int)*((int*)data) ); break; case EzBGM_SETVOL: ret = BgmSetVolume( ch, (unsigned int)*((int*)data) ); break; case EzBGM_SETVOLDIRECT: ret = BgmSetVolumeDirect( ch, (unsigned int)*((int*)data) ); break; case EzBGM_GETMODE: ret = BgmGetMode( ch, *((int*)data) ); break; case EzBGM_SDINIT: BgmSdInit( ch, *((int*)data) ); break; default: ERROR(("EzBGM driver error: unknown command %d \n", *((int*)data) )); break; } // PRINTF(( "return value = %x \n", ret )); return (void*)(&ret); }
void Game_System::BgmPlay(RPG::Music const& bgm) { RPG::Music previous_music = data.current_music; data.current_music = bgm; // Validate if (bgm.volume < 0 || bgm.volume > 100) { data.current_music.volume = 100; Output::Debug("BGM %s has invalid volume %d", bgm.name.c_str(), bgm.volume); } if (bgm.fadein < 0 || bgm.fadein > 10000) { data.current_music.fadein = 0; Output::Debug("BGM %s has invalid fadein %d", bgm.name.c_str(), bgm.fadein); } if (bgm.tempo < 50 || bgm.tempo > 200) { data.current_music.tempo = 100; Output::Debug("BGM %s has invalid tempo %d", bgm.name.c_str(), bgm.tempo); } // (OFF) means play nothing if (!bgm.name.empty() && bgm.name != "(OFF)") { // Same music: Only adjust volume and speed if (!force_bgm_play && previous_music.name == bgm.name) { if (previous_music.volume != data.current_music.volume) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Volume(data.current_music.volume); } } if (previous_music.tempo != data.current_music.tempo) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Pitch(data.current_music.tempo); } } } else { Audio().BGM_Stop(); bgm_pending = true; FileRequestAsync* request = AsyncHandler::RequestFile("Music", bgm.name); music_request_id = request->Bind(&Game_System::OnBgmReady); request->Start(); } } else { BgmStop(); } force_bgm_play = false; }