Use a 32k file buffer on recordings, which increases the efficiency of file recording.
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 3 Apr 2008 07:49:05 +0000 (07:49 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 3 Apr 2008 07:49:05 +0000 (07:49 +0000)
(closes issue #11962)
 Reported by: garlew
 Patches:
       recording.patch uploaded by garlew (license 376)
       bug-11962.diff uploaded by snuffy (license 35)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@112564 65c4cc65-6c06-0410-ace0-fbb531ad65f3

formats/format_wav.c
include/asterisk/mod_format.h
main/file.c

index 2a40ded..bbeb20b 100644 (file)
@@ -328,6 +328,11 @@ static void wav_close(struct ast_filestream *s)
 {
        char zero = 0;
        struct wav_desc *fs = (struct wav_desc *)s->_private;
+
+       if (s->filename) {
+               update_header(s->f);
+       }
+
        /* Pad to even length */
        if (fs->bytes & 0x1)
                fwrite(&zero, 1, 1, s->f);
@@ -416,7 +421,6 @@ static int wav_write(struct ast_filestream *fs, struct ast_frame *f)
        }
 
        s->bytes += f->datalen;
-       update_header(fs->f);
                
        return 0;
 
index c51bf68..f415b2b 100644 (file)
@@ -117,6 +117,7 @@ struct ast_filestream {
        char *buf;              /*!< buffer pointed to by ast_frame; */
        void *_private; /*!< pointer to private buffer */
        const char *orig_chan_name;
+       char *write_buffer;
 };
 
 /*! 
index 73387a2..e34020e 100644 (file)
@@ -817,17 +817,22 @@ int ast_closestream(struct ast_filestream *f)
                        ast_safe_system(cmd);
        }
 
+       if (f->fmt->close) {
+               f->fmt->close(f);
+       }
        if (f->filename)
                ast_free(f->filename);
        if (f->realfilename)
                ast_free(f->realfilename);
-       if (f->fmt->close)
-               f->fmt->close(f);
        fclose(f->f);
        if (f->vfs)
                ast_closestream(f->vfs);
        if (f->orig_chan_name)
                free((void *) f->orig_chan_name);
+       if (f->write_buffer) {
+               ast_free(f->write_buffer);
+       }
+
        ast_module_unref(f->fmt->module);
        ast_free(f);
        return 0;
@@ -1051,6 +1056,11 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con
                        }
                        fs->vfs = NULL;
                        /* If truncated, we'll be at the beginning; if not truncated, then append */
+
+                       if ((fs->write_buffer = ast_malloc(32768))){
+                               setvbuf(fs->f, fs->write_buffer, _IOFBF, 32768);
+                       }
+
                        f->seek(fs, 0, SEEK_END);
                } else if (errno != EEXIST) {
                        ast_log(LOG_WARNING, "Unable to open file %s: %s\n", fn, strerror(errno));