Ticket #8132: openwrt-asterisk-1.8.patch

File openwrt-asterisk-1.8.patch, 192.7 KB (added by zandbelt, 7 years ago)
  • asterisk-1.8.x/patches/101-fix-google-voice-out.patch

    Property changes on: asterisk-1.8.x
    ___________________________________________________________________
    Added: svn:mergeinfo
    
     
     1Index: asterisk-1.8.0/channels/chan_gtalk.c 
     2=================================================================== 
     3--- asterisk-1.8.0/channels/chan_gtalk.c        (revision 297950) 
     4+++ asterisk-1.8.0/channels/chan_gtalk.c        (working copy) 
     5@@ -196,6 +196,8 @@ 
     6 static char *gtalk_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); 
     7 static char *gtalk_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); 
     8 static int gtalk_update_externip(void); 
     9+static int gtalk_parser(void *data, ikspak *pak); 
     10+static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, char *sid, char *from, char *to); 
     11  
     12 /*! \brief PBX interface structure for channel registration */ 
     13 static const struct ast_channel_tech gtalk_tech = { 
     14@@ -466,12 +468,46 @@ 
     15 static int gtalk_ringing_ack(void *data, ikspak *pak) 
     16 { 
     17        struct gtalk_pvt *p = data; 
     18+       struct ast_channel *owner; 
     19  
     20-       if (p->ringrule) 
     21+       ast_mutex_lock(&p->lock); 
     22+ 
     23+       if (p->ringrule) { 
     24                iks_filter_remove_rule(p->parent->connection->f, p->ringrule); 
     25+       } 
     26        p->ringrule = NULL; 
     27-       if (p->owner) 
     28-               ast_queue_control(p->owner, AST_CONTROL_RINGING); 
     29+ 
     30+       /* this may be a redirect */ 
     31+       if (!strcmp(S_OR(iks_find_attrib(pak->x, "type"), ""), "error")) { 
     32+               char *name = NULL; 
     33+               char *redirect = NULL; 
     34+               iks *traversenodes = NULL; 
     35+               traversenodes = pak->query; 
     36+               while (traversenodes) { 
     37+                       if (!(name = iks_name(traversenodes))) { 
     38+                               break; 
     39+                       } 
     40+                       if (!strcasecmp(name, "error") && 
     41+                               (redirect = iks_find_cdata(traversenodes, "redirect")) && 
     42+                               (redirect = strstr(redirect, "xmpp:"))) { 
     43+                               redirect += 5; 
     44+                               ast_log(LOG_DEBUG, "redirect %s\n", redirect); 
     45+                               ast_copy_string(p->them, redirect, sizeof(p->them)); 
     46+ 
     47+                               gtalk_invite(p, p->them, p->us, p->sid, 1); 
     48+                               break; 
     49+                       } 
     50+                       traversenodes = iks_next_tag(traversenodes); 
     51+               } 
     52+       } 
     53+       gtalk_create_candidates(p->parent, p, p->sid, p->them, p->us); 
     54+       owner = p->owner; 
     55+       ast_mutex_unlock(&p->lock); 
     56+ 
     57+       if (owner) { 
     58+               ast_queue_control(owner, AST_CONTROL_RINGING); 
     59+       } 
     60+ 
     61        return IKS_FILTER_EAT; 
     62 } 
     63  
     64@@ -973,7 +1009,7 @@ 
     65                if (resources) { 
     66                        snprintf(idroster, sizeof(idroster), "%s/%s", them, resources->resource); 
     67                } else if ((*them == '+') || (strstr(them, "@voice.google.com"))) { 
     68-                       snprintf(idroster, sizeof(idroster), "%s/srvres", them); 
     69+                       snprintf(idroster, sizeof(idroster), "%s", them); 
     70                } else { 
     71                        ast_log(LOG_ERROR, "no gtalk capable clients to talk to.\n"); 
     72                        return NULL; 
     73@@ -1783,7 +1819,6 @@ 
     74        } 
     75  
     76        gtalk_invite(p, p->them, p->us, p->sid, 1); 
     77-       gtalk_create_candidates(p->parent, p, p->sid, p->them, p->us); 
     78  
     79        return 0; 
     80 } 
  • asterisk-1.8.x/patches/100-build_tools-iconv.patch

     
    1 diff -Nru asterisk-1.6.2.0-beta2.org/build_tools/menuselect-deps.in asterisk-1.6.2.0-beta2/build_tools/menuselect-deps.in 
    2 --- asterisk-1.6.2.0-beta2.org/build_tools/menuselect-deps.in   2009-01-15 21:18:53.000000000 +0100 
    3 +++ asterisk-1.6.2.0-beta2/build_tools/menuselect-deps.in       2009-06-04 19:37:42.000000000 +0200 
    4 @@ -11,7 +11,7 @@ 
    5  GTK=@PBX_GTK@ 
     1--- asterisk-1.8.0/build_tools/menuselect-deps.in.orig  2010-07-27 18:30:38.000000000 -0400 
     2+++ asterisk-1.8.0/build_tools/menuselect-deps.in       2010-10-26 00:28:45.989447002 -0400 
     3@@ -14,7 +14,7 @@ 
    64 H323=@PBX_H323@ 
    75 HOARD=@PBX_HOARD@ 
     6 ICAL=@PBX_ICAL@ 
    87-ICONV=@PBX_ICONV@ 
    98+ICONV=0 
    109 IKSEMEL=@PBX_IKSEMEL@ 
  • asterisk-1.8.x/Makefile

     
    88include $(TOPDIR)/rules.mk 
    99 
    1010PKG_NAME:=asterisk 
    11 PKG_VERSION:=1.6.2.14 
     11PKG_VERSION:=1.8.1 
    1212PKG_RELEASE:=1 
    1313 
    1414PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 
    1515PKG_SOURCE_URL:=http://downloads.digium.com/pub/asterisk/releases/ 
    16 PKG_MD5SUM:=4f0414c9b2d449222b2fc7096cbaffe7 
     16PKG_MD5SUM:=b8d8af8146e9eed90063feb7fabffd25 
    1717 
    1818include $(INCLUDE_DIR)/package.mk 
    1919 
    20 define Package/asterisk16/Default 
    21   SUBMENU:=asterisk16 (Complete Open Source PBX), v1.6.x 
     20define Package/asterisk18/Default 
     21  SUBMENU:=asterisk18 (Complete Open Source PBX), v1.8.x 
    2222  SECTION:=net 
    2323  CATEGORY:=Network 
    2424  URL:=http://www.asterisk.org/ 
    2525  MAINTAINER:=Hans Zandbelt <hans.zandbelt@gmail.com> 
    2626endef 
    2727 
    28 define Package/asterisk16/Default/description 
     28define Package/asterisk18/Default/description 
    2929 Asterisk is a complete PBX in software. It provides all of the features 
    3030 you would expect from a PBX and more. Asterisk does voice over IP in three 
    3131 protocols, and can interoperate with almost all standards-based telephony 
     
    3333endef 
    3434 
    3535 
    36 define Package/asterisk16 
    37 $(call Package/asterisk16/Default) 
     36define Package/asterisk18 
     37$(call Package/asterisk18/Default) 
    3838  TITLE:=Complete open source PBX 
    3939  DEPENDS:= +libopenssl +libncurses +libpopt +libpthread +zlib @!TARGET_avr32 @!PACKAGE_asterisk14 
    4040endef 
    4141 
    42 define Package/asterisk16/description 
    43 $(call Package/asterisk16/Default/description) 
     42define Package/asterisk18/description 
     43$(call Package/asterisk18/Default/description) 
    4444endef 
    4545 
    46 define Package/asterisk16-sounds 
    47 $(call Package/asterisk16/Default) 
     46define Package/asterisk18-sounds 
     47$(call Package/asterisk18/Default) 
    4848  TITLE:=Sound files 
    49   DEPENDS:= +asterisk16 
     49  DEPENDS:= +asterisk18 
    5050endef 
    5151 
    52 define Package/asterisk16-sounds/description 
    53 $(call Package/asterisk16/Default/description) 
     52define Package/asterisk18-sounds/description 
     53$(call Package/asterisk18/Default/description) 
    5454 This package contains sound files for Asterisk. 
    5555endef 
    5656 
    5757 
    58 define Package/asterisk16-voicemail 
    59 $(call Package/asterisk16/Default) 
     58define Package/asterisk18-voicemail 
     59$(call Package/asterisk18/Default) 
    6060  TITLE:=Voicemail support 
    61   DEPENDS:= +asterisk16 
     61  DEPENDS:= +asterisk18 
    6262endef 
    6363 
    64 define Package/asterisk16-voicemail/description 
    65 $(call Package/asterisk16/Default/description) 
     64define Package/asterisk18-voicemail/description 
     65$(call Package/asterisk18/Default/description) 
    6666 This package contains voicemail related modules for Asterisk. 
    6767endef 
    6868 
    69 define Package/asterisk16-app-meetme 
    70 $(call Package/asterisk16/Default) 
     69define Package/asterisk18-app-meetme 
     70$(call Package/asterisk18/Default) 
    7171  TITLE:=conferencing support 
    72   DEPENDS:= +asterisk16 +dahdi-tools-libtonezone +kmod-dahdi-linux 
     72  DEPENDS:= +asterisk18 +dahdi-tools-libtonezone +kmod-dahdi-linux 
    7373endef 
    7474 
    75 define Package/asterisk16-app-meetme/description 
    76 $(call Package/asterisk16/Default/description) 
     75define Package/asterisk18-app-meetme/description 
     76$(call Package/asterisk18/Default/description) 
    7777 This package provides the MeetMe application driver Conferencing support to 
    7878 Asterisk. 
    7979endef 
    8080 
    81 define Package/asterisk16-chan-iax2 
    82 $(call Package/asterisk16/Default) 
     81define Package/asterisk18-chan-iax2 
     82$(call Package/asterisk18/Default) 
    8383  TITLE:=IAX support 
    84   DEPENDS:= +asterisk16 
     84  DEPENDS:= +asterisk18 
    8585endef 
    8686 
    87 define Package/asterisk16-chan-iax2/description 
    88 $(call Package/asterisk16/Default/description) 
     87define Package/asterisk18-chan-iax2/description 
     88$(call Package/asterisk18/Default/description) 
    8989 This package provides IAX support to 
    9090 Asterisk. 
    9191endef 
    9292 
    93 define Package/asterisk16-cdr 
    94 $(call Package/asterisk16/Default) 
     93define Package/asterisk18-cdr 
     94$(call Package/asterisk18/Default) 
    9595  TITLE:=CDR support 
    96   DEPENDS:= +asterisk16 
     96  DEPENDS:= +asterisk18 
    9797endef 
    9898 
    99 define Package/asterisk16-cdr/description 
    100 $(call Package/asterisk16/Default/description) 
     99define Package/asterisk18-cdr/description 
     100$(call Package/asterisk18/Default/description) 
    101101 This package provides Call Detail Record support to 
    102102 Asterisk. 
    103103endef 
    104104 
    105 define Package/asterisk16-res-musiconhold 
    106 $(call Package/asterisk16/Default) 
     105define Package/asterisk18-res-musiconhold 
     106$(call Package/asterisk18/Default) 
    107107  TITLE:=MOH support 
    108   DEPENDS:= +asterisk16 
     108  DEPENDS:= +asterisk18 
    109109endef 
    110110 
    111 define Package/asterisk16-res-musiconhold/description 
    112 $(call Package/asterisk16/Default/description) 
     111define Package/asterisk18-res-musiconhold/description 
     112$(call Package/asterisk18/Default/description) 
    113113 This package provides Music On Hold support to 
    114114 Asterisk. 
    115115endef 
    116116 
    117 define Package/asterisk16-chan-gtalk 
    118 $(call Package/asterisk16/Default) 
     117define Package/asterisk18-res-rtp-asterisk 
     118$(call Package/asterisk18/Default) 
     119  TITLE:=RTP Support 
     120  DEPENDS:= +asterisk18 
     121endef 
     122 
     123define Package/asterisk18-res-rtp-asterisk/description 
     124$(call Package/asterisk18/Default/description) 
     125 This package provides RTP support to Asterisk. 
     126 It is needed by chan_sip. 
     127endef 
     128 
     129define Package/asterisk18-chan-gtalk 
     130$(call Package/asterisk18/Default) 
    119131  TITLE:=GTalk support 
    120   DEPENDS:= +asterisk16 +libiksemel 
     132  DEPENDS:= +asterisk18 +libiksemel 
    121133endef 
    122134 
    123 define Package/asterisk16-chan-gtalk/description 
    124 $(call Package/asterisk16/Default/description) 
     135define Package/asterisk18-chan-gtalk/description 
     136$(call Package/asterisk18/Default/description) 
    125137 This package provides the channel chan_gtalk and res_jabber for GTalk 
    126138 support to Asterisk. 
    127139endef 
    128140 
    129 define Package/asterisk16-curl 
    130 $(call Package/asterisk16/Default) 
     141define Package/asterisk18-curl 
     142$(call Package/asterisk18/Default) 
    131143  TITLE:=CURL support 
    132   DEPENDS:= +asterisk16 +libcurl 
     144  DEPENDS:= +asterisk18 +libcurl 
    133145endef 
    134146 
    135 define Package/asterisk16-curl/description 
    136 $(call Package/asterisk16/Default/description) 
     147define Package/asterisk18-curl/description 
     148$(call Package/asterisk18/Default/description) 
    137149 This package provides CURL 
    138150 support to Asterisk. 
    139151endef 
    140152  
    141 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk16-app-meetme),) 
     153ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-app-meetme),) 
    142154  CONFIGURE_ARGS+= \ 
    143155        --with-dahdi="$(STAGING_DIR)/usr" 
    144156else 
     
    146158        --without-dahdi 
    147159endif 
    148160 
    149 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk16-chan-gtalk),) 
     161ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-chan-gtalk),) 
    150162  CONFIGURE_ARGS+= \ 
    151163        --with-gnutls="$(STAGING_DIR)/usr" \ 
    152164        --with-iksemel="$(STAGING_DIR)/usr" 
     
    159171        --without-iksemel 
    160172endif 
    161173 
    162 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk16-curl),) 
     174ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-curl),) 
    163175  CONFIGURE_ARGS+= \ 
    164176        --with-curl="$(STAGING_DIR)/usr" 
    165177else 
     
    222234        $(SED) 's|/var/lib/asterisk|/usr/lib/asterisk|g' $(PKG_INSTALL_DIR)/etc/asterisk/musiconhold.conf 
    223235endef 
    224236 
    225 #define Build/InstallDev 
    226 #       $(INSTALL_DIR) $(1)/usr/include/asterisk/ 
    227 #       $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk/ 
    228 #       $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/ 
    229 #endef 
     237define Build/InstallDev 
     238        $(INSTALL_DIR) $(1)/usr/include/asterisk/ 
     239        $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk/ 
     240        $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/ 
     241endef 
    230242 
    231 define Package/asterisk16/conffiles 
     243define Package/asterisk18/conffiles 
    232244/etc/asterisk/asterisk.conf 
    233245/etc/asterisk/modules.conf 
    234246/etc/asterisk/extensions.conf 
     
    243255/etc/init.d/asterisk 
    244256endef 
    245257 
    246 define Package/asterisk16/install 
     258define Package/asterisk18/install 
    247259        $(INSTALL_DIR) $(1)/etc/asterisk 
    248260        for f in asterisk extensions features \ 
    249261                indications logger manager modules \ 
     
    267279        $(INSTALL_BIN)  ./files/asterisk.init $(1)/etc/init.d/asterisk 
    268280endef 
    269281 
    270 define Package/asterisk16-sounds/install 
     282define Package/asterisk18-sounds/install 
    271283        $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/ 
    272         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/ 
     284        $(CP) $(PKG_INSTALL_DIR)/var/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/ 
    273285        rm -f $(1)/usr/lib/asterisk/sounds/vm-* 
    274286        rm -f $(1)/usr/lib/asterisk/sounds/conf-* 
    275287endef 
    276288 
    277289 
    278 define Package/asterisk16-voicemail/conffiles 
     290define Package/asterisk18-voicemail/conffiles 
    279291/etc/asterisk/voicemail.conf 
    280292endef 
    281293 
    282 define Package/asterisk16-voicemail/install 
     294define Package/asterisk18-voicemail/install 
    283295        $(INSTALL_DIR) $(1)/etc/asterisk 
    284296        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/voicemail.conf $(1)/etc/asterisk/ 
    285297        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    286298        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*voicemail.so $(1)/usr/lib/asterisk/modules/ 
    287299        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_adsi.so $(1)/usr/lib/asterisk/modules/ 
    288300        $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/ 
    289         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/vm-*.gsm $(1)/usr/lib/asterisk/sounds/ 
     301        $(CP) $(PKG_INSTALL_DIR)/var/lib/asterisk/sounds/en/vm-*.gsm $(1)/usr/lib/asterisk/sounds/ 
    290302endef 
    291303 
    292 define Package/asterisk16-app-meetme/conffiles 
     304define Package/asterisk18-app-meetme/conffiles 
    293305/etc/asterisk/meetme.conf 
    294306endef 
    295307 
    296 define Package/asterisk16-app-meetme/install 
     308define Package/asterisk18-app-meetme/install 
    297309        $(INSTALL_DIR) $(1)/etc/asterisk 
    298310        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/meetme.conf $(1)/etc/asterisk/ 
    299311        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    300312        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_meetme.so $(1)/usr/lib/asterisk/modules/ 
    301313        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_dahdi.so $(1)/usr/lib/asterisk/modules/ 
    302314        $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/ 
    303         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/conf-*.gsm $(1)/usr/lib/asterisk/sounds/ 
     315        $(CP) $(PKG_INSTALL_DIR)/var/lib/asterisk/sounds/en/conf-*.gsm $(1)/usr/lib/asterisk/sounds/ 
    304316endef 
    305317 
    306 define Package/asterisk16-chan-iax2/conffiles 
     318define Package/asterisk18-chan-iax2/conffiles 
    307319/etc/asterisk/iax.conf 
    308320/etc/asterisk/iaxprov.conf 
    309321endef 
    310322 
    311 define Package/asterisk16-cdr/conffiles 
     323define Package/asterisk18-cdr/conffiles 
    312324/etc/asterisk/cdr.conf 
    313325/etc/asterisk/cdr_custom.conf 
    314326/etc/asterisk/cdr_manager.conf 
     
    317329/etc/asterisk/cdr_tds.conf 
    318330endef 
    319331 
    320 define Package/asterisk16-res-musiconhold/conffiles 
     332define Package/asterisk18-res-musiconhold/conffiles 
    321333/etc/asterisk/musiconhold.conf 
    322334endef 
    323335 
    324 define Package/asterisk16-chan-iax2/install 
     336define Package/asterisk18-chan-iax2/install 
    325337        $(INSTALL_DIR) $(1)/etc/asterisk 
    326338        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/iax.conf $(1)/etc/asterisk/ 
    327339        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/iaxprov.conf $(1)/etc/asterisk/ 
     
    329341        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_iax2.so $(1)/usr/lib/asterisk/modules/ 
    330342endef 
    331343 
    332 define Package/asterisk16-cdr/install 
     344define Package/asterisk18-cdr/install 
    333345        $(INSTALL_DIR) $(1)/etc/asterisk 
    334346        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/cdr*.conf $(1)/etc/asterisk/ 
    335347        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    336348        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*cdr*.so $(1)/usr/lib/asterisk/modules/ 
    337349endef 
    338350 
    339 define Package/asterisk16-res-musiconhold/install 
     351define Package/asterisk18-res-musiconhold/install 
    340352        $(INSTALL_DIR) $(1)/etc/asterisk 
    341353        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/musiconhold.conf $(1)/etc/asterisk/ 
    342354        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    343355        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_musiconhold.so $(1)/usr/lib/asterisk/modules/ 
    344356endef 
    345357 
    346 define Package/asterisk16-chan-gtalk/conffiles 
     358define Package/asterisk18-res-rtp-asterisk/install 
     359        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
     360        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_rtp*.so $(1)/usr/lib/asterisk/modules/ 
     361endef 
     362 
     363define Package/asterisk18-res-rtp-asterisk/install  
     364        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
     365        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_rtp*.so $(1)/usr/lib/asterisk/modules/  
     366endef  
     367 
     368define Package/asterisk18-chan-gtalk/conffiles 
    347369/etc/asterisk/gtalk.conf 
    348370/etc/asterisk/jabber.conf 
    349371endef 
    350372 
    351 define Package/asterisk16-chan-gtalk/install 
     373define Package/asterisk18-chan-gtalk/install 
    352374        $(INSTALL_DIR) $(1)/etc/asterisk 
    353375        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/gtalk.conf $(1)/etc/asterisk/ 
    354376        $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/jabber.conf $(1)/etc/asterisk/ 
     
    357379        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_jabber.so $(1)/usr/lib/asterisk/modules/ 
    358380endef 
    359381 
    360 define Package/asterisk16-curl/install 
     382define Package/asterisk18-curl/install 
    361383        $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    362384        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/func_curl.so $(1)/usr/lib/asterisk/modules/ 
    363385        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_curl.so $(1)/usr/lib/asterisk/modules/ 
    364386endef 
    365387 
    366 define BuildAsterisk16ModuleTemplate 
     388define Buildasterisk18ModuleTemplate 
    367389 
    368   define Package/asterisk16-$(subst _,-,$(1)) 
    369   $$(call Package/asterisk16/Default) 
     390  define Package/asterisk18-$(subst _,-,$(1)) 
     391  $$(call Package/asterisk18/Default) 
    370392    TITLE:=$(2) support 
    371     DEPENDS:= +asterisk16 
     393    DEPENDS:= +asterisk18 
    372394  endef 
    373395 
    374   define Package/asterisk16-$(subst _,-,$(1))/description 
    375   $$(call Package/asterisk16/Default/description) 
     396  define Package/asterisk18-$(subst _,-,$(1))/description 
     397  $$(call Package/asterisk18/Default/description) 
    376398    This package provides support $(3) in Asterisk. 
    377399  endef 
    378400 
    379   define Package/asterisk16-$(subst _,-,$(1))/install 
     401  define Package/asterisk18-$(subst _,-,$(1))/install 
    380402        $(INSTALL_DIR) $$(1)/usr/lib/asterisk/modules 
    381403        $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/$(1).so $$(1)/usr/lib/asterisk/modules/ 
    382404  endef 
    383405 
    384   $$(eval $$(call BuildPackage,asterisk16-$(subst _,-,$(1)))) 
     406  $$(eval $$(call BuildPackage,asterisk18-$(subst _,-,$(1)))) 
    385407endef 
    386408 
    387 $(eval $(call BuildPackage,asterisk16)) 
    388 $(eval $(call BuildPackage,asterisk16-voicemail)) 
    389 $(eval $(call BuildPackage,asterisk16-sounds)) 
    390 #$(eval $(call BuildPackage,asterisk16-app-meetme)) 
    391 $(eval $(call BuildPackage,asterisk16-chan-iax2)) 
    392 $(eval $(call BuildPackage,asterisk16-cdr)) 
    393 $(eval $(call BuildPackage,asterisk16-res-musiconhold)) 
    394 $(eval $(call BuildPackage,asterisk16-chan-gtalk)) 
    395 $(eval $(call BuildPackage,asterisk16-curl)) 
    396 $(eval $(call BuildAsterisk16ModuleTemplate,app_authenticate,Authenticate,support for executing arbitrary authenticate commands)) 
    397 $(eval $(call BuildAsterisk16ModuleTemplate,app_chanisavail,Channel availability check,support for checking if a channel is available)) 
    398 $(eval $(call BuildAsterisk16ModuleTemplate,app_chanspy,Channel listen in,support for listening in on any channel)) 
    399 $(eval $(call BuildAsterisk16ModuleTemplate,app_directed_pickup,Directed call pickup,support for directed call pickup)) 
    400 $(eval $(call BuildAsterisk16ModuleTemplate,app_exec,Exec application,support for application execution)) 
    401 $(eval $(call BuildAsterisk16ModuleTemplate,app_minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail system)) 
    402 $(eval $(call BuildAsterisk16ModuleTemplate,app_readexten,Extension to variable,a trivial application to read an extension into a variable)) 
    403 $(eval $(call BuildAsterisk16ModuleTemplate,app_read,Variable read,a trivial application to read a variable)) 
    404 $(eval $(call BuildAsterisk16ModuleTemplate,app_sayunixtime,Say Unix time,an application to say Unix time)) 
    405 $(eval $(call BuildAsterisk16ModuleTemplate,app_sms,SMS,SMS support (ETSI ES 201 912 protocol 1))) 
    406 $(eval $(call BuildAsterisk16ModuleTemplate,app_stack,Stack applications, stack applications Gosub Return etc.)) 
    407 $(eval $(call BuildAsterisk16ModuleTemplate,app_system,System exec,support for executing system commands)) 
    408 $(eval $(call BuildAsterisk16ModuleTemplate,app_talkdetect,File playback with audio detect,for file playback with audio detect)) 
    409 $(eval $(call BuildAsterisk16ModuleTemplate,app_waituntil,Sleep,support sleeping until the given epoch)) 
    410 $(eval $(call BuildAsterisk16ModuleTemplate,app_while,While loop,a while loop implementation)) 
    411 $(eval $(call BuildAsterisk16ModuleTemplate,chan_agent,Agents proxy channel, an implementation of agents proxy channel)) 
    412 $(eval $(call BuildAsterisk16ModuleTemplate,chan_local,Local proxy channel, an implementation of local proxy channel)) 
    413 $(eval $(call BuildAsterisk16ModuleTemplate,codec_ulaw,Signed linear to ulaw translation,translation between signed linear and ulaw codecs)) 
    414 $(eval $(call BuildAsterisk16ModuleTemplate,codec_a_mu,Alaw to ulaw translation,translation between alaw and ulaw codecs)) 
    415 $(eval $(call BuildAsterisk16ModuleTemplate,codec_g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs)) 
    416 $(eval $(call BuildAsterisk16ModuleTemplate,format_g726,G.726,support for headerless G.726 16/24/32/40kbps data format)) 
    417 $(eval $(call BuildAsterisk16ModuleTemplate,format_g729,G.729,support for raw headerless G729 data)) 
    418 $(eval $(call BuildAsterisk16ModuleTemplate,format_sln,Raw slinear format,support for raw slinear format)) 
    419 $(eval $(call BuildAsterisk16ModuleTemplate,format_sln16,Raw slinear 16 format,support for Raw slinear 16 format)) 
    420 $(eval $(call BuildAsterisk16ModuleTemplate,func_db,Database interaction,functions for interaction with the database)) 
    421 $(eval $(call BuildAsterisk16ModuleTemplate,func_devstate,Blinky lights control,functions for manually controlled blinky lights)) 
    422 $(eval $(call BuildAsterisk16ModuleTemplate,func_vmcount,vmcount dialplan,a vmcount dialplan function)) 
    423 $(eval $(call BuildAsterisk16ModuleTemplate,func_extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control)) 
    424 $(eval $(call BuildAsterisk16ModuleTemplate,func_global,Global variable,global variable dialplan functions)) 
    425 $(eval $(call BuildAsterisk16ModuleTemplate,func_shell,Shell,support for shell execution)) 
    426 $(eval $(call BuildAsterisk16ModuleTemplate,pbx_ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic)) 
    427 $(eval $(call BuildAsterisk16ModuleTemplate,res_ael_share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules)) 
    428 $(eval $(call BuildAsterisk16ModuleTemplate,pbx_spool,Call Spool,outgoing call spool support)) 
    429 $(eval $(call BuildAsterisk16ModuleTemplate,res_agi,Asterisk Gateway Interface,support for the Asterisk Gateway Interface extension)) 
    430 $(eval $(call BuildAsterisk16ModuleTemplate,app_alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID)) 
    431 $(eval $(call BuildAsterisk16ModuleTemplate,app_setcallerid,Set callerid,support for setting callerid)) 
    432 $(eval $(call BuildAsterisk16ModuleTemplate,app_verbose,Verbose logging,Verbose logging application)) 
    433 $(eval $(call BuildAsterisk16ModuleTemplate,func_channel,Channel info,Channel info dialplan function)) 
    434 $(eval $(call BuildAsterisk16ModuleTemplate,func_blacklist,Blacklist on callerid,looking up the callerid number, and see if it is blacklisted)) 
    435 $(eval $(call BuildAsterisk16ModuleTemplate,app_originate,Originate a call,originating an outbound call and connecting it to a specified extension or application)) 
     409$(eval $(call BuildPackage,asterisk18)) 
     410$(eval $(call BuildPackage,asterisk18-voicemail)) 
     411$(eval $(call BuildPackage,asterisk18-sounds)) 
     412#$(eval $(call BuildPackage,asterisk18-app-meetme)) 
     413$(eval $(call BuildPackage,asterisk18-chan-iax2)) 
     414$(eval $(call BuildPackage,asterisk18-cdr)) 
     415$(eval $(call BuildPackage,asterisk18-res-musiconhold)) 
     416$(eval $(call BuildPackage,asterisk18-res-rtp-asterisk))  
     417$(eval $(call BuildPackage,asterisk18-chan-gtalk)) 
     418$(eval $(call BuildPackage,asterisk18-curl)) 
     419$(eval $(call Buildasterisk18ModuleTemplate,app_authenticate,Authenticate,support for executing arbitrary authenticate commands)) 
     420$(eval $(call Buildasterisk18ModuleTemplate,app_chanisavail,Channel availability check,support for checking if a channel is available)) 
     421$(eval $(call Buildasterisk18ModuleTemplate,app_chanspy,Channel listen in,support for listening in on any channel)) 
     422$(eval $(call Buildasterisk18ModuleTemplate,app_directed_pickup,Directed call pickup,support for directed call pickup)) 
     423$(eval $(call Buildasterisk18ModuleTemplate,app_exec,Exec application,support for application execution)) 
     424$(eval $(call Buildasterisk18ModuleTemplate,app_minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail system)) 
     425$(eval $(call Buildasterisk18ModuleTemplate,app_readexten,Extension to variable,a trivial application to read an extension into a variable)) 
     426$(eval $(call Buildasterisk18ModuleTemplate,app_read,Variable read,a trivial application to read a variable)) 
     427$(eval $(call Buildasterisk18ModuleTemplate,app_sayunixtime,Say Unix time,an application to say Unix time)) 
     428$(eval $(call Buildasterisk18ModuleTemplate,app_sms,SMS,SMS support (ETSI ES 201 912 protocol 1))) 
     429$(eval $(call Buildasterisk18ModuleTemplate,app_stack,Stack applications, stack applications Gosub Return etc.)) 
     430$(eval $(call Buildasterisk18ModuleTemplate,app_system,System exec,support for executing system commands)) 
     431$(eval $(call Buildasterisk18ModuleTemplate,app_talkdetect,File playback with audio detect,for file playback with audio detect)) 
     432$(eval $(call Buildasterisk18ModuleTemplate,app_waituntil,Sleep,support sleeping until the given epoch)) 
     433$(eval $(call Buildasterisk18ModuleTemplate,app_while,While loop,a while loop implementation)) 
     434$(eval $(call Buildasterisk18ModuleTemplate,chan_agent,Agents proxy channel, an implementation of agents proxy channel)) 
     435$(eval $(call Buildasterisk18ModuleTemplate,chan_local,Local proxy channel, an implementation of local proxy channel)) 
     436$(eval $(call Buildasterisk18ModuleTemplate,codec_alaw,Signed linear to alaw translation,translation between signed linear and alaw codecs))  
     437$(eval $(call Buildasterisk18ModuleTemplate,codec_ulaw,Signed linear to ulaw translation,translation between signed linear and ulaw codecs)) 
     438$(eval $(call Buildasterisk18ModuleTemplate,codec_a_mu,Alaw to ulaw translation,translation between alaw and ulaw codecs)) 
     439$(eval $(call Buildasterisk18ModuleTemplate,codec_g722,G.722,a high bit rate 48/56/64Kbps ITU standard codec))  
     440$(eval $(call Buildasterisk18ModuleTemplate,codec_g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs)) 
     441$(eval $(call Buildasterisk18ModuleTemplate,format_g726,G.726,support for headerless G.726 16/24/32/40kbps data format)) 
     442$(eval $(call Buildasterisk18ModuleTemplate,format_g729,G.729,support for raw headerless G729 data)) 
     443$(eval $(call Buildasterisk18ModuleTemplate,format_sln,Raw slinear format,support for raw slinear format)) 
     444$(eval $(call Buildasterisk18ModuleTemplate,format_sln16,Raw slinear 16 format,support for Raw slinear 16 format)) 
     445$(eval $(call Buildasterisk18ModuleTemplate,func_db,Database interaction,functions for interaction with the database)) 
     446$(eval $(call Buildasterisk18ModuleTemplate,func_devstate,Blinky lights control,functions for manually controlled blinky lights)) 
     447$(eval $(call Buildasterisk18ModuleTemplate,func_vmcount,vmcount dialplan,a vmcount dialplan function)) 
     448$(eval $(call Buildasterisk18ModuleTemplate,func_extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control)) 
     449$(eval $(call Buildasterisk18ModuleTemplate,func_global,Global variable,global variable dialplan functions)) 
     450$(eval $(call Buildasterisk18ModuleTemplate,func_shell,Shell,support for shell execution)) 
     451$(eval $(call Buildasterisk18ModuleTemplate,pbx_ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic)) 
     452$(eval $(call Buildasterisk18ModuleTemplate,res_ael_share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules)) 
     453$(eval $(call Buildasterisk18ModuleTemplate,pbx_spool,Call Spool,outgoing call spool support)) 
     454$(eval $(call Buildasterisk18ModuleTemplate,res_agi,Asterisk Gateway Interface,support for the Asterisk Gateway Interface extension)) 
     455$(eval $(call Buildasterisk18ModuleTemplate,app_alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID)) 
     456$(eval $(call Buildasterisk18ModuleTemplate,app_setcallerid,Set callerid,support for setting callerid)) 
     457$(eval $(call Buildasterisk18ModuleTemplate,app_verbose,Verbose logging,Verbose logging application)) 
     458$(eval $(call Buildasterisk18ModuleTemplate,func_channel,Channel info,Channel info dialplan function)) 
     459$(eval $(call Buildasterisk18ModuleTemplate,func_blacklist,Blacklist on callerid,looking up the callerid number, and see if it is blacklisted)) 
     460$(eval $(call Buildasterisk18ModuleTemplate,app_originate,Originate a call,originating an outbound call and connecting it to a specified extension or application)) 
  • asterisk-addons-1.4.x/patches/021-cross_configure.patch

     
    1 diff -Nru asterisk-addons-1.4.8.org/menuselect/Makefile asterisk-addons-1.4.8/menuselect/Makefile 
    2 --- asterisk-addons-1.4.8.org/menuselect/Makefile       2009-01-08 22:31:41.000000000 +0100 
    3 +++ asterisk-addons-1.4.8/menuselect/Makefile   2009-06-04 22:21:23.000000000 +0200 
    4 @@ -52,7 +52,7 @@ 
    5  $(OBJS) menuselect_gtk.o menuselect_curses.o menuselect_stub.o: autoconfig.h menuselect.h 
    6   
    7  makeopts autoconfig.h: autoconfig.h.in makeopts.in 
    8 -       @./configure $(CONFIGURE_SILENT) CC= LD= AR= CFLAGS= 
    9 +       @./configure $(CONFIGURE_SILENT) CC= LD= AR= CFLAGS= LDFLAGS= 
    10   
    11  menuselect gmenuselect: mxml/libmxml.a 
    12   
  • asterisk-addons-1.4.x/patches/011-chan_mobile.patch

     
    1 diff -Nru asterisk-addons-1.4.8.org/build_tools/menuselect-deps.in asterisk-addons-1.4.8/build_tools/menuselect-deps.in 
    2 --- asterisk-addons-1.4.8.org/build_tools/menuselect-deps.in    2007-05-14 18:22:44.000000000 +0200 
    3 +++ asterisk-addons-1.4.8/build_tools/menuselect-deps.in        2009-06-04 22:20:03.000000000 +0200 
    4 @@ -1,2 +1,3 @@ 
    5 +BLUETOOTH=@PBX_BLUETOOTH@ 
    6  MYSQLCLIENT=@PBX_MYSQLCLIENT@ 
    7  ASTERISK=@PBX_ASTERISK@ 
    8 diff -Nru asterisk-addons-1.4.8.org/channels/chan_mobile.c asterisk-addons-1.4.8/channels/chan_mobile.c 
    9 --- asterisk-addons-1.4.8.org/channels/chan_mobile.c    1970-01-01 01:00:00.000000000 +0100 
    10 +++ asterisk-addons-1.4.8/channels/chan_mobile.c        2009-06-04 22:20:03.000000000 +0200 
    11 @@ -0,0 +1,2150 @@ 
    12 +/* 
    13 + * Asterisk -- An open source telephony toolkit. 
    14 + * 
    15 + * Copyright (C) 1999 - 2006, Digium, Inc. 
    16 + * 
    17 + * Mark Spencer <markster@digium.com> 
    18 + * 
    19 + * See http://www.asterisk.org for more information about 
    20 + * the Asterisk project. Please do not directly contact 
    21 + * any of the maintainers of this project for assistance; 
    22 + * the project provides a web site, mailing lists and IRC 
    23 + * channels for your use. 
    24 + * 
    25 + * This program is free software, distributed under the terms of 
    26 + * the GNU General Public License Version 2. See the LICENSE file 
    27 + * at the top of the source tree. 
    28 + */ 
    29 + 
    30 +/*! \file 
    31 + * 
    32 + * \brief Bluetooth Mobile Device channel driver 
    33 + * 
    34 + * \author Dave Bowerman <david.bowerman@gmail.com> 
    35 + * 
    36 + * \ingroup channel_drivers 
    37 + */ 
    38 + 
    39 +/*** MODULEINFO 
    40 +       <depend>bluetooth</depend> 
    41 + ***/ 
    42 + 
    43 +#include <asterisk.h> 
    44 + 
    45 +ASTERISK_FILE_VERSION(__FILE__, "$Revision$") 
    46 + 
    47 +#include <stdio.h> 
    48 +#include <string.h> 
    49 +#include <sys/socket.h> 
    50 +#include <sys/time.h> 
    51 +#include <errno.h> 
    52 +#include <unistd.h> 
    53 +#include <stdlib.h> 
    54 +#include <arpa/inet.h> 
    55 +#include <fcntl.h> 
    56 +#include <sys/ioctl.h> 
    57 +#include <signal.h> 
    58 + 
    59 +#include <bluetooth/bluetooth.h> 
    60 +#include <bluetooth/hci.h> 
    61 +#include <bluetooth/hci_lib.h> 
    62 +#include <bluetooth/sdp.h> 
    63 +#include <bluetooth/sdp_lib.h> 
    64 +#include <bluetooth/rfcomm.h> 
    65 +#include <bluetooth/sco.h> 
    66 +#include <bluetooth/l2cap.h> 
    67 + 
    68 +#include <asterisk/lock.h> 
    69 +#include <asterisk/channel.h> 
    70 +#include <asterisk/config.h> 
    71 +#include <asterisk/logger.h> 
    72 +#include <asterisk/module.h> 
    73 +#include <asterisk/pbx.h> 
    74 +#include <asterisk/options.h> 
    75 +#include <asterisk/utils.h> 
    76 +#include <asterisk/linkedlists.h> 
    77 +#include <asterisk/cli.h> 
    78 +#include <asterisk/devicestate.h> 
    79 +#include <asterisk/causes.h> 
    80 +#include <asterisk/dsp.h> 
    81 +#include <asterisk/app.h> 
    82 +#include <asterisk/manager.h> 
    83 + 
    84 +#define MBL_CONFIG "mobile.conf" 
    85 + 
    86 +#define DEVICE_FRAME_SIZE 48 
    87 +#define DEVICE_FRAME_FORMAT AST_FORMAT_SLINEAR 
    88 +#define CHANNEL_FRAME_SIZE 320 
    89 + 
    90 +static int prefformat = DEVICE_FRAME_FORMAT; 
    91 + 
    92 +static int discovery_interval = 60;                    /* The device discovery interval, default 60 seconds. */ 
    93 +static pthread_t discovery_thread = AST_PTHREADT_NULL; /* The discovery thread */ 
    94 +static sdp_session_t *sdp_session; 
    95 + 
    96 +enum mbl_type { 
    97 +       MBL_TYPE_PHONE, 
    98 +       MBL_TYPE_HEADSET 
    99 +}; 
    100 + 
    101 +enum mbl_state { 
    102 +       MBL_STATE_INIT = 0, 
    103 +       MBL_STATE_INIT1, 
    104 +       MBL_STATE_INIT2, 
    105 +       MBL_STATE_INIT3, 
    106 +       MBL_STATE_INIT4, 
    107 +       MBL_STATE_INIT5, 
    108 +       MBL_STATE_INIT6, 
    109 +       MBL_STATE_INIT7, 
    110 +       MBL_STATE_PREIDLE, 
    111 +       MBL_STATE_IDLE, 
    112 +       MBL_STATE_DIAL, 
    113 +       MBL_STATE_DIAL1, 
    114 +       MBL_STATE_OUTGOING, 
    115 +       MBL_STATE_RING, 
    116 +       MBL_STATE_RING2, 
    117 +       MBL_STATE_RING3, 
    118 +       MBL_STATE_INCOMING, 
    119 +       MBL_STATE_HANGUP, 
    120 +       MBL_STATE_INSMS, 
    121 +       MBL_STATE_OUTSMS, 
    122 +       MBL_STATE_OUTSMS1, 
    123 +       MBL_STATE_OUTSMS2 
    124 +}; 
    125 + 
    126 +struct adapter_pvt { 
    127 +       int dev_id;                                     /* device id */ 
    128 +       int hci_socket;                                 /* device descriptor */ 
    129 +       char id[31];                                    /* the 'name' from mobile.conf */ 
    130 +       bdaddr_t addr;                                  /* adddress of adapter */ 
    131 +       unsigned int inuse:1;                           /* are we in use ? */ 
    132 +       unsigned int alignment_detection:1;             /* do alignment detection on this adpater? */ 
    133 +       int sco_socket; 
    134 +       AST_LIST_ENTRY(adapter_pvt) entry; 
    135 +}; 
    136 + 
    137 +static AST_RWLIST_HEAD_STATIC(adapters, adapter_pvt); 
    138 + 
    139 +struct mbl_pvt { 
    140 +       struct ast_channel *owner;                      /* Channel we belong to, possibly NULL */ 
    141 +       struct ast_frame fr;                            /* "null" frame */ 
    142 +       enum mbl_type type;                             /* Phone or Headset */ 
    143 +       char id[31];                                    /* The id from mobile.conf */ 
    144 +       int group;                                      /* group number for group dialling */ 
    145 +       bdaddr_t addr;                                  /* address of device */ 
    146 +       struct adapter_pvt *adapter;                    /* the adapter we use */ 
    147 +       char context[AST_MAX_CONTEXT];                  /* the context for incoming calls */ 
    148 +       char connected;                                 /* is it connected? */ 
    149 +       int rfcomm_port;                                /* rfcomm port number */ 
    150 +       int rfcomm_socket;                              /* rfcomm socket descriptor */ 
    151 +       char rfcomm_buf[256]; 
    152 +       char io_buf[CHANNEL_FRAME_SIZE + AST_FRIENDLY_OFFSET]; 
    153 +       char io_save_buf[DEVICE_FRAME_SIZE]; 
    154 +       int io_save_len; 
    155 +       int io_pipe[2]; 
    156 +       int sco_socket;                                 /* sco socket descriptor */ 
    157 +       pthread_t sco_listener_thread;                  /* inbound sco listener for this device */ 
    158 +       enum mbl_state state;                           /* monitor thread current state */ 
    159 +       pthread_t monitor_thread;                       /* monitor thread handle */ 
    160 +       char dial_number[AST_MAX_EXTENSION];            /* number for the monitor thread to dial */ 
    161 +       int dial_timeout; 
    162 +       char ciev_call_0[5];                            /* dynamically built reponse strings */ 
    163 +       char ciev_call_1[5]; 
    164 +       char ciev_callsetup_0[5]; 
    165 +       char ciev_callsetup_1[5]; 
    166 +       char ciev_callsetup_2[5]; 
    167 +       char ciev_callsetup_3[5]; 
    168 +       unsigned int no_callsetup:1; 
    169 +       unsigned int has_sms:1; 
    170 +       unsigned int sent_answer:1; 
    171 +       unsigned int do_alignment_detection:1; 
    172 +       unsigned int alignment_detection_triggered:1; 
    173 +       unsigned int do_hangup:1; 
    174 +       unsigned int blackberry:1; 
    175 +       short alignment_samples[4]; 
    176 +       int alignment_count; 
    177 +       char sms_txt[160]; 
    178 +       struct ast_dsp *dsp; 
    179 +       struct ast_frame *dsp_fr; 
    180 +       int dtmf_skip; 
    181 +       int skip_frames; 
    182 +       char hangup_count; 
    183 +       AST_LIST_ENTRY(mbl_pvt) entry; 
    184 +}; 
    185 + 
    186 +static AST_RWLIST_HEAD_STATIC(devices, mbl_pvt); 
    187 + 
    188 +/* CLI stuff */ 
    189 +static const char show_usage[] = 
    190 +"Usage: mobile show devices\n"  
    191 +"       Shows the state of Bluetooth Cell / Mobile devices.\n"; 
    192 + 
    193 +static const char search_usage[] = 
    194 +"Usage: mobile search\n"  
    195 +"       Searches for Bluetooth Cell / Mobile devices in range.\n"; 
    196 + 
    197 +static const char rfcomm_usage[] = 
    198 +"Usage: mobile rfcomm command\n"  
    199 +"       Send command to the rfcomm port.\n"; 
    200 + 
    201 +static int handle_cli_mobile_show_devices(int fd, int argc, char **argv); 
    202 +static int handle_cli_mobile_search(int fd, int argc, char **argv); 
    203 +static int handle_cli_mobile_rfcomm(int fd, int argc, char **argv); 
    204 + 
    205 +static struct ast_cli_entry mbl_cli[] = { 
    206 +       {{"mobile", "show", "devices", NULL}, handle_cli_mobile_show_devices, "Show Bluetooth Cell / Mobile devices", show_usage}, 
    207 +       {{"mobile", "search", NULL}, handle_cli_mobile_search, "Search for Bluetooth Cell / Mobile devices", search_usage}, 
    208 +       {{"mobile", "rfcomm", NULL}, handle_cli_mobile_rfcomm, "Send commands to the rfcomm port for debugging", rfcomm_usage}, 
    209 +}; 
    210 + 
    211 +/* App stuff */ 
    212 +static char *app_mblstatus = "MobileStatus"; 
    213 +static char *mblstatus_synopsis = "MobileStatus(Device,Variable)"; 
    214 +static char *mblstatus_desc = 
    215 +"MobileStatus(Device,Variable)\n" 
    216 +"  Device - Id of mobile device from mobile.conf\n" 
    217 +"  Variable - Variable to store status in will be 1-3.\n"  
    218 +"             In order, Disconnected, Connected & Free, Connected & Busy.\n"; 
    219 + 
    220 +static char *app_mblsendsms = "MobileSendSMS"; 
    221 +static char *mblsendsms_synopsis = "MobileSendSMS(Device,Dest,Message)"; 
    222 +static char *mblsendsms_desc = 
    223 +"MobileSendSms(Device,Dest,Message)\n" 
    224 +"  Device - Id of device from mobile.conf\n" 
    225 +"  Dest - destination\n" 
    226 +"  Message - text of the message\n"; 
    227 + 
    228 +static struct ast_channel *mbl_new(int state, struct mbl_pvt *pvt, char *cid_num); 
    229 +static struct ast_channel *mbl_request(const char *type, int format, void *data, int *cause); 
    230 +static int mbl_call(struct ast_channel *ast, char *dest, int timeout); 
    231 +static int mbl_hangup(struct ast_channel *ast); 
    232 +static int mbl_answer(struct ast_channel *ast); 
    233 +static int mbl_digit_begin(struct ast_channel *ast, char digit); 
    234 +static int mbl_digit_end(struct ast_channel *ast, char digit, unsigned int duration); 
    235 +static struct ast_frame *mbl_read(struct ast_channel *ast); 
    236 +static int mbl_write(struct ast_channel *ast, struct ast_frame *frame); 
    237 +static int mbl_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); 
    238 +static int mbl_devicestate(void *data); 
    239 + 
    240 +static void do_alignment_detection(struct mbl_pvt *pvt, char *buf, int buflen); 
    241 + 
    242 +static int rfcomm_connect(bdaddr_t src, bdaddr_t dst, int remote_channel); 
    243 +static int rfcomm_write(struct mbl_pvt *pvt, char *buf); 
    244 +static int rfcomm_read(struct mbl_pvt *pvt, char *buf, char flush, int timeout); 
    245 + 
    246 +static int sco_connect(bdaddr_t src, bdaddr_t dst); 
    247 +static int sco_write(int s, char *buf, int len); 
    248 +static int sco_read(int s, char *buf, int len); 
    249 + 
    250 +static void *do_sco_listen(void *data); 
    251 +static int sdp_search(char *addr, int profile); 
    252 + 
    253 +static const struct ast_channel_tech mbl_tech = { 
    254 +       .type = "Mobile", 
    255 +       .description = "Bluetooth Mobile Device Channel Driver", 
    256 +       .capabilities = AST_FORMAT_SLINEAR, 
    257 +       .requester = mbl_request, 
    258 +       .call = mbl_call, 
    259 +       .hangup = mbl_hangup, 
    260 +       .answer = mbl_answer, 
    261 +       .send_digit_begin = mbl_digit_begin, 
    262 +       .send_digit_end = mbl_digit_end, 
    263 +       .read = mbl_read, 
    264 +       .write = mbl_write, 
    265 +       .fixup = mbl_fixup, 
    266 +       .devicestate = mbl_devicestate 
    267 +}; 
    268 + 
    269 +/* CLI Commands implementation */ 
    270 + 
    271 +static int handle_cli_mobile_show_devices(int fd, int argc, char **argv) 
    272 +{ 
    273 +       struct mbl_pvt *pvt; 
    274 +       char bdaddr[18]; 
    275 +       char group[6]; 
    276 + 
    277 +#define FORMAT1 "%-15.15s %-17.17s %-5.5s %-15.15s %-9.9s %-5.5s %-3.3s\n" 
    278 + 
    279 +       if (argc != 3) 
    280 +               return RESULT_SHOWUSAGE; 
    281 + 
    282 +       ast_cli(fd, FORMAT1, "ID", "Address", "Group", "Adapter", "Connected", "State", "SMS"); 
    283 +       AST_RWLIST_RDLOCK(&devices); 
    284 +       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    285 +               ba2str(&pvt->addr, bdaddr); 
    286 +               snprintf(group, 5, "%d", pvt->group); 
    287 +               ast_cli(fd, FORMAT1, pvt->id, bdaddr, group, pvt->adapter->id, pvt->connected ? "Yes" : "No", 
    288 +                       (pvt->state == MBL_STATE_IDLE) ? "Free" : (pvt->state < MBL_STATE_IDLE) ? "Init" : "Busy", 
    289 +                       (pvt->has_sms) ? "Yes" : "No"); 
    290 +       } 
    291 +       AST_RWLIST_UNLOCK(&devices); 
    292 + 
    293 +#undef FORMAT1 
    294 + 
    295 +       return RESULT_SUCCESS; 
    296 +} 
    297 + 
    298 +static int handle_cli_mobile_search(int fd, int argc, char **argv) 
    299 +{ 
    300 +       struct adapter_pvt *adapter; 
    301 +       inquiry_info *ii = NULL; 
    302 +       int max_rsp, num_rsp; 
    303 +       int len, flags; 
    304 +       int i, phport, hsport; 
    305 +       char addr[19] = {0}; 
    306 +       char name[31] = {0}; 
    307 + 
    308 +#define FORMAT1 "%-17.17s %-30.30s %-6.6s %-7.7s %-4.4s\n" 
    309 +#define FORMAT2 "%-17.17s %-30.30s %-6.6s %-7.7s %d\n" 
    310 + 
    311 +       if (argc != 2) 
    312 +               return RESULT_SHOWUSAGE; 
    313 + 
    314 +       /* find a free adapter */ 
    315 +       AST_RWLIST_RDLOCK(&adapters); 
    316 +       AST_RWLIST_TRAVERSE(&adapters, adapter, entry) { 
    317 +               if (!adapter->inuse) 
    318 +                       break; 
    319 +       } 
    320 +       AST_RWLIST_UNLOCK(&adapters); 
    321 + 
    322 +       if (!adapter) { 
    323 +               ast_cli(fd, "All Bluetooth adapters are in use at this time.\n"); 
    324 +               return RESULT_SUCCESS; 
    325 +       } 
    326 + 
    327 +       len  = 8; 
    328 +       max_rsp = 255; 
    329 +       flags = IREQ_CACHE_FLUSH; 
    330 + 
    331 +       ii = alloca(max_rsp * sizeof(inquiry_info)); 
    332 +       num_rsp = hci_inquiry(adapter->dev_id, len, max_rsp, NULL, &ii, flags); 
    333 +       if (num_rsp > 0) { 
    334 +               ast_cli(fd, FORMAT1, "Address", "Name", "Usable", "Type", "Port"); 
    335 +               for (i = 0; i < num_rsp; i++) { 
    336 +                       ba2str(&(ii + i)->bdaddr, addr); 
    337 +                       name[0] = 0x00; 
    338 +                       if (hci_read_remote_name(adapter->hci_socket, &(ii + i)->bdaddr, sizeof(name) - 1, name, 0) < 0) 
    339 +                               strcpy(name, "[unknown]"); 
    340 +                       phport = sdp_search(addr, HANDSFREE_AGW_PROFILE_ID); 
    341 +                       if (!phport) 
    342 +                               hsport = sdp_search(addr, HEADSET_PROFILE_ID); 
    343 +                       else 
    344 +                               hsport = 0; 
    345 +                       ast_cli(fd, FORMAT2, addr, name, (phport > 0 || hsport > 0) ? "Yes" : "No", 
    346 +                               (phport > 0) ? "Phone" : "Headset", (phport > 0) ? phport : hsport); 
    347 +               } 
    348 +       } else 
    349 +               ast_cli(fd, "No Bluetooth Cell / Mobile devices found.\n"); 
    350 + 
    351 +#undef FORMAT1 
    352 +#undef FORMAT2 
    353 + 
    354 +       return RESULT_SUCCESS; 
    355 +} 
    356 + 
    357 +static int handle_cli_mobile_rfcomm(int fd, int argc, char **argv) 
    358 +{ 
    359 +       char buf[128]; 
    360 +       struct mbl_pvt *pvt = NULL; 
    361 + 
    362 +       if (argc != 4) 
    363 +               return RESULT_SHOWUSAGE; 
    364 + 
    365 +       AST_RWLIST_RDLOCK(&devices); 
    366 +       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    367 +               if (!strcmp(pvt->id, argv[2])) 
    368 +                       break; 
    369 +       } 
    370 +       AST_RWLIST_UNLOCK(&devices); 
    371 + 
    372 +       if (!pvt || !pvt->connected) { 
    373 +               ast_cli(fd, "Device %s not found.\n", argv[2]); 
    374 +               return RESULT_SUCCESS; 
    375 +       } 
    376 + 
    377 +       snprintf(buf, sizeof(buf), "%s\r", argv[3]); 
    378 +       rfcomm_write(pvt, buf); 
    379 + 
    380 +       return RESULT_SUCCESS; 
    381 +} 
    382 + 
    383 +/* 
    384 + 
    385 +       Dialplan applications implementation 
    386 + 
    387 +*/ 
    388 + 
    389 +static int mbl_status_exec(struct ast_channel *ast, void *data) 
    390 +{ 
    391 + 
    392 +       struct mbl_pvt *pvt; 
    393 +       char *parse; 
    394 +       int stat; 
    395 +       char status[2]; 
    396 + 
    397 +       AST_DECLARE_APP_ARGS(args, 
    398 +               AST_APP_ARG(device); 
    399 +               AST_APP_ARG(variable); 
    400 +       ); 
    401 + 
    402 +       if (ast_strlen_zero(data)) 
    403 +               return -1; 
    404 + 
    405 +       parse = ast_strdupa(data); 
    406 + 
    407 +       AST_STANDARD_APP_ARGS(args, parse); 
    408 + 
    409 +       if (ast_strlen_zero(args.device) || ast_strlen_zero(args.variable)) 
    410 +               return -1; 
    411 + 
    412 +       stat = 1; 
    413 + 
    414 +       AST_RWLIST_RDLOCK(&devices); 
    415 +       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    416 +               if (!strcmp(pvt->id, args.device)) 
    417 +                       break; 
    418 +       } 
    419 +       AST_RWLIST_UNLOCK(&devices); 
    420 + 
    421 +       if (pvt) { 
    422 +               if (pvt->connected) 
    423 +                       stat = 2; 
    424 +               if (pvt->owner) 
    425 +                       stat = 3; 
    426 +       } 
    427 + 
    428 +       snprintf(status, sizeof(status), "%d", stat); 
    429 +       pbx_builtin_setvar_helper(ast, args.variable, status); 
    430 + 
    431 +       return 0; 
    432 + 
    433 +} 
    434 + 
    435 +static int mbl_sendsms_exec(struct ast_channel *ast, void *data) 
    436 +{ 
    437 + 
    438 +       struct mbl_pvt *pvt; 
    439 +       char *parse; 
    440 + 
    441 +       AST_DECLARE_APP_ARGS(args, 
    442 +               AST_APP_ARG(device); 
    443 +               AST_APP_ARG(dest); 
    444 +               AST_APP_ARG(message); 
    445 +       ); 
    446 + 
    447 +       if (ast_strlen_zero(data)) 
    448 +               return -1; 
    449 + 
    450 +       parse = ast_strdupa(data); 
    451 + 
    452 +       AST_STANDARD_APP_ARGS(args, parse); 
    453 + 
    454 +       if (ast_strlen_zero(args.device)) { 
    455 +               ast_log(LOG_ERROR,"NULL device for message -- SMS will not be sent.\n"); 
    456 +               return -1; 
    457 +       } 
    458 + 
    459 +       if (ast_strlen_zero(args.dest)) { 
    460 +               ast_log(LOG_ERROR,"NULL destination for message -- SMS will not be sent.\n"); 
    461 +               return -1; 
    462 +       } 
    463 + 
    464 +       if (ast_strlen_zero(args.message)) { 
    465 +               ast_log(LOG_ERROR,"NULL Message to be sent -- SMS will not be sent.\n"); 
    466 +               return -1; 
    467 +       } 
    468 + 
    469 +       AST_RWLIST_RDLOCK(&devices); 
    470 +       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    471 +               if (!strcmp(pvt->id, args.device)) 
    472 +                       break; 
    473 +       } 
    474 +       AST_RWLIST_UNLOCK(&devices); 
    475 + 
    476 +       if (!pvt) { 
    477 +               ast_log(LOG_ERROR,"Bluetooth device %s wasn't found in the list -- SMS will not be sent.\n", args.device); 
    478 +               return -1; 
    479 +       } 
    480 + 
    481 +       if (!pvt->connected) { 
    482 +               ast_log(LOG_ERROR,"Bluetooth device %s wasn't connected -- SMS will not be sent.\n", args.device); 
    483 +               return -1; 
    484 +       } 
    485 + 
    486 +       if (!pvt->has_sms) { 
    487 +               ast_log(LOG_ERROR,"Bluetooth device %s doesn't handle SMS -- SMS will not be sent.\n", args.device); 
    488 +               return -1; 
    489 +       } 
    490 + 
    491 +       if (pvt->state != MBL_STATE_IDLE) { 
    492 +               ast_log(LOG_ERROR,"Bluetooth device %s isn't IDLE -- SMS will not be sent.\n", args.device); 
    493 +               return -1; 
    494 +       } 
    495 + 
    496 +       ast_copy_string(pvt->dial_number, args.dest, sizeof(pvt->dial_number)); 
    497 +       ast_copy_string(pvt->sms_txt, args.message, sizeof(pvt->sms_txt)); 
    498 +       pvt->state = MBL_STATE_OUTSMS; 
    499 + 
    500 +       return 0; 
    501 + 
    502 +} 
    503 + 
    504 +/* 
    505 + 
    506 +       Channel Driver callbacks 
    507 + 
    508 +*/ 
    509 + 
    510 +static struct ast_channel *mbl_new(int state, struct mbl_pvt *pvt, char *cid_num) 
    511 +{ 
    512 + 
    513 +       struct ast_channel *chn; 
    514 + 
    515 +       if (pipe(pvt->io_pipe) == -1) { 
    516 +               ast_log(LOG_ERROR, "Failed to create io_pipe.\n"); 
    517 +               return NULL; 
    518 +       } 
    519 + 
    520 +       if (pvt->sco_socket != -1) 
    521 +               close(pvt->sco_socket); 
    522 +       pvt->sco_socket = -1; 
    523 +       pvt->io_save_len = 0; 
    524 +       pvt->sent_answer = 0; 
    525 +       pvt->skip_frames = 0; 
    526 +       pvt->alignment_count = 0; 
    527 +       pvt->alignment_detection_triggered = 0; 
    528 +       if (pvt->adapter->alignment_detection) 
    529 +               pvt->do_alignment_detection = 1; 
    530 +       else 
    531 +               pvt->do_alignment_detection = 0; 
    532 +       pvt->do_hangup = 1; 
    533 +       chn = ast_channel_alloc(1, state, cid_num, pvt->id, 0, 0, pvt->context, 0, "Mobile/%s-%04lx", pvt->id, ast_random() & 0xffff); 
    534 +       if (chn) { 
    535 +               chn->tech = &mbl_tech; 
    536 +               chn->nativeformats = prefformat; 
    537 +               chn->rawreadformat = prefformat; 
    538 +               chn->rawwriteformat = prefformat; 
    539 +               chn->writeformat = prefformat; 
    540 +               chn->readformat = prefformat; 
    541 +               chn->tech_pvt = pvt; 
    542 +               chn->fds[0] = pvt->io_pipe[0]; 
    543 +               if (state == AST_STATE_RING) 
    544 +                       chn->rings = 1; 
    545 +               ast_string_field_set(chn, language, "en"); 
    546 +               pvt->owner = chn; 
    547 +               return chn; 
    548 +       } 
    549 + 
    550 +       return NULL; 
    551 + 
    552 +} 
    553 + 
    554 +static struct ast_channel *mbl_request(const char *type, int format, void *data, int *cause) 
    555 +{ 
    556 + 
    557 +       struct ast_channel *chn = NULL; 
    558 +       struct mbl_pvt *pvt; 
    559 +       char *dest_dev = NULL; 
    560 +       char *dest_num = NULL; 
    561 +       int oldformat, group = -1; 
    562 + 
    563 +       if (!data) { 
    564 +               ast_log(LOG_WARNING, "Channel requested with no data\n"); 
    565 +               *cause = AST_CAUSE_INCOMPATIBLE_DESTINATION; 
    566 +               return NULL; 
    567 +       } 
    568 + 
    569 +       oldformat = format; 
    570 +       format &= (AST_FORMAT_SLINEAR); 
    571 +       if (!format) { 
    572 +               ast_log(LOG_WARNING, "Asked to get a channel of unsupported format '%d'\n", oldformat); 
    573 +               *cause = AST_CAUSE_FACILITY_NOT_IMPLEMENTED; 
    574 +               return NULL; 
    575 +       } 
    576 + 
    577 +       dest_dev = ast_strdupa((char *)data); 
    578 + 
    579 +       dest_num = strchr(dest_dev, '/'); 
    580 +       if (dest_num) 
    581 +               *dest_num++ = 0x00; 
    582 + 
    583 +       if (((dest_dev[0] == 'g') || (dest_dev[0] == 'G')) && ((dest_dev[1] >= '0') && (dest_dev[1] <= '9'))) { 
    584 +               group = atoi(&dest_dev[1]); 
    585 +       } 
    586 + 
    587 +       /* Find requested device and make sure it's connected. */ 
    588 +       AST_RWLIST_RDLOCK(&devices); 
    589 +       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    590 +               if (group > -1 && pvt->group == group && pvt->connected && !pvt->owner) { 
    591 +                       break; 
    592 +               } else if (!strcmp(pvt->id, dest_dev)) { 
    593 +                       break; 
    594 +               } 
    595 +       } 
    596 +       AST_RWLIST_UNLOCK(&devices); 
    597 +       if (!pvt || !pvt->connected || pvt->owner) { 
    598 +               ast_log(LOG_WARNING, "Request to call on device %s which is not connected / already in use.\n", dest_dev); 
    599 +               *cause = AST_CAUSE_REQUESTED_CHAN_UNAVAIL; 
    600 +               return NULL; 
    601 +       } 
    602 + 
    603 +       if ((pvt->type == MBL_TYPE_PHONE) && !dest_num) { 
    604 +               ast_log(LOG_WARNING, "Can't determine destination number.\n"); 
    605 +               *cause = AST_CAUSE_INCOMPATIBLE_DESTINATION; 
    606 +               return NULL; 
    607 +       } 
    608 + 
    609 +       chn = mbl_new(AST_STATE_DOWN, pvt, NULL); 
    610 +       if (!chn) { 
    611 +               ast_log(LOG_WARNING, "Unable to allocate channel structure.\n"); 
    612 +               *cause = AST_CAUSE_REQUESTED_CHAN_UNAVAIL; 
    613 +               return NULL; 
    614 +       } 
    615 + 
    616 +       return chn; 
    617 + 
    618 +} 
    619 + 
    620 +static int mbl_call(struct ast_channel *ast, char *dest, int timeout) 
    621 +{ 
    622 + 
    623 +       struct mbl_pvt *pvt; 
    624 +       char *dest_dev = NULL; 
    625 +       char *dest_num = NULL; 
    626 + 
    627 +       dest_dev = ast_strdupa((char *)dest); 
    628 + 
    629 +       pvt = ast->tech_pvt; 
    630 + 
    631 +       if (pvt->type == MBL_TYPE_PHONE) { 
    632 +               dest_num = strchr(dest_dev, '/'); 
    633 +               if (!dest_num) { 
    634 +                       ast_log(LOG_WARNING, "Cant determine destination number.\n"); 
    635 +                       return -1; 
    636 +               } 
    637 +               *dest_num++ = 0x00; 
    638 +       } 
    639 + 
    640 +       if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) { 
    641 +               ast_log(LOG_WARNING, "mbl_call called on %s, neither down nor reserved\n", ast->name); 
    642 +               return -1; 
    643 +       } 
    644 + 
    645 +       ast_log(LOG_DEBUG, "Calling %s on %s\n", dest, ast->name); 
    646 + 
    647 +       if (pvt->type == MBL_TYPE_PHONE) { 
    648 +               ast_copy_string(pvt->dial_number, dest_num, sizeof(pvt->dial_number)); 
    649 +               pvt->state = MBL_STATE_DIAL; 
    650 +               pvt->dial_timeout = (timeout == 0) ? 30 : timeout; 
    651 +       } else { 
    652 +               pvt->state = MBL_STATE_RING; 
    653 +       } 
    654 + 
    655 +       return 0; 
    656 + 
    657 +} 
    658 + 
    659 +static int mbl_hangup(struct ast_channel *ast) 
    660 +{ 
    661 + 
    662 +       struct mbl_pvt *pvt; 
    663 + 
    664 +       if (!ast->tech_pvt) { 
    665 +               ast_log(LOG_WARNING, "Asked to hangup channel not connected\n"); 
    666 +               return 0; 
    667 +       } 
    668 +       pvt = ast->tech_pvt; 
    669 + 
    670 +       ast_log(LOG_DEBUG, "Hanging up device %s.\n", pvt->id); 
    671 + 
    672 +       ast->fds[0] = -1; 
    673 +        
    674 +       close(pvt->io_pipe[0]); 
    675 +       close(pvt->io_pipe[1]); 
    676 + 
    677 +       if (pvt->type == MBL_TYPE_HEADSET && pvt->sco_socket != -1) { 
    678 +               close(pvt->sco_socket); 
    679 +               pvt->sco_socket = -1; 
    680 +       } 
    681 + 
    682 +       if ((pvt->state == MBL_STATE_INCOMING || pvt->state == MBL_STATE_OUTGOING || pvt->state == MBL_STATE_DIAL1 || pvt->state == MBL_STATE_RING3) && pvt->type == MBL_TYPE_PHONE) { 
    683 +               if (pvt->do_hangup) { 
    684 +                       rfcomm_write(pvt, "AT+CHUP\r"); 
    685 +               } 
    686 +               pvt->state = MBL_STATE_HANGUP; 
    687 +               pvt->hangup_count = 0; 
    688 +       } else 
    689 +               pvt->state = MBL_STATE_IDLE; 
    690 + 
    691 +       pvt->owner = NULL; 
    692 +       ast->tech_pvt = NULL; 
    693 +       ast_setstate(ast, AST_STATE_DOWN); 
    694 + 
    695 +       return 0; 
    696 + 
    697 +} 
    698 + 
    699 +static int mbl_answer(struct ast_channel *ast) 
    700 +{ 
    701 + 
    702 +       struct mbl_pvt *pvt; 
    703 + 
    704 +       pvt = ast->tech_pvt; 
    705 + 
    706 +       rfcomm_write(pvt, "ATA\r"); 
    707 + 
    708 +       ast_setstate(ast, AST_STATE_UP); 
    709 + 
    710 +       pvt->sent_answer = 1; 
    711 + 
    712 +       return 0; 
    713 + 
    714 +} 
    715 + 
    716 +static int mbl_digit_begin(struct ast_channel *chan, char digit) 
    717 +{ 
    718 + 
    719 +       return 0; 
    720 + 
    721 +} 
    722 + 
    723 +static int mbl_digit_end(struct ast_channel *ast, char digit, unsigned int duration) 
    724 +{ 
    725 + 
    726 +       struct mbl_pvt *pvt; 
    727 +       char buf[11]; 
    728 + 
    729 +       pvt = ast->tech_pvt; 
    730 + 
    731 +       if (pvt->type == MBL_TYPE_HEADSET) 
    732 +               return 0; 
    733 + 
    734 +       ast_log(LOG_DEBUG, "Dialed %c\n", digit); 
    735 + 
    736 +       switch(digit) { 
    737 +       case '0': 
    738 +       case '1': 
    739 +       case '2': 
    740 +       case '3': 
    741 +       case '4': 
    742 +       case '5': 
    743 +       case '6': 
    744 +       case '7': 
    745 +       case '8': 
    746 +       case '9': 
    747 +       case '*': 
    748 +       case '#': 
    749 +               snprintf(buf, sizeof(buf), "AT+VTS=%c\r", digit); 
    750 +               rfcomm_write(pvt, buf); 
    751 +               break; 
    752 +       default: 
    753 +               ast_log(LOG_WARNING, "Unknown digit '%c'\n", digit); 
    754 +               return -1; 
    755 +       } 
    756 + 
    757 +       return 0; 
    758 + 
    759 +} 
    760 + 
    761 +static struct ast_frame *mbl_read(struct ast_channel *ast) 
    762 +{ 
    763 + 
    764 +       struct mbl_pvt *pvt = ast->tech_pvt; 
    765 +       struct ast_frame *f; 
    766 +       int r; 
    767 + 
    768 +       //ast_log(LOG_DEBUG, "*** mbl_read()\n"); 
    769 + 
    770 +       if (!pvt->owner) { 
    771 +               return &ast_null_frame; 
    772 +       } 
    773 +       memset(&pvt->fr, 0x00, sizeof(struct ast_frame)); 
    774 +       pvt->fr.frametype = AST_FRAME_VOICE; 
    775 +       pvt->fr.subclass = DEVICE_FRAME_FORMAT; 
    776 +       pvt->fr.datalen = CHANNEL_FRAME_SIZE; 
    777 +       pvt->fr.samples = CHANNEL_FRAME_SIZE / 2; 
    778 +       pvt->fr.src = "Mobile"; 
    779 +       pvt->fr.offset = AST_FRIENDLY_OFFSET; 
    780 +       pvt->fr.mallocd = 0; 
    781 +       pvt->fr.delivery.tv_sec = 0; 
    782 +       pvt->fr.delivery.tv_usec = 0; 
    783 +       pvt->fr.data = pvt->io_buf + AST_FRIENDLY_OFFSET; 
    784 + 
    785 +       if ((r = read(pvt->io_pipe[0], pvt->fr.data, CHANNEL_FRAME_SIZE)) != CHANNEL_FRAME_SIZE) { 
    786 +               if (r == -1) { 
    787 +                       ast_log(LOG_ERROR, "read error %d\n", errno); 
    788 +                       return &ast_null_frame; 
    789 +               } else { 
    790 +                       pvt->fr.datalen = r; 
    791 +                       pvt->fr.samples = r / 2; 
    792 +               } 
    793 +       } 
    794 + 
    795 +       f = ast_dsp_process(0, pvt->dsp, &pvt->fr); 
    796 +       if (f && (f->frametype == AST_FRAME_DTMF_END)) { 
    797 +               pvt->fr.frametype = AST_FRAME_DTMF_END; 
    798 +               pvt->fr.subclass = f->subclass; 
    799 +       } 
    800 + 
    801 +       return &pvt->fr; 
    802 + 
    803 +} 
    804 + 
    805 +static int mbl_write(struct ast_channel *ast, struct ast_frame *frame) 
    806 +{ 
    807 + 
    808 +       struct mbl_pvt *pvt = ast->tech_pvt; 
    809 +       int i, r, io_need, num_frames; 
    810 +       char *pfr, buf[DEVICE_FRAME_SIZE]; 
    811 + 
    812 +       //ast_log(LOG_DEBUG, "*** mbl_write\n"); 
    813 + 
    814 +       if (frame->frametype != AST_FRAME_VOICE) { 
    815 +               return 0; 
    816 +       } 
    817 + 
    818 +       io_need = 0; 
    819 +       if (pvt->io_save_len > 0) { 
    820 +               io_need = DEVICE_FRAME_SIZE - pvt->io_save_len; 
    821 +               memcpy(pvt->io_save_buf + pvt->io_save_len, frame->data, io_need); 
    822 +               sco_write(pvt->sco_socket, pvt->io_save_buf, DEVICE_FRAME_SIZE); 
    823 +               if ((r = sco_read(pvt->sco_socket, buf, DEVICE_FRAME_SIZE))) { 
    824 +                       if (pvt->do_alignment_detection) 
    825 +                               do_alignment_detection(pvt, buf, r); 
    826 +                       if (ast->_state == AST_STATE_UP)        /* Dont queue the audio in the pipe if the call is not up yet. just toss it. */ 
    827 +                               sco_write(pvt->io_pipe[1], buf, r); 
    828 +               } 
    829 +       } 
    830 + 
    831 +       num_frames = (frame->datalen - io_need) / DEVICE_FRAME_SIZE; 
    832 +       pfr = frame->data + io_need; 
    833 + 
    834 +       for (i=0; i<num_frames; i++) { 
    835 +               sco_write(pvt->sco_socket, pfr, DEVICE_FRAME_SIZE); 
    836 +               if ((r = sco_read(pvt->sco_socket, buf, DEVICE_FRAME_SIZE))) { 
    837 +                       if (pvt->do_alignment_detection) 
    838 +                               do_alignment_detection(pvt, buf, r); 
    839 +                       if (ast->_state == AST_STATE_UP) 
    840 +                               sco_write(pvt->io_pipe[1], buf, r); 
    841 +               } 
    842 +               pfr += DEVICE_FRAME_SIZE; 
    843 +       } 
    844 + 
    845 +       pvt->io_save_len = (frame->datalen - io_need) - (num_frames * DEVICE_FRAME_SIZE); 
    846 +       if (pvt->io_save_len > 0) { 
    847 +               memcpy(pvt->io_save_buf, pfr, pvt->io_save_len); 
    848 +       } 
    849 + 
    850 +       return 0; 
    851 + 
    852 +} 
    853 + 
    854 +static int mbl_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) 
    855 +{ 
    856 + 
    857 +       struct mbl_pvt *pvt = oldchan->tech_pvt; 
    858 + 
    859 +       if (pvt && pvt->owner == oldchan) 
    860 +               pvt->owner = newchan; 
    861 + 
    862 +       return 0; 
    863 + 
    864 +} 
    865 + 
    866 +static int mbl_devicestate(void *data) 
    867 +{ 
    868 + 
    869 +       char *device; 
    870 +       int res = AST_DEVICE_INVALID; 
    871 +       struct mbl_pvt *pvt; 
    872 + 
    873 +       device = ast_strdupa(S_OR(data, "")); 
    874 + 
    875 +       ast_log(LOG_DEBUG, "Checking device state for device %s\n", device); 
    876 + 
    877 +       AST_RWLIST_RDLOCK(&devices); 
    878 +       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    879 +               if (!strcmp(pvt->id, device)) 
    880 +                       break; 
    881 +       } 
    882 +       AST_RWLIST_UNLOCK(&devices); 
    883 + 
    884 +       if (pvt) { 
    885 +               if (pvt->connected) { 
    886 +                       if (pvt->owner) 
    887 +                               res = AST_DEVICE_INUSE; 
    888 +                       else 
    889 +                               res = AST_DEVICE_NOT_INUSE; 
    890 +               } 
    891 +       } 
    892 + 
    893 +       return res; 
    894 + 
    895 +} 
    896 + 
    897 +/* 
    898 + 
    899 +       Callback helpers 
    900 + 
    901 +*/ 
    902 + 
    903 +/* 
    904 + 
    905 +       do_alignment_detection() 
    906 + 
    907 +       This routine attempts to detect where we get misaligned sco audio data from the bluetooth adaptor. 
    908 + 
    909 +       Its enabled by alignmentdetect=yes under the adapter entry in mobile.conf 
    910 + 
    911 +       Some adapters suffer a problem where occasionally they will byte shift the audio stream one byte to the right. 
    912 +       The result is static or white noise on the inbound (from the adapter) leg of the call. 
    913 +       This is characterised by a sudden jump in magnitude of the value of the 16 bit samples. 
    914 + 
    915 +       Here we look at the first 4 48 byte frames. We average the absolute values of each sample in the frame, 
    916 +       then average the sum of the averages of frames 1, 2, and 3. 
    917 +       Frame zero is usually zero. 
    918 +       If the end result > 100, and it usually is if we have the problem, set a flag and compensate by shifting the bytes 
    919 +       for each subsequent frame during the call. 
    920 + 
    921 +       If the result is <= 100 then clear the flag so we dont come back in here... 
    922 + 
    923 +       This seems to work OK.... 
    924 + 
    925 +*/ 
    926 + 
    927 +static void do_alignment_detection(struct mbl_pvt *pvt, char *buf, int buflen) 
    928 +{ 
    929 + 
    930 +       int i; 
    931 +       short a, *s; 
    932 +       char *p; 
    933 + 
    934 +       if (pvt->alignment_detection_triggered) { 
    935 +               for (i=buflen, p=buf+buflen-1; i>0; i--, p--) 
    936 +                       *p = *(p-1); 
    937 +               *(p+1) = 0; 
    938 +               return; 
    939 +       } 
    940 + 
    941 +       if (pvt->alignment_count < 4) { 
    942 +               s = (short *)buf; 
    943 +               for (i=0, a=0; i<buflen/2; i++) { 
    944 +                       a += *s++; 
    945 +                       a /= i+1; 
    946 +               } 
    947 +               pvt->alignment_samples[pvt->alignment_count++] = a; 
    948 +               return; 
    949 +       } 
    950 + 
    951 +       ast_log(LOG_DEBUG, "Alignment Detection result is [%-d %-d %-d %-d]\n", pvt->alignment_samples[0], pvt->alignment_samples[1], pvt->alignment_samples[2], pvt->alignment_samples[3]); 
    952 + 
    953 +       a = abs(pvt->alignment_samples[1]) + abs(pvt->alignment_samples[2]) + abs(pvt->alignment_samples[3]); 
    954 +       a /= 3; 
    955 +       if (a > 100) { 
    956 +               pvt->alignment_detection_triggered = 1; 
    957 +               ast_log(LOG_DEBUG, "Alignment Detection Triggered.\n"); 
    958 +       } else 
    959 +               pvt->do_alignment_detection = 0; 
    960 + 
    961 +} 
    962 + 
    963 +/* 
    964 + 
    965 +       rfcomm helpers 
    966 + 
    967 +*/ 
    968 + 
    969 +static int rfcomm_connect(bdaddr_t src, bdaddr_t dst, int remote_channel) { 
    970 + 
    971 +       struct sockaddr_rc addr; 
    972 +       int s; 
    973 + 
    974 +       if ((s = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) { 
    975 +               ast_log(LOG_DEBUG, "socket() failed (%d).\n", errno); 
    976 +               return -1; 
    977 +       } 
    978 + 
    979 +       memset(&addr, 0, sizeof(addr)); 
    980 +       addr.rc_family = AF_BLUETOOTH; 
    981 +       bacpy(&addr.rc_bdaddr, &src); 
    982 +       addr.rc_channel = (uint8_t) 1; 
    983 +       if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 
    984 +               ast_log(LOG_DEBUG, "bind() failed (%d).\n", errno); 
    985 +               close(s); 
    986 +               return -1; 
    987 +       } 
    988 + 
    989 +       memset(&addr, 0, sizeof(addr)); 
    990 +       addr.rc_family = AF_BLUETOOTH; 
    991 +       bacpy(&addr.rc_bdaddr, &dst); 
    992 +       addr.rc_channel = remote_channel; 
    993 +       if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 
    994 +               ast_log(LOG_DEBUG, "connect() failed (%d).\n", errno); 
    995 +               close(s); 
    996 +               return -1; 
    997 +       } 
    998 + 
    999 +       return s; 
    1000 + 
    1001 +} 
    1002 + 
    1003 +static int rfcomm_write(struct mbl_pvt *pvt, char *buf) 
    1004 +{ 
    1005 + 
    1006 +       char *p; 
    1007 +       ssize_t num_write; 
    1008 +       int len; 
    1009 + 
    1010 +       ast_log(LOG_DEBUG, "rfcomm_write() (%s) [%s]\n", pvt->id, buf); 
    1011 +       len = strlen(buf); 
    1012 +       p = buf; 
    1013 +       while (len > 0) { 
    1014 +               if ((num_write = write(pvt->rfcomm_socket, p, len)) == -1) { 
    1015 +                       ast_log(LOG_DEBUG, "rfcomm_write() error [%d]\n", errno); 
    1016 +                       return 0; 
    1017 +               } 
    1018 +               len -= num_write; 
    1019 +               p += num_write; 
    1020 +       } 
    1021 + 
    1022 +       return 1; 
    1023 + 
    1024 +} 
    1025 + 
    1026 +/* 
    1027 + 
    1028 +       Here we need to return complete '\r' terminated single responses to the devices monitor thread, or 
    1029 +       a timeout if nothing is available. 
    1030 +       The rfcomm connection to the device is asynchronous, so there is no guarantee that responses will 
    1031 +       be returned in a single read() call. We handle this by buffering the input and returning one response 
    1032 +       per call, or a timeout if nothing is available. 
    1033 + 
    1034 +*/ 
    1035 + 
    1036 +static int rfcomm_read(struct mbl_pvt *pvt, char *buf, char flush, int timeout) 
    1037 +{ 
    1038 + 
    1039 +       int sel, rlen, slen; 
    1040 +       fd_set rfds; 
    1041 +       struct timeval tv; 
    1042 +       char *p; 
    1043 + 
    1044 +       if (!flush) { 
    1045 +               if ((p = strchr(pvt->rfcomm_buf, '\r'))) { 
    1046 +                       *p++ = 0x00; 
    1047 +                       if (*p == '\n') 
    1048 +                               p++; 
    1049 +                       memmove(buf, pvt->rfcomm_buf, strlen(pvt->rfcomm_buf)); 
    1050 +                       *(buf + strlen(pvt->rfcomm_buf)) = 0x00; 
    1051 +                       memmove(pvt->rfcomm_buf, p, strlen(p)); 
    1052 +                       *(pvt->rfcomm_buf+strlen(p)) = 0x00; 
    1053 +                       return 1; 
    1054 +               } 
    1055 +       } else { 
    1056 +               pvt->rfcomm_buf[0] = 0x00; 
    1057 +       } 
    1058 + 
    1059 +       FD_ZERO(&rfds); 
    1060 +       FD_SET(pvt->rfcomm_socket, &rfds); 
    1061 + 
    1062 +       tv.tv_sec = timeout; 
    1063 +       tv.tv_usec = 0; 
    1064 + 
    1065 +       if ((sel = select(pvt->rfcomm_socket + 1, &rfds, NULL, NULL, &tv)) > 0) { 
    1066 +               if (FD_ISSET(pvt->rfcomm_socket, &rfds)) { 
    1067 +                       slen = strlen(pvt->rfcomm_buf); 
    1068 +                       rlen = read(pvt->rfcomm_socket, pvt->rfcomm_buf + slen, sizeof(pvt->rfcomm_buf) - slen - 1); 
    1069 +                       if (rlen > 0) { 
    1070 +                               pvt->rfcomm_buf[slen+rlen] = 0x00; 
    1071 +                               if ((p = strchr(pvt->rfcomm_buf, '\r'))) { 
    1072 +                                       *p++ = 0x00; 
    1073 +                                       if (*p == '\n') 
    1074 +                                               p++; 
    1075 +                                       memmove(buf, pvt->rfcomm_buf, strlen(pvt->rfcomm_buf)); 
    1076 +                                       *(buf + strlen(pvt->rfcomm_buf)) = 0x00; 
    1077 +                                       memmove(pvt->rfcomm_buf, p, strlen(p)); 
    1078 +                                       *(pvt->rfcomm_buf+strlen(p)) = 0x00; 
    1079 +                                       return 1; 
    1080 +                               } 
    1081 +                       } else 
    1082 +                               return rlen; 
    1083 +               } 
    1084 +       } else if (sel == 0) { /* timeout */ 
    1085 +               return 0; 
    1086 +       } 
    1087 + 
    1088 +       return 1; 
    1089 + 
    1090 +} 
    1091 + 
    1092 +/* 
    1093 + 
    1094 +       sco helpers 
    1095 + 
    1096 +*/ 
    1097 + 
    1098 +static int sco_connect(bdaddr_t src, bdaddr_t dst) 
    1099 +{ 
    1100 + 
    1101 +       struct sockaddr_sco addr; 
    1102 +       int s; 
    1103 + 
    1104 +       if ((s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0) { 
    1105 +               ast_log(LOG_DEBUG, "socket() failed (%d).\n", errno); 
    1106 +               return -1; 
    1107 +       } 
    1108 + 
    1109 +       memset(&addr, 0, sizeof(addr)); 
    1110 +       addr.sco_family = AF_BLUETOOTH; 
    1111 +       bacpy(&addr.sco_bdaddr, &src); 
    1112 +       if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 
    1113 +               ast_log(LOG_DEBUG, "bind() failed (%d).\n", errno); 
    1114 +               close(s); 
    1115 +               return -1; 
    1116 +       } 
    1117 + 
    1118 +       memset(&addr, 0, sizeof(addr)); 
    1119 +       addr.sco_family = AF_BLUETOOTH; 
    1120 +       bacpy(&addr.sco_bdaddr, &dst); 
    1121 + 
    1122 +       if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 
    1123 +               ast_log(LOG_DEBUG, "sco connect() failed (%d).\n", errno); 
    1124 +               close(s); 
    1125 +               return -1; 
    1126 +       } 
    1127 + 
    1128 +       return s; 
    1129 + 
    1130 +} 
    1131 + 
    1132 +static int sco_write(int s, char *buf, int len) 
    1133 +{ 
    1134 + 
    1135 +       int r; 
    1136 + 
    1137 +       if (s == -1) { 
    1138 +               ast_log(LOG_DEBUG, "sco_write() not ready\n"); 
    1139 +               return 0; 
    1140 +       } 
    1141 + 
    1142 +       ast_log(LOG_DEBUG, "sco_write()\n"); 
    1143 + 
    1144 +       r = write(s, buf, len); 
    1145 +       if (r == -1) { 
    1146 +               ast_log(LOG_DEBUG, "sco write error %d\n", errno); 
    1147 +               return 0; 
    1148 +       } 
    1149 + 
    1150 +       return 1; 
    1151 + 
    1152 +} 
    1153 + 
    1154 +static int sco_read(int s, char *buf, int len) 
    1155 +{ 
    1156 + 
    1157 +       int r; 
    1158 + 
    1159 +       if (s == -1) { 
    1160 +               ast_log(LOG_DEBUG, "sco_read() not ready\n"); 
    1161 +               return 0; 
    1162 +       } 
    1163 + 
    1164 +       ast_log(LOG_DEBUG, "sco_read()\n"); 
    1165 + 
    1166 +       r = read(s, buf, len); 
    1167 +       if (r == -1) { 
    1168 +               ast_log(LOG_DEBUG, "sco_read() error %d\n", errno); 
    1169 +               return 0; 
    1170 +       } 
    1171 + 
    1172 +       return r; 
    1173 + 
    1174 +} 
    1175 + 
    1176 +/* 
    1177 + 
    1178 +       sdp helpers 
    1179 + 
    1180 +*/ 
    1181 + 
    1182 +static int sdp_search(char *addr, int profile) 
    1183 +{ 
    1184 + 
    1185 +       sdp_session_t *session = 0; 
    1186 +       bdaddr_t bdaddr; 
    1187 +       uuid_t svc_uuid; 
    1188 +       uint32_t range = 0x0000ffff; 
    1189 +       sdp_list_t *response_list, *search_list, *attrid_list; 
    1190 +       int status, port; 
    1191 +       sdp_list_t *proto_list; 
    1192 +       sdp_record_t *sdprec; 
    1193 + 
    1194 +       str2ba(addr, &bdaddr); 
    1195 +       port = 0; 
    1196 +       session = sdp_connect(BDADDR_ANY, &bdaddr, SDP_RETRY_IF_BUSY); 
    1197 +       if (!session) { 
    1198 +               ast_log(LOG_DEBUG, "sdp_connect() failed on device %s.\n", addr); 
    1199 +               return 0; 
    1200 +       } 
    1201 + 
    1202 +       sdp_uuid32_create(&svc_uuid, profile); 
    1203 +       search_list = sdp_list_append(0, &svc_uuid); 
    1204 +       attrid_list = sdp_list_append(0, &range); 
    1205 +       response_list = 0x00; 
    1206 +       status = sdp_service_search_attr_req(session, search_list, SDP_ATTR_REQ_RANGE, attrid_list, &response_list); 
    1207 +       if (status == 0) { 
    1208 +               if (response_list) { 
    1209 +                       sdprec = (sdp_record_t *) response_list->data; 
    1210 +                       proto_list = 0x00; 
    1211 +                       if (sdp_get_access_protos(sdprec, &proto_list) == 0) { 
    1212 +                               port = sdp_get_proto_port(proto_list, RFCOMM_UUID); 
    1213 +                               sdp_list_free(proto_list, 0); 
    1214 +                       } 
    1215 +                       sdp_record_free(sdprec); 
    1216 +                       sdp_list_free(response_list, 0); 
    1217 +               } else 
    1218 +                       ast_log(LOG_DEBUG, "No responses returned for device %s.\n", addr); 
    1219 +       } else 
    1220 +               ast_log(LOG_DEBUG, "sdp_service_search_attr_req() failed on device %s.\n", addr); 
    1221 + 
    1222 +       sdp_list_free(search_list, 0); 
    1223 +       sdp_list_free(attrid_list, 0); 
    1224 +       sdp_close(session); 
    1225 + 
    1226 +       return port; 
    1227 + 
    1228 +} 
    1229 + 
    1230 +static sdp_session_t *sdp_register(void) 
    1231 +{ 
    1232 + 
    1233 +       uint32_t service_uuid_int[] = {0, 0, 0, GENERIC_AUDIO_SVCLASS_ID}; 
    1234 +       uint8_t rfcomm_channel = 1; 
    1235 +       const char *service_name = "Asterisk PABX"; 
    1236 +       const char *service_dsc = "Asterisk PABX"; 
    1237 +       const char *service_prov = "Asterisk"; 
    1238 + 
    1239 +       uuid_t root_uuid, l2cap_uuid, rfcomm_uuid, svc_uuid, svc_class1_uuid, svc_class2_uuid; 
    1240 +       sdp_list_t  *l2cap_list = 0, *rfcomm_list = 0, *root_list = 0, *proto_list = 0, *access_proto_list = 0, *svc_uuid_list = 0; 
    1241 +       sdp_data_t *channel = 0; 
    1242 + 
    1243 +       int err = 0; 
    1244 +       sdp_session_t *session = 0; 
    1245 + 
    1246 +       sdp_record_t *record = sdp_record_alloc(); 
    1247 + 
    1248 +       sdp_uuid128_create(&svc_uuid, &service_uuid_int); 
    1249 +       sdp_set_service_id(record, svc_uuid); 
    1250 + 
    1251 +       sdp_uuid32_create(&svc_class1_uuid, GENERIC_AUDIO_SVCLASS_ID); 
    1252 +       sdp_uuid32_create(&svc_class2_uuid, HEADSET_PROFILE_ID); 
    1253 + 
    1254 +       svc_uuid_list = sdp_list_append(0, &svc_class1_uuid); 
    1255 +       svc_uuid_list = sdp_list_append(svc_uuid_list, &svc_class2_uuid); 
    1256 +       sdp_set_service_classes(record, svc_uuid_list); 
    1257 + 
    1258 +       sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP); 
    1259 +       root_list = sdp_list_append(0, &root_uuid); 
    1260 +       sdp_set_browse_groups( record, root_list ); 
    1261 + 
    1262 +       sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID); 
    1263 +       l2cap_list = sdp_list_append(0, &l2cap_uuid); 
    1264 +       proto_list = sdp_list_append(0, l2cap_list); 
    1265 + 
    1266 +       sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID); 
    1267 +       channel = sdp_data_alloc(SDP_UINT8, &rfcomm_channel); 
    1268 +       rfcomm_list = sdp_list_append(0, &rfcomm_uuid); 
    1269 +       sdp_list_append(rfcomm_list, channel); 
    1270 +       sdp_list_append(proto_list, rfcomm_list); 
    1271 + 
    1272 +       access_proto_list = sdp_list_append(0, proto_list); 
    1273 +       sdp_set_access_protos(record, access_proto_list); 
    1274 + 
    1275 +       sdp_set_info_attr(record, service_name, service_prov, service_dsc); 
    1276 + 
    1277 +       if (!(session = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY))) 
    1278 +               ast_log(LOG_WARNING, "Failed to connect sdp and create session.\n"); 
    1279 +       else 
    1280 +               err = sdp_record_register(session, record, 0); 
    1281 + 
    1282 +       sdp_data_free(channel); 
    1283 +       sdp_list_free(rfcomm_list, 0); 
    1284 +       sdp_list_free(root_list, 0); 
    1285 +       sdp_list_free(access_proto_list, 0); 
    1286 +       sdp_list_free(svc_uuid_list, 0); 
    1287 + 
    1288 +       return session; 
    1289 + 
    1290 +} 
    1291 + 
    1292 +/* 
    1293 + 
    1294 +       Thread routines 
    1295 + 
    1296 +*/ 
    1297 + 
    1298 +static void *do_monitor_phone(void *data) 
    1299 +{ 
    1300 + 
    1301 +       struct mbl_pvt *pvt = (struct mbl_pvt *)data; 
    1302 +       struct ast_channel *chn; 
    1303 +       char monitor = 1; 
    1304 +       char buf[256]; 
    1305 +       char cid_num[AST_MAX_EXTENSION], *pcids, *pcide; 
    1306 +       int s, t, i, smsi; 
    1307 +       int group, group2; 
    1308 +       int callp = 0, callsetupp; 
    1309 +       char brsf, nsmode, *p, *p1; 
    1310 +       char sms_src[13]; 
    1311 +       char sms_txt[160]; 
    1312 + 
    1313 +       brsf = nsmode = 0; 
    1314 + 
    1315 +       if (!rfcomm_write(pvt, "AT+BRSF=4\r")) 
    1316 +               monitor = 0; 
    1317 + 
    1318 +       while (monitor) { 
    1319 + 
    1320 +               if (pvt->state == MBL_STATE_DIAL1) 
    1321 +                       t = pvt->dial_timeout; 
    1322 +               else if (pvt->state == MBL_STATE_HANGUP) 
    1323 +                       t = 2; 
    1324 +               else if (pvt->state == MBL_STATE_OUTSMS1) 
    1325 +                       t = 2; 
    1326 +               else if (pvt->state == MBL_STATE_OUTSMS2) 
    1327 +                       t = 10; 
    1328 +               else 
    1329 +                       t = 1; 
    1330 + 
    1331 +               s = rfcomm_read(pvt, buf, 0, t); 
    1332 + 
    1333 +               if ((s > 0) && (buf[0] != 0x0) && (buf[0] != '\r')) { 
    1334 +                       ast_log(LOG_DEBUG, "rfcomm_read() (%s) [%s]\n", pvt->id, buf); 
    1335 +                       switch (pvt->state) { 
    1336 +                       case MBL_STATE_INIT: 
    1337 +                               if (strstr(buf, "+BRSF:")) { 
    1338 +                                       brsf = 1; 
    1339 +                               } else if (strstr(buf, "ERROR") && !nsmode) {   /* Hmmm, Non-Standard Phone, just continue */ 
    1340 +                                       rfcomm_write(pvt, "AT+CIND=?\r"); 
    1341 +                                       pvt->state++; 
    1342 +                                       nsmode = 1; 
    1343 +                               } else if (strstr(buf, "OK") && brsf) { 
    1344 +                                       if (pvt->blackberry) { 
    1345 +                                               rfcomm_write(pvt, "AT+CMER=3,0,0,1\r"); 
    1346 +                                               pvt->state = MBL_STATE_INIT3; 
    1347 +                                       } else { 
    1348 +                                               rfcomm_write(pvt, "AT+CIND=?\r"); 
    1349 +                                               pvt->state++; 
    1350 +                                       } 
    1351 +                               } 
    1352 +                               break; 
    1353 +                       case MBL_STATE_INIT1: 
    1354 +                               if (strstr(buf, "+CIND:")) { 
    1355 +                                       group = callp = callsetupp = 0; 
    1356 +                                       group2 = 1; 
    1357 +                                       for (i=0; i<strlen(buf); i++) { 
    1358 +                                               if (buf[i] == '(') 
    1359 +                                                       group++; 
    1360 +                                               if (buf[i] == ')') { 
    1361 +                                                       group--; 
    1362 +                                                       if (group == 0) 
    1363 +                                                               group2++; 
    1364 +                                               } 
    1365 +                                               if (strstr(buf+i, "\"call\"")) 
    1366 +                                                       callp = group2; 
    1367 +                                               if (strstr(buf+i, "\"call_setup\"")) 
    1368 +                                                       callsetupp = group2; 
    1369 +                                               if (strstr(buf+i, "\"callsetup\"")) 
    1370 +                                                       callsetupp = group2; 
    1371 +                                       } 
    1372 +                                       snprintf(pvt->ciev_call_0, sizeof(pvt->ciev_call_0), "%d,0", callp); 
    1373 +                                       snprintf(pvt->ciev_call_1, sizeof(pvt->ciev_call_1), "%d,1", callp); 
    1374 +                                       snprintf(pvt->ciev_callsetup_0, sizeof(pvt->ciev_callsetup_0), "%d,0", callsetupp); 
    1375 +                                       snprintf(pvt->ciev_callsetup_1, sizeof(pvt->ciev_callsetup_1), "%d,1", callsetupp); 
    1376 +                                       snprintf(pvt->ciev_callsetup_2, sizeof(pvt->ciev_callsetup_2), "%d,2", callsetupp); 
    1377 +                                       snprintf(pvt->ciev_callsetup_3, sizeof(pvt->ciev_callsetup_3), "%d,3", callsetupp); 
    1378 +                                       if (callsetupp == 0) /* This phone has no call setup indication!! ... */ 
    1379 +                                               pvt->no_callsetup = 1; 
    1380 +                                       ast_log(LOG_DEBUG, "CIEV_CALL=%d CIEV_CALLSETUP=%d\n", callp, callsetupp); 
    1381 +                               } 
    1382 +                               if (strstr(buf, "OK")) { 
    1383 +                                       rfcomm_write(pvt, "AT+CIND?\r"); 
    1384 +                                       pvt->state++; 
    1385 +                               } 
    1386 +                               break; 
    1387 +                       case MBL_STATE_INIT2: 
    1388 +                               if ((p = strstr(buf, "+CIND:"))) { 
    1389 +                                       p += 5; 
    1390 +                                       if (*(p+(callp*2)) == '1') { 
    1391 +                                               ast_verbose(VERBOSE_PREFIX_3 "Bluetooth Device %s has a call in progress - delaying connection.\n", pvt->id); 
    1392 +                                               monitor = 0; 
    1393 +                                       } 
    1394 +                               } else if (strstr(buf, "OK")) { 
    1395 +                                       if (pvt->blackberry) { 
    1396 +                                               rfcomm_write(pvt, "AT+CLIP=1\r"); 
    1397 +                                               pvt->state = MBL_STATE_INIT4; 
    1398 +                                       } else { 
    1399 +                                               rfcomm_write(pvt, "AT+CMER=3,0,0,1\r"); 
    1400 +                                               pvt->state++; 
    1401 +                                       } 
    1402 +                               } 
    1403 +                               break; 
    1404 +                       case MBL_STATE_INIT3: 
    1405 +                               if (strstr(buf, "OK")) { 
    1406 +                                       if (pvt->blackberry) { 
    1407 +                                               rfcomm_write(pvt, "AT+CIND=?\r"); 
    1408 +                                               pvt->state = MBL_STATE_INIT1; 
    1409 +                                       } else { 
    1410 +                                               rfcomm_write(pvt, "AT+CLIP=1\r"); 
    1411 +                                               pvt->state++; 
    1412 +                                       } 
    1413 +                               } 
    1414 +                               break; 
    1415 +                       case MBL_STATE_INIT4: 
    1416 +                               if (strstr(buf, "OK")) { 
    1417 +                                       rfcomm_write(pvt, "AT+VGS=15\r"); 
    1418 +                                       pvt->state++; 
    1419 +                               } 
    1420 +                               break; 
    1421 +                       case MBL_STATE_INIT5: 
    1422 +                               if (strstr(buf, "OK")) { 
    1423 +                                       rfcomm_write(pvt, "AT+CMGF=1\r"); 
    1424 +                                       pvt->state++; 
    1425 +                               } 
    1426 +                               break; 
    1427 +                       case MBL_STATE_INIT6: 
    1428 +                               if (strstr(buf, "ERROR")) {     /* No SMS Support ! */ 
    1429 +                                       pvt->state = MBL_STATE_PREIDLE; 
    1430 +                               } else if (strstr(buf, "OK")) { 
    1431 +                                       rfcomm_write(pvt, "AT+CNMI=2,1,0,1,0\r"); 
    1432 +                                       pvt->state++; 
    1433 +                               } 
    1434 +                               break; 
    1435 +                       case MBL_STATE_INIT7: 
    1436 +                               if (strstr(buf, "OK")) {        /* We have SMS Support */ 
    1437 +                                       pvt->has_sms = 1; 
    1438 +                                       pvt->state = MBL_STATE_PREIDLE; 
    1439 +                               } else if (strstr(buf, "ERROR")) { 
    1440 +                                       pvt->has_sms = 0; 
    1441 +                                       pvt->state = MBL_STATE_PREIDLE; 
    1442 +                               } 
    1443 +                               break; 
    1444 +                       case MBL_STATE_PREIDLE: /* Nothing handled here, wait for timeout, then off we go... */ 
    1445 +                               break; 
    1446 +                       case MBL_STATE_IDLE: 
    1447 +                               ast_log(LOG_DEBUG, "Device %s [%s]\n", pvt->id, buf); 
    1448 +                               if (strstr(buf, "RING")) { 
    1449 +                                       pvt->state = MBL_STATE_RING; 
    1450 +                               } else if (strstr(buf, "+CIEV:")) { 
    1451 +                                       if (strstr(buf, pvt->ciev_callsetup_3)) {       /* User has dialed out on handset */ 
    1452 +                                               monitor = 0;                            /* We disconnect now, as he is    */ 
    1453 +                                       }                                               /* probably leaving BT range...   */ 
    1454 +                               } 
    1455 +                               break; 
    1456 +                       case MBL_STATE_DIAL: /* Nothing handled here, we need to wait for a timeout */ 
    1457 +                               break; 
    1458 +                       case MBL_STATE_DIAL1: 
    1459 +                               if (strstr(buf, "OK")) { 
    1460 +                                       if (pvt->no_callsetup) { 
    1461 +                                               ast_queue_control(pvt->owner, AST_CONTROL_ANSWER); 
    1462 +                                       } else { 
    1463 +                                               ast_setstate(pvt->owner, AST_STATE_RINGING); 
    1464 +                                       } 
    1465 +                                       pvt->state = MBL_STATE_OUTGOING; 
    1466 +                               } 
    1467 +                               break; 
    1468 +                       case MBL_STATE_OUTGOING: 
    1469 +                               if (strstr(buf, "+CIEV")) { 
    1470 +                                       if (strstr(buf, pvt->ciev_call_0)) {                            /* call was hung up */ 
    1471 +                                               pvt->do_hangup = 0; 
    1472 +                                               ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1473 +                                       } else if (strstr(buf, pvt->ciev_callsetup_3)) {                /* b-party ringing */ 
    1474 +                                               ast_queue_control(pvt->owner, AST_CONTROL_RINGING); 
    1475 +                                       } else if (strstr(buf, pvt->ciev_call_1) && !pvt->no_callsetup) { /* b-party answer */ 
    1476 +                                               ast_queue_control(pvt->owner, AST_CONTROL_ANSWER); 
    1477 +                                       } 
    1478 +                               } 
    1479 +                               break; 
    1480 +                       case MBL_STATE_RING: 
    1481 +                               cid_num[0] = 0x00; 
    1482 +                               if ((pcids = strstr(buf, "+CLIP:"))) { 
    1483 +                                       if ((pcids = strchr(pcids, '"'))) { 
    1484 +                                               if ((pcide = strchr(pcids+1, '"'))) { 
    1485 +                                                       strncpy(cid_num, pcids+1, pcide - pcids - 1); 
    1486 +                                                       cid_num[pcide - pcids - 1] = 0x00; 
    1487 +                                               } 
    1488 +                                       } 
    1489 +                                       chn = mbl_new(AST_STATE_RING, pvt, cid_num); 
    1490 +                                       if (chn) { 
    1491 +                                               if (ast_pbx_start(chn)) { 
    1492 +                                                       ast_log(LOG_ERROR, "Unable to start pbx on incoming call.\n"); 
    1493 +                                                       ast_hangup(chn); 
    1494 +                                               } else 
    1495 +                                                       pvt->state = MBL_STATE_RING3; 
    1496 +                                       } else { 
    1497 +                                               ast_log(LOG_ERROR, "Unable to allocate channel for incoming call.\n"); 
    1498 +                                               rfcomm_write(pvt, "AT+CHUP\r"); 
    1499 +                                               pvt->state = MBL_STATE_IDLE; 
    1500 +                                       } 
    1501 +                               } 
    1502 +                               break; 
    1503 +                       case MBL_STATE_RING2: 
    1504 +                               chn = mbl_new(AST_STATE_RING, pvt, cid_num); 
    1505 +                               if (chn) { 
    1506 +                                       if (ast_pbx_start(chn)) { 
    1507 +                                               ast_log(LOG_ERROR, "Unable to start pbx on incoming call.\n"); 
    1508 +                                               ast_hangup(chn); 
    1509 +                                       } else 
    1510 +                                               pvt->state = MBL_STATE_RING3; 
    1511 +                               } else { 
    1512 +                                       ast_log(LOG_ERROR, "Unable to allocate channel for incoming call.\n"); 
    1513 +                                       rfcomm_write(pvt, "AT+CHUP\r"); 
    1514 +                                       pvt->state = MBL_STATE_IDLE; 
    1515 +                               } 
    1516 +                               break; 
    1517 +                       case MBL_STATE_RING3: 
    1518 +                               if (strstr(buf, "+CIEV")) { 
    1519 +                                       if (strstr(buf, pvt->ciev_call_1)) { 
    1520 +                                               if (pvt->sent_answer) { /* We answered */ 
    1521 +                                                       pvt->state = MBL_STATE_INCOMING; 
    1522 +                                               } else {                /* User answered on handset!, disconnect */ 
    1523 +                                                       pvt->state = MBL_STATE_IDLE; 
    1524 +                                                       if (pvt->sco_socket > -1) 
    1525 +                                                               close(pvt->sco_socket); 
    1526 +                                                       ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1527 +                                               } 
    1528 +                                       } 
    1529 +                                       if ((strstr(buf, pvt->ciev_callsetup_0) || strstr(buf, pvt->ciev_call_0))) { /* Caller disconnected */ 
    1530 +                                               ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1531 +                                       } 
    1532 +                               }  
    1533 +                               break; 
    1534 +                       case MBL_STATE_INCOMING: 
    1535 +                               if (strstr(buf, "+CIEV")) { 
    1536 +                                       if (strstr(buf, pvt->ciev_call_0)) { 
    1537 +                                               pvt->do_hangup = 0; 
    1538 +                                               ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1539 +                                       } 
    1540 +                               } 
    1541 +                               break; 
    1542 +                       case MBL_STATE_HANGUP: 
    1543 +                               if (strstr(buf, "OK") || strstr(buf, pvt->ciev_call_0)) { 
    1544 +                                       close(pvt->sco_socket); 
    1545 +                                       pvt->sco_socket = -1; 
    1546 +                                       pvt->state = MBL_STATE_IDLE; 
    1547 +                               } 
    1548 +                               break; 
    1549 +                       case MBL_STATE_INSMS: 
    1550 +                               if (strstr(buf, "+CMGR:")) { 
    1551 +                                       memset(sms_src, 0x00, sizeof(sms_src)); 
    1552 +                                       if ((p = strchr(buf, ','))) { 
    1553 +                                               if (*(++p) == '"') 
    1554 +                                                       p++; 
    1555 +                                               if ((p1 = strchr(p, ','))) { 
    1556 +                                                       if (*(--p1) == '"') 
    1557 +                                                               p1--; 
    1558 +                                                       memset(sms_src, 0x00, sizeof(sms_src)); 
    1559 +                                                       strncpy(sms_src, p, p1 - p + 1); 
    1560 +                                               } 
    1561 +                                       } 
    1562 +                               } else if (strstr(buf, "OK")) { 
    1563 +                                       chn = mbl_new(AST_STATE_DOWN, pvt, NULL); 
    1564 +                                       strcpy(chn->exten, "sms"); 
    1565 +                                       pbx_builtin_setvar_helper(chn, "SMSSRC", sms_src); 
    1566 +                                       pbx_builtin_setvar_helper(chn, "SMSTXT", sms_txt); 
    1567 +                                       if (ast_pbx_start(chn)) 
    1568 +                                               ast_log(LOG_ERROR, "Unable to start pbx on incoming sms.\n"); 
    1569 +                                       pvt->state = MBL_STATE_IDLE; 
    1570 +                               } else { 
    1571 +                                       ast_copy_string(sms_txt, buf, sizeof(sms_txt)); 
    1572 +                               } 
    1573 +                               break; 
    1574 +                       case MBL_STATE_OUTSMS: 
    1575 +                               break; 
    1576 +                       case MBL_STATE_OUTSMS1: 
    1577 +                               break; 
    1578 +                       case MBL_STATE_OUTSMS2: 
    1579 +                               if (strstr(buf, "OK")) { 
    1580 +                                       pvt->state = MBL_STATE_IDLE; 
    1581 +                               } 
    1582 +                               break; 
    1583 +                       } 
    1584 +                       /* Unsolicited responses */ 
    1585 + 
    1586 +                       if (strstr(buf, "+CMTI:")) {    /* SMS Incoming... */ 
    1587 +                               if ((p = strchr(buf, ','))) { 
    1588 +                                       p++; 
    1589 +                                       smsi = atoi(p); 
    1590 +                                       if (smsi > 0) { 
    1591 +                                               snprintf(buf, sizeof(buf), "AT+CMGR=%d\r", smsi); 
    1592 +                                               rfcomm_write(pvt, buf); 
    1593 +                                               pvt->state = MBL_STATE_INSMS; 
    1594 +                                       } 
    1595 +                               } 
    1596 +                       } 
    1597 + 
    1598 +               } else if (s == 0) { /* Timeouts */ 
    1599 +                       if (pvt->state == MBL_STATE_INIT2) { /* Some devices dont respond to AT+CIND? properly. RIM Blackberry 4 example */ 
    1600 +                               pvt->state++; 
    1601 +                               rfcomm_write(pvt, "AT+CMER=3,0,0,1\r"); 
    1602 +                       } else if (pvt->state == MBL_STATE_INIT3) { /* Some devices dont respond to AT+CMER=3,0,0,1 properly. VK 2020 for example */ 
    1603 +                               pvt->state++; 
    1604 +                               rfcomm_write(pvt, "AT+CLIP=1\r"); 
    1605 +                       } else if (pvt->state == MBL_STATE_PREIDLE) { 
    1606 +                               pvt->connected = 1; 
    1607 +                               ast_verbose(VERBOSE_PREFIX_3 "Bluetooth Device %s initialised and ready.\n", pvt->id); 
    1608 +                               pvt->state = MBL_STATE_IDLE; 
    1609 +                       } else if (pvt->state == MBL_STATE_DIAL) { 
    1610 +                               snprintf(buf, sizeof(buf), "ATD%s;\r", pvt->dial_number); 
    1611 +                               if (!rfcomm_write(pvt, buf)) { 
    1612 +                                       ast_log(LOG_ERROR, "Dial failed on %s state %d\n", pvt->owner->name, pvt->state); 
    1613 +                                       ast_queue_control(pvt->owner, AST_CONTROL_CONGESTION); 
    1614 +                                       pvt->state = MBL_STATE_IDLE; 
    1615 +                               } else { 
    1616 +                                       pvt->state = MBL_STATE_DIAL1; 
    1617 +                               } 
    1618 +                       } else if (pvt->state == MBL_STATE_DIAL1) { 
    1619 +                               ast_log(LOG_ERROR, "Dial failed on %s state %d\n", pvt->owner->name, pvt->state); 
    1620 +                               ast_queue_control(pvt->owner, AST_CONTROL_CONGESTION); 
    1621 +                               ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1622 +                               pvt->state = MBL_STATE_IDLE; 
    1623 +                       } else if (pvt->state == MBL_STATE_RING) { /* No CLIP?, bump it */ 
    1624 +                               pvt->state = MBL_STATE_RING2; 
    1625 +                       } else if (pvt->state == MBL_STATE_HANGUP) { 
    1626 +                               if (pvt->do_hangup) { 
    1627 +                                       if (pvt->hangup_count == 6) { 
    1628 +                                               ast_log(LOG_DEBUG, "Device %s failed to hangup after 6 tries, disconnecting.\n", pvt->id); 
    1629 +                                               monitor = 0; 
    1630 +                                       } 
    1631 +                                       rfcomm_write(pvt, "AT+CHUP\r"); 
    1632 +                                       pvt->hangup_count++; 
    1633 +                               } else 
    1634 +                                       pvt->state = MBL_STATE_IDLE; 
    1635 +                       } else if (pvt->state == MBL_STATE_OUTSMS) { 
    1636 +                               snprintf(buf, sizeof(buf), "AT+CMGS=\"%s\"\r", pvt->dial_number); 
    1637 +                               rfcomm_write(pvt, buf); 
    1638 +                               pvt->state = MBL_STATE_OUTSMS1; 
    1639 +                       } else if (pvt->state == MBL_STATE_OUTSMS1) { 
    1640 +                               if (pvt->rfcomm_buf[0] == '>') { 
    1641 +                                       snprintf(buf, sizeof(buf), "%s%c", pvt->sms_txt, 0x1a); 
    1642 +                                       rfcomm_write(pvt, buf); 
    1643 +                                       pvt->state = MBL_STATE_OUTSMS2; 
    1644 +                               } else { 
    1645 +                                       ast_log(LOG_ERROR, "Failed to send SMS to %s on device %s\n", pvt->dial_number, pvt->id); 
    1646 +                                       pvt->state = MBL_STATE_IDLE; 
    1647 +                               } 
    1648 +                       } else if (pvt->state == MBL_STATE_OUTSMS2) { 
    1649 +                               ast_log(LOG_ERROR, "Failed to send SMS to %s on device %s\n", pvt->dial_number, pvt->id); 
    1650 +                               pvt->state = MBL_STATE_IDLE; 
    1651 +                       } 
    1652 +               } else if (s == -1) { 
    1653 +                       if (option_verbose > 2) 
    1654 +                               ast_verbose(VERBOSE_PREFIX_3  "Bluetooth Device %s has disconnected, reason (%d).\n", pvt->id, errno);  
    1655 +                       monitor = 0; 
    1656 +               } 
    1657 + 
    1658 +       } 
    1659 + 
    1660 +       if (pvt->rfcomm_socket > -1) 
    1661 +               close(pvt->rfcomm_socket); 
    1662 +       if (pvt->sco_socket > -1) 
    1663 +               close(pvt->sco_socket); 
    1664 +       pvt->sco_socket = -1; 
    1665 +       pvt->connected = 0; 
    1666 +       pvt->monitor_thread = AST_PTHREADT_NULL; 
    1667 + 
    1668 +       pthread_cancel(pvt->sco_listener_thread); 
    1669 +       pthread_join(pvt->sco_listener_thread, NULL); 
    1670 +       pvt->sco_listener_thread = AST_PTHREADT_NULL; 
    1671 + 
    1672 +       close(pvt->adapter->sco_socket); 
    1673 + 
    1674 +       manager_event(EVENT_FLAG_SYSTEM, "MobileStatus", "Status: Disconnect\r\nDevice: %s\r\n", pvt->id); 
    1675 + 
    1676 +       pvt->adapter->inuse = 0; 
    1677 + 
    1678 +       return NULL; 
    1679 + 
    1680 +} 
    1681 + 
    1682 +static void *do_monitor_headset(void *data) 
    1683 +{ 
    1684 + 
    1685 +       struct mbl_pvt *pvt = (struct mbl_pvt *)data; 
    1686 +       char monitor = 1; 
    1687 +       char buf[256]; 
    1688 +       int s, t; 
    1689 + 
    1690 +       pvt->state = MBL_STATE_PREIDLE; 
    1691 + 
    1692 +       while (monitor) { 
    1693 + 
    1694 +               if (pvt->state == MBL_STATE_RING2) 
    1695 +                       t = 2; 
    1696 +               else 
    1697 +                       t = 1; 
    1698 +               s = rfcomm_read(pvt, buf, 0, t); 
    1699 + 
    1700 +               if ((s > 0) && (buf[0] != 0x0) && (buf[0] != '\r')) { 
    1701 +                       ast_log(LOG_DEBUG, "rfcomm_read() (%s) [%s]\n", pvt->id, buf); 
    1702 +                       switch (pvt->state) { 
    1703 +                       case MBL_STATE_RING2: 
    1704 +                               if (strstr(buf, "AT+CKPD=")) { 
    1705 +                                       ast_queue_control(pvt->owner, AST_CONTROL_ANSWER); 
    1706 +                                       pvt->state = MBL_STATE_INCOMING; 
    1707 +                                       rfcomm_write(pvt, "\r\n+VGS=13\r\n"); 
    1708 +                                       rfcomm_write(pvt, "\r\n+VGM=13\r\n"); 
    1709 +                               } 
    1710 +                               break; 
    1711 +                       case MBL_STATE_INCOMING: 
    1712 +                               if (strstr(buf, "AT+CKPD=")) { 
    1713 +                                       ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1714 +                               } 
    1715 +                               break; 
    1716 +                       default: 
    1717 +                               break; 
    1718 +                       } 
    1719 +                       if (strstr(buf, "AT+VGS=")) { 
    1720 +                               rfcomm_write(pvt, "\r\nOK\r\n"); 
    1721 +                       } else if (strstr(buf, "AT+VGM=")) { 
    1722 +                               rfcomm_write(pvt, "\r\nOK\r\n"); 
    1723 +                       } 
    1724 +               } else if (s == 0) {    /* Timeouts */ 
    1725 +                       if (pvt->state == MBL_STATE_PREIDLE) { 
    1726 +                               pvt->connected = 1; 
    1727 +                               ast_verbose(VERBOSE_PREFIX_3 "Bluetooth Device %s initialised and ready.\n", pvt->id); 
    1728 +                               pvt->state = MBL_STATE_IDLE; 
    1729 +                       } else if (pvt->state == MBL_STATE_RING) { 
    1730 +                               pvt->sco_socket = sco_connect(pvt->adapter->addr, pvt->addr); 
    1731 +                               if (pvt->sco_socket > -1) { 
    1732 +                                       ast_setstate(pvt->owner, AST_STATE_RINGING); 
    1733 +                                       ast_queue_control(pvt->owner, AST_CONTROL_RINGING); 
    1734 +                                       pvt->state = MBL_STATE_RING2; 
    1735 +                               } else { 
    1736 +                                       ast_queue_control(pvt->owner, AST_CONTROL_HANGUP); 
    1737 +                               } 
    1738 +                       } else if (pvt->state == MBL_STATE_RING2) { 
    1739 +                               rfcomm_write(pvt, "\r\nRING\r\n"); 
    1740 +                       } 
    1741 +               } else if (s == -1) { 
    1742 +                       if (option_verbose > 2) 
    1743 +                               ast_verbose(VERBOSE_PREFIX_3  "Bluetooth Device %s has disconnected, reason (%d).\n", pvt->id, errno);  
    1744 +                       monitor = 0; 
    1745 +               } 
    1746 + 
    1747 +       } 
    1748 + 
    1749 +       if (pvt->rfcomm_socket > -1) 
    1750 +               close(pvt->rfcomm_socket); 
    1751 +       if (pvt->sco_socket > -1) 
    1752 +               close(pvt->sco_socket); 
    1753 +       pvt->sco_socket = -1; 
    1754 +       pvt->connected = 0; 
    1755 +       pvt->monitor_thread = AST_PTHREADT_NULL; 
    1756 + 
    1757 +       manager_event(EVENT_FLAG_SYSTEM, "MobileStatus", "Status: Disconnect\r\nDevice: %s\r\n", pvt->id); 
    1758 + 
    1759 +       pvt->adapter->inuse = 0; 
    1760 + 
    1761 +       return NULL; 
    1762 + 
    1763 +} 
    1764 + 
    1765 +static int start_monitor(struct mbl_pvt *pvt) 
    1766 +{ 
    1767 + 
    1768 +       if (pvt->type == MBL_TYPE_PHONE) { 
    1769 +               if (ast_pthread_create_background(&pvt->monitor_thread, NULL, do_monitor_phone, pvt) < 0) { 
    1770 +                       pvt->monitor_thread = AST_PTHREADT_NULL; 
    1771 +                       return 0; 
    1772 +               } 
    1773 +               /* we are a phone, so spin the sco listener on the adapter as well */ 
    1774 +               if (ast_pthread_create_background(&pvt->sco_listener_thread, NULL, do_sco_listen, pvt->adapter) < 0) { 
    1775 +                       ast_log(LOG_ERROR, "Unable to create sco listener thread for device %s.\n", pvt->id); 
    1776 +               } 
    1777 + 
    1778 +       } else { 
    1779 +               if (ast_pthread_create_background(&pvt->monitor_thread, NULL, do_monitor_headset, pvt) < 0) { 
    1780 +                       pvt->monitor_thread = AST_PTHREADT_NULL; 
    1781 +                       return 0; 
    1782 +               } 
    1783 +       } 
    1784 + 
    1785 +       return 1; 
    1786 + 
    1787 +} 
    1788 + 
    1789 +static void *do_discovery(void *data) 
    1790 +{ 
    1791 + 
    1792 +       struct adapter_pvt *adapter; 
    1793 +       struct mbl_pvt *pvt; 
    1794 + 
    1795 +       for (;;) { 
    1796 +               AST_RWLIST_RDLOCK(&adapters); 
    1797 +               AST_RWLIST_TRAVERSE(&adapters, adapter, entry) { 
    1798 +                       if (!adapter->inuse) { 
    1799 +                               AST_RWLIST_RDLOCK(&devices); 
    1800 +                               AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    1801 +                                       if (!adapter->inuse && !pvt->connected && !strcmp(adapter->id, pvt->adapter->id)) { 
    1802 +                                               if ((pvt->rfcomm_socket = rfcomm_connect(adapter->addr, pvt->addr, pvt->rfcomm_port)) > -1) { 
    1803 +                                                       pvt->state = 0; 
    1804 +                                                       if (start_monitor(pvt)) { 
    1805 +                                                               pvt->connected = 1; 
    1806 +                                                               adapter->inuse = 1; 
    1807 +                                                               manager_event(EVENT_FLAG_SYSTEM, "MobileStatus", "Status: Connect\r\nDevice: %s\r\n", pvt->id); 
    1808 +                                                               if (option_verbose > 2) 
    1809 +                                                                       ast_verbose(VERBOSE_PREFIX_3 "Bluetooth Device %s has connected.\n", pvt->id); 
    1810 +                                                       } 
    1811 +                                               } 
    1812 +                                       } 
    1813 +                               } 
    1814 +                               AST_RWLIST_UNLOCK(&devices); 
    1815 +                       } 
    1816 +               } 
    1817 +               AST_RWLIST_UNLOCK(&adapters); 
    1818 +               /* Go to sleep */ 
    1819 +               sleep(discovery_interval); 
    1820 +       } 
    1821 + 
    1822 +       return NULL; 
    1823 +} 
    1824 + 
    1825 +static void *do_sco_listen(void *data) 
    1826 +{ 
    1827 + 
    1828 +       int ns; 
    1829 +       struct sockaddr_sco addr; 
    1830 +       char saddr[18]; 
    1831 +       struct sco_options so; 
    1832 +       socklen_t len; 
    1833 +       int opt = 1; 
    1834 +       socklen_t addrlen; 
    1835 +       struct mbl_pvt *pvt; 
    1836 +       struct adapter_pvt *adapter = (struct adapter_pvt *) data; 
    1837 + 
    1838 +       if ((adapter->sco_socket = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0) { 
    1839 +               ast_log(LOG_ERROR, "Unable to create sco listener socket.\n"); 
    1840 +               return NULL; 
    1841 +       } 
    1842 +       memset(&addr, 0, sizeof(addr)); 
    1843 +       addr.sco_family = AF_BLUETOOTH; 
    1844 +       bacpy(&addr.sco_bdaddr, &adapter->addr); 
    1845 +       if (bind(adapter->sco_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 
    1846 +               ast_log(LOG_ERROR, "Unable to bind sco listener socket. (%d)\n", errno); 
    1847 +               close(adapter->sco_socket); 
    1848 +               return NULL; 
    1849 +       } 
    1850 +       if (setsockopt(adapter->sco_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1) { 
    1851 +               ast_log(LOG_ERROR, "Unable to setsockopt sco listener socket.\n"); 
    1852 +               close(adapter->sco_socket); 
    1853 +               return NULL; 
    1854 +       } 
    1855 +       if (listen(adapter->sco_socket, 5) < 0) { 
    1856 +               ast_log(LOG_ERROR, "Unable to listen sco listener socket.\n"); 
    1857 +               close(adapter->sco_socket); 
    1858 +               return NULL; 
    1859 +       } 
    1860 +       while (1) { 
    1861 +               ast_log(LOG_DEBUG, "About to accept() socket.\n"); 
    1862 +               addrlen = sizeof(struct sockaddr_sco); 
    1863 +               if ((ns = accept(adapter->sco_socket, (struct sockaddr *)&addr, &addrlen)) > -1) { 
    1864 +                       ast_log(LOG_DEBUG, "accept()ed socket.\n"); 
    1865 +                       len = sizeof(so); 
    1866 +                       getsockopt(ns, SOL_SCO, SCO_OPTIONS, &so, &len); 
    1867 + 
    1868 +                       ba2str(&addr.sco_bdaddr, saddr); 
    1869 +                       ast_log(LOG_DEBUG, "Incoming Audio Connection from device %s MTU is %d\n", saddr, so.mtu); 
    1870 + 
    1871 +                       pvt = NULL; 
    1872 +                       AST_RWLIST_RDLOCK(&devices); 
    1873 +                       AST_RWLIST_TRAVERSE(&devices, pvt, entry) { 
    1874 +                               if (!bacmp(&pvt->addr, &addr.sco_bdaddr))  
    1875 +                                       break; 
    1876 +                       } 
    1877 +                       AST_RWLIST_UNLOCK(&devices); 
    1878 +                       if (pvt) { 
    1879 +                               if (pvt->sco_socket != -1) 
    1880 +                                       close(pvt->sco_socket); 
    1881 +                               pvt->sco_socket = ns; 
    1882 +                       } else 
    1883 +                               ast_log(LOG_DEBUG, "Could not find device for incoming Audio Connection.\n"); 
    1884 +               } else { 
    1885 +                        ast_log(LOG_ERROR, "accept() failed %d\n", errno); 
    1886 +               } 
    1887 +       } 
    1888 + 
    1889 +       return NULL; 
    1890 + 
    1891 +} 
    1892 + 
    1893 +/* 
    1894 + 
    1895 +       Module 
    1896 + 
    1897 +*/ 
    1898 + 
    1899 +static int mbl_load_config(void) 
    1900 +{ 
    1901 + 
    1902 +       struct ast_config *cfg = NULL; 
    1903 +       char *cat = NULL; 
    1904 +       struct ast_variable *var; 
    1905 +       const char *id, *address, *useadapter, *port, *context, *type, *skip, *group, *master, *nocallsetup, *aligndetect, *blackberry; 
    1906 +       struct mbl_pvt *pvt; 
    1907 +       struct adapter_pvt *adapter; 
    1908 +       uint16_t vs; 
    1909 +       struct hci_dev_req dr; 
    1910 +       char nadapters = 0; 
    1911 +       // struct ast_flags config_flags = { 0 }; 
    1912 + 
    1913 +       cfg = ast_config_load(MBL_CONFIG); 
    1914 +       if (!cfg) 
    1915 +               return 0; 
    1916 + 
    1917 +       for (var = ast_variable_browse(cfg, "general"); var; var = var->next) { 
    1918 +               if (!strcasecmp(var->name, "interval")) 
    1919 +                       discovery_interval = atoi(var->value); 
    1920 +       } 
    1921 + 
    1922 +       /* load adapters first */ 
    1923 +       cat = ast_category_browse(cfg, NULL); 
    1924 +       while (cat) { 
    1925 +               if (!strcasecmp(cat, "adapter")) { 
    1926 +                       id = ast_variable_retrieve(cfg, cat, "id"); 
    1927 +                       address = ast_variable_retrieve(cfg, cat, "address"); 
    1928 +                       master = ast_variable_retrieve(cfg, cat, "forcemaster"); 
    1929 +                       aligndetect = ast_variable_retrieve(cfg, cat, "alignmentdetection"); 
    1930 +                       ast_log(LOG_DEBUG, "Loading adapter %s %s.\n", id, address); 
    1931 +                       if (!ast_strlen_zero(id) && !ast_strlen_zero(address)) { 
    1932 +                               if ((adapter = ast_calloc(1, sizeof(*adapter)))) { 
    1933 +                                       ast_copy_string(adapter->id, id, sizeof(adapter->id)); 
    1934 +                                       str2ba(address, &adapter->addr); 
    1935 +                                       if (!ast_strlen_zero(aligndetect)) { 
    1936 +                                               if (*aligndetect == 'Y' || *aligndetect == 'y') 
    1937 +                                                       adapter->alignment_detection = 1; 
    1938 +                                       } 
    1939 +                                       adapter->dev_id = hci_devid(address); 
    1940 +                                       adapter->hci_socket = hci_open_dev(adapter->dev_id); 
    1941 +                                       if (adapter->dev_id < 0 || adapter->hci_socket < 0) { 
    1942 +                                               ast_log(LOG_ERROR, "Unable to open adapter %s. It won't be enabled.\n", adapter->id); 
    1943 +                                               ast_free(adapter); 
    1944 +                                       } else { 
    1945 +                                               if ((master) && (*master)) { 
    1946 +                                                       dr.dev_id = adapter->dev_id; 
    1947 +                                                       if (hci_strtolm("master", &dr.dev_opt)) { 
    1948 +                                                               if (ioctl(adapter->hci_socket, HCISETLINKMODE, (unsigned long) &dr) < 0) { 
    1949 +                                                                       ast_log(LOG_WARNING, "Unable to set adapter %s link mode to MASTER.\n", adapter->id); 
    1950 +                                                               } 
    1951 +                                                       } 
    1952 +                                               } 
    1953 +                                               hci_read_voice_setting(adapter->hci_socket, &vs, 1000); 
    1954 +                                               vs = htobs(vs); 
    1955 +                                               if (vs != 0x0060) { 
    1956 +                                                       ast_log(LOG_ERROR, "Incorrect voice setting for adapter %s, it must be 0x0060 - see 'man hciconfig' for details.\n", adapter->id); 
    1957 +                                                       hci_close_dev(adapter->hci_socket); 
    1958 +                                                       ast_free(adapter); 
    1959 +                                               } else { 
    1960 +                                                       AST_RWLIST_WRLOCK(&adapters); 
    1961 +                                                       AST_RWLIST_INSERT_HEAD(&adapters, adapter, entry); 
    1962 +                                                       AST_RWLIST_UNLOCK(&adapters); 
    1963 +                                                       nadapters++; 
    1964 +                                               } 
    1965 +                                       } 
    1966 +                               } 
    1967 +                       } else 
    1968 +                               ast_log(LOG_ERROR, "id/address missing for adapter %s. It won't be enabled.\n", cat); 
    1969 +               } 
    1970 +               cat = ast_category_browse(cfg, cat); 
    1971 +       } 
    1972 + 
    1973 +       if (!nadapters) { 
    1974 +               ast_log(LOG_WARNING, "***********************************************************************\n"); 
    1975 +               ast_log(LOG_WARNING, "No Adapters defined. Please review mobile.conf. See sample for details.\n"); 
    1976 +               ast_log(LOG_WARNING, "***********************************************************************\n"); 
    1977 +       } 
    1978 + 
    1979 +       /* now load devices */ 
    1980 +       cat = ast_category_browse(cfg, NULL); 
    1981 +       while (cat) { 
    1982 +               if (strcasecmp(cat, "general") && strcasecmp(cat, "adapter")) { 
    1983 +                       ast_log(LOG_DEBUG, "Loading device %s.\n", cat); 
    1984 +                       address = ast_variable_retrieve(cfg, cat, "address"); 
    1985 +                       useadapter = ast_variable_retrieve(cfg, cat, "adapter"); 
    1986 +                       port = ast_variable_retrieve(cfg, cat, "port"); 
    1987 +                       context = ast_variable_retrieve(cfg, cat, "context"); 
    1988 +                       type = ast_variable_retrieve(cfg, cat, "type"); 
    1989 +                       skip = ast_variable_retrieve(cfg, cat, "dtmfskip"); 
    1990 +                       group = ast_variable_retrieve(cfg, cat, "group"); 
    1991 +                       nocallsetup = ast_variable_retrieve(cfg, cat, "nocallsetup"); 
    1992 +                       blackberry = ast_variable_retrieve(cfg, cat, "blackberry"); 
    1993 +                       if (!ast_strlen_zero(address) && !ast_strlen_zero(port) && !ast_strlen_zero(useadapter)) { 
    1994 +                               /* find the adapter */ 
    1995 +                               AST_RWLIST_RDLOCK(&adapters); 
    1996 +                               AST_RWLIST_TRAVERSE(&adapters, adapter, entry) { 
    1997 +                                       if (!strcmp(adapter->id, useadapter)) 
    1998 +                                               break; 
    1999 +                               } 
    2000 +                               AST_RWLIST_UNLOCK(&adapters); 
    2001 +                               if (!adapter) { 
    2002 +                                       ast_log(LOG_ERROR, "Device %s configured to use unknown adapter %s. It won't be enabled.\n", cat, useadapter); 
    2003 +                                       break; 
    2004 +                               } 
    2005 +                               if ((pvt = ast_calloc(1, sizeof(*pvt)))) { 
    2006 +                                       if (type && !strcmp(type, "headset")) 
    2007 +                                               pvt->type = MBL_TYPE_HEADSET; 
    2008 +                                       else 
    2009 +                                               pvt->type = MBL_TYPE_PHONE; 
    2010 + 
    2011 +                                       if (blackberry) 
    2012 +                                               pvt->blackberry = ast_true(blackberry); 
    2013 + 
    2014 +                                       ast_copy_string(pvt->id, cat, sizeof(pvt->id)); 
    2015 +                                       str2ba(address, &pvt->addr); 
    2016 +                                       ast_copy_string(pvt->context, S_OR(context, "default"), sizeof(pvt->context)); 
    2017 +                                       if (group) 
    2018 +                                               pvt->group = atoi(group);       /* group 0 if invalid */ 
    2019 +                                       pvt->state = MBL_STATE_INIT; 
    2020 +                                       pvt->rfcomm_socket = -1; 
    2021 +                                       pvt->rfcomm_port = atoi(port); 
    2022 +                                       pvt->sco_socket = -1; 
    2023 +                                       pvt->monitor_thread = AST_PTHREADT_NULL; 
    2024 +                                       pvt->sco_listener_thread = AST_PTHREADT_NULL; 
    2025 +                                       if (!ast_strlen_zero(nocallsetup)) { 
    2026 +                                               if ((*nocallsetup == 'y') || (*nocallsetup == 'Y')) { 
    2027 +                                                       pvt->no_callsetup = 1; 
    2028 +                                                       ast_log(LOG_DEBUG, "Setting nocallsetup mode for device %s.\n", pvt->id); 
    2029 +                                               } 
    2030 +                                       } 
    2031 +                                       pvt->dsp = ast_dsp_new(); 
    2032 +                                       if (skip) { 
    2033 +                                               if ((pvt->dtmf_skip = atoi(skip)) == 0) 
    2034 +                                                       pvt->dtmf_skip = 200; 
    2035 +                                       } else 
    2036 +                                               pvt->dtmf_skip = 200; 
    2037 +                                       ast_dsp_set_features(pvt->dsp, DSP_FEATURE_DTMF_DETECT); 
    2038 +                                       ast_dsp_digitmode(pvt->dsp, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF); 
    2039 +                                       pvt->adapter = adapter; 
    2040 +                                       AST_RWLIST_WRLOCK(&devices); 
    2041 +                                       AST_RWLIST_INSERT_HEAD(&devices, pvt, entry); 
    2042 +                                       AST_RWLIST_UNLOCK(&devices); 
    2043 +                               } 
    2044 +                       } else { 
    2045 +                               ast_log(LOG_ERROR, "Device %s has no address/port/adapter configured. It won't be enabled.\n", cat); 
    2046 +                       } 
    2047 +               } 
    2048 +               cat = ast_category_browse(cfg, cat); 
    2049 +       } 
    2050 + 
    2051 +       ast_config_destroy(cfg); 
    2052 + 
    2053 +       return 1; 
    2054 + 
    2055 +} 
    2056 + 
    2057 +static int unload_module(void) 
    2058 +{ 
    2059 + 
    2060 +       struct mbl_pvt *pvt; 
    2061 +       struct adapter_pvt *adapter; 
    2062 + 
    2063 +       /* First, take us out of the channel loop */ 
    2064 +       ast_channel_unregister(&mbl_tech); 
    2065 + 
    2066 +       /* Kill the discovery thread */ 
    2067 +       if (discovery_thread != AST_PTHREADT_NULL) { 
    2068 +               pthread_cancel(discovery_thread); 
    2069 +               pthread_join(discovery_thread, NULL); 
    2070 +       } 
    2071 + 
    2072 +       /* Destroy the device list */ 
    2073 +       AST_RWLIST_WRLOCK(&devices); 
    2074 +       while ((pvt = AST_RWLIST_REMOVE_HEAD(&devices, entry))) { 
    2075 +               if (pvt->monitor_thread != AST_PTHREADT_NULL) { 
    2076 +                       pthread_cancel(pvt->monitor_thread); 
    2077 +                       pthread_join(pvt->monitor_thread, NULL); 
    2078 +               } 
    2079 +               if (pvt->sco_listener_thread != AST_PTHREADT_NULL) { 
    2080 +                       pthread_cancel(pvt->sco_listener_thread); 
    2081 +                       pthread_join(pvt->sco_listener_thread, NULL); 
    2082 +               } 
    2083 +               if (pvt->sco_socket > -1) { 
    2084 +                       close(pvt->sco_socket); 
    2085 +               } 
    2086 +               if (pvt->adapter->sco_socket > -1) { 
    2087 +                       close(pvt->adapter->sco_socket); 
    2088 +               } 
    2089 +               if (pvt->rfcomm_socket > -1) { 
    2090 +                       close(pvt->rfcomm_socket); 
    2091 +               } 
    2092 +               ast_dsp_free(pvt->dsp); 
    2093 +               ast_free(pvt); 
    2094 +       } 
    2095 +       AST_RWLIST_UNLOCK(&devices); 
    2096 + 
    2097 +       /* Destroy the adapter list */ 
    2098 +       AST_RWLIST_WRLOCK(&adapters); 
    2099 +       while ((adapter = AST_RWLIST_REMOVE_HEAD(&adapters, entry))) { 
    2100 +               hci_close_dev(adapter->hci_socket); 
    2101 +               ast_free(adapter); 
    2102 +       } 
    2103 +       AST_RWLIST_UNLOCK(&adapters); 
    2104 + 
    2105 +       if (sdp_session) 
    2106 +               sdp_close(sdp_session); 
    2107 + 
    2108 +       /* Unregister the CLI & APP */ 
    2109 +       ast_cli_unregister_multiple(mbl_cli, sizeof(mbl_cli) / sizeof(mbl_cli[0])); 
    2110 +       ast_unregister_application(app_mblstatus); 
    2111 +       ast_unregister_application(app_mblsendsms); 
    2112 + 
    2113 +       return 0; 
    2114 + 
    2115 +} 
    2116 + 
    2117 +static int load_module(void) 
    2118 +{ 
    2119 + 
    2120 +       int dev_id, s; 
    2121 + 
    2122 +       /* Check if we have Bluetooth, no point loading otherwise... */ 
    2123 +       dev_id = hci_get_route(NULL); 
    2124 +       s = hci_open_dev(dev_id); 
    2125 +       if (dev_id < 0 || s < 0) { 
    2126 +               ast_log(LOG_ERROR, "No Bluetooth device found. Not loading module.\n"); 
    2127 +               return AST_MODULE_LOAD_DECLINE; 
    2128 +       } 
    2129 + 
    2130 +       hci_close_dev(s); 
    2131 + 
    2132 +       if (!mbl_load_config()) { 
    2133 +               ast_log(LOG_ERROR, "Unable to read config file %s. Not loading module.\n", MBL_CONFIG); 
    2134 +               return AST_MODULE_LOAD_DECLINE; 
    2135 +       } 
    2136 + 
    2137 +       sdp_session = sdp_register(); 
    2138 + 
    2139 +       /* Spin the discovery thread */ 
    2140 +       if (ast_pthread_create_background(&discovery_thread, NULL, do_discovery, NULL) < 0) { 
    2141 +               ast_log(LOG_ERROR, "Unable to create discovery thread.\n"); 
    2142 +               return AST_MODULE_LOAD_DECLINE; 
    2143 +       } 
    2144 + 
    2145 +       ast_cli_register_multiple(mbl_cli, sizeof(mbl_cli) / sizeof(mbl_cli[0])); 
    2146 +       ast_register_application(app_mblstatus, mbl_status_exec, mblstatus_synopsis, mblstatus_desc); 
    2147 +       ast_register_application(app_mblsendsms, mbl_sendsms_exec, mblsendsms_synopsis, mblsendsms_desc); 
    2148 + 
    2149 +       /* Make sure we can register our channel type */ 
    2150 +       if (ast_channel_register(&mbl_tech)) { 
    2151 +               ast_log(LOG_ERROR, "Unable to register channel class %s\n", "Mobile"); 
    2152 +               return AST_MODULE_LOAD_FAILURE; 
    2153 +       } 
    2154 + 
    2155 +       return 0; 
    2156 +} 
    2157 + 
    2158 +AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Bluetooth Mobile Device Channel Driver", 
    2159 +               .load = load_module, 
    2160 +               .unload = unload_module, 
    2161 +); 
    2162 diff -Nru asterisk-addons-1.4.8.org/configs/mobile.conf.sample asterisk-addons-1.4.8/configs/mobile.conf.sample 
    2163 --- asterisk-addons-1.4.8.org/configs/mobile.conf.sample        1970-01-01 01:00:00.000000000 +0100 
    2164 +++ asterisk-addons-1.4.8/configs/mobile.conf.sample    2009-06-04 22:20:03.000000000 +0200 
    2165 @@ -0,0 +1,68 @@ 
    2166 +; 
    2167 +; mobile.conf 
    2168 +; configuration file for chan_mobile 
    2169 +; 
    2170 + 
    2171 +[general] 
    2172 +interval=30            ; Number of seconds between trying to connect to devices.  
    2173 + 
    2174 +; The following is a list of adapters we use. 
    2175 +; id must be unique and address is the bdaddr of the adapter from hciconfig. 
    2176 +; Each adapter may only have one device (headset or phone) connected at a time. 
    2177 +; Add an [adapter] entry for each adapter you have. 
    2178 + 
    2179 +[adapter] 
    2180 +id=blue 
    2181 +address=00:09:DD:60:01:A3 
    2182 +;forcemaster=yes       ; attempt to force adapter into master mode. default is no. 
    2183 +;alignmentdetection=yes ; enable this if you sometimes get 'white noise' on asterisk side of the call 
    2184 +                       ; its a bug in the bluetooth adapter firmware, enabling this will compensate for it. 
    2185 +                       ; default is no. 
    2186 + 
    2187 +[adapter] 
    2188 +id=dlink 
    2189 +address=00:80:C8:35:52:78 
    2190 + 
    2191 +; The following is a list of the devices we deal with. 
    2192 +; Every device listed below will be available for calls in and out of Asterisk.  
    2193 +; Each device needs an adapter=xxxx entry which determines which bluetooth adapter is used. 
    2194 +; Use the CLI command 'mobile search' to discover devices. 
    2195 +; Use the CLI command 'mobile show devices' to see device status. 
    2196 +; 
    2197 +; To place a call out through a mobile phone use Dial(Mobile/[device]/NNN.....) or Dial(Mobile/gn/NNN......) in your dialplan. 
    2198 +; To call a headset use Dial(Mobile/[device]). 
    2199 + 
    2200 +[LGTU550] 
    2201 +address=00:E0:91:7F:46:44      ; the address of the phone 
    2202 +port=4                         ; the rfcomm port number (from mobile search) 
    2203 +context=incoming-mobile                ; dialplan context for incoming calls 
    2204 +adapter=dlink                  ; adapter to use 
    2205 +group=1                                ; this phone is in channel group 1 
    2206 +;nocallsetup=yes               ; set this only if your phone reports that it supports call progress notification, but does not do it. Motorola L6 for example. 
    2207 + 
    2208 +[blackberry] 
    2209 +address=00:60:57:32:7E:B2 
    2210 +port=2 
    2211 +context=incoming-mobile 
    2212 +adapter=dlink 
    2213 +group=1 
    2214 +;blackberry=yes                        ; set this if you are using a blackberry device 
    2215 + 
    2216 +[6310i] 
    2217 +address=00:60:57:32:7E:B1 
    2218 +port=13 
    2219 +context=incoming-mobile 
    2220 +adapter=dlink 
    2221 +group=1                                ; this phone is in channel group 1 also. 
    2222 + 
    2223 +[headset] 
    2224 +address=00:0B:9E:11:AE:C6 
    2225 +port=1 
    2226 +type=headset                   ; This is a headset, not a Phone ! 
    2227 +adapter=blue 
    2228 + 
    2229 +[headset1] 
    2230 +address=00:0B:9E:11:74:A5 
    2231 +port=1 
    2232 +type=headset 
    2233 +adapter=dlink 
    2234 diff -Nru asterisk-addons-1.4.8.org/configure.ac asterisk-addons-1.4.8/configure.ac 
    2235 --- asterisk-addons-1.4.8.org/configure.ac      2008-02-13 23:58:11.000000000 +0100 
    2236 +++ asterisk-addons-1.4.8/configure.ac  2009-06-04 22:20:03.000000000 +0200 
    2237 @@ -161,11 +161,13 @@ 
    2238  # from here on down, library checking should be done in alphabetical order 
    2239  # by the --with option name, to make things easier for the users :-) 
    2240   
    2241 +AST_EXT_LIB_SETUP([BLUETOOTH], [Bluetooth Support], [bluetooth]) 
    2242  AST_EXT_LIB_SETUP([CURSES], [curses], [curses]) 
    2243  AST_EXT_LIB_SETUP([NCURSES], [ncurses], [ncurses]) 
    2244  AST_EXT_LIB_SETUP([MYSQLCLIENT], [mysqlclient], [mysqlclient]) 
    2245  AST_EXT_LIB_SETUP([ASTERISK], [asterisk], [asterisk]) 
    2246   
    2247 +AST_EXT_LIB_CHECK([BLUETOOTH], [bluetooth], [ba2str], [bluetooth/bluetooth.h]) 
    2248  AST_EXT_LIB_CHECK([CURSES], [curses], [initscr], [curses.h]) 
    2249   
    2250  AST_EXT_LIB_CHECK([NCURSES], [ncurses], [initscr], [curses.h]) 
    2251 diff -Nru asterisk-addons-1.4.8.org/makeopts.in asterisk-addons-1.4.8/makeopts.in 
    2252 --- asterisk-addons-1.4.8.org/makeopts.in       2008-02-13 23:58:11.000000000 +0100 
    2253 +++ asterisk-addons-1.4.8/makeopts.in   2009-06-04 22:20:03.000000000 +0200 
    2254 @@ -34,6 +34,9 @@ 
    2255  sharedstatedir = @sharedstatedir@ 
    2256  sysconfdir = @sysconfdir@ 
    2257   
    2258 +BLUETOOTH_LIB=@BLUETOOTH_LIB@ 
    2259 +BLUETOOTH_INCLUDE=@BLUETOOTH_INCLUDE@ 
    2260 + 
    2261  CURSES_LIB=@CURSES_LIB@ 
    2262  CURSES_INCLUDE=@CURSES_INCLUDE@ 
    2263   
  • asterisk-addons-1.4.x/Makefile

     
    1 # 
    2 # Copyright (C) 2007 OpenWrt.org 
    3 # 
    4 # This is free software, licensed under the GNU General Public License v2. 
    5 # See /LICENSE for more information. 
    6 # 
    7  
    8 include $(TOPDIR)/rules.mk 
    9  
    10 PKG_NAME:=asterisk-addons 
    11 PKG_VERSION:=1.4.8 
    12 PKG_RELEASE:=1 
    13  
    14 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 
    15 PKG_SOURCE_URL:=http://downloads.digium.com/pub/asterisk/releases/ 
    16 PKG_MD5SUM:=d4e75c39f737b5ba2a75a4420e1a5a78 
    17  
    18 PKG_FIXUP = libtool 
    19  
    20 include $(INCLUDE_DIR)/package.mk 
    21  
    22 define Package/asterisk-addons/Default 
    23   SUBMENU:=asterisk14 (Complete Open Source PBX), v1.4.x 
    24   SECTION:=net 
    25   CATEGORY:=Network 
    26   TITLE:=Asterisk addons 
    27   URL:=http://www.asterisk.org/ 
    28   MAINTAINER:=Hans Zandbelt <hans.zandbelt@gmail.com> 
    29 endef 
    30  
    31 define Package/asterisk-addons/Default/description 
    32  Asterisk addons contains additional modules for Asterisk which are, for  
    33  one reason or another, not included in the normal base distribution. 
    34 endef 
    35  
    36  
    37 define Package/asterisk14-chan-mobile 
    38 $(call Package/asterisk-addons/Default) 
    39   DEPENDS:= +asterisk14 +bluez-libs 
    40   TITLE+= Mobile channel support 
    41 endef 
    42  
    43 define Package/asterisk14-chan-mobile/description 
    44 $(call Package/asterisk-addons/Default/description) 
    45  This package contains the chan_mobile module for Asterisk. 
    46 endef 
    47  
    48  
    49 define Package/asterisk14-chan-ooh323 
    50 $(call Package/asterisk-addons/Default) 
    51   DEPENDS:= +asterisk14 
    52   TITLE+= OO H.323 channel support 
    53 endef 
    54  
    55 define Package/asterisk14-chan-ooh323/description 
    56 $(call Package/asterisk-addons/Default/description) 
    57  This package contains the Objective Open H.323 support module for Asterisk. 
    58 endef 
    59  
    60  
    61 define Package/asterisk14-format-mp3 
    62 $(call Package/asterisk-addons/Default) 
    63   DEPENDS:= +asterisk14 
    64   TITLE+= MP3 format support 
    65 endef 
    66  
    67 define Package/asterisk14-format-mp3/description 
    68 $(call Package/asterisk-addons/Default/description) 
    69  This package contains the MP3 support module for Asterisk. 
    70 endef 
    71  
    72  
    73 define Package/asterisk14-mysql 
    74 $(call Package/asterisk-addons/Default) 
    75   DEPENDS:= +asterisk14 +libmysqlclient 
    76   TITLE+= MySQL support 
    77 endef 
    78  
    79 define Package/asterisk14-mysql/description 
    80 $(call Package/asterisk-addons/Default/description) 
    81  This package contains MySQL support modules for Asterisk. 
    82 endef 
    83  
    84  
    85 EXTRA_CFLAGS:=$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) 
    86 EXTRA_LDFLAGS:=$(TARGET_LDFLAGS) 
    87  
    88 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-mysql),) 
    89   EXTRA_CFLAGS+= -I$(STAGING_DIR)/usr/include/mysql 
    90   EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql 
    91 endif 
    92  
    93 CONFIGURE_ARGS += \ 
    94         --with-asterisk="$(STAGING_DIR)/usr" \ 
    95         --with-bluetooth="$(STAGING_DIR)/usr" \ 
    96         --with-ncurses="$(STAGING_DIR)/usr" \ 
    97         --with-mysqlclient="$(STAGING_DIR)/usr" \ 
    98  
    99 CONFIGURE_VARS += \ 
    100         ac_cv_file__usr_include_asterisk_channel_h="yes" \ 
    101  
    102 define Build/Configure 
    103         ( cd $(PKG_BUILD_DIR); ./bootstrap.sh ) 
    104         $(call Build/Configure/Default,,,) 
    105         $(call Build/Configure/Default,,,asterisk-ooh323c) 
    106 endef 
    107  
    108 # XXX: explanations 
    109 # - use AM_CFLAGS for asterisk-ooh323c 
    110 # - use OPTIMIZE & OPTIONS for format_mp3 
    111  
    112 MAKE_ARGS:= \ 
    113         AM_CFLAGS="$(TARGET_CFLAGS)" \ 
    114         OPTIMIZE="$(TARGET_CFLAGS) -DLOW_MEMORY" \ 
    115         OPTIONS="" \ 
    116         NOISY_BUILD="yes" \ 
    117         BLUETOOTH_LIB="$(TARGET_LDFLAGS) -lbluetooth" \ 
    118  
    119 MAKE_VARS:= \ 
    120         CFLAGS="$(EXTRA_CFLAGS)" \ 
    121         LDFLAGS="$(EXTRA_LDFLAGS)" \ 
    122  
    123 define Build/Compile 
    124         mkdir -p $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules 
    125         $(MAKE_VARS) \ 
    126         $(MAKE) -C "$(PKG_BUILD_DIR)" \ 
    127                 $(MAKE_ARGS) \ 
    128                 all 
    129         $(MAKE_VARS) \ 
    130         $(MAKE) -C "$(PKG_BUILD_DIR)" \ 
    131                 $(MAKE_ARGS) \ 
    132                 DESTDIR="$(PKG_INSTALL_DIR)" \ 
    133                 install samples 
    134 endef 
    135  
    136  
    137 define Package/asterisk14-chan-mobile/conffiles 
    138 /etc/asterisk/mobile.conf 
    139 endef 
    140  
    141 define Package/asterisk14-chan-mobile/install 
    142         $(INSTALL_DIR) $(1)/etc/asterisk 
    143         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/mobile.conf $(1)/etc/asterisk/ 
    144         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    145         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_mobile.so $(1)/usr/lib/asterisk/modules/ 
    146 endef 
    147  
    148  
    149 define Package/asterisk14-chan-ooh323/install 
    150         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    151         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_ooh323.so $(1)/usr/lib/asterisk/modules/ 
    152 endef 
    153  
    154  
    155 define Package/asterisk14-format-mp3/install 
    156         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    157         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/format_mp3.so $(1)/usr/lib/asterisk/modules/ 
    158 endef 
    159  
    160  
    161 define Package/asterisk14-mysql/conffiles 
    162 /etc/asterisk/cdr_mysql.conf 
    163 /etc/asterisk/res_mysql.conf 
    164 endef 
    165  
    166 define Package/asterisk14-mysql/install 
    167         $(INSTALL_DIR) $(1)/etc/asterisk 
    168         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/cdr_mysql.conf $(1)/etc/asterisk/ 
    169         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/res_mysql.conf $(1)/etc/asterisk/ 
    170         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    171         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_addon_sql_mysql.so $(1)/usr/lib/asterisk/modules/ 
    172         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/cdr_addon_mysql.so $(1)/usr/lib/asterisk/modules/ 
    173         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_config_mysql.so $(1)/usr/lib/asterisk/modules/ 
    174 endef 
    175  
    176  
    177 $(eval $(call BuildPackage,asterisk14-chan-mobile)) 
    178 $(eval $(call BuildPackage,asterisk14-chan-ooh323)) 
    179 $(eval $(call BuildPackage,asterisk14-format-mp3)) 
    180 $(eval $(call BuildPackage,asterisk14-mysql)) 
  • asterisk-1.4.x/files/asterisk.init

     
    1 #!/bin/sh /etc/rc.common 
    2 # Copyright (C) 2006 OpenWrt.org 
    3 START=50  
    4  
    5 DEST= 
    6 DEFAULT=$DEST/etc/default/asterisk 
    7 OPTIONS="" 
    8  
    9 start() { 
    10         [ -f $DEFAULT ] && . $DEFAULT 
    11         [ -d $DEST/var/run ] || mkdir -p $DEST/var/run 
    12         [ -d $DEST/var/log/asterisk ] || mkdir -p $DEST/var/log/asterisk 
    13         [ -d $DEST/var/spool/asterisk ] || mkdir -p $DEST/var/spool/asterisk 
    14         [ -d /var/spool/asterisk ] || mkdir -p /var/spool/asterisk 
    15         [ -h $DEST/usr/lib/asterisk/astdb ] || ln -sf /var/spool/asterisk/astdb $DEST/usr/lib/asterisk/astdb 
    16         $DEST/usr/sbin/asterisk $OPTIONS 
    17 } 
    18  
    19 stop() { 
    20         [ -f $DEST/var/run/asterisk.pid ] && kill $(cat $DEST/var/run/asterisk.pid) >/dev/null 2>&1 
    21 } 
  • asterisk-1.4.x/files/asterisk.default

     
    1 ## startup options for /etc/init.d/asterisk 
    2  
    3 ENABLE_ASTERISK="yes" 
    4 OPTIONS="" 
  • asterisk-1.4.x/files/modules.conf

     
    1 ; 
    2 ; Asterisk configuration file 
    3 ; 
    4 ; Module Loader configuration file 
    5 ; 
    6  
    7 [modules] 
    8 autoload=yes 
    9 ; 
    10 ; Any modules that need to be loaded before the Asterisk core has been 
    11 ; initialized (just after the logger has been initialized) can be loaded 
    12 ; using 'preload'. This will frequently be needed if you wish to map all 
    13 ; module configuration files into Realtime storage, since the Realtime 
    14 ; driver will need to be loaded before the modules using those configuration 
    15 ; files are initialized. 
    16 ; 
    17 ; An example of loading ODBC support would be: 
    18 ;preload => res_odbc.so 
    19 ;preload => res_config_odbc.so 
    20 ; 
    21 noload => res_config_mysql.so ; 
    22 noload => res_crypto.so ; Cryptographic Digital Signatures 
    23 ; load => res_features.so ; Call Parking Resource 
    24 noload => res_indications.so ; Indications Configuration 
    25 noload => res_monitor.so ; Call Monitoring Resource 
    26 ; load => res_musiconhold.so ; Music On Hold Resource 
    27 noload => cdr_csv.so ; Comma Separated Values CDR Backend 
    28 noload => cdr_custom.so ; Customizable Comma Separated Values CDR Backend 
    29 noload => cdr_manager.so ; Asterisk Call Manager CDR Backend 
    30 noload => cdr_mysql.so ; MySQL CDR Backend 
    31 noload => cdr_pgsql.so ; PostgreSQL CDR Backend 
    32 noload => cdr_sqlite.so ; SQLite CDR Backend 
    33 noload => chan_alsa.so ; Channel driver for GTalk 
    34 noload => chan_agent.so ; Agent Proxy Channel 
    35 noload => chan_gtalk.so ; Channel driver for GTalk 
    36 ; load => chan_iax2.so ; Inter Asterisk eXchange (Ver 2) 
    37 ; load => chan_local.so ; Local Proxy Channel 
    38 ; load => chan_sip.so ; Session Initiation Protocol (SIP) 
    39 noload => codec_a_mu.so ; A-law and Mulaw direct Coder/Decoder 
    40 noload => codec_adpcm.so ; Adaptive Differential PCM Coder/Decoder 
    41 noload => codec_alaw.so ; A-law Coder/Decoder 
    42 noload => codec_g726.so ; ITU G.726-32kbps G726 Transcoder 
    43 ; load => codec_gsm.so ; GSM/PCM16 (signed linear) Codec Translation 
    44 ; load => codec_ulaw.so ; Mu-law Coder/Decoder 
    45 noload => codec_speex.so ; Speex/PCM16 (signed linear) Codec Translator 
    46 noload => format_au.so ; Sun Microsystems AU format (signed linear) 
    47 noload => format_g723.so ; G.723.1 Simple Timestamp File Format 
    48 noload => format_g726.so ; Raw G.726 (16/24/32/40kbps) data 
    49 noload => format_g729.so ; Raw G729 data 
    50 ; load => format_gsm.so ; Raw GSM data 
    51 noload => format_h263.so ; Raw h263 data 
    52 noload => format_jpeg.so ; JPEG (Joint Picture Experts Group) Image 
    53 ; load => format_pcm.so ; Raw uLaw 8khz Audio support (PCM) 
    54 noload => format_pcm_alaw.so ; Raw aLaw 8khz PCM Audio support 
    55 noload => format_sln.so ; Raw Signed Linear Audio support (SLN) 
    56 noload => format_vox.so ; Dialogic VOX (ADPCM) File Format 
    57 ; load => format_wav.so ; Microsoft WAV format (8000hz Signed Line 
    58 ; load => format_wav_gsm.so ; Microsoft WAV format (Proprietary GSM) 
    59 noload => app_alarmreceiver.so ; Alarm Receiver Application 
    60 noload => app_authenticate.so ; Authentication Application 
    61 noload => app_cdr.so ; Make sure asterisk doesn't save CDR 
    62 noload => app_chanisavail.so ; Check if channel is available 
    63 noload => app_chanspy.so ; Listen in on any channel 
    64 noload => app_controlplayback.so ; Control Playback Application 
    65 noload => app_cut.so ; Cuts up variables 
    66 noload => app_db.so ; Database access functions 
    67 ; load => app_dial.so ; Dialing Application 
    68 noload => app_dictate.so ; Virtual Dictation Machine Application 
    69 noload => app_directory.so ; Extension Directory 
    70 noload => app_directed_pickup.so ; Directed Call Pickup Support 
    71 noload => app_disa.so ; DISA (Direct Inward System Access) Application 
    72 noload => app_dumpchan.so ; Dump channel variables Application 
    73 ; load => app_echo.so ; Simple Echo Application 
    74 noload => app_enumlookup.so ; ENUM Lookup 
    75 noload => app_eval.so ; Reevaluates strings 
    76 noload => app_exec.so ; Executes applications 
    77 noload => app_externalivr.so ; External IVR application interface 
    78 noload => app_forkcdr.so ; Fork The CDR into 2 seperate entities 
    79 noload => app_getcpeid.so ; Get ADSI CPE ID 
    80 noload => app_groupcount.so ; Group Management Routines 
    81 noload => app_ices.so ; Encode and Stream via icecast and ices 
    82 noload => app_image.so ; Image Transmission Application 
    83 noload => app_lookupblacklist.so ; Look up Caller*ID name/number from black 
    84 noload => app_lookupcidname.so ; Look up CallerID Name from local databas 
    85 ; load => app_macro.so ; Extension Macros 
    86 noload => app_math.so ; A simple math Application 
    87 noload => app_md5.so ; MD5 checksum Application 
    88 ; load => app_milliwatt.so ; Digital Milliwatt (mu-law) Test Application 
    89 noload => app_mixmonitor.so ; Record a call and mix the audio during the recording 
    90 noload => app_parkandannounce.so ; Call Parking and Announce Application 
    91 ; load => app_playback.so ; Trivial Playback Application 
    92 noload => app_privacy.so ; Require phone number to be entered 
    93 noload => app_queue.so ; True Call Queueing 
    94 noload => app_random.so ; Random goto 
    95 noload => app_read.so ; Read Variable Application 
    96 noload => app_readfile.so ; Read in a file 
    97 noload => app_realtime.so ; Realtime Data Lookup/Rewrite 
    98 noload => app_record.so ; Trivial Record Application 
    99 ; load => app_sayunixtime.so ; Say time 
    100 noload => app_senddtmf.so ; Send DTMF digits Application 
    101 noload => app_sendtext.so ; Send Text Applications 
    102 noload => app_setcallerid.so ; Set CallerID Application 
    103 noload => app_setcdruserfield.so ; CDR user field apps 
    104 noload => app_setcidname.so ; Set CallerID Name 
    105 noload => app_setcidnum.so ; Set CallerID Number 
    106 noload => app_setrdnis.so ; Set RDNIS Number 
    107 noload => app_settransfercapability.so ; Set ISDN Transfer Capability 
    108 noload => app_sms.so ; SMS/PSTN handler 
    109 noload => app_softhangup.so ; Hangs up the requested channel 
    110 noload => app_stack.so ; Stack Routines 
    111 noload => app_system.so ; Generic System() application 
    112 noload => app_talkdetect.so ; Playback with Talk Detection 
    113 noload => app_test.so ; Interface Test Application 
    114 noload => app_transfer.so ; Transfer 
    115 noload => app_txtcidname.so ; TXTCIDName 
    116 noload => app_url.so ; Send URL Applications 
    117 noload => app_userevent.so ; Custom User Event Application 
    118 ; load => app_verbose.so ; Send verbose output 
    119 noload => app_waitforring.so ; Waits until first ring after time 
    120 noload => app_waitforsilence.so ; Wait For Silence Application 
    121 noload => app_while.so ; While Loops and Conditional Execution 
    122 noload => func_callerid.so ; Caller ID related dialplan functions 
    123 noload => func_enum.so ; ENUM Functions 
    124 noload => func_uri.so ; URI encoding / decoding functions 
    125 noload => pbx_ael.so ; Asterisk Extension Language Compiler 
    126 ; load => pbx_config.so ; Text Extension Configuration 
    127 noload => pbx_functions.so ; Builtin dialplan functions 
    128 noload => pbx_loopback.so ; Loopback Switch 
    129 noload => pbx_realtime.so ; Realtime Switch 
    130 noload => pbx_spool.so ; Outgoing Spool Support 
    131 noload => pbx_wilcalu.so ; Wil Cal U (Auto Dialer) 
    132 ; 
    133 ; Module names listed in "global" section will have symbols globally 
    134 ; exported to modules loaded after them. 
    135 ; 
    136 [global] 
    137 chan_modem.so=no 
  • asterisk-1.4.x/patches/040-libgsm_avr32_fix.patch

     
    1 --- a/codecs/gsm/Makefile 
    2 +++ b/codecs/gsm/Makefile 
    3 @@ -38,7 +38,7 @@ WAV49 = -DWAV49 
    4  ######### probably require gcc.  
    5   
    6  ifeq (, $(findstring $(OSARCH) , Darwin SunOS )) 
    7 -ifeq (, $(findstring $(PROC) , x86_64 amd64 ultrasparc sparc64 arm armv5b armeb hppa2.0 ppc powerpc ppc64 ia64 s390 bfin mipsel mips)) 
    8 +ifeq (, $(findstring $(PROC) , x86_64 amd64 ultrasparc sparc64 arm armv5b armeb avr32 hppa2.0 ppc powerpc ppc64 ia64 s390 bfin mipsel mips)) 
    9  ifeq (, $(findstring $(shell uname -m) , ppc ppc64 alpha armv4l s390 )) 
    10  OPTIMIZE+=-march=$(PROC) 
    11  endif 
    12 @@ -209,7 +209,7 @@ GSM_SOURCES =       $(SRC)/add.c            \ 
    13  # XXX should merge with GSM_OBJECTS 
    14  ifeq ($(OSARCH),linux-gnu) 
    15  ifeq (,$(findstring $(shell uname -m) , x86_64 amd64 ppc ppc64 alpha armv4l sparc64 parisc s390 )) 
    16 -ifeq (,$(findstring $(PROC) , arm armv5b armeb powerpc ia64 s390 bfin mipsel mips )) 
    17 +ifeq (,$(findstring $(PROC) , arm armv5b armeb avr32 powerpc ia64 s390 bfin mipsel mips )) 
    18  GSM_SOURCES+= $(SRC)/k6opt.s 
    19  endif 
    20  endif 
    21 @@ -261,7 +261,7 @@ GSM_OBJECTS =       $(SRC)/add.o            \ 
    22   
    23  ifeq ($(OSARCH),linux-gnu) 
    24  ifeq (,$(findstring $(shell uname -m) , x86_64 amd64 ppc ppc64 alpha armv4l sparc64 parisc )) 
    25 -ifeq (,$(findstring $(PROC) , arm armv5b armeb powerpc ia64 bfin mipsel mips )) 
    26 +ifeq (,$(findstring $(PROC) , arm armv5b armeb avr32 powerpc ia64 bfin mipsel mips )) 
    27  GSM_OBJECTS+= $(SRC)/k6opt.o 
    28  endif 
    29  endif 
  • asterisk-1.4.x/patches/017-Makefile-no_march.patch

     
    1 --- a/Makefile 
    2 +++ b/Makefile 
    3 @@ -220,7 +220,7 @@ ifneq ($(findstring BSD,$(OSARCH)),) 
    4  endif 
    5   
    6  ifneq ($(PROC),ultrasparc) 
    7 -  ASTCFLAGS+=$(shell if $(CC) -march=$(PROC) -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=$(PROC)"; fi) 
    8 +  #ASTCFLAGS+=$(shell if $(CC) -march=$(PROC) -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=$(PROC)"; fi) 
    9  endif 
    10   
    11  ifeq ($(PROC),ppc) 
  • asterisk-1.4.x/patches/023-autoconf-chan_h323.patch

     
    1 --- a/autoconf/ast_check_openh323.m4 
    2 +++ b/autoconf/ast_check_openh323.m4 
    3 @@ -123,6 +123,7 @@ AC_DEFUN([AST_CHECK_OPENH323_BUILD], [ 
    4                                 ;; 
    5                 esac 
    6                 AC_MSG_RESULT(${OPENH323_BUILD}) 
    7 +               OPENH323_SUFFIX="n_s" 
    8   
    9                 AC_SUBST([OPENH323_SUFFIX]) 
    10                 AC_SUBST([OPENH323_BUILD]) 
    11 --- a/configure.ac 
    12 +++ b/configure.ac 
    13 @@ -1317,7 +1317,7 @@ if test "${USE_PWLIB}" != "no"; then 
    14         if test "${HAS_PWLIB:-unset}" != "unset"; then 
    15                 AST_CHECK_PWLIB_PLATFORM() 
    16   
    17 -               PLATFORM_PWLIB="pt_${PWLIB_PLATFORM}_r" 
    18 +               PLATFORM_PWLIB="pt_${PWLIB_PLATFORM}_r_s" 
    19   
    20                 AST_CHECK_PWLIB_BUILD([PWLib], [PWLIB], 
    21                         [Define if your system has the PWLib libraries.], 
  • asterisk-1.4.x/patches/013-chan_iax2-tmp_path.patch

     
    1 --- a/channels/chan_iax2.c 
    2 +++ b/channels/chan_iax2.c 
    3 @@ -1898,7 +1898,7 @@ static int try_firmware(char *s) 
    4                 last++; 
    5         else 
    6                 last = s; 
    7 -       snprintf(s2, strlen(s) + 100, "/var/tmp/%s-%ld", last, (unsigned long)ast_random()); 
    8 +       snprintf(s2, strlen(s) + 100, "/tmp/%s-%ld", last, (unsigned long)ast_random()); 
    9         res = stat(s, &stbuf); 
    10         if (res < 0) { 
    11                 ast_log(LOG_WARNING, "Failed to stat '%s': %s\n", s, strerror(errno)); 
  • asterisk-1.4.x/patches/014-openssl-configure_ac.patch

     
    1 --- a/configure.ac 
    2 +++ b/configure.ac 
    3 @@ -1376,7 +1376,7 @@ AC_SUBST(PBX_SPEEX_PREPROCESS) 
    4   
    5  AST_EXT_LIB_CHECK([SQLITE], [sqlite], [sqlite_exec], [sqlite.h]) 
    6   
    7 -AST_EXT_LIB_CHECK([OPENSSL], [ssl], [ssl2_connect], [openssl/ssl.h], [-lcrypto]) 
    8 +AST_EXT_LIB_CHECK([OPENSSL], [ssl], [ssl23_connect], [openssl/ssl.h], [-lcrypto]) 
    9  if test "$PBX_OPENSSL" = "1"; 
    10  then 
    11      AST_EXT_LIB_CHECK([OSPTK], [osptk], [OSPPCryptoDecrypt], [osp/osp.h], [-lcrypto -lssl]) 
  • asterisk-1.4.x/patches/015-spandsp-app_fax.patch

     
    1 --- /dev/null 
    2 +++ b/apps/app_rxfax.c 
    3 @@ -0,0 +1,376 @@ 
    4 +/* 
    5 + * Asterisk -- A telephony toolkit for Linux. 
    6 + * 
    7 + * Trivial application to receive a TIFF FAX file 
    8 + *  
    9 + * Copyright (C) 2003, Steve Underwood 
    10 + * 
    11 + * Steve Underwood <steveu@coppice.org> 
    12 + * 
    13 + * This program is free software, distributed under the terms of 
    14 + * the GNU General Public License 
    15 + */ 
    16 + 
    17 +/*** MODULEINFO 
    18 +         <depend>spandsp</depend> 
    19 +***/ 
    20 +  
    21 +#include "asterisk.h" 
    22 + 
    23 +ASTERISK_FILE_VERSION(__FILE__, "$Revision:$") 
    24 + 
    25 +#include <string.h> 
    26 +#include <stdlib.h> 
    27 +#include <stdio.h> 
    28 +#include <inttypes.h> 
    29 +#include <pthread.h> 
    30 +#include <errno.h> 
    31 +#include <tiffio.h> 
    32 + 
    33 +#include <spandsp.h> 
    34 + 
    35 +#include "asterisk/lock.h" 
    36 +#include "asterisk/file.h" 
    37 +#include "asterisk/logger.h" 
    38 +#include "asterisk/channel.h" 
    39 +#include "asterisk/pbx.h" 
    40 +#include "asterisk/module.h" 
    41 +#include "asterisk/translate.h" 
    42 +#include "asterisk/dsp.h" 
    43 +#include "asterisk/manager.h" 
    44 + 
    45 +static char *app = "RxFAX"; 
    46 + 
    47 +static char *synopsis = "Receive a FAX to a file"; 
    48 + 
    49 +static char *descrip =  
    50 +"  RxFAX(filename[|caller][|debug]): Receives a FAX from the channel into the\n" 
    51 +"given filename. If the file exists it will be overwritten. The file\n" 
    52 +"should be in TIFF/F format.\n" 
    53 +"The \"caller\" option makes the application behave as a calling machine,\n" 
    54 +"rather than the answering machine. The default behaviour is to behave as\n" 
    55 +"an answering machine.\n" 
    56 +"Uses LOCALSTATIONID to identify itself to the remote end.\n" 
    57 +"     LOCALHEADERINFO to generate a header line on each page.\n" 
    58 +"Sets REMOTESTATIONID to the sender CSID.\n" 
    59 +"     FAXPAGES to the number of pages received.\n" 
    60 +"     FAXBITRATE to the transmition rate.\n" 
    61 +"     FAXRESOLUTION to the resolution.\n" 
    62 +"Returns -1 when the user hangs up.\n" 
    63 +"Returns 0 otherwise.\n"; 
    64 + 
    65 +#define MAX_BLOCK_SIZE 240 
    66 + 
    67 +static void span_message(int level, const char *msg) 
    68 +{ 
    69 +    int ast_level; 
    70 +     
    71 +    if (level == SPAN_LOG_WARNING) 
    72 +        ast_level = __LOG_WARNING; 
    73 +    else if (level == SPAN_LOG_WARNING) 
    74 +        ast_level = __LOG_WARNING; 
    75 +    else 
    76 +        ast_level = __LOG_DEBUG; 
    77 +    ast_log(ast_level, __FILE__, __LINE__, __PRETTY_FUNCTION__, msg); 
    78 +} 
    79 +/*- End of function --------------------------------------------------------*/ 
    80 + 
    81 +static void t30_flush(t30_state_t *s, int which) 
    82 +{ 
    83 +    /* TODO: */ 
    84 +} 
    85 +/*- End of function --------------------------------------------------------*/ 
    86 + 
    87 +static void phase_e_handler(t30_state_t *s, void *user_data, int result) 
    88 +{ 
    89 +    struct ast_channel *chan; 
    90 +    t30_stats_t t; 
    91 +    char local_ident[21]; 
    92 +    char far_ident[21]; 
    93 +    char buf[11]; 
    94 +     
    95 +    chan = (struct ast_channel *) user_data; 
    96 +    if (result == T30_ERR_OK) 
    97 +    { 
    98 +        t30_get_transfer_statistics(s, &t); 
    99 +        t30_get_far_ident(s, far_ident); 
    100 +        t30_get_local_ident(s, local_ident); 
    101 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    102 +        ast_log(LOG_DEBUG, "Fax successfully received.\n"); 
    103 +        ast_log(LOG_DEBUG, "Remote station id: %s\n", far_ident); 
    104 +        ast_log(LOG_DEBUG, "Local station id:  %s\n", local_ident); 
    105 +        ast_log(LOG_DEBUG, "Pages transferred: %i\n", t.pages_transferred); 
    106 +        ast_log(LOG_DEBUG, "Image resolution:  %i x %i\n", t.x_resolution, t.y_resolution); 
    107 +        ast_log(LOG_DEBUG, "Transfer Rate:     %i\n", t.bit_rate); 
    108 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    109 +        manager_event(EVENT_FLAG_CALL, 
    110 +                      "FaxReceived", "Channel: %s\nExten: %s\nCallerID: %s\nRemoteStationID: %s\nLocalStationID: %s\nPagesTransferred: %i\nResolution: %i\nTransferRate: %i\nFileName: %s\n", 
    111 +                      chan->name, 
    112 +                      chan->exten, 
    113 +                      (chan->cid.cid_num)  ?  chan->cid.cid_num  :  "", 
    114 +                      far_ident, 
    115 +                      local_ident, 
    116 +                      t.pages_transferred, 
    117 +                      t.y_resolution, 
    118 +                      t.bit_rate, 
    119 +                      s->rx_file); 
    120 +        pbx_builtin_setvar_helper(chan, "REMOTESTATIONID", far_ident); 
    121 +        snprintf(buf, sizeof(buf), "%i", t.pages_transferred); 
    122 +        pbx_builtin_setvar_helper(chan, "FAXPAGES", buf); 
    123 +        snprintf(buf, sizeof(buf), "%i", t.y_resolution); 
    124 +        pbx_builtin_setvar_helper(chan, "FAXRESOLUTION", buf); 
    125 +        snprintf(buf, sizeof(buf), "%i", t.bit_rate); 
    126 +        pbx_builtin_setvar_helper(chan, "FAXBITRATE", buf); 
    127 +    } 
    128 +    else 
    129 +    { 
    130 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    131 +        ast_log(LOG_DEBUG, "Fax receive not successful - result (%d) %s.\n", result, t30_completion_code_to_str(result)); 
    132 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    133 +    } 
    134 +} 
    135 +/*- End of function --------------------------------------------------------*/ 
    136 + 
    137 +static void phase_d_handler(t30_state_t *s, void *user_data, int result) 
    138 +{ 
    139 +    struct ast_channel *chan; 
    140 +    t30_stats_t t; 
    141 +     
    142 +    chan = (struct ast_channel *) user_data; 
    143 +    if (result) 
    144 +    { 
    145 +        t30_get_transfer_statistics(s, &t); 
    146 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    147 +        ast_log(LOG_DEBUG, "Pages transferred:  %i\n", t.pages_transferred); 
    148 +        ast_log(LOG_DEBUG, "Image size:         %i x %i\n", t.width, t.length); 
    149 +        ast_log(LOG_DEBUG, "Image resolution    %i x %i\n", t.x_resolution, t.y_resolution); 
    150 +        ast_log(LOG_DEBUG, "Transfer Rate:      %i\n", t.bit_rate); 
    151 +        ast_log(LOG_DEBUG, "Bad rows            %i\n", t.bad_rows); 
    152 +        ast_log(LOG_DEBUG, "Longest bad row run %i\n", t.longest_bad_row_run); 
    153 +        ast_log(LOG_DEBUG, "Compression type    %i\n", t.encoding); 
    154 +        ast_log(LOG_DEBUG, "Image size (bytes)  %i\n", t.image_size); 
    155 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    156 +    } 
    157 +} 
    158 +/*- End of function --------------------------------------------------------*/ 
    159 + 
    160 +static int rxfax_exec(struct ast_channel *chan, void *data) 
    161 +{ 
    162 +    int res = 0; 
    163 +    char template_file[256]; 
    164 +    char target_file[256]; 
    165 +    char *s; 
    166 +    char *t; 
    167 +    char *v; 
    168 +    const char *x; 
    169 +    int option; 
    170 +    int len; 
    171 +    int i; 
    172 +    fax_state_t fax; 
    173 +    int calling_party; 
    174 +    int verbose; 
    175 +    int samples; 
    176 + 
    177 +    struct ast_module_user *u; 
    178 +    struct ast_frame *inf = NULL; 
    179 +    struct ast_frame outf; 
    180 + 
    181 +    int original_read_fmt; 
    182 +    int original_write_fmt; 
    183 +     
    184 +    uint8_t __buf[sizeof(uint16_t)*MAX_BLOCK_SIZE + 2*AST_FRIENDLY_OFFSET]; 
    185 +    uint8_t *buf = __buf + AST_FRIENDLY_OFFSET; 
    186 + 
    187 +    if (chan == NULL) 
    188 +    { 
    189 +        ast_log(LOG_WARNING, "Fax receive channel is NULL. Giving up.\n"); 
    190 +        return -1; 
    191 +    } 
    192 + 
    193 +    span_set_message_handler(span_message); 
    194 + 
    195 +    /* The next few lines of code parse out the filename and header from the input string */ 
    196 +    if (data == NULL) 
    197 +    { 
    198 +        /* No data implies no filename or anything is present */ 
    199 +        ast_log(LOG_WARNING, "Rxfax requires an argument (filename)\n"); 
    200 +        return -1; 
    201 +    } 
    202 +     
    203 +    calling_party = FALSE; 
    204 +    verbose = FALSE; 
    205 +    target_file[0] = '\0'; 
    206 + 
    207 +    for (option = 0, v = s = data;  v;  option++, s++) 
    208 +    { 
    209 +        t = s; 
    210 +        v = strchr(s, '|'); 
    211 +        s = (v)  ?  v  :  s + strlen(s); 
    212 +        strncpy((char *) buf, t, s - t); 
    213 +        buf[s - t] = '\0'; 
    214 +        if (option == 0) 
    215 +        { 
    216 +            /* The first option is always the file name */ 
    217 +            len = s - t; 
    218 +            if (len > 255) 
    219 +                len = 255; 
    220 +            strncpy(target_file, t, len); 
    221 +            target_file[len] = '\0'; 
    222 +            /* Allow the use of %d in the file name for a wild card of sorts, to 
    223 +               create a new file with the specified name scheme */ 
    224 +            if ((x = strchr(target_file, '%'))  &&  x[1] == 'd') 
    225 +            { 
    226 +                strcpy(template_file, target_file); 
    227 +                i = 0; 
    228 +                do 
    229 +                { 
    230 +                    snprintf(target_file, 256, template_file, 1); 
    231 +                    i++; 
    232 +                } 
    233 +                while (ast_fileexists(target_file, "", chan->language) != -1); 
    234 +            } 
    235 +        } 
    236 +        else if (strncmp("caller", t, s - t) == 0) 
    237 +        { 
    238 +            calling_party = TRUE; 
    239 +        } 
    240 +        else if (strncmp("debug", t, s - t) == 0) 
    241 +        { 
    242 +            verbose = TRUE; 
    243 +        } 
    244 +    } 
    245 + 
    246 +    /* Done parsing */ 
    247 + 
    248 +    u = ast_module_user_add(chan); 
    249 + 
    250 +    if (chan->_state != AST_STATE_UP) 
    251 +    { 
    252 +        /* Shouldn't need this, but checking to see if channel is already answered 
    253 +         * Theoretically asterisk should already have answered before running the app */ 
    254 +        res = ast_answer(chan); 
    255 +    } 
    256 +     
    257 +    if (!res) 
    258 +    { 
    259 +        original_read_fmt = chan->readformat; 
    260 +        if (original_read_fmt != AST_FORMAT_SLINEAR) 
    261 +        { 
    262 +            res = ast_set_read_format(chan, AST_FORMAT_SLINEAR); 
    263 +            if (res < 0) 
    264 +            { 
    265 +                ast_log(LOG_WARNING, "Unable to set to linear read mode, giving up\n"); 
    266 +                return -1; 
    267 +            } 
    268 +        } 
    269 +        original_write_fmt = chan->writeformat; 
    270 +        if (original_write_fmt != AST_FORMAT_SLINEAR) 
    271 +        { 
    272 +            res = ast_set_write_format(chan, AST_FORMAT_SLINEAR); 
    273 +            if (res < 0) 
    274 +            { 
    275 +                ast_log(LOG_WARNING, "Unable to set to linear write mode, giving up\n"); 
    276 +                res = ast_set_read_format(chan, original_read_fmt); 
    277 +                if (res) 
    278 +                    ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name); 
    279 +                return -1; 
    280 +            } 
    281 +        } 
    282 +        fax_init(&fax, calling_party); 
    283 +        if (verbose) 
    284 +            fax.logging.level = SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW; 
    285 +        x = pbx_builtin_getvar_helper(chan, "LOCALSTATIONID"); 
    286 +        if (x  &&  x[0]) 
    287 +            t30_set_local_ident(&fax.t30_state, x); 
    288 +        x = pbx_builtin_getvar_helper(chan, "LOCALHEADERINFO"); 
    289 +        if (x  &&  x[0]) 
    290 +            t30_set_header_info(&fax.t30_state, x); 
    291 +        t30_set_rx_file(&fax.t30_state, target_file, -1); 
    292 +        //t30_set_phase_b_handler(&fax.t30_state, phase_b_handler, chan); 
    293 +        t30_set_phase_d_handler(&fax.t30_state, phase_d_handler, chan); 
    294 +        t30_set_phase_e_handler(&fax.t30_state, phase_e_handler, chan); 
    295 +        t30_set_ecm_capability(&fax.t30_state, TRUE); 
    296 +        t30_set_supported_compressions(&fax.t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); 
    297 +        while (ast_waitfor(chan, -1) > -1) 
    298 +        { 
    299 +            inf = ast_read(chan); 
    300 +            if (inf == NULL) 
    301 +            { 
    302 +                res = -1; 
    303 +                break; 
    304 +            } 
    305 +            if (inf->frametype == AST_FRAME_VOICE) 
    306 +            { 
    307 +                if (fax_rx(&fax, inf->data, inf->samples)) 
    308 +                    break; 
    309 +                samples = (inf->samples <= MAX_BLOCK_SIZE)  ?  inf->samples  :  MAX_BLOCK_SIZE; 
    310 +                len = fax_tx(&fax, (int16_t *) &buf[AST_FRIENDLY_OFFSET], samples); 
    311 +                if (len) 
    312 +                { 
    313 +                    memset(&outf, 0, sizeof(outf)); 
    314 +                    outf.frametype = AST_FRAME_VOICE; 
    315 +                    outf.subclass = AST_FORMAT_SLINEAR; 
    316 +                    outf.datalen = len*sizeof(int16_t); 
    317 +                    outf.samples = len; 
    318 +                    outf.data = &buf[AST_FRIENDLY_OFFSET]; 
    319 +                    outf.offset = AST_FRIENDLY_OFFSET; 
    320 +                    outf.src = "RxFAX"; 
    321 +                    if (ast_write(chan, &outf) < 0) 
    322 +                    { 
    323 +                        ast_log(LOG_WARNING, "Unable to write frame to channel; %s\n", strerror(errno)); 
    324 +                        break; 
    325 +                    } 
    326 +                } 
    327 +            } 
    328 +            ast_frfree(inf); 
    329 +        } 
    330 +        if (inf == NULL) 
    331 +        { 
    332 +            ast_log(LOG_DEBUG, "Got hangup\n"); 
    333 +            res = -1; 
    334 +        } 
    335 +        if (original_read_fmt != AST_FORMAT_SLINEAR) 
    336 +        { 
    337 +            res = ast_set_read_format(chan, original_read_fmt); 
    338 +            if (res) 
    339 +                ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name); 
    340 +        } 
    341 +        if (original_write_fmt != AST_FORMAT_SLINEAR) 
    342 +        { 
    343 +            res = ast_set_write_format(chan, original_write_fmt); 
    344 +            if (res) 
    345 +                ast_log(LOG_WARNING, "Unable to restore write format on '%s'\n", chan->name); 
    346 +        } 
    347 +        t30_terminate(&fax.t30_state); 
    348 +    } 
    349 +    else 
    350 +    { 
    351 +        ast_log(LOG_WARNING, "Could not answer channel '%s'\n", chan->name); 
    352 +    } 
    353 +    ast_module_user_remove(u); 
    354 +    return res; 
    355 +} 
    356 +/*- End of function --------------------------------------------------------*/ 
    357 + 
    358 +static int unload_module(void) 
    359 +{ 
    360 +       int res; 
    361 + 
    362 +       ast_module_user_hangup_all(); 
    363 + 
    364 +       res = ast_unregister_application(app);   
    365 +        
    366 + 
    367 +       return res; 
    368 +} 
    369 +/*- End of function --------------------------------------------------------*/ 
    370 + 
    371 +static int load_module(void) 
    372 +{ 
    373 +       return ast_register_application(app, rxfax_exec, synopsis, descrip); 
    374 +} 
    375 +/*- End of function --------------------------------------------------------*/ 
    376 + 
    377 +AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Trivial FAX Receive Application"); 
    378 + 
    379 +/*- End of file ------------------------------------------------------------*/ 
    380 --- /dev/null 
    381 +++ b/apps/app_txfax.c 
    382 @@ -0,0 +1,303 @@ 
    383 +/* 
    384 + * Asterisk -- A telephony toolkit for Linux. 
    385 + * 
    386 + * Trivial application to send a TIFF file as a FAX 
    387 + *  
    388 + * Copyright (C) 2003, Steve Underwood 
    389 + * 
    390 + * Steve Underwood <steveu@coppice.org> 
    391 + * 
    392 + * This program is free software, distributed under the terms of 
    393 + * the GNU General Public License 
    394 + */ 
    395 + 
    396 +/*** MODULEINFO 
    397 +         <depend>spandsp</depend> 
    398 +***/ 
    399 +  
    400 +#include "asterisk.h" 
    401 + 
    402 +ASTERISK_FILE_VERSION(__FILE__, "$Revision:$") 
    403 + 
    404 +#include <string.h> 
    405 +#include <stdlib.h> 
    406 +#include <stdio.h> 
    407 +#include <inttypes.h> 
    408 +#include <pthread.h> 
    409 +#include <errno.h> 
    410 +#include <tiffio.h> 
    411 + 
    412 +#include <spandsp.h> 
    413 + 
    414 +#include "asterisk/lock.h" 
    415 +#include "asterisk/file.h" 
    416 +#include "asterisk/logger.h" 
    417 +#include "asterisk/channel.h" 
    418 +#include "asterisk/pbx.h" 
    419 +#include "asterisk/module.h" 
    420 +#include "asterisk/translate.h" 
    421 + 
    422 +static char *app = "TxFAX"; 
    423 + 
    424 +static char *synopsis = "Send a FAX file"; 
    425 + 
    426 +static char *descrip =  
    427 +"  TxFAX(filename[|caller][|debug]):  Send a given TIFF file to the channel as a FAX.\n" 
    428 +"The \"caller\" option makes the application behave as a calling machine,\n" 
    429 +"rather than the answering machine. The default behaviour is to behave as\n" 
    430 +"an answering machine.\n" 
    431 +"Uses LOCALSTATIONID to identify itself to the remote end.\n" 
    432 +"     LOCALHEADERINFO to generate a header line on each page.\n" 
    433 +"Sets REMOTESTATIONID to the receiver CSID.\n" 
    434 +"Returns -1 when the user hangs up, or if the file does not exist.\n" 
    435 +"Returns 0 otherwise.\n"; 
    436 + 
    437 +#define MAX_BLOCK_SIZE 240 
    438 + 
    439 +static void span_message(int level, const char *msg) 
    440 +{ 
    441 +    int ast_level; 
    442 +     
    443 +    if (level == SPAN_LOG_WARNING) 
    444 +        ast_level = __LOG_WARNING; 
    445 +    else if (level == SPAN_LOG_WARNING) 
    446 +        ast_level = __LOG_WARNING; 
    447 +    else 
    448 +        ast_level = __LOG_DEBUG; 
    449 +    ast_log(ast_level, __FILE__, __LINE__, __PRETTY_FUNCTION__, msg); 
    450 +} 
    451 +/*- End of function --------------------------------------------------------*/ 
    452 + 
    453 +#if 0 
    454 +static void t30_flush(t30_state_t *s, int which) 
    455 +{ 
    456 +    /* TODO: */ 
    457 +} 
    458 +/*- End of function --------------------------------------------------------*/ 
    459 +#endif 
    460 + 
    461 +static void phase_e_handler(t30_state_t *s, void *user_data, int result) 
    462 +{ 
    463 +    struct ast_channel *chan; 
    464 +    char far_ident[21]; 
    465 +     
    466 +    chan = (struct ast_channel *) user_data; 
    467 +    if (result == T30_ERR_OK) 
    468 +    { 
    469 +        t30_get_far_ident(s, far_ident); 
    470 +        pbx_builtin_setvar_helper(chan, "REMOTESTATIONID", far_ident); 
    471 +    } 
    472 +    else 
    473 +    { 
    474 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    475 +        ast_log(LOG_DEBUG, "Fax send not successful - result (%d) %s.\n", result, t30_completion_code_to_str(result)); 
    476 +        ast_log(LOG_DEBUG, "==============================================================================\n"); 
    477 +    } 
    478 +} 
    479 +/*- End of function --------------------------------------------------------*/ 
    480 + 
    481 +static int txfax_exec(struct ast_channel *chan, void *data) 
    482 +{ 
    483 +    int res = 0; 
    484 +    char source_file[256]; 
    485 +    char *s; 
    486 +    char *t; 
    487 +    char *v; 
    488 +    const char *x; 
    489 +    int option; 
    490 +    int len; 
    491 +    fax_state_t fax; 
    492 +    int calling_party; 
    493 +    int verbose; 
    494 +    int samples; 
    495 +     
    496 +    struct ast_module_user *u; 
    497 +    struct ast_frame *inf = NULL; 
    498 +    struct ast_frame outf; 
    499 + 
    500 +    int original_read_fmt; 
    501 +    int original_write_fmt; 
    502 +     
    503 +    uint8_t __buf[sizeof(uint16_t)*MAX_BLOCK_SIZE + 2*AST_FRIENDLY_OFFSET]; 
    504 +    uint8_t *buf = __buf + AST_FRIENDLY_OFFSET; 
    505 + 
    506 +    if (chan == NULL) 
    507 +    { 
    508 +        ast_log(LOG_WARNING, "Fax transmit channel is NULL. Giving up.\n"); 
    509 +        return -1; 
    510 +    } 
    511 + 
    512 +    span_set_message_handler(span_message); 
    513 + 
    514 +    /* The next few lines of code parse out the filename and header from the input string */ 
    515 +    if (data == NULL) 
    516 +    { 
    517 +        /* No data implies no filename or anything is present */ 
    518 +        ast_log(LOG_WARNING, "Txfax requires an argument (filename)\n"); 
    519 +        return -1; 
    520 +    } 
    521 +     
    522 +    calling_party = FALSE; 
    523 +    verbose = FALSE; 
    524 +    source_file[0] = '\0';  
    525 + 
    526 +    for (option = 0, v = s = data;  v;  option++, s++) 
    527 +    { 
    528 +        t = s; 
    529 +        v = strchr(s, '|'); 
    530 +        s = (v)  ?  v  :  s + strlen(s); 
    531 +        strncpy((char *) buf, t, s - t); 
    532 +        buf[s - t] = '\0'; 
    533 +        if (option == 0) 
    534 +        { 
    535 +            /* The first option is always the file name */ 
    536 +            len = s - t; 
    537 +            if (len > 255) 
    538 +                len = 255; 
    539 +            strncpy(source_file, t, len); 
    540 +            source_file[len] = '\0'; 
    541 +        } 
    542 +        else if (strncmp("caller", t, s - t) == 0) 
    543 +        { 
    544 +            calling_party = TRUE; 
    545 +        } 
    546 +        else if (strncmp("debug", t, s - t) == 0) 
    547 +        { 
    548 +            verbose = TRUE; 
    549 +        } 
    550 +    } 
    551 + 
    552 +    /* Done parsing */ 
    553 + 
    554 +    u = ast_module_user_add(chan); 
    555 + 
    556 +    if (chan->_state != AST_STATE_UP) 
    557 +    { 
    558 +        /* Shouldn't need this, but checking to see if channel is already answered 
    559 +         * Theoretically asterisk should already have answered before running the app */ 
    560 +        res = ast_answer(chan); 
    561 +    } 
    562 +     
    563 +    if (!res) 
    564 +    { 
    565 +        original_read_fmt = chan->readformat; 
    566 +        if (original_read_fmt != AST_FORMAT_SLINEAR) 
    567 +        { 
    568 +            res = ast_set_read_format(chan, AST_FORMAT_SLINEAR); 
    569 +            if (res < 0) 
    570 +            { 
    571 +                ast_log(LOG_WARNING, "Unable to set to linear read mode, giving up\n"); 
    572 +                return -1; 
    573 +            } 
    574 +        } 
    575 +        original_write_fmt = chan->writeformat; 
    576 +        if (original_write_fmt != AST_FORMAT_SLINEAR) 
    577 +        { 
    578 +            res = ast_set_write_format(chan, AST_FORMAT_SLINEAR); 
    579 +            if (res < 0) 
    580 +            { 
    581 +                ast_log(LOG_WARNING, "Unable to set to linear write mode, giving up\n"); 
    582 +                res = ast_set_read_format(chan, original_read_fmt); 
    583 +                if (res) 
    584 +                    ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name); 
    585 +                return -1; 
    586 +            } 
    587 +        } 
    588 +        fax_init(&fax, calling_party); 
    589 +        if (verbose) 
    590 +           fax.logging.level = SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW; 
    591 + 
    592 +        x = pbx_builtin_getvar_helper(chan, "LOCALSTATIONID"); 
    593 +        if (x  &&  x[0]) 
    594 +            t30_set_local_ident(&fax.t30_state, x); 
    595 +        x = pbx_builtin_getvar_helper(chan, "LOCALHEADERINFO"); 
    596 +        if (x  &&  x[0]) 
    597 +            t30_set_header_info(&fax.t30_state, x); 
    598 +        t30_set_tx_file(&fax.t30_state, source_file, -1, -1); 
    599 +        //t30_set_phase_b_handler(&fax.t30_state, phase_b_handler, chan); 
    600 +        //t30_set_phase_d_handler(&fax.t30_state, phase_d_handler, chan); 
    601 +        t30_set_phase_e_handler(&fax.t30_state, phase_e_handler, chan); 
    602 +        t30_set_ecm_capability(&fax.t30_state, TRUE); 
    603 +        t30_set_supported_compressions(&fax.t30_state, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); 
    604 +        while (ast_waitfor(chan, -1) > -1) 
    605 +        { 
    606 +            inf = ast_read(chan); 
    607 +            if (inf == NULL) 
    608 +            { 
    609 +                res = -1; 
    610 +                break; 
    611 +            } 
    612 +            if (inf->frametype == AST_FRAME_VOICE) 
    613 +            { 
    614 +                if (fax_rx(&fax, inf->data, inf->samples)) 
    615 +                    break; 
    616 +                samples = (inf->samples <= MAX_BLOCK_SIZE)  ?  inf->samples  :  MAX_BLOCK_SIZE; 
    617 +                len = fax_tx(&fax, (int16_t *) &buf[AST_FRIENDLY_OFFSET], samples); 
    618 +                if (len) 
    619 +                { 
    620 +                    memset(&outf, 0, sizeof(outf)); 
    621 +                    outf.frametype = AST_FRAME_VOICE; 
    622 +                    outf.subclass = AST_FORMAT_SLINEAR; 
    623 +                    outf.datalen = len*sizeof(int16_t); 
    624 +                    outf.samples = len; 
    625 +                    outf.data = &buf[AST_FRIENDLY_OFFSET]; 
    626 +                    outf.offset = AST_FRIENDLY_OFFSET; 
    627 +                    if (ast_write(chan, &outf) < 0) 
    628 +                    { 
    629 +                        ast_log(LOG_WARNING, "Unable to write frame to channel; %s\n", strerror(errno)); 
    630 +                        break; 
    631 +                    } 
    632 +                } 
    633 +            } 
    634 +            ast_frfree(inf); 
    635 +        } 
    636 +        if (inf == NULL) 
    637 +        { 
    638 +            ast_log(LOG_DEBUG, "Got hangup\n"); 
    639 +            res = -1; 
    640 +        } 
    641 +        if (original_read_fmt != AST_FORMAT_SLINEAR) 
    642 +        { 
    643 +            res = ast_set_read_format(chan, original_read_fmt); 
    644 +            if (res) 
    645 +                ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name); 
    646 +        } 
    647 +        if (original_write_fmt != AST_FORMAT_SLINEAR) 
    648 +        { 
    649 +            res = ast_set_write_format(chan, original_write_fmt); 
    650 +            if (res) 
    651 +                ast_log(LOG_WARNING, "Unable to restore write format on '%s'\n", chan->name); 
    652 +        } 
    653 +        t30_terminate(&fax.t30_state); 
    654 +    } 
    655 +    else 
    656 +    { 
    657 +        ast_log(LOG_WARNING, "Could not answer channel '%s'\n", chan->name); 
    658 +    } 
    659 +    ast_module_user_remove(u); 
    660 +    return res; 
    661 +} 
    662 +/*- End of function --------------------------------------------------------*/ 
    663 + 
    664 +static int unload_module(void) 
    665 +{ 
    666 +       int res; 
    667 + 
    668 +       ast_module_user_hangup_all(); 
    669 + 
    670 +       res = ast_unregister_application(app);   
    671 +        
    672 + 
    673 +       return res; 
    674 +} 
    675 +/*- End of function --------------------------------------------------------*/ 
    676 + 
    677 +static int load_module(void) 
    678 +{ 
    679 +    return ast_register_application(app, txfax_exec, synopsis, descrip); 
    680 +} 
    681 +/*- End of function --------------------------------------------------------*/ 
    682 + 
    683 +AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Trivial FAX Transmit Application"); 
    684 + 
    685 +/*- End of file ------------------------------------------------------------*/ 
    686 --- a/build_tools/menuselect-deps.in 
    687 +++ b/build_tools/menuselect-deps.in 
    688 @@ -23,6 +23,7 @@ PGSQL=@PBX_PGSQL@ 
    689  POPT=@PBX_POPT@ 
    690  PRI=@PBX_PRI@ 
    691  RADIUS=@PBX_RADIUS@ 
    692 +SPANDSP=@PBX_SPANDSP@ 
    693  SPEEX=@PBX_SPEEX@ 
    694  SPEEXDSP=@PBX_SPEEXDSP@ 
    695  SPEEX_PREPROCESS=@PBX_SPEEX_PREPROCESS@ 
    696 --- a/configure.ac 
    697 +++ b/configure.ac 
    698 @@ -205,6 +205,7 @@ AST_EXT_LIB_SETUP([PRI], [ISDN PRI], [pr 
    699  AST_EXT_LIB_SETUP([PWLIB], [PWlib], [pwlib]) 
    700  AST_EXT_LIB_SETUP([OPENH323], [OpenH323], [h323]) 
    701  AST_EXT_LIB_SETUP([RADIUS], [Radius Client], [radius]) 
    702 +AST_EXT_LIB_SETUP([SPANDSP], [spandsp Library], [spandsp]) 
    703  AST_EXT_LIB_SETUP([SPEEX], [Speex], [speex]) 
    704  AST_EXT_LIB_SETUP([SPEEXDSP], [Speexdsp], [speexdsp]) 
    705  AST_EXT_LIB_SETUP([SQLITE], [SQLite], [sqlite]) 
    706 @@ -1359,6 +1360,8 @@ fi 
    707   
    708  AST_EXT_LIB_CHECK([RADIUS], [radiusclient-ng], [rc_read_config], [radiusclient-ng.h]) 
    709   
    710 +AST_EXT_LIB_CHECK([SPANDSP], [spandsp], [fax_init], [spandsp.h], [-ltiff -ljpeg -lz]) 
    711 + 
    712  AST_EXT_LIB_CHECK([SPEEX], [speex], [speex_encode], [speex/speex.h], [-lm]) 
    713   
    714  # See if the main speex library contains the preprocess functions 
    715 --- a/include/asterisk/plc.h 
    716 +++ b/include/asterisk/plc.h 
    717 @@ -1,18 +1,17 @@ 
    718 -/*! \file 
    719 - * \brief SpanDSP - a series of DSP components for telephony 
    720 +/* 
    721 + * SpanDSP - a series of DSP components for telephony 
    722   * 
    723   * plc.h 
    724   * 
    725 - * \author Steve Underwood <steveu@coppice.org> 
    726 + * Written by Steve Underwood <steveu@coppice.org> 
    727   * 
    728   * Copyright (C) 2004 Steve Underwood 
    729   * 
    730   * All rights reserved. 
    731   * 
    732   * This program is free software; you can redistribute it and/or modify 
    733 - * it under the terms of the GNU General Public License as published by 
    734 - * the Free Software Foundation; either version 2 of the License, or 
    735 - * (at your option) any later version. 
    736 + * it under the terms of the GNU General Public License version 2, as 
    737 + * published by the Free Software Foundation. 
    738   * 
    739   * This program is distributed in the hope that it will be useful, 
    740   * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    741 @@ -23,37 +22,36 @@ 
    742   * along with this program; if not, write to the Free Software 
    743   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
    744   * 
    745 - * This version may be optionally licenced under the GNU LGPL licence. 
    746 - * 
    747 - * A license has been granted to Digium (via disclaimer) for the use of 
    748 - * this code. 
    749 + * $Id: plc.h,v 1.15 2007/04/08 08:16:18 steveu Exp $ 
    750   */ 
    751   
    752 +/*! \file */ 
    753   
    754 -#if !defined(_PLC_H_) 
    755 -#define _PLC_H_ 
    756 - 
    757 -#ifdef SOLARIS 
    758 -#include <sys/int_types.h> 
    759 -#else 
    760 -#if defined(__OpenBSD__) || defined( __FreeBSD__) 
    761 -#include <inttypes.h> 
    762 -#else 
    763 -#include <stdint.h> 
    764 -#endif 
    765 -#endif 
    766 +#if !defined(_SPANDSP_PLC_H_) 
    767 +#define _SPANDSP_PLC_H_ 
    768   
    769  /*! \page plc_page Packet loss concealment 
    770  \section plc_page_sec_1 What does it do? 
    771 -The packet loss concealment module provides a suitable synthetic fill-in signal, 
    772 -to minimise the audible effect of lost packets in VoIP applications. It is not 
    773 -tied to any particular codec, and could be used with almost any codec which does not 
    774 +The packet loss concealment module provides a synthetic fill-in signal, to minimise 
    775 +the audible effect of lost packets in VoIP applications. It is not tied to any 
    776 +particular codec, and could be used with almost any codec which does not 
    777  specify its own procedure for packet loss concealment. 
    778   
    779 -Where a codec specific concealment procedure exists, the algorithm is usually built 
    780 +Where a codec specific concealment procedure exists, that algorithm is usually built 
    781  around knowledge of the characteristics of the particular codec. It will, therefore, 
    782  generally give better results for that particular codec than this generic concealer will. 
    783   
    784 +The PLC code implements an algorithm similar to the one described in Appendix 1 of G.711. 
    785 +However, the G.711 algorithm is optimised for 10ms packets. Few people use such small 
    786 +packets. 20ms is a much more common value, and longer packets are also quite common. The 
    787 +algorithm has been adjusted with this in mind. Also, the G.711 approach causes an 
    788 +algorithmic delay, and requires significant buffer manipulation when there is no packet 
    789 +loss. The algorithm used here avoids this. It causes no delay, and achieves comparable 
    790 +quality with normal speech. 
    791 + 
    792 +Note that both this algorithm, and the one in G.711 are optimised for speech. For most kinds 
    793 +of music a much slower decay on bursts of lost packets give better results. 
    794 + 
    795  \section plc_page_sec_2 How does it work? 
    796  While good packets are being received, the plc_rx() routine keeps a record of the trailing 
    797  section of the known speech signal. If a packet is missed, plc_fillin() is called to produce 
    798 @@ -83,7 +81,7 @@ are needed to obtain smooth pleasant sou 
    799    correct steadily fall. Therefore, the volume of the synthesized signal is made to decay 
    800    linearly, such that after 50ms of missing audio it is reduced to silence. 
    801   
    802 -- When real speech resumes, an extra 1/4 pitch period of sythetic speech is blended with the 
    803 +- When real speech resumes, an extra 1/4 pitch period of synthetic speech is blended with the 
    804    start of the real speech. If the erasure is small, this smoothes the transition. If the erasure 
    805    is long, and the synthetic signal has faded to zero, the blending softens the start up of the 
    806    real signal, avoiding a kind of "click" or "pop" effect that might occur with a sudden onset. 
    807 @@ -110,6 +108,9 @@ That's it! 
    808      the pitch assessment. */ 
    809  #define PLC_HISTORY_LEN         (CORRELATION_SPAN + PLC_PITCH_MIN) 
    810   
    811 +/*! 
    812 +    The generic packet loss concealer context. 
    813 +*/ 
    814  typedef struct 
    815  { 
    816      /*! Consecutive erased samples */ 
    817 @@ -127,12 +128,13 @@ typedef struct 
    818  } plc_state_t; 
    819   
    820   
    821 -#ifdef __cplusplus 
    822 -extern "C" { 
    823 +#if defined(__cplusplus) 
    824 +extern "C" 
    825 +{ 
    826  #endif 
    827   
    828 -/*! Process a block of received audio samples. 
    829 -    \brief Process a block of received audio samples. 
    830 +/*! Process a block of received audio samples for PLC. 
    831 +    \brief Process a block of received audio samples for PLC. 
    832      \param s The packet loss concealer context. 
    833      \param amp The audio sample buffer. 
    834      \param len The number of samples in the buffer. 
    835 @@ -147,13 +149,18 @@ int plc_rx(plc_state_t *s, int16_t amp[] 
    836      \return The number of samples synthesized. */ 
    837  int plc_fillin(plc_state_t *s, int16_t amp[], int len); 
    838   
    839 -/*! Process a block of received V.29 modem audio samples. 
    840 -    \brief Process a block of received V.29 modem audio samples. 
    841 +/*! Initialise a packet loss concealer context. 
    842 +    \brief Initialise a PLC context. 
    843      \param s The packet loss concealer context. 
    844 -    \return A pointer to the he packet loss concealer context. */ 
    845 +    \return A pointer to the the packet loss concealer context. */ 
    846  plc_state_t *plc_init(plc_state_t *s); 
    847   
    848 -#ifdef __cplusplus 
    849 +/*! Free a packet loss concealer context. 
    850 +    \param s The packet loss concealer context. 
    851 +    \return 0 for OK. */ 
    852 +int plc_release(plc_state_t *s); 
    853 + 
    854 +#if defined(__cplusplus) 
    855  } 
    856  #endif 
    857   
    858 --- a/makeopts.in 
    859 +++ b/makeopts.in 
    860 @@ -141,6 +141,9 @@ PWLIB_LIB=@PWLIB_LIB@ 
    861  RADIUS_INCLUDE=@RADIUS_INCLUDE@ 
    862  RADIUS_LIB=@RADIUS_LIB@ 
    863   
    864 +SPANDSP_INCLUDE=@SPANDSP_INCLUDE@ 
    865 +SPANDSP_LIB=@SPANDSP_LIB@ 
    866 + 
    867  SPEEX_INCLUDE=@SPEEX_INCLUDE@ 
    868  SPEEX_LIB=@SPEEX_LIB@ 
    869   
  • asterisk-1.4.x/patches/030-acinclude.patch

     
    1 --- a/autoconf/ast_prog_ld.m4 
    2 +++ b/autoconf/ast_prog_ld.m4 
    3 @@ -7,7 +7,7 @@ AC_DEFUN([AST_PROG_LD], 
    4         [assume the C compiler uses GNU ld @<:@default=no@:>@])], 
    5      [test "$withval" = no || with_gnu_ld=yes], 
    6      [with_gnu_ld=no]) 
    7 -AC_REQUIRE([AST_PROG_SED])dnl 
    8 +AC_REQUIRE([AC_PROG_SED])dnl 
    9  AC_REQUIRE([AC_PROG_CC])dnl 
    10  AC_REQUIRE([AC_CANONICAL_HOST])dnl 
    11  AC_REQUIRE([AC_CANONICAL_BUILD])dnl 
  • asterisk-1.4.x/patches/011-Makefile-main.patch

     
    1 --- a/main/Makefile 
    2 +++ b/main/Makefile 
    3 @@ -138,7 +138,7 @@ asterisk: $(OBJS) editline/libedit.a db1 
    4  ifneq ($(findstring chan_h323,$(MENUSELECT_CHANNELS)),) 
    5         $(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) 
    6  else 
    7 -       $(CMD_PREFIX) $(CXX) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $(H323LDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(H323LDLIBS) 
    8 +       $(CMD_PREFIX) $(CC) $(STATIC_BUILD) -o $@ $(ASTLINK) $(AST_EMBED_LDFLAGS) $(ASTLDFLAGS) $(H323LDFLAGS) $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) buildinfo.o $(AST_LIBS) $(AST_EMBED_LIBS) $(H323LDLIBS) 
    9  endif 
    10   
    11  clean:: 
  • asterisk-1.4.x/patches/016-iksemel-configure_ac.patch

     
    1 --- a/configure.ac 
    2 +++ b/configure.ac 
    3 @@ -572,7 +572,7 @@ if test "${USE_GSM}" != "no"; then 
    4     fi 
    5  fi 
    6   
    7 -AST_EXT_LIB_CHECK([IKSEMEL], [iksemel], [iks_start_sasl], [iksemel.h]) 
    8 +AST_EXT_LIB_CHECK([IKSEMEL], [iksemel], [iks_start_sasl], [iksemel.h], [-lgnutls -lgcrypt -lgpg-error]) 
    9   
    10  if test "${PBX_IKSEMEL}" = 1; then 
    11     AST_EXT_LIB_CHECK([GNUTLS], [gnutls], [gnutls_bye], [gnutls/gnutls.h], [-lz -lgcrypt -lgpg-error]) 
  • asterisk-1.4.x/Makefile

     
    1 # 
    2 # Copyright (C) 2007-2010 OpenWrt.org 
    3 # 
    4 # This is free software, licensed under the GNU General Public License v2. 
    5 # See /LICENSE for more information. 
    6 # 
    7  
    8 include $(TOPDIR)/rules.mk 
    9  
    10 PKG_NAME:=asterisk 
    11 PKG_VERSION:=1.4.25.1 
    12 PKG_RELEASE:=3 
    13  
    14 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 
    15 PKG_SOURCE_URL:=http://downloads.digium.com/pub/asterisk/releases/ 
    16 PKG_MD5SUM:=ca17be11559eb939ea16b8de98ddeefb 
    17  
    18 PKG_BUILD_DEPENDS:= libopenh323 pwlib 
    19  
    20 include $(INCLUDE_DIR)/package.mk 
    21  
    22 STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(call confvar, \ 
    23         CONFIG_PACKAGE_asterisk14 CONFIG_PACKAGE_asterisk14-mini \ 
    24         CONFIG_PACKAGE_asterisk14-chan-alsa CONFIG_PACKAGE_asterisk14-chan-gtalk \ 
    25         CONFIG_PACKAGE_asterisk14-chan-h323 CONFIG_PACKAGE_asterisk14-chan-mgcp \ 
    26         CONFIG_PACKAGE_asterisk14-chan-skinny CONFIG_PACKAGE_asterisk14-codec-ilbc \ 
    27         CONFIG_PACKAGE_asterisk14-codec-lpc10 CONFIG_PACKAGE_asterisk14-codec-speex \ 
    28         CONFIG_PACKAGE_asterisk14-pbx-dundi CONFIG_PACKAGE_asterisk14-res-agi \ 
    29         CONFIG_PACKAGE_asterisk14-res-crypto CONFIG_PACKAGE_asterisk14-pgsql \ 
    30         CONFIG_PACKAGE_asterisk14-sqlite CONFIG_PACKAGE_asterisk14-voicemail \ 
    31         CONFIG_PACKAGE_asterisk14-sounds \ 
    32 ) 
    33  
    34 define Package/asterisk14/Default 
    35   SUBMENU:=asterisk14 (Complete Open Source PBX), v1.4.x 
    36   SECTION:=net 
    37   CATEGORY:=Network 
    38   URL:=http://www.asterisk.org/ 
    39   MAINTAINER:=Hans Zandbelt <hans.zandbelt@gmail.com> 
    40 endef 
    41  
    42 define Package/asterisk14/Default/description 
    43  Asterisk is a complete PBX in software. It provides all of the features 
    44  you would expect from a PBX and more. Asterisk does voice over IP in three 
    45  protocols, and can interoperate with almost all standards-based telephony 
    46  equipment using relatively inexpensive hardware. 
    47 endef 
    48  
    49  
    50 define Package/asterisk14 
    51 $(call Package/asterisk14/Default) 
    52   TITLE:=Complete open source PBX 
    53   DEPENDS:= +libncurses +libpopt +libpthread @!TARGET_avr32 
    54 endef 
    55  
    56 define Package/asterisk14/description 
    57 $(call Package/asterisk14/Default/description) 
    58 endef 
    59  
    60  
    61 define Package/asterisk14-mini 
    62 $(call Package/asterisk14/Default) 
    63   TITLE:=Minimal open source PBX 
    64   DEPENDS:=+libncurses +libpopt +libpthread @!TARGET_avr32 
    65 endef 
    66  
    67 define Package/asterisk14-mini/description 
    68 $(call Package/asterisk14/Default/description) 
    69  This package contains only the following modules: 
    70  - app_dial 
    71  - chan_iax2 
    72  - chan_local 
    73  - chan_sip 
    74  - codec_gsm 
    75  - codec_ulaw 
    76  - format_gsm 
    77  - format_pcm 
    78  - format_wav 
    79  - format_wav_gsm 
    80  - pbx_config 
    81  - res_features 
    82  - res_musiconhold 
    83 endef 
    84  
    85  
    86 define Package/asterisk14-app-meetme 
    87 $(call Package/asterisk14/Default) 
    88   TITLE:=conferencing support 
    89   DEPENDS:= +asterisk14 +zaptel14-libtonezone 
    90 endef 
    91  
    92 define Package/asterisk14-app-meetme/description 
    93 $(call Package/asterisk14/Default/description) 
    94  This package provides the MeetMe application driver Conferencing support to  
    95  Asterisk. 
    96 endef 
    97  
    98  
    99 define Package/asterisk14-chan-oss 
    100 $(call Package/asterisk14/Default) 
    101   TITLE:=OSS soundcards support 
    102   DEPENDS:= +asterisk14 
    103 endef 
    104  
    105 define Package/asterisk14-chan-oss/description 
    106 $(call Package/asterisk14/Default/description) 
    107  This package provides the channel driver for OSS sound cards support to  
    108  Asterisk. 
    109 endef 
    110  
    111  
    112 define Package/asterisk14-app-meetme 
    113 $(call Package/asterisk14/Default) 
    114   TITLE:=conferencing support 
    115   DEPENDS:= +asterisk14 +zaptel14-libtonezone 
    116 endef 
    117  
    118 define Package/asterisk14-app-meetme/description 
    119 $(call Package/asterisk14/Default/description) 
    120  This package provides the MeetMe application driver Conferencing support to  
    121  Asterisk. 
    122 endef 
    123  
    124  
    125 define Package/asterisk14-chan-oss 
    126 $(call Package/asterisk14/Default) 
    127   TITLE:=OSS soundcards support 
    128   DEPENDS:= +asterisk14 
    129 endef 
    130  
    131 define Package/asterisk14-chan-oss/description 
    132 $(call Package/asterisk14/Default/description) 
    133  This package provides the channel driver for OSS sound cards support to  
    134  Asterisk. 
    135 endef 
    136  
    137  
    138 define Package/asterisk14-chan-alsa 
    139 $(call Package/asterisk14/Default) 
    140   TITLE:=ALSA soundcards support 
    141   DEPENDS:= +asterisk14 +alsa-lib 
    142 endef 
    143  
    144 define Package/asterisk14-chan-alsa/description 
    145 $(call Package/asterisk14/Default/description) 
    146  This package provides the channel driver for ALSA sound cards support to  
    147  Asterisk. 
    148 endef 
    149  
    150  
    151 define Package/asterisk14-chan-gtalk 
    152 $(call Package/asterisk14/Default) 
    153   TITLE:=GTalk support 
    154   DEPENDS:= +asterisk14 +libiksemel 
    155 endef 
    156  
    157 define Package/asterisk14-chan-gtalk/description 
    158 $(call Package/asterisk14/Default/description) 
    159  This package provides the channel chan_gtalk and res_jabber for GTalk  
    160  support to Asterisk. 
    161 endef 
    162  
    163  
    164 define Package/asterisk14-chan-h323 
    165 $(call Package/asterisk14/Default) 
    166   TITLE:=H.323 support for Asterisk 
    167   DEPENDS:= +asterisk14 +uclibcxx 
    168 endef 
    169  
    170 define Package/asterisk14-chan-h323/description 
    171 $(call Package/asterisk14/Default/description) 
    172  This package provides H.323 support to Asterisk. 
    173 endef 
    174  
    175  
    176 define Package/asterisk14-chan-mgcp 
    177 $(call Package/asterisk14/Default) 
    178   TITLE:=MGCP support 
    179   DEPENDS:= +asterisk14 
    180 endef 
    181  
    182 define Package/asterisk14-chan-mgcp/description 
    183 $(call Package/asterisk14/Default/description) 
    184  This package provides MGCP (Media Gateway Control Protocol) support \\\ 
    185  to Asterisk. 
    186 endef 
    187  
    188  
    189 define Package/asterisk14-chan-skinny 
    190 $(call Package/asterisk14/Default) 
    191   TITLE:=Skinny Client Control Protocol support 
    192   DEPENDS:= +asterisk14 
    193 endef 
    194  
    195 define Package/asterisk14-chan-skinny/description 
    196 $(call Package/asterisk14/Default/description) 
    197  This package provided Skinny Client Control Protocol support to \\\ 
    198  Asterisk. 
    199 endef 
    200  
    201  
    202 #define Package/asterisk14-codec-ilbc 
    203 #$(call Package/asterisk14/Default) 
    204 #  TITLE:=ILBC Translator 
    205 #  DEPENDS:= +asterisk14 
    206 #endef 
    207  
    208 #define Package/asterisk14-codec-ilbc/description 
    209 #$(call Package/asterisk14/Default/description) 
    210 # This package contains the ILBC (Internet Low Bitrate Codec) translator  
    211 # for Asterisk. 
    212 #endef 
    213  
    214  
    215 define Package/asterisk14-codec-lpc10 
    216 $(call Package/asterisk14/Default) 
    217   TITLE:=LPC10 2.4kbps voice codec Translator 
    218   DEPENDS:= +asterisk14 
    219 endef 
    220  
    221 define Package/asterisk14-chan-lpc10/description 
    222 $(call Package/asterisk14/Default/description) 
    223  This package contains the LPC10 (Linear Predictor Code) 2.4kbps voice  
    224  codec translator for Asterisk. 
    225 endef 
    226  
    227  
    228 define Package/asterisk14-codec-speex 
    229 $(call Package/asterisk14/Default) 
    230   TITLE:=Speex/PCM16 Codec Translator 
    231   DEPENDS:= +asterisk14 +libspeex +libspeexdsp 
    232 endef 
    233  
    234 define Package/asterisk14-chan-speex/description 
    235 $(call Package/asterisk14/Default/description) 
    236  This package contains the Speex speech compression codec translator for  
    237  Asterisk. 
    238 endef 
    239  
    240  
    241 define Package/asterisk14-pbx-dundi 
    242 $(call Package/asterisk14/Default) 
    243   TITLE:=DUNDi support 
    244   DEPENDS:= +asterisk14 
    245 endef 
    246  
    247 define Package/asterisk14-pbx-dundi/description 
    248 $(call Package/asterisk14/Default/description) 
    249  This package provides DUNDi (Distributed Universal Number Discovery)  
    250  support to Asterisk. 
    251 endef 
    252  
    253  
    254 define Package/asterisk14-res-agi 
    255 $(call Package/asterisk14/Default) 
    256   TITLE:=AGI support 
    257   DEPENDS:= +asterisk14 
    258 endef 
    259  
    260 define Package/asterisk14-res-agi/description 
    261 $(call Package/asterisk14/Default/description) 
    262  This package provides AGI (Asterisk Gateway Interface) support to  
    263  Asterisk. 
    264 endef 
    265  
    266  
    267 define Package/asterisk14-res-crypto 
    268 $(call Package/asterisk14/Default) 
    269   TITLE:=Cryptographic Digital Signatures support 
    270   DEPENDS:= +asterisk14 +libopenssl 
    271 endef 
    272  
    273 define Package/asterisk14-res-crypto/description 
    274 $(call Package/asterisk14/Default/description) 
    275  This package provides Cryptographic Digital Signatures support to  
    276  Asterisk. 
    277 endef 
    278  
    279  
    280 define Package/asterisk14-pgsql 
    281 $(call Package/asterisk14/Default) 
    282   TITLE:=PostgreSQL support 
    283   DEPENDS:= +asterisk14 +libpq 
    284 endef 
    285  
    286 define Package/asterisk14-pgsql/description 
    287 $(call Package/asterisk14/Default/description) 
    288  This package contains PostgreSQL support modules for Asterisk. 
    289 endef 
    290  
    291  
    292 define Package/asterisk14-sqlite 
    293 $(call Package/asterisk14/Default) 
    294   TITLE:=SQLite modules 
    295   DEPENDS:= +asterisk14 +libsqlite2 
    296 endef 
    297  
    298 define Package/asterisk14-sqlite/description 
    299 $(call Package/asterisk14/Default/description) 
    300  This package contains SQLite support modules for Asterisk. 
    301 endef 
    302  
    303  
    304 define Package/asterisk14-sounds 
    305 $(call Package/asterisk14/Default) 
    306   TITLE:=Sound files 
    307   DEPENDS:= +asterisk14 
    308 endef 
    309  
    310 define Package/asterisk14-sounds/description 
    311 $(call Package/asterisk14/Default/description) 
    312  This package contains sound files for Asterisk. 
    313 endef 
    314  
    315  
    316 define Package/asterisk14-voicemail 
    317 $(call Package/asterisk14/Default) 
    318   TITLE:=Voicemail support 
    319   DEPENDS:= +asterisk14 
    320 endef 
    321  
    322 define Package/asterisk14-voicemail/description 
    323 $(call Package/asterisk14/Default/description) 
    324  This package contains voicemail related modules for Asterisk. 
    325 endef 
    326  
    327 define Package/asterisk14-rawplayer 
    328 $(call Package/asterisk14/Default) 
    329   TITLE:=Play raw files for asterisk 
    330 endef 
    331  
    332 define Package/asterisk14-rawplayer/description 
    333  Contains the rawplayer utility for asterisk 
    334 endef 
    335  
    336  
    337 CONFIGURE_ARGS+= \ 
    338         --without-curl \ 
    339         --without-curses \ 
    340         --with-gsm="internal" \ 
    341         --without-imap \ 
    342         --without-isdnnet \ 
    343         --without-kde \ 
    344         --without-misdn \ 
    345         --without-nbs \ 
    346         --with-ncurses="$(STAGING_DIR)/usr" \ 
    347         --without-netsnmp \ 
    348         --without-newt \ 
    349         --without-odbc \ 
    350         --without-ogg \ 
    351         --without-osptk \ 
    352         --with-popt="$(STAGING_DIR)/usr" \ 
    353         --without-pri \ 
    354         --without-qt \ 
    355         --without-radius \ 
    356         --without-spandsp \ 
    357         --without-suppserv \ 
    358         --without-tds \ 
    359         --without-termcap \ 
    360         --without-tinfo \ 
    361         --without-vorbis \ 
    362         --without-vpb \ 
    363         --with-z="$(STAGING_DIR)/usr" \ 
    364  
    365 EXTRA_CFLAGS:= $(TARGET_CPPFLAGS) 
    366 EXTRA_LDFLAGS:= $(TARGET_LDFLAGS) 
    367  
    368 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-app-meetme),) 
    369   CONFIGURE_ARGS+= \ 
    370         --with-tonezone="$(STAGING_DIR)/usr" --with-zaptel="$(STAGING_DIR)/usr" 
    371 else 
    372   CONFIGURE_ARGS+= \ 
    373         --without-tonezone --without-zaptel 
    374 endif 
    375  
    376 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-chan-alsa),) 
    377   CONFIGURE_ARGS+= \ 
    378         --with-asound="$(STAGING_DIR)/usr" 
    379 else 
    380   CONFIGURE_ARGS+= \ 
    381         --without-asound 
    382 endif 
    383  
    384 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-chan-oss),) 
    385   CONFIGURE_ARGS+= \ 
    386         --with-oss 
    387 else 
    388   CONFIGURE_ARGS+= \ 
    389         --without-oss 
    390 endif 
    391  
    392 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-chan-gtalk),) 
    393   CONFIGURE_ARGS+= \ 
    394         --with-gnutls="$(STAGING_DIR)/usr" \ 
    395         --with-iksemel="$(STAGING_DIR)/usr" 
    396   SITE_VARS+= \ 
    397         ac_cv_lib_iksemel_iks_start_sasl=yes \ 
    398         ac_cv_lib_gnutls_gnutls_bye=yes 
    399 else 
    400   CONFIGURE_ARGS+= \ 
    401         --without-gnutls \ 
    402         --without-iksemel 
    403 endif 
    404  
    405 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-chan-h323),) 
    406   CONFIGURE_ARGS+= \ 
    407         --with-h323="$(BUILD_DIR)/openh323" \ 
    408         --with-pwlib="$(BUILD_DIR)/pwlib" 
    409   CONFIGURE_VARS+= \ 
    410         LIBS="$$$$LIBS -luClibc++ -ldl -lpthread" 
    411  
    412   define Build/Compile/chan-h323 
    413         $(MAKE) -C "$(PKG_BUILD_DIR)/channels/h323" \ 
    414                 $(TARGET_CONFIGURE_OPTS) \ 
    415                 CXXLIBS="-nodefaultlibs -luClibc++" \ 
    416                 optnoshared 
    417   endef 
    418 else 
    419   CONFIGURE_ARGS+= \ 
    420         --without-h323 \ 
    421         --without-pwlib 
    422 endif 
    423  
    424 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-codec-speex),) 
    425   CONFIGURE_ARGS+= \ 
    426         --with-speex="$(STAGING_DIR)/usr" 
    427   SITE_VARS+= \ 
    428         ac_cv_lib_speex_speex_encode=yes 
    429   EXTRA_CFLAGS+= -I$(STAGING_DIR)/usr/include/speex 
    430 else 
    431   CONFIGURE_ARGS+= \ 
    432         --without-speex 
    433 endif 
    434  
    435 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-res-crypto),) 
    436   CONFIGURE_ARGS+= \ 
    437         --with-ssl="$(STAGING_DIR)/usr" 
    438 else 
    439   CONFIGURE_ARGS+= \ 
    440         --without-ssl 
    441 endif 
    442  
    443 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-pgsql),) 
    444   CONFIGURE_ARGS+= \ 
    445         --with-postgres="$(STAGING_DIR)/usr" 
    446 else 
    447   CONFIGURE_ARGS+= \ 
    448         --without-postgres 
    449 endif 
    450  
    451 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk14-sqlite),) 
    452   CONFIGURE_ARGS+= \ 
    453         --with-sqlite="$(STAGING_DIR)/usr" 
    454 else 
    455   CONFIGURE_ARGS+= \ 
    456         --without-sqlite 
    457 endif 
    458  
    459  
    460 define Build/Configure 
    461         -rm $(PKG_BUILD_DIR)/menuselect.makeopts 
    462         ( cd $(PKG_BUILD_DIR); ./bootstrap.sh ) 
    463         $(call Build/Configure/Default,,$(SITE_VARS)) 
    464 endef 
    465  
    466 define Build/Compile 
    467         $(MAKE) -C "$(PKG_BUILD_DIR)" \ 
    468                 include/asterisk/version.h \ 
    469                 include/asterisk/buildopts.h defaults.h \ 
    470                 makeopts.embed_rules 
    471         $(call Build/Compile/chan-h323) 
    472         ASTCFLAGS="$(EXTRA_CFLAGS) -DLOW_MEMORY $(TARGET_CFLAGS)" \ 
    473         ASTLDFLAGS="$(EXTRA_LDFLAGS)" \ 
    474         $(MAKE) -C "$(PKG_BUILD_DIR)" \ 
    475                 ASTVARLIBDIR="/usr/lib/asterisk" \ 
    476                 NOISY_BUILD="1" \ 
    477                 DEBUG="" \ 
    478                 OPTIMIZE="" \ 
    479                 DESTDIR="$(PKG_INSTALL_DIR)" \ 
    480                 all install samples 
    481         $(SED) 's|/var/lib/asterisk|/usr/lib/asterisk|g' $(PKG_INSTALL_DIR)/etc/asterisk/musiconhold.conf 
    482  
    483         $(TARGET_CC) -O2 $(PKG_BUILD_DIR)/contrib/utils/rawplayer.c -o $(PKG_BUILD_DIR)/rawplayer 
    484 endef 
    485  
    486 define Build/InstallDev 
    487         $(INSTALL_DIR) $(1)/usr/include/asterisk/ 
    488         $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk/ 
    489         $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/ 
    490 endef 
    491  
    492  
    493 define Package/asterisk14/conffiles 
    494 /etc/asterisk/agents.conf 
    495 /etc/asterisk/alarmreceiver.conf 
    496 /etc/asterisk/amd.conf 
    497 /etc/asterisk/asterisk.conf 
    498 /etc/asterisk/cdr.conf 
    499 /etc/asterisk/cdr_custom.conf 
    500 /etc/asterisk/cdr_manager.conf 
    501 /etc/asterisk/codecs.conf 
    502 /etc/asterisk/dnsmgr.conf 
    503 /etc/asterisk/enum.conf 
    504 /etc/asterisk/extconfig.conf 
    505 /etc/asterisk/extensions.ael 
    506 /etc/asterisk/extensions.conf 
    507 /etc/asterisk/features.conf 
    508 /etc/asterisk/followme.conf 
    509 /etc/asterisk/http.conf 
    510 /etc/asterisk/iax.conf 
    511 /etc/asterisk/iaxprov.conf 
    512 /etc/asterisk/indications.conf 
    513 /etc/asterisk/logger.conf 
    514 /etc/asterisk/manager.conf 
    515 /etc/asterisk/misdn.conf 
    516 /etc/asterisk/modules.conf 
    517 /etc/asterisk/musiconhold.conf 
    518 /etc/asterisk/muted.conf 
    519 /etc/asterisk/osp.conf 
    520 /etc/asterisk/privacy.conf 
    521 /etc/asterisk/queues.conf 
    522 /etc/asterisk/rtp.conf 
    523 /etc/asterisk/say.conf 
    524 /etc/asterisk/sip.conf 
    525 /etc/asterisk/sip_notify.conf 
    526 /etc/asterisk/sla.conf 
    527 /etc/asterisk/smdi.conf 
    528 /etc/asterisk/udptl.conf 
    529 /etc/asterisk/users.conf 
    530 endef 
    531  
    532 #define Package/asterisk14/postinst 
    533 ##!/bin/sh 
    534 #ROOT=`echo $${PKG_ROOT} | sed 's:[\/]:\\\&:g' -` 
    535 #/bin/sed -i 's/\ \/etc/\ '$${ROOT}'etc/g' $${PKG_ROOT}/etc/asterisk/asterisk.conf 
    536 #/bin/sed -i 's/\ \/var/\ '$${ROOT}'var/g' $${PKG_ROOT}/etc/asterisk/asterisk.conf 
    537 #/bin/sed -i 's/\ \/usr/\ '$${ROOT}'usr/g' $${PKG_ROOT}/etc/asterisk/asterisk.conf 
    538 #/bin/sed -i 's/^DEST=/DEST='$${ROOT}'/g' $${PKG_ROOT}/etc/init.d/asterisk 
    539 #/bin/sed -i 's/OPTIONS=\"\"/OPTIONS=\"-C\ '$${ROOT}'etc\/asterisk\/asterisk.conf\"/g' $${PKG_ROOT}/etc/default/asterisk 
    540 #endef 
    541  
    542 define Package/asterisk14/install 
    543         $(CP) $(PKG_INSTALL_DIR)/* $(1) 
    544         rm -rf $(1)/usr/sbin/astgenkey 
    545         rm -rf $(1)/usr/sbin/aelparse 
    546         rm -rf $(1)/usr/sbin/autosupport 
    547         rm -rf $(1)/usr/sbin/muted 
    548         rm -rf $(1)/usr/sbin/stereorize 
    549         rm -rf $(1)/usr/bin 
    550         rm -rf $(1)/usr/man 
    551         rm -rf $(1)/usr/include 
    552         rm -rf $(1)/var 
    553         (cd $(1)/usr/lib/asterisk; \ 
    554                 rm -rf agi-bin; \ 
    555                 rm -rf images; \ 
    556                 rm -rf keys/*; \ 
    557                 rm -rf moh/*.wav; \ 
    558                 rm -rf sounds/*; \ 
    559                 cd modules; \ 
    560                 rm -rf  *adsi* *festival* *modem* *oss* *phone* *intercom* \ 
    561                         *mp3* *nbscat* *sqlite* *mysql* *postgres* *pgsql* \ 
    562                         *voicemail* *speex* *flash* *page* *meetme* *zap* *jpeg* \ 
    563                         *snmp* \ 
    564                         chan_alsa.so \ 
    565                         chan_oss.so \ 
    566                         chan_gtalk.so \ 
    567                         chan_h323.so \ 
    568                         chan_mgcp.so \ 
    569                         chan_skinny.so \ 
    570                         {codec,format}_ilbc.so \ 
    571                         codec_lpc10.so \ 
    572                         pbx_dundi.so \ 
    573                         res_agi.so \ 
    574                         res_crypto.so \ 
    575                         res_jabber.so \ 
    576         ) 
    577         (cd $(1)/etc/asterisk; \ 
    578                 rm -f   *odbc* *mysql* *postgres* *pgsql* *voicemail* \ 
    579                         *adsi* *oss* *alsa* *festival* *modem* *phone* \ 
    580                         *tds* *vofr* *rpt* *vpb* *snmp* \ 
    581                         *zapata* \ 
    582                         alsa.conf \ 
    583                         dundi.conf \ 
    584                         gtalk.conf \ 
    585                         h323.conf \ 
    586                         jabber.conf \ 
    587                         mgcp.conf \ 
    588                         skinny.conf \ 
    589         ) 
    590         $(INSTALL_DATA) ./files/modules.conf $(1)/etc/asterisk/ 
    591         $(INSTALL_DIR) $(1)/etc/default 
    592         $(INSTALL_DATA)  ./files/asterisk.default $(1)/etc/default/asterisk 
    593         $(INSTALL_DIR) $(1)/etc/init.d 
    594         $(INSTALL_BIN)  ./files/asterisk.init $(1)/etc/init.d/asterisk 
    595 endef 
    596  
    597  
    598 define Package/asterisk14-mini/conffiles 
    599 /etc/asterisk/asterisk.conf 
    600 /etc/asterisk/enum.conf 
    601 /etc/asterisk/extconfig.conf 
    602 /etc/asterisk/extensions.conf 
    603 /etc/asterisk/features.conf 
    604 /etc/asterisk/http.conf 
    605 /etc/asterisk/iax.conf 
    606 /etc/asterisk/iaxprov.conf 
    607 /etc/asterisk/logger.conf 
    608 /etc/asterisk/manager.conf 
    609 /etc/asterisk/modules.conf 
    610 /etc/asterisk/musiconhold.conf 
    611 /etc/asterisk/rtp.conf 
    612 /etc/asterisk/sip.conf 
    613 /etc/asterisk/sip_notify.conf 
    614 /etc/asterisk/users.conf 
    615 endef 
    616  
    617 define Package/asterisk14-mini/install 
    618         $(INSTALL_DIR) $(1)/etc/asterisk 
    619         for f in asterisk enum extconfig extensions features http \ 
    620                 iax iaxprov logger manager modules musiconhold rtp \ 
    621                 sip sip_notify users; do \ 
    622           $(CP) $(PKG_INSTALL_DIR)/etc/asterisk/$$$$f.conf $(1)/etc/asterisk/ ; \ 
    623         done 
    624         $(INSTALL_DATA) ./files/modules.conf $(1)/etc/asterisk/ 
    625         $(INSTALL_DIR) $(1)/usr/lib/asterisk 
    626         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/firmware $(1)/usr/lib/asterisk/ 
    627         $(INSTALL_DIR) $(1)/usr/lib/asterisk/keys 
    628         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    629         for f in app_dial chan_iax2 chan_local chan_sip codec_gsm \ 
    630                 codec_ulaw format_gsm format_pcm format_wav format_wav_gsm \ 
    631                 pbx_config res_features res_musiconhold; do \ 
    632           $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/$$$$f.so $(1)/usr/lib/asterisk/modules/ ; \ 
    633         done 
    634         $(INSTALL_DIR) $(1)/usr/lib/asterisk/moh 
    635         $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds 
    636         $(INSTALL_DIR) $(1)/usr/sbin 
    637         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/asterisk $(1)/usr/sbin/ 
    638         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/safe_asterisk $(1)/usr/sbin/ 
    639         $(INSTALL_DIR) $(1)/etc/default 
    640         $(INSTALL_DATA)  ./files/asterisk.default $(1)/etc/default/asterisk 
    641         $(INSTALL_DIR) $(1)/etc/init.d 
    642         $(INSTALL_BIN)  ./files/asterisk.init $(1)/etc/init.d/asterisk 
    643 endef 
    644  
    645  
    646 define Package/asterisk14-app-meetme/conffiles 
    647 /etc/asterisk/meetme.conf 
    648 endef 
    649  
    650 define Package/asterisk14-app-meetme/install 
    651         $(INSTALL_DIR) $(1)/etc/asterisk 
    652         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/meetme.conf $(1)/etc/asterisk/ 
    653         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    654         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_meetme.so $(1)/usr/lib/asterisk/modules/ 
    655 endef 
    656  
    657  
    658 define Package/asterisk14-chan-oss/conffiles 
    659 /etc/asterisk/oss.conf 
    660 endef 
    661  
    662 define Package/asterisk14-chan-oss/install 
    663         $(INSTALL_DIR) $(1)/etc/asterisk 
    664         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/oss.conf $(1)/etc/asterisk/ 
    665         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    666         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_oss.so $(1)/usr/lib/asterisk/modules/ 
    667 endef 
    668  
    669  
    670 define Package/asterisk14-app-meetme/conffiles 
    671 /etc/asterisk/meetme.conf 
    672 endef 
    673  
    674 define Package/asterisk14-app-meetme/install 
    675         $(INSTALL_DIR) $(1)/etc/asterisk 
    676         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/meetme.conf $(1)/etc/asterisk/ 
    677         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    678         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_meetme.so $(1)/usr/lib/asterisk/modules/ 
    679 endef 
    680  
    681  
    682 define Package/asterisk14-chan-oss/conffiles 
    683 /etc/asterisk/oss.conf 
    684 endef 
    685  
    686 define Package/asterisk14-chan-oss/install 
    687         $(INSTALL_DIR) $(1)/etc/asterisk 
    688         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/oss.conf $(1)/etc/asterisk/ 
    689         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    690         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_oss.so $(1)/usr/lib/asterisk/modules/ 
    691 endef 
    692  
    693  
    694 define Package/asterisk14-chan-alsa/conffiles 
    695 /etc/asterisk/alsa.conf 
    696 endef 
    697  
    698 define Package/asterisk14-chan-alsa/install 
    699         $(INSTALL_DIR) $(1)/etc/asterisk 
    700         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/alsa.conf $(1)/etc/asterisk/ 
    701         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    702         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_alsa.so $(1)/usr/lib/asterisk/modules/ 
    703 endef 
    704  
    705  
    706 define Package/asterisk14-chan-gtalk/conffiles 
    707 /etc/asterisk/gtalk.conf 
    708 /etc/asterisk/jabber.conf 
    709 endef 
    710  
    711 define Package/asterisk14-chan-gtalk/install 
    712         $(INSTALL_DIR) $(1)/etc/asterisk 
    713         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/gtalk.conf $(1)/etc/asterisk/ 
    714         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/jabber.conf $(1)/etc/asterisk/ 
    715         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    716         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_gtalk.so $(1)/usr/lib/asterisk/modules/ 
    717         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_jabber.so $(1)/usr/lib/asterisk/modules/ 
    718 endef 
    719  
    720  
    721 define Package/asterisk14-chan-h323/conffiles 
    722 /etc/asterisk/h323.conf 
    723 endef 
    724  
    725 define Package/asterisk14-chan-h323/install 
    726         $(INSTALL_DIR) $(1)/etc/asterisk 
    727         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/h323.conf $(1)/etc/asterisk/ 
    728         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    729         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_h323.so $(1)/usr/lib/asterisk/modules/ 
    730 endef 
    731  
    732  
    733 define Package/asterisk14-chan-mgcp/install 
    734 /etc/asterisk/mgcp.conf 
    735 endef 
    736  
    737 define Package/asterisk14-chan-mgcp/install 
    738         $(INSTALL_DIR) $(1)/etc/asterisk 
    739         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/mgcp.conf $(1)/etc/asterisk/ 
    740         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    741         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_mgcp.so $(1)/usr/lib/asterisk/modules/ 
    742 endef 
    743  
    744  
    745 define Package/asterisk14-chan-skinny/conffiles 
    746 /etc/asterisk/skinny.conf 
    747 endef 
    748  
    749 define Package/asterisk14-chan-skinny/install 
    750         $(INSTALL_DIR) $(1)/etc/asterisk 
    751         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/skinny.conf $(1)/etc/asterisk/ 
    752         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    753         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_skinny.so $(1)/usr/lib/asterisk/modules/ 
    754 endef 
    755  
    756  
    757 #define Package/asterisk14-codec-ilbc/install 
    758 #       $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    759 #       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/codec_ilbc.so $(1)/usr/lib/asterisk/modules/ 
    760 #       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/format_ilbc.so $(1)/usr/lib/asterisk/modules/ 
    761 #endef 
    762  
    763  
    764 define Package/asterisk14-codec-lpc10/install 
    765         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    766         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/codec_lpc10.so $(1)/usr/lib/asterisk/modules/ 
    767 endef 
    768  
    769  
    770 define Package/asterisk14-codec-speex/install 
    771         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    772         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/codec_speex.so $(1)/usr/lib/asterisk/modules/ 
    773 endef 
    774  
    775  
    776 define Package/asterisk14-pbx-dundi/conffiles 
    777 /etc/asterisk/dundi.conf 
    778 endef 
    779  
    780 define Package/asterisk14-pbx-dundi/install 
    781         $(INSTALL_DIR) $(1)/etc/asterisk 
    782         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/dundi.conf $(1)/etc/asterisk/ 
    783         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    784         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/pbx_dundi.so $(1)/usr/lib/asterisk/modules/ 
    785 endef 
    786  
    787  
    788 define Package/asterisk14-res-agi/install 
    789         $(INSTALL_DIR) $(1)/usr/lib/asterisk/agi-bin 
    790         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    791         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_agi.so $(1)/usr/lib/asterisk/modules/ 
    792 endef 
    793  
    794  
    795 define Package/asterisk14-res-crypto/install 
    796         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    797         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_crypto.so $(1)/usr/lib/asterisk/modules/ 
    798 endef 
    799  
    800  
    801 define Package/asterisk14-pgsql/conffiles 
    802 /etc/asterisk/cdr_pgsql.conf 
    803 /etc/asterisk/res_pgsql.conf 
    804 endef 
    805  
    806 define Package/asterisk14-pgsql/install 
    807         $(INSTALL_DIR) $(1)/etc/asterisk 
    808         install -m0600 $(PKG_INSTALL_DIR)/etc/asterisk/cdr_pgsql.conf $(1)/etc/asterisk/ 
    809         install -m0600 $(PKG_INSTALL_DIR)/etc/asterisk/res_pgsql.conf $(1)/etc/asterisk/ 
    810         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    811         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/cdr_pgsql.so $(1)/usr/lib/asterisk/modules/ 
    812         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_config_pgsql.so $(1)/usr/lib/asterisk/modules/ 
    813 endef 
    814  
    815  
    816 define Package/asterisk14-sqlite/install 
    817         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    818         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/cdr_sqlite.so $(1)/usr/lib/asterisk/modules/ 
    819 endef 
    820  
    821  
    822 define Package/asterisk14-sounds/install 
    823         $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds 
    824         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/* $(1)/usr/lib/asterisk/sounds/ 
    825         rm -f $(1)/usr/lib/asterisk/sounds/vm-* 
    826         rm -f $(1)/usr/lib/asterisk/sounds/x 
    827 endef 
    828  
    829  
    830 define Package/asterisk14-voicemail/conffiles 
    831 /etc/asterisk/voicemail.conf 
    832 endef 
    833  
    834 define Package/asterisk14-voicemail/install 
    835         $(INSTALL_DIR) $(1)/etc/asterisk 
    836         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/voicemail.conf $(1)/etc/asterisk/ 
    837         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    838         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*voicemail.so $(1)/usr/lib/asterisk/modules/ 
    839         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_adsi.so $(1)/usr/lib/asterisk/modules/ 
    840         $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds 
    841         $(CP) $(PKG_INSTALL_DIR)//usr/lib/asterisk/sounds/vm-*.gsm $(1)/usr/lib/asterisk/sounds/ 
    842 endef 
    843  
    844 define Package/asterisk14-rawplayer/install 
    845         $(INSTALL_DIR) $(1)/usr/bin 
    846         $(INSTALL_BIN)  $(PKG_BUILD_DIR)/rawplayer \ 
    847                         $(1)/usr/bin 
    848 endef 
    849  
    850  
    851 $(eval $(call BuildPackage,asterisk14)) 
    852 $(eval $(call BuildPackage,asterisk14-mini)) 
    853 $(eval $(call BuildPackage,asterisk14-app-meetme)) 
    854 $(eval $(call BuildPackage,asterisk14-chan-oss)) 
    855 $(eval $(call BuildPackage,asterisk14-chan-alsa)) 
    856 $(eval $(call BuildPackage,asterisk14-chan-gtalk)) 
    857 $(eval $(call BuildPackage,asterisk14-chan-h323)) 
    858 $(eval $(call BuildPackage,asterisk14-chan-mgcp)) 
    859 $(eval $(call BuildPackage,asterisk14-chan-skinny)) 
    860 #$(eval $(call BuildPackage,asterisk14-codec-ilbc)) 
    861 $(eval $(call BuildPackage,asterisk14-codec-lpc10)) 
    862 $(eval $(call BuildPackage,asterisk14-codec-speex)) 
    863 $(eval $(call BuildPackage,asterisk14-pbx-dundi)) 
    864 $(eval $(call BuildPackage,asterisk14-res-agi)) 
    865 $(eval $(call BuildPackage,asterisk14-res-crypto)) 
    866 $(eval $(call BuildPackage,asterisk14-pgsql)) 
    867 $(eval $(call BuildPackage,asterisk14-sqlite)) 
    868 $(eval $(call BuildPackage,asterisk14-voicemail)) 
    869 $(eval $(call BuildPackage,asterisk14-sounds)) 
    870 $(eval $(call BuildPackage,asterisk14-rawplayer)) 
  • asterisk-1.6.x/files/asterisk.init

     
    1 #!/bin/sh /etc/rc.common 
    2 # Copyright (C) 2008 OpenWrt.org 
    3 START=50  
    4  
    5 DEST= 
    6 DEFAULT=$DEST/etc/default/asterisk 
    7 OPTIONS="" 
    8  
    9 start() { 
    10         [ -f $DEFAULT ] && . $DEFAULT 
    11         [ -d $DEST/var/run/asterisk ] || mkdir -p $DEST/var/run/asterisk 
    12         [ -d $DEST/var/log/asterisk ] || mkdir -p $DEST/var/log/asterisk 
    13         [ -d $DEST/var/spool/asterisk ] || mkdir -p $DEST/var/spool/asterisk 
    14         [ -d /var/spool/asterisk ] || mkdir -p /var/spool/asterisk 
    15         [ -h $DEST/usr/lib/asterisk/astdb ] || ln -sf /var/spool/asterisk/astdb $DEST/usr/lib/asterisk/astdb 
    16         $DEST/usr/sbin/asterisk $OPTIONS 
    17 } 
    18  
    19 stop() { 
    20         [ -f $DEST/var/run/asterisk/asterisk.pid ] && kill $(cat $DEST/var/run/asterisk/asterisk.pid) >/dev/null 2>&1 
    21 } 
  • asterisk-1.6.x/files/asterisk.default

     
    1 ## startup options for /etc/init.d/asterisk 
    2  
    3 ENABLE_ASTERISK="yes" 
    4 OPTIONS="" 
  • asterisk-1.6.x/patches/100-build_tools-iconv.patch

     
    1 diff -Nru asterisk-1.6.2.0-beta2.org/build_tools/menuselect-deps.in asterisk-1.6.2.0-beta2/build_tools/menuselect-deps.in 
    2 --- asterisk-1.6.2.0-beta2.org/build_tools/menuselect-deps.in   2009-01-15 21:18:53.000000000 +0100 
    3 +++ asterisk-1.6.2.0-beta2/build_tools/menuselect-deps.in       2009-06-04 19:37:42.000000000 +0200 
    4 @@ -11,7 +11,7 @@ 
    5  GTK=@PBX_GTK@ 
    6  H323=@PBX_H323@ 
    7  HOARD=@PBX_HOARD@ 
    8 -ICONV=@PBX_ICONV@ 
    9 +ICONV=0 
    10  IKSEMEL=@PBX_IKSEMEL@ 
    11  IMAP_TK=@PBX_IMAP_TK@ 
    12  IODBC=@PBX_IODBC@ 
  • asterisk-1.6.x/Makefile

     
    1 # 
    2 # Copyright (C) 2008-2010 OpenWrt.org 
    3 # 
    4 # This is free software, licensed under the GNU General Public License v2. 
    5 # See /LICENSE for more information. 
    6 # 
    7  
    8 include $(TOPDIR)/rules.mk 
    9  
    10 PKG_NAME:=asterisk 
    11 PKG_VERSION:=1.6.2.14 
    12 PKG_RELEASE:=1 
    13  
    14 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz 
    15 PKG_SOURCE_URL:=http://downloads.digium.com/pub/asterisk/releases/ 
    16 PKG_MD5SUM:=4f0414c9b2d449222b2fc7096cbaffe7 
    17  
    18 include $(INCLUDE_DIR)/package.mk 
    19  
    20 define Package/asterisk16/Default 
    21   SUBMENU:=asterisk16 (Complete Open Source PBX), v1.6.x 
    22   SECTION:=net 
    23   CATEGORY:=Network 
    24   URL:=http://www.asterisk.org/ 
    25   MAINTAINER:=Hans Zandbelt <hans.zandbelt@gmail.com> 
    26 endef 
    27  
    28 define Package/asterisk16/Default/description 
    29  Asterisk is a complete PBX in software. It provides all of the features 
    30  you would expect from a PBX and more. Asterisk does voice over IP in three 
    31  protocols, and can interoperate with almost all standards-based telephony 
    32  equipment using relatively inexpensive hardware. 
    33 endef 
    34  
    35  
    36 define Package/asterisk16 
    37 $(call Package/asterisk16/Default) 
    38   TITLE:=Complete open source PBX 
    39   DEPENDS:= +libopenssl +libncurses +libpopt +libpthread +zlib @!TARGET_avr32 @!PACKAGE_asterisk14 
    40 endef 
    41  
    42 define Package/asterisk16/description 
    43 $(call Package/asterisk16/Default/description) 
    44 endef 
    45  
    46 define Package/asterisk16-sounds 
    47 $(call Package/asterisk16/Default) 
    48   TITLE:=Sound files 
    49   DEPENDS:= +asterisk16 
    50 endef 
    51  
    52 define Package/asterisk16-sounds/description 
    53 $(call Package/asterisk16/Default/description) 
    54  This package contains sound files for Asterisk. 
    55 endef 
    56  
    57  
    58 define Package/asterisk16-voicemail 
    59 $(call Package/asterisk16/Default) 
    60   TITLE:=Voicemail support 
    61   DEPENDS:= +asterisk16 
    62 endef 
    63  
    64 define Package/asterisk16-voicemail/description 
    65 $(call Package/asterisk16/Default/description) 
    66  This package contains voicemail related modules for Asterisk. 
    67 endef 
    68  
    69 define Package/asterisk16-app-meetme 
    70 $(call Package/asterisk16/Default) 
    71   TITLE:=conferencing support 
    72   DEPENDS:= +asterisk16 +dahdi-tools-libtonezone +kmod-dahdi-linux 
    73 endef 
    74  
    75 define Package/asterisk16-app-meetme/description 
    76 $(call Package/asterisk16/Default/description) 
    77  This package provides the MeetMe application driver Conferencing support to 
    78  Asterisk. 
    79 endef 
    80  
    81 define Package/asterisk16-chan-iax2 
    82 $(call Package/asterisk16/Default) 
    83   TITLE:=IAX support 
    84   DEPENDS:= +asterisk16 
    85 endef 
    86  
    87 define Package/asterisk16-chan-iax2/description 
    88 $(call Package/asterisk16/Default/description) 
    89  This package provides IAX support to 
    90  Asterisk. 
    91 endef 
    92  
    93 define Package/asterisk16-cdr 
    94 $(call Package/asterisk16/Default) 
    95   TITLE:=CDR support 
    96   DEPENDS:= +asterisk16 
    97 endef 
    98  
    99 define Package/asterisk16-cdr/description 
    100 $(call Package/asterisk16/Default/description) 
    101  This package provides Call Detail Record support to 
    102  Asterisk. 
    103 endef 
    104  
    105 define Package/asterisk16-res-musiconhold 
    106 $(call Package/asterisk16/Default) 
    107   TITLE:=MOH support 
    108   DEPENDS:= +asterisk16 
    109 endef 
    110  
    111 define Package/asterisk16-res-musiconhold/description 
    112 $(call Package/asterisk16/Default/description) 
    113  This package provides Music On Hold support to 
    114  Asterisk. 
    115 endef 
    116  
    117 define Package/asterisk16-chan-gtalk 
    118 $(call Package/asterisk16/Default) 
    119   TITLE:=GTalk support 
    120   DEPENDS:= +asterisk16 +libiksemel 
    121 endef 
    122  
    123 define Package/asterisk16-chan-gtalk/description 
    124 $(call Package/asterisk16/Default/description) 
    125  This package provides the channel chan_gtalk and res_jabber for GTalk 
    126  support to Asterisk. 
    127 endef 
    128  
    129 define Package/asterisk16-curl 
    130 $(call Package/asterisk16/Default) 
    131   TITLE:=CURL support 
    132   DEPENDS:= +asterisk16 +libcurl 
    133 endef 
    134  
    135 define Package/asterisk16-curl/description 
    136 $(call Package/asterisk16/Default/description) 
    137  This package provides CURL 
    138  support to Asterisk. 
    139 endef 
    140   
    141 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk16-app-meetme),) 
    142   CONFIGURE_ARGS+= \ 
    143         --with-dahdi="$(STAGING_DIR)/usr" 
    144 else 
    145   CONFIGURE_ARGS+= \ 
    146         --without-dahdi 
    147 endif 
    148  
    149 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk16-chan-gtalk),) 
    150   CONFIGURE_ARGS+= \ 
    151         --with-gnutls="$(STAGING_DIR)/usr" \ 
    152         --with-iksemel="$(STAGING_DIR)/usr" 
    153   SITE_VARS+= \ 
    154         ac_cv_lib_iksemel_iks_start_sasl=yes \ 
    155         ac_cv_lib_gnutls_gnutls_bye=yes 
    156 else 
    157   CONFIGURE_ARGS+= \ 
    158         --without-gnutls \ 
    159         --without-iksemel 
    160 endif 
    161  
    162 ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk16-curl),) 
    163   CONFIGURE_ARGS+= \ 
    164         --with-curl="$(STAGING_DIR)/usr" 
    165 else 
    166   CONFIGURE_ARGS+= \ 
    167         --without-curl 
    168 endif 
    169  
    170 CONFIGURE_ARGS+= \ 
    171         --without-curses \ 
    172         --with-gsm=internal \ 
    173         --without-gtk \ 
    174         --without-gtk2 \ 
    175         --without-isdnnet \ 
    176         --without-kde \ 
    177         --without-misdn \ 
    178         --without-nbs \ 
    179         --with-ncurses="$(STAGING_DIR)/usr" \ 
    180         --without-netsnmp \ 
    181         --without-newt \ 
    182         --without-odbc \ 
    183         --without-ogg \ 
    184         --without-osptk \ 
    185         --with-popt="$(STAGING_DIR)/usr" \ 
    186         --without-pri \ 
    187         --without-qt \ 
    188         --without-radius \ 
    189         --without-sdl \ 
    190         --without-spandsp \ 
    191         --without-suppserv \ 
    192         --without-tds \ 
    193         --without-termcap \ 
    194         --without-tinfo \ 
    195         --without-vorbis \ 
    196         --without-vpb \ 
    197         --with-z="$(STAGING_DIR)/usr" \ 
    198         --disable-xmldoc 
    199  
    200 EXTRA_CFLAGS+= $(TARGET_CPPFLAGS) 
    201 EXTRA_LDFLAGS+= $(TARGET_LDFLAGS) 
    202  
    203 define Build/Configure 
    204         -rm $(PKG_BUILD_DIR)/menuselect.makeopts 
    205         $(call Build/Configure/Default,,$(SITE_VARS)) 
    206 endef 
    207  
    208 define Build/Compile 
    209         $(MAKE) -C "$(PKG_BUILD_DIR)" \ 
    210                 include/asterisk/version.h \ 
    211                 include/asterisk/buildopts.h defaults.h \ 
    212                 makeopts.embed_rules 
    213         ASTCFLAGS="$(EXTRA_CFLAGS) -DLOW_MEMORY" \ 
    214         ASTLDFLAGS="$(EXTRA_LDFLAGS)" \ 
    215         $(MAKE) -C "$(PKG_BUILD_DIR)" \ 
    216                 ASTVARLIBDIR="/usr/lib/asterisk" \ 
    217                 NOISY_BUILD="1" \ 
    218                 DEBUG="" \ 
    219                 OPTIMIZE="" \ 
    220                 DESTDIR="$(PKG_INSTALL_DIR)" \ 
    221                 all install samples 
    222         $(SED) 's|/var/lib/asterisk|/usr/lib/asterisk|g' $(PKG_INSTALL_DIR)/etc/asterisk/musiconhold.conf 
    223 endef 
    224  
    225 #define Build/InstallDev 
    226 #       $(INSTALL_DIR) $(1)/usr/include/asterisk/ 
    227 #       $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk/ 
    228 #       $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/ 
    229 #endef 
    230  
    231 define Package/asterisk16/conffiles 
    232 /etc/asterisk/asterisk.conf 
    233 /etc/asterisk/modules.conf 
    234 /etc/asterisk/extensions.conf 
    235 /etc/asterisk/sip.conf 
    236 /etc/asterisk/sip_notify.conf 
    237 /etc/asterisk/features.conf 
    238 /etc/asterisk/indications.conf 
    239 /etc/asterisk/logger.conf 
    240 /etc/asterisk/manager.conf 
    241 /etc/asterisk/rtp.conf 
    242 /etc/default/asterisk 
    243 /etc/init.d/asterisk 
    244 endef 
    245  
    246 define Package/asterisk16/install 
    247         $(INSTALL_DIR) $(1)/etc/asterisk 
    248         for f in asterisk extensions features \ 
    249                 indications logger manager modules \ 
    250                 sip sip_notify rtp; do \ 
    251                 $(CP) $(PKG_INSTALL_DIR)/etc/asterisk/$$$$f.conf $(1)/etc/asterisk/ ; \ 
    252         done 
    253         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    254         for f in app_dial app_echo app_playback app_macro \ 
    255                 chan_sip \ 
    256                 codec_ulaw codec_gsm \ 
    257                 format_gsm format_pcm format_wav format_wav_gsm \ 
    258                 pbx_config \ 
    259                 func_strings func_timeout func_callerid func_logic; do \ 
    260                 $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/$$$$f.so $(1)/usr/lib/asterisk/modules/ ; \ 
    261         done 
    262         $(INSTALL_DIR) $(1)/usr/sbin 
    263         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/asterisk $(1)/usr/sbin/ 
    264         $(INSTALL_DIR) $(1)/etc/default 
    265         $(INSTALL_DATA)  ./files/asterisk.default $(1)/etc/default/asterisk 
    266         $(INSTALL_DIR) $(1)/etc/init.d 
    267         $(INSTALL_BIN)  ./files/asterisk.init $(1)/etc/init.d/asterisk 
    268 endef 
    269  
    270 define Package/asterisk16-sounds/install 
    271         $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/ 
    272         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/ 
    273         rm -f $(1)/usr/lib/asterisk/sounds/vm-* 
    274         rm -f $(1)/usr/lib/asterisk/sounds/conf-* 
    275 endef 
    276  
    277  
    278 define Package/asterisk16-voicemail/conffiles 
    279 /etc/asterisk/voicemail.conf 
    280 endef 
    281  
    282 define Package/asterisk16-voicemail/install 
    283         $(INSTALL_DIR) $(1)/etc/asterisk 
    284         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/voicemail.conf $(1)/etc/asterisk/ 
    285         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    286         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*voicemail.so $(1)/usr/lib/asterisk/modules/ 
    287         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_adsi.so $(1)/usr/lib/asterisk/modules/ 
    288         $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/ 
    289         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/vm-*.gsm $(1)/usr/lib/asterisk/sounds/ 
    290 endef 
    291  
    292 define Package/asterisk16-app-meetme/conffiles 
    293 /etc/asterisk/meetme.conf 
    294 endef 
    295  
    296 define Package/asterisk16-app-meetme/install 
    297         $(INSTALL_DIR) $(1)/etc/asterisk 
    298         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/meetme.conf $(1)/etc/asterisk/ 
    299         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    300         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/app_meetme.so $(1)/usr/lib/asterisk/modules/ 
    301         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_dahdi.so $(1)/usr/lib/asterisk/modules/ 
    302         $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/ 
    303         $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/conf-*.gsm $(1)/usr/lib/asterisk/sounds/ 
    304 endef 
    305  
    306 define Package/asterisk16-chan-iax2/conffiles 
    307 /etc/asterisk/iax.conf 
    308 /etc/asterisk/iaxprov.conf 
    309 endef 
    310  
    311 define Package/asterisk16-cdr/conffiles 
    312 /etc/asterisk/cdr.conf 
    313 /etc/asterisk/cdr_custom.conf 
    314 /etc/asterisk/cdr_manager.conf 
    315 /etc/asterisk/cdr_odbc.conf 
    316 /etc/asterisk/cdr_pgsql.conf 
    317 /etc/asterisk/cdr_tds.conf 
    318 endef 
    319  
    320 define Package/asterisk16-res-musiconhold/conffiles 
    321 /etc/asterisk/musiconhold.conf 
    322 endef 
    323  
    324 define Package/asterisk16-chan-iax2/install 
    325         $(INSTALL_DIR) $(1)/etc/asterisk 
    326         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/iax.conf $(1)/etc/asterisk/ 
    327         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/iaxprov.conf $(1)/etc/asterisk/ 
    328         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    329         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_iax2.so $(1)/usr/lib/asterisk/modules/ 
    330 endef 
    331  
    332 define Package/asterisk16-cdr/install 
    333         $(INSTALL_DIR) $(1)/etc/asterisk 
    334         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/cdr*.conf $(1)/etc/asterisk/ 
    335         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    336         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*cdr*.so $(1)/usr/lib/asterisk/modules/ 
    337 endef 
    338  
    339 define Package/asterisk16-res-musiconhold/install 
    340         $(INSTALL_DIR) $(1)/etc/asterisk 
    341         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/musiconhold.conf $(1)/etc/asterisk/ 
    342         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    343         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_musiconhold.so $(1)/usr/lib/asterisk/modules/ 
    344 endef 
    345  
    346 define Package/asterisk16-chan-gtalk/conffiles 
    347 /etc/asterisk/gtalk.conf 
    348 /etc/asterisk/jabber.conf 
    349 endef 
    350  
    351 define Package/asterisk16-chan-gtalk/install 
    352         $(INSTALL_DIR) $(1)/etc/asterisk 
    353         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/gtalk.conf $(1)/etc/asterisk/ 
    354         $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/asterisk/jabber.conf $(1)/etc/asterisk/ 
    355         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    356         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_gtalk.so $(1)/usr/lib/asterisk/modules/ 
    357         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_jabber.so $(1)/usr/lib/asterisk/modules/ 
    358 endef 
    359  
    360 define Package/asterisk16-curl/install 
    361         $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules 
    362         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/func_curl.so $(1)/usr/lib/asterisk/modules/ 
    363         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/res_curl.so $(1)/usr/lib/asterisk/modules/ 
    364 endef 
    365  
    366 define BuildAsterisk16ModuleTemplate 
    367  
    368   define Package/asterisk16-$(subst _,-,$(1)) 
    369   $$(call Package/asterisk16/Default) 
    370     TITLE:=$(2) support 
    371     DEPENDS:= +asterisk16 
    372   endef 
    373  
    374   define Package/asterisk16-$(subst _,-,$(1))/description 
    375   $$(call Package/asterisk16/Default/description) 
    376     This package provides support $(3) in Asterisk. 
    377   endef 
    378  
    379   define Package/asterisk16-$(subst _,-,$(1))/install 
    380         $(INSTALL_DIR) $$(1)/usr/lib/asterisk/modules 
    381         $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/$(1).so $$(1)/usr/lib/asterisk/modules/ 
    382   endef 
    383  
    384   $$(eval $$(call BuildPackage,asterisk16-$(subst _,-,$(1)))) 
    385 endef 
    386  
    387 $(eval $(call BuildPackage,asterisk16)) 
    388 $(eval $(call BuildPackage,asterisk16-voicemail)) 
    389 $(eval $(call BuildPackage,asterisk16-sounds)) 
    390 #$(eval $(call BuildPackage,asterisk16-app-meetme)) 
    391 $(eval $(call BuildPackage,asterisk16-chan-iax2)) 
    392 $(eval $(call BuildPackage,asterisk16-cdr)) 
    393 $(eval $(call BuildPackage,asterisk16-res-musiconhold)) 
    394 $(eval $(call BuildPackage,asterisk16-chan-gtalk)) 
    395 $(eval $(call BuildPackage,asterisk16-curl)) 
    396 $(eval $(call BuildAsterisk16ModuleTemplate,app_authenticate,Authenticate,support for executing arbitrary authenticate commands)) 
    397 $(eval $(call BuildAsterisk16ModuleTemplate,app_chanisavail,Channel availability check,support for checking if a channel is available)) 
    398 $(eval $(call BuildAsterisk16ModuleTemplate,app_chanspy,Channel listen in,support for listening in on any channel)) 
    399 $(eval $(call BuildAsterisk16ModuleTemplate,app_directed_pickup,Directed call pickup,support for directed call pickup)) 
    400 $(eval $(call BuildAsterisk16ModuleTemplate,app_exec,Exec application,support for application execution)) 
    401 $(eval $(call BuildAsterisk16ModuleTemplate,app_minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail system)) 
    402 $(eval $(call BuildAsterisk16ModuleTemplate,app_readexten,Extension to variable,a trivial application to read an extension into a variable)) 
    403 $(eval $(call BuildAsterisk16ModuleTemplate,app_read,Variable read,a trivial application to read a variable)) 
    404 $(eval $(call BuildAsterisk16ModuleTemplate,app_sayunixtime,Say Unix time,an application to say Unix time)) 
    405 $(eval $(call BuildAsterisk16ModuleTemplate,app_sms,SMS,SMS support (ETSI ES 201 912 protocol 1))) 
    406 $(eval $(call BuildAsterisk16ModuleTemplate,app_stack,Stack applications, stack applications Gosub Return etc.)) 
    407 $(eval $(call BuildAsterisk16ModuleTemplate,app_system,System exec,support for executing system commands)) 
    408 $(eval $(call BuildAsterisk16ModuleTemplate,app_talkdetect,File playback with audio detect,for file playback with audio detect)) 
    409 $(eval $(call BuildAsterisk16ModuleTemplate,app_waituntil,Sleep,support sleeping until the given epoch)) 
    410 $(eval $(call BuildAsterisk16ModuleTemplate,app_while,While loop,a while loop implementation)) 
    411 $(eval $(call BuildAsterisk16ModuleTemplate,chan_agent,Agents proxy channel, an implementation of agents proxy channel)) 
    412 $(eval $(call BuildAsterisk16ModuleTemplate,chan_local,Local proxy channel, an implementation of local proxy channel)) 
    413 $(eval $(call BuildAsterisk16ModuleTemplate,codec_ulaw,Signed linear to ulaw translation,translation between signed linear and ulaw codecs)) 
    414 $(eval $(call BuildAsterisk16ModuleTemplate,codec_a_mu,Alaw to ulaw translation,translation between alaw and ulaw codecs)) 
    415 $(eval $(call BuildAsterisk16ModuleTemplate,codec_g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs)) 
    416 $(eval $(call BuildAsterisk16ModuleTemplate,format_g726,G.726,support for headerless G.726 16/24/32/40kbps data format)) 
    417 $(eval $(call BuildAsterisk16ModuleTemplate,format_g729,G.729,support for raw headerless G729 data)) 
    418 $(eval $(call BuildAsterisk16ModuleTemplate,format_sln,Raw slinear format,support for raw slinear format)) 
    419 $(eval $(call BuildAsterisk16ModuleTemplate,format_sln16,Raw slinear 16 format,support for Raw slinear 16 format)) 
    420 $(eval $(call BuildAsterisk16ModuleTemplate,func_db,Database interaction,functions for interaction with the database)) 
    421 $(eval $(call BuildAsterisk16ModuleTemplate,func_devstate,Blinky lights control,functions for manually controlled blinky lights)) 
    422 $(eval $(call BuildAsterisk16ModuleTemplate,func_vmcount,vmcount dialplan,a vmcount dialplan function)) 
    423 $(eval $(call BuildAsterisk16ModuleTemplate,func_extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control)) 
    424 $(eval $(call BuildAsterisk16ModuleTemplate,func_global,Global variable,global variable dialplan functions)) 
    425 $(eval $(call BuildAsterisk16ModuleTemplate,func_shell,Shell,support for shell execution)) 
    426 $(eval $(call BuildAsterisk16ModuleTemplate,pbx_ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic)) 
    427 $(eval $(call BuildAsterisk16ModuleTemplate,res_ael_share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules)) 
    428 $(eval $(call BuildAsterisk16ModuleTemplate,pbx_spool,Call Spool,outgoing call spool support)) 
    429 $(eval $(call BuildAsterisk16ModuleTemplate,res_agi,Asterisk Gateway Interface,support for the Asterisk Gateway Interface extension)) 
    430 $(eval $(call BuildAsterisk16ModuleTemplate,app_alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID)) 
    431 $(eval $(call BuildAsterisk16ModuleTemplate,app_setcallerid,Set callerid,support for setting callerid)) 
    432 $(eval $(call BuildAsterisk16ModuleTemplate,app_verbose,Verbose logging,Verbose logging application)) 
    433 $(eval $(call BuildAsterisk16ModuleTemplate,func_channel,Channel info,Channel info dialplan function)) 
    434 $(eval $(call BuildAsterisk16ModuleTemplate,func_blacklist,Blacklist on callerid,looking up the callerid number, and see if it is blacklisted)) 
    435 $(eval $(call BuildAsterisk16ModuleTemplate,app_originate,Originate a call,originating an outbound call and connecting it to a specified extension or application))