Fix playback bug & don't stop on every file select
Fixed a bug where ctrmus would freeze after selecting an unsupported file. Fixed a bug whereby selecting an unsupported file would stop playback. Signed-off-by: Mahyar Koshkouei <deltabeard@users.noreply.github.com>
This commit is contained in:
@@ -82,6 +82,13 @@ static int changeFile(const char* ep_file, struct playbackInfo_t* playbackInfo)
|
||||
s32 prio;
|
||||
static Thread thread = NULL;
|
||||
|
||||
if(ep_file != NULL && getFileType(ep_file) == FILE_TYPE_ERROR)
|
||||
{
|
||||
*playbackInfo->errInfo->error = errno;
|
||||
svcSignalEvent(*playbackInfo->errInfo->failEvent);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* If music is playing, stop it. Only one playback thread should be playing
|
||||
* at any time.
|
||||
@@ -94,9 +101,6 @@ static int changeFile(const char* ep_file, struct playbackInfo_t* playbackInfo)
|
||||
threadJoin(thread, U64_MAX);
|
||||
threadFree(thread);
|
||||
thread = NULL;
|
||||
|
||||
/* free allocated file string */
|
||||
delete(playbackInfo->file);
|
||||
}
|
||||
|
||||
if(ep_file == NULL || playbackInfo == NULL)
|
||||
|
||||
@@ -47,7 +47,7 @@ bool isPlaying(void)
|
||||
* \param file File location.
|
||||
* \return File type, else negative and errno set.
|
||||
*/
|
||||
static int getFileType(const char *file)
|
||||
int getFileType(const char *file)
|
||||
{
|
||||
FILE* ftest = fopen(file, "rb");
|
||||
uint32_t fileSig;
|
||||
@@ -136,6 +136,7 @@ void playFile(void* infoIn)
|
||||
bool lastbuf = false;
|
||||
int ret = -1;
|
||||
const char* file = info->file;
|
||||
bool isNdspInit = false;
|
||||
|
||||
/* Reset previous stop command */
|
||||
stop = false;
|
||||
@@ -168,6 +169,8 @@ void playFile(void* infoIn)
|
||||
goto err;
|
||||
}
|
||||
|
||||
isNdspInit = true;
|
||||
|
||||
if((ret = (*decoder.init)(file)) != 0)
|
||||
{
|
||||
errno = DECODER_INIT_FAIL;
|
||||
@@ -253,8 +256,13 @@ void playFile(void* infoIn)
|
||||
|
||||
(*decoder.exit)();
|
||||
out:
|
||||
ndspChnWaveBufClear(CHANNEL);
|
||||
ndspExit();
|
||||
if(isNdspInit == true)
|
||||
{
|
||||
ndspChnWaveBufClear(CHANNEL);
|
||||
ndspExit();
|
||||
}
|
||||
|
||||
delete(info->file);
|
||||
linearFree(buffer1);
|
||||
linearFree(buffer2);
|
||||
threadExit(0);
|
||||
|
||||
@@ -30,15 +30,6 @@ struct playbackInfo_t
|
||||
struct errInfo_t* errInfo;
|
||||
};
|
||||
|
||||
/**
|
||||
* Should only be called from a new thread only, and have only one playback
|
||||
* thread at time. This function has not been written for more than one
|
||||
* playback thread in mind.
|
||||
*
|
||||
* \param infoIn Playback information.
|
||||
*/
|
||||
void playFile(void* infoIn);
|
||||
|
||||
/**
|
||||
* Pause or play current file.
|
||||
*
|
||||
@@ -56,4 +47,21 @@ void stopPlayback(void);
|
||||
*/
|
||||
bool isPlaying(void);
|
||||
|
||||
/**
|
||||
* Obtains file type.
|
||||
*
|
||||
* \param file File location.
|
||||
* \return File type, else negative and errno set.
|
||||
*/
|
||||
int getFileType(const char *file);
|
||||
|
||||
/**
|
||||
* Should only be called from a new thread only, and have only one playback
|
||||
* thread at time. This function has not been written for more than one
|
||||
* playback thread in mind.
|
||||
*
|
||||
* \param infoIn Playback information.
|
||||
*/
|
||||
void playFile(void* infoIn);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user