diff --git a/tonezone.c b/tonezone.c index afdec99..8987061 100644 --- a/tonezone.c +++ b/tonezone.c @@ -89,18 +89,19 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c int firstnobang = -1; int freq1, freq2, time; int modulate = 0; - float gain; + float db, gain; int used = 0; dup = strdup(t->data); s = strtok(dup, ","); while(s && strlen(s)) { /* Handle optional ! which signifies don't start here*/ - if (s[0] == '!') + if (s[0] == '!') { s++; - else if (firstnobang < 0) { + } else if (firstnobang < 0) { PRINT_DEBUG("First no bang: %s\n", s); firstnobang = *count; } + if (sscanf(s, "%d+%d/%d", &freq1, &freq2, &time) == 3) { /* f1+f2/time format */ PRINT_DEBUG("f1+f2/time format: %d, %d, %d\n", freq1, freq2, time); @@ -111,18 +112,31 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c } else if (sscanf(s, "%d+%d", &freq1, &freq2) == 2) { PRINT_DEBUG("f1+f2 format: %d, %d\n", freq1, freq2); time = 0; + db = 1.0; } else if (sscanf(s, "%d*%d", &freq1, &freq2) == 2) { PRINT_DEBUG("f1+f2 format: %d, %d\n", freq1, freq2); modulate = 1; time = 0; + db = 1.0; } else if (sscanf(s, "%d/%d", &freq1, &time) == 2) { PRINT_DEBUG("f1/time format: %d, %d\n", freq1, time); freq2 = 0; + db = 1.0; + } else if (sscanf(s, "%d@/%d", &freq1, &time) == 2) { + /* The "@" character has been added to enable an + * approximately -20db tone generation of any frequency This has been done + * primarily to generate the Australian congestion tone. + * Example: "425/375,0/375,425@/375,0/375" + */ + PRINT_DEBUG("f1 reduced amplitude/time format: %d, %d\n", freq1,time); + db = 0.3; + freq2 = 0; } else if (sscanf(s, "%d", &freq1) == 1) { PRINT_DEBUG("f1 format: %d\n", freq1); firstnobang = *count; freq2 = 0; time = 0; + db = 1.0; } else { fprintf(stderr, "tone component '%s' of '%s' is a syntax error\n", s,t->data); return -1; @@ -137,7 +151,7 @@ static int build_tone(void *data, size_t size, struct tone_zone_sound *t, int *c td = data; /* Bring it down -8 dbm */ - gain = pow(10.0, (LEVEL - 3.14) / 20.0) * 65536.0 / 2.0; + gain = db*(pow(10.0, (LEVEL - 3.14) / 20.0) * 65536.0 / 2.0); td->fac1 = 2.0 * cos(2.0 * M_PI * (freq1 / 8000.0)) * 32768.0; td->init_v2_1 = sin(-4.0 * M_PI * (freq1 / 8000.0)) * gain; diff --git a/zonedata.c b/zonedata.c index 437ab0c..1d314b1 100644 --- a/zonedata.c +++ b/zonedata.c @@ -59,11 +59,18 @@ struct tone_zone builtin_zones[] = .description = "Australia", .ringcadence = { 400, 200, 400, 2000 }, .tones = { - { DAHDI_TONE_DIALTONE, "413+438" }, + + { DAHDI_TONE_DIALTONE, "415+440" }, { DAHDI_TONE_BUSY, "425/375,0/375" }, { DAHDI_TONE_RINGTONE, "413+438/400,0/200,413+438/400,0/2000" }, - /* XXX Congestion: Should reduce by 10 db every other cadence XXX */ - { DAHDI_TONE_CONGESTION, "425/375,0/375,420/375,0/375" }, + /* The Australian congestion tone is 425Hz, 375ms On, 375ms Off, with the + * second cadence being half the amplitude of the first; so the first cadence + * is approximately -10dB with the second one being -20dB. Using the update + * ToneZone.c file, this can be accomplished by adding the "@" symbol in front + * of the frequency to reduce amplification, as in the following entry for + * Congestion: + */ + { DAHDI_TONE_CONGESTION, "425/375,0/375,425@/375,0/375" }, { DAHDI_TONE_CALLWAIT, "425/100,0/200,425/200,0/4400" }, { DAHDI_TONE_DIALRECALL, "413+428" }, { DAHDI_TONE_RECORDTONE, "!425/1000,!0/15000,425/360,0/15000" },