/*---------------------------------------------------------------------------* Project: THP Player File: main.c Copyright (C)2002-2006 Nintendo All Rights Reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Log: main.c,v $ Revision 1.2 2006/03/06 09:59:05 kawaset Eliminated warnings. Revision 1.1 02/03/2006 10:01:41 aka Imported from Dolphin tree. 4 03/11/25 11:24 Dante Japanese to English translation of comments and text strings 3 02/05/14 9:08a Suzuki supported multi audio track 2 02/02/28 6:36p Akagi enabled to use with MusyX/AX by Suzuki-san (IRD). 1 02/01/16 10:52a Akagi Initial revision made by Suzuki-san (IRD). $NoKeywords: $ *---------------------------------------------------------------------------*/ #include #include #include #ifdef HOLLYWOOD_REV #include #endif #include "axseq.h" #include "THPPlayer.h" static void MovieDoneRender(void); #ifdef HOLLYWOOD_REV MEMHeapHandle __ExpHeap; #endif void main(void) { u32 size, x, y; u8 *buffer; GXRenderModeObj *rmode; GXColor black; THPVideoInfo videoInfo; THPAudioInfo audioInfo; s32 frame, vol, audioTrack; u16 buttonDown, button, dir; char *fileName; BOOL open, play, onMemory; #ifdef HOLLYWOOD_REV void *arenaMem2Lo; void *arenaMem2Hi; #endif black.r = 0; black.g = 0; black.b = 0; black.a = 255; DEMOInit(&GXNtsc480Int); #ifdef HOLLYWOOD_REV arenaMem2Lo = OSGetMEM2ArenaLo(); arenaMem2Hi = OSGetMEM2ArenaHi(); __ExpHeap = MEMCreateExpHeap(arenaMem2Lo, (u32)arenaMem2Hi - (u32) arenaMem2Lo); #endif GXSetDispCopyGamma(GX_GM_1_0); GXSetCopyFilter(FALSE, NULL, FALSE, NULL); GXSetCopyClear(black, 0xffffff); rmode = DEMOGetRenderModeObj(); AIInit(NULL); AXSeqSetup(); THPPlayerInit(THP_MODE_WITH_AX); open = FALSE; play = FALSE; onMemory = FALSE; OSReport("\n"); OSReport("###########################################################\n"); OSReport("Push A Button : Play the movie with audio\n"); OSReport("Push B Button : Play the movie with audio on the memory\n"); OSReport("Push X Button : Play the interlace movie\n"); OSReport("Push Y Button : Play the movie with multiple audio track,\n"); OSReport(" : select audio track at random\n"); OSReport("Push L Trigger : Pause / Restart the movie\n"); OSReport("Push R Trigger : Skip one frame if the movie is paused\n"); OSReport("Pad Up : Volume up\n"); OSReport("Pad Down : Volume down\n"); OSReport("Pad Right : Play/stop midi file using AX\n"); OSReport("Push Start Button : Application end\n"); OSReport("###########################################################\n"); while(1) { DEMOPadRead(); buttonDown = DEMOPadGetButtonDown(PAD_CHAN0); button = DEMOPadGetButton(PAD_CHAN0); dir = DEMOPadGetDirs(PAD_CHAN0); DEMOBeforeRender(); if (play) { frame = THPPlayerDrawCurrentFrame(rmode, x, y, videoInfo.xSize, videoInfo.ySize); } // Movie Playback DoneRender MovieDoneRender(); // Check player state if (THPPlayerGetState() == THP_PLAYER_ERROR) { THPPlayerStop(); THPPlayerClose(); #ifndef HOLLYWOOD_REV OSFree(buffer); #else MEMFreeToExpHeap(__ExpHeap, buffer); #endif OSHalt("Error happen"); } if (buttonDown & PAD_BUTTON_A) { fileName = "thpdemo/rebirth.thp"; open = TRUE; onMemory = FALSE; } if (buttonDown & PAD_BUTTON_B) { fileName = "thpdemo/fish.thp"; open = TRUE; onMemory = TRUE; } if (buttonDown & PAD_BUTTON_X) { fileName = "thpdemo/fish_int.thp"; open = TRUE; onMemory = FALSE; } if (buttonDown & PAD_BUTTON_Y) { fileName = "thpdemo/fish_mlt.thp"; open = TRUE; onMemory = FALSE; } if (buttonDown & PAD_TRIGGER_L) { if (THPPlayerGetState() == THP_PLAYER_PAUSE) { THPPlayerPlay(); } else { THPPlayerPause(); } } if (buttonDown & PAD_TRIGGER_R) { THPPlayerSkip(); } if (buttonDown & PAD_BUTTON_START) { if (play) { THPPlayerStop(); THPPlayerClose(); #ifndef HOLLYWOOD_REV OSFree(buffer); #else MEMFreeToExpHeap(__ExpHeap, buffer); #endif } break; } if (button & PAD_BUTTON_UP) { vol = THPPlayerGetVolume() + 1; if (vol > 127) { vol = 127; } THPPlayerSetVolume(vol, 0); } if (button & PAD_BUTTON_DOWN) { vol = THPPlayerGetVolume() - 1; if (vol < 0) { vol = 0; } THPPlayerSetVolume(vol, 0); } if (buttonDown & PAD_BUTTON_RIGHT) { if (GetSeqState()) { SeqStop(); } else { SeqPlay(); } } if (open) { // If playing back, release Stop and work area if (play) { THPPlayerStop(); THPPlayerClose(); #ifndef HOLLYWOOD_REV OSFree(buffer); #else MEMFreeToExpHeap(__ExpHeap, buffer); #endif play = FALSE; } } if (open && !play) { // Open THP file if (THPPlayerOpen(fileName, onMemory) == FALSE) { OSHalt("Fail to open the thp file\n"); } THPPlayerGetVideoInfo(&videoInfo); THPPlayerGetAudioInfo(&audioInfo); x = (rmode->fbWidth - videoInfo.xSize) / 2; y = (rmode->efbHeight - videoInfo.ySize) / 2; // Set aside work area size = THPPlayerCalcNeedMemory(); #ifndef HOLLYWOOD_REV buffer = (u8 *)OSAlloc(size); #else buffer = MEMAllocFromExpHeapEx(__ExpHeap, size, 32); #endif if (!buffer) { OSHalt("Can't allocate the memory"); } // Set work area THPPlayerSetBuffer(buffer); // Select randomly, if there are multiple audio tracks. if (audioInfo.sndNumTracks != 1) { audioTrack = (s32)(OSGetTick() % audioInfo.sndNumTracks); } else { audioTrack = 0; } // Preparation before playback if (THPPlayerPrepare(0, THP_PLAY_LOOP, audioTrack) == FALSE) { OSHalt("Fail to prepare\n"); } // Start playback THPPlayerPlay(); open = FALSE; play = TRUE; } } THPPlayerQuit(); VIWaitForRetrace(); OSHalt("application end\n"); return; } static void MovieDoneRender(void) { // Release used THP video data at same time as graphics processor THPPlayerDrawDone(); DEMODoneRender(); }