int UnloadSceMp3(int channel) { if ((channel<0)||(channel>1)) { return PSPAALIB_ERROR_SCEMP3_INVALID_CHANNEL; } StopSceMp3(channel); if (!streamsSceMp3[channel].initialized) { return PSPAALIB_SUCCESS; } sceMp3ReleaseMp3Handle(streamsSceMp3[channel].handle); sceIoClose(streamsSceMp3[channel].file); free(streamsSceMp3[channel].mp3Buf); free(streamsSceMp3[channel].pcmBuf); streamsSceMp3[channel].initialized=FALSE; streamsSceMp3[channel].paused=TRUE; streamsSceMp3[channel].stopReason=PSPAALIB_STOP_UNLOADED; return PSPAALIB_SUCCESS; }
bool JMP3::unload() { JLOG("Start JMP3::unload"); if (!init_done) { JLOG("JMP3::unload called but init_done is false!"); return false; } #ifdef MP3_SUPPORT if (m_channel >= 0) sceAudioSRCChRelease(); sceMp3ReleaseMp3Handle(m_mp3Handle); sceMp3TermResource(); sceIoClose(m_fileHandle); //delete[] m_inBuffer; //delete[] m_outBuffer; #endif JLOG("End JMP3::unload"); return true; }
/* main routine */ int main(int argc, char *argv[]) { SceCtrlData pad; //init screen and callbacks pspDebugScreenInit(); pspDebugScreenClear(); SetupCallbacks(); // Setup Pad sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(0); // Load modules int status = sceUtilityLoadModule(PSP_MODULE_AV_AVCODEC); if (status<0) { ERRORMSG("ERROR: sceUtilityLoadModule(PSP_MODULE_AV_AVCODEC) returned 0x%08X\n", status); } status = sceUtilityLoadModule(PSP_MODULE_AV_MP3); if (status<0) { ERRORMSG("ERROR: sceUtilityLoadModule(PSP_MODULE_AV_MP3) returned 0x%08X\n", status); } // Open the input file int fd = sceIoOpen( MP3FILE, PSP_O_RDONLY, 0777 ); if (fd<0) { ERRORMSG("ERROR: Could not open file '%s' - 0x%08X\n", MP3FILE, fd); } // Init mp3 resources status = sceMp3InitResource(); if (status<0) { ERRORMSG("ERROR: sceMp3InitResource returned 0x%08X\n", status); } // Reserve a mp3 handle for our playback SceMp3InitArg mp3Init; mp3Init.mp3StreamStart = 0; mp3Init.mp3StreamEnd = sceIoLseek32( fd, 0, SEEK_END ); mp3Init.unk1 = 0; mp3Init.unk2 = 0; mp3Init.mp3Buf = mp3Buf; mp3Init.mp3BufSize = sizeof(mp3Buf); mp3Init.pcmBuf = pcmBuf; mp3Init.pcmBufSize = sizeof(pcmBuf); int handle = sceMp3ReserveMp3Handle( &mp3Init ); if (handle<0) { ERRORMSG("ERROR: sceMp3ReserveMp3Handle returned 0x%08X\n", handle); } // Fill the stream buffer with some data so that sceMp3Init has something to work with fillStreamBuffer( fd, handle ); status = sceMp3Init( handle ); if (status<0) { ERRORMSG("ERROR: sceMp3Init returned 0x%08X\n", status); } int channel = -1; int samplingRate = sceMp3GetSamplingRate( handle ); int numChannels = sceMp3GetMp3ChannelNum( handle ); int lastDecoded = 0; int volume = PSP_AUDIO_VOLUME_MAX; int numPlayed = 0; int paused = 0; int lastButtons = 0; int loop = 0; while (isrunning) { sceDisplayWaitVblankStart(); pspDebugScreenSetXY(0, 0); printf("PSP Mp3 Sample v1.0 by Raphael\n\n"); printf("Playing '%s'...\n", MP3FILE); printf(" %i Hz\n", samplingRate); printf(" %i kbit/s\n", sceMp3GetBitRate( handle )); printf(" %s\n", numChannels==2?"Stereo":"Mono"); printf(" %s\n\n", loop==0?"No loop":"Loop"); int playTime = samplingRate>0?numPlayed / samplingRate:0; printf(" Playtime: %02i:%02i\n", playTime/60, playTime%60 ); printf("\n\n\nPress CIRCLE to Pause/Resume playback\nPress TRIANGLE to reset playback\nPress CROSS to switch loop mode\nPress SQUARE to stop playback and quit\n"); if (!paused) { // Check if we need to fill our stream buffer if (sceMp3CheckStreamDataNeeded( handle )>0) { fillStreamBuffer( fd, handle ); } // Decode some samples short* buf; int bytesDecoded; int retries = 0; // We retry in case it's just that we reached the end of the stream and need to loop for (; retries<1; retries++) { bytesDecoded = sceMp3Decode( handle, &buf ); if (bytesDecoded>0) break; if (sceMp3CheckStreamDataNeeded( handle )<=0) break; if (!fillStreamBuffer( fd, handle )) { numPlayed = 0; } } if (bytesDecoded<0 && bytesDecoded!=0x80671402) { ERRORMSG("ERROR: sceMp3Decode returned 0x%08X\n", bytesDecoded); } // Nothing more to decode? Must have reached end of input buffer if (bytesDecoded==0 || bytesDecoded==0x80671402) { paused = 1; sceMp3ResetPlayPosition( handle ); numPlayed = 0; } else { // Reserve the Audio channel for our output if not yet done if (channel<0 || lastDecoded!=bytesDecoded) { if (channel>=0) sceAudioSRCChRelease(); channel = sceAudioSRCChReserve( bytesDecoded/(2*numChannels), samplingRate, numChannels ); } // Output the decoded samples and accumulate the number of played samples to get the playtime numPlayed += sceAudioSRCOutputBlocking( volume, buf ); } } sceCtrlPeekBufferPositive(&pad, 1); if (pad.Buttons!=lastButtons) { if (pad.Buttons & PSP_CTRL_CIRCLE) { paused ^= 1; } if (pad.Buttons & PSP_CTRL_TRIANGLE) { // Reset the stream and playback status sceMp3ResetPlayPosition( handle ); numPlayed = 0; } if (pad.Buttons & PSP_CTRL_CROSS) { loop = (loop==0?-1:0); status = sceMp3SetLoopNum( handle, loop ); if (status<0) { ERRORMSG("ERROR: sceMp3SetLoopNum returned 0x%08X\n", status); } } if (pad.Buttons & PSP_CTRL_SQUARE) { break; } lastButtons = pad.Buttons; } } // Cleanup time... if (channel>=0) sceAudioSRCChRelease(); status = sceMp3ReleaseMp3Handle( handle ); if (status<0) { ERRORMSG("ERROR: sceMp3ReleaseMp3Handle returned 0x%08X\n", status); } status = sceMp3TermResource(); if (status<0) { ERRORMSG("ERROR: sceMp3TermResource returned 0x%08X\n", status); } status = sceIoClose( fd ); if (status<0) { ERRORMSG("ERROR: sceIoClose returned 0x%08X\n", status); } sceKernelExitGame(); return 0; }
int LoadSceMp3(cccUCS2* filename,int channel) { if ((channel<0)||(channel>1)) { return PSPAALIB_ERROR_SCEMP3_INVALID_CHANNEL; } if (streamsSceMp3[channel].initialized) { UnloadSceMp3(channel); } char* c=(char*)malloc(4); c[3]='\0'; streamsSceMp3[channel].mp3Buf=memalign(64,16*1024); streamsSceMp3[channel].pcmBuf=memalign(64,8*1152); streamsSceMp3[channel].file=sceIoOpenUCS2(filename,PSP_O_RDONLY,0777); if (!streamsSceMp3[channel].file) { free(streamsSceMp3[channel].mp3Buf); free(streamsSceMp3[channel].pcmBuf); return PSPAALIB_ERROR_SCEMP3_INVALID_FILE; } streamsSceMp3[channel].args.mp3StreamStart=0; streamsSceMp3[channel].args.mp3StreamEnd=sceIoLseek(streamsSceMp3[channel].file,0,PSP_SEEK_END); streamsSceMp3[channel].args.unk1=0; streamsSceMp3[channel].args.unk2=0; streamsSceMp3[channel].args.mp3Buf=streamsSceMp3[channel].mp3Buf; streamsSceMp3[channel].args.mp3BufSize=16*1024; streamsSceMp3[channel].args.pcmBuf=streamsSceMp3[channel].pcmBuf; streamsSceMp3[channel].args.pcmBufSize=8*1152; sceIoLseek(streamsSceMp3[channel].file,-128,PSP_SEEK_END); sceIoRead(streamsSceMp3[channel].file,c,3); if(!strcmp(c,"TAG")) { streamsSceMp3[channel].args.mp3StreamEnd -= 128; } sceIoLseek(streamsSceMp3[channel].file,0,PSP_SEEK_SET); sceIoRead(streamsSceMp3[channel].file,c,3); if(!strcmp(c,"ID3")) { int tagSize; sceIoLseek(streamsSceMp3[channel].file,6,PSP_SEEK_SET); sceIoRead(streamsSceMp3[channel].file,&tagSize,4); ENDIAN_SWAP_32BIT(tagSize); ID3_TAG_LENGTH_TO_INT(tagSize); streamsSceMp3[channel].args.mp3StreamStart = tagSize + 10; } streamsSceMp3[channel].handle=sceMp3ReserveMp3Handle(&(streamsSceMp3[channel].args)); if (streamsSceMp3[channel].handle<0) { sceIoClose(streamsSceMp3[channel].file); free(streamsSceMp3[channel].mp3Buf); free(streamsSceMp3[channel].pcmBuf); return PSPAALIB_ERROR_SCEMP3_RESERVE_HANDLE; } FillBuffer(channel); if (sceMp3Init(streamsSceMp3[channel].handle)<0) { sceMp3ReleaseMp3Handle(streamsSceMp3[channel].handle); sceIoClose(streamsSceMp3[channel].file); free(streamsSceMp3[channel].mp3Buf); free(streamsSceMp3[channel].pcmBuf); return PSPAALIB_ERROR_SCEMP3_INIT; } streamsSceMp3[channel].initialized=TRUE; streamsSceMp3[channel].paused=TRUE; streamsSceMp3[channel].stopReason=PSPAALIB_STOP_JUST_LOADED; streamsSceMp3[channel].hz=sceMp3GetSamplingRate(streamsSceMp3[channel].handle); return PSPAALIB_SUCCESS; }