Anuncios Google

OSLib - Sonidos

Tutoriales Avanzados Homebrewes

Continuando la anterior entrega de imágenes, hoy vamos a pasar a los sonidos. Como sabreis hay diversos formatos de sonidos, estan los mas comunes WAV, MP3, AAC, bueno pues esos van a ser los que utilicemos hoy. Ahi que tener en cuenta que para reproducir archivos MP3 o AAC se necesita el modo kernel, asi que si tu aplicacion quieres que sea firmada para OFW no deberás usar estos formatos.

Autor: Dioni0396.

Procedimiento:

Primero vamos a explicar el modo user, este modo es ejecutable en HBL o similares, pero solo podremos usar el formato WAV y luego el modo kernel donde podremos usar todos los formatos que sean compatibles con la PSP.

Modo User:

#include <oslib/oslib.h> 
 
PSP_MODULE_INFO("Sample Musica",0,1,1); //Veamos esta salida, el primer argumento indica el nombre del programa, el segundo el modo (0=User, 0x1000=Plugin,1=Kernel).
//Como este modo es user uso el 0, el tercer y cuarto argumento indica la version, yo siempre les pongo un 1
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
PSP_HEAP_SIZE_KB(18*1024); //Nueva linea! En esta linea indicamos cuantos KB queremos darle a la aplicacion, yo le he dado 18 MB
 
OSL_SOUND *SonidoFondo; //Lo mismo que las imagenes pero con un sonido, indicamos mediante un puntero los sonidos que van ha haber
 
void CargaSonido(){ //Una funcion personalizada tipo void para agilizar codigo mas que nada
	SonidoFondo = oslLoadSoundFileWAV("SonidoWav.wav",OSL_FMT_STREAM); //Mas adelante lo explico
	if (!SonidoFondo) oslDebug("Error algo le pasa al sonido, comprueba que todo esta bien"); //Esto indica si el sonido se cargo mal nos salta ese mensaje
}
 
int main(){
	oslInit(0); //Iniciamos las oslib
	oslInitGfx(OSL_PF_8888,1); //El modo grafico, ya explicado anteriormente
	oslInitAudio(); //Iniciamos las liberias de sonido
	oslInitConsole(); //Modo consola para escribir 
	CargaSonido(); //La funcion de arriba la ponemos antes del while sino habra crash y se apagara la psp
	while(!osl_quit){
		oslStartDrawing();
		oslReadKeys();
		oslPrintf_xy(10,10,"Pulsa X para escuchar el mp3 o circulo para pausarlo"); 
		if (osl_keys->pressed.cross) oslPlaySound(SonidoFondo,1); //Mas adelante explico la funcion
		if (osl_keys->pressed.circle) oslStopSound(SonidoFondo); //Detiene el sonido, esta funcion solo necesita el sonido para hacer su funcion, pararlo.
		oslEndDrawing();
		oslAudioVSync(); //Cuidado, esto es vital, sin esto podriamos tener un crash en la aplicacion, su funcion es sincronizar el audio.
		oslSyncFrame();	
	}
	oslEndGfx();
	oslQuit();
	return 0;
}

oslLoadSoundFileWAV("SonidoWav.wav",OSL_FMT_STREAM); El primer argumento de la funcion indica como se llama el sonido y que formato tiene, el segundo argumento indica si esta o no en la memoria, es decir, si ponemos OSL_FMT_STREAM cargamos ese sonido en la CPU y si ponemos OSL_FMT_NONE, cargamos ese sonido en la memoria.

oslPlaySound(SonidoFondo,1); El primer argumento indica el sonido y el segundo indica en que canal de audio lo sacamos, tenemos desde 1 al 8.

Modo kernel:

#include <pspkernel.h> 
#include <pspdebug.h>
//Es poisble que alguien diga que para que estas librerias, pues para que vaya bien el modo kernel, porque sino no tira, testeado por mi al 100%
#include <oslib/oslib.h> 
 
PSP_MODULE_INFO("Sample Musica",1,1,1); //Ejecuto en modo kernel
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
PSP_HEAP_SIZE_KB(18*1024); //18 MB
 
OSL_SOUND *SonidoFondo;
void CargaSonido(){
	SonidoFondo = oslLoadSoundFileMP3("Sonido.mp3",OSL_FMT_STREAM); --este
	if (!SonidoFondo) oslDebug("Error algo le pasa al mp3, comprueba que todo esta bien");
}
int main(){
	oslInit(0);
	oslInitGfx(OSL_PF_8888,1);
	oslInitAudioME(3); //Atencion aqui! Esta funcion sustituye a la anterior llamada oslInitAudio(). Las dos funciones nunca pueden estar, y la funcion del modo user no podemos poner aqui. Ahora explico los argumentos posibles en esta funcion
	oslInitConsole();
	CargaSonido();
	while(!osl_quit){
		oslStartDrawing();
		oslReadKeys();
		oslPrintf_xy(10,10,"Pulsa X para escuchar el mp3 o circulo para pausarlo");
		if (osl_keys->pressed.cross) oslPlaySound(SonidoFondo,1); 
		if (osl_keys->pressed.circle) oslStopSound(SonidoFondo);
		oslEndDrawing();
		oslAudioVSync();
		oslSyncFrame();	
	}
	oslEndGfx();
	oslQuit();
	return 0;
}

oslInitAudioME(argc); En argc existe tres posibilidades de carga de sonido, si ponemos 1 solo iran los AAC, si ponemos 2 solo ira los MP3 y si ponemos 3 ira todos los formatos soportados por PSP.

Makefile:

Este makefile es válido para ambos modos:

TARGET = Sonido
OBJS = main.o
 
CFLAGS = -O2 -g -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
 
MYLIBS=
STDLIBS= -losl -lpng -lz \
         -lpsphprm -lpspsdk -lpspctrl -lpspumd -lpsprtc -lpsppower -lpspgu -lpspgum  -lpspaudiolib -lpspaudio -lpsphttp -lpspssl -lpspwlan \
         -lpspnet_adhocmatching -lpspnet_adhoc -lpspnet_adhocctl -lm -ljpeg -lpspaudiocodec
LIBS=$(STDLIBS) $(MYLIBS)
 
LDFLAGS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Sonido
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Tuve que insertarle otra libreria para que tirara bien.

Gracias por la lectura. Si tenéis dudas o problemas de algún tipo, solo comentad.

3.89796
Tu voto: Ninguno Votos totales: 3.9 (49 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de NEKERAFA

Mmm...

En el primer modo, me reproduce el sonido muy rápido, mientras que como mp3 me lo reproduce normal.

He mirado por si era problema del archivo y en el PC me los reproduce igual


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de sting18

El control de sonidos es mas

El control de sonidos es mas complicado de lo que cress, con un tutorial simple y basico como este no vas a poder nunca hacer una estructuracion de sonidos muy estable provocando fallas tanto en funcionamiento de sonidos como en cuelges,velocidad y pantallas negras, y no solo es codigo tambien hay que saber de sonidos y tener un editor de sonido para por si tienes problemas de reproduccion poder cambiar el rango de los Hz.


Imagen de NEKERAFA

Mmm...

Como editor de sonidos tengo Audacity y el terminal. Pues voy a probar diferente configuraciones entonces.

He mirado en las liberias y no he encontrado nada, solo una parte que tenia varias variables con nombres como 44, 22 y 11, pero creo que lo utilizaba para MP3. También he mirado el archivo y está a 48 kHz... Voy a bajarlo, a ver si se corrige.

 

** SOLUCIONADO **

Resulta que el codificador le ponia el codec Uncompressed 64-bit IEEE float audio (Una cosa estraña XD), y acabo de pasarlo por Audacity a Uncompressed 32-bit PCM audio y lo he puesto a 44,1 kHz y me lo reproduce como el MP3.

Muchas gracias a los dos ^-^.


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Dioni0396

De mal o de bien?

Como lo reproduce? (El PC)

Imagen de NEKERAFA

XD

Haber, me los reproduce buien, y muchísimo más claro y nitido que en PSP, lo que hace Alsa XD

Imagen de Dioni0396

Haber,

Quizas tengas los altavoces mal?

A mi me los reproduce bien, bueno, bien bien, perfecto perfecto, no pero se entiende lo que dice el tio.

Imagen de NEKERAFA

No es eso

Ya que el archivo en MP3 si que me lo reproduce bien...

Imagen de Abaddon Ormuz

Me marca error

Me marca error al compilar

psp-gcc -I. -IC:/pspdev/psp/sdk/include -O2 -g -G0 -Wall  -D_PSP_FW_VERSION=150
  -c -o main.o main.c
main.c:1: error: stray '\357' in program
main.c:1: error: stray '\273' in program
main.c:1: error: stray '\277' in program
main.c:1: error: stray '#' in program
main.c:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
In file included from C:/pspdev/psp/sdk/include/pspdebug.h:17,
                 from main.c:2:
C:/pspdev/psp/sdk/include/psptypes.h:45: error: expected '=', ',', ';', 'asm' or '__attribute__' before 's8'
C:/pspdev/psp/sdk/include/psptypes.h:60: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'vs8'
main.c: In function 'load_sound':
main.c:10: warning: implicit declaration of function 'oslLoadSoundFileMP3'
main.c:10: warning: assignment makes pointer from integer without a cast
main.c: In function 'main':
main.c:16: warning: implicit declaration of function 'oslInitAudioME'
main.c:24: error: 'union <anonymous>' has no member named 'corss'
main.c:25: error: too few arguments to function 'oslPlaySound'
make: *** [main.o] Error 1

No sé cuál es el error, he revisado línea por línea y no doy con él.

#include <pspkernel.h> 
#include <pspdebug.h>
#include <oslib/oslib.h>
PSP_MODULE_INFO("Sonidos PSPSDK", 1, 1, 1); //0,1,1 = user; 1,1,1 = kernel
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
PSP_HEAP_SIZE_KB(15*1024);
OSL_SOUND *sonido_prueba;
 
void loadSound() {
	sonido_prueba = oslLoadSoundFileMP3("test.mp3",OSL_FMT_STREAM);
	if(!sonido_prueba) oslDebug("ERROR. Can't open MP3 file.");
}
int main() {
	oslInit(0);
	oslInitGfx(OSL_PF_8888,1);
	oslInitAudioME(3);
	oslInitConsole();
	loadSound();
 
	while(!osl_quit) {
		oslStartDrawing();
		oslReadKeys();
		oslPrintf_xy(10,17,"Press [X] to play a sound or [O] to stop it");
		if (osl_keys->pressed.corss) oslPlaySound(sonido_prueba,1);
		if (osl_keys->pressed.circle) oslPlaySound(sonido_prueba);
		oslEndDrawing();
		oslAudioVSync();
		oslSyncFrame();
	}
 
	oslEndGfx();
	oslQuit();
	return 0;
}

También tengo que instalar una librería extra para que funcione?

Imagen de Dioni0396

Comprueba si te va el del post, el main.c del post

y usa el mismo makefile, ya que los errores que marca el compilador es muy posible que sea del makefile

PD: Error en la linea 24 por poner corss en vez de cross

y no uses _ a la hora de los punteros.

Imagen de fernandodixon3

Hola ÄbäddöŅ™xD

y eso que te veo por aqui a poco eres este http://www.taringa.net/666LUZBELL666/ xD

Imagen de Abaddon Ormuz

Qué onda Fernando, sí, soy

Qué onda Fernando, sí, soy yo.

PD: Perdón por el off-topic :S

Imagen de fernandodixon3

ajajaa

ta bueno tu avatar xDDD ahi te veo en la comu dentro de 9 dias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.