summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/wav_player.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia/wav_player.c')
-rw-r--r--pjmedia/src/pjmedia/wav_player.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/pjmedia/src/pjmedia/wav_player.c b/pjmedia/src/pjmedia/wav_player.c
index 060055d2..e7c3df40 100644
--- a/pjmedia/src/pjmedia/wav_player.c
+++ b/pjmedia/src/pjmedia/wav_player.c
@@ -55,6 +55,8 @@
struct file_port
{
pjmedia_port base;
+ unsigned options;
+ pj_bool_t eof;
pj_size_t bufsize;
char *buf;
char *readpos;
@@ -114,6 +116,10 @@ static pj_status_t fill_buffer(struct file_port *fport)
pj_ssize_t size;
pj_status_t status;
+ if (fport->eof) {
+ return PJ_EEOF;
+ }
+
while (size_left > 0) {
/* Calculate how many bytes to read in this run. */
@@ -135,11 +141,19 @@ static pj_status_t fill_buffer(struct file_port *fport)
* encountered EOF. Rewind the file.
*/
if (size < (pj_ssize_t)size_to_read) {
- PJ_LOG(5,(THIS_FILE, "File port %.*s EOF, rewinding..",
- (int)fport->base.info.name.slen,
- fport->base.info.name.ptr));
- fport->fpos = sizeof(struct pjmedia_wave_hdr);
- pj_file_setpos( fport->fd, fport->fpos, PJ_SEEK_SET);
+ if (fport->options & PJMEDIA_FILE_NO_LOOP) {
+ PJ_LOG(5,(THIS_FILE, "File port %.*s EOF, stopping..",
+ (int)fport->base.info.name.slen,
+ fport->base.info.name.ptr));
+ fport->eof = PJ_TRUE;
+ return PJ_EEOF;
+ } else {
+ PJ_LOG(5,(THIS_FILE, "File port %.*s EOF, rewinding..",
+ (int)fport->base.info.name.slen,
+ fport->base.info.name.ptr));
+ fport->fpos = sizeof(struct pjmedia_wave_hdr);
+ pj_file_setpos( fport->fd, fport->fpos, PJ_SEEK_SET);
+ }
}
}
@@ -156,7 +170,7 @@ static pj_status_t fill_buffer(struct file_port *fport)
PJ_DEF(pj_status_t) pjmedia_wav_player_port_create( pj_pool_t *pool,
const char *filename,
unsigned ptime,
- unsigned flags,
+ unsigned options,
pj_ssize_t buff_size,
void *user_data,
pjmedia_port **p_port )
@@ -167,8 +181,6 @@ PJ_DEF(pj_status_t) pjmedia_wav_player_port_create( pj_pool_t *pool,
pj_status_t status;
- PJ_UNUSED_ARG(flags);
-
/* Check arguments. */
PJ_ASSERT_RETURN(pool && filename && p_port, PJ_EINVAL);
@@ -260,6 +272,7 @@ PJ_DEF(pj_status_t) pjmedia_wav_player_port_create( pj_pool_t *pool,
/* Initialize */
fport->base.user_data = user_data;
+ fport->options = options;
/* Update port info. */
fport->base.info.channel_count = wave_hdr.fmt_hdr.nchan;
@@ -337,6 +350,7 @@ PJ_DEF(pj_status_t) pjmedia_wav_player_port_set_pos(pjmedia_port *port,
samples * BYTES_PER_SAMPLE;
pj_file_setpos( fport->fd, fport->fpos, PJ_SEEK_SET);
+ fport->eof = PJ_FALSE;
return fill_buffer(fport);
}
@@ -384,8 +398,11 @@ static pj_status_t file_get_frame(pjmedia_port *this_port,
fport->readpos = fport->buf;
status = fill_buffer(fport);
- if (status != PJ_SUCCESS)
+ if (status != PJ_SUCCESS) {
+ frame->type = PJMEDIA_FRAME_TYPE_NONE;
+ frame->size = 0;
return status;
+ }
}
} else {
unsigned endread;