* Make it so that we do not crash trying to play an MP3 that failed
  to load.
This commit is contained in:
jean.chalard
2009-06-11 14:47:21 +00:00
parent c1565450e5
commit 3639ac291f
3 changed files with 281 additions and 283 deletions
+41 -48
View File
@@ -18,9 +18,8 @@ void JMP3::init() {
loadModules();
}
JMP3::JMP3(const std::string& filename, int inBufferSize, int outBufferSize) :
JMP3::JMP3() :
m_volume(PSP_AUDIO_VOLUME_MAX), m_samplesPlayed(0), m_paused(true) {
load(filename, inBufferSize,outBufferSize);
}
JMP3::~JMP3() {
@@ -50,21 +49,21 @@ bool JMP3::fillBuffers() {
if (ret < 0)
return false;
if (sceIoLseek32(m_fileHandle, pos, SEEK_SET) < 0) {
// Re-open the file because file handel can be invalidated by suspend/resume.
sceIoClose(m_fileHandle);
m_fileHandle = sceIoOpen(m_fileName, PSP_O_RDONLY, 0777);
if (m_fileHandle < 0)
return false;
if (sceIoLseek32(m_fileHandle, 0, SEEK_END) != m_fileSize
|| sceIoLseek32(m_fileHandle, pos, SEEK_SET) < 0) {
sceIoClose(m_fileHandle);
m_fileHandle = -1;
return false;
}
}
int readLength = sceIoRead(m_fileHandle, dest, length);
if (sceIoLseek32(m_fileHandle, pos, SEEK_SET) < 0) {
// Re-open the file because file handel can be invalidated by suspend/resume.
sceIoClose(m_fileHandle);
m_fileHandle = sceIoOpen(m_fileName, PSP_O_RDONLY, 0777);
if (m_fileHandle < 0)
return false;
if (sceIoLseek32(m_fileHandle, 0, SEEK_END) != m_fileSize
|| sceIoLseek32(m_fileHandle, pos, SEEK_SET) < 0) {
sceIoClose(m_fileHandle);
m_fileHandle = -1;
return false;
}
}
int readLength = sceIoRead(m_fileHandle, dest, length);
if (readLength < 0)
return false;
@@ -88,35 +87,29 @@ bool JMP3::load(const std::string& filename, int inBufferSize, int outBufferSize
// return false;
m_fileHandle = sceIoOpen(filename.c_str(), PSP_O_RDONLY, 0777);
if (m_fileHandle < 0)
return false;
// Memorise the full path for reloading with decode thread.
if ( getcwd(m_fileName, sizeof(m_fileName)) ){
int len = strnlen(m_fileName, sizeof(m_fileName));
if (len + filename.size() <= sizeof(m_fileName) - 2){
m_fileName[len++] = '/';
strcpy(m_fileName + len, filename.c_str());
}else{
m_fileName[0] = NULL;
}
}
int ret = sceMp3InitResource();
if (ret < 0)
if (m_fileHandle < 0)
return false;
// Memorise the full path for reloading with decode thread.
if ( getcwd(m_fileName, sizeof(m_fileName)) ){
int len = strnlen(m_fileName, sizeof(m_fileName));
if (len + filename.size() <= sizeof(m_fileName) - 2){
m_fileName[len++] = '/';
strcpy(m_fileName + len, filename.c_str());
}else{
m_fileName[0] = NULL;
}
}
int ret = sceMp3InitResource();
if (ret < 0)
return false;
SceMp3InitArg initArgs;
int fileSize = sceIoLseek32(m_fileHandle, 0, SEEK_END);
sceIoLseek32(m_fileHandle, 0, SEEK_SET);
m_fileSize = fileSize;
unsigned char* testbuffer = new unsigned char[7456];
sceIoRead(m_fileHandle, testbuffer, 7456);
delete testbuffer;
m_fileSize = fileSize;
initArgs.unk1 = 0;
initArgs.unk2 = 0;
@@ -165,8 +158,8 @@ bool JMP3::unload() {
}
bool JMP3::update() {
int retry = 8;//FIXME:magic number
JMP3_update_start:
int retry = 8;//FIXME:magic number
JMP3_update_start:
if (!m_paused) {
if (sceMp3CheckStreamDataNeeded(m_mp3Handle) > 0) {
@@ -190,11 +183,11 @@ bool JMP3::update() {
// Okay, let's see if we can't get something outputted :/
if (numDecoded == 0 || ((unsigned)numDecoded == 0x80671402)) {
if (retry-- > 0){
//give me a recovery chance after suspend/resume...
sceKernelDelayThread(1);
goto JMP3_update_start;
}
if (retry-- > 0){
//give me a recovery chance after suspend/resume...
sceKernelDelayThread(1);
goto JMP3_update_start;
}
sceMp3ResetPlayPosition(m_mp3Handle);
if (!m_loop)
@@ -212,7 +205,7 @@ bool JMP3::update() {
// Output
m_samplesPlayed += sceAudioSRCOutputBlocking(m_volume, tempBuffer);
m_playTime = (m_samplingRate > 0) ? (m_samplesPlayed / (m_samplingRate/1000)) : 0;
m_lastDecoded = numDecoded;
m_lastDecoded = numDecoded;
}
}