Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Functions | Variables
indications.c File Reference

Indication Tone Handling. More...

#include "asterisk.h"
#include <math.h>
#include "asterisk/lock.h"
#include "asterisk/linkedlists.h"
#include "asterisk/indications.h"
#include "asterisk/frame.h"
#include "asterisk/format_cache.h"
#include "asterisk/channel.h"
#include "asterisk/utils.h"
#include "asterisk/cli.h"
#include "asterisk/module.h"
#include "asterisk/astobj2.h"
#include "asterisk/_private.h"
Include dependency graph for indications.c:

Go to the source code of this file.

Data Structures

struct  playtones_def
 
struct  playtones_item
 
struct  playtones_state
 

Macros

#define NUM_TONE_ZONE_BUCKETS   53
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_tone_zone_soundast_get_indication_tone (const struct ast_tone_zone *_zone, const char *indication)
 Locate a tone zone sound. More...
 
struct ast_tone_zoneast_get_indication_zone (const char *country)
 locate ast_tone_zone, given the country. if country == NULL, use the default country More...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
int ast_playtones_start (struct ast_channel *chan, int vol, const char *playlst, int interruptible)
 Start playing a list of tones on a channel. More...
 
void ast_playtones_stop (struct ast_channel *chan)
 Stop playing tones on a channel. More...
 
static int ast_register_indication (struct ast_tone_zone *zone, const char *indication, const char *tonelist)
 
static int ast_register_indication_country (struct ast_tone_zone *zone)
 add a new country, if country exists, it will be replaced. More...
 
static int ast_set_indication_country (const char *country)
 Set global indication country If no country is specified or we are unable to find the zone, then return not found. More...
 
static struct ast_tone_zoneast_tone_zone_alloc (void)
 
static int ast_tone_zone_cmp (void *obj, void *arg, int flags)
 
int ast_tone_zone_count (void)
 Get the number of registered tone zones. More...
 
static void ast_tone_zone_destructor (void *obj)
 deallocate the passed tone zone More...
 
static int ast_tone_zone_hash (const void *obj, const int flags)
 
struct ao2_iterator ast_tone_zone_iterator_init (void)
 Get an iterator for the available tone zones. More...
 
int ast_tone_zone_part_parse (const char *s, struct ast_tone_zone_part *tone_data)
 Parse a tone part. More...
 
static void ast_tone_zone_sound_destructor (void *obj)
 
static int ast_unregister_indication (struct ast_tone_zone *zone, const char *indication)
 remove an existing country's indication. Both country and indication must exist More...
 
static int ast_unregister_indication_country (const char *country)
 remove an existing country and all its indications, country must exist. More...
 
static char * complete_country (struct ast_cli_args *a)
 
static char * complete_indications (struct ast_cli_args *a)
 
static char * handle_cli_indication_add (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_indication_remove (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_indication_show (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static int is_valid_tone_zone (struct ast_tone_zone *zone)
 
static int load_indications (int reload)
 load indications module More...
 
static int load_module (void)
 Load indications module. More...
 
static int parse_tone_zone (struct ast_config *cfg, const char *country)
 
static void * playtones_alloc (struct ast_channel *chan, void *params)
 
static int playtones_generator (struct ast_channel *chan, void *data, int len, int samples)
 
static void playtones_release (struct ast_channel *chan, void *params)
 
static int prune_tone_zone (void *obj, void *arg, int flags)
 Prune tones no longer in the configuration, and have the tone zone unlinked if it is no longer in the configuration at all. More...
 
static int reload_module (void)
 Reload indications module. More...
 
static void reset_tone_zone (struct ast_tone_zone *zone)
 
static void store_config_tone_zone (struct ast_tone_zone *zone, const char *var, const char *value)
 
static void store_tone_zone_ring_cadence (struct ast_tone_zone *zone, const char *val)
 
static int tone_zone_mark (void *obj, void *arg, int flags)
 Mark the zone and its tones before parsing configuration. We will use this to know what to remove after configuration is parsed. More...
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Indication Tone Handling" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CORE, .requires = "extconfig", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ao2_containerast_tone_zones
 
static struct ast_cli_entry cli_indications []
 CLI entries for commands provided by this module. More...
 
static const char config [] = "indications.conf"
 
static struct ast_tone_zonedefault_tone_zone
 
static const int midi_tohz [128]
 
static struct ast_generator playtones
 

Detailed Description

Indication Tone Handling.

Author
Pauline Middelink midde.nosp@m.link.nosp@m.@poly.nosp@m.ware.nosp@m..nl
Russell Bryant russe.nosp@m.ll@d.nosp@m.igium.nosp@m..com

Definition in file indications.c.

Macro Definition Documentation

◆ NUM_TONE_ZONE_BUCKETS

#define NUM_TONE_ZONE_BUCKETS   53

Definition at line 68 of file indications.c.

Referenced by load_module().

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 1170 of file indications.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 1170 of file indications.c.

◆ ast_get_indication_tone()

struct ast_tone_zone_sound* ast_get_indication_tone ( const struct ast_tone_zone zone,
const char *  indication 
)

Locate a tone zone sound.

Parameters
zoneZone to look in for a sound, if NULL, the default will be used
indicationSound to look for, such as "busy"
Returns
a reference to the specified sound if it exists, NULL if not

Definition at line 455 of file indications.c.

References ao2_lock, ao2_unlock, AST_LIST_TRAVERSE, ast_tone_zone_lock, ast_tone_zone_ref(), ast_tone_zone_sound_ref(), ast_tone_zone_unlock, ast_tone_zone_unref(), ast_tone_zone_sound::name, NULL, and ast_tone_zone::tones.

Referenced by ast_app_dtget(), ast_control_tone(), dial_handle_playtones(), dialtone_indicate(), handle_playtones(), in_band_indication(), indicate_data_internal(), pbx_builtin_waitexten(), play_dialtone(), read_exec(), readexten_exec(), and send_dial_tone().

456 {
457  struct ast_tone_zone_sound *ts = NULL;
458  /* _zone is const to the users of the API */
459  struct ast_tone_zone *zone = (struct ast_tone_zone *) _zone;
460 
461  /* If no zone is specified, use the default */
462  if (!zone) {
464  if (default_tone_zone) {
466  }
468 
469  if (!zone) {
470  return NULL;
471  }
472  }
473 
474  ast_tone_zone_lock(zone);
475 
476  /* Look through list of tones in the zone searching for the right one */
477  AST_LIST_TRAVERSE(&zone->tones, ts, entry) {
478  if (!strcasecmp(ts->name, indication)) {
479  /* Increase ref count for the reference we will return */
480  ts = ast_tone_zone_sound_ref(ts);
481  break;
482  }
483  }
484 
485  ast_tone_zone_unlock(zone);
486 
487  if (!_zone)
488  zone = ast_tone_zone_unref(zone);
489 
490  return ts;
491 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
static struct ast_tone_zone * default_tone_zone
Definition: indications.c:73
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ao2_unlock(a)
Definition: astobj2.h:730
#define NULL
Definition: resample.c:96
A set of tones for a given locale.
Definition: indications.h:74
#define ao2_lock(a)
Definition: astobj2.h:718
const char * name
Name of the tone. For example, "busy".
Definition: indications.h:37
static struct ast_tone_zone_sound * ast_tone_zone_sound_ref(struct ast_tone_zone_sound *ts)
Increase the reference count on an ast_tone_zone_sound.
Definition: indications.h:238
Description of a tone.
Definition: indications.h:35
static struct ast_tone_zone * ast_tone_zone_ref(struct ast_tone_zone *tz)
Increase the reference count on an ast_tone_zone.
Definition: indications.h:216
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
Definition: search.h:40
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ ast_get_indication_zone()

struct ast_tone_zone* ast_get_indication_zone ( const char *  country)

locate ast_tone_zone, given the country. if country == NULL, use the default country

locate ast_tone_zone

Definition at line 433 of file indications.c.

References ao2_find, ao2_lock, ao2_unlock, ast_copy_string(), ast_strlen_zero, ast_tone_zone_ref(), ast_tone_zone::country, ast_tone_zone::nrringcadence, NULL, OBJ_POINTER, and tz.

Referenced by ast_control_tone(), ast_set_indication_country(), ast_var_indications(), build_device(), build_peer(), chan_pjsip_new(), func_channel_write_real(), handle_cli_indication_add(), handle_cli_indication_remove(), reload_config(), and sip_new().

434 {
435  struct ast_tone_zone *tz = NULL;
436  struct ast_tone_zone zone_arg = {
437  .nrringcadence = 0,
438  };
439 
440  if (ast_strlen_zero(country)) {
442  if (default_tone_zone) {
444  }
446 
447  return tz;
448  }
449 
450  ast_copy_string(zone_arg.country, country, sizeof(zone_arg.country));
451 
452  return ao2_find(ast_tone_zones, &zone_arg, OBJ_POINTER);
453 }
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
static struct ast_tone_zone * default_tone_zone
Definition: indications.c:73
#define OBJ_POINTER
Definition: astobj2.h:1154
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ao2_unlock(a)
Definition: astobj2.h:730
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
A set of tones for a given locale.
Definition: indications.h:74
#define ao2_lock(a)
Definition: astobj2.h:718
static char country[80]
Definition: pbx_dundi.c:205
static char * tz
Definition: cdr_pgsql.c:75
static struct ast_tone_zone * ast_tone_zone_ref(struct ast_tone_zone *tz)
Increase the reference count on an ast_tone_zone.
Definition: indications.h:216
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 1170 of file indications.c.

◆ ast_playtones_start()

int ast_playtones_start ( struct ast_channel chan,
int  vol,
const char *  tonelist,
int  interruptible 
)

Start playing a list of tones on a channel.

Parameters
chanthe channel to play tones on
volvolume
tonelistthe list of tones to play, comma separated
interruptiblewhether or not this tone can be interrupted
Return values
0success
non-zerofailure

Definition at line 302 of file indications.c.

References ast_activate_generator(), ast_free, ast_log, ast_realloc, ast_strdupa, ast_strip(), ast_strlen_zero, ast_tone_zone_part_parse(), cos, playtones_item::duration, playtones_item::fac1, playtones_item::fac2, ast_tone_zone_part::freq1, ast_tone_zone_part::freq2, playtones_item::init_v2_1, playtones_item::init_v2_2, playtones_item::init_v3_1, playtones_item::init_v3_2, playtones_def::interruptible, playtones_def::items, LOG_ERROR, M_PI, midi_tohz, ast_tone_zone_part::midinote, playtones_item::modulate, ast_tone_zone_part::modulate, playtones_def::nitems, NULL, playtones_def::reppos, strsep(), ast_tone_zone_part::time, and playtones_def::vol.

Referenced by ast_app_dtget(), ast_control_tone(), ast_senddigit_begin(), ast_senddigit_mf_begin(), control_tone_frame_response(), dial_handle_playtones(), dialtone_indicate(), handle_playtones(), in_band_indication(), indicate_data_internal(), mf_stream(), milliwatt_exec(), pbx_builtin_waitexten(), play_dialtone(), playtone(), read_exec(), readexten_exec(), receivefax_t38_init(), send_digit_to_chan(), send_tone_burst(), and sendfax_t38_init().

303 {
304  char *s, *data = ast_strdupa(playlst);
305  struct playtones_def d = { vol, -1, 0, 1, NULL };
306  char *stringp;
307  char *separator;
308  static const float sample_rate = 8000.0;
309  static const float max_sample_val = 32768.0;
310 
311  if (vol < 1) {
312  d.vol = 7219; /* Default to -8db */
313  }
314 
316 
317  stringp = data;
318 
319  /* check if the data is separated with '|' or with ',' by default */
320  if (strchr(stringp,'|')) {
321  separator = "|";
322  } else {
323  separator = ",";
324  }
325 
326  while ((s = strsep(&stringp, separator)) && !ast_strlen_zero(s)) {
327  struct playtones_item *new_items;
328  struct ast_tone_zone_part tone_data = {
329  .time = 0,
330  };
331 
332  s = ast_strip(s);
333  if (s[0]=='!') {
334  s++;
335  } else if (d.reppos == -1) {
336  d.reppos = d.nitems;
337  }
338 
339  if (ast_tone_zone_part_parse(s, &tone_data)) {
340  ast_log(LOG_ERROR, "Failed to parse tone part '%s'\n", s);
341  continue;
342  }
343 
344  if (tone_data.midinote) {
345  /* midi notes must be between 0 and 127 */
346  if (tone_data.freq1 <= 127) {
347  tone_data.freq1 = midi_tohz[tone_data.freq1];
348  } else {
349  tone_data.freq1 = 0;
350  }
351 
352  if (tone_data.freq2 <= 127) {
353  tone_data.freq2 = midi_tohz[tone_data.freq2];
354  } else {
355  tone_data.freq2 = 0;
356  }
357  }
358 
359  new_items = ast_realloc(d.items, (d.nitems + 1) * sizeof(*d.items));
360  if (!new_items) {
361  ast_free(d.items);
362  return -1;
363  }
364  d.items = new_items;
365 
366  d.items[d.nitems].fac1 = 2.0 * cos(2.0 * M_PI * (tone_data.freq1 / sample_rate)) * max_sample_val;
367  d.items[d.nitems].init_v2_1 = sin(-4.0 * M_PI * (tone_data.freq1 / sample_rate)) * d.vol;
368  d.items[d.nitems].init_v3_1 = sin(-2.0 * M_PI * (tone_data.freq1 / sample_rate)) * d.vol;
369 
370  d.items[d.nitems].fac2 = 2.0 * cos(2.0 * M_PI * (tone_data.freq2 / sample_rate)) * max_sample_val;
371  d.items[d.nitems].init_v2_2 = sin(-4.0 * M_PI * (tone_data.freq2 / sample_rate)) * d.vol;
372  d.items[d.nitems].init_v3_2 = sin(-2.0 * M_PI * (tone_data.freq2 / sample_rate)) * d.vol;
373 
374  d.items[d.nitems].duration = tone_data.time;
375  d.items[d.nitems].modulate = tone_data.modulate;
376 
377  d.nitems++;
378  }
379 
380  if (!d.nitems) {
381  ast_log(LOG_ERROR, "No valid tone parts\n");
382  return -1;
383  }
384 
385  if (ast_activate_generator(chan, &playtones, &d)) {
386  ast_free(d.items);
387  return -1;
388  }
389 
390  return 0;
391 }
unsigned int cos
Definition: chan_iax2.c:352
#define ast_realloc(p, len)
A wrapper for realloc()
Definition: astmm.h:228
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition: channel.c:2960
static struct test_val d
A description of a part of a tone.
Definition: indications.h:109
int ast_tone_zone_part_parse(const char *s, struct ast_tone_zone_part *tone_data)
Parse a tone part.
Definition: indications.c:245
unsigned int midinote
Definition: indications.h:114
#define NULL
Definition: resample.c:96
static struct ast_generator playtones
Definition: indications.c:239
unsigned int freq1
Definition: indications.h:110
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_log
Definition: astobj2.c:42
#define M_PI
Definition: resample.c:83
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:219
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:300
#define LOG_ERROR
Definition: logger.h:285
unsigned int time
Definition: indications.h:112
#define ast_free(a)
Definition: astmm.h:182
struct playtones_item * items
Definition: indications.c:91
unsigned int modulate
Definition: indications.h:113
char * strsep(char **str, const char *delims)
unsigned int freq2
Definition: indications.h:111
static const int midi_tohz[128]
Definition: indications.c:50

◆ ast_playtones_stop()

void ast_playtones_stop ( struct ast_channel chan)

Stop playing tones on a channel.

Parameters
chanthe channel to stop tones on

Definition at line 393 of file indications.c.

References ast_deactivate_generator().

Referenced by ast_app_dtget(), ast_senddigit_end(), ast_senddigit_mf_end(), control_tone_frame_response(), disa_exec(), handle_stopplaytones(), indicate_data_internal(), pbx_builtin_waitexten(), playtone(), read_exec(), readexten_exec(), receivefax_t38_init(), send_tone_burst(), sendfax_t38_init(), stop_indicate(), and unistim_indicate().

394 {
396 }
void ast_deactivate_generator(struct ast_channel *chan)
Definition: channel.c:2902

◆ ast_register_indication()

static int ast_register_indication ( struct ast_tone_zone zone,
const char *  indication,
const char *  tonelist 
)
static
Note
called with the tone zone locked

Definition at line 573 of file indications.c.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, AST_LIST_INSERT_TAIL, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_strdup, ast_strlen_zero, ast_tone_zone_sound_destructor(), ast_tone_zone_sound_unref(), ast_tone_zone_sound::data, ast_tone_zone_sound::name, and ast_tone_zone::tones.

Referenced by handle_cli_indication_add(), and store_config_tone_zone().

575 {
576  struct ast_tone_zone_sound *ts;
577 
578  if (ast_strlen_zero(indication) || ast_strlen_zero(tonelist)) {
579  return -1;
580  }
581 
583  if (!strcasecmp(indication, ts->name)) {
585  ts = ast_tone_zone_sound_unref(ts);
586  break;
587  }
588  }
590 
593  if (!ts) {
594  return -1;
595  }
596 
597  if (!(ts->name = ast_strdup(indication)) || !(ts->data = ast_strdup(tonelist))) {
598  ts = ast_tone_zone_sound_unref(ts);
599  return -1;
600  }
601 
602  AST_LIST_INSERT_TAIL(&zone->tones, ts, entry); /* Inherit reference */
603 
604  return 0;
605 }
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:406
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
Definition: indications.h:227
const char * name
Name of the tone. For example, "busy".
Definition: indications.h:37
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:730
Description of a tone.
Definition: indications.h:35
static void ast_tone_zone_sound_destructor(void *obj)
Definition: indications.c:493
Definition: search.h:40
const char * data
Description of a tone.
Definition: indications.h:52
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ ast_register_indication_country()

static int ast_register_indication_country ( struct ast_tone_zone zone)
static

add a new country, if country exists, it will be replaced.

Definition at line 526 of file indications.c.

References ao2_link, ao2_lock, ao2_unlock, ast_tone_zone_ref(), ast_verb, and ast_tone_zone::country.

Referenced by handle_cli_indication_add(), and parse_tone_zone().

527 {
529  if (!default_tone_zone) {
531  }
533 
534  ao2_link(ast_tone_zones, zone);
535 
536  ast_verb(3, "Registered indication country '%s'\n", zone->country);
537 
538  return 0;
539 }
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
static struct ast_tone_zone * default_tone_zone
Definition: indications.c:73
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ao2_unlock(a)
Definition: astobj2.h:730
#define ast_verb(level,...)
Definition: logger.h:463
#define ao2_lock(a)
Definition: astobj2.h:718
static struct ast_tone_zone * ast_tone_zone_ref(struct ast_tone_zone *tz)
Increase the reference count on an ast_tone_zone.
Definition: indications.h:216
#define ao2_link(container, obj)
Definition: astobj2.h:1549

◆ ast_set_indication_country()

static int ast_set_indication_country ( const char *  country)
static

Set global indication country If no country is specified or we are unable to find the zone, then return not found.

Definition at line 410 of file indications.c.

References ao2_lock, ao2_unlock, ast_get_indication_zone(), ast_strlen_zero, ast_tone_zone_ref(), ast_tone_zone_unref(), ast_verb, and NULL.

Referenced by load_indications().

411 {
412  struct ast_tone_zone *zone = NULL;
413 
415  return -1;
416  }
417 
418  ast_verb(3, "Setting default indication country to '%s'\n", country);
419 
421  if (default_tone_zone) {
423  }
426 
427  zone = ast_tone_zone_unref(zone);
428 
429  return 0;
430 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
static struct ast_tone_zone * default_tone_zone
Definition: indications.c:73
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ao2_unlock(a)
Definition: astobj2.h:730
#define NULL
Definition: resample.c:96
#define ast_verb(level,...)
Definition: logger.h:463
#define ast_strlen_zero(foo)
Definition: strings.h:52
A set of tones for a given locale.
Definition: indications.h:74
#define ao2_lock(a)
Definition: astobj2.h:718
static char country[80]
Definition: pbx_dundi.c:205
static struct ast_tone_zone * ast_tone_zone_ref(struct ast_tone_zone *tz)
Increase the reference count on an ast_tone_zone.
Definition: indications.h:216
struct ast_tone_zone * ast_get_indication_zone(const char *country)
locate ast_tone_zone, given the country. if country == NULL, use the default country ...
Definition: indications.c:433

◆ ast_tone_zone_alloc()

static struct ast_tone_zone* ast_tone_zone_alloc ( void  )
static

Definition at line 630 of file indications.c.

References ao2_alloc, and ast_tone_zone_destructor().

Referenced by handle_cli_indication_add(), and parse_tone_zone().

631 {
632  return ao2_alloc(sizeof(struct ast_tone_zone), ast_tone_zone_destructor);
633 }
A set of tones for a given locale.
Definition: indications.h:74
static void ast_tone_zone_destructor(void *obj)
deallocate the passed tone zone
Definition: indications.c:510
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411

◆ ast_tone_zone_cmp()

static int ast_tone_zone_cmp ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1111 of file indications.c.

References CMP_MATCH, CMP_STOP, and ast_tone_zone::country.

Referenced by load_module().

1112 {
1113  struct ast_tone_zone *zone = obj;
1114  struct ast_tone_zone *zone_arg = arg;
1115 
1116  return (!strcasecmp(zone->country, zone_arg->country)) ?
1117  CMP_MATCH | CMP_STOP : 0;
1118 }
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
A set of tones for a given locale.
Definition: indications.h:74

◆ ast_tone_zone_count()

int ast_tone_zone_count ( void  )

Get the number of registered tone zones.

Returns
the total number of registered tone zones

Definition at line 398 of file indications.c.

References ao2_container_count().

399 {
401 }
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
static struct ao2_container * ast_tone_zones
Definition: indications.c:66

◆ ast_tone_zone_destructor()

static void ast_tone_zone_destructor ( void *  obj)
static

deallocate the passed tone zone

Definition at line 510 of file indications.c.

References ast_free, AST_LIST_REMOVE_HEAD, ast_tone_zone_sound_unref(), NULL, ast_tone_zone::ringcadence, and ast_tone_zone::tones.

Referenced by ast_tone_zone_alloc().

511 {
512  struct ast_tone_zone *zone = obj;
513  struct ast_tone_zone_sound *current;
514 
515  while ((current = AST_LIST_REMOVE_HEAD(&zone->tones, entry))) {
516  current = ast_tone_zone_sound_unref(current);
517  }
518 
519  if (zone->ringcadence) {
520  ast_free(zone->ringcadence);
521  zone->ringcadence = NULL;
522  }
523 }
#define NULL
Definition: resample.c:96
A set of tones for a given locale.
Definition: indications.h:74
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
Definition: indications.h:227
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
Definition: linkedlists.h:832
Description of a tone.
Definition: indications.h:35
#define ast_free(a)
Definition: astmm.h:182
int * ringcadence
Array of ring cadence parts.
Definition: indications.h:91
Definition: search.h:40
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ ast_tone_zone_hash()

static int ast_tone_zone_hash ( const void *  obj,
const int  flags 
)
static

Definition at line 1104 of file indications.c.

References ast_str_case_hash(), and ast_tone_zone::country.

Referenced by load_module().

1105 {
1106  const struct ast_tone_zone *zone = obj;
1107 
1108  return ast_str_case_hash(zone->country);
1109 }
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
A set of tones for a given locale.
Definition: indications.h:74
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
Definition: strings.h:1250

◆ ast_tone_zone_iterator_init()

struct ao2_iterator ast_tone_zone_iterator_init ( void  )

Get an iterator for the available tone zones.

Note
Use ao2_iterator_next() to iterate the tone zones.
Use ao2_iterator_destroy() to clean up.
Returns
an initialized iterator

Definition at line 403 of file indications.c.

References ao2_iterator_init().

Referenced by ast_var_indications(), ast_var_indications_table(), and handle_cli_indication_show().

404 {
406 }
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.

◆ ast_tone_zone_part_parse()

int ast_tone_zone_part_parse ( const char *  s,
struct ast_tone_zone_part tone_data 
)

Parse a tone part.

Parameters
sThe part of a tone to parse. This should be in the form described for the data part of ast_tone_zone_sound. '!' should be removed if present.
tone_dataAn output parameter that contains the result of the parsing.
Return values
0success
-1failure, and the contents of tone_data are undefined

Definition at line 245 of file indications.c.

References ast_tone_zone_part::freq1, ast_tone_zone_part::freq2, ast_tone_zone_part::midinote, ast_tone_zone_part::modulate, and ast_tone_zone_part::time.

Referenced by ast_playtones_start(), and send_dial_tone().

246 {
247  if (sscanf(s, "%30u+%30u/%30u", &tone_data->freq1, &tone_data->freq2,
248  &tone_data->time) == 3) {
249  /* f1+f2/time format */
250  } else if (sscanf(s, "%30u+%30u", &tone_data->freq1, &tone_data->freq2) == 2) {
251  /* f1+f2 format */
252  tone_data->time = 0;
253  } else if (sscanf(s, "%30u*%30u/%30u", &tone_data->freq1, &tone_data->freq2,
254  &tone_data->time) == 3) {
255  /* f1*f2/time format */
256  tone_data->modulate = 1;
257  } else if (sscanf(s, "%30u*%30u", &tone_data->freq1, &tone_data->freq2) == 2) {
258  /* f1*f2 format */
259  tone_data->time = 0;
260  tone_data->modulate = 1;
261  } else if (sscanf(s, "%30u/%30u", &tone_data->freq1, &tone_data->time) == 2) {
262  /* f1/time format */
263  tone_data->freq2 = 0;
264  } else if (sscanf(s, "%30u", &tone_data->freq1) == 1) {
265  /* f1 format */
266  tone_data->freq2 = 0;
267  tone_data->time = 0;
268  } else if (sscanf(s, "M%30u+M%30u/%30u", &tone_data->freq1, &tone_data->freq2,
269  &tone_data->time) == 3) {
270  /* Mf1+Mf2/time format */
271  tone_data->midinote = 1;
272  } else if (sscanf(s, "M%30u+M%30u", &tone_data->freq1, &tone_data->freq2) == 2) {
273  /* Mf1+Mf2 format */
274  tone_data->time = 0;
275  tone_data->midinote = 1;
276  } else if (sscanf(s, "M%30u*M%30u/%30u", &tone_data->freq1, &tone_data->freq2,
277  &tone_data->time) == 3) {
278  /* Mf1*Mf2/time format */
279  tone_data->modulate = 1;
280  tone_data->midinote = 1;
281  } else if (sscanf(s, "M%30u*M%30u", &tone_data->freq1, &tone_data->freq2) == 2) {
282  /* Mf1*Mf2 format */
283  tone_data->time = 0;
284  tone_data->modulate = 1;
285  tone_data->midinote = 1;
286  } else if (sscanf(s, "M%30u/%30u", &tone_data->freq1, &tone_data->time) == 2) {
287  /* Mf1/time format */
288  tone_data->freq2 = -1;
289  tone_data->midinote = 1;
290  } else if (sscanf(s, "M%30u", &tone_data->freq1) == 1) {
291  /* Mf1 format */
292  tone_data->freq2 = -1;
293  tone_data->time = 0;
294  tone_data->midinote = 1;
295  } else {
296  return -1;
297  }
298 
299  return 0;
300 }
unsigned int midinote
Definition: indications.h:114
unsigned int freq1
Definition: indications.h:110
unsigned int time
Definition: indications.h:112
unsigned int modulate
Definition: indications.h:113
unsigned int freq2
Definition: indications.h:111

◆ ast_tone_zone_sound_destructor()

static void ast_tone_zone_sound_destructor ( void *  obj)
static

Definition at line 493 of file indications.c.

References ast_free, ast_tone_zone_sound::data, ast_tone_zone_sound::name, and NULL.

Referenced by ast_register_indication().

494 {
495  struct ast_tone_zone_sound *ts = obj;
496 
497  /* Deconstify the 'const char *'s so the compiler doesn't complain. (but it's safe) */
498  if (ts->name) {
499  ast_free((char *) ts->name);
500  ts->name = NULL;
501  }
502 
503  if (ts->data) {
504  ast_free((char *) ts->data);
505  ts->data = NULL;
506  }
507 }
#define NULL
Definition: resample.c:96
const char * name
Name of the tone. For example, "busy".
Definition: indications.h:37
Description of a tone.
Definition: indications.h:35
#define ast_free(a)
Definition: astmm.h:182
const char * data
Description of a tone.
Definition: indications.h:52

◆ ast_unregister_indication()

static int ast_unregister_indication ( struct ast_tone_zone zone,
const char *  indication 
)
static

remove an existing country's indication. Both country and indication must exist

Definition at line 608 of file indications.c.

References AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_tone_zone_lock, ast_tone_zone_sound_unref(), ast_tone_zone_unlock, ast_tone_zone_sound::name, and ast_tone_zone::tones.

Referenced by handle_cli_indication_remove().

609 {
610  struct ast_tone_zone_sound *ts;
611  int res = -1;
612 
613  ast_tone_zone_lock(zone);
614 
616  if (!strcasecmp(indication, ts->name)) {
618  ts = ast_tone_zone_sound_unref(ts);
619  res = 0;
620  break;
621  }
622  }
624 
625  ast_tone_zone_unlock(zone);
626 
627  return res;
628 }
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
Definition: indications.h:227
const char * name
Name of the tone. For example, "busy".
Definition: indications.h:37
Description of a tone.
Definition: indications.h:35
Definition: search.h:40
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ ast_unregister_indication_country()

static int ast_unregister_indication_country ( const char *  country)
static

remove an existing country and all its indications, country must exist.

Definition at line 542 of file indications.c.

References ao2_callback, ao2_find, ao2_lock, ao2_unlock, ast_copy_string(), ast_tone_zone_unref(), ast_tone_zone::country, ast_tone_zone::nrringcadence, NULL, OBJ_POINTER, OBJ_UNLINK, and tz.

Referenced by handle_cli_indication_add(), and handle_cli_indication_remove().

543 {
544  struct ast_tone_zone *tz = NULL;
545  struct ast_tone_zone zone_arg = {
546  .nrringcadence = 0,
547  };
548 
549  ast_copy_string(zone_arg.country, country, sizeof(zone_arg.country));
550 
552  tz = ao2_find(ast_tone_zones, &zone_arg, OBJ_POINTER | OBJ_UNLINK);
553  if (!tz) {
555  return -1;
556  }
557 
558  if (default_tone_zone == tz) {
560  /* Get a new default, punt to the first one we find */
562  }
564 
565  tz = ast_tone_zone_unref(tz);
566 
567  return 0;
568 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
static struct ast_tone_zone * default_tone_zone
Definition: indications.c:73
#define OBJ_POINTER
Definition: astobj2.h:1154
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
#define ao2_unlock(a)
Definition: astobj2.h:730
#define NULL
Definition: resample.c:96
A set of tones for a given locale.
Definition: indications.h:74
#define ao2_lock(a)
Definition: astobj2.h:718
static char country[80]
Definition: pbx_dundi.c:205
static char * tz
Definition: cdr_pgsql.c:75
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84

◆ complete_country()

static char* complete_country ( struct ast_cli_args a)
static

Definition at line 635 of file indications.c.

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ast_cli_completion_add(), ast_strdup, ast_tone_zone_unref(), ast_tone_zone::country, NULL, tz, and ast_cli_args::word.

Referenced by handle_cli_indication_add(), handle_cli_indication_remove(), and handle_cli_indication_show().

636 {
637  struct ao2_iterator i;
638  size_t wordlen;
639  struct ast_tone_zone *tz;
640 
641  wordlen = strlen(a->word);
642 
644  while ((tz = ao2_iterator_next(&i))) {
645  if (!strncasecmp(a->word, tz->country, wordlen)) {
648  break;
649  }
650  }
652  }
654 
655  return NULL;
656 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
A set of tones for a given locale.
Definition: indications.h:74
static char * tz
Definition: cdr_pgsql.c:75
#define ao2_iterator_next(iter)
Definition: astobj2.h:1933
const char * word
Definition: cli.h:163
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1841
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2726
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.

◆ complete_indications()

static char* complete_indications ( struct ast_cli_args a)
static

Definition at line 723 of file indications.c.

References ao2_find, ast_cli_args::argv, ast_cli_completion_add(), ast_copy_string(), AST_LIST_TRAVERSE, ast_strdup, ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone_unref(), ast_tone_zone::country, ast_tone_zone_sound::name, ast_tone_zone::nrringcadence, NULL, OBJ_POINTER, ast_cli_args::pos, ast_tone_zone::tones, tz, and ast_cli_args::word.

Referenced by handle_cli_indication_remove().

724 {
725  size_t wordlen;
726  struct ast_tone_zone_sound *ts;
727  struct ast_tone_zone *tz;
728  struct ast_tone_zone tmp_tz = {
729  .nrringcadence = 0,
730  };
731 
732  ast_copy_string(tmp_tz.country, a->argv[a->pos - 1], sizeof(tmp_tz.country));
733 
734  tz = ao2_find(ast_tone_zones, &tmp_tz, OBJ_POINTER);
735  if (!tz) {
736  return NULL;
737  }
738 
739  wordlen = strlen(a->word);
740 
741  ast_tone_zone_lock(tz);
742  AST_LIST_TRAVERSE(&tz->tones, ts, entry) {
743  if (!strncasecmp(a->word, ts->name, wordlen)) {
745  break;
746  }
747  }
748  }
750 
751  tz = ast_tone_zone_unref(tz);
752 
753  return NULL;
754 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
#define OBJ_POINTER
Definition: astobj2.h:1154
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
A set of tones for a given locale.
Definition: indications.h:74
const char * name
Name of the tone. For example, "busy".
Definition: indications.h:37
const char *const * argv
Definition: cli.h:161
static char * tz
Definition: cdr_pgsql.c:75
Description of a tone.
Definition: indications.h:35
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
const char * word
Definition: cli.h:163
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84
const int pos
Definition: cli.h:164
Definition: search.h:40
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
int ast_cli_completion_add(char *value)
Add a result to a request for completion options.
Definition: main/cli.c:2726
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ handle_cli_indication_add()

static char* handle_cli_indication_add ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 658 of file indications.c.

References ast_cli_args::argc, ast_cli_args::argv, ast_copy_string(), ast_get_indication_zone(), ast_log, ast_register_indication(), ast_register_indication_country(), ast_strlen_zero, ast_tone_zone_alloc(), ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone_unref(), ast_unregister_indication_country(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, complete_country(), ast_tone_zone::country, LOG_NOTICE, LOG_WARNING, NULL, ast_cli_args::pos, tz, and ast_cli_entry::usage.

659 {
660  struct ast_tone_zone *tz;
661  int created_country = 0;
662  char *res = CLI_SUCCESS;
663 
664  switch (cmd) {
665  case CLI_INIT:
666  e->command = "indication add";
667  e->usage =
668  "Usage: indication add <country> <indication> \"<tonelist>\"\n"
669  " Add the given indication to the country.\n";
670  return NULL;
671  case CLI_GENERATE:
672  if (a->pos == 2) {
673  return complete_country(a);
674  } else {
675  return NULL;
676  }
677  }
678 
679  if (a->argc != 5) {
680  return CLI_SHOWUSAGE;
681  }
682 
683  if (!(tz = ast_get_indication_zone(a->argv[2]))) {
684  /* country does not exist, create it */
685  ast_log(LOG_NOTICE, "Country '%s' does not exist, creating it.\n", a->argv[2]);
686 
687  if (!(tz = ast_tone_zone_alloc())) {
688  return CLI_FAILURE;
689  }
690 
691  ast_copy_string(tz->country, a->argv[2], sizeof(tz->country));
692 
694  ast_log(LOG_WARNING, "Unable to register new country\n");
695  tz = ast_tone_zone_unref(tz);
696  return CLI_FAILURE;
697  }
698 
699  created_country = 1;
700  }
701 
702  ast_tone_zone_lock(tz);
703 
704  if (ast_register_indication(tz, a->argv[3], a->argv[4])) {
705  if (ast_strlen_zero(a->argv[3])) {
706  ast_log(LOG_WARNING, "Unable to register indication %s\n", a->argv[2]);
707  } else {
708  ast_log(LOG_WARNING, "Unable to register indication %s/%s\n", a->argv[2], a->argv[3]);
709  }
710  if (created_country) {
712  }
713  res = CLI_FAILURE;
714  }
715 
717 
718  tz = ast_tone_zone_unref(tz);
719 
720  return res;
721 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
static char * complete_country(struct ast_cli_args *a)
Definition: indications.c:635
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
const int argc
Definition: cli.h:160
#define LOG_WARNING
Definition: logger.h:274
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
Definition: cli.h:152
#define NULL
Definition: resample.c:96
static int ast_register_indication(struct ast_tone_zone *zone, const char *indication, const char *tonelist)
Definition: indications.c:573
#define ast_strlen_zero(foo)
Definition: strings.h:52
static struct ast_tone_zone * ast_tone_zone_alloc(void)
Definition: indications.c:630
#define ast_log
Definition: astobj2.c:42
static int ast_register_indication_country(struct ast_tone_zone *zone)
add a new country, if country exists, it will be replaced.
Definition: indications.c:526
A set of tones for a given locale.
Definition: indications.h:74
const char *const * argv
Definition: cli.h:161
#define CLI_SHOWUSAGE
Definition: cli.h:45
static char * tz
Definition: cdr_pgsql.c:75
#define LOG_NOTICE
Definition: logger.h:263
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
struct ast_tone_zone * ast_get_indication_zone(const char *country)
locate ast_tone_zone, given the country. if country == NULL, use the default country ...
Definition: indications.c:433
#define CLI_SUCCESS
Definition: cli.h:44
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
const int pos
Definition: cli.h:164
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
static int ast_unregister_indication_country(const char *country)
remove an existing country and all its indications, country must exist.
Definition: indications.c:542

◆ handle_cli_indication_remove()

static char* handle_cli_indication_remove ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 756 of file indications.c.

References ast_cli_args::argc, ast_cli_args::argv, ast_get_indication_zone(), ast_log, ast_tone_zone_unref(), ast_unregister_indication(), ast_unregister_indication_country(), CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, complete_country(), complete_indications(), LOG_WARNING, NULL, ast_cli_args::pos, tz, and ast_cli_entry::usage.

757 {
758  struct ast_tone_zone *tz;
759  char *res = CLI_SUCCESS;
760 
761  switch (cmd) {
762  case CLI_INIT:
763  e->command = "indication remove";
764  e->usage =
765  "Usage: indication remove <country> [indication]\n"
766  " Remove the given indication from the country.\n";
767  return NULL;
768  case CLI_GENERATE:
769  if (a->pos == 2) {
770  return complete_country(a);
771  }
772  if (a->pos == 3) {
773  return complete_indications(a);
774  }
775  return NULL;
776  }
777 
778  if (a->argc != 3 && a->argc != 4) {
779  return CLI_SHOWUSAGE;
780  }
781 
782  if (a->argc == 3) {
783  /* remove entire country */
785  ast_log(LOG_WARNING, "Unable to unregister indication country %s\n", a->argv[2]);
786  return CLI_FAILURE;
787  }
788 
789  return CLI_SUCCESS;
790  }
791 
792  if (!(tz = ast_get_indication_zone(a->argv[2]))) {
793  ast_log(LOG_WARNING, "Unable to unregister indication %s/%s, country does not exists\n", a->argv[2], a->argv[3]);
794  return CLI_FAILURE;
795  }
796 
797  if (ast_unregister_indication(tz, a->argv[3])) {
798  ast_log(LOG_WARNING, "Unable to unregister indication %s/%s\n", a->argv[2], a->argv[3]);
799  res = CLI_FAILURE;
800  }
801 
802  tz = ast_tone_zone_unref(tz);
803 
804  return res;
805 }
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
static char * complete_country(struct ast_cli_args *a)
Definition: indications.c:635
const int argc
Definition: cli.h:160
#define LOG_WARNING
Definition: logger.h:274
Definition: cli.h:152
static char * complete_indications(struct ast_cli_args *a)
Definition: indications.c:723
static int ast_unregister_indication(struct ast_tone_zone *zone, const char *indication)
remove an existing country&#39;s indication. Both country and indication must exist
Definition: indications.c:608
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
A set of tones for a given locale.
Definition: indications.h:74
const char *const * argv
Definition: cli.h:161
#define CLI_SHOWUSAGE
Definition: cli.h:45
static char * tz
Definition: cdr_pgsql.c:75
#define CLI_FAILURE
Definition: cli.h:46
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
struct ast_tone_zone * ast_get_indication_zone(const char *country)
locate ast_tone_zone, given the country. if country == NULL, use the default country ...
Definition: indications.c:433
#define CLI_SUCCESS
Definition: cli.h:44
const int pos
Definition: cli.h:164
static int ast_unregister_indication_country(const char *country)
remove an existing country and all its indications, country must exist.
Definition: indications.c:542

◆ handle_cli_indication_show()

static char* handle_cli_indication_show ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 807 of file indications.c.

References ao2_find, ao2_iterator_destroy(), ao2_iterator_next, ast_cli_args::argc, ast_cli_args::argv, ast_cli(), ast_copy_string(), AST_LIST_TRAVERSE, ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_tone_zone_iterator_init(), ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone_unref(), buf, CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, complete_country(), ast_tone_zone::country, ast_tone_zone_sound::data, ast_tone_zone::description, ast_cli_args::fd, ast_tone_zone_sound::name, ast_tone_zone::nrringcadence, NULL, OBJ_POINTER, ast_tone_zone::ringcadence, ast_tone_zone::tones, tz, and ast_cli_entry::usage.

808 {
809  struct ast_tone_zone *tz = NULL;
810  struct ast_str *buf;
811  int found_country = 0;
812  int i;
813 
814  switch (cmd) {
815  case CLI_INIT:
816  e->command = "indication show";
817  e->usage =
818  "Usage: indication show [<country> ...]\n"
819  " Display either a condensed summary of all countries and indications, or a\n"
820  " more verbose list of indications for the specified countries.\n";
821  return NULL;
822  case CLI_GENERATE:
823  return complete_country(a);
824  }
825 
826  if (a->argc == 2) {
827  struct ao2_iterator iter;
828  /* no arguments, show a list of countries */
829  ast_cli(a->fd, "Country Description\n");
830  ast_cli(a->fd, "===========================\n");
832  while ((tz = ao2_iterator_next(&iter))) {
833  ast_tone_zone_lock(tz);
834  ast_cli(a->fd, "%-7.7s %s\n", tz->country, tz->description);
836  tz = ast_tone_zone_unref(tz);
837  }
838  ao2_iterator_destroy(&iter);
839  return CLI_SUCCESS;
840  }
841 
842  buf = ast_str_alloca(256);
843 
844  for (i = 2; i < a->argc; i++) {
845  struct ast_tone_zone zone_arg = {
846  .nrringcadence = 0,
847  };
848  struct ast_tone_zone_sound *ts;
849  int j;
850 
851  ast_copy_string(zone_arg.country, a->argv[i], sizeof(zone_arg.country));
852 
853  if (!(tz = ao2_find(ast_tone_zones, &zone_arg, OBJ_POINTER))) {
854  continue;
855  }
856 
857  if (!found_country) {
858  found_country = 1;
859  ast_cli(a->fd, "Country Indication PlayList\n");
860  ast_cli(a->fd, "=====================================\n");
861  }
862 
863  ast_tone_zone_lock(tz);
864 
865  ast_str_set(&buf, 0, "%-7.7s %-15.15s ", tz->country, "<ringcadence>");
866  for (j = 0; j < tz->nrringcadence; j++) {
867  ast_str_append(&buf, 0, "%d%s", tz->ringcadence[j],
868  (j == tz->nrringcadence - 1) ? "" : ",");
869  }
870  ast_str_append(&buf, 0, "\n");
871  ast_cli(a->fd, "%s", ast_str_buffer(buf));
872 
873  AST_LIST_TRAVERSE(&tz->tones, ts, entry) {
874  ast_cli(a->fd, "%-7.7s %-15.15s %s\n", tz->country, ts->name, ts->data);
875  }
876 
878  tz = ast_tone_zone_unref(tz);
879  }
880 
881  if (!found_country) {
882  ast_cli(a->fd, "No countries matched your criteria.\n");
883  }
884 
885  return CLI_SUCCESS;
886 }
char description[40]
Text description of the given country.
Definition: indications.h:82
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
static char * complete_country(struct ast_cli_args *a)
Definition: indications.c:635
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define OBJ_POINTER
Definition: astobj2.h:1154
const int argc
Definition: cli.h:160
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
Definition: cli.h:152
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ast_str_alloca(init_len)
Definition: strings.h:800
#define NULL
Definition: resample.c:96
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
A set of tones for a given locale.
Definition: indications.h:74
const int fd
Definition: cli.h:159
const char * name
Name of the tone. For example, "busy".
Definition: indications.h:37
const char *const * argv
Definition: cli.h:161
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static char * tz
Definition: cdr_pgsql.c:75
Description of a tone.
Definition: indications.h:35
#define ao2_iterator_next(iter)
Definition: astobj2.h:1933
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
char * command
Definition: cli.h:186
struct ao2_iterator ast_tone_zone_iterator_init(void)
Get an iterator for the available tone zones.
Definition: indications.c:403
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
int * ringcadence
Array of ring cadence parts.
Definition: indications.h:91
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1841
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84
Definition: search.h:40
const char * data
Description of a tone.
Definition: indications.h:52
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ is_valid_tone_zone()

static int is_valid_tone_zone ( struct ast_tone_zone zone)
static

Definition at line 888 of file indications.c.

References AST_LIST_EMPTY, ast_strlen_zero, ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone::description, and ast_tone_zone::tones.

Referenced by parse_tone_zone().

889 {
890  int res;
891 
892  ast_tone_zone_lock(zone);
893  res = (!ast_strlen_zero(zone->description) && !AST_LIST_EMPTY(&zone->tones));
894  ast_tone_zone_unlock(zone);
895 
896  return res;
897 }
char description[40]
Text description of the given country.
Definition: indications.h:82
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:449
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ load_indications()

static int load_indications ( int  reload)
static

load indications module

Definition at line 1045 of file indications.c.

References ao2_callback, ao2_lock, ao2_unlock, ast_category_browse(), ast_config_destroy(), ast_config_load2(), ast_log, ast_set_indication_country(), ast_strlen_zero, ast_variable_retrieve(), config, CONFIG_FLAG_FILEUNCHANGED, CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEMISSING, CONFIG_STATUS_FILEUNCHANGED, country, LOG_WARNING, NULL, OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, parse_tone_zone(), prune_tone_zone(), and tone_zone_mark().

Referenced by load_module(), and reload_module().

1046 {
1047  struct ast_config *cfg;
1048  const char *cxt = NULL;
1049  const char *country = NULL;
1050  struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
1051  int res = -1;
1052 
1053  cfg = ast_config_load2(config, "indications", config_flags);
1054 
1056  ast_log(LOG_WARNING, "Can't find indications config file %s.\n", config);
1057  return 0;
1058  } else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
1059  return 0;
1060  }
1061 
1062  /* Lock the container to prevent multiple simultaneous reloads */
1064 
1066 
1067  /* Use existing config to populate the Indication table */
1068  while ((cxt = ast_category_browse(cfg, cxt))) {
1069  /* All categories but "general" are considered countries */
1070  if (!strcasecmp(cxt, "general")) {
1071  continue;
1072  }
1073 
1074  if (parse_tone_zone(cfg, cxt)) {
1075  goto return_cleanup;
1076  }
1077  }
1078 
1081 
1082  /* determine which country is the default */
1083  country = ast_variable_retrieve(cfg, "general", "country");
1084  if (ast_strlen_zero(country) || ast_set_indication_country(country)) {
1085  ast_log(LOG_WARNING, "Unable to set the default country (for indication tones)\n");
1086  }
1087 
1088  res = 0;
1089 
1090 return_cleanup:
1092  ast_config_destroy(cfg);
1093 
1094  return res;
1095 }
#define LOG_WARNING
Definition: logger.h:274
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
#define CONFIG_STATUS_FILEINVALID
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
Definition: main/config.c:3154
static int prune_tone_zone(void *obj, void *arg, int flags)
Prune tones no longer in the configuration, and have the tone zone unlinked if it is no longer in the...
Definition: indications.c:1024
#define ao2_unlock(a)
Definition: astobj2.h:730
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
Definition: extconf.c:3328
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
static int tone_zone_mark(void *obj, void *arg, int flags)
Mark the zone and its tones before parsing configuration. We will use this to know what to remove aft...
Definition: indications.c:1002
#define ast_log
Definition: astobj2.c:42
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: extconf.c:1290
#define ao2_lock(a)
Definition: astobj2.h:718
#define CONFIG_STATUS_FILEUNCHANGED
static char country[80]
Definition: pbx_dundi.c:205
static int reload(void)
Definition: cdr_mysql.c:741
Structure used to handle boolean flags.
Definition: utils.h:199
#define CONFIG_STATUS_FILEMISSING
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
Definition: main/config.c:694
static int parse_tone_zone(struct ast_config *cfg, const char *country)
Definition: indications.c:958
static int ast_set_indication_country(const char *country)
Set global indication country If no country is specified or we are unable to find the zone...
Definition: indications.c:410
static const char config[]
Definition: indications.c:48

◆ load_module()

static int load_module ( void  )
static

Load indications module.

Definition at line 1140 of file indications.c.

References AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ARRAY_LEN, ast_cli_register_multiple, AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_tone_zone_cmp(), ast_tone_zone_hash(), load_indications(), NULL, and NUM_TONE_ZONE_BUCKETS.

Referenced by reload_module().

1141 {
1144  if (!ast_tone_zones) {
1145  return AST_MODULE_LOAD_FAILURE;
1146  }
1147 
1148  if (load_indications(0)) {
1149  return AST_MODULE_LOAD_FAILURE;
1150  }
1151 
1153 
1154  return AST_MODULE_LOAD_SUCCESS;
1155 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
static int ast_tone_zone_cmp(void *obj, void *arg, int flags)
Definition: indications.c:1111
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
#define NULL
Definition: resample.c:96
static struct ast_cli_entry cli_indications[]
CLI entries for commands provided by this module.
Definition: indications.c:1098
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Definition: astobj2.h:1310
#define NUM_TONE_ZONE_BUCKETS
Definition: indications.c:68
Module could not be loaded properly.
Definition: module.h:102
static int ast_tone_zone_hash(const void *obj, const int flags)
Definition: indications.c:1104
static int load_indications(int reload)
load indications module
Definition: indications.c:1045

◆ parse_tone_zone()

static int parse_tone_zone ( struct ast_config cfg,
const char *  country 
)
static

Definition at line 958 of file indications.c.

References ao2_find, ast_copy_string(), ast_log, ast_register_indication_country(), ast_tone_zone_alloc(), ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone_unref(), ast_variable_browse(), ast_tone_zone::country, is_valid_tone_zone(), LOG_WARNING, ast_variable::name, ast_variable::next, ast_tone_zone::nrringcadence, OBJ_POINTER, reset_tone_zone(), store_config_tone_zone(), and ast_variable::value.

Referenced by load_indications().

959 {
960  struct ast_variable *v;
961  struct ast_tone_zone *zone;
962  struct ast_tone_zone tmp_zone = {
963  .nrringcadence = 0,
964  };
965  int allocd = 0;
966 
967  ast_copy_string(tmp_zone.country, country, sizeof(tmp_zone.country));
968 
969  if ((zone = ao2_find(ast_tone_zones, &tmp_zone, OBJ_POINTER))) {
970  reset_tone_zone(zone);
971  } else if ((zone = ast_tone_zone_alloc())) {
972  allocd = 1;
973  ast_copy_string(zone->country, country, sizeof(zone->country));
974  } else {
975  return -1;
976  }
977 
978  ast_tone_zone_lock(zone);
979  for (v = ast_variable_browse(cfg, country); v; v = v->next) {
980  store_config_tone_zone(zone, v->name, v->value);
981  }
982  ast_tone_zone_unlock(zone);
983 
984  if (allocd) {
985  if (!is_valid_tone_zone(zone)) {
986  ast_log(LOG_WARNING, "Indication country '%s' is invalid\n", country);
987  } else if (ast_register_indication_country(zone)) {
988  ast_log(LOG_WARNING, "Unable to register indication country '%s'.\n",
989  country);
990  }
991  }
992 
993  zone = ast_tone_zone_unref(zone);
994 
995  return 0;
996 }
struct ast_variable * next
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
char country[MAX_TONEZONE_COUNTRY]
Country code that this set of tones is for.
Definition: indications.h:76
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1216
#define OBJ_POINTER
Definition: astobj2.h:1154
#define LOG_WARNING
Definition: logger.h:274
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
Structure for variables, used for configurations and for channel variables.
static void reset_tone_zone(struct ast_tone_zone *zone)
Definition: indications.c:943
static struct ast_tone_zone * ast_tone_zone_alloc(void)
Definition: indications.c:630
static int is_valid_tone_zone(struct ast_tone_zone *zone)
Definition: indications.c:888
#define ast_log
Definition: astobj2.c:42
static int ast_register_indication_country(struct ast_tone_zone *zone)
add a new country, if country exists, it will be replaced.
Definition: indications.c:526
A set of tones for a given locale.
Definition: indications.h:74
static void store_config_tone_zone(struct ast_tone_zone *zone, const char *var, const char *value)
Definition: indications.c:930
static char country[80]
Definition: pbx_dundi.c:205
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1756
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188

◆ playtones_alloc()

static void* playtones_alloc ( struct ast_channel chan,
void *  params 
)
static

Definition at line 128 of file indications.c.

References ao2_bump, ast_calloc, ast_channel_flags(), ast_channel_name(), ast_channel_writeformat(), ast_clear_flag, AST_FLAG_WRITE_INT, ast_format_slin, ast_log, ast_set_flag, ast_set_write_format(), playtones_def::interruptible, playtones_def::items, playtones_state::items, LOG_WARNING, playtones_def::nitems, playtones_state::nitems, NULL, playtones_state::oldnpos, playtones_state::origwfmt, playtones_release(), playtones_def::reppos, playtones_state::reppos, playtones_def::vol, and playtones_state::vol.

129 {
130  struct playtones_def *pd = params;
131  struct playtones_state *ps = NULL;
132 
133  if (!(ps = ast_calloc(1, sizeof(*ps)))) {
134  return NULL;
135  }
136 
138 
140  ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", ast_channel_name(chan));
141  playtones_release(NULL, ps);
142  ps = NULL;
143  } else {
144  ps->vol = pd->vol;
145  ps->reppos = pd->reppos;
146  ps->nitems = pd->nitems;
147  ps->items = pd->items;
148  ps->oldnpos = -1;
149  }
150 
151  /* Let interrupts interrupt :) */
152  if (pd->interruptible) {
154  } else {
156  }
157 
158  return ps;
159 }
#define ast_set_flag(p, flag)
Definition: utils.h:70
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
#define ao2_bump(obj)
Definition: astobj2.h:491
#define ast_log
Definition: astobj2.c:42
struct playtones_item * items
Definition: indications.c:104
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
struct playtones_item * items
Definition: indications.c:91
#define ast_clear_flag(p, flag)
Definition: utils.h:77
const char * ast_channel_name(const struct ast_channel *chan)
struct ast_format * origwfmt
Definition: indications.c:108
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41
struct ast_format * ast_channel_writeformat(struct ast_channel *chan)
static void playtones_release(struct ast_channel *chan, void *params)
Definition: indications.c:114

◆ playtones_generator()

static int playtones_generator ( struct ast_channel chan,
void *  data,
int  len,
int  samples 
)
static

Definition at line 161 of file indications.c.

References ast_format_slin, AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log, ast_write(), playtones_state::data, ast_frame::data, ast_frame::datalen, playtones_item::duration, playtones_state::f, playtones_item::fac1, playtones_item::fac2, ast_frame_subclass::format, ast_frame::frametype, playtones_item::init_v2_1, playtones_item::init_v2_2, playtones_item::init_v3_1, playtones_item::init_v3_2, playtones_state::items, len(), LOG_WARNING, playtones_item::modulate, playtones_state::nitems, playtones_state::npos, ast_frame::offset, playtones_state::oldnpos, playtones_state::pos, ast_frame::ptr, playtones_state::reppos, ast_frame::samples, ast_frame::subclass, playtones_state::v1_1, playtones_state::v1_2, playtones_state::v2_1, playtones_state::v2_2, playtones_state::v3_1, and playtones_state::v3_2.

162 {
163  struct playtones_state *ps = data;
164  struct playtones_item *pi;
165  int x;
166 
167  /* we need to prepare a frame with 16 * timelen samples as we're
168  * generating SLIN audio */
169 
170  len = samples * 2;
171  if (len > sizeof(ps->data) / 2 - 1) {
172  ast_log(LOG_WARNING, "Can't generate that much data!\n");
173  return -1;
174  }
175 
176  memset(&ps->f, 0, sizeof(ps->f));
177 
178  pi = &ps->items[ps->npos];
179 
180  if (ps->oldnpos != ps->npos) {
181  /* Load new parameters */
182  ps->v1_1 = 0;
183  ps->v2_1 = pi->init_v2_1;
184  ps->v3_1 = pi->init_v3_1;
185  ps->v1_2 = 0;
186  ps->v2_2 = pi->init_v2_2;
187  ps->v3_2 = pi->init_v3_2;
188  ps->oldnpos = ps->npos;
189  }
190 
191  for (x = 0; x < samples; x++) {
192  ps->v1_1 = ps->v2_1;
193  ps->v2_1 = ps->v3_1;
194  ps->v3_1 = (pi->fac1 * ps->v2_1 >> 15) - ps->v1_1;
195 
196  ps->v1_2 = ps->v2_2;
197  ps->v2_2 = ps->v3_2;
198  ps->v3_2 = (pi->fac2 * ps->v2_2 >> 15) - ps->v1_2;
199  if (pi->modulate) {
200  int p;
201  p = ps->v3_2 - 32768;
202  if (p < 0) {
203  p = -p;
204  }
205  p = ((p * 9) / 10) + 1;
206  ps->data[x] = (ps->v3_1 * p) >> 15;
207  } else {
208  ps->data[x] = ps->v3_1 + ps->v3_2;
209  }
210  }
211 
214  ps->f.datalen = len;
215  ps->f.samples = samples;
217  ps->f.data.ptr = ps->data;
218 
219  if (ast_write(chan, &ps->f)) {
220  return -1;
221  }
222 
223  ps->pos += x;
224 
225  if (pi->duration && ps->pos >= pi->duration * 8) { /* item finished? */
226  ps->pos = 0; /* start new item */
227  ps->npos++;
228  if (ps->npos >= ps->nitems) { /* last item? */
229  if (ps->reppos == -1) { /* repeat set? */
230  return -1;
231  }
232  ps->npos = ps->reppos; /* redo from top */
233  }
234  }
235 
236  return 0;
237 }
struct ast_frame f
Definition: indications.c:109
#define LOG_WARNING
Definition: logger.h:274
struct ast_frame_subclass subclass
#define ast_log
Definition: astobj2.c:42
short data[4000]
Definition: indications.c:111
#define AST_FRIENDLY_OFFSET
Offset into a frame&#39;s data buffer.
struct playtones_item * items
Definition: indications.c:104
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
int ast_write(struct ast_channel *chan, struct ast_frame *frame)
Write a frame to a channel This function writes the given frame to the indicated channel.
Definition: channel.c:5189
union ast_frame::@263 data
enum ast_frame_type frametype
struct ast_format * format
struct ast_format * ast_format_slin
Built-in cached signed linear 8kHz format.
Definition: format_cache.c:41

◆ playtones_release()

static void playtones_release ( struct ast_channel chan,
void *  params 
)
static

Definition at line 114 of file indications.c.

References ao2_cleanup, ast_free, ast_set_write_format(), playtones_state::items, and playtones_state::origwfmt.

Referenced by playtones_alloc().

115 {
116  struct playtones_state *ps = params;
117 
118  if (chan) {
119  ast_set_write_format(chan, ps->origwfmt);
120  }
121 
122  ao2_cleanup(ps->origwfmt);
123  ast_free(ps->items);
124 
125  ast_free(ps);
126 }
struct playtones_item * items
Definition: indications.c:104
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
Sets write format on channel chan.
Definition: channel.c:5890
#define ast_free(a)
Definition: astmm.h:182
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
struct ast_format * origwfmt
Definition: indications.c:108

◆ prune_tone_zone()

static int prune_tone_zone ( void *  obj,
void *  arg,
int  flags 
)
static

Prune tones no longer in the configuration, and have the tone zone unlinked if it is no longer in the configuration at all.

Definition at line 1024 of file indications.c.

References AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_tone_zone_lock, ast_tone_zone_sound_unref(), ast_tone_zone_unlock, CMP_MATCH, ast_tone_zone_sound::killme, ast_tone_zone::killme, and ast_tone_zone::tones.

Referenced by load_indications().

1025 {
1026  struct ast_tone_zone *zone = obj;
1027  struct ast_tone_zone_sound *s;
1028 
1029  ast_tone_zone_lock(zone);
1030 
1032  if (s->killme) {
1035  }
1036  }
1038 
1039  ast_tone_zone_unlock(zone);
1040 
1041  return zone->killme ? CMP_MATCH : 0;
1042 }
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
Definition: linkedlists.h:614
A set of tones for a given locale.
Definition: indications.h:74
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Definition: linkedlists.h:556
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
Definition: indications.h:227
Description of a tone.
Definition: indications.h:35
unsigned int killme
Definition: indications.h:98
unsigned int killme
Definition: indications.h:59
Definition: search.h:40
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
Definition: linkedlists.h:528
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ reload_module()

static int reload_module ( void  )
static

Reload indications module.

Definition at line 1158 of file indications.c.

References AST_MODFLAG_GLOBAL_SYMBOLS, AST_MODFLAG_LOAD_ORDER, AST_MODPRI_CORE, AST_MODULE_INFO(), AST_MODULE_SUPPORT_CORE, ASTERISK_GPL_KEY, load_indications(), load_module(), reload(), and unload_module().

1159 {
1160  return load_indications(1);
1161 }
static int load_indications(int reload)
load indications module
Definition: indications.c:1045

◆ reset_tone_zone()

static void reset_tone_zone ( struct ast_tone_zone zone)
static

Definition at line 943 of file indications.c.

References ast_free, ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone::killme, ast_tone_zone::nrringcadence, NULL, and ast_tone_zone::ringcadence.

Referenced by parse_tone_zone().

944 {
945  ast_tone_zone_lock(zone);
946 
947  zone->killme = 0;
948 
949  if (zone->nrringcadence) {
950  zone->nrringcadence = 0;
951  ast_free(zone->ringcadence);
952  zone->ringcadence = NULL;
953  }
954 
955  ast_tone_zone_unlock(zone);
956 }
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
#define NULL
Definition: resample.c:96
unsigned int killme
Definition: indications.h:98
#define ast_free(a)
Definition: astmm.h:182
int * ringcadence
Array of ring cadence parts.
Definition: indications.h:91
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188

◆ store_config_tone_zone()

static void store_config_tone_zone ( struct ast_tone_zone zone,
const char *  var,
const char *  value 
)
static

Definition at line 930 of file indications.c.

References ast_register_indication(), CV_END, CV_F, CV_START, CV_STR, ast_tone_zone::description, and store_tone_zone_ring_cadence().

Referenced by parse_tone_zone().

932 {
933  CV_START(var, value);
934 
935  CV_STR("description", zone->description);
936  CV_F("ringcadence", store_tone_zone_ring_cadence(zone, value));
937 
939 
940  CV_END;
941 }
char description[40]
Text description of the given country.
Definition: indications.h:82
#define var
Definition: ast_expr2f.c:614
#define CV_END
close a variable parsing block
int value
Definition: syslog.c:37
static int ast_register_indication(struct ast_tone_zone *zone, const char *indication, const char *tonelist)
Definition: indications.c:573
#define CV_START(__in_var, __in_val)
the macro to open a block for variable parsing
#define CV_STR(__x, __dst)
#define CV_F(__pattern, __body)
call a generic function if the name matches.
static void store_tone_zone_ring_cadence(struct ast_tone_zone *zone, const char *val)
Definition: indications.c:903

◆ store_tone_zone_ring_cadence()

static void store_tone_zone_ring_cadence ( struct ast_tone_zone zone,
const char *  val 
)
static
Note
This is called with the tone zone locked.

Definition at line 903 of file indications.c.

References ast_copy_string(), ast_log, ast_realloc, ast_strip(), buf, c, LOG_WARNING, ast_tone_zone::nrringcadence, ast_tone_zone::ringcadence, strsep(), tmp(), and value.

Referenced by store_config_tone_zone().

904 {
905  char buf[1024];
906  char *ring, *c = buf;
907 
908  ast_copy_string(buf, val, sizeof(buf));
909 
910  while ((ring = strsep(&c, ","))) {
911  int *tmp, value;
912 
913  ring = ast_strip(ring);
914 
915  if (!isdigit(ring[0]) || (value = atoi(ring)) == -1) {
916  ast_log(LOG_WARNING, "Invalid ringcadence given '%s'.\n", ring);
917  continue;
918  }
919 
920  if (!(tmp = ast_realloc(zone->ringcadence, (zone->nrringcadence + 1) * sizeof(int)))) {
921  return;
922  }
923 
924  zone->ringcadence = tmp;
925  tmp[zone->nrringcadence] = value;
926  zone->nrringcadence++;
927  }
928 }
#define ast_realloc(p, len)
A wrapper for realloc()
Definition: astmm.h:228
Definition: ast_expr2.c:325
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define LOG_WARNING
Definition: logger.h:274
static int tmp()
Definition: bt_open.c:389
static struct test_val c
int value
Definition: syslog.c:37
#define ast_log
Definition: astobj2.c:42
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:219
int * ringcadence
Array of ring cadence parts.
Definition: indications.h:91
char * strsep(char **str, const char *delims)
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
unsigned int nrringcadence
Number of ring cadence elements in the ringcadence array.
Definition: indications.h:84

◆ tone_zone_mark()

static int tone_zone_mark ( void *  obj,
void *  arg,
int  flags 
)
static

Mark the zone and its tones before parsing configuration. We will use this to know what to remove after configuration is parsed.

Definition at line 1002 of file indications.c.

References AST_LIST_TRAVERSE, ast_tone_zone_lock, ast_tone_zone_unlock, ast_tone_zone_sound::killme, ast_tone_zone::killme, and ast_tone_zone::tones.

Referenced by load_indications().

1003 {
1004  struct ast_tone_zone *zone = obj;
1005  struct ast_tone_zone_sound *s;
1006 
1007  ast_tone_zone_lock(zone);
1008 
1009  zone->killme = 1;
1010 
1011  AST_LIST_TRAVERSE(&zone->tones, s, entry) {
1012  s->killme = 1;
1013  }
1014 
1015  ast_tone_zone_unlock(zone);
1016 
1017  return 0;
1018 }
#define ast_tone_zone_unlock(tz)
Unlock an ast_tone_zone.
Definition: indications.h:193
A set of tones for a given locale.
Definition: indications.h:74
Description of a tone.
Definition: indications.h:35
unsigned int killme
Definition: indications.h:98
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:490
unsigned int killme
Definition: indications.h:59
Definition: search.h:40
#define ast_tone_zone_lock(tz)
Lock an ast_tone_zone.
Definition: indications.h:188
struct ast_tone_zone::@271 tones
A list of tones for this locale.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 1124 of file indications.c.

References ao2_ref, ARRAY_LEN, ast_cli_unregister_multiple(), ast_tone_zone_unref(), and NULL.

Referenced by reload_module().

1125 {
1127  if (default_tone_zone) {
1130  }
1131  if (ast_tone_zones) {
1132  ao2_ref(ast_tone_zones, -1);
1133  ast_tone_zones = NULL;
1134  }
1135 
1136  return 0;
1137 }
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
static struct ast_tone_zone * default_tone_zone
Definition: indications.c:73
static struct ao2_container * ast_tone_zones
Definition: indications.c:66
#define NULL
Definition: resample.c:96
static struct ast_cli_entry cli_indications[]
CLI entries for commands provided by this module.
Definition: indications.c:1098
#define ao2_ref(o, delta)
Definition: astobj2.h:464

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Indication Tone Handling" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_CORE, .requires = "extconfig", }
static

Definition at line 1170 of file indications.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 1170 of file indications.c.

◆ ast_tone_zones

struct ao2_container* ast_tone_zones
static

Definition at line 66 of file indications.c.

◆ cli_indications

struct ast_cli_entry cli_indications[]
static
Initial value:
= {
{ .handler = handle_cli_indication_add , .summary = "Add the given indication to the country" ,},
{ .handler = handle_cli_indication_remove , .summary = "Remove the given indication from the country" ,},
{ .handler = handle_cli_indication_show , .summary = "Display a list of all countries/indications" ,}
}
static char * handle_cli_indication_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: indications.c:807
static char * handle_cli_indication_add(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: indications.c:658
static char * handle_cli_indication_remove(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: indications.c:756

CLI entries for commands provided by this module.

Definition at line 1098 of file indications.c.

◆ config

const char config[] = "indications.conf"
static

Definition at line 48 of file indications.c.

Referenced by load_indications().

◆ default_tone_zone

struct ast_tone_zone* default_tone_zone
static
Note
Access to this is protected by locking the ast_tone_zones container

Definition at line 73 of file indications.c.

◆ midi_tohz

const int midi_tohz[128]
static

Definition at line 50 of file indications.c.

Referenced by ast_playtones_start().

◆ playtones

struct ast_generator playtones
static
Initial value:
= {
.alloc = playtones_alloc,
.release = playtones_release,
.generate = playtones_generator,
}
static int playtones_generator(struct ast_channel *chan, void *data, int len, int samples)
Definition: indications.c:161
static void * playtones_alloc(struct ast_channel *chan, void *params)
Definition: indications.c:128
static void playtones_release(struct ast_channel *chan, void *params)
Definition: indications.c:114

Definition at line 239 of file indications.c.