1 /*---------------------------------------------------------------------------*
2   Project:  THP Simple Player demo
3   File:     main.c
4 
5   Copyright (C) 2002-2007 Nintendo. All Rights Reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: main.c,v $
14   Revision 1.3  2008/05/30 12:00:21  aka
15   Added switch of stereo <-> mono.
16 
17   Revision 1.2  2006/10/11 02:51:31  aka
18   Revised HOLLYWOOD_REV.
19 
20   Revision 1.1  2006/02/03 10:01:13  aka
21   Imported from Dolphin tree.
22 
23 
24     4     2003/11/25 11:24 Dante
25     Japanese to English translation of comments and text strings
26 
27     3     2002/05/14 9:18a Suzuki
28     Support multi audio track
29 
30     2     2002/02/28 6:38p Akagi
31     enabled to use with MusyX/AX by Suzuki-san (IRD).
32 
33     1     2002/01/16 10:54a Akagi
34     Initial revision made by Suzuki-san (IRD).
35 
36   $NoKeywords: $
37 
38  *---------------------------------------------------------------------------*/
39 
40 #include <stdlib.h>
41 #include <string.h>
42 #include <demo.h>
43 #include <revolution/mem.h>
44 
45 #include "THPSimple.h"
46 #include "axseq.h"
47 
48 MEMHeapHandle __ExpHeap;
49 
main(void)50 void main(void)
51 {
52     u32             size, x, y, count;
53     s32             frame, start, vol, audioTrack, smode;
54     u16             buttonDown, button;
55     u8              *buffer;
56     GXRenderModeObj *rmode;
57     THPVideoInfo    videoInfo;
58     THPAudioInfo    audioInfo;
59     void            *arenaMem2Lo;
60     void            *arenaMem2Hi;
61 
62     DEMOInit(&GXNtsc480Int);
63 
64     arenaMem2Lo = OSGetMEM2ArenaLo();
65     arenaMem2Hi = OSGetMEM2ArenaHi();
66     __ExpHeap   = MEMCreateExpHeap(arenaMem2Lo, (u32)arenaMem2Hi - (u32) arenaMem2Lo);
67 
68     AIInit(NULL);
69 
70     AXSeqSetup();
71 
72     THPSimpleInit(THP_MODE_WITH_AX);
73 
74     GXSetDispCopyGamma(GX_GM_1_0);
75 
76     // Open THP file
77     if (THPSimpleOpen("thpdemo/fish_mlt.thp") == FALSE)
78     {
79         OSHalt("THPSimpleOpen fail");
80     }
81 
82     THPSimpleGetVideoInfo(&videoInfo);
83     THPSimpleGetAudioInfo(&audioInfo);
84 
85     rmode = DEMOGetRenderModeObj();
86 
87     x = (rmode->fbWidth   - videoInfo.xSize) / 2;
88     y = (rmode->efbHeight - videoInfo.ySize) / 2;
89 
90     // Set aside work area
91     size = THPSimpleCalcNeedMemory();
92 
93     buffer = MEMAllocFromExpHeapEx(__ExpHeap, size, 32);
94 
95     if (!buffer)
96     {
97         OSHalt("Can't allocate the memory\n");
98     }
99 
100     THPSimpleSetBuffer(buffer);
101 
102     OSReport("\n#######################################\n");
103     OSReport("Push A button     : restart the movie, select audio track at random\n");
104     OSReport("Push B button     : play/stop midi file using AX\n");
105     OSReport("Push Start button : application end\n");
106     OSReport("Pad up            : volume up\n");
107     OSReport("Pad down          : volume down\n");
108     OSReport("#######################################\n");
109 
110 RESTART:
111     // Preload for playback
112     if (THPSimplePreLoad(THP_PLAY_LOOP) == FALSE)
113     {
114         OSHalt("THPSimplePreLoad fail");
115     }
116 
117     audioTrack = (s32)(OSGetTick() % audioInfo.sndNumTracks);
118 
119     start = 1;
120 
121     count = VIGetRetraceCount();
122 
123     while(1)
124     {
125         DEMOPadRead();
126 
127         buttonDown = DEMOPadGetButtonDown(PAD_CHAN0);
128         button     = DEMOPadGetButton(PAD_CHAN0);
129 
130         DEMOBeforeRender();
131 
132         // Decode 1 frame of THP data
133         if (THPSimpleDecode(audioTrack) == THP_VIDEO_DECODE_FAIL)
134         {
135             OSHalt("Failed to decode video data");
136         }
137 
138         // Draw decoded THP video data
139         frame = THPSimpleDrawCurrentFrame(rmode, x, y, videoInfo.xSize, videoInfo.ySize);
140 
141         while (VIGetRetraceCount() < count + 1)
142         {
143             VIWaitForRetrace();
144         }
145 
146         DEMODoneRender();
147 
148         count = VIGetRetraceCount();
149 
150         if (start)
151         {
152             // Allow audio output
153             THPSimpleAudioStart();
154             start = 0;
155         }
156 
157         if (buttonDown & PAD_BUTTON_A)
158         {
159             // Stop playback and then restart
160             THPSimpleAudioStop();
161             THPSimpleLoadStop();
162             goto RESTART;
163         }
164 
165         if (buttonDown & PAD_BUTTON_START)
166         {
167             // Stop playback and exit from main loop
168             THPSimpleAudioStop();
169             THPSimpleLoadStop();
170             THPSimpleClose();
171 
172             MEMFreeToExpHeap(__ExpHeap, buffer);
173 
174             break;
175         }
176 
177         if (buttonDown & PAD_BUTTON_B)
178         {
179             if (GetSeqState())
180             {
181                 SeqStop();
182             }
183             else
184             {
185                 SeqPlay();
186             }
187         }
188 
189         if (button & PAD_BUTTON_UP)
190         {
191             vol = THPSimpleGetVolume() + 1;
192             if (vol > 127)
193             {
194                 vol = 127;
195             }
196             THPSimpleSetVolume(vol, 0);
197         }
198 
199         if (button & PAD_BUTTON_DOWN)
200         {
201             vol = THPSimpleGetVolume() - 1;
202             if (vol < 0)
203             {
204                 vol = 0;
205             }
206             THPSimpleSetVolume(vol, 0);
207         }
208 
209         if (buttonDown & PAD_TRIGGER_Z)
210         {
211             smode = THPSimpleGetSoundMode();
212             if (smode == THP_SOUND_MODE_MONO)
213             {
214                 THPSimpleSetSoundMode(THP_SOUND_MODE_STEREO);
215                 OSReport("Change sound mode : mono -> stereo.\n");
216             }
217             else if (smode == THP_SOUND_MODE_STEREO)
218             {
219                 THPSimpleSetSoundMode(THP_SOUND_MODE_MONO);
220                 OSReport("Change sound mode : stereo -> mono.\n");
221             }
222             else
223             {
224                 OSReport("Change sound mode : ???.\n");
225             }
226         }
227     }
228 
229     THPSimpleQuit();
230 
231     VIWaitForRetrace();
232 
233     OSHalt("application end\n");
234 
235     return;
236 }
237