mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +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 |  * the GNU General Public License | ||||||
|  */ |  */ | ||||||
|   |   | ||||||
|  | #include <asterisk/lock.h> | ||||||
| #include <asterisk/file.h> | #include <asterisk/file.h> | ||||||
| #include <asterisk/logger.h> | #include <asterisk/logger.h> | ||||||
| #include <asterisk/channel.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 ast_filestream *s = '\0'; | ||||||
| 	struct localuser *u; | 	struct localuser *u; | ||||||
| 	struct ast_frame *f; | 	struct ast_frame *f = NULL; | ||||||
| 	 | 	 | ||||||
| 	vdata = data; /* explained above */ | 	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 */ | 		/* Some code to play a nice little beep to signify the start of the record operation */ | ||||||
| 		res = ast_streamfile(chan, "beep", chan->language); | 		res = ast_streamfile(chan, "beep", chan->language); | ||||||
| 		if (!res) { | 		if (!res) { | ||||||
| 			printf("Waiting on stream\n"); |  | ||||||
| 			res = ast_waitstream(chan, ""); | 			res = ast_waitstream(chan, ""); | ||||||
| 		} else { | 		} else { | ||||||
| 			printf("streamfile failed\n"); |  | ||||||
| 			ast_log(LOG_WARNING, "ast_streamfile failed on %s\n", chan->name); | 			ast_log(LOG_WARNING, "ast_streamfile failed on %s\n", chan->name); | ||||||
| 		} | 		} | ||||||
| 		ast_stopstream(chan); | 		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); | 		s = ast_writefile( tmp, ext, NULL, O_CREAT|O_TRUNC|O_WRONLY , 0, 0644); | ||||||
| 	 | 	 | ||||||
| 		if (s) { | 		if (s) { | ||||||
| 		 | 			while (ast_waitfor(chan, -1) > -1) { | ||||||
| 			while ((f = ast_read(chan))) { | 				f = ast_read(chan); | ||||||
|  | 				if (!f) { | ||||||
|  | 					res = -1; | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
| 				if (f->frametype == AST_FRAME_VOICE) { | 				if (f->frametype == AST_FRAME_VOICE) { | ||||||
| 					res = ast_writestream(s, f); | 					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 | #ifdef TRACE_FRAMES | ||||||
| static int headers = 0; | static int headers = 0; | ||||||
| static struct ast_frame *headerlist = NULL; | static struct ast_frame *headerlist = NULL; | ||||||
| static pthread_mutex_t framelock = PTHREAD_MUTEX_INITIALIZER; | static pthread_mutex_t framelock = AST_MUTEX_INITIALIZER; | ||||||
| #endif | #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) | static struct ast_frame *ast_frame_header_new(void) | ||||||
| { | { | ||||||
| 	struct ast_frame *f; | 	struct ast_frame *f; | ||||||
| 	f = malloc(sizeof(struct ast_frame)); | 	f = malloc(sizeof(struct ast_frame)); | ||||||
|  | 	if (f) | ||||||
|  | 		memset(f, 0, sizeof(struct ast_frame)); | ||||||
| #ifdef TRACE_FRAMES | #ifdef TRACE_FRAMES | ||||||
| 	if (f) { | 	if (f) { | ||||||
| 		headers++; | 		headers++; | ||||||
| 		f->prev = NULL; | 		f->prev = NULL; | ||||||
| 		pthread_mutex_lock(&framelock); | 		ast_pthread_mutex_lock(&framelock); | ||||||
| 		f->next = headerlist; | 		f->next = headerlist; | ||||||
| 		if (headerlist) | 		if (headerlist) | ||||||
| 			headerlist->prev = f; | 			headerlist->prev = f; | ||||||
| @@ -65,7 +140,7 @@ void ast_frfree(struct ast_frame *fr) | |||||||
| 	if (fr->mallocd & AST_MALLOCD_HDR) { | 	if (fr->mallocd & AST_MALLOCD_HDR) { | ||||||
| #ifdef TRACE_FRAMES | #ifdef TRACE_FRAMES | ||||||
| 		headers--; | 		headers--; | ||||||
| 		pthread_mutex_lock(&framelock); | 		ast_pthread_mutex_lock(&framelock); | ||||||
| 		if (fr->next) | 		if (fr->next) | ||||||
| 			fr->next->prev = fr->prev; | 			fr->next->prev = fr->prev; | ||||||
| 		if (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, "---------------------------\n"); | ||||||
| 	ast_cli(fd, "Total allocated headers: %d\n", headers); | 	ast_cli(fd, "Total allocated headers: %d\n", headers); | ||||||
| 	ast_cli(fd, "Queue Dump:\n"); | 	ast_cli(fd, "Queue Dump:\n"); | ||||||
| 	pthread_mutex_lock(&framelock); | 	ast_pthread_mutex_lock(&framelock); | ||||||
| 	for (f=headerlist; f; f = f->next) { | 	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>"); | 		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 { | struct ast_channel_pvt { | ||||||
| 	/*! Private data used by channel backend */ | 	/*! Private data used by channel backend */ | ||||||
| 	void *pvt; | 	void *pvt; | ||||||
|  | 	struct ast_frame *readq; | ||||||
|  | 	int alertpipe[2]; | ||||||
| 	/*! Write translation path */ | 	/*! Write translation path */ | ||||||
| 	struct ast_trans_pvt *writetrans; | 	struct ast_trans_pvt *writetrans; | ||||||
| 	/*! Read translation path */ | 	/*! Read translation path */ | ||||||
| @@ -67,7 +69,14 @@ struct ast_channel_pvt { | |||||||
|  |  | ||||||
| //! Create a channel structure | //! Create a channel structure | ||||||
| /*! Returns NULL on failure to allocate */ | /*! 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 | //! Free a channel structure | ||||||
| void  ast_channel_free(struct ast_channel *); | 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