/* $Id$ */
/* 
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJMEDIA_WAV_PLAYLIST_H__
#define __PJMEDIA_WAV_PLAYLIST_H__

/**
 * @file wav_playlist.h
 * @brief WAV file playlist.
 */
#include <pjmedia/wav_port.h>



PJ_BEGIN_DECL


/**
 * @defgroup PJMEDIA_WAV_PLAYLIST WAV File Play List
 * @ingroup PJMEDIA_PORT
 * @brief Audio playback of multiple WAV files
 * @{
 *
 * The WAV play list port enables application to play back multiple
 * WAV files in a playlist.
 */

/**
 * Create a WAV playlist from the array of WAV file names. The WAV
 * files must have the same clock rate, number of channels, and bits
 * per sample, or otherwise this function will return error.
 *
 * @param pool		Pool to create memory buffers for this port.
 * @param port_label	Optional label to set as the port name.
 * @param file_list	Array of WAV file names.
 * @param file_count	Number of files in the array.
 * @param ptime		The duration (in miliseconds) of each frame read
 *			from this port. If the value is zero, the default
 *			duration (20ms) will be used.
 * @param options	Optional options. Application may specify 
 *			PJMEDIA_FILE_NO_LOOP to prevent play back loop.
 * @param buff_size	Buffer size to be allocated. If the value is zero or
 *			negative, the port will use default buffer size (which
 *			is about 4KB).
 * @param p_port	Pointer to receive the file port instance.
 *
 * @return		PJ_SUCCESS on success, or the appropriate error code.
 */
PJ_DECL(pj_status_t) pjmedia_wav_playlist_create(pj_pool_t *pool,
						 const pj_str_t *port_label,
						 const pj_str_t file_list[],
						 int file_count,
						 unsigned ptime,
						 unsigned options,
						 pj_ssize_t buff_size,
						 pjmedia_port **p_port);


/**
 * Register a callback to be called when the file reading has reached the
 * end of file of the last file. If the file is set to play repeatedly, 
 * then the callback will be called multiple times. Note that only one 
 * callback can be registered for each file port.
 *
 * @param port		The WAV play list port.
 * @param user_data	User data to be specified in the callback
 * @param cb		Callback to be called. If the callback returns non-
 *			PJ_SUCCESS, the playback will stop. Note that if
 *			application destroys the file port in the callback,
 *			it must return non-PJ_SUCCESS here.
 *
 * @return		PJ_SUCCESS on success.
 */
PJ_DECL(pj_status_t)
pjmedia_wav_playlist_set_eof_cb(pjmedia_port *port,
			        void *user_data,
			        pj_status_t (*cb)(pjmedia_port *port,
						  void *usr_data));


/**
 * @}
 */


PJ_END_DECL


#endif	/* __PJMEDIA_WAV_PLAYLIST_H__ */
