您的位置:首页 > 其它

PSP开发教程第六课----如何加入音乐

2008-04-18 23:33 253 查看
[align=left][/align]
[align=left]本课中将为你在程序中播放音乐来一点小小的提示。音效和背景音乐经常被忽略,但它往往能让你的程序变得更有趣。幸运的是,这篇教程会教你如何在程序里加入音乐。

首先我们先要通过SVN得到libmad(libmad是一个遵循GPL的MPED的音频解码器开发包)
打开cygwin,输入:
svn checkout svn://svn.ps2dev.org/psp/trunk/libmad
你会看到一个很长的列表,我们进到libmad目录,编译这个库
cd libmad
make
下一步回合我们第4课中学习到的安装库文件的方法有些不同,平常我只需要输入“make install”,就会自动的安装文件到相应的目录里。这里不同了,libmad的安装脚本对make install不感冒,,不过不要担心,我们自己动手来解决它
cp -Rf ./include /usr/local/pspdev/psp/
cp -Rf ./lib/libmad.a /usr/local/pspdev/psp/lib
注意:"./include" 和"/usr..." ,libmad.a" 和 "/usr..."之间各有一个空格
所有的文件就会被拷贝到相应的位置。“-Rf”标签的意思是"Recursive"(递归) 和 "final"(最后)--帮助你保证准确无误的拷贝所有文件。
接下来,下载另外一些必要的文件mp3player.c 和 mp3player.h在一个新建的文件夹里(下载地址:http://www.scriptscribbler.com/psp/tutorials/lesson06.zip)
下面进入本课中有趣的部分:建立main.c,写把注释写上吧!
// Mp3 Player Sample on PSP
// By *YOUR NAME HERE*
下面这段代码你是否感觉似曾相识啊,只有两个新的.h文件看起来眼生,他们是在程序中加入音频处理部分所必须的。
#include <pspkernel.h>
#include <pspctrl.h>
#include <pspdebug.h>
#include <pspaudio.h>
#include <pspaudiolib.h>
#include <psppower.h>

#include "mp3player.h"

PSP_MODULE_INFO("Mp3 Player Example", 0, 1, 1);
#define printf pspDebugScreenPrintf
你肯定还发现了刚才下载的mp3player.h(它一定要和你的源代码在同一文件夹里),我们还定义了printf和PSP_MODULE_INFO。
现在这个时候是本课中的黎明前时分,因为我们不知道下面这段代码怎么工作,不过我们以后会明白的。但是可以肯定它对你的程序是十分必须的。
// TWILIGHT ZONE! <do doo do doo>
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

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

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

sceKernelSleepThreadCB();

return 0;
}

/* Sets up the callback thread and returns its 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;
}
// END OF TWILIGHT ZONE! <do doo do do>
现在开始我们的main部分吧,首先我们让psp的时钟满负荷,不用担心绝对不会让你心爱的小p受到任何伤害。值得注意的是:“pspAudioInit()”函数,它跟我们经常调用的“pspDebugScreenInit()”函数有些类似之处,它让psp为发声做好准备。
int main() {
scePowerSetClockFrequency(333, 333, 166);

pspDebugScreenInit();
SetupCallbacks();

pspAudioInit();
SceCtrlData pad;
int i;
擦亮你的眼睛,新东西哦
MP3_Init(1);
MP3_Load("test.mp3");
MP3_Play();
MP3_Init() 初始化了一个结构体,传入的参数代表psp播放时所使用的声道(本例中选择的是1)。MP3_Load() 负责读取你的mp3文件(文件名是test.mp3).。MP3_Play() 让你的psp开始播放mp3。
下面是一些你可以选择的部分,会给你提供一个简单的用户界面。
while(1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CROSS) {
break;
} else if(pad.Buttons & PSP_CTRL_CIRCLE) {
MP3_Pause();
for(i=0; i<10; i++) {
sceDisplayWaitVblankStart();
}
}

if (MP3_EndOfStream() == 1) {
MP3_Stop();
}
}
这样我们就可以读取用户的按键输入(第3课中已经说明了),如果我们按了“X”,我们就会退出播放循环,如果按下“O”,MP3_Stop() 函数会帮我们暂停mp3的播放。最后我们用MP3_EndOfStream()函数来检查mp3是不是播放完了。如果播放完,函数返回1,没有播放完就返回0。如果播放完了,我们要将重复播放的功能停止,不然它一直播放到psp没电。
接下来,我们添加一些当用户退出播放循环起约束作用的代码
MP3_Stop();
MP3_FreeTune();

sceKernelSleepThread();

return 0;
}
关闭我们的程序,首先我们先要停止mp3,还要释放播放mp3文件时使用的内存空间。释放空间对程序来说是十分重要的。如果那你不释放内存的话,这部分内存在MP3停止之后不能被其他程序使用。
这就是本课所的c程序。很简单吧。接下来还是要Makefile
记住了,Makefile没有后缀名。
最大的改动是我们添加了新的库“lmad”,用来连接libmad,给mp3编码,"pspaudiolib" 和 "pspaudio"
为我们访问psp的声音设备提供了接口。
TARGET = mp3
OBJS = mp3player.o main.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =

LIBS = -lmad -lpspaudiolib -lpspaudio -lpsppower
LDFLAGS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = MP3 Player Example
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

现在,我们进入cygwin,找到我们的工程文件夹,输入那个有魔力的单词“make”!
你需要拷贝test.mp3文件到你的psp,1.50版本, 你把它放在文件名结尾没有 "%"的那个文件夹。另外mp3文件的比特率必须小于等于160 KBPS,否则将会提示错误,但是播放没有问题。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: