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.
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.
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.
Comentarios
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).
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.
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).
De mal o de bien?
Como lo reproduce? (El PC)
XD
Haber, me los reproduce buien, y muchísimo más claro y nitido que en PSP, lo que hace Alsa XD
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.
No es eso
Ya que el archivo en MP3 si que me lo reproduce bien...
Me marca error
Me marca error al compilar
No sé cuál es el error, he revisado línea por línea y no doy con él.
También tengo que instalar una librería extra para que funcione?
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.
Hola ÄbäddöŅ™xD
y eso que te veo por aqui a poco eres este http://www.taringa.net/666LUZBELL666/ xD
Qué onda Fernando, sí, soy
Qué onda Fernando, sí, soy yo.
PD: Perdón por el off-topic :S
ajajaa
ta bueno tu avatar xDDD ahi te veo en la comu dentro de 9 dias