mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 20:38:59 +00:00 
			
		
		
		
	Version 0.1.12 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@462 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		@@ -11,6 +11,7 @@
 | 
			
		||||
 * the GNU General Public License
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#include <asterisk/lock.h>
 | 
			
		||||
#include <asterisk/file.h>
 | 
			
		||||
#include <asterisk/logger.h>
 | 
			
		||||
#include <asterisk/channel.h>
 | 
			
		||||
@@ -51,7 +52,7 @@ static int record_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
	
 | 
			
		||||
	struct ast_filestream *s = '\0';
 | 
			
		||||
	struct localuser *u;
 | 
			
		||||
	struct ast_frame *f;
 | 
			
		||||
	struct ast_frame *f = NULL;
 | 
			
		||||
	
 | 
			
		||||
	vdata = data; /* explained above */
 | 
			
		||||
	
 | 
			
		||||
@@ -103,10 +104,8 @@ static int record_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		/* Some code to play a nice little beep to signify the start of the record operation */
 | 
			
		||||
		res = ast_streamfile(chan, "beep", chan->language);
 | 
			
		||||
		if (!res) {
 | 
			
		||||
			printf("Waiting on stream\n");
 | 
			
		||||
			res = ast_waitstream(chan, "");
 | 
			
		||||
		} else {
 | 
			
		||||
			printf("streamfile failed\n");
 | 
			
		||||
			ast_log(LOG_WARNING, "ast_streamfile failed on %s\n", chan->name);
 | 
			
		||||
		}
 | 
			
		||||
		ast_stopstream(chan);
 | 
			
		||||
@@ -114,8 +113,12 @@ static int record_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		s = ast_writefile( tmp, ext, NULL, O_CREAT|O_TRUNC|O_WRONLY , 0, 0644);
 | 
			
		||||
	
 | 
			
		||||
		if (s) {
 | 
			
		||||
		
 | 
			
		||||
			while ((f = ast_read(chan))) {
 | 
			
		||||
			while (ast_waitfor(chan, -1) > -1) {
 | 
			
		||||
				f = ast_read(chan);
 | 
			
		||||
				if (!f) {
 | 
			
		||||
					res = -1;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				if (f->frametype == AST_FRAME_VOICE) {
 | 
			
		||||
					res = ast_writestream(s, f);
 | 
			
		||||
					
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								contrib/init.d/rc.redhat.asterisk
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								contrib/init.d/rc.redhat.asterisk
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# asterisk           This shell script takes care of starting and stopping
 | 
			
		||||
#               asterisk (printer daemon).
 | 
			
		||||
#
 | 
			
		||||
# chkconfig: 2345 60 60
 | 
			
		||||
# description: asterisk is the print daemon required for lpr to work properly. \
 | 
			
		||||
#   It is basically a server that arbitrates print jobs to printer(s).
 | 
			
		||||
# processname: asterisk
 | 
			
		||||
# config: /etc/printcap
 | 
			
		||||
 | 
			
		||||
# Source function library.
 | 
			
		||||
. /etc/rc.d/init.d/functions
 | 
			
		||||
 | 
			
		||||
[ -f /usr/sbin/asterisk ] || exit 0
 | 
			
		||||
 | 
			
		||||
RETVAL=0
 | 
			
		||||
 | 
			
		||||
# See how we were called.
 | 
			
		||||
case "$1" in
 | 
			
		||||
  start)
 | 
			
		||||
        # Start daemons.
 | 
			
		||||
        echo -n "Starting asterisk: "
 | 
			
		||||
        daemon safe_asterisk
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
        echo
 | 
			
		||||
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/asterisk
 | 
			
		||||
        ;;
 | 
			
		||||
  stop)
 | 
			
		||||
        # Stop daemons.
 | 
			
		||||
        echo -n "Shutting down asterisk: "
 | 
			
		||||
	killproc asterisk
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
        echo
 | 
			
		||||
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/asterisk
 | 
			
		||||
        ;;
 | 
			
		||||
  status)
 | 
			
		||||
	status asterisk
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
	;;
 | 
			
		||||
  restart|reload)
 | 
			
		||||
	$0 stop
 | 
			
		||||
	$0 start
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
	;;
 | 
			
		||||
  *)
 | 
			
		||||
        echo "Usage: asterisk {start|stop|restart|reload|status}"
 | 
			
		||||
        exit 1
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit $RETVAL
 | 
			
		||||
							
								
								
									
										83
									
								
								frame.c
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								frame.c
									
									
									
									
									
								
							@@ -25,18 +25,93 @@
 | 
			
		||||
#ifdef TRACE_FRAMES
 | 
			
		||||
static int headers = 0;
 | 
			
		||||
static struct ast_frame *headerlist = NULL;
 | 
			
		||||
static pthread_mutex_t framelock = PTHREAD_MUTEX_INITIALIZER;
 | 
			
		||||
static pthread_mutex_t framelock = AST_MUTEX_INITIALIZER;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SMOOTHER_SIZE 8000
 | 
			
		||||
 | 
			
		||||
struct ast_smoother {
 | 
			
		||||
	int size;
 | 
			
		||||
	int format;
 | 
			
		||||
	int readdata;
 | 
			
		||||
	float timeperbyte;
 | 
			
		||||
	struct ast_frame f;
 | 
			
		||||
	char data[SMOOTHER_SIZE];
 | 
			
		||||
	char framedata[SMOOTHER_SIZE + AST_FRIENDLY_OFFSET];
 | 
			
		||||
	int len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ast_smoother *ast_smoother_new(int size)
 | 
			
		||||
{
 | 
			
		||||
	struct ast_smoother *s;
 | 
			
		||||
	s = malloc(sizeof(struct ast_smoother));
 | 
			
		||||
	if (s) {
 | 
			
		||||
		memset(s, 0, sizeof(s));
 | 
			
		||||
		s->size = size;
 | 
			
		||||
	}
 | 
			
		||||
	return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ast_smoother_feed(struct ast_smoother *s, struct ast_frame *f)
 | 
			
		||||
{
 | 
			
		||||
	if (f->frametype != AST_FRAME_VOICE) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Huh?  Can't smooth a non-voice frame!\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	if (!s->format) {
 | 
			
		||||
		s->format = f->subclass;
 | 
			
		||||
		s->timeperbyte = (float)f->timelen / (float)f->datalen;
 | 
			
		||||
	} else if (s->format != f->subclass) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Smoother was working on %d format frames, now trying to feed %d?\n", s->format, f->subclass);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	if (s->len + f->datalen > SMOOTHER_SIZE) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Out of smoother space\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	memcpy(s->data + s->len, f->data, f->datalen);
 | 
			
		||||
	s->len += f->datalen;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ast_frame *ast_smoother_read(struct ast_smoother *s)
 | 
			
		||||
{
 | 
			
		||||
	/* Make sure we have enough data */
 | 
			
		||||
	if (s->len < s->size) 
 | 
			
		||||
		return NULL;
 | 
			
		||||
	/* Make frame */
 | 
			
		||||
	s->f.frametype = AST_FRAME_VOICE;
 | 
			
		||||
	s->f.subclass = s->format;
 | 
			
		||||
	s->f.data = s->framedata;
 | 
			
		||||
	s->f.offset = AST_FRIENDLY_OFFSET;
 | 
			
		||||
	s->f.datalen = s->size;
 | 
			
		||||
	s->f.timelen = s->size * s->timeperbyte;
 | 
			
		||||
	/* Fill Data */
 | 
			
		||||
	memcpy(s->f.data  + AST_FRIENDLY_OFFSET, s->f.data, s->size);
 | 
			
		||||
	s->len -= s->size;
 | 
			
		||||
	/* Move remaining data to the front if applicable */
 | 
			
		||||
	if (s->len) 
 | 
			
		||||
		memmove(s->f.data, s->f.data + s->size, s->len);
 | 
			
		||||
	/* Return frame */
 | 
			
		||||
	return &s->f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ast_smoother_free(struct ast_smoother *s)
 | 
			
		||||
{
 | 
			
		||||
	free(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct ast_frame *ast_frame_header_new(void)
 | 
			
		||||
{
 | 
			
		||||
	struct ast_frame *f;
 | 
			
		||||
	f = malloc(sizeof(struct ast_frame));
 | 
			
		||||
	if (f)
 | 
			
		||||
		memset(f, 0, sizeof(struct ast_frame));
 | 
			
		||||
#ifdef TRACE_FRAMES
 | 
			
		||||
	if (f) {
 | 
			
		||||
		headers++;
 | 
			
		||||
		f->prev = NULL;
 | 
			
		||||
		pthread_mutex_lock(&framelock);
 | 
			
		||||
		ast_pthread_mutex_lock(&framelock);
 | 
			
		||||
		f->next = headerlist;
 | 
			
		||||
		if (headerlist)
 | 
			
		||||
			headerlist->prev = f;
 | 
			
		||||
@@ -65,7 +140,7 @@ void ast_frfree(struct ast_frame *fr)
 | 
			
		||||
	if (fr->mallocd & AST_MALLOCD_HDR) {
 | 
			
		||||
#ifdef TRACE_FRAMES
 | 
			
		||||
		headers--;
 | 
			
		||||
		pthread_mutex_lock(&framelock);
 | 
			
		||||
		ast_pthread_mutex_lock(&framelock);
 | 
			
		||||
		if (fr->next)
 | 
			
		||||
			fr->next->prev = fr->prev;
 | 
			
		||||
		if (fr->prev)
 | 
			
		||||
@@ -237,7 +312,7 @@ static int show_frame_stats(int fd, int argc, char *argv[])
 | 
			
		||||
	ast_cli(fd, "---------------------------\n");
 | 
			
		||||
	ast_cli(fd, "Total allocated headers: %d\n", headers);
 | 
			
		||||
	ast_cli(fd, "Queue Dump:\n");
 | 
			
		||||
	pthread_mutex_lock(&framelock);
 | 
			
		||||
	ast_pthread_mutex_lock(&framelock);
 | 
			
		||||
	for (f=headerlist; f; f = f->next) {
 | 
			
		||||
		ast_cli(fd, "%d.  Type %d, subclass %d from %s\n", x++, f->frametype, f->subclass, f->src ? f->src : "<Unknown>");
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,8 @@ extern "C" {
 | 
			
		||||
struct ast_channel_pvt {
 | 
			
		||||
	/*! Private data used by channel backend */
 | 
			
		||||
	void *pvt;
 | 
			
		||||
	struct ast_frame *readq;
 | 
			
		||||
	int alertpipe[2];
 | 
			
		||||
	/*! Write translation path */
 | 
			
		||||
	struct ast_trans_pvt *writetrans;
 | 
			
		||||
	/*! Read translation path */
 | 
			
		||||
@@ -67,7 +69,14 @@ struct ast_channel_pvt {
 | 
			
		||||
 | 
			
		||||
//! Create a channel structure
 | 
			
		||||
/*! Returns NULL on failure to allocate */
 | 
			
		||||
struct ast_channel *ast_channel_alloc(void);
 | 
			
		||||
struct ast_channel *ast_channel_alloc(int needalertpipe);
 | 
			
		||||
 | 
			
		||||
/*! Queue an outgoing frame, locking if necessary */
 | 
			
		||||
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f, int lock);
 | 
			
		||||
 | 
			
		||||
int ast_queue_hangup(struct ast_channel *chan, int lock);
 | 
			
		||||
 | 
			
		||||
int ast_queue_control(struct ast_channel *chan, int control, int lock);
 | 
			
		||||
 | 
			
		||||
//! Free a channel structure
 | 
			
		||||
void  ast_channel_free(struct ast_channel *);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								init.asterisk
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								init.asterisk
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# asterisk           This shell script takes care of starting and stopping
 | 
			
		||||
#               asterisk (printer daemon).
 | 
			
		||||
#
 | 
			
		||||
# chkconfig: 2345 60 60
 | 
			
		||||
# description: asterisk is the print daemon required for lpr to work properly. \
 | 
			
		||||
#   It is basically a server that arbitrates print jobs to printer(s).
 | 
			
		||||
# processname: asterisk
 | 
			
		||||
# config: /etc/printcap
 | 
			
		||||
 | 
			
		||||
# Source function library.
 | 
			
		||||
. /etc/rc.d/init.d/functions
 | 
			
		||||
 | 
			
		||||
[ -f /usr/sbin/asterisk ] || exit 0
 | 
			
		||||
 | 
			
		||||
RETVAL=0
 | 
			
		||||
 | 
			
		||||
# See how we were called.
 | 
			
		||||
case "$1" in
 | 
			
		||||
  start)
 | 
			
		||||
        # Start daemons.
 | 
			
		||||
        echo -n "Starting asterisk: "
 | 
			
		||||
        daemon safe_asterisk
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
        echo
 | 
			
		||||
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/asterisk
 | 
			
		||||
        ;;
 | 
			
		||||
  stop)
 | 
			
		||||
        # Stop daemons.
 | 
			
		||||
        echo -n "Shutting down asterisk: "
 | 
			
		||||
	killproc asterisk
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
        echo
 | 
			
		||||
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/asterisk
 | 
			
		||||
        ;;
 | 
			
		||||
  status)
 | 
			
		||||
	status asterisk
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
	;;
 | 
			
		||||
  restart|reload)
 | 
			
		||||
	$0 stop
 | 
			
		||||
	$0 start
 | 
			
		||||
	RETVAL=$?
 | 
			
		||||
	;;
 | 
			
		||||
  *)
 | 
			
		||||
        echo "Usage: asterisk {start|stop|restart|reload|status}"
 | 
			
		||||
        exit 1
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit $RETVAL
 | 
			
		||||
		Reference in New Issue
	
	Block a user