ページ 11

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 さんが書きました:DXライブラリPortableのソースコードを見ると、音量が0で初期化されているようです。
ChangeVolumeSoundMemで音量を上げたら聞こえるようになるのではないでしょうか。

http://sourceforge.jp/projects/dxlibp/s ... nd/sound.c
dxpSoundInit関数でdxpSoundArray構造体配列に対して、音量以外もあらゆるパラメータをmemsetを使った内部表現0で一括初期化してます。
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には問題がある。
というような感じです。

わかりづらくてすみません(´Д`;)