diff --git a/source/gui/WiiMovie.cpp b/source/gui/WiiMovie.cpp index b43294a2..d093411c 100644 --- a/source/gui/WiiMovie.cpp +++ b/source/gui/WiiMovie.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2010 - * by Dimok + * Copyright (C) 2010 by Dimok + * (C) 2014 by FIX94 * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any @@ -31,36 +31,42 @@ #include "gecko/gecko.hpp" WiiMovie movie; - void WiiMovie::Init(const char *filepath) { + Frame = NULL; + BufferPos = 0; + Buffer[0].thread = false; + Buffer[1].thread = false; VideoFrameCount = 0; fps = 0.0f; ExitRequested = false; Playing = false; ThreadStack = NULL; - rendered = false; - gprintf("Opening video '%s'\n", filepath); + //gprintf("Opening video '%s'\n", filepath); ReadThread = LWP_THREAD_NULL; vFile = fopen(filepath, "rb"); if(!vFile) { - gprintf("Open video failed\n"); + //gprintf("Open video failed\n"); ExitRequested = true; return; } if(Video.Init(vFile) == false) { - gprintf("Memory Allocation failed\n"); + //gprintf("Memory Allocation failed\n"); ExitRequested = true; return; } fps = Video.getFps(); + inited = true; } void WiiMovie::DeInit() { - gprintf("Destructing WiiMovie object\n"); + if(inited == false) + return; + inited = false; + //gprintf("Destructing WiiMovie object\n"); Playing = false; ExitRequested = true; @@ -81,9 +87,15 @@ void WiiMovie::DeInit() if(vFile != NULL) fclose(vFile); vFile = NULL; + Frame = NULL; + TexHandle.Cleanup(Buffer[0]); + TexHandle.Cleanup(Buffer[1]); + Buffer[0].thread = false; + Buffer[1].thread = false; + BufferPos = 0; } -bool WiiMovie::Play(TexData *Background, bool loop) +bool WiiMovie::Play(bool loop) { if(!vFile) return false; @@ -92,21 +104,20 @@ bool WiiMovie::Play(TexData *Background, bool loop) if(!ThreadStack) return false; - gprintf("Start playing video\n"); + //gprintf("Start playing video\n"); Video.loop = loop; - Frame = Background; - rendered = true; PlayTime.reset(); Playing = true; - - LWP_CreateThread(&ReadThread, UpdateThread, this, ThreadStack, 32768, LWP_PRIO_HIGHEST); - gprintf("Reading frames thread started\n"); + Buffer[0].thread = false; + Buffer[1].thread = false; + LWP_CreateThread(&ReadThread, UpdateThread, this, ThreadStack, 32768, 60); + //gprintf("Reading frames thread started\n"); return true; } void WiiMovie::Stop() { - gprintf("Stopping WiiMovie video\n"); + //gprintf("Stopping WiiMovie video\n"); ExitRequested = true; } @@ -116,9 +127,13 @@ void * WiiMovie::UpdateThread(void *arg) while(!movie->ExitRequested) { movie->ReadNextFrame(); - if(movie->rendered == true) + if(movie->Buffer[movie->BufferPos].thread == false) movie->LoadNextFrame(); - usleep(100); + else if(movie->Frame->thread == false) + { + movie->Frame = &movie->Buffer[movie->BufferPos]; + movie->BufferPos ^= 1; + } } return NULL; } @@ -144,14 +159,19 @@ void WiiMovie::LoadNextFrame() if(!VideoF.getData()) return; - if(TexHandle.fromTHP(Frame, VideoF.getData(), VideoF.getWidth(), VideoF.getHeight()) == TE_OK) - rendered = false; + TexData *CurFrame = &Buffer[BufferPos]; + if(TexHandle.fromTHP(CurFrame, VideoF.getData(), VideoF.getWidth(), VideoF.getHeight()) == TE_OK) + { + CurFrame->thread = true; + Frame = CurFrame; + BufferPos ^= 1; + } VideoF.dealloc(); } bool WiiMovie::Continue() { - if(!vFile || !Playing || Frame->data == NULL) + if(!vFile || !Playing) return false; return true; } diff --git a/source/gui/WiiMovie.hpp b/source/gui/WiiMovie.hpp index 43597bb4..80319ab7 100644 --- a/source/gui/WiiMovie.hpp +++ b/source/gui/WiiMovie.hpp @@ -10,13 +10,16 @@ using namespace std; class WiiMovie { public: + WiiMovie() { inited = false; }; void Init(const char * filepath); void DeInit(); - bool Play(TexData *Background, bool loop = false); + bool Play(bool loop = false); void Stop(); bool Continue(); volatile bool loaded; - volatile bool rendered; + TexData *Frame; //our current texture + TexData Buffer[2]; + u8 BufferPos; protected: static void * UpdateThread(void *arg); void FrameLoadLoop(); @@ -31,11 +34,21 @@ protected: float fps; Timer PlayTime; u32 VideoFrameCount; - TexData *Frame; bool Playing; bool ExitRequested; + bool inited; }; +struct movieP +{ + float x1; + float y1; + float x2; + float y2; +}; +extern struct movieP normalMoviePos; +extern struct movieP zoomedMoviePos; +extern struct movieP currentMoviePos; extern WiiMovie movie; #endif diff --git a/source/gui/coverflow.cpp b/source/gui/coverflow.cpp index 773e8a6d..59aa394c 100644 --- a/source/gui/coverflow.cpp +++ b/source/gui/coverflow.cpp @@ -2651,19 +2651,17 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover) if(menuPath != NULL && strrchr(menuPath, '/') != NULL) gamePath = strrchr(menuPath, '/') + 1; } - else if(NoGameID(m_items[i].hdr->type)) - { - if(m_pluginCacheFolders && m_items[i].hdr->type == TYPE_PLUGIN) - coverDir = m_plugin.GetCoverFolderName(m_items[i].hdr->settings[0]); - if(m_items[i].hdr->type == TYPE_SOURCE) - coverDir = "sourceflow"; - if(strrchr(m_items[i].hdr->path, '/') != NULL) - gamePath = strrchr(m_items[i].hdr->path, '/') + 1; - else - gamePath = m_items[i].hdr->path; - } else - gamePath = m_items[i].hdr->id; + { + gamePath = getPathId(m_items[i].hdr); + if(NoGameID(m_items[i].hdr->type)) + { + if(m_pluginCacheFolders && m_items[i].hdr->type == TYPE_PLUGIN) + coverDir = m_plugin.GetCoverFolderName(m_items[i].hdr->settings[0]); + if(m_items[i].hdr->type == TYPE_SOURCE) + coverDir = "sourceflow"; + } + } FILE *file = NULL; if(gamePath != NULL) @@ -2763,6 +2761,21 @@ void CCoverFlow::_dropHQLOD(int i) m_items[i].texture = newTex; } +const char *CCoverFlow::getPathId(const dir_discHdr *curHdr) +{ + const char *gamePath = NULL; + if(NoGameID(curHdr->type)) + { + if(strrchr(curHdr->path, '/') != NULL) + gamePath = strrchr(curHdr->path, '/') + 1; + else + gamePath = curHdr->path; + } + else + gamePath = curHdr->id; + return gamePath; +} + CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blankBoxCover) { if (!m_loadingCovers) @@ -2781,20 +2794,18 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank if(menuPath != NULL && strrchr(menuPath, '/') != NULL) gamePath = strrchr(menuPath, '/') + 1; } - else if(NoGameID(m_items[i].hdr->type)) - { - if(m_pluginCacheFolders && m_items[i].hdr->type == TYPE_PLUGIN) - coverDir = m_plugin.GetCoverFolderName(m_items[i].hdr->settings[0]); - if(m_items[i].hdr->type == TYPE_SOURCE) - coverDir = "sourceflow"; - if(strrchr(m_items[i].hdr->path, '/') != NULL) - gamePath = strrchr(m_items[i].hdr->path, '/') + 1; - else - gamePath = m_items[i].hdr->path; - } else - gamePath = m_items[i].hdr->id; - + { + gamePath = getPathId(m_items[i].hdr); + if(NoGameID(m_items[i].hdr->type)) + { + if(m_pluginCacheFolders && m_items[i].hdr->type == TYPE_PLUGIN) + coverDir = m_plugin.GetCoverFolderName(m_items[i].hdr->settings[0]); + if(m_items[i].hdr->type == TYPE_SOURCE) + coverDir = "sourceflow"; + } + } + FILE *fp = NULL; if(gamePath != NULL) { diff --git a/source/gui/coverflow.hpp b/source/gui/coverflow.hpp index 83572663..5092993b 100644 --- a/source/gui/coverflow.hpp +++ b/source/gui/coverflow.hpp @@ -134,6 +134,7 @@ public: const dir_discHdr * getSpecificHdr(u32) const; wstringEx getTitle(void) const; u64 getChanTitle(void) const; + const char *getPathId(const dir_discHdr *curHdr); // bool getRenderTex(void); void setRenderTex(bool); diff --git a/source/gui/video.cpp b/source/gui/video.cpp index 8b465488..c570712b 100644 --- a/source/gui/video.cpp +++ b/source/gui/video.cpp @@ -7,6 +7,7 @@ #include "video.hpp" #include "pngu.h" #include "hw/Gekko.h" +#include "WiiMovie.hpp" #include "gecko/gecko.hpp" #include "loader/sys.h" #include "loader/utils.h" @@ -78,6 +79,10 @@ const float CVideo::_jitter8[8][2] = { { 0.164216f, -0.054399f } }; +struct movieP normalMoviePos = { 410, 31, 610, 181 }; +struct movieP zoomedMoviePos = { 0, 0, 640, 480 }; +struct movieP currentMoviePos = normalMoviePos; + const int CVideo::_stencilWidth = 128; const int CVideo::_stencilHeight = 128; @@ -747,6 +752,41 @@ void DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color) GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); } +void DrawTexturePos(const TexData *tex) +{ + Mtx modelViewMtx; + GXTexObj texObj; + + GX_ClearVtxDesc(); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_F32, 0); + GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GX_SetNumTexGens(1); + GX_SetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC); + GX_SetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); + GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GX_SetBlendMode(GX_BM_NONE, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); + GX_SetAlphaUpdate(GX_FALSE); + GX_SetCullMode(GX_CULL_NONE); + GX_SetZMode(GX_DISABLE, GX_ALWAYS, GX_FALSE); + guMtxIdentity(modelViewMtx); + GX_LoadPosMtxImm(modelViewMtx, GX_PNMTX0); + GX_InitTexObj(&texObj, tex->data, tex->width, tex->height, tex->format, GX_CLAMP, GX_CLAMP, GX_FALSE); + GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_Begin(GX_QUADS, GX_VTXFMT0, 4); + GX_Position2f32(currentMoviePos.x1, currentMoviePos.y1); + GX_TexCoord2f32(0.f, 0.f); + GX_Position2f32(currentMoviePos.x2, currentMoviePos.y1); + GX_TexCoord2f32(1.f, 0.f); + GX_Position2f32(currentMoviePos.x2, currentMoviePos.y2); + GX_TexCoord2f32(1.f, 1.f); + GX_Position2f32(currentMoviePos.x1, currentMoviePos.y2); + GX_TexCoord2f32(0.f, 1.f); + GX_End(); +} + void CVideo::screensaver(u32 no_input, u32 max_no_input) { if(no_input == 0) diff --git a/source/gui/video.hpp b/source/gui/video.hpp index 3abc0aef..32987613 100644 --- a/source/gui/video.hpp +++ b/source/gui/video.hpp @@ -126,6 +126,7 @@ private: }; void DrawTexture(TexData * &tex); +void DrawTexturePos(const TexData *tex); void DrawRectangle(f32 x, f32 y, f32 width, f32 height, GXColor color); extern CVideo m_vid; diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index 8970824d..e245c63f 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -16,6 +16,7 @@ #include "gc/gc.hpp" #include "hw/Gekko.h" #include "gui/GameTDB.hpp" +#include "gui/WiiMovie.hpp" #include "loader/alt_ios.h" #include "loader/cios.h" #include "loader/fs.h" @@ -1959,11 +1960,21 @@ void CMenu::_mainLoopCommon(bool withCF, bool adjusting) CoverFlow.drawText(adjusting); } } - if(m_fa.isLoaded()) - m_fa.draw(); - else if(m_banner.GetSelectedGame() && (!m_banner.GetInGameSettings() || (m_banner.GetInGameSettings() && m_bnr_settings))) - m_banner.Draw(); - + if(m_gameSelected) + { + if(m_fa.isLoaded()) + m_fa.draw(); + else if(m_video_playing) + { + if(movie.Frame != NULL) + { + DrawTexturePos(movie.Frame); + movie.Frame->thread = false; + } + } + else if(m_banner.GetSelectedGame() && (!m_banner.GetInGameSettings() || (m_banner.GetInGameSettings() && m_bnr_settings))) + m_banner.Draw(); + } m_btnMgr.draw(); ScanInput(); if(!m_vid.showingWaitMessage()) @@ -2033,7 +2044,7 @@ void CMenu::_mainLoopCommon(bool withCF, bool adjusting) { mem2old = mem2; gprintf("Mem2 Free: %u\n", mem2); - } + } #endif } diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index e0627c0e..12ddf365 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -1088,6 +1088,9 @@ public: u64 m_thrdTotal; void update_pThread(u64 added); private: + void _cleanupBanner(bool gamechange = false); + void _cleanupVideo(); + bool _startVideo(); static int _pThread(void *obj); void _start_pThread(void); void _stop_pThread(void); diff --git a/source/menu/menu_game.cpp b/source/menu/menu_game.cpp index fac308c3..c3483fb5 100644 --- a/source/menu/menu_game.cpp +++ b/source/menu/menu_game.cpp @@ -283,6 +283,7 @@ static u8 GetRequestedGameIOS(dir_discHdr *hdr) void CMenu::_hideGame(bool instant) { m_gameSelected = false; + _cleanupVideo(); m_fa.unload(); CoverFlow.showCover(); m_btnMgr.hide(m_gameBtnPlay, instant); @@ -347,40 +348,88 @@ static void setLanguage(int l) configbytes[0] = 0xCD; } +void CMenu::_cleanupBanner(bool gamechange) +{ + //banner + m_gameSound.FreeMemory(); + CheckGameSoundThread(); + m_banner.DeleteBanner(gamechange); + //movie + _cleanupVideo(); + //fanart + m_fa.unload(); +} + +void CMenu::_cleanupVideo() +{ + m_video_playing = false; + movie.DeInit(); +} + +bool CMenu::_startVideo() +{ + char curId3[4]; + memset(curId3, 0, 4); + const char *videoId = CoverFlow.getPathId(CoverFlow.getHdr()); + if(!NoGameID(CoverFlow.getHdr()->type)) + { //id3 + memcpy(curId3, CoverFlow.getId(), 3); + videoId = curId3; + } + const char *videoPath = fmt("%s/%s.thp", m_videoDir.c_str(), videoId); + if(fsop_FileExist(videoPath)) + { + m_gameSound.Stop(); + MusicPlayer.Stop(); + m_banner.SetShowBanner(false); + /* Lets play the movie */ + movie.Init(videoPath); + m_gameSound.Load(fmt("%s/%s.ogg", m_videoDir.c_str(), videoId)); + m_gameSound.SetVolume(m_cfg.getInt("GENERAL", "sound_volume_bnr", 255)); + m_video_playing = true; + m_gameSound.Play(); + movie.Play(true); //video loops sound doesnt + return true; + } + return false; +} + void CMenu::_game(bool launch) { m_gcfg1.load(fmt("%s/" GAME_SETTINGS1_FILENAME, m_settingsDir.c_str())); - m_zoom_banner = m_cfg.getBool(_domainFromView(), "show_full_banner", false) && !NoGameID(CoverFlow.getHdr()->type); + m_zoom_banner = m_cfg.getBool(_domainFromView(), "show_full_banner", false); + if(NoGameID(CoverFlow.getHdr()->type)) + { + m_zoom_banner = m_zoom_banner && fsop_FileExist(fmt("%s/%s.thp", m_videoDir.c_str(), CoverFlow.getPathId(CoverFlow.getHdr()))); + m_cfg.setBool(_domainFromView(), "show_full_banner", m_zoom_banner); + } + currentMoviePos = (m_zoom_banner ? zoomedMoviePos : normalMoviePos); + if(m_banner.GetZoomSetting() != m_zoom_banner) + m_banner.ToogleZoom(); + if(!launch) { SetupInput(); - _playGameSound(); _showGame(); m_gameSelected = true; + _playGameSound(); } - if(m_banner.GetZoomSetting() != m_zoom_banner) - m_banner.ToogleZoom(); - s8 startGameSound = 1; while(!m_exit) { if(startGameSound < 1) startGameSound++; - u64 chantitle = CoverFlow.getChanTitle(); - if(startGameSound == -5) - { - _playGameSound(); _showGame(); - } _mainLoopCommon(true); if(startGameSound == 0) { m_gameSelected = true; startGameSound = 1; + _playGameSound(); } if(BTN_B_PRESSED && !m_locked && (m_btnMgr.selected(m_gameBtnFavoriteOn) || m_btnMgr.selected(m_gameBtnFavoriteOff))) { @@ -395,9 +444,7 @@ void CMenu::_game(bool launch) } if(BTN_HOME_PRESSED || BTN_B_PRESSED) { - m_gameSound.FreeMemory(); - CheckGameSoundThread(); - m_banner.DeleteBanner(); + _cleanupBanner(); break; } else if(BTN_PLUS_PRESSED && m_GameTDBLoaded && (CoverFlow.getHdr()->type == TYPE_WII_GAME || CoverFlow.getHdr()->type == TYPE_GC_GAME || CoverFlow.getHdr()->type == TYPE_CHANNEL)) @@ -413,53 +460,17 @@ void CMenu::_game(bool launch) } else if(BTN_MINUS_PRESSED) { - const char *videoPath = fmt("%s/%.3s.thp", m_videoDir.c_str(), CoverFlow.getId()); - if(fsop_FileExist(videoPath)) + if(m_video_playing) { - GuiSound OggFile; - m_gameSound.Stop(); - MusicPlayer.Stop(); - m_banner.SetShowBanner(false); - _hideGame(); - /* Set Background empty */ - TexData EmptyBG; - _setBg(EmptyBG, EmptyBG); - /* Lets play the movie */ - movie.Init(videoPath); - OggFile.Load(fmt("%s/%.3s.ogg", m_videoDir.c_str(), CoverFlow.getId())); - OggFile.SetVolume(m_cfg.getInt("GENERAL", "sound_volume_bnr", 255)); - m_video_playing = true; - m_banner.ReSetup_GX(); - m_vid.setup2DProjection(); - OggFile.Play(); - movie.Play(&m_curBg); - while(!BTN_B_PRESSED && !BTN_A_PRESSED && !BTN_HOME_PRESSED && movie.Continue() == true) - { - /* Draw movie BG and render */ - if(movie.rendered == false) - { - _drawBg(); - m_vid.render(); - movie.rendered = true; - } - /* Check if we want to stop */ - WPAD_ScanPads(); - PAD_ScanPads(); - ButtonsPressed(); - } - movie.DeInit(); - OggFile.FreeMemory(); - TexHandle.Cleanup(m_curBg); - /* Finished, so lets re-setup the background */ - _setBg(m_gameBg, m_gameBgLQ); - _updateBg(); - /* Get back into our coverflow */ - _showGame(); m_video_playing = false; + movie.DeInit(); + m_gameSound.FreeMemory(); m_banner.SetShowBanner(true); - if(!m_gameSound.IsPlaying()) + if(!m_gameSound.IsPlaying()) startGameSound = -6; } + else + _startVideo(); } else if((BTN_1_PRESSED) || (BTN_2_PRESSED)) { @@ -482,9 +493,7 @@ void CMenu::_game(bool launch) m_banner.SetShowBanner(false); if(_wbfsOp(WO_REMOVE_GAME)) { - m_gameSound.FreeMemory(); - CheckGameSoundThread(); - m_banner.DeleteBanner(); + _cleanupBanner(); break; } m_banner.SetShowBanner(true); @@ -499,15 +508,15 @@ void CMenu::_game(bool launch) m_gcfg1.setBool("ADULTONLY", _getId(), !m_gcfg1.getBool("ADULTONLY", _getId(), false)); else if(m_btnMgr.selected(m_gameBtnBack) || m_btnMgr.selected(m_gameBtnBackFull)) { - m_gameSound.FreeMemory(); - CheckGameSoundThread(); - m_banner.DeleteBanner(); + _cleanupBanner(); break; } - else if((m_btnMgr.selected(m_gameBtnToogle) || m_btnMgr.selected(m_gameBtnToogleFull)) && !NoGameID(CoverFlow.getHdr()->type)) + else if((m_btnMgr.selected(m_gameBtnToogle) || m_btnMgr.selected(m_gameBtnToogleFull)) + && (!NoGameID(CoverFlow.getHdr()->type) || m_video_playing)) { m_zoom_banner = m_banner.ToogleZoom(); m_cfg.setBool(_domainFromView(), "show_full_banner", m_zoom_banner); + currentMoviePos = (m_zoom_banner ? zoomedMoviePos : normalMoviePos); m_show_zone_game = false; m_btnMgr.hide(m_gameBtnPlayFull); m_btnMgr.hide(m_gameBtnBackFull); @@ -530,9 +539,7 @@ void CMenu::_game(bool launch) { _hideGame(); MusicPlayer.Stop(); - m_gameSound.FreeMemory(); - CheckGameSoundThread(); - m_banner.DeleteBanner(); + _cleanupBanner(); dir_discHdr *hdr = (dir_discHdr*)MEM2_alloc(sizeof(dir_discHdr)); memcpy(hdr, CoverFlow.getHdr(), sizeof(dir_discHdr)); m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str())); @@ -569,7 +576,10 @@ void CMenu::_game(bool launch) /* Get Banner Title for Playlog */ CurrentBanner.ClearBanner(); if(hdr->type == TYPE_CHANNEL) + { + u64 chantitle = CoverFlow.getChanTitle(); _extractChannelBnr(chantitle); + } else if(hdr->type == TYPE_WII_GAME) _extractBnr(hdr); if(CurrentBanner.IsValid()) @@ -607,38 +617,31 @@ void CMenu::_game(bool launch) } if((startGameSound == 1 || startGameSound < -8) && (BTN_UP_REPEAT || RIGHT_STICK_UP)) { - if(m_gameSoundThread != LWP_THREAD_NULL) - CheckGameSoundThread(); + _cleanupBanner(true); CoverFlow.up(); startGameSound = -10; } if((startGameSound == 1 || startGameSound < -8) && (BTN_RIGHT_REPEAT || RIGHT_STICK_RIGHT)) { - if(m_gameSoundThread != LWP_THREAD_NULL) - CheckGameSoundThread(); + _cleanupBanner(true); CoverFlow.right(); startGameSound = -10; } if((startGameSound == 1 || startGameSound < -8) && (BTN_DOWN_REPEAT || RIGHT_STICK_DOWN)) { - if(m_gameSoundThread != LWP_THREAD_NULL) - CheckGameSoundThread(); + _cleanupBanner(true); CoverFlow.down(); startGameSound = -10; } if((startGameSound == 1 || startGameSound < -8) && (BTN_LEFT_REPEAT || RIGHT_STICK_LEFT)) { - if(m_gameSoundThread != LWP_THREAD_NULL) - CheckGameSoundThread(); + _cleanupBanner(true); CoverFlow.left(); startGameSound = -10; } if(startGameSound == -10) { - m_gameSound.Stop(); m_gameSelected = false; - m_fa.unload(); - m_banner.DeleteBanner(true); _setBg(m_gameBg, m_gameBgLQ); } if(m_show_zone_game && !m_zoom_banner) @@ -1746,6 +1749,17 @@ u8 *GameSoundStack = NULL; u32 GameSoundSize = 0x10000; //64kb void CMenu::_playGameSound(void) { + if(NoGameID(CoverFlow.getHdr()->type)) + { + if(_startVideo()) + return; + if(m_zoom_banner == true) + { + m_zoom_banner = m_banner.ToogleZoom(); + m_cfg.setBool(_domainFromView(), "show_full_banner", m_zoom_banner); + currentMoviePos = normalMoviePos; + } + } m_gamesound_changed = false; if(m_bnrSndVol == 0) return;