Index: /usr/src/asterisk/formats/format_wav.c =================================================================== --- /usr/src/asterisk/formats/format_wav.c (revision 102907) +++ /usr/src/asterisk/formats/format_wav.c (working copy) @@ -345,6 +345,8 @@ { 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); @@ -455,8 +457,7 @@ } s->bytes += f->datalen; - update_header(fs->f); - + return 0; } Index: /usr/src/asterisk/include/asterisk/file.h =================================================================== --- /usr/src/asterisk/include/asterisk/file.h (revision 102907) +++ /usr/src/asterisk/include/asterisk/file.h (working copy) @@ -140,6 +140,7 @@ #endif }; const char *orig_chan_name; + char *write_buffer; }; #define SEEK_FORCECUR 10 Index: /usr/src/asterisk/main/file.c =================================================================== --- /usr/src/asterisk/main/file.c (revision 102907) +++ /usr/src/asterisk/main/file.c (working copy) @@ -788,7 +788,8 @@ snprintf(cmd,size,"/bin/mv -f %s %s",f->filename,f->realfilename); ast_safe_system(cmd); } - + if (f->fmt->close) + f->fmt->close(f); if (f->filename) free(f->filename); if (f->realfilename) @@ -793,8 +794,6 @@ free(f->filename); if (f->realfilename) free(f->realfilename); - if (f->fmt->close) - f->fmt->close(f); fclose(f->f); if (f->vfs) ast_closestream(f->vfs); @@ -800,6 +799,8 @@ 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); free(f); return 0; @@ -1026,6 +1027,11 @@ } fs->vfs = NULL; /* If truncated, we'll be at the beginning; if not truncated, then append */ + + if ( (fs->write_buffer=(char *)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));