本
课
中将
为
你在程序中播放音
乐
来一点小小的提示。音效和背景音
乐经
常被忽略,但它往往能
让
你的程序
变
得更有趣。幸运的是,
这
篇教程会教你如何在程序里加入音
乐
。
首先我 们 先要通 过 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,否 则 将会提示 错误 ,但是播放没有 问题 。
首先我 们 先要通 过 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,否 则 将会提示 错误 ,但是播放没有 问题 。