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