summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-07-23 07:46:49 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-07-23 07:46:49 -0600
commitaaa7a7d2936e2f65eca6299f2338db14b7a3dd81 (patch)
tree35c0489f4eee49dc7070ca826acdec36e9fb9ff8 /apps
parent885b62d4d23594573501e36379de0b677bca9451 (diff)
downloadnuttx-aaa7a7d2936e2f65eca6299f2338db14b7a3dd81.tar.gz
nuttx-aaa7a7d2936e2f65eca6299f2338db14b7a3dd81.tar.bz2
nuttx-aaa7a7d2936e2f65eca6299f2338db14b7a3dd81.zip
NxPlayer: Check for read errors and end-of-file with nothing read
Diffstat (limited to 'apps')
-rw-r--r--apps/system/nxplayer/nxplayer.c79
1 files changed, 55 insertions, 24 deletions
diff --git a/apps/system/nxplayer/nxplayer.c b/apps/system/nxplayer/nxplayer.c
index 514d6fdd8..fba3a4e68 100644
--- a/apps/system/nxplayer/nxplayer.c
+++ b/apps/system/nxplayer/nxplayer.c
@@ -480,54 +480,81 @@ static int nxplayer_mediasearch(FAR struct nxplayer_s *pPlayer,
*
****************************************************************************/
-static int nxplayer_enqueuebuffer(struct nxplayer_s *pPlayer,
- struct ap_buffer_s* pBuf)
+static int nxplayer_enqueuebuffer(FAR struct nxplayer_s *pPlayer,
+ FAR struct ap_buffer_s* pBuf)
{
struct audio_buf_desc_s bufdesc;
- int ret;
+ int ret;
//auddbg("Entry: %p\n", pBuf);
/* Validate the file is still open */
if (pPlayer->fileFd == NULL)
- return OK;
+ {
+ return OK;
+ }
/* Read data into the buffer. */
pBuf->nbytes = fread(&pBuf->samp, 1, pBuf->nmaxbytes, pPlayer->fileFd);
if (pBuf->nbytes < pBuf->nmaxbytes)
{
+ /* End of file or read error.. We are finished with this file in any
+ * event.
+ */
+
fclose(pPlayer->fileFd);
pPlayer->fileFd = NULL;
+
+ /* Was this a file read error */
+
+ if (ferror(pPlayer->fileFd))
+ {
+ int errcode = errno;
+ DEBUGASSERT(errcode > 0);
+
+ auddbg("ERROR: fread failed: %d\n", errcode);
+ return errcode;
+ }
}
- /* Now enqueue the buffer with the audio device. If the number of bytes
- * in the file happens to be an exact multiple of the audio buffer size,
- * then we will receive the last buffer size = 0. We encode this buffer
- * also so the audio system knows its the end of the file and can do
- * proper cleanup.
- */
+ /* Do nothing more if this was the end-of-file with nothing read */
+
+ if (pBuf->nbytes > 0)
+ {
+ /* Now enqueue the buffer with the audio device. If the number of
+ * bytes in the file happens to be an exact multiple of the audio
+ * buffer size, then we will receive the last buffer size = 0. We
+ * encode this buffer also so the audio system knows its the end of
+ * the file and can do proper clean-up.
+ */
#ifdef CONFIG_AUDIO_MULTI_SESSION
- bufdesc.session = pPlayer->session;
+ bufdesc.session = pPlayer->session;
#endif
- bufdesc.numbytes = pBuf->nbytes;
- bufdesc.u.pBuffer = pBuf;
- ret = ioctl(pPlayer->devFd, AUDIOIOC_ENQUEUEBUFFER, (unsigned long)
- &bufdesc);
- if (ret >= 0)
- ret = OK;
- else
- ret = errno;
+ bufdesc.numbytes = pBuf->nbytes;
+ bufdesc.u.pBuffer = pBuf;
- return ret;
+ ret = ioctl(pPlayer->devFd, AUDIOIOC_ENQUEUEBUFFER,
+ (unsigned long)&bufdesc);
+ if (ret < 0)
+ {
+ int errcode = errno;
+ DEBUGASSERT(errcode > 0);
+
+ auddbg("ERROR: AUDIOIOC_ENQUEUEBUFFER ioctl failed: %d\n", errcode);
+ return errcode;
+ }
+ }
+
+ return OK;
}
/****************************************************************************
* Name: nxplayer_thread_playthread
*
- * This is the thread that reads the audio file file and enqueue's /
+ * This is the thread that reads the audio file file and enqueues /
* dequeues buffers to the selected and opened audio device.
*
****************************************************************************/
@@ -627,9 +654,13 @@ static void *nxplayer_playthread(pthread_addr_t pvarg)
/* Error encoding initial buffers or file is small */
if (x == 0)
- running = false;
+ {
+ running = false;
+ }
else
- playing = false;
+ {
+ playing = false;
+ }
break;
}
@@ -639,7 +670,7 @@ static void *nxplayer_playthread(pthread_addr_t pvarg)
#ifdef CONFIG_AUDIO_MULTI_SESSION
ret = ioctl(pPlayer->devFd, AUDIOIOC_START,
- (unsigned long) pPlayer->session);
+ (unsigned long) pPlayer->session);
#else
ret = ioctl(pPlayer->devFd, AUDIOIOC_START, 0);
#endif