+ improved GUI engine (more flexibility)
+ improved Menu transition effects + added support for ogg background music + improved ROM Selection Menu (automatic text scrolling, wiimote support, ...) + changed arrow buttons aspect (feel better now ?) + minor bufgixes and menu adjustments
11
Makefile.gc
@ -20,7 +20,7 @@ BUILD := build_cube
|
||||
SOURCES := source source/m68k source/z80 source/sound source/sound/SRC source/ntsc source/cart_hw source/cart_hw/svp \
|
||||
source/gx source/gx/gui source/gx/fileio source/gx/images source/gx/sounds
|
||||
INCLUDES := source source/m68k source/z80 source/sound source/sound/SRC source/ntsc source/cart_hw source/cart_hw/svp \
|
||||
source/gx source/gx/gui source/gx/fileio source/gx/images source/gx/sounds
|
||||
build_cube source/gx source/gx/gui source/gx/fileio source/gx/images source/gx/sounds
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
@ -34,7 +34,7 @@ LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lpng -lfat -lasnd -logc -lm -lz
|
||||
LIBS := -lpng -lfat -ltremor -lasnd -logc -lm -lz
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
@ -66,6 +66,7 @@ SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png)))
|
||||
PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm)))
|
||||
OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg)))
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# use CXX for linking C++ projects, CC for standard C
|
||||
@ -77,8 +78,8 @@ else
|
||||
endif
|
||||
|
||||
export OFILES := $(addsuffix .o,$(BINFILES)) \
|
||||
$(PNGFILES:.png=.png.o) $(PCMFILES:.pcm=.pcm.o) $(OGGFILES:.ogg=.ogg.o) \
|
||||
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \
|
||||
$(PNGFILES:.png=.png.o) $(PCMFILES:.pcm=.pcm.o) \
|
||||
$(sFILES:.s=.o) $(SFILES:.S=.o)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
@ -135,6 +136,10 @@ $(OUTPUT).elf: $(OFILES)
|
||||
@echo $(notdir $<)
|
||||
$(bin2o)
|
||||
|
||||
%.ogg.o : %.ogg
|
||||
@echo $(notdir $<)
|
||||
$(bin2o)
|
||||
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
|
13
Makefile.wii
@ -20,7 +20,7 @@ BUILD := build_wii
|
||||
SOURCES := source source/m68k source/z80 source/sound source/sound/SRC source/ntsc source/cart_hw source/cart_hw/svp \
|
||||
source/gx source/gx/gui source/gx/fileio source/gx/images source/gx/sounds
|
||||
INCLUDES := source source/m68k source/z80 source/sound source/sound/SRC source/ntsc source/cart_hw source/cart_hw/svp \
|
||||
source/gx source/gx/gui source/gx/fileio source/gx/images source/gx/sounds
|
||||
build_wii source/gx source/gx/gui source/gx/fileio source/gx/images source/gx/sounds
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
@ -34,7 +34,7 @@ LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lpng -ldi -lfat -lasnd -lwiiuse -lbte -logc -lm -lz
|
||||
LIBS := -lpng -ldi -lfat -ltremor -lasnd -lwiiuse -lbte -logc -lm -lz
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
@ -52,7 +52,7 @@ ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||
|
||||
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||
|
||||
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
|
||||
@ -66,6 +66,7 @@ SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png)))
|
||||
PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm)))
|
||||
OGGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.ogg)))
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# use CXX for linking C++ projects, CC for standard C
|
||||
@ -77,8 +78,8 @@ else
|
||||
endif
|
||||
|
||||
export OFILES := $(addsuffix .o,$(BINFILES)) \
|
||||
$(PNGFILES:.png=.png.o) $(PCMFILES:.pcm=.pcm.o) $(OGGFILES:.ogg=.ogg.o) \
|
||||
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \
|
||||
$(PNGFILES:.png=.png.o) $(PCMFILES:.pcm=.pcm.o) \
|
||||
$(sFILES:.s=.o) $(SFILES:.S=.o)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
@ -135,6 +136,10 @@ $(OUTPUT).elf: $(OFILES)
|
||||
@echo $(notdir $<)
|
||||
$(bin2o)
|
||||
|
||||
%.ogg.o : %.ogg
|
||||
@echo $(notdir $<)
|
||||
$(bin2o)
|
||||
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
|
@ -85,9 +85,9 @@ void config_setDefault(void)
|
||||
config.filter = 1;
|
||||
|
||||
/* system options */
|
||||
config.freeze_auto = -1;
|
||||
config.state_auto = -1;
|
||||
#ifdef HW_RVL
|
||||
config.sram_auto = 0; /* assume we always got SDCARD */
|
||||
config.sram_auto = 0; /* let's assume we always have a FAT device by default */
|
||||
#else
|
||||
config.sram_auto = -1;
|
||||
#endif
|
||||
|
@ -37,7 +37,7 @@ typedef struct
|
||||
uint8 filter;
|
||||
uint8 hq_fm;
|
||||
int8 sram_auto;
|
||||
int8 freeze_auto;
|
||||
int8 state_auto;
|
||||
uint8 region_detect;
|
||||
uint8 force_dtack;
|
||||
uint8 bios_enabled;
|
||||
|
@ -53,23 +53,23 @@ int ManageState(u8 direction, u8 device);
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
void memfile_autoload()
|
||||
void memfile_autoload(s8 autosram, s8 autostate)
|
||||
{
|
||||
/* this should be transparent to the user */
|
||||
SILENT = 1;
|
||||
|
||||
/* SRAM */
|
||||
if (config.sram_auto != -1)
|
||||
ManageSRAM(1,config.sram_auto);
|
||||
if (autosram != -1)
|
||||
ManageSRAM(1,autosram);
|
||||
|
||||
/* STATE */
|
||||
if (config.freeze_auto != -1)
|
||||
ManageState(1,config.freeze_auto);
|
||||
if (autostate != -1)
|
||||
ManageState(1,autostate);
|
||||
|
||||
SILENT = 0;
|
||||
}
|
||||
|
||||
void memfile_autosave()
|
||||
void memfile_autosave(s8 autosram, s8 autostate)
|
||||
{
|
||||
int crccheck = crc32 (0, sram.sram, 0x10000);
|
||||
|
||||
@ -77,12 +77,12 @@ void memfile_autosave()
|
||||
SILENT = 1;
|
||||
|
||||
/* SRAM */
|
||||
if ((config.sram_auto != -1) && (crccheck != sram.crc))
|
||||
ManageSRAM(0, config.sram_auto);
|
||||
if ((autosram != -1) && (crccheck != sram.crc))
|
||||
ManageSRAM(0, autosram);
|
||||
|
||||
/* STATE */
|
||||
if (config.freeze_auto != -1)
|
||||
ManageState(0,config.freeze_auto);
|
||||
if (autostate != -1)
|
||||
ManageState(0,autostate);
|
||||
|
||||
SILENT = 0;
|
||||
}
|
||||
|
@ -33,8 +33,8 @@
|
||||
#endif
|
||||
|
||||
/* this is emulator specific ! */
|
||||
#define PAGESIZE 13
|
||||
#define PAGEOFFSET 86
|
||||
#define PAGESIZE 11
|
||||
#define PAGEOFFSET 120
|
||||
|
||||
|
||||
/* Global Variables */
|
||||
@ -49,6 +49,82 @@ int haveFATdir = 0;
|
||||
|
||||
FILEENTRIES filelist[MAXFILES];
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI Buttons data */
|
||||
/*****************************************************************************/
|
||||
static butn_data arrow_up_data =
|
||||
{
|
||||
{NULL,NULL},
|
||||
{Button_up_png,Button_up_over_png}
|
||||
};
|
||||
|
||||
static butn_data arrow_down_data =
|
||||
{
|
||||
{NULL,NULL},
|
||||
{Button_down_png,Button_down_over_png}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI Buttons */
|
||||
/*****************************************************************************/
|
||||
|
||||
static gui_butn arrow_up = {&arrow_up_data,BUTTON_VISIBLE|BUTTON_OVER_SFX,14,76,360,32};
|
||||
static gui_butn arrow_down = {&arrow_down_data,BUTTON_VISIBLE|BUTTON_OVER_SFX,14,368,360,32};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI helpers */
|
||||
/*****************************************************************************/
|
||||
static gui_item action_cancel =
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
NULL,Key_B_wii_png,"","Previous",10,422,28,28
|
||||
#else
|
||||
NULL,Key_B_gcn_png,"","Previous",10,422,28,28
|
||||
#endif
|
||||
};
|
||||
|
||||
static gui_item action_select =
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
NULL,Key_A_wii_png,"","Load ROM file",602,422,28,28
|
||||
#else
|
||||
NULL,Key_A_gcn_png,"","Load ROM file",602,422,28,28
|
||||
#endif
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI Background images */
|
||||
/*****************************************************************************/
|
||||
static gui_image bg_filesel[9] =
|
||||
{
|
||||
{NULL,Bg_main_png,IMAGE_VISIBLE,356,144,348,288,255,{0,0},{0,0}},
|
||||
{NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255,{0,0},{0,0}},
|
||||
{NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255,{0,0},{0,0}},
|
||||
{NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255,{0,0},{0,0}},
|
||||
{NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255,{0,0},{0,0}},
|
||||
{NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,200,{0,0},{0,0}},
|
||||
{NULL,Frame_s2_png,0,384,264,248,140,200,{0,0},{0,0}},
|
||||
{NULL,Snap_empty_png,IMAGE_VISIBLE,422,114,164,116,255,{0,0},{0,0}},
|
||||
{NULL,Snap_frame_png,IMAGE_VISIBLE,388,112,236,148,255,{0,0},{0,0}}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI Descriptor */
|
||||
/*****************************************************************************/
|
||||
static gui_menu menu_browser =
|
||||
{
|
||||
"ROM Selection",
|
||||
-1,0,
|
||||
0,0,9,
|
||||
{0,0},
|
||||
NULL,
|
||||
NULL,
|
||||
bg_filesel,
|
||||
{&action_cancel, &action_select},
|
||||
{&arrow_up,&arrow_down},
|
||||
FALSE
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* FileSortCallback (Marty Disibio)
|
||||
*
|
||||
@ -84,186 +160,195 @@ int FileSortCallback(const void *f1, const void *f2)
|
||||
* ROM size is returned
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int FileSelector(unsigned char *buffer)
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
int x,y;
|
||||
gui_butn *button;
|
||||
#endif
|
||||
short p;
|
||||
// int redraw = 1;
|
||||
int ret,i,yoffset,string_offset;
|
||||
int go_up = 0;
|
||||
int quit =0;
|
||||
int ret;
|
||||
int i,size;
|
||||
|
||||
int yoffset;
|
||||
char text[MAXJOLIET+2];
|
||||
FILE *xml;
|
||||
FILE *snap;
|
||||
char fname[MAXPATHLEN];
|
||||
FILE *xml,*snap;
|
||||
|
||||
#ifdef HW_RVL
|
||||
/* allocate wiimote pointer data (only done once) */
|
||||
// gx_texture *pointer = gxTextureOpenPNG(generic_point_png);
|
||||
#endif
|
||||
/* Initialize Menu */
|
||||
gui_menu *m = &menu_browser;
|
||||
GUI_InitMenu(m);
|
||||
|
||||
/* allocate background overlay texture */
|
||||
gui_image *overlay = &bg_overlay_line;
|
||||
if (!overlay->texture) overlay->texture = gxTextureOpenPNG(overlay->data);
|
||||
/* Initialize directory icon */
|
||||
gui_image dir_icon;
|
||||
dir_icon.texture = gxTextureOpenPNG(Browser_dir_png);
|
||||
dir_icon.w = dir_icon.texture->width;
|
||||
dir_icon.h = dir_icon.texture->height;
|
||||
dir_icon.x = 26;
|
||||
dir_icon.y = PAGEOFFSET;
|
||||
|
||||
/* allocate background image texture */
|
||||
gui_image *bg = &bg_right;
|
||||
if (!bg->texture) bg->texture = gxTextureOpenPNG(bg->data);
|
||||
/* Initialize selection bar */
|
||||
gui_image bar_over;
|
||||
bar_over.texture = gxTextureOpenPNG(Overlay_bar_png);
|
||||
bar_over.w = bar_over.texture->width;
|
||||
bar_over.h = bar_over.texture->height;
|
||||
bar_over.x = 22;
|
||||
bar_over.y = -(bar_over.h - dir_icon.h)/2;
|
||||
|
||||
/* allocate logo texture */
|
||||
gui_image *logo = &logo_small;
|
||||
if (!logo->texture) logo->texture = gxTextureOpenPNG(logo->data);
|
||||
/* Initialize star icons */
|
||||
//gx_texture *star_full = gxTextureOpenPNG(Star_full_png);
|
||||
//gx_texture *star_empty = gxTextureOpenPNG(Star_empty_png);
|
||||
|
||||
/* allocate generic elements textures */
|
||||
gui_image *frames[2] = {&left_frame,&right_frame};
|
||||
gui_image *banners[2] = {&top_banner,&bottom_banner};
|
||||
gui_item *helpers[2] = {&action_cancel, &action_select};
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
/* frames */
|
||||
if (!frames[i]->texture) frames[i]->texture = gxTextureOpenPNG(frames[i]->data);
|
||||
|
||||
/* banners */
|
||||
if (!banners[i]->texture) banners[i]->texture = gxTextureOpenPNG(banners[i]->data);
|
||||
|
||||
/* key helpers */
|
||||
if (!helpers[i]->texture) helpers[i]->texture = gxTextureOpenPNG(helpers[i]->data);
|
||||
}
|
||||
|
||||
/* snapshots */
|
||||
gx_texture *snap_frame = gxTextureOpenPNG(Snap_frame_png);
|
||||
gx_texture *snap_empty = gxTextureOpenPNG(Snap_empty_png);
|
||||
|
||||
/* selection bar */
|
||||
gx_texture *bar_over = gxTextureOpenPNG(Overlay_bar_png);
|
||||
|
||||
/* directory icon */
|
||||
gx_texture *dir_icon = gxTextureOpenPNG(Browser_dir_png);
|
||||
|
||||
#ifdef NEW_GUI
|
||||
|
||||
/* arrows */
|
||||
gx_texture *arrow_up = gxTextureOpenPNG(Button_up_png);
|
||||
gx_texture *arrow_up_over = gxTextureOpenPNG(Button_up_over_png);
|
||||
gx_texture *arrow_down = gxTextureOpenPNG(Button_down_png);
|
||||
gx_texture *arrow_down_over = gxTextureOpenPNG(Button_down_over_png);
|
||||
|
||||
/* stars */
|
||||
gx_texture *star_full = gxTextureOpenPNG(Star_full_png);
|
||||
gx_texture *star_empty = gxTextureOpenPNG(Star_empty_png);
|
||||
#endif
|
||||
while (!quit)
|
||||
{
|
||||
/* Draw menu*/
|
||||
gxClearScreen ((GXColor)BACKGROUND);
|
||||
/* get ROM filename without extension */
|
||||
sprintf (text, "%s", filelist[selection].filename);
|
||||
text[strlen(text) - 4] = 0;
|
||||
|
||||
gxDrawRepeat(overlay->texture,overlay->x,overlay->y,overlay->w,overlay->h);
|
||||
gxDrawTexture(bg->texture,bg->x,bg->y,bg->w,bg->h,255);
|
||||
gxDrawTexture(banners[0]->texture,banners[0]->x,banners[0]->y,banners[0]->w,banners[0]->h,255);
|
||||
gxDrawTexture(banners[1]->texture,banners[1]->x,banners[1]->y,banners[1]->w,banners[1]->h,255);
|
||||
gxDrawTexture(helpers[0]->texture,helpers[0]->x,helpers[0]->y,helpers[0]->w,helpers[0]->h,255);
|
||||
gxDrawTexture(helpers[1]->texture,helpers[1]->x,helpers[1]->y,helpers[1]->w,helpers[1]->h,255);
|
||||
gxDrawTexture(logo->texture,logo->x,logo->y,logo->w,logo->h,255);
|
||||
|
||||
/* Draw title & helps */
|
||||
FONT_alignLeft("ROM Selection", 22,10,56, (GXColor)WHITE);
|
||||
FONT_alignLeft("Back", 16, helpers[0]->x+helpers[0]->w+6,helpers[0]->y+(helpers[0]->h-16)/2 + 16, (GXColor)WHITE);
|
||||
FONT_alignRight("Load ROM File", 16, helpers[1]->x - 6, helpers[1]->y+(helpers[1]->h-16)/2 + 16, (GXColor)WHITE);
|
||||
|
||||
gxDrawTexture(snap_empty,422,114,snap_empty->width,snap_empty->height,255);
|
||||
gxDrawTexture(frames[0]->texture,frames[0]->x,frames[0]->y,frames[0]->w,frames[0]->h,200);
|
||||
|
||||
#ifdef NEW_GUI
|
||||
/* ROM database informations */
|
||||
strncpy(fname, filelist[selection].filename, strlen(filelist[selection].filename) - 4);
|
||||
sprintf(fname, "%s/db/%s.xml",DEFAULT_PATH,fname);
|
||||
sprintf (fname, "%s/db/%s.xml", DEFAULT_PATH, text);
|
||||
xml = fopen(fname, "rb");
|
||||
if (xml)
|
||||
{
|
||||
gxDrawTexture(frames[1]->texture,frames[1]->x,frames[1]->y,frames[1]->w,frames[1]->h,200);
|
||||
bg_filesel[6].state |= IMAGE_VISIBLE;
|
||||
fclose(xml); /* TODO */
|
||||
}
|
||||
else
|
||||
{
|
||||
bg_filesel[6].state &= ~IMAGE_VISIBLE;
|
||||
}
|
||||
|
||||
/* ROM snapshot */
|
||||
strncpy(fname, filelist[selection].filename, strlen(filelist[selection].filename) - 4);
|
||||
sprintf(fname, "%s/snap/%s.png",DEFAULT_PATH,fname);
|
||||
sprintf (fname, "%s/snaps/%s.png", DEFAULT_PATH, text);
|
||||
snap = fopen(fname, "rb");
|
||||
if (snap)
|
||||
{
|
||||
fclose(snap); /* TODO */
|
||||
}
|
||||
else
|
||||
{
|
||||
gxDrawTexture(snap_empty,422,114,snap_empty->width,snap_empty->height,255);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Cartridge picture */
|
||||
gxDrawTexture(snap_frame,388,112,snap_frame->width,snap_frame->height,255);
|
||||
/* Draw menu*/
|
||||
GUI_DrawMenu(m);
|
||||
|
||||
/* File list */
|
||||
gxDrawTexture(frames[0]->texture,frames[0]->x,frames[0]->y,frames[0]->w,frames[0]->h,200);
|
||||
|
||||
yoffset = 86;
|
||||
/* Draw Files list */
|
||||
yoffset = PAGEOFFSET;
|
||||
for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++)
|
||||
{
|
||||
sprintf (text, "%s", filelist[i].filename + filelist[i].filename_offset);
|
||||
if (i == selection)
|
||||
{
|
||||
gxDrawTexture(bar_over,22,yoffset - ((bar_over->height - dir_icon->height)/2), bar_over->width,bar_over->height,255);
|
||||
}
|
||||
/* scrolling text */
|
||||
string_offset = filelist[i].filename_offset/10;
|
||||
if (string_offset >= strlen(filelist[i].filename))
|
||||
{
|
||||
string_offset = 0;
|
||||
filelist[i].filename_offset = 0;
|
||||
}
|
||||
sprintf(text, "%s ",filelist[i].filename + string_offset);
|
||||
strncat(text, filelist[i].filename, string_offset);
|
||||
|
||||
if (filelist[i].flags)
|
||||
{
|
||||
/* directory icon */
|
||||
gxDrawTexture(dir_icon,26,yoffset,dir_icon->width,dir_icon->height,255);
|
||||
FONT_alignLeft(text, 16,26+dir_icon->width+6,yoffset + 16, (GXColor)WHITE);
|
||||
gxDrawTexture(bar_over.texture,bar_over.x,yoffset+bar_over.y,bar_over.w,bar_over.h,255);
|
||||
if (filelist[i].flags)
|
||||
{
|
||||
/* directory icon */
|
||||
gxDrawTexture(dir_icon.texture,dir_icon.x-1,yoffset-1,dir_icon.w+2,dir_icon.h+2,255);
|
||||
if (FONT_write(text,18,dir_icon.x+dir_icon.w+6,yoffset+16,bar_over.w-dir_icon.w-14,(GXColor)WHITE))
|
||||
{
|
||||
filelist[i].filename_offset ++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FONT_write(text,18,dir_icon.x,yoffset+16,bar_over.w-8,(GXColor)WHITE))
|
||||
{
|
||||
filelist[i].filename_offset ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FONT_alignLeft(text, 16,26,yoffset+16, (GXColor)WHITE);
|
||||
filelist[i].filename_offset = 0;
|
||||
if (filelist[i].flags)
|
||||
{
|
||||
/* directory icon */
|
||||
gxDrawTexture(dir_icon.texture,dir_icon.x,yoffset,dir_icon.w,dir_icon.h,255);
|
||||
FONT_write(filelist[i].filename,16,dir_icon.x+dir_icon.w+6,yoffset+16,bar_over.w-dir_icon.w-14,(GXColor)WHITE);
|
||||
}
|
||||
else
|
||||
{
|
||||
FONT_write(filelist[i].filename,16,dir_icon.x,yoffset+16,bar_over.w-8,(GXColor)WHITE);
|
||||
}
|
||||
}
|
||||
|
||||
yoffset += 20;
|
||||
yoffset += 22;
|
||||
}
|
||||
|
||||
#ifdef HW_RVL
|
||||
if (Shutdown)
|
||||
{
|
||||
gxTextureClose(&w_pointer);
|
||||
GUI_DeleteMenu(m);
|
||||
shutdown();
|
||||
SYS_ResetSystem(SYS_POWEROFF, 0, 0);
|
||||
}
|
||||
else if (m_input.ir.valid)
|
||||
{
|
||||
/* get cursor position */
|
||||
x = m_input.ir.x;
|
||||
y = m_input.ir.y;
|
||||
|
||||
/* draw wiimote pointer */
|
||||
gxResetAngle(m_input.ir.angle);
|
||||
gxDrawTexture(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,255);
|
||||
gxResetAngle(0.0);
|
||||
|
||||
/* find selected item */
|
||||
yoffset = PAGEOFFSET;
|
||||
m->selected = m->max_buttons + 2;
|
||||
for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++)
|
||||
{
|
||||
if ((x<=380)&&(y>=yoffset)&&(y<(yoffset+22)))
|
||||
{
|
||||
selection = i;
|
||||
m->selected = -1;
|
||||
break;
|
||||
}
|
||||
yoffset += 22;
|
||||
}
|
||||
|
||||
/* find selected button */
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
button = m->arrows[i];
|
||||
if (button)
|
||||
{
|
||||
if (button->state & BUTTON_VISIBLE)
|
||||
{
|
||||
if ((x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h)))
|
||||
{
|
||||
m->selected = m->max_buttons + i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* reset indicator */
|
||||
m->selected = -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* copy EFB to XFB */
|
||||
gxSetScreen ();
|
||||
|
||||
p = m_input.keys;
|
||||
|
||||
/* scroll displayed filename */
|
||||
if (p & PAD_BUTTON_LEFT)
|
||||
{
|
||||
if (filelist[selection].filename_offset > 0)
|
||||
{
|
||||
filelist[selection].filename_offset --;
|
||||
//redraw = 1;
|
||||
}
|
||||
}
|
||||
else if (p & PAD_BUTTON_RIGHT)
|
||||
{
|
||||
size = 0;
|
||||
for (i=filelist[selection].filename_offset; i<strlen(filelist[selection].filename); i++)
|
||||
size += font_size[(int)filelist[selection].filename[i]];
|
||||
|
||||
if (size > back_framewidth)
|
||||
{
|
||||
filelist[selection].filename_offset ++;
|
||||
//redraw = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* highlight next item */
|
||||
else if (p & PAD_BUTTON_DOWN)
|
||||
if (p & PAD_BUTTON_DOWN)
|
||||
{
|
||||
filelist[selection].filename_offset = 0;
|
||||
selection++;
|
||||
if (selection == maxfiles) selection = offset = 0;
|
||||
if ((selection - offset) >= PAGESIZE) offset += PAGESIZE;
|
||||
//redraw = 1;
|
||||
}
|
||||
|
||||
/* highlight previous item */
|
||||
@ -278,7 +363,6 @@ int FileSelector(unsigned char *buffer)
|
||||
}
|
||||
if (selection < offset) offset -= PAGESIZE;
|
||||
if (offset < 0) offset = 0;
|
||||
//redraw = 1;
|
||||
}
|
||||
|
||||
/* go back one page */
|
||||
@ -293,7 +377,6 @@ int FileSelector(unsigned char *buffer)
|
||||
}
|
||||
if (selection < offset) offset -= PAGESIZE;
|
||||
if (offset < 0) offset = 0;
|
||||
//redraw = 1;
|
||||
}
|
||||
|
||||
/* go forward one page */
|
||||
@ -303,18 +386,17 @@ int FileSelector(unsigned char *buffer)
|
||||
selection += PAGESIZE;
|
||||
if (selection > maxfiles - 1) selection = offset = 0;
|
||||
if ((selection - offset) >= PAGESIZE) offset += PAGESIZE;
|
||||
//redraw = 1;
|
||||
}
|
||||
|
||||
/* quit */
|
||||
if (p & PAD_TRIGGER_Z)
|
||||
else if (p & PAD_TRIGGER_Z)
|
||||
{
|
||||
filelist[selection].filename_offset = 0;
|
||||
quit = 2;
|
||||
}
|
||||
|
||||
/* open selected file or directory */
|
||||
if ((p & PAD_BUTTON_A) || (p & PAD_BUTTON_B))
|
||||
else if ((p & PAD_BUTTON_A) || (p & PAD_BUTTON_B))
|
||||
{
|
||||
filelist[selection].filename_offset = 0;
|
||||
go_up = 0;
|
||||
@ -325,63 +407,71 @@ int FileSelector(unsigned char *buffer)
|
||||
go_up = 1;
|
||||
selection = useFAT ? 0 : 1;
|
||||
}
|
||||
|
||||
/*** This is directory ***/
|
||||
if (filelist[selection].flags)
|
||||
{
|
||||
/* get new directory */
|
||||
if (useFAT) ret =FAT_UpdateDir(go_up);
|
||||
else ret = DVD_UpdateDir(go_up);
|
||||
|
||||
/* get new entry list or quit */
|
||||
if (ret)
|
||||
{
|
||||
if (useFAT) maxfiles = FAT_ParseDirectory();
|
||||
else maxfiles = DVD_ParseDirectory();
|
||||
}
|
||||
else
|
||||
{
|
||||
quit = 2;
|
||||
}
|
||||
}
|
||||
|
||||
/*** This is a file ***/
|
||||
#ifdef HW_RVL
|
||||
else
|
||||
{
|
||||
/* root directory ? */
|
||||
if (go_up) quit = 2;
|
||||
else quit = 1;
|
||||
/* arrow buttons selected */
|
||||
if (m->selected == m->max_buttons) /* up arrow */
|
||||
{
|
||||
filelist[selection].filename_offset = 0;
|
||||
selection--;
|
||||
if (selection < 0)
|
||||
{
|
||||
selection = maxfiles - 1;
|
||||
offset = selection - PAGESIZE + 1;
|
||||
}
|
||||
if (selection < offset) offset -= PAGESIZE;
|
||||
if (offset < 0) offset = 0;
|
||||
}
|
||||
else if (m->selected == (m->max_buttons+1)) /* down arrow */
|
||||
{
|
||||
filelist[selection].filename_offset = 0;
|
||||
selection++;
|
||||
if (selection == maxfiles) selection = offset = 0;
|
||||
if ((selection - offset) >= PAGESIZE) offset += PAGESIZE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ensure we are in focus area */
|
||||
if (m->selected < m->max_buttons)
|
||||
{
|
||||
/*** This is directory ***/
|
||||
if (filelist[selection].flags)
|
||||
{
|
||||
/* get new directory */
|
||||
if (useFAT) ret =FAT_UpdateDir(go_up);
|
||||
else ret = DVD_UpdateDir(go_up);
|
||||
|
||||
/* get new entry list or quit */
|
||||
if (ret)
|
||||
{
|
||||
if (useFAT) maxfiles = FAT_ParseDirectory();
|
||||
else maxfiles = DVD_ParseDirectory();
|
||||
}
|
||||
else
|
||||
{
|
||||
quit = 2;
|
||||
}
|
||||
}
|
||||
|
||||
/*** This is a file ***/
|
||||
else
|
||||
{
|
||||
/* root directory ? */
|
||||
if (go_up) quit = 2;
|
||||
else quit = 1;
|
||||
}
|
||||
}
|
||||
//redraw = 1;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HW_RVL
|
||||
/* allocate wiimote pointer data (only done once) */
|
||||
// gxTextureClose(&pointer);
|
||||
#endif
|
||||
|
||||
gxTextureClose(&overlay->texture);
|
||||
gxTextureClose(&bg->texture);
|
||||
gxTextureClose(&logo->texture);
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
gxTextureClose(&frames[i]->texture);
|
||||
gxTextureClose(&banners[i]->texture);
|
||||
gxTextureClose(&helpers[i]->texture);
|
||||
}
|
||||
gxTextureClose(&snap_frame);
|
||||
gxTextureClose(&snap_empty);
|
||||
gxTextureClose(&bar_over);
|
||||
gxTextureClose(&dir_icon);
|
||||
#ifdef NEW_GUI
|
||||
gxTextureClose(&arrow_up);
|
||||
gxTextureClose(&arrow_up_over);
|
||||
gxTextureClose(&arrow_down);
|
||||
gxTextureClose(&arrow_down_over);
|
||||
gxTextureClose(&star_full);
|
||||
gxTextureClose(&star_empty);
|
||||
#endif
|
||||
/* Delete Menu */
|
||||
GUI_DeleteMenu(m);
|
||||
gxTextureClose(&bar_over.texture);
|
||||
gxTextureClose(&dir_icon.texture);
|
||||
//gxTextureClose(&star_full);
|
||||
//gxTextureClose(&star_empty);
|
||||
|
||||
if (quit == 2) return 0;
|
||||
else if (useFAT) return FAT_LoadFile(buffer);
|
||||
|
@ -164,15 +164,41 @@ void WriteCentre_HL( int y, char *string)
|
||||
WriteCentre(y, string);
|
||||
}
|
||||
|
||||
void FONT_alignLeft(char *string, int size, int x, int y, GXColor color)
|
||||
int FONT_write(char *string, int size, int x, int y, int max_width, GXColor color)
|
||||
{
|
||||
x -= (vmode->fbWidth / 2);
|
||||
y -= (vmode->efbHeight / 2);
|
||||
int w, ox = x;
|
||||
|
||||
while (*string)
|
||||
{
|
||||
w = (font_size[(u8)*string] * size) / fheight;
|
||||
if ((x + w) <= (ox + max_width))
|
||||
{
|
||||
DrawChar(*string, x, y, size,color);
|
||||
x += w;
|
||||
string++;
|
||||
}
|
||||
else return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color)
|
||||
{
|
||||
int i;
|
||||
u16 width = 0;
|
||||
|
||||
for (i=0; i<strlen(string); i++)
|
||||
width += (font_size[(u8)string[i]] * size) / fheight;
|
||||
|
||||
x1 += (x2 - x1 - width - vmode->fbWidth) / 2;
|
||||
y -= (vmode->efbHeight / 2);
|
||||
|
||||
while (*string)
|
||||
{
|
||||
DrawChar(*string, x, y, size,color);
|
||||
x += (font_size[(u8)*string++] * size) / fheight;
|
||||
DrawChar(*string, x1, y, size,color);
|
||||
x1 += (font_size[(u8)*string++] * size) / fheight;
|
||||
}
|
||||
}
|
||||
|
||||
@ -194,24 +220,6 @@ void FONT_alignRight(char *string, int size, int x, int y, GXColor color)
|
||||
}
|
||||
}
|
||||
|
||||
void FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color)
|
||||
{
|
||||
int i;
|
||||
u16 width = 0;
|
||||
|
||||
for (i=0; i<strlen(string); i++)
|
||||
width += (font_size[(u8)string[i]] * size) / fheight;
|
||||
|
||||
x1 += (x2 - x1 - width - vmode->fbWidth) / 2;
|
||||
y -= (vmode->efbHeight / 2);
|
||||
|
||||
while (*string)
|
||||
{
|
||||
DrawChar(*string, x1, y, size,color);
|
||||
x1 += (font_size[(u8)*string++] * size) / fheight;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Draw functions (FrameBuffer)
|
||||
*
|
||||
|
@ -27,9 +27,9 @@
|
||||
|
||||
extern int FONT_Init(void);
|
||||
extern void FONT_Shutdown(void);
|
||||
extern void FONT_alignLeft(char *string, int size, int x, int y, GXColor color);
|
||||
extern void FONT_alignRight(char *string, int size, int x, int y, GXColor color);
|
||||
extern int FONT_write(char *string, int size, int x, int y, int max_width, GXColor color);
|
||||
extern void FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color);
|
||||
extern void FONT_alignRight(char *string, int size, int x, int y, GXColor color);
|
||||
|
||||
|
||||
extern void WaitButtonA ();
|
||||
|
@ -26,6 +26,9 @@
|
||||
#include "font.h"
|
||||
#include "menu.h"
|
||||
|
||||
#include "intro_pcm.h"
|
||||
#include <asndlib.h>
|
||||
|
||||
/*
|
||||
* This is the legal stuff - which must be shown at program startup
|
||||
* Any derivative work MUST include the same textual output.
|
||||
@ -113,5 +116,11 @@ void legal ()
|
||||
}
|
||||
|
||||
gxSetScreen ();
|
||||
ASND_Init();
|
||||
ASND_Pause(0);
|
||||
int voice = ASND_GetFirstUnusedVoice();
|
||||
ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL);
|
||||
sleep (2);
|
||||
ASND_Pause(1);
|
||||
ASND_End();
|
||||
}
|
||||
|
1232
source/gx/gui/menu.c
@ -28,6 +28,23 @@
|
||||
#include <wiiuse/wpad.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI Buttons state */
|
||||
/*****************************************************************************/
|
||||
#define BUTTON_VISIBLE 0x01
|
||||
#define BUTTON_OVER_SFX 0x10
|
||||
#define BUTTON_SELECT_SFX 0x20
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI Image state */
|
||||
/*****************************************************************************/
|
||||
#define IMAGE_VISIBLE 0x01
|
||||
#define IMAGE_REPEAT 0x02
|
||||
#define IMAGE_FADE 0x10
|
||||
#define IMAGE_SLIDE_X 0x20
|
||||
#define IMAGE_SLIDE_Y 0x40
|
||||
|
||||
/*****************************************************************************/
|
||||
/* GUI png data */
|
||||
/*****************************************************************************/
|
||||
@ -120,27 +137,28 @@ typedef struct
|
||||
/* Item descriptor*/
|
||||
typedef struct
|
||||
{
|
||||
gx_texture *texture; /* temporary texture data */
|
||||
const u8 *data; /* pointer to png image data (items icon only) */
|
||||
char text[64]; /* item string (items list only) */
|
||||
char comment[64]; /* item comment */
|
||||
u16 x; /* button image or text X position (upper left corner) */
|
||||
u16 y; /* button image or text Y position (upper left corner) */
|
||||
u16 w; /* button image or text width */
|
||||
u16 h; /* button image or text height */
|
||||
gx_texture *texture; /* temporary texture data */
|
||||
const u8 *data; /* pointer to png image data (items icon only) */
|
||||
char text[64]; /* item string (items list only) */
|
||||
char comment[64]; /* item comment */
|
||||
u16 x; /* item image or text X position (upper left corner) */
|
||||
u16 y; /* item image or text Y position (upper left corner) */
|
||||
u16 w; /* item image or text width */
|
||||
u16 h; /* item image or text height */
|
||||
} gui_item;
|
||||
|
||||
/* Button descriptor */
|
||||
typedef struct
|
||||
{
|
||||
gx_texture *texture[2]; /* temporary texture datas */
|
||||
const u8 *image[2]; /* pointer to png image datas (default) */
|
||||
gx_texture *texture[2]; /* temporary texture datas */
|
||||
const u8 *image[2]; /* pointer to png image datas (default) */
|
||||
} butn_data;
|
||||
|
||||
/* Button descriptor */
|
||||
typedef struct
|
||||
{
|
||||
butn_data *data; /* pointer to button image/texture data */
|
||||
u8 state; /* button state (ACTIVE,VISIBLE,SELECTED...) */
|
||||
u16 x; /* button image X position (upper left corner) */
|
||||
u16 y; /* button image Y position (upper left corner) */
|
||||
u16 w; /* button image pixels width */
|
||||
@ -150,32 +168,34 @@ typedef struct
|
||||
/* Image descriptor */
|
||||
typedef struct
|
||||
{
|
||||
gx_texture *texture; /* temporary texture data */
|
||||
const u8 *data; /* pointer to png image data */
|
||||
u16 x; /* button image or text X position (upper left corner) */
|
||||
u16 y; /* button image or text Y position (upper left corner) */
|
||||
u16 w; /* button image or text width */
|
||||
u16 h; /* button image or text height */
|
||||
gx_texture *texture; /* temporary texture data */
|
||||
const u8 *data; /* pointer to png image data */
|
||||
u8 state; /* image state (VISIBLE) */
|
||||
u16 x; /* image X position (upper left corner) */
|
||||
u16 y; /* image Y position (upper left corner) */
|
||||
u16 w; /* image width */
|
||||
u16 h; /* image height */
|
||||
u8 alpha; /* alpha transparency */
|
||||
u16 xrange[2]; /* image X range (slide effect) */
|
||||
u16 yrange[2]; /* image Y range (slide effect) */
|
||||
} gui_image;
|
||||
|
||||
/* Menu descriptor */
|
||||
typedef struct
|
||||
{
|
||||
char title[64]; /* menu title */
|
||||
s8 selected; /* index of selected item */
|
||||
u8 offset; /* items list offset */
|
||||
u8 max_items; /* total number of items */
|
||||
u8 max_buttons; /* total number of buttons (not necessary identical) */
|
||||
u8 shift; /* number of items by line */
|
||||
gui_item *items; /* menu items table */
|
||||
gui_butn *buttons; /* menu buttons table */
|
||||
gui_image *overlay; /* overlay image */
|
||||
gui_image *background; /* background image */
|
||||
gui_image *logo; /* logo image */
|
||||
gui_image *frames[2]; /* windows (max. 2) */
|
||||
gui_image *banners[2]; /* bottom & top banners */
|
||||
gui_item *helpers[2]; /* left & right key comments */
|
||||
gui_butn *arrows[2]; /* items list up & down arrows */
|
||||
char title[64]; /* menu title */
|
||||
s8 selected; /* index of selected item */
|
||||
u8 offset; /* items list offset */
|
||||
u8 max_items; /* total number of items */
|
||||
u8 max_buttons; /* total number of buttons */
|
||||
u8 max_images; /* total number of background images */
|
||||
u8 shift[2]; /* number of buttons per line */
|
||||
gui_item *items; /* menu items */
|
||||
gui_butn *buttons; /* menu buttons */
|
||||
gui_image *bg_images; /* background images */
|
||||
gui_item *helpers[2]; /* left & right key comments */
|
||||
gui_butn *arrows[2]; /* arrows buttons */
|
||||
bool screenshot; /* use gamescreen as background */
|
||||
} gui_menu;
|
||||
|
||||
|
||||
@ -183,25 +203,15 @@ typedef struct
|
||||
extern u8 SILENT;
|
||||
extern t_input_menu m_input;
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Common GUI images */
|
||||
/*****************************************************************************/
|
||||
extern gui_image logo_main;
|
||||
extern gui_image logo_small;
|
||||
extern gui_image top_banner;
|
||||
extern gui_image bottom_banner;
|
||||
extern gui_image main_banner;
|
||||
extern gui_image bg_right;
|
||||
extern gui_image bg_center;
|
||||
extern gui_image bg_overlay_line;
|
||||
extern gui_image left_frame;
|
||||
extern gui_image right_frame;
|
||||
#ifdef HW_RVL
|
||||
extern gx_texture *w_pointer;
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Common GUI items */
|
||||
/*****************************************************************************/
|
||||
extern gui_item action_cancel;
|
||||
extern gui_item action_select;
|
||||
extern gui_item action_exit;
|
||||
|
||||
extern void MainMenu(void);
|
||||
extern void GUI_InitMenu(gui_menu *menu);
|
||||
extern void GUI_DeleteMenu(gui_menu *menu);
|
||||
extern void GUI_DrawMenu(gui_menu *menu);
|
||||
extern int GUI_RunMenu(gui_menu *menu);
|
||||
|
||||
#endif
|
||||
|
354
source/gx/gui/oggplayer.c
Normal file
@ -0,0 +1,354 @@
|
||||
/*
|
||||
Copyright (c) 2008 Francisco Muñoz 'Hermes' <www.elotrolado.net>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are
|
||||
permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice, this list of
|
||||
conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
of conditions and the following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
- The names of the contributors may not be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef NO_SOUND
|
||||
|
||||
#include "oggplayer.h"
|
||||
#include <gccore.h>
|
||||
|
||||
/* OGG control */
|
||||
|
||||
#define READ_SAMPLES 4096 // samples that it must read before to send
|
||||
#define MAX_PCMOUT 4096 // minimum size to read ogg samples
|
||||
typedef struct
|
||||
{
|
||||
OggVorbis_File vf;
|
||||
vorbis_info *vi;
|
||||
int current_section;
|
||||
|
||||
// OGG file operation
|
||||
int fd;
|
||||
int mode;
|
||||
int eof;
|
||||
int flag;
|
||||
int volume;
|
||||
int seek_time;
|
||||
|
||||
/* OGG buffer control */
|
||||
short pcmout[2][READ_SAMPLES + MAX_PCMOUT * 2]; /* take 4k out of the data segment, not the stack */
|
||||
int pcmout_pos;
|
||||
int pcm_indx;
|
||||
|
||||
} private_data_ogg;
|
||||
|
||||
static private_data_ogg private_ogg;
|
||||
|
||||
// OGG thread control
|
||||
|
||||
#define STACKSIZE 8192
|
||||
|
||||
static u8 oggplayer_stack[STACKSIZE];
|
||||
static lwpq_t oggplayer_queue;
|
||||
static lwp_t h_oggplayer;
|
||||
static int ogg_thread_running = 0;
|
||||
|
||||
static void ogg_add_callback(int voice)
|
||||
{
|
||||
if (ogg_thread_running <= 0)
|
||||
{
|
||||
SND_StopVoice(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (private_ogg.flag & 128)
|
||||
return; // Ogg is paused
|
||||
|
||||
if (private_ogg.pcm_indx >= READ_SAMPLES)
|
||||
{
|
||||
if (SND_AddVoice(0,
|
||||
(void *) private_ogg.pcmout[private_ogg.pcmout_pos],
|
||||
private_ogg.pcm_indx << 1) == 0)
|
||||
{
|
||||
private_ogg.pcmout_pos ^= 1;
|
||||
private_ogg.pcm_indx = 0;
|
||||
private_ogg.flag = 0;
|
||||
LWP_ThreadSignal(oggplayer_queue);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (private_ogg.flag & 64)
|
||||
{
|
||||
private_ogg.flag &= ~64;
|
||||
LWP_ThreadSignal(oggplayer_queue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void * ogg_player_thread(private_data_ogg * priv)
|
||||
{
|
||||
int first_time = 1;
|
||||
|
||||
ogg_thread_running = 0;
|
||||
//init
|
||||
LWP_InitQueue(&oggplayer_queue);
|
||||
|
||||
priv[0].vi = ov_info(&priv[0].vf, -1);
|
||||
|
||||
SND_Pause(0);
|
||||
|
||||
priv[0].pcm_indx = 0;
|
||||
priv[0].pcmout_pos = 0;
|
||||
priv[0].eof = 0;
|
||||
priv[0].flag = 0;
|
||||
priv[0].current_section = 0;
|
||||
|
||||
ogg_thread_running = 1;
|
||||
|
||||
while (!priv[0].eof)
|
||||
{
|
||||
long ret;
|
||||
if (ogg_thread_running <= 0)
|
||||
break;
|
||||
|
||||
if (priv[0].flag)
|
||||
LWP_ThreadSleep(oggplayer_queue); // wait only when i have samples to send
|
||||
|
||||
if (ogg_thread_running <= 0)
|
||||
break;
|
||||
|
||||
if (priv[0].flag == 0) // wait to all samples are sended
|
||||
{
|
||||
if (SND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos])
|
||||
&& SND_StatusVoice(0) != SND_UNUSED)
|
||||
{
|
||||
priv[0].flag |= 64;
|
||||
continue;
|
||||
}
|
||||
if (priv[0].pcm_indx < READ_SAMPLES)
|
||||
{
|
||||
priv[0].flag = 3;
|
||||
|
||||
if (priv[0].seek_time >= 0)
|
||||
{
|
||||
ov_time_seek(&priv[0].vf, priv[0].seek_time);
|
||||
priv[0].seek_time = -1;
|
||||
}
|
||||
|
||||
ret
|
||||
= ov_read(
|
||||
&priv[0].vf,
|
||||
(void *) &priv[0].pcmout[priv[0].pcmout_pos][priv[0].pcm_indx],
|
||||
MAX_PCMOUT,/*0,2,1,*/&priv[0].current_section);
|
||||
priv[0].flag &= 192;
|
||||
if (ret == 0)
|
||||
{
|
||||
/* EOF */
|
||||
if (priv[0].mode & 1)
|
||||
ov_time_seek(&priv[0].vf, 0); // repeat
|
||||
else
|
||||
priv[0].eof = 1; // stops
|
||||
//
|
||||
}
|
||||
else if (ret < 0)
|
||||
{
|
||||
/* error in the stream. Not a problem, just reporting it in
|
||||
case we (the app) cares. In this case, we don't. */
|
||||
if (ret != OV_HOLE)
|
||||
{
|
||||
if (priv[0].mode & 1)
|
||||
ov_time_seek(&priv[0].vf, 0); // repeat
|
||||
else
|
||||
priv[0].eof = 1; // stops
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* we don't bother dealing with sample rate changes, etc, but
|
||||
you'll have to*/
|
||||
priv[0].pcm_indx += ret >> 1; //get 16 bits samples
|
||||
}
|
||||
}
|
||||
else
|
||||
priv[0].flag = 1;
|
||||
}
|
||||
|
||||
if (priv[0].flag == 1)
|
||||
{
|
||||
if (SND_StatusVoice(0) == SND_UNUSED || first_time)
|
||||
{
|
||||
first_time = 0;
|
||||
if (priv[0].vi->channels == 2)
|
||||
{
|
||||
SND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0,
|
||||
(void *) priv[0].pcmout[priv[0].pcmout_pos],
|
||||
priv[0].pcm_indx << 1, priv[0].volume,
|
||||
priv[0].volume, ogg_add_callback);
|
||||
priv[0].pcmout_pos ^= 1;
|
||||
priv[0].pcm_indx = 0;
|
||||
priv[0].flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
SND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0,
|
||||
(void *) priv[0].pcmout[priv[0].pcmout_pos],
|
||||
priv[0].pcm_indx << 1, priv[0].volume,
|
||||
priv[0].volume, ogg_add_callback);
|
||||
priv[0].pcmout_pos ^= 1;
|
||||
priv[0].pcm_indx = 0;
|
||||
priv[0].flag = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// if(priv[0].pcm_indx==0) priv[0].flag=0; // all samples sended
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
ov_clear(&priv[0].vf);
|
||||
priv[0].fd = -1;
|
||||
priv[0].pcm_indx = 0;
|
||||
ogg_thread_running = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void StopOgg()
|
||||
{
|
||||
SND_StopVoice(0);
|
||||
if (ogg_thread_running > 0)
|
||||
{
|
||||
ogg_thread_running = -2;
|
||||
LWP_ThreadSignal(oggplayer_queue);
|
||||
LWP_JoinThread(h_oggplayer, NULL);
|
||||
|
||||
while (((volatile int) ogg_thread_running) != 0)
|
||||
{
|
||||
;;;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int PlayOgg(int fd, int time_pos, int mode)
|
||||
{
|
||||
StopOgg();
|
||||
|
||||
ogg_thread_running = 0;
|
||||
|
||||
private_ogg.fd = fd;
|
||||
private_ogg.mode = mode;
|
||||
private_ogg.eof = 0;
|
||||
private_ogg.volume = 127;
|
||||
private_ogg.flag = 0;
|
||||
private_ogg.seek_time = -1;
|
||||
|
||||
if (time_pos > 0)
|
||||
private_ogg.seek_time = time_pos;
|
||||
|
||||
if (fd < 0)
|
||||
{
|
||||
private_ogg.fd = -1;
|
||||
return -1;
|
||||
}
|
||||
if (ov_open((void *) &private_ogg.fd, &private_ogg.vf, NULL, 0) < 0)
|
||||
{
|
||||
mem_close(private_ogg.fd); // mem_close() can too close files from devices
|
||||
private_ogg.fd = -1;
|
||||
ogg_thread_running = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread,
|
||||
&private_ogg, oggplayer_stack, STACKSIZE, 80) == -1)
|
||||
{
|
||||
ogg_thread_running = -1;
|
||||
ov_clear(&private_ogg.vf);
|
||||
private_ogg.fd = -1;
|
||||
return -1;
|
||||
}
|
||||
LWP_ThreadSignal(oggplayer_queue);
|
||||
while (((volatile int) ogg_thread_running) == 0)
|
||||
{
|
||||
;;;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PauseOgg(int pause)
|
||||
{
|
||||
if (pause)
|
||||
{
|
||||
private_ogg.flag |= 128;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (private_ogg.flag & 128)
|
||||
{
|
||||
private_ogg.flag |= 64;
|
||||
private_ogg.flag &= ~128;
|
||||
if (ogg_thread_running > 0)
|
||||
{
|
||||
LWP_ThreadSignal(oggplayer_queue);
|
||||
// while(((volatile int )private_ogg.flag)!=1 && ((volatile int )ogg_thread_running)>0) {;;;}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
int StatusOgg()
|
||||
{
|
||||
if (ogg_thread_running <= 0)
|
||||
return -1; // Error
|
||||
|
||||
if (private_ogg.eof)
|
||||
return 255; // EOF
|
||||
|
||||
if (private_ogg.flag & 128)
|
||||
return 2; // paused
|
||||
return 1; // running
|
||||
}
|
||||
|
||||
void SetVolumeOgg(int volume)
|
||||
{
|
||||
private_ogg.volume = volume;
|
||||
|
||||
SND_ChangeVolumeVoice(0, volume, volume);
|
||||
}
|
||||
|
||||
s32 GetTimeOgg()
|
||||
{
|
||||
int ret;
|
||||
if (ogg_thread_running <= 0)
|
||||
return 0;
|
||||
if (private_ogg.fd < 0)
|
||||
return 0;
|
||||
ret = ((s32) ov_time_tell(&private_ogg.vf));
|
||||
if (ret < 0)
|
||||
ret = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void SetTimeOgg(s32 time_pos)
|
||||
{
|
||||
if (time_pos >= 0)
|
||||
private_ogg.seek_time = time_pos;
|
||||
}
|
||||
|
||||
#endif
|
174
source/gx/gui/oggplayer.h
Normal file
@ -0,0 +1,174 @@
|
||||
/*
|
||||
Copyright (c) 2008 Francisco Muñoz 'Hermes' <www.elotrolado.net>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are
|
||||
permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice, this list of
|
||||
conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
of conditions and the following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
- The names of the contributors may not be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef NO_SOUND
|
||||
|
||||
#ifndef __OGGPLAYER_H__
|
||||
#define __OGGPLAYER_H__
|
||||
|
||||
#include <asndlib.h>
|
||||
#include "tremor/ivorbiscodec.h"
|
||||
#include "tremor/ivorbisfile.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define OGG_ONE_TIME 0
|
||||
#define OGG_INFINITE_TIME 1
|
||||
|
||||
#define OGG_STATUS_RUNNING 1
|
||||
#define OGG_STATUS_ERR -1
|
||||
#define OGG_STATUS_PAUSED 2
|
||||
#define OGG_STATUS_EOF 255
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
/* Player OGG functions */
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* int PlayOgg(int fd, int time_pos, int mode);
|
||||
|
||||
Play an Ogg file. This file can be loaded from memory (mem_open(void *ogg, int size_ogg)) or from device with open("device:file.ogg",O_RDONLY,0);
|
||||
|
||||
NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail.
|
||||
|
||||
-- Params ---
|
||||
|
||||
fd: file descriptor from open() or mem_open()
|
||||
|
||||
time_pos: initial time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds
|
||||
|
||||
mode: Use OGG_ONE_TIME or OGG_INFINITE_TIME. When you use OGG_ONE_TIME the sound stops and StatusOgg() return OGG_STATUS_EOF
|
||||
|
||||
return: 0- Ok, -1 Error
|
||||
|
||||
*/
|
||||
|
||||
int PlayOgg(int fd, int time_pos, int mode);
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* void StopOgg();
|
||||
|
||||
Stop an Ogg file.
|
||||
|
||||
NOTE: The file is closed and the player thread is released
|
||||
|
||||
-- Params ---
|
||||
|
||||
|
||||
*/
|
||||
|
||||
void StopOgg();
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* void PauseOgg(int pause);
|
||||
|
||||
Pause an Ogg file.
|
||||
|
||||
-- Params ---
|
||||
|
||||
pause: 0 -> continue, 1-> pause
|
||||
|
||||
*/
|
||||
|
||||
void PauseOgg(int pause);
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* int StatusOgg();
|
||||
|
||||
Return the Ogg status
|
||||
|
||||
-- Params ---
|
||||
|
||||
|
||||
return: OGG_STATUS_RUNNING
|
||||
OGG_STATUS_ERR -> not initialized?
|
||||
OGG_STATUS_PAUSED
|
||||
OGG_STATUS_EOF -> player stopped by End Of File
|
||||
|
||||
*/
|
||||
|
||||
int StatusOgg();
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* void SetVolumeOgg(int volume);
|
||||
|
||||
Set the Ogg playing volume.
|
||||
NOTE: it change the volume of voice 0 (used for the Ogg player)
|
||||
|
||||
-- Params ---
|
||||
|
||||
volume: 0 to 255 (max)
|
||||
|
||||
*/
|
||||
|
||||
void SetVolumeOgg(int volume);
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* s32 GetTimeOgg();
|
||||
|
||||
Return the Ogg time from the starts of the file
|
||||
|
||||
-- Params ---
|
||||
|
||||
return: 0 -> Ok or error condition (you must ignore this value)
|
||||
>0 -> time in milliseconds from the starts
|
||||
|
||||
*/
|
||||
|
||||
s32 GetTimeOgg();
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* void SetTimeOgg(s32 time_pos);
|
||||
|
||||
Set the time position
|
||||
|
||||
NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail.
|
||||
|
||||
-- Params ---
|
||||
|
||||
time_pos: time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds
|
||||
|
||||
*/
|
||||
|
||||
void SetTimeOgg(s32 time_pos);
|
||||
|
||||
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
@ -22,8 +22,10 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "shared.h"
|
||||
//#include "Bg_music_ogg.h"
|
||||
|
||||
#include <asndlib.h>
|
||||
#include <oggplayer.h>
|
||||
|
||||
/* DMA soundbuffers (required to be 32-bytes aligned)
|
||||
Length is dimensionned for one frame of emulation (see below)
|
||||
@ -47,7 +49,7 @@ static int delta;
|
||||
static u32 dma_sync;
|
||||
|
||||
/* audio DMA status */
|
||||
static u8 audioStarted;
|
||||
static u8 audioStarted = 0;
|
||||
|
||||
/***
|
||||
AudioDmaCallback
|
||||
@ -126,6 +128,8 @@ void gx_audio_update(void)
|
||||
void gx_audio_start(void)
|
||||
{
|
||||
/* shutdown menu audio */
|
||||
PauseOgg(1);
|
||||
StopOgg();
|
||||
ASND_Pause(1);
|
||||
ASND_End();
|
||||
|
||||
@ -163,11 +167,14 @@ void gx_audio_start(void)
|
||||
***/
|
||||
void gx_audio_stop(void)
|
||||
{
|
||||
/* shutdown sound emulation */
|
||||
/* stop emulator audio */
|
||||
AUDIO_StopDMA ();
|
||||
audioStarted = 0;
|
||||
|
||||
/* start menu audio */
|
||||
/* restart menu audio */
|
||||
ASND_Init();
|
||||
ASND_Pause(0);
|
||||
PauseOgg(0);
|
||||
// PlayOgg(mem_open((char *)Bg_music_ogg, Bg_music_ogg_size), 0, OGG_INFINITE_TIME);
|
||||
//SetVolumeOgg(255);
|
||||
}
|
||||
|
@ -831,7 +831,7 @@ void gxDrawScreenshot(u8 alpha)
|
||||
}
|
||||
}
|
||||
|
||||
void gxDrawTexture(gx_texture *texture, int x, int y, int w, int h, u8 alpha)
|
||||
void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha)
|
||||
{
|
||||
if (!texture) return;
|
||||
if (texture->data)
|
||||
@ -866,7 +866,7 @@ void gxDrawTexture(gx_texture *texture, int x, int y, int w, int h, u8 alpha)
|
||||
}
|
||||
}
|
||||
|
||||
void gxDrawRepeat(gx_texture *texture, int x, int y, int w, int h)
|
||||
void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha)
|
||||
{
|
||||
if (!texture) return;
|
||||
if (texture->data)
|
||||
@ -888,16 +888,16 @@ void gxDrawRepeat(gx_texture *texture, int x, int y, int w, int h)
|
||||
/* draw textured quad */
|
||||
GX_Begin(GX_QUADS, GX_VTXFMT0, 4);
|
||||
GX_Position2s16(x,y+h);
|
||||
GX_Color4u8(0xff,0xff,0xff,0xff);
|
||||
GX_Color4u8(0xff,0xff,0xff,alpha);
|
||||
GX_TexCoord2f32(0.0, t);
|
||||
GX_Position2s16(x+w,y+h);
|
||||
GX_Color4u8(0xff,0xff,0xff,0xff);
|
||||
GX_Color4u8(0xff,0xff,0xff,alpha);
|
||||
GX_TexCoord2f32(s, t);
|
||||
GX_Position2s16(x+w,y);
|
||||
GX_Color4u8(0xff,0xff,0xff,0xff);
|
||||
GX_Color4u8(0xff,0xff,0xff,alpha);
|
||||
GX_TexCoord2f32(s, 0.0);
|
||||
GX_Position2s16(x,y);
|
||||
GX_Color4u8(0xff,0xff,0xff,0xff);
|
||||
GX_Color4u8(0xff,0xff,0xff,alpha);
|
||||
GX_TexCoord2f32(0.0, 0.0);
|
||||
GX_End ();
|
||||
GX_DrawDone();
|
||||
@ -983,6 +983,7 @@ void gx_video_start(void)
|
||||
/* Video Interrupt synchronization */
|
||||
VIDEO_SetPostRetraceCallback(NULL);
|
||||
if (!gc_pal && !vdp_pal) VIDEO_SetPreRetraceCallback(updateFrameCount);
|
||||
VIDEO_Flush();
|
||||
|
||||
/* interlaced/progressive mode */
|
||||
if (config.render == 2)
|
||||
|
@ -56,8 +56,8 @@ extern void gx_video_update(void);
|
||||
extern gx_texture *gxTextureOpenPNG(const u8 *buffer);
|
||||
extern void gxTextureClose(gx_texture **p_texture);
|
||||
extern void gxDrawScreenshot(u8 alpha);
|
||||
extern void gxDrawTexture(gx_texture *texture, int x, int y, int w, int h, u8 alpha);
|
||||
extern void gxDrawRepeat(gx_texture *texture, int x, int y, int w, int h);
|
||||
extern void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha);
|
||||
extern void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha);
|
||||
extern void gxResetAngle(f32 angle);
|
||||
extern void gxClearScreen (GXColor color);
|
||||
extern void gxSetScreen ();
|
||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
@ -23,6 +23,7 @@
|
||||
|
||||
#include "shared.h"
|
||||
#include "font.h"
|
||||
#include "menu.h"
|
||||
#include "history.h"
|
||||
#include "aram.h"
|
||||
#include "dvd.h"
|
||||
@ -35,7 +36,7 @@
|
||||
|
||||
/* Power Button callback */
|
||||
u8 Shutdown = 0;
|
||||
void Power_Off(void)
|
||||
static void Power_Off(void)
|
||||
{
|
||||
Shutdown = 1;
|
||||
ConfigRequested = 1;
|
||||
@ -47,7 +48,7 @@ void Power_Off(void)
|
||||
* Genesis Plus Virtual Machine
|
||||
*
|
||||
***************************************************************************/
|
||||
static void load_bios()
|
||||
static void load_bios(void)
|
||||
{
|
||||
char pathname[MAXPATHLEN];
|
||||
|
||||
@ -74,7 +75,7 @@ static void load_bios()
|
||||
}
|
||||
}
|
||||
|
||||
static void init_machine (void)
|
||||
static void init_machine(void)
|
||||
{
|
||||
/* Allocate cart_rom here ( 10 MBytes ) */
|
||||
cart_rom = memalign(32, MAXROMSIZE);
|
||||
@ -115,15 +116,36 @@ static void init_machine (void)
|
||||
/**************************************************
|
||||
Load a new rom and performs some initialization
|
||||
***************************************************/
|
||||
void reloadrom ()
|
||||
void reloadrom (int size, char *name)
|
||||
{
|
||||
load_rom(""); /* Load ROM */
|
||||
genromsize = size;
|
||||
load_rom(name); /* Load ROM */
|
||||
system_init (); /* Initialize System */
|
||||
audio_init(48000); /* Audio System initialization */
|
||||
ClearGGCodes (); /* Clear Game Genie patches */
|
||||
system_reset (); /* System Power ON */
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
Shutdown everything properly
|
||||
***************************************************/
|
||||
void shutdown(void)
|
||||
{
|
||||
/* system shutdown */
|
||||
memfile_autosave(-1,config.state_auto);
|
||||
system_shutdown();
|
||||
audio_shutdown();
|
||||
free(cart_rom);
|
||||
free(texturemem);
|
||||
FONT_Shutdown();
|
||||
VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK);
|
||||
VIDEO_Flush();
|
||||
VIDEO_WaitVSync();
|
||||
#ifdef HW_RVL
|
||||
DI_Close();
|
||||
#endif
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* M A I N
|
||||
*
|
||||
@ -134,7 +156,7 @@ u32 frameticker = 0;
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
/* initialize Wii DVD interface first */
|
||||
/* initialize DVD Mode */
|
||||
DI_Close();
|
||||
DI_Init();
|
||||
#endif
|
||||
@ -201,7 +223,7 @@ int main (int argc, char *argv[])
|
||||
if (genromsize)
|
||||
{
|
||||
ARAMFetch((char *)cart_rom, (void *)0x8000, genromsize);
|
||||
reloadrom ();
|
||||
reloadrom (genromsize,"INJECT.bin");
|
||||
gx_video_start();
|
||||
gx_audio_start();
|
||||
frameticker = 1;
|
||||
@ -219,11 +241,11 @@ int main (int argc, char *argv[])
|
||||
if (ConfigRequested)
|
||||
{
|
||||
/* stop audio & video */
|
||||
gx_audio_stop();
|
||||
gx_video_stop();
|
||||
gx_audio_stop();
|
||||
|
||||
/* go to menu */
|
||||
MainMenu (FramesPerSecond);
|
||||
MainMenu ();
|
||||
ConfigRequested = 0;
|
||||
|
||||
/* reset framecounts */
|
||||
|
@ -27,16 +27,19 @@
|
||||
extern void error(char *format, ...);
|
||||
extern void ClearGGCodes();
|
||||
extern void GetGGEntries();
|
||||
extern void reloadrom();
|
||||
extern void legal();
|
||||
extern void MainMenu(u32 fps);
|
||||
|
||||
extern void reloadrom (int size, char *name);
|
||||
extern void shutdown();
|
||||
|
||||
extern int ManageSRAM(u8 direction, u8 device);
|
||||
extern int ManageState(u8 direction, u8 device);
|
||||
extern void memfile_autosave();
|
||||
extern void memfile_autoload();
|
||||
extern void memfile_autosave(s8 autosram, s8 autostate);
|
||||
extern void memfile_autoload(s8 autosram, s8 autostate);
|
||||
|
||||
extern u8 fat_enabled;
|
||||
extern u32 frameticker;
|
||||
extern char rom_filename[256];
|
||||
|
||||
#ifdef HW_RVL
|
||||
extern u8 Shutdown;
|
||||
|
BIN
source/gx/sounds/Bg_music.ogg
Normal file
BIN
source/gx/sounds/intro.pcm
Normal file
@ -265,6 +265,8 @@ int load_rom(char *filename)
|
||||
|
||||
#ifdef NGC
|
||||
size = genromsize;
|
||||
sprintf(rom_filename,"%s",filename);
|
||||
rom_filename[strlen(rom_filename) - 4] = 0;
|
||||
#else
|
||||
uint8 *ptr;
|
||||
ptr = load_archive(filename, &size);
|
||||
|