diff --git a/source/main.c b/source/main.c index 04f9b7b..1315b42 100644 --- a/source/main.c +++ b/source/main.c @@ -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) diff --git a/source/playback.c b/source/playback.c index 109b6d6..6695e60 100644 --- a/source/playback.c +++ b/source/playback.c @@ -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); diff --git a/source/playback.h b/source/playback.h index 60f0d24..2b4abda 100644 --- a/source/playback.h +++ b/source/playback.h @@ -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