#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <time.h>
#include <asterisk/file.h>
#include <asterisk/channel.h>
#include <asterisk/logger.h>
#include <asterisk/say.h>
#include <asterisk/lock.h>
#include <asterisk/localtime.h>
#include "asterisk.h"
#include <stdio.h>
Go to the source code of this file.
Defines | |
#define | DIGITS_DIR AST_SOUNDS "/digits/" |
Functions | |
int | ast_say_digit_str (struct ast_channel *chan, char *fn2, char *ints, char *lang) |
says digits of a string | |
int | ast_say_digit_str_full (struct ast_channel *chan, char *fn2, char *ints, char *lang, int audiofd, int ctrlfd) |
int | ast_say_digits (struct ast_channel *chan, int num, char *ints, char *lang) |
says digits | |
int | ast_say_digits_full (struct ast_channel *chan, int num, char *ints, char *lang, int audiofd, int ctrlfd) |
int | ast_say_number_full (struct ast_channel *chan, int num, char *ints, char *language, int audiofd, int ctrlfd) |
int | ast_say_number (struct ast_channel *chan, int num, char *ints, char *language) |
says a number | |
int | ast_say_date (struct ast_channel *chan, time_t t, char *ints, char *lang) |
int | ast_say_date_with_format (struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone) |
int | ast_say_time (struct ast_channel *chan, time_t t, char *ints, char *lang) |
int | ast_say_datetime (struct ast_channel *chan, time_t t, char *ints, char *lang) |
int | ast_say_datetime_from_now (struct ast_channel *chan, time_t t, char *ints, char *lang) |
|
Definition at line 28 of file say.c. Referenced by ast_say_date_with_format(). |
|
Definition at line 214 of file say.c. References ast_localtime(), ast_say_number(), ast_streamfile(), and ast_waitstream().
00215 { 00216 struct tm tm; 00217 char fn[256]; 00218 int res = 0; 00219 ast_localtime(&t,&tm,NULL); 00220 if (!res) { 00221 snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday); 00222 res = ast_streamfile(chan, fn, lang); 00223 if (!res) 00224 res = ast_waitstream(chan, ints); 00225 } 00226 if (!res) { 00227 snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon); 00228 res = ast_streamfile(chan, fn, lang); 00229 if (!res) 00230 res = ast_waitstream(chan, ints); 00231 } 00232 if (!res) 00233 res = ast_say_number(chan, tm.tm_mday, ints, lang); 00234 00235 if (!res) 00236 res = ast_waitstream(chan, ints); 00237 if (!res) 00238 res = ast_say_number(chan, tm.tm_year + 1900, ints, lang); 00239 return res; 00240 } |
|
Definition at line 252 of file say.c. References ast_localtime(), ast_log(), AST_SOUNDS, DIGITS_DIR, LOG_DEBUG, and LOG_WARNING.
00253 { 00254 struct tm tm; 00255 int res=0, offset, sndoffset; 00256 char sndfile[256], nextmsg[256]; 00257 00258 ast_localtime(&time,&tm,timezone); 00259 00260 for (offset=0 ; format[offset] != '\0' ; offset++) { 00261 ast_log(LOG_DEBUG, "Parsing %c (offset %d) in %s\n", format[offset], offset, format); 00262 switch (format[offset]) { 00263 /* NOTE: if you add more options here, please try to be consistent with strftime(3) */ 00264 case '\'': 00265 /* Literal name of a sound file */ 00266 sndoffset=0; 00267 for (sndoffset=0 ; (format[++offset] != '\'') && (sndoffset < 256) ; sndoffset++) 00268 sndfile[sndoffset] = format[offset]; 00269 sndfile[sndoffset] = '\0'; 00270 snprintf(nextmsg,sizeof(nextmsg), AST_SOUNDS "/%s", sndfile); 00271 res = wait_file(chan,ints,nextmsg,lang); 00272 break; 00273 case 'A': 00274 case 'a': 00275 /* Sunday - Saturday */ 00276 snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "day-%d", tm.tm_wday); 00277 res = wait_file(chan,ints,nextmsg,lang); 00278 break; 00279 case 'B': 00280 case 'b': 00281 case 'h': 00282 /* January - December */ 00283 snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "mon-%d", tm.tm_mon); 00284 res = wait_file(chan,ints,nextmsg,lang); 00285 break; 00286 case 'd': 00287 case 'e': 00288 /* First - Thirtyfirst */ 00289 if ((tm.tm_mday < 21) || (tm.tm_mday == 30)) { 00290 snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "h-%d", tm.tm_mday); 00291 res = wait_file(chan,ints,nextmsg,lang); 00292 } else if (tm.tm_mday == 31) { 00293 /* "Thirty" and "first" */ 00294 res = wait_file(chan,ints,DIGITS_DIR "30",lang); 00295 if (!res) { 00296 res = wait_file(chan,ints,DIGITS_DIR "h-1",lang); 00297 } 00298 } else { 00299 /* Between 21 and 29 - two sounds */ 00300 res = wait_file(chan,ints,DIGITS_DIR "20",lang); 00301 if (!res) { 00302 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "h-%d", tm.tm_mday - 20); 00303 res = wait_file(chan,ints,nextmsg,lang); 00304 } 00305 } 00306 break; 00307 case 'Y': 00308 /* Year */ 00309 if (tm.tm_year > 99) { 00310 res = wait_file(chan,ints,DIGITS_DIR "2",lang); 00311 if (!res) { 00312 res = wait_file(chan,ints,DIGITS_DIR "thousand",lang); 00313 } 00314 if (tm.tm_year > 100) { 00315 if (!res) { 00316 /* This works until the end of 2020 */ 00317 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_year - 100); 00318 res = wait_file(chan,ints,nextmsg,lang); 00319 } 00320 } 00321 } else { 00322 if (tm.tm_year < 1) { 00323 /* I'm not going to handle 1900 and prior */ 00324 /* We'll just be silent on the year, instead of bombing out. */ 00325 } else { 00326 res = wait_file(chan,ints,DIGITS_DIR "19",lang); 00327 if (!res) { 00328 if (tm.tm_year <= 9) { 00329 /* 1901 - 1909 */ 00330 res = wait_file(chan,ints,DIGITS_DIR "oh",lang); 00331 if (!res) { 00332 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_year); 00333 res = wait_file(chan,ints,nextmsg,lang); 00334 } 00335 } else if (tm.tm_year <= 20) { 00336 /* 1910 - 1920 */ 00337 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_year); 00338 res = wait_file(chan,ints,nextmsg,lang); 00339 } else { 00340 /* 1921 - 1999 */ 00341 int ten, one; 00342 ten = tm.tm_year / 10; 00343 one = tm.tm_year % 10; 00344 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", ten * 10); 00345 res = wait_file(chan,ints,nextmsg,lang); 00346 if (!res) { 00347 if (one != 0) { 00348 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", one); 00349 res = wait_file(chan,ints,nextmsg,lang); 00350 } 00351 } 00352 } 00353 } 00354 } 00355 } 00356 break; 00357 case 'I': 00358 case 'l': 00359 /* 12-Hour */ 00360 if (tm.tm_hour == 0) 00361 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "12"); 00362 else if (tm.tm_hour > 12) 00363 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_hour - 12); 00364 else 00365 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_hour); 00366 res = wait_file(chan,ints,nextmsg,lang); 00367 break; 00368 case 'H': 00369 case 'k': 00370 /* 24-Hour */ 00371 if (format[offset] == 'H') { 00372 /* e.g. oh-eight */ 00373 if (tm.tm_hour < 10) { 00374 res = wait_file(chan,ints,DIGITS_DIR "oh",lang); 00375 } 00376 } else { 00377 /* e.g. eight */ 00378 if (tm.tm_hour == 0) { 00379 res = wait_file(chan,ints,DIGITS_DIR "oh",lang); 00380 } 00381 } 00382 if (!res) { 00383 if (tm.tm_hour != 0) { 00384 int remainder = tm.tm_hour; 00385 if (tm.tm_hour > 20) { 00386 res = wait_file(chan,ints,AST_SOUNDS "/digits/20",lang); 00387 remainder -= 20; 00388 } 00389 if (!res) { 00390 snprintf(nextmsg,sizeof(nextmsg), AST_SOUNDS "/digits/%d", remainder); 00391 res = wait_file(chan,ints,nextmsg,lang); 00392 } 00393 } 00394 } 00395 break; 00396 case 'M': 00397 /* Minute */ 00398 if (tm.tm_min == 0) { 00399 res = wait_file(chan,ints,DIGITS_DIR "oclock",lang); 00400 } else if (tm.tm_min < 10) { 00401 res = wait_file(chan,ints,DIGITS_DIR "oh",lang); 00402 if (!res) { 00403 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_min); 00404 res = wait_file(chan,ints,nextmsg,lang); 00405 } 00406 } else if ((tm.tm_min < 21) || (tm.tm_min % 10 == 0)) { 00407 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_min); 00408 res = wait_file(chan,ints,nextmsg,lang); 00409 } else { 00410 int ten, one; 00411 ten = (tm.tm_min / 10) * 10; 00412 one = (tm.tm_min % 10); 00413 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", ten); 00414 res = wait_file(chan,ints,nextmsg,lang); 00415 if (!res) { 00416 /* Fifty, not fifty-zero */ 00417 if (one != 0) { 00418 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", one); 00419 res = wait_file(chan,ints,nextmsg,lang); 00420 } 00421 } 00422 } 00423 break; 00424 case 'P': 00425 case 'p': 00426 /* AM/PM */ 00427 if (tm.tm_hour > 11) 00428 snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "p-m"); 00429 else 00430 snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "a-m"); 00431 res = wait_file(chan,ints,nextmsg,lang); 00432 break; 00433 case 'Q': 00434 /* Shorthand for "Today", "Yesterday", or ABdY */ 00435 { 00436 struct timeval now; 00437 struct tm tmnow; 00438 time_t beg_today; 00439 00440 gettimeofday(&now,NULL); 00441 ast_localtime(&now.tv_sec,&tmnow,timezone); 00442 /* This might be slightly off, if we transcend a leap second, but never more off than 1 second */ 00443 /* In any case, it saves not having to do ast_mktime() */ 00444 beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec); 00445 if (beg_today < time) { 00446 /* Today */ 00447 res = wait_file(chan,ints,DIGITS_DIR "today",lang); 00448 } else if (beg_today - 86400 < time) { 00449 /* Yesterday */ 00450 res = wait_file(chan,ints,DIGITS_DIR "yesterday",lang); 00451 } else { 00452 res = ast_say_date_with_format(chan, time, ints, lang, "ABdY", timezone); 00453 } 00454 } 00455 break; 00456 case 'q': 00457 /* Shorthand for "" (today), "Yesterday", A (weekday), or ABdY */ 00458 { 00459 struct timeval now; 00460 struct tm tmnow; 00461 time_t beg_today; 00462 00463 gettimeofday(&now,NULL); 00464 ast_localtime(&now.tv_sec,&tmnow,timezone); 00465 /* This might be slightly off, if we transcend a leap second, but never more off than 1 second */ 00466 /* In any case, it saves not having to do ast_mktime() */ 00467 beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec); 00468 if (beg_today < time) { 00469 /* Today */ 00470 } else if ((beg_today - 86400) < time) { 00471 /* Yesterday */ 00472 res = wait_file(chan,ints,DIGITS_DIR "yesterday",lang); 00473 } else if (beg_today - 86400 * 6 < time) { 00474 /* Within the last week */ 00475 res = ast_say_date_with_format(chan, time, ints, lang, "A", timezone); 00476 } else { 00477 res = ast_say_date_with_format(chan, time, ints, lang, "ABdY", timezone); 00478 } 00479 } 00480 break; 00481 case 'R': 00482 res = ast_say_date_with_format(chan, time, ints, lang, "HM", timezone); 00483 break; 00484 case 'S': 00485 /* Seconds */ 00486 if (tm.tm_sec == 0) { 00487 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_sec); 00488 res = wait_file(chan,ints,nextmsg,lang); 00489 } else if (tm.tm_sec < 10) { 00490 res = wait_file(chan,ints,DIGITS_DIR "oh",lang); 00491 if (!res) { 00492 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_sec); 00493 res = wait_file(chan,ints,nextmsg,lang); 00494 } 00495 } else if ((tm.tm_sec < 21) || (tm.tm_sec % 10 == 0)) { 00496 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_sec); 00497 res = wait_file(chan,ints,nextmsg,lang); 00498 } else { 00499 int ten, one; 00500 ten = (tm.tm_sec / 10) * 10; 00501 one = (tm.tm_sec % 10); 00502 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", ten); 00503 res = wait_file(chan,ints,nextmsg,lang); 00504 if (!res) { 00505 /* Fifty, not fifty-zero */ 00506 if (one != 0) { 00507 snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", one); 00508 res = wait_file(chan,ints,nextmsg,lang); 00509 } 00510 } 00511 } 00512 break; 00513 case 'T': 00514 res = ast_say_date_with_format(chan, time, ints, lang, "HMS", timezone); 00515 break; 00516 case ' ': 00517 case ' ': 00518 /* Just ignore spaces and tabs */ 00519 break; 00520 default: 00521 /* Unknown character */ 00522 ast_log(LOG_WARNING, "Unknown character in datetime format %s: %c at pos %d\n", format, format[offset], offset); 00523 } 00524 /* Jump out on DTMF */ 00525 if (res) { 00526 break; 00527 } 00528 } 00529 return res; 00530 } |
|
Definition at line 578 of file say.c. References ast_say_number(), ast_streamfile(), and ast_waitstream().
00579 { 00580 struct tm tm; 00581 char fn[256]; 00582 int res = 0; 00583 int hour, pm=0; 00584 localtime_r(&t,&tm); 00585 if (!res) { 00586 snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday); 00587 res = ast_streamfile(chan, fn, lang); 00588 if (!res) 00589 res = ast_waitstream(chan, ints); 00590 } 00591 if (!res) { 00592 snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon); 00593 res = ast_streamfile(chan, fn, lang); 00594 if (!res) 00595 res = ast_waitstream(chan, ints); 00596 } 00597 if (!res) 00598 res = ast_say_number(chan, tm.tm_mday, ints, lang); 00599 00600 hour = tm.tm_hour; 00601 if (!hour) 00602 hour = 12; 00603 else if (hour == 12) 00604 pm = 1; 00605 else if (hour > 12) { 00606 hour -= 12; 00607 pm = 1; 00608 } 00609 if (!res) 00610 res = ast_say_number(chan, hour, ints, lang); 00611 00612 if (tm.tm_min > 9) { 00613 if (!res) 00614 res = ast_say_number(chan, tm.tm_min, ints, lang); 00615 } else if (tm.tm_min) { 00616 if (!res) 00617 res = ast_streamfile(chan, "digits/oh", lang); 00618 if (!res) 00619 res = ast_waitstream(chan, ints); 00620 if (!res) 00621 res = ast_say_number(chan, tm.tm_min, ints, lang); 00622 } else { 00623 if (!res) 00624 res = ast_streamfile(chan, "digits/oclock", lang); 00625 if (!res) 00626 res = ast_waitstream(chan, ints); 00627 } 00628 if (pm) { 00629 if (!res) 00630 res = ast_streamfile(chan, "digits/p-m", lang); 00631 } else { 00632 if (!res) 00633 res = ast_streamfile(chan, "digits/a-m", lang); 00634 } 00635 if (!res) 00636 res = ast_waitstream(chan, ints); 00637 if (!res) 00638 res = ast_say_number(chan, tm.tm_year + 1900, ints, lang); 00639 return res; 00640 } |
|
Definition at line 642 of file say.c. References ast_say_number(), ast_say_time(), ast_streamfile(), and ast_waitstream().
00643 { 00644 int res=0; 00645 time_t nowt; 00646 int daydiff; 00647 struct tm tm; 00648 struct tm now; 00649 char fn[256]; 00650 00651 time(&nowt); 00652 00653 localtime_r(&t,&tm); 00654 localtime_r(&nowt,&now); 00655 daydiff = now.tm_yday - tm.tm_yday; 00656 if ((daydiff < 0) || (daydiff > 6)) { 00657 /* Day of month and month */ 00658 if (!res) { 00659 snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon); 00660 res = ast_streamfile(chan, fn, lang); 00661 if (!res) 00662 res = ast_waitstream(chan, ints); 00663 } 00664 if (!res) 00665 res = ast_say_number(chan, tm.tm_mday, ints, lang); 00666 00667 } else if (daydiff) { 00668 /* Just what day of the week */ 00669 if (!res) { 00670 snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday); 00671 res = ast_streamfile(chan, fn, lang); 00672 if (!res) 00673 res = ast_waitstream(chan, ints); 00674 } 00675 } /* Otherwise, it was today */ 00676 if (!res) 00677 res = ast_say_time(chan, t, ints, lang); 00678 return res; 00679 } |
|
says digits of a string
Definition at line 30 of file say.c. References ast_stopstream(), ast_streamfile(), and ast_waitstream(). Referenced by ast_say_digits().
00031 { 00032 /* XXX Merge with full version? XXX */ 00033 char fn[256] = ""; 00034 int num = 0; 00035 int res = 0; 00036 while(fn2[num] && !res) { 00037 switch (fn2[num]) { 00038 case ('*'): 00039 snprintf(fn, sizeof(fn), "digits/star"); 00040 break; 00041 case ('#'): 00042 snprintf(fn, sizeof(fn), "digits/pound"); 00043 break; 00044 default: 00045 snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); 00046 } 00047 res = ast_streamfile(chan, fn, lang); 00048 if (!res) 00049 res = ast_waitstream(chan, ints); 00050 ast_stopstream(chan); 00051 num++; 00052 } 00053 return res; 00054 } |
|
Definition at line 56 of file say.c. References ast_stopstream(), ast_streamfile(), and ast_waitstream_full(). Referenced by ast_say_digits_full().
00057 { 00058 char fn[256] = ""; 00059 int num = 0; 00060 int res = 0; 00061 while(fn2[num] && !res) { 00062 snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); 00063 res = ast_streamfile(chan, fn, lang); 00064 if (!res) 00065 res = ast_waitstream_full(chan, ints, audiofd, ctrlfd); 00066 ast_stopstream(chan); 00067 num++; 00068 } 00069 return res; 00070 } |
|
says digits
Definition at line 72 of file say.c. References ast_say_digit_str(). Referenced by ast_say_number().
00073 { 00074 /* XXX Should I be merged with say_digits_full XXX */ 00075 char fn2[256]; 00076 snprintf(fn2, sizeof(fn2), "%d", num); 00077 return ast_say_digit_str(chan, fn2, ints, lang); 00078 } |
|
Definition at line 80 of file say.c. References ast_say_digit_str_full(). Referenced by ast_say_number_full().
00081 { 00082 char fn2[256]; 00083 snprintf(fn2, sizeof(fn2), "%d", num); 00084 return ast_say_digit_str_full(chan, fn2, ints, lang, audiofd, ctrlfd); 00085 } |
|
says a number
Definition at line 152 of file say.c. References ast_log(), ast_say_digits(), ast_stopstream(), ast_streamfile(), ast_waitstream(), and LOG_DEBUG. Referenced by ast_say_date(), ast_say_datetime(), ast_say_datetime_from_now(), and ast_say_time().
00153 { 00154 /* XXX Should I be merged with ast_say_number_full XXX */ 00155 int res = 0; 00156 int playh = 0; 00157 char fn[256] = ""; 00158 if (!num) 00159 return ast_say_digits(chan, 0,ints, language); 00160 if (0) { 00161 /* XXX Only works for english XXX */ 00162 } else { 00163 /* Use english numbers */ 00164 language = "en"; 00165 while(!res && (num || playh)) { 00166 if (playh) { 00167 snprintf(fn, sizeof(fn), "digits/hundred"); 00168 playh = 0; 00169 } else 00170 if (num < 20) { 00171 snprintf(fn, sizeof(fn), "digits/%d", num); 00172 num = 0; 00173 } else 00174 if (num < 100) { 00175 snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10); 00176 num -= ((num / 10) * 10); 00177 } else { 00178 if (num < 1000){ 00179 snprintf(fn, sizeof(fn), "digits/%d", (num/100)); 00180 playh++; 00181 num -= ((num / 100) * 100); 00182 } else { 00183 if (num < 1000000) { 00184 res = ast_say_number(chan, num / 1000, ints, language); 00185 if (res) 00186 return res; 00187 num = num % 1000; 00188 snprintf(fn, sizeof(fn), "digits/thousand"); 00189 } else { 00190 if (num < 1000000000) { 00191 res = ast_say_number(chan, num / 1000000, ints, language); 00192 if (res) 00193 return res; 00194 num = num % 1000000; 00195 snprintf(fn, sizeof(fn), "digits/million"); 00196 } else { 00197 ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); 00198 res = -1; 00199 } 00200 } 00201 } 00202 } 00203 if (!res) { 00204 res = ast_streamfile(chan, fn, language); 00205 if (!res) 00206 res = ast_waitstream(chan, ints); 00207 ast_stopstream(chan); 00208 } 00209 00210 } 00211 } 00212 return res; 00213 } |
|
Definition at line 87 of file say.c. References ast_log(), ast_say_digits_full(), ast_stopstream(), ast_streamfile(), ast_waitstream_full(), and LOG_DEBUG.
00088 { 00089 int res = 0; 00090 int playh = 0; 00091 char fn[256] = ""; 00092 if (!num) 00093 return ast_say_digits_full(chan, 0,ints, language, audiofd, ctrlfd); 00094 if (0) { 00095 /* XXX Only works for english XXX */ 00096 } else { 00097 /* Use english numbers if a given language is supported. */ 00098 /* As a special case, Norwegian has the same numerical grammar 00099 as English */ 00100 if (strcasecmp(language, "no")) 00101 language = "en"; 00102 while(!res && (num || playh)) { 00103 if (playh) { 00104 snprintf(fn, sizeof(fn), "digits/hundred"); 00105 playh = 0; 00106 } else 00107 if (num < 20) { 00108 snprintf(fn, sizeof(fn), "digits/%d", num); 00109 num = 0; 00110 } else 00111 if (num < 100) { 00112 snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10); 00113 num -= ((num / 10) * 10); 00114 } else { 00115 if (num < 1000){ 00116 snprintf(fn, sizeof(fn), "digits/%d", (num/100)); 00117 playh++; 00118 num -= ((num / 100) * 100); 00119 } else { 00120 if (num < 1000000) { /* 1,000,000 */ 00121 res = ast_say_number_full(chan, num / 1000, ints, language, audiofd, ctrlfd); 00122 if (res) 00123 return res; 00124 num = num % 1000; 00125 snprintf(fn, sizeof(fn), "digits/thousand"); 00126 } else { 00127 if (num < 1000000000) { /* 1,000,000,000 */ 00128 res = ast_say_number_full(chan, num / 1000000, ints, language, audiofd, ctrlfd); 00129 if (res) 00130 return res; 00131 num = num % 1000000; 00132 snprintf(fn, sizeof(fn), "digits/million"); 00133 } else { 00134 ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); 00135 res = -1; 00136 } 00137 } 00138 } 00139 } 00140 if (!res) { 00141 res = ast_streamfile(chan, fn, language); 00142 if (!res) 00143 res = ast_waitstream_full(chan, ints, audiofd, ctrlfd); 00144 ast_stopstream(chan); 00145 } 00146 00147 } 00148 } 00149 return res; 00150 } |
|
Definition at line 532 of file say.c. References ast_say_number(), ast_streamfile(), and ast_waitstream(). Referenced by ast_say_datetime_from_now().
00533 { 00534 struct tm tm; 00535 int res = 0; 00536 int hour, pm=0; 00537 localtime_r(&t,&tm); 00538 hour = tm.tm_hour; 00539 if (!hour) 00540 hour = 12; 00541 else if (hour == 12) 00542 pm = 1; 00543 else if (hour > 12) { 00544 hour -= 12; 00545 pm = 1; 00546 } 00547 if (!res) 00548 res = ast_say_number(chan, hour, ints, lang); 00549 00550 if (tm.tm_min > 9) { 00551 if (!res) 00552 res = ast_say_number(chan, tm.tm_min, ints, lang); 00553 } else if (tm.tm_min) { 00554 if (!res) 00555 res = ast_streamfile(chan, "digits/oh", lang); 00556 if (!res) 00557 res = ast_waitstream(chan, ints); 00558 if (!res) 00559 res = ast_say_number(chan, tm.tm_min, ints, lang); 00560 } else { 00561 if (!res) 00562 res = ast_streamfile(chan, "digits/oclock", lang); 00563 if (!res) 00564 res = ast_waitstream(chan, ints); 00565 } 00566 if (pm) { 00567 if (!res) 00568 res = ast_streamfile(chan, "digits/p-m", lang); 00569 } else { 00570 if (!res) 00571 res = ast_streamfile(chan, "digits/a-m", lang); 00572 } 00573 if (!res) 00574 res = ast_waitstream(chan, ints); 00575 return res; 00576 } |