「API/audio/sample1」の編集履歴(バックアップ)一覧はこちら

API/audio/sample1 - (2008/11/24 (月) 01:07:22) の最新版との変更点

追加された行は緑色になります。

削除された行は赤色になります。

//wavヘッダ読み込みとコールバック設定なくせば //すっきりするので、PCM再生は簡単です。 //読みにくいのとかは気にしないでください。 //あとwavheadreadは大昔に作ったものなので当時 //getw()とか知らなかったんで…あとキャストも怪しいですけど #include <pspkernel.h> #include <pspdebug.h> #include <pspaudiolib.h> #include <pspaudio.h> #include <pspdisplay.h> #include <stdio.h> #include <string.h> PSP_MODULE_INFO("TEST",0,1,1); PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU); int endflag=0; FILE *in; int exit_callback(int arg1,int arg2,void *common) { endflag=1; return 0; } int CallbackThread(SceSize args,void *argp) { int cbid = sceKernelCreateCallback("Exit Callback",exit_callback,NULL); sceKernelRegisterExitCallback(cbid); sceKernelSleepThreadCB(); return 0; } int setupCallbacks(void) { int thid = 0; thid = sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0); if(thid >= 0) sceKernelStartThread(thid,0,0); return thid; } int wavfileheadread(){ char read[50],str[50];/*tmp*/ unsigned int id;/*tmp*/ unsigned long size;/*tmp*/ int lengthofwavefmtchunk,startofdatasecinwavfile; int datasize;/*datachunksize*/ /* //////////////////////////header check//////////////////////////// */ fgets(read,5,in); if(strcmp(read,"RIFF")!=0) { pspDebugScreenSetXY(0,0); sprintf(str,"riff wavhead er."); pspDebugScreenPrintf(str); } /* //////////////////////////file size/////////////////////////////// */ size=(long)fgetc(in)|(long)fgetc(in)<<8|(long)fgetc(in)<<16|(long)fgetc(in)<<24; size+=8; /* ////////////////////////wave file check/////////////////////////// */ fgets(read,9,in); if(strcmp(read,"WAVEfmt ")!=0) { pspDebugScreenSetXY(0,0); sprintf(str,"wavefmt wav head er."); pspDebugScreenPrintf(str); } /* /////////////////////////length of 'wavefmt 'chank//////////////// */ lengthofwavefmtchunk=(long)fgetc(in)|(long)fgetc(in)<<8|(long)fgetc(in)<<16|(long)fgetc(in)<<24; /* /////////////////////////format id/////////////////////////////// */ id=(long)fgetc(in)|(long)fgetc(in)<<8; if(id!=0x1) { pspDebugScreenSetXY(0,0); sprintf(str,"id wavhead er."); pspDebugScreenPrintf(str); } /* ////////////////////////channel///////////////////////////////// */ id=(long)fgetc(in)|(long)fgetc(in)<<8; /* //////////////////////sampling rate/////////////////////////// */ size=(long)fgetc(in)|(long)fgetc(in)<<8|(long)fgetc(in)<<16|(long)fgetc(in)<<24; if(size!=44100) { pspDebugScreenSetXY(0,0); sprintf(str,"sr wavhead er."); pspDebugScreenPrintf(str); } /* /////////////////////data speed //////////////////////////// */ size=(long)fgetc(in)|(long)fgetc(in)<<8|(long)fgetc(in)<<16|(long)fgetc(in)<<24; /* /////////////////////brock size//////////////////////////// */ id=(long)fgetc(in)|(long)fgetc(in)<<8; /* ////////////////////bits of one sample///////////////////// */ id=(long)fgetc(in)|(long)fgetc(in)<<8; fseek(in,0x14+lengthofwavefmtchunk,SEEK_SET); startofdatasecinwavfile=0x14+lengthofwavefmtchunk; /*factとかある場合を考えた*/ datasize=0x14+lengthofwavefmtchunk; fseek(in,datasize,SEEK_SET); while((char)fgetc(in)!='d'){ fseek(in,0x3,SEEK_CUR); datasize=((long)fgetc(in)|(long)fgetc(in)<<8|(long)fgetc(in)<<16|(long)fgetc(in)<<24); fseek(in,datasize,SEEK_CUR); startofdatasecinwavfile+=8+datasize; }/*while*/ fseek(in,0x3,SEEK_CUR); datasize=(long)fgetc(in)|(long)fgetc(in)<<8|(long)fgetc(in)<<16|(long)fgetc(in)<<24; startofdatasecinwavfile+=8; return(datasize); }//func int main(int argc,char *argv[]) { int ret=0,pcmhandle; char str[50],pcmbuf[128000]; //homeボタンコールバック setupCallbacks(); //pspDebugScreenなんたら使うのの初期化 pspDebugScreenInit(); //カレントディレクトリのd_03.wavというファイルを再生する。 if((in=fopen("d_03.wav","rb"))==NULL){ pspDebugScreenSetXY(0,0); sprintf(str,"file open failed."); pspDebugScreenPrintf(str); endflag=1; } //wavファイルヘッダーを処理。 wavfileheadread(); //オーディオ出力初期化割り当て バッファ最大、ステレオで pcmhandle=ret=sceAudioChReserve(PSP_AUDIO_NEXT_CHANNEL,PSP_AUDIO_SAMPLE_MAX,PSP_AUDIO_FORMAT_STEREO); if(ret<0){//失敗 pspDebugScreenSetXY(0,0); sprintf(str,"pcm open failed."); pspDebugScreenPrintf(str); endflag=1; } else{//成功 pspDebugScreenSetXY(0,0); sprintf(str,"pcm open ok."); pspDebugScreenPrintf(str); } //再生するループ while(feof(in)==0&&endflag==0){//homeボタンで終わりを指定するか、ファイルが最後まで行ったらループ抜ける。 //ファイルから読み込み。サンプル指定なので*2(ステレオ)*2(16bit)なんかおかしい気もするけどこうなってる。 fread(pcmbuf,1,PSP_AUDIO_SAMPLE_MAX*2*2,in); //ボリューム最大で(これも最大かはあやしい。)再生。 sceAudioOutputBlocking(pcmhandle,PSP_AUDIO_VOLUME_MAX,pcmbuf); } //解放 sceAudioChRelease(pcmhandle); //終了 sceKernelExitGame(); return 0; }

表示オプション

横に並べて表示:
変化行の前後のみ表示: