AYUDA CON SDL EN PS3 (ACTUALIZADO)

Hola a todos he empezado con las vacaciones de verano y como estoy de Rodríguez jajajja he decidido empezar a hacer algo en ps3 pero de momento llevo 3 días en los que no he tenido mas que problemas desde instalar el psl1ght y las toolchain hasta problemas con el portátil así que estoy un poquito desesperado jajaja mirar de momento he conseguido instalar el compilador completo junto con las librerías para sdl,etc..
También he conseguido compilar alguno de los samples que vienen como el del pngtest hay tuve otro problema el de firmar los pkg pero también lo resolví, pletórico de alegría al ver rodar el logotipo del psl1ght decidí empezar con algo simple mostrar un cuadro en pantalla y hay me he quedado no hay manera de que tire cuando lo pongo en la ps3 esta peta y no se por que? me podéis echar un cable?
el código es este:

#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"

int main()
{
SDL_Surface *PantallaV;
SDL_Rect Cuadrado;
SDL_Event event;

Cuadrado.x = 0;
Cuadrado.y = 0;
Cuadrado.w = 50;
Cuadrado.h = 50;

SDL_Init(SDL_INIT_VIDEO);
PantallaV = SDL_SetVideoMode(640, 480, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
SDL_FillRect(PantallaV, &Cuadrado, SDL_MapRGBA(PantallaV->format,255,0,255,0));
SDL_Flip(PantallaV);

while (1)
{
}

}

Actualizacion:
Ups es por la resolución de la pantalla y por que no soporta los 32 bits de color he puesto la resolución del programa a la misma a la que tengo la pantalla y la profundidad de color a 8 y ha funcionado sin problemas lo único que no todo el mundo tendrá la pantalla a 1920x1080 así que ahora me surge otra duda como le digo a la ps3 que ponga la resolución que yo quiero? seguiré probando jajajaja

Un saludo
Kaltorak.
Buenas, no soy un experto en SDL pero creo que puedo darte un par de consejos.

El primero, es que no uses SDL y uses Tiny3D xd Peero, como todas las cosas, eso va a gustos, y eres libre de elegir.

Segundo, la pantalla se actualiza cada vez que haces un flip. Con tu código lo que haces es:
Flip (actualizar pantalla)
While() Crear un bucle infinito.
Debido que una vez en el while no se hacen más flips, nunca se actualizará de nuevo la pantalla. En tu código no pasa nada, ya que no hay ninguna animación ni interacción, pero el día que quieras poner alguna, verás que nada cambia. Yo de ti, lo dejaba así:
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"

int main()
{
   SDL_Surface *PantallaV;
   SDL_Rect Cuadrado;
   SDL_Event event;

   Cuadrado.x = 0;
   Cuadrado.y = 0;
   Cuadrado.w = 50;
   Cuadrado.h = 50;

   SDL_Init(SDL_INIT_VIDEO);
   PantallaV = SDL_SetVideoMode(640, 480, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);


   while (1)
   {
      SDL_FillRect(PantallaV, &Cuadrado, SDL_MapRGBA(PantallaV->format,255,0,255,0));
      SDL_Flip(PantallaV);
   }

}


Respecto al tema de la resolución, no sabría decirte como hacer eso en SDL. Sin embargo estoy seguro de que existe una función llamada "viewport" (o parecido) que te ayudará a renderizar (mostrar) la parte que quieras.
(Te recomiendo que busques en google que es "viewport").
Según la resolución el viewport cambiará un poco (para mostrarse bien digo). Jugando con eso puedes conseguir lo que quieres.


Si tienes alguna duda más, y la se responder, porque de SDL poco sé, te ayudo encantado!

Salu2,
Blipi
Muchas gracias blipi al final conseguí que todo se mostrara, lo de poner el flip en el while no es necesario si lo haces genera un parpadeo constante debido a la veces que muestra la imagen, por eso no lo tengo dentro del while.
Quería usar SDL por que tengo varios proyectos en SDL y quería portarlos sin tener que cambiar todo el código, pero tendré que probar con las tiny3d por que tras tirarme toda una tarde con las sdl me he dado cuenta de que están un poco verdes aun.
Haber si encuentro algún tutorial de tiny3d y me pongo a hacer pruebas jajaja. iré posteando mis progresos.
Un saludo
Kaltorak.
Mmmh... lo del parpadeo es raro, pero bueno, si vas a trabajar en Tiny3D, ya te avanzo que el flip va dentro del while. Un parpadeo indica una de dos:
1- Tienes definido un doble buffer (lo tienes), y solo se utiliza un buffer, siendo el otro negro, lo cual es raroo, pero, quien sabe.
2- FPS drop, es decir, que tienes FPS muy bajos, lo cual no cuadraría con tu codigo.

Si quieres un tutorial, tienes aquí:
hilo_tutorial-tiny3d_1551153
Un magnífico tutorial creado por el mismísimo hermes (el creador de Tiny3D).

Mucha suerte!
Gracias de nuevo blipi le he echado un vistazo al tutorial de hermes sobre las tiny3d y la verdad no esta nada mal haber si esta noche saco algo en claro jajaja tengo una duda y veo que no se te da mal el tema de la ps3.
Ya se como usar los botones del mando pero no me a quedado claro como se usa el stick podrías echarme una mano?
Un saludo
Kaltorak.
Nunca he usado los pad, mirate si hay algún ejemplo. De todas formas, por intuición y lo poco que he leído, creo que funciona así:
Por ejemplo:
paddata.ANA_L_H
Pad Horizantal Izquierdo (Left Horitzontal). Esto contiene un valor entre 0x00 y 0xFF. Este valor indica "el grado" de inclinación del pad hacia este lado.
A partir de aquí tu debes hacer tus cálculos.
En caso que paddata.ANA_L_H > 0, tienes seguro que paddata.ANA_R_H = 0. Y lo mismo va para los V (verticales).

Esto de aquí ya es bastante más complicado, pero quizás te interese:
Que más podríamos decir... Si planeas hacer algo tipo juego, debes comprobar los FPS para construir un buen sistema que funcione igual de rápido sea el caso que sea. Si no pretendes hacer un FPS ni nada, no hace falta que leas porque es bastante lioso.

Para ello tienes una función llamada "gettimeofdat(time_val *tv, NULL)" en el archivo "sys/time.h". Esta te devuelve el segundo y milisegundos actuales. (Nótese que también existe la función "clock()", pero a mi me da errores).
Con esto puedes calcular el tiempo des de un punto A, a uno B del código, por ejemplo:
struct time_val tv, tv2;
gettimeofdat(&tv, NULL); //Obtienes tiempo
usleep(100); //Paras el proceso por 100 milisegundos
gettimeofdat(&tv2, NULL); //Obtienes tiempo

//Yo, para tener todo el tiempo en una variable, hago lo siguiente:
long t1 = (tv.tv_sec * 1000 + tv.tv_usec/1000);
//si tienes 1 segundo 200000 milisegundos (que es el formato en que devuelve), te queda 1200

long t2 = (tv2.tv_sec * 1000 + tv2.tv_usec/1000);
//Si han pasado 100 milisegundos, 1300

long elapsed_time = t2-t1;
long movimiento = ((paddata.ANA_R_H > 0)?paddata.ANA_R_H:-paddata.ANA_L_H) * elapsed_time;


Como puedes ver, se usa el tiempo para calcular siempre un movimiento constante. Aunque, para ir mejor, seria necesario usar una constante tipo: en 100 milisegundos se mueve 0'1 metros. Y utilizar una regla de tres.


Vaya tostón te he soltado xd
Suerte,
Blipi
blipi eres un fenómeno muchísimas gracias de nuevo, voy a portar el kopfrog que hice para psp, lo hice todo en sdl así que va ser un tostón portarlo a tiny3d, pero bueno por algo hay que empezar jajaja y mejor por una cosa ya hecha para afianzarme en la programación para ps3.

Aquí te pongo el enlace del KOPFROG de psp por si tienes una y quieres probarlo:

Imagen Imagen

http://www.megaupload.com/?d=6VTA1MJC

PD: Me acaba de surgir una super duda como reproduzco sonidos? osea como cargo archivos por que las imágenes las meto en el pkg pero los sonidos como lo hago? y si no uso sdl que librería de sonidos usar? madre mía soy un mar de dudas jajaja espero no estar dandote mucho la chapa [oki] .

un saludo
Kaltorak.
Ostras ese juego me gustaba muchisimo !!!! Mucho animo con el proyecto [plas]
Esto si que ni lo he utilizado ni se como va.
Pero tienes los ejemplos que viene incluidos en la sdk, concretamente "samples\audio", que por lo que parece te servirán para lo que quieres.
Echales una ojeada, y si hay algo que no entiendes, comentame e intentaré explicarlo.

(Utilizan la librería de audio de hermes)

Salu2!
los estuve mirando a noche, pero no cargan ningún archivo :( que es lo que me interesa o por lo menos los ejemplos que tengo yo que son solo 2, no se si habrá mas ejemplos por hay, de todos modos muchas gracias como siempre por todo y por tu rapidez para contestar.
Un saludo
Kaltorak.
dark_on_5 está baneado por "saltarse baneo temporal con clon"
Yo nunca consegui poner sonido a mis programas, esos ejemplos no lo entendia...

A ver si vuelvo a programar en PS3 algun dia de estos...

Saludos!
Buenos días tras un par de noches, bueno mas bien una y un rato de la de hoy jajaja por que la fiesta es sagrada y había que ir a tomar unos pelotazos, la verdad es que siempre he programado mejor pedo que sobrio de hecho con 12 cubatas encima he conseguido entender la puta librería ps3soundlib y así poder incluir sonido a esta prueba de concepto que os presento a continuación en la que incluyo un fondo,un sprite, música y la posibilidad de mover el sprite sin salirse de la pantalla con el mando de momento solo con la cruceta jajaja en breve probare a usar el stick de momento no me he puesto con el, aunque gracias a blipi no creo que sea un problema implementarlo jajaja ya solo me queda comentaros que esta todo echo en tiny3d y ps3soundlib.

Bueno sin mas aquí tenéis el pkg que he hecho, espero que le echéis un vistazo, esta hecho para el cfw 3.55 y va firmado.

http://www.megaupload.com/?d=U4PNIJWA

Un saludo
Kaltorak.
kaltorak escribió:Hola a todos he empezado con las vacaciones de verano y como estoy de Rodríguez jajajja he decidido empezar a hacer algo en ps3 pero de momento llevo 3 días en los que no he tenido mas que problemas desde instalar el psl1ght y las toolchain hasta problemas con el portátil así que estoy un poquito desesperado jajaja mirar de momento he conseguido instalar el compilador completo junto con las librerías para sdl,etc..
También he conseguido compilar alguno de los samples que vienen como el del pngtest hay tuve otro problema el de firmar los pkg pero también lo resolví, pletórico de alegría al ver rodar el logotipo del psl1ght decidí empezar con algo simple mostrar un cuadro en pantalla y hay me he quedado no hay manera de que tire cuando lo pongo en la ps3 esta peta y no se por que? me podéis echar un cable?
el código es este:

#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"

int main()
{
SDL_Surface *PantallaV;
SDL_Rect Cuadrado;
SDL_Event event;

Cuadrado.x = 0;
Cuadrado.y = 0;
Cuadrado.w = 50;
Cuadrado.h = 50;

SDL_Init(SDL_INIT_VIDEO);
PantallaV = SDL_SetVideoMode(640, 480, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
SDL_FillRect(PantallaV, &Cuadrado, SDL_MapRGBA(PantallaV->format,255,0,255,0));
SDL_Flip(PantallaV);

while (1)
{
}

}

Actualizacion:
Ups es por la resolución de la pantalla y por que no soporta los 32 bits de color he puesto la resolución del programa a la misma a la que tengo la pantalla y la profundidad de color a 8 y ha funcionado sin problemas lo único que no todo el mundo tendrá la pantalla a 1920x1080 así que ahora me surge otra duda como le digo a la ps3 que ponga la resolución que yo quiero? seguiré probando jajajaja

Un saludo
Kaltorak.


Supongo que ya te habras dado cuenta pero el parpadeo no es tal. Tienes dos buffers inicializados en negro. Siempre que dibujas lo haces en el de detras. Dibujas tu cuadrado rosa. Ahora mismo tienes el bufer trasero rosa y el delantero en negro pues esta sin tocar. Haces un flip y pones el rosa delante y el negro detras. Despues tienes un bucle infinito. Llegados a este momento tienes una cpu al 100% haciendo el bucle y una grafica que siempre va a su bola y dibuja en pantalla el buffer delantero este como este sin ayuda de la cpu.

Resumiendo. Dibujas el cuadrado rosa. Intercambias buffers y "cuelgas" la cpu. La grafica sigue cada 1/60 segundos pintando el buffer delantero en pantalla. En este caso el cuadrado rosa. Si metes el flip en el while estas cambiando todo el rato el cuadrado rosa por el fotograma en negro que viene de serie.



#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"

int main()
{
SDL_Surface *PantallaV;
SDL_Rect Cuadrado;
SDL_Event event;

Cuadrado.x = 0;
Cuadrado.y = 0;
Cuadrado.w = 50;
Cuadrado.h = 50;

SDL_Init(SDL_INIT_VIDEO);
PantallaV = SDL_SetVideoMode(640, 480, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
SDL_FillRect(PantallaV, &Cuadrado, SDL_MapRGBA(PantallaV->format,255,0,255,0));
SDL_Flip(PantallaV);
SDL_FillRect(PantallaV, &Cuadrado, SDL_MapRGBA(PantallaV->format,0,0,255,0));
while (1)
{
SDL_Flip(PantallaV);
}

}


Este codigo, si no he metido la pata, dibujaria el cuadrado rosa, haria el flip, dibujaria un cuadrado azul y luego haria un flip infinito.
Mm voy a echar una ojeada a los samples y te digo si saco algo en claro.
De todas fosa es probable que en unos días me toque implementar el audio en los Homebrew que estoy haciendo. Dado el caso ya actualizaría el post y te informaría.

Salu2!
Hola vrsquid muchas gracias por la ayuda pero ya resolví el problema con las las sdl el problema es que en ps3 no soporta los 32 bits de profundidad en esta versión de las sdl es cuestión de poner 24 truecolor y listo, mi ejemplo poniendo 24 en vez de 32 es completamente operativo haz la prueba, no hace falta meter el flip en el bucle dado que mi intención no era que se estuviera refrescando constantemente si no que simplemente mostrara el cuadro en pantalla y se quedara así y el ejemplo lo hace, tu código por otro lado no se mostraría dado que tienes puesta una profundidad de color de 32 de todos modos he abandonado las sdl, pues están algo verdes todabia en un futuro y con nuevas versiones de la librería quizás vuelva a ponerme con ellas pero por ahora voy a sergir usando Tiny3d y ps3soundlib que como puedes ver en el ejemplo ya voy pillandoles el punto jajaja.

Hola blipi has visto el ejemplo que he puesto? en el uso las Tiny3d y ps3soundlib la verdad es que la librería de sonido es bastante liosa, pero ya se mas o menos como funciona así que si quieres que te eche una mano dímelo y intento explicarte lo mejor que pueda como funciona, de todos modos en cuanto tenga un ratito tenia pensado hacer una especie de tutorial sobre su uso para que la gente que empiece como yo no tenga que romperse los cuernos intentando hacerla funcionar.

Un saludo
Kaltorak
dark_on_5 está baneado por "saltarse baneo temporal con clon"
Te agradeceria mucho un ejemplo de ps3soundlib, kaltorak.

Saludos!
Hola dark_on_5 aquí te pongo un código para reproducir un ogg, para un mp3 se hace exactamente igual, he comentado el código lo mejor que he podido pero no se si se entenderá bien cualquier cosa que no entiendas puedes preguntarme y intentare explicártelo lo mejor que pueda aunque sea a mi modo jajaja espero que te sea de ayuda [oki]

Este código es muy soso a nivel visual pues solo muestra una pantalla en negro reproduciendo de fondo una melodía (vamos sonidos de la selva jajaja no tenia otro archivo de audio a mano pero para ilustrar el ejemplo es mas que suficiente) no he querido liar mas el código poniendo imágenes ni nada por el estilo.


/*
  Ejemplo de las PS3SOUNDLIB por kaltorak para dark_on_5 de el otrolado.
*/

// Incluimos las librerias basicas.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <math.h>
////////////////////////////////////////////////////////////

#include <io/pad.h> // Incluimos la libreria para controlar el mando.

// Cargamos las librerias de control del SPU,las de procesos,de timer y la de hilos.
#include <psl1ght/lv2.h>
#include <psl1ght/lv2/spu.h>
#include <lv2/spu.h>
#include <lv2/process.h>
#include <psl1ght/lv2/timer.h>
#include <psl1ght/lv2/thread.h>
/////////////////////////////////////////////////////////////////////////////////

#include <sysmodule/sysmodule.h> // Incluimos la libreria para cargar modulos.


#ifndef FROM_FILE
#include "spu_soundmodule.bin.h" // Cargamos el modulo SPU
#else
void * spu_soundmodule_bin = NULL;
#endif

// incluimos las librerias de PS3SOUNDLIB.
#include "spu_soundlib.h"
#include "audioplayer.h"
////////////////////////////////////////////////////////////

#include "jungler_ogg.bin.h" //Incluimos el archivo de audio que vamos a reproducir con las PS3SOUNDLIB.
                             //Este archivo no es mas que un ogg al cual le hemos cambiado la estension
                             //por ".bin" y lo hemos puesto dentro de la carpeta Data, para cargarlo
                             //como podeis ver tenemos que ponerle al final ".h" para que sea incluido
                             //Como si de una libreria se tratase facil verdad?.
                             //Si por ejemplo tenemos un mp3 que se llama techno.mp3 le cambiamos el
                             //nombre por techno_mp3.bin y lo ponemos en la carpeta data de nuestro
                             //proyecto y listo jajaja lo de "_mp3" no es obligatorio ponerlo pero si lo
                             //pones siempre sabras que tipo de archivo estas usando. 
                             //Con las ps3soundlib podemos cargar mp3 y ogg sin problemas.
                             


sysSpuImage spu_image; //Creamos la variable "spu_imagen" del tipo sysSpuImage.
#define SPU_SIZE(x) (((x)+127) & ~127) //Definimos "SPU_SIZE(x)" para ser usado por el spu.


s32 main(s32 argc, const char* argv[]) // el main clasico de toda la vida no necesita mas informacion.
{
   u32 spu = 0; //Creamos la variable "spu" del tipo unsigned 32 para ser usada por el psu
   
   //Estas 3 lineas son para el uso del mando supongo que no necesito esplicarlas jajaja.
   PadInfo padinfo;
   PadData paddata;
  int i;
  //////////////////////////////////////////////////////////////////////////////////////
 
  // Creamos varias variables que van a ser usadas por el spu mas adelante.
  u32 entry = 0;
   u32 segmentcount = 0;
   sysSpuSegment* segments;
   /////////////////////////////////////////////////////////////////////////
   
   //Esta parte de aqui no se muy bien para que vale pero si no la pongo no tira
   //lo que hace es abrir y leer el spu_soundmodule.bin desde el usb pero aun que
   //el usb no es te el ejemplo funciona asi que no se pa que vale pero como he
   // dicho antes sin esta parte del codigo no tira asi que ponerlo jajajaja.
   
#ifdef FROM_FILE
   
    FILE *fp = fopen("/dev_usb/spu_soundmodule.bin", "r");

    if(!fp) return 0;

    fseek(fp, 0, SEEK_END);
   
    int len = ftell(fp);

    spu_soundmodule_bin = malloc(len);
   
    fseek(fp, 0, SEEK_SET);

    fread(spu_soundmodule_bin, 1, len, fp);

    fclose(fp);

#endif
////////////////////////////////////////////////////////////////////////////
 
  //Toda esta parte del codigo es para poner apunto el spu para poder reproducir sonidos. 
  lv2SpuInitialize(6, 5);
  lv2SpuRawCreate(&spu, NULL);
  sysSpuElfGetInformation(spu_soundmodule_bin, &entry, &segmentcount);
  size_t segmentsize = sizeof(sysSpuSegment) * segmentcount;
   segments = (sysSpuSegment*)memalign(128, SPU_SIZE(segmentsize));
   memset(segments, 0, segmentsize);
  sysSpuElfGetSegments(spu_soundmodule_bin, segments, segmentcount);
  sysSpuImageImport(&spu_image, spu_soundmodule_bin, 0);
  sysSpuRawImageLoad(spu, &spu_image);
  ////////////////////////////////////////////////////////////////////////////////////////
 
  SND_Init(spu); //Iniciamos las PS3SOUNDLIB.
     SND_Pause(0);//Lo pausamos todo funciona aun que no se haga pero hermes aconseja acerlo y no cuesta nada jajajaja.
   
    //Cargamos en el puntero "fp" de tipo fichero nuestro archivo de audio que incluimos al principio para este ejemplo
    FILE *fp = (FILE *) mem_open((void *) jungler_ogg_bin, sizeof(jungler_ogg_bin));
   
    PlayAudiofd(fp, 0,  AUDIO_INFINITE_TIME);//Reproducimos dicho archivo en el canal 0 y le decimos que lo reproducca infinitamente.
       
   ioPadInit(7); //Iniciamos el mando
 
  //Estas lineas son el bucle de control del mando no necesitan mas explicacion salvo que si pulsas X sales del programa
   while(1) {
     
      ioPadGetInfo(&padinfo);

      for(i = 0; i < MAX_PADS; i++){

         if(padinfo.status[i]){
            ioPadGetData(i, &paddata);
            
            if(paddata.BTN_CROSS){
               return 0;
            }
         
         }
         
      }
      
   }
   /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   return 0;
}



Aquí tenéis el código fuente y el pkg ya compilado y firmado para cfw 3.55.

http://www.megaupload.com/?d=05RVNXSK

Un saludo
Kaltorak.
dark_on_5 está baneado por "saltarse baneo temporal con clon"
kaltorak escribió:
Hola dark_on_5 aquí te pongo un código para reproducir un ogg, para un mp3 se hace exactamente igual, he comentado el código lo mejor que he podido pero no se si se entenderá bien cualquier cosa que no entiendas puedes preguntarme y intentare explicártelo lo mejor que pueda aunque sea a mi modo jajaja espero que te sea de ayuda [oki]

Este código es muy soso a nivel visual pues solo muestra una pantalla en negro reproduciendo de fondo una melodía (vamos sonidos de la selva jajaja no tenia otro archivo de audio a mano pero para ilustrar el ejemplo es mas que suficiente) no he querido liar mas el código poniendo imágenes ni nada por el estilo.


/*
  Ejemplo de las PS3SOUNDLIB por kaltorak para dark_on_5 de el otrolado.
*/

// Incluimos las librerias basicas.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <math.h>
////////////////////////////////////////////////////////////

#include <io/pad.h> // Incluimos la libreria para controlar el mando.

// Cargamos las librerias de control del SPU,las de procesos,de timer y la de hilos.
#include <psl1ght/lv2.h>
#include <psl1ght/lv2/spu.h>
#include <lv2/spu.h>
#include <lv2/process.h>
#include <psl1ght/lv2/timer.h>
#include <psl1ght/lv2/thread.h>
/////////////////////////////////////////////////////////////////////////////////

#include <sysmodule/sysmodule.h> // Incluimos la libreria para cargar modulos.


#ifndef FROM_FILE
#include "spu_soundmodule.bin.h" // Cargamos el modulo SPU
#else
void * spu_soundmodule_bin = NULL;
#endif

// incluimos las librerias de PS3SOUNDLIB.
#include "spu_soundlib.h"
#include "audioplayer.h"
////////////////////////////////////////////////////////////

#include "jungler_ogg.bin.h" //Incluimos el archivo de audio que vamos a reproducir con las PS3SOUNDLIB.
                             //Este archivo no es mas que un ogg al cual le hemos cambiado la estension
                             //por ".bin" y lo hemos puesto dentro de la carpeta Data, para cargarlo
                             //como podeis ver tenemos que ponerle al final ".h" para que sea incluido
                             //Como si de una libreria se tratase facil verdad?.
                             //Si por ejemplo tenemos un mp3 que se llama techno.mp3 le cambiamos el
                             //nombre por techno_mp3.bin y lo ponemos en la carpeta data de nuestro
                             //proyecto y listo jajaja lo de "_mp3" no es obligatorio ponerlo pero si lo
                             //pones siempre sabras que tipo de archivo estas usando. 
                             //Con las ps3soundlib podemos cargar mp3 y ogg sin problemas.
                             


sysSpuImage spu_image; //Creamos la variable "spu_imagen" del tipo sysSpuImage.
#define SPU_SIZE(x) (((x)+127) & ~127) //Definimos "SPU_SIZE(x)" para ser usado por el spu.


s32 main(s32 argc, const char* argv[]) // el main clasico de toda la vida no necesita mas informacion.
{
   u32 spu = 0; //Creamos la variable "spu" del tipo unsigned 32 para ser usada por el psu
   
   //Estas 3 lineas son para el uso del mando supongo que no necesito esplicarlas jajaja.
   PadInfo padinfo;
   PadData paddata;
  int i;
  //////////////////////////////////////////////////////////////////////////////////////
 
  // Creamos varias variables que van a ser usadas por el spu mas adelante.
  u32 entry = 0;
   u32 segmentcount = 0;
   sysSpuSegment* segments;
   /////////////////////////////////////////////////////////////////////////
   
   //Esta parte de aqui no se muy bien para que vale pero si no la pongo no tira
   //lo que hace es abrir y leer el spu_soundmodule.bin desde el usb pero aun que
   //el usb no es te el ejemplo funciona asi que no se pa que vale pero como he
   // dicho antes sin esta parte del codigo no tira asi que ponerlo jajajaja.
   
#ifdef FROM_FILE
   
    FILE *fp = fopen("/dev_usb/spu_soundmodule.bin", "r");

    if(!fp) return 0;

    fseek(fp, 0, SEEK_END);
   
    int len = ftell(fp);

    spu_soundmodule_bin = malloc(len);
   
    fseek(fp, 0, SEEK_SET);

    fread(spu_soundmodule_bin, 1, len, fp);

    fclose(fp);

#endif
////////////////////////////////////////////////////////////////////////////
 
  //Toda esta parte del codigo es para poner apunto el spu para poder reproducir sonidos. 
  lv2SpuInitialize(6, 5);
  lv2SpuRawCreate(&spu, NULL);
  sysSpuElfGetInformation(spu_soundmodule_bin, &entry, &segmentcount);
  size_t segmentsize = sizeof(sysSpuSegment) * segmentcount;
   segments = (sysSpuSegment*)memalign(128, SPU_SIZE(segmentsize));
   memset(segments, 0, segmentsize);
  sysSpuElfGetSegments(spu_soundmodule_bin, segments, segmentcount);
  sysSpuImageImport(&spu_image, spu_soundmodule_bin, 0);
  sysSpuRawImageLoad(spu, &spu_image);
  ////////////////////////////////////////////////////////////////////////////////////////
 
  SND_Init(spu); //Iniciamos las PS3SOUNDLIB.
     SND_Pause(0);//Lo pausamos todo funciona aun que no se haga pero hermes aconseja acerlo y no cuesta nada jajajaja.
   
    //Cargamos en el puntero "fp" de tipo fichero nuestro archivo de audio que incluimos al principio para este ejemplo
    FILE *fp = (FILE *) mem_open((void *) jungler_ogg_bin, sizeof(jungler_ogg_bin));
   
    PlayAudiofd(fp, 0,  AUDIO_INFINITE_TIME);//Reproducimos dicho archivo en el canal 0 y le decimos que lo reproducca infinitamente.
       
   ioPadInit(7); //Iniciamos el mando
 
  //Estas lineas son el bucle de control del mando no necesitan mas explicacion salvo que si pulsas X sales del programa
   while(1) {
     
      ioPadGetInfo(&padinfo);

      for(i = 0; i < MAX_PADS; i++){

         if(padinfo.status[i]){
            ioPadGetData(i, &paddata);
            
            if(paddata.BTN_CROSS){
               return 0;
            }
         
         }
         
      }
      
   }
   /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   return 0;
}



Aquí tenéis el código fuente y el pkg ya compilado y firmado para cfw 3.55.

http://www.megaupload.com/?d=05RVNXSK

Un saludo
Kaltorak.


Gracias Kaltorak, lo pondré a prueba en cuanto pueda ;)

Me faltaba poner una gran parte del código, me lo había comido XD
Muchas gracias por el código. De todas formas, ha sido liberado el código para usar la RSX. Entre otras cosas, incluye gestión de audio.
Miraros el source, hay ejemplos muy interesante de audio.

http://t.co/wD16e0I Rsx documentation :) Thank you everyone who donated!


Aunque de momento es para linux, no tardaran mucho en hacer un port =P

Salu2!
18 respuestas