ページ 1 / 1
DXライブラリPortableの音楽再生について。
Posted: 2012年11月14日(水) 22:43
by ぷにおさん
こんばんは。
はじめて投稿させていただきます。
ぷにおさんと申します。
早速質問なのですが、
DxライブラリPortableを使って、PSPで音楽を再生する様にプログラムを作成したいのです。
(実験段階なので、小さなプログラムです。)
が、試しに組んでみたところ、再生されません。
コード:
#include <pspkernel.h>
#include <dxlibp.h>
PSP_MODULE_INFO("TEST", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
int title[1];
int sound;
int main()
{
DxLib_Init();
InitSoundMem();
SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE);
LoadDivGraph("mydat/dat/title/th07logo_HD.png",1,1,1,480,272,title);
sound = LoadSoundMem("mydat/dat/music/th07_01.mp3");
while(ProcessMessage() != -1)
{
ClearDrawScreen();
if(CheckSoundMem(sound) == 0){
PlaySoundMem(sound,DX_PLAYTYPE_LOOP,TRUE);
}
if(CheckHitKey(KEY_INPUT_UP)>=1){ //試験的に、プログラムが起動していることを示すために書きました。
DrawRotaGraph(240,136,1.0,0.0,title[0],TRUE);
}
ScreenFlip();
}
DxLib_End();
return 0;
}
ファイル名などは気にしないでください(・・;)
このように書いたのですが、DrawRotaGraph関数で表示される画像は、きちんと表示されますが、
音楽はいつまでたっても再生されません。
どなたか、わかる方、ご教授願います。
※こちらの都合上、PSPが今、手元になく、Jpcspで動作を確認しています。
PSPでは普通に流れたということがありましたら、ご報告頂けると嬉しいです。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月15日(木) 02:02
by トントン
DxライブラリPortableは使用したことがないので
詳細はわかりませんが。
sound は正常な値が返って来ているのでしょうか?
また、音楽ファイルは正常に音がでるのでしょうか?
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月15日(木) 10:46
by softya(ソフト屋)
mp3の形式次第で再生できない可能性があるので色んなmp3で試してみてください。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月15日(木) 20:41
by ぷにおさん
試しに、このようにコードを書き換えてみたのですが、
コード:
#include <pspkernel.h>
#include <dxlibp.h>
PSP_MODULE_INFO("TEST", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
int title[1];
int sound;
int main()
{
DxLib_Init();
InitSoundMem();
SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE);
LoadDivGraph("mydat/dat/title/th07logo_HD.png",1,1,1,480,272,title);
sound = LoadSoundMem("mydat/dat/music/th07_01.mp3");
while(ProcessMessage() != -1)
{
ClearDrawScreen();
if(sound==-1){
printfDx("Error!");
ScreenFlip();
}
else if(sound !=0){
printfDx("Cleared!");
ScreenFlip();
}
if(CheckSoundMem(sound) == 0){
PlaySoundMem(sound,DX_PLAYTYPE_LOOP,TRUE);
}
if(CheckHitKey(KEY_INPUT_UP)>=1){
DrawRotaGraph(240,136,1.0,0.0,title[0],TRUE);
}
ScreenFlip();
}
EXIT:
DxLib_End();
return 0;
}
たくさんの”Cleared!”が表示されたので、ロードはできているはずなのですが、再生ができていないようです
↑while文中に書くべきではなかったですね・・・
>softya様より
>mp3の形式次第で再生できない可能性があるので色んなmp3で試してみてください。
mp3の形式とは、どういうことでしょうか?
詳しく教えていただけると嬉しいです。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月15日(木) 21:08
by softya(ソフト屋)
mp3とは以下の形式を満たしていればmp3と呼ばれますが、必ずしも全部の形式を再生できるとは限らないと言うことです。
「MP3 - Wikipedia」
http://ja.wikipedia.org/wiki/MP3#.E4.BB.95.E6.A7.98
この中の(MPEG-1 Audio Layer-3)の形式のものに限ると思いますので確認してみてください。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月18日(日) 17:02
by ぷにおさん
返信がおくれて申し訳ありません。
試しに、以下の手順で、
・固定ビットレート128kbps
・周波数44.1kHz
としてみたのですが、
どうもうまくいきません・・・
ちなみに、コードは現状こんな感じです。
コード:
#include <pspkernel.h>
#include <dxlibp.h>
PSP_MODULE_INFO("TEST", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
int title[1];
int sound;
//-------------------------------------------------------------------
//fps監視
//-------------------------------------------------------------------
class Fps{
int mStartTime; //測定開始時刻
int mCount; //カウンタ
float mFps; //fps
static const int N = 60;//平均を取るサンプル数
static const int FPS = 30; //設定したFPS
public:
Fps(){
mStartTime = 0;
mCount = 0;
mFps = 0;
}
bool Update(){
if( mCount == 0 ){ //1フレーム目なら時刻を記憶
mStartTime = GetNowCount();
}
if( mCount == N ){ //60フレーム目なら平均を計算する
int t = GetNowCount();
mFps = 1000.f/((t-mStartTime)/(float)N);
mCount = 0;
mStartTime = t;
}
mCount++;
return true;
}
void Draw(){
DrawFormatString(0, 0, GetColor(255,255,255), "%.1f", mFps);
}
void Wait(){
int tookTime = GetNowCount() - mStartTime; //かかった時間
int waitTime = mCount*1000/FPS - tookTime; //待つべき時間
if( waitTime > 0 ){
Sleep(waitTime); //待機
}
}
};
Fps fps;
int main()
{
DxLib_Init();
InitSoundMem();
SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE);
LoadDivGraph("mydat/dat/title/th07logo_HD.png",1,1,1,480,272,title);
sound = LoadSoundMem("mydat/dat/music/th_07_01.mp3");
if(sound==-1){
printfDx("Error!\n");
ScreenFlip();
}
else if(sound !=-1){
printfDx("Cleared!\n");
ScreenFlip();
}
while(ProcessMessage() ==0){
if(CheckSoundMem(sound)==0){
PlaySoundMem(sound,DX_PLAYTYPE_BACK,TRUE);
printfDx("Music start!\n");
}
fps.Update(); //更新
fps.Draw(); //描画
ScreenFlip();
fps.Wait(); //待機
if(CheckHitKey(KEY_INPUT_F)==1){
break;
}
}
DxLib_End();
return 0;
}
実行結果は、
Cleared!
Music start!
一定時間すると、またMusic startが表示されます。
fps表示はされません・・・。
2回Music startが表示されたということは、曲は再生されているようなんですが・・・
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月18日(日) 17:34
by ISLe
ぷにおさん さんが書きました:一定時間すると、またMusic startが表示されます。
fps表示はされません・・・。
2回Music startが表示されたということは、曲は再生されているようなんですが・・・
DXライブラリPortableのソースコードを見ると、音量が0で初期化されているようです。
ChangeVolumeSoundMemで音量を上げたら聞こえるようになるのではないでしょうか。
http://sourceforge.jp/projects/dxlibp/s ... nd/sound.c
dxpSoundInit関数でdxpSoundArray構造体配列に対して、音量以外もあらゆるパラメータをmemsetを使った内部表現0で一括初期化してます。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月19日(月) 18:41
by ぷにおさん
ISLe様、わざわざ調べてくださってありがとうございます!
なるほど、一度初期化されていたのですね・・・
試しに、PlaySoundMem関数の前にChangeVolumeSoundMem関数を設置しましたが、相変わらずですorz
明日、一時的にPSPが帰ってくるので、一回試してみようと思います。
もしかしたら、Jpcspが悪いかもしれませんし。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月21日(水) 18:10
by ぷにおさん
返信おくれて申し訳ありません。
本当は昨日のうちにPSPでチェックしたかったのですが、風邪をこじらせまして・・・
そして、本日、PSPで動作確認したところ、きちんと音がなりました!
いままで協力してくださった、
トントン様、softya様、ISLe様、
ご協力ありがとうございました!
また、なにかあったら、質問することがあるでしょうが、その時はまた、よろしくお願いします!
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月21日(水) 18:29
by ISLe
報告からは読み取れないので確認させてください。
JPCSPだけの問題だったのでしょうか。
DXライブラリPortableのボリューム初期値の問題は無かったのでしょうか。
Re: DXライブラリPortableの音楽再生について。
Posted: 2012年11月23日(金) 19:59
by ぷにおさん
返信がおくれてすみません。
申し訳ないのですが、
ボリュームの件は、ChangeVolumeSoundMem有り無し両方では検証していません。
PSPでチェックしたものは、ChangeVolumeSoundMem関数を組み込んだものしか動作確認していないのです。
しかし、0に初期化されることを考えると、やはり必要なのでは・・・
今度検証する機会があったら、また書き込みます。
また、Jpcsp上では、再生されなかったので、Jpcspの問題であったのではないかと疑っています。
結論として、
ChangeVolumeSoundMem関数は必要かどうかはわからない。
しかし、Jpcsp上はあっても無くても再生されなかったので、Jpcspには問題がある。
というような感じです。
わかりづらくてすみません(´Д`;)