diff --git a/apps/app_dial.c b/apps/app_dial.c index de8deb6827..6bea10fc53 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1772,7 +1772,7 @@ static int setup_privacy_args(struct privacy_args *pa, */ silencethreshold = ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE); ast_answer(chan); - res = ast_play_and_record(chan, "priv-recordintro", pa->privintro, 4, "sln", &duration, silencethreshold, 2000, 0); /* NOTE: I've reduced the total time to 4 sec */ + res = ast_play_and_record(chan, "priv-recordintro", pa->privintro, 4, "sln", &duration, NULL, silencethreshold, 2000, 0); /* NOTE: I've reduced the total time to 4 sec */ /* don't think we'll need a lock removed, we took care of conflicts by naming the pa.privintro file */ if (res == -1) { diff --git a/apps/app_followme.c b/apps/app_followme.c index cbce6eb99f..31bc38d457 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -1102,7 +1102,7 @@ static int app_exec(struct ast_channel *chan, const char *data) duration = 5; if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_RECORDNAME)) - if (ast_play_and_record(chan, "vm-rec-name", namerecloc, 5, "sln", &duration, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL) < 0) + if (ast_play_and_record(chan, "vm-rec-name", namerecloc, 5, "sln", &duration, NULL, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL) < 0) goto outrun; if (!ast_fileexists(namerecloc, NULL, chan->language)) diff --git a/apps/app_meetme.c b/apps/app_meetme.c index bcecafb2ea..b4c441b610 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -2457,7 +2457,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, struc "%s/meetme-username-%s-%d", destdir, conf->confno, user->user_no); if (ast_test_flag64(confflags, CONFFLAG_INTROUSERNOREVIEW)) - res = ast_play_and_record(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL); + res = ast_play_and_record(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, NULL, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL); else res = ast_record_review(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, NULL); if (res == -1) diff --git a/apps/app_minivm.c b/apps/app_minivm.c index 3445b7ec6b..993a5a366b 100644 --- a/apps/app_minivm.c +++ b/apps/app_minivm.c @@ -1603,7 +1603,7 @@ static int vm_delete(char *file) /*!\internal * \brief Record voicemail message & let caller review or re-record it, or set options if applicable */ static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, - int outsidecaller, struct minivm_account *vmu, int *duration, const char *unlockdir, + int outsidecaller, struct minivm_account *vmu, int *duration, int *sound_duration, const char *unlockdir, signed char record_gain) { int cmd = 0; @@ -1653,7 +1653,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re ast_channel_setoption(chan, AST_OPTION_RXGAIN, &record_gain, sizeof(record_gain), 0); if (ast_test_flag(vmu, MVM_OPERATOR)) canceldtmf = "0"; - cmd = ast_play_and_record_full(chan, playfile, recordfile, maxtime, fmt, duration, global_silencethreshold, global_maxsilence, unlockdir, acceptdtmf, canceldtmf); + cmd = ast_play_and_record_full(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, global_silencethreshold, global_maxsilence, unlockdir, acceptdtmf, canceldtmf); if (record_gain) ast_channel_setoption(chan, AST_OPTION_RXGAIN, &zero_gain, sizeof(zero_gain), 0); if (cmd == -1) /* User has hung up, no options to give */ @@ -1842,6 +1842,7 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav FILE *txt; int res = 0, txtdes; int duration = 0; + int sound_duration = 0; char date[256]; char tmpdir[PATH_MAX]; char ext_context[256] = ""; @@ -1917,7 +1918,7 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav /* Store information */ ast_debug(2, "Open file for metadata: %s\n", tmptxtfile); - res = play_record_review(chan, NULL, tmptxtfile, global_vmmaxmessage, fmt, 1, vmu, &duration, NULL, options->record_gain); + res = play_record_review(chan, NULL, tmptxtfile, global_vmmaxmessage, fmt, 1, vmu, &duration, &sound_duration, NULL, options->record_gain); txt = fdopen(txtdes, "w+"); if (!txt) { @@ -1958,8 +1959,8 @@ static int leave_voicemail(struct ast_channel *chan, char *username, struct leav ast_mutex_unlock(&minivmloglock); } - if (duration < global_vmminmessage) { - ast_verb(3, "Recording was %d seconds long but needs to be at least %d - abandoning\n", duration, global_vmminmessage); + if (sound_duration < global_vmminmessage) { + ast_verb(3, "Recording was %d seconds long but needs to be at least %d - abandoning\n", sound_duration, global_vmminmessage); fclose(txt); ast_filedelete(tmptxtfile, NULL); unlink(tmptxtfile); @@ -2536,7 +2537,7 @@ static int minivm_accmess_exec(struct ast_channel *chan, const char *data) } snprintf(filename,sizeof(filename), "%s%s/%s/%s", MVM_SPOOL_DIR, vmu->domain, vmu->username, message); /* Maybe we should check the result of play_record_review ? */ - play_record_review(chan, prompt, filename, global_maxgreet, default_vmformat, 0, vmu, &duration, NULL, FALSE); + play_record_review(chan, prompt, filename, global_maxgreet, default_vmformat, 0, vmu, &duration, NULL, NULL, FALSE); ast_debug(1, "Recorded new %s message in %s (duration %d)\n", message, filename, duration); diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index cdb2df1a49..5ab299d071 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -905,7 +905,7 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box); static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int msg, int option, signed char record_gain); static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context); static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, - char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir, + char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, int *sound_duration, const char *unlockdir, signed char record_gain, struct vm_state *vms, char *flag); static int vm_tempgreeting(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, char *fmtc, signed char record_gain); static int vm_play_folder_name(struct ast_channel *chan, char *mbox); @@ -5585,6 +5585,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_ int res = 0; int msgnum; int duration = 0; + int sound_duration = 0; int ausemacro = 0; int ousemacro = 0; int ouseexten = 0; @@ -5973,13 +5974,13 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_ res = ast_streamfile(chan, "vm-mailboxfull", chan->language); goto leave_vm_out; } - res = play_record_review(chan, NULL, tmptxtfile, vmu->maxsecs, fmt, 1, vmu, &duration, NULL, options->record_gain, vms, flag); + res = play_record_review(chan, NULL, tmptxtfile, vmu->maxsecs, fmt, 1, vmu, &duration, &sound_duration, NULL, options->record_gain, vms, flag); if (txt) { fprintf(txt, "flag=%s\n", flag); - if (duration < vmu->minsecs) { + if (sound_duration < vmu->minsecs) { fclose(txt); - ast_verb(3, "Recording was %d seconds long but needs to be at least %d - abandoning\n", duration, vmu->minsecs); + ast_verb(3, "Recording was %d seconds long but needs to be at least %d - abandoning\n", sound_duration, vmu->minsecs); ast_filedelete(tmptxtfile, NULL); unlink(tmptxtfile); if (ast_check_realtime("voicemail_data")) { @@ -6101,7 +6102,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_ } else if (res > 0 && res != 't') res = 0; - if (duration < vmu->minsecs) + if (sound_duration < vmu->minsecs) /* XXX We should really give a prompt too short/option start again, with leave_vm_out called only after a timeout XXX */ pbx_builtin_setvar_helper(chan, "VMSTATUS", "FAILED"); else @@ -6879,7 +6880,7 @@ static int vm_forwardoptions(struct ast_channel *chan, struct ast_vm_user *vmu, strncat(vms->introfn, "intro", sizeof(vms->introfn)); res = ast_play_and_wait(chan, INTRO); res = ast_play_and_wait(chan, "beep"); - res = play_record_review(chan, NULL, vms->introfn, vmu->maxsecs, vm_fmts, 1, vmu, (int *) duration, NULL, record_gain, vms, flag); + res = play_record_review(chan, NULL, vms->introfn, vmu->maxsecs, vm_fmts, 1, vmu, (int *) duration, NULL, NULL, record_gain, vms, flag); cmd = 't'; #else @@ -6912,7 +6913,7 @@ static int vm_forwardoptions(struct ast_channel *chan, struct ast_vm_user *vmu, if (record_gain) ast_channel_setoption(chan, AST_OPTION_RXGAIN, &record_gain, sizeof(record_gain), 0); - cmd = ast_play_and_prepend(chan, NULL, msgfile, 0, vm_fmts, &prepend_duration, 1, silencethreshold, maxsilence); + cmd = ast_play_and_prepend(chan, NULL, msgfile, 0, vm_fmts, &prepend_duration, NULL, 1, silencethreshold, maxsilence); if (cmd == 'S') { /* If we timed out, tell the user it didn't work properly and clean up the files */ ast_stream_and_wait(chan, vm_pls_try_again, ""); /* this might be removed if a proper vm_prepend_timeout is ever recorded */ @@ -9247,7 +9248,7 @@ static int vm_newuser(struct ast_channel *chan, struct ast_vm_user *vmu, struct if (ast_test_flag(vmu, VM_FORCENAME)) { snprintf(prefile, sizeof(prefile), "%s%s/%s/greet", VM_SPOOL_DIR, vmu->context, vms->username); if (ast_fileexists(prefile, NULL, NULL) < 1) { - cmd = play_record_review(chan, "vm-rec-name", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-name", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); if (cmd < 0 || cmd == 't' || cmd == '#') return cmd; } @@ -9257,14 +9258,14 @@ static int vm_newuser(struct ast_channel *chan, struct ast_vm_user *vmu, struct if (ast_test_flag(vmu, VM_FORCEGREET)) { snprintf(prefile, sizeof(prefile), "%s%s/%s/unavail", VM_SPOOL_DIR, vmu->context, vms->username); if (ast_fileexists(prefile, NULL, NULL) < 1) { - cmd = play_record_review(chan, "vm-rec-unv", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-unv", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); if (cmd < 0 || cmd == 't' || cmd == '#') return cmd; } snprintf(prefile, sizeof(prefile), "%s%s/%s/busy", VM_SPOOL_DIR, vmu->context, vms->username); if (ast_fileexists(prefile, NULL, NULL) < 1) { - cmd = play_record_review(chan, "vm-rec-busy", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-busy", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); if (cmd < 0 || cmd == 't' || cmd == '#') return cmd; } @@ -9299,15 +9300,15 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct switch (cmd) { case '1': /* Record your unavailable message */ snprintf(prefile, sizeof(prefile), "%s%s/%s/unavail", VM_SPOOL_DIR, vmu->context, vms->username); - cmd = play_record_review(chan, "vm-rec-unv", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-unv", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); break; case '2': /* Record your busy message */ snprintf(prefile, sizeof(prefile), "%s%s/%s/busy", VM_SPOOL_DIR, vmu->context, vms->username); - cmd = play_record_review(chan, "vm-rec-busy", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-busy", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); break; case '3': /* Record greeting */ snprintf(prefile, sizeof(prefile), "%s%s/%s/greet", VM_SPOOL_DIR, vmu->context, vms->username); - cmd = play_record_review(chan, "vm-rec-name", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-name", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); break; case '4': /* manage the temporary greeting */ cmd = vm_tempgreeting(chan, vmu, vms, fmtc, record_gain); @@ -9441,12 +9442,12 @@ static int vm_tempgreeting(struct ast_channel *chan, struct ast_vm_user *vmu, st retries = 0; RETRIEVE(prefile, -1, vmu->mailbox, vmu->context); if (ast_fileexists(prefile, NULL, NULL) <= 0) { - play_record_review(chan, "vm-rec-temp", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + play_record_review(chan, "vm-rec-temp", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); cmd = 't'; } else { switch (cmd) { case '1': - cmd = play_record_review(chan, "vm-rec-temp", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, record_gain, vms, NULL); + cmd = play_record_review(chan, "vm-rec-temp", prefile, maxgreet, fmtc, 0, vmu, &duration, NULL, NULL, record_gain, vms, NULL); break; case '2': DELETE(prefile, -1, prefile, vmu); @@ -13262,7 +13263,7 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s } static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, - int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir, + int outsidecaller, struct ast_vm_user *vmu, int *duration, int *sound_duration, const char *unlockdir, signed char record_gain, struct vm_state *vms, char *flag) { /* Record message & let caller review or re-record it, or set options if applicable */ @@ -13337,7 +13338,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re ast_channel_setoption(chan, AST_OPTION_RXGAIN, &record_gain, sizeof(record_gain), 0); if (ast_test_flag(vmu, VM_OPERATOR)) canceldtmf = "0"; - cmd = ast_play_and_record_full(chan, playfile, tempfile, maxtime, fmt, duration, silencethreshold, maxsilence, unlockdir, acceptdtmf, canceldtmf); + cmd = ast_play_and_record_full(chan, playfile, tempfile, maxtime, fmt, duration, sound_duration, silencethreshold, maxsilence, unlockdir, acceptdtmf, canceldtmf); if (strchr(canceldtmf, cmd)) { /* need this flag here to distinguish between pressing '0' during message recording or after */ canceleddtmf = 1; @@ -13357,13 +13358,13 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re } else if (cmd == '*') { break; #if 0 - } else if (vmu->review && (*duration < 5)) { + } else if (vmu->review && sound_duration && (*sound_duration < 5)) { /* Message is too short */ ast_verb(3, "Message too short\n"); cmd = ast_play_and_wait(chan, "vm-tooshort"); cmd = ast_filedelete(tempfile, NULL); break; - } else if (vmu->review && (cmd == 2 && *duration < (maxsilence + 3))) { + } else if (vmu->review && (cmd == 2 && sound_duration && *sound_duration < (maxsilence + 3))) { /* Message is all silence */ ast_verb(3, "Nothing recorded\n"); cmd = ast_filedelete(tempfile, NULL); diff --git a/include/asterisk/app.h b/include/asterisk/app.h index fe74e0bddd..87f7c80ede 100644 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -280,6 +280,7 @@ int ast_play_and_wait(struct ast_channel *chan, const char *fn); * \param maxtime_sec Longest possible message length in seconds * \param fmt string containing all formats to be recorded delimited by '|' * \param duration pointer to integer for storing length of the recording + * \param sound_duration pointer to integer for storing length of the recording minus all silence * \param silencethreshold tolerance of noise levels that can be considered silence for the purpose of silence timeout, -1 for default * \param maxsilence_ms Length of time in milliseconds which will trigger a timeout from silence, -1 for default * \param path Optional filesystem path to unlock @@ -291,7 +292,7 @@ int ast_play_and_wait(struct ast_channel *chan, const char *fn); * \retval 't' Recording ended from the message exceeding the maximum duration * \retval dtmfchar Recording ended via the return value's DTMF character for either cancel or accept. */ -int ast_play_and_record_full(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime_sec, const char *fmt, int *duration, int silencethreshold, int maxsilence_ms, const char *path, const char *acceptdtmf, const char *canceldtmf); +int ast_play_and_record_full(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime_sec, const char *fmt, int *duration, int *sound_duration, int silencethreshold, int maxsilence_ms, const char *path, const char *acceptdtmf, const char *canceldtmf); /*! * \brief Record a file based on input from a channel. Use default accept and cancel DTMF. @@ -303,6 +304,7 @@ int ast_play_and_record_full(struct ast_channel *chan, const char *playfile, con * \param maxtime_sec Longest possible message length in seconds * \param fmt string containing all formats to be recorded delimited by '|' * \param duration pointer to integer for storing length of the recording + * \param sound_duration pointer to integer for storing length of the recording minus all silence * \param silencethreshold tolerance of noise levels that can be considered silence for the purpose of silence timeout, -1 for default * \param maxsilence_ms length of time in milliseconds which will trigger a timeout from silence, -1 for default * \param path Optional filesystem path to unlock @@ -312,7 +314,7 @@ int ast_play_and_record_full(struct ast_channel *chan, const char *playfile, con * \retval 't' Recording ended from the message exceeding the maximum duration * \retval dtmfchar Recording ended via the return value's DTMF character for either cancel or accept. */ -int ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime_sec, const char *fmt, int *duration, int silencethreshold, int maxsilence_ms, const char *path); +int ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime_sec, const char *fmt, int *duration, int *sound_duration, int silencethreshold, int maxsilence_ms, const char *path); /*! * \brief Record a file based on input frm a channel. Recording is performed in 'prepend' mode which works a little differently from normal recordings @@ -324,6 +326,7 @@ int ast_play_and_record(struct ast_channel *chan, const char *playfile, const ch * \param maxtime_sec Longest possible message length in seconds * \param fmt string containing all formats to be recorded delimited by '|' * \param duration pointer to integer for storing length of the recording + * \param sound_duration pointer to integer for storing length of the recording minus all silence * \param beep whether to play a beep to prompt the recording * \param silencethreshold tolerance of noise levels that can be considered silence for the purpose of silence timeout, -1 for default * \param maxsilence_ms length of time in milliseconds which will trigger a timeout from silence, -1 for default. @@ -332,7 +335,7 @@ int ast_play_and_record(struct ast_channel *chan, const char *playfile, const ch * \retval 'S' Recording ended from silence timeout * \retval 't' Recording either exceeded maximum duration or the call was ended via DTMF */ -int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime_sec, char *fmt, int *duration, int beep, int silencethreshold, int maxsilence_ms); +int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime_sec, char *fmt, int *duration, int *sound_duration, int beep, int silencethreshold, int maxsilence_ms); enum ast_getdata_result { AST_GETDATA_FAILED = -1, diff --git a/main/app.c b/main/app.c index 9284706c58..7a3735cc79 100644 --- a/main/app.c +++ b/main/app.c @@ -720,6 +720,7 @@ static int global_maxsilence = 0; * \param maxtime Maximum length of recording (in seconds). * \param fmt Format(s) to record message in. Multiple formats may be specified by separating them with a '|'. * \param duration Where to store actual length of the recorded message (in milliseconds). + * \param sound_duration Where to store the length of the recorded message (in milliseconds), minus any silence * \param beep Whether to play a beep before starting to record. * \param silencethreshold * \param maxsilence Length of silence that will end a recording (in milliseconds). @@ -734,7 +735,7 @@ static int global_maxsilence = 0; * \retval 't' Recording ended from the message exceeding the maximum duration, or via DTMF in prepend mode * \retval dtmfchar Recording ended via the return value's DTMF character for either cancel or accept. */ -static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int beep, int silencethreshold, int maxsilence, const char *path, int prepend, const char *acceptdtmf, const char *canceldtmf, int skip_confirmation_sound) +static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int *sound_duration, int beep, int silencethreshold, int maxsilence, const char *path, int prepend, const char *acceptdtmf, const char *canceldtmf, int skip_confirmation_sound) { int d = 0; char *fmts; @@ -954,6 +955,9 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, * closed (which would create a resource leak). */ *duration = others[0] ? ast_tellstream(others[0]) / 8000 : 0; + if (sound_duration) { + *sound_duration = *duration; + } if (!prepend) { /* Reduce duration by a total silence amount */ @@ -961,11 +965,22 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, totalsilence += dspsilence; } - if (totalsilence > 0) - *duration -= (totalsilence - 200) / 1000; + if (sound_duration) { + if (totalsilence > 0) { + *sound_duration -= (totalsilence - 200) / 1000; + } + if (*sound_duration < 0) { + *sound_duration = 0; + } + } + + if (dspsilence > 0) { + *duration -= (dspsilence - 200) / 1000; + } if (*duration < 0) { *duration = 0; } + for (x = 0; x < fmtcnt; x++) { if (!others[x]) { break; @@ -1026,19 +1041,19 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, static const char default_acceptdtmf[] = "#"; static const char default_canceldtmf[] = ""; -int ast_play_and_record_full(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int silencethreshold, int maxsilence, const char *path, const char *acceptdtmf, const char *canceldtmf) +int ast_play_and_record_full(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int *sound_duration, int silencethreshold, int maxsilence, const char *path, const char *acceptdtmf, const char *canceldtmf) { - return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, 0, silencethreshold, maxsilence, path, 0, S_OR(acceptdtmf, default_acceptdtmf), S_OR(canceldtmf, default_canceldtmf), 0); + return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, 0, silencethreshold, maxsilence, path, 0, S_OR(acceptdtmf, default_acceptdtmf), S_OR(canceldtmf, default_canceldtmf), 0); } -int ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int silencethreshold, int maxsilence, const char *path) +int ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int *sound_duration, int silencethreshold, int maxsilence, const char *path) { - return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, 0, silencethreshold, maxsilence, path, 0, default_acceptdtmf, default_canceldtmf, 0); + return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, 0, silencethreshold, maxsilence, path, 0, default_acceptdtmf, default_canceldtmf, 0); } -int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int beep, int silencethreshold, int maxsilence) +int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int *sound_duration, int beep, int silencethreshold, int maxsilence) { - return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, beep, silencethreshold, maxsilence, NULL, 1, default_acceptdtmf, default_canceldtmf, 1); + return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, beep, silencethreshold, maxsilence, NULL, 1, default_acceptdtmf, default_canceldtmf, 1); } /* Channel group core functions */ @@ -1575,7 +1590,7 @@ int ast_record_review(struct ast_channel *chan, const char *playfile, const char /* Record */ ast_verb(3, "R%secording\n", recorded == 1 ? "e-r" : ""); recorded = 1; - if ((cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence, path)) == -1) { + if ((cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, NULL, silencethreshold, maxsilence, path)) == -1) { /* User has hung up, no options to give */ return cmd; }