本課中將爲你在程序中播放音樂來一點小小的提示。音效和背景音樂經常被忽略,但它往往能讓你的程序變得更有趣。幸運的是,這篇教程會教你如何在程序里加入音樂。
首先我們先要通過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,否則將會提示錯誤,但是播放沒有問題。