SDL y boton HOME

Ofertas en PcComponentes: Top Verano y PcCom Days
Saludos, resulta que mi programa,en c y SDL, que es basicamente un esqueleto de lo que luego usare para desarrollar, se compila de maravilla, y se ejecuta tmb bien en la psp, el problema viene al salir con el boton HOME.

    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #ifdef PSP
        #include <pspkernel.h>
        #include <pspdebug.h>
        #include <pspdisplay.h>
        #include <pspctrl.h>
    #endif

int i_Salir = 0;

int SDL_main(int argc, char *argv[])

    SDL_Event eKeys;
   SDL_Surface *pMainWindow;
   SDL_Surface *pWallpaper;
    SDL_Rect rMainWindow;
    pWallpaper = IMG_Load("sphere2.png");
    rMainWindow.x = 0;
    rMainWindow.y = 0;
    #ifdef PSP
      SceCtrlData pad;
      sceCtrlSetSamplingCycle(0);
      sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
    #endif

   pMainWindow = SDL_SetVideoMode( 480,
                                    272,
                                     32,
                                    SDL_HWSURFACE|SDL_DOUBLEBUF );
      
    SDL_Init (SDL_INIT_EVERYTHING);
   
    while(!i_Salir)
   {
       #ifdef PSP   
          pspDebugScreenSetXY(0, 2);
       #endif   
       SDL_FillRect(pMainWindow, NULL, 0);
       SDL_BlitSurface ( pWallpaper, NULL, pMainWindow, &rMainWindow );
      SDL_Flip(pMainWindow);
       while( SDL_PollEvent( &eKeys ) )
       {
            if( eKeys.key.keysym.sym == SDLK_ESCAPE ||
                eKeys.type == SDL_QUIT ) {
                    i_Salir=1;
            }
       }
     }
   
    #ifdef PSP
      sceKernelExitGame();
    #endif
    SDL_FreeSurface ( pMainWindow );
    SDL_FreeSurface ( pWallpaper );
   return 0;
}



Bien, al pulsar el boton HOME, se congela la psp, siendo necesario el resetar... He revisado el makefile por si existiera algun error, pero no veo ninguno:

# Nombre de la aplicación y ficheros para la compilación
TARGET = Ejemplo001
OBJS = main.o hddlib.o

PSPSDK = $(shell psp-config --pspsdk-path)
PSPDEV = $(shell psp-config -d)
PSPBIN = $(PSPDEV)/bin
SDL_CONFIG = $(PSPBIN)/sdl-config

CFLAGS = -O2 -G0 -Wall -D PSP
CFLAGS += $(shell $(SDL_CONFIG) --cflags)
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBS = -lstdc++ -lSDL_ttf -lfreetype -lSDL_image -ljpeg -lpng -lz -lm -lSDL_mixer -lvorbisidec -lmikmod -lmad $(shell $(SDL_CONFIG) --libs)
LIBS += -lpspaudiolib -lpspaudio -lpsppower

# Tipo de ejecutable que generara y titulo que tendra
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Ejemplo001
#PSP_EBOOT_PIC1 = hddissenyDev.png
include $(PSPSDK)/lib/build.mak


wtf?
Un saludo loxo:
Para salir mediante la tecla HOME, al utilizar SDL, también requiere el uso de las callbacks, para ello deberías añadir las siguientes funciones:
int exit_callback(int arg1, int arg2, void *common) {
    i_Salir = 1;
          sceKernelExitGame();
          return 0;
}

// Llamada thread
int CallbackThread(SceSize args, void *argp) {
          int cbid;

          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);

          sceKernelSleepThreadCB();

          return 0;
}

// Configura llamada thread y vuelve a su thread id
int SetupCallbacks(void) {
          int thid = 0;

          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }

          return thid;
}


Y llamar al SetupCallbacks() al inicio del main;

Espero haber ayudado.
Gracias por la respuesta, he colocado tal como me has dicho los callbacks, pero no hay manera.

Voy a poner el proyecto aqui, a ver si ves donde puede estar el error...
En el main llamamos a la libreria de la aplicacion y a la mia, donde he colocado los callbacks.
#include "hddlib.hpp"
#include "press.hpp"
   
extern "C" int main(int argc, char** argv)
{
   #ifdef PSP
     SetupCallbacks();
   #endif
     gPressInit();
     gPressLoadImages();
     gPressLoop();
    #ifdef PSP
     SDL_Quit();
    sceKernelExitGame();
    #endif
}


Y en la libreria estan asi:
#ifndef _HDDLIB_HPP_
#define _HDDLIB_HPP_
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_rotozoom.h>
    #include <SDL/SDL_gfxPrimitives.h>
    #include <SDL/SDL_mixer.h>
    #include <SDL/SDL_framerate.h>
    #ifdef PSP
        #include <pspkernel.h>
        #include <pspdebug.h>
        #include <pspdisplay.h>
        #include <pspctrl.h>
        int exit_callback(int arg1, int arg2, void *common);
        int CallbackThread(SceSize args, void *argp);
        int SetupCallbacks(void);
    #endif
      ...
      ...


Y en el cpp de la hddlib
...
...
...

#ifdef PSP
int exit_callback(int arg1, int arg2, void *common) {

       
          return 0;
}

int CallbackThread(SceSize args, void *argp) {
          int cbid;

          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);

          sceKernelSleepThreadCB();

          return 0;
}

int SetupCallbacks(void) {
          int thid = 0;

          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }

          return thid;
}
#endif
...
...
...


Todo compila perfectamente, y tiene el funcionamiento que tocaba esperar en ejecucion, pero aun asi, al salir, se cuelga la consola. Es un mal que me hace tener que reiniciarla todo el rato, y esta comenzando a ser un poco molesto :S

Un saludo
Qué tal loxo, supongo que el problema está en lo siguiente:

En el bucle principal (GameLoop), tienes este código
while(! i_Salir)
{
       ...
}

Dentro del cual implementas un mecanismo para salir cambiando el valor de i_Salir; hasta allí todo bien, el problema se da cuando pides salir desde el botón HOME, es decir se llama a la función exit_callback, pero se sigue manteniendo en el bucle principal, es por eso que se cuelga la aplicación.

Por lo cual exit_callback también debería cambiar el valor de i_Salir.

Me parece que ese es el problema.

Suerte [oki]
Buenas!

Asunto arreglado!!
Gracias por la ayuda, ha sido muy, pero que muy util, y rapida sobre todo!

Ahora tengo otro problema. Intento reproducir audio mediante la SDL_Mixer, y al parecer, en la version de pc si que funciona, pero en la psp, se queda muda. Pongo la clase que hice a ver si esque cometi tambien algun error

class cHddFileSnd
    {
    public:
        Mix_Music *p_music;
        public:
        void Load ( char *ch_UrlFile );
        void Unload ();
        void Play(int i_repeat);
        void Pause()  { Mix_PauseMusic  ( );}
        void Resume() { Mix_ResumeMusic ( );}
        void Rewind() { Mix_RewindMusic ( );}
        void Stop()   { Mix_HaltMusic   ( );}
        void Uload() { Mix_FreeMusic ( p_music );}
        void Volume(int i_volume) { Mix_VolumeMusic(i_volume); }
    };

...
...
...

void cHddFileSnd::Load(char *ch_urlFile)
{
    p_music = Mix_LoadMUS(ch_urlFile);
}

void cHddFileSnd::Play(int i_repeat)
{
    Mix_PlayMusic(p_music  , i_repeat) ;
}



Y vuelvo a decir...¿wtf?
Gracias!!
Me alegra haber podido ayudar.

En lo que se refiere a SDL_Mixer, no tengo nada de experiencia con esta librería, apenas estaba revisando como funciona, pero tu problema tendrá algo que ver en la configuración a lo que inicializas la librería?(frecuencia,canales)

De todas formas me voy a poner a hacer algunos ejemplos para PSP para ver cómo puedo ayudarte...
5 respuestas