ports/110601: [ PATCH ] do you know net/asterisk 1.2.14, 15, 16 has been released ?
Dan Lukes
dan at obluda.cz
Tue Mar 20 23:10:06 UTC 2007
>Number: 110601
>Category: ports
>Synopsis: [ PATCH ] do you know net/asterisk 1.2.14,15,16 has been released ?
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Tue Mar 20 23:10:05 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator: Dan Lukes
>Release: FreeBSD 6.2-STABLE i386
>Organization:
Obludarium
>Environment:
>Description:
port net/asterisk is 1.2.13 but current version is 1.2.16
>How-To-Repeat:
N/A
>Fix:
1. Remove files/patch-rtp.c (it's changes are in base sources already)
2. replace patch-Makefile patch-cdr::Makefile patch-channels::chan_sip.c patch-utils::Makefile in files/
3. replace Makefile distinfo pkg-plist in port base dir
4. make decision:
the recent EXTRA_PATCH incorporate codec negotiation extension
This patch seems to be unmaintained - the latest version is for 1.2.12
I modified it for 1.2.16, but I did it without deep understanding
the code of the patch. Althought it should work, it may not.
If you decide the patch shall be included, add
patch-zzz-asterisk-1.2.16.1-codec-negotiation-20070319
to files. This patch must be applied after all other patches,
thus -zzz- in name.
If you decide this unmaintained patch will not be supported
anymore then don't add the file.
Thank you for maintaining the port.
The attached files follows:
--- Makefile begins here ---
# New ports collection makefile for: asterisk
# Date created: 17 October 2003
# Whom: Maxim Sobolev <sobomax at portaone.com>
#
# $FreeBSD: ports/net/asterisk/Makefile,v 1.65 2007/02/23 22:51:11 mezz Exp $
#
PORTNAME= asterisk
PORTVERSION= 1.2.16
#PORTREVISION= 1
CATEGORIES= net
MASTER_SITES= http://ftp.digium.com/pub/asterisk/ \
http://ftp.digium.com/pub/asterisk/old-releases/
# Originaly obtained from http://unofficial.portaone.com/~bamby/public/
#EXTRA_PATCHES= ${FILESDIR}/extra-asterisk-1.2.16.1-codec-negotiation-20070319
# ${PORTNAME}-1.2.4-${BRIVER}.patch.gz:bristuff
# ${MASTER_SITE_LOCAL:S,$,:bristuff,}
#PATCH_SITE_SUBDIR= fjoe/:bristuff
#BRIVER= bristuff-0.3.0-PRE-1l
MAINTAINER= sobomax at FreeBSD.org
COMMENT= An Open Source PBX and telephony toolkit
BUILD_DEPENDS= mpg123:${PORTSDIR}/audio/mpg123
LIB_DEPENDS= speex.1:${PORTSDIR}/audio/speex \
newt.51:${PORTSDIR}/devel/newt \
curl.4:${PORTSDIR}/ftp/curl
RUN_DEPENDS= mpg123:${PORTSDIR}/audio/mpg123
ONLY_FOR_ARCHS= i386 sparc64 amd64
GNU_CONFIGURE= yes
CONFIGURE_WRKSRC= ${WRKSRC}/editline
USE_GMAKE= yes
USE_BISON= yes
USE_RC_SUBR= asterisk.sh
MAKE_ENV= PTHREAD_CFLAGS="${PTHREAD_CFLAGS}" \
PTHREAD_LIBS="${PTHREAD_LIBS}" \
MKDIR="${MKDIR}" \
PWLIBDIR=${LOCALBASE}/share/pwlib \
OPENH323DIR=${LOCALBASE}/share/openh323 \
OSVERSION=${OSVERSION} \
CXX="${CXX}"
PLIST_SUB= BRISTUFF="@comment "
MAN8= asterisk.8 astgenkey.8 autosupport.8 safe_asterisk.8
.include <bsd.port.pre.mk>
.if ${ARCH} != "i386"
WITHOUT_H323= 1
WITHOUT_ZAPTEL= 1
.endif
.if defined(WITHOUT_H323)
PLIST_SUB+= WITH_H323="@comment "
.else
LIB_DEPENDS+= pt_r.1:${PORTSDIR}/devel/pwlib\
h323_r.1:${PORTSDIR}/net/openh323
PLIST_SUB+= WITH_H323=""
MAKE_ENV+= WITH_H323=1
.endif
.if defined(WITHOUT_ZAPTEL)
PLIST_SUB+= WITH_ZAPTEL="@comment "
MAKE_ENV+= WITHOUT_ZAPTEL=1
.else
BUILD_DEPENDS+= libpri>=1.2.0:${PORTSDIR}/misc/libpri \
${LOCALBASE}/include/zaptel.h:${PORTSDIR}/misc/zaptel
LIB_DEPENDS+= pri.1:${PORTSDIR}/misc/libpri
RUN_DEPENDS+= ${LOCALBASE}/include/zaptel.h:${PORTSDIR}/misc/zaptel
PLIST_SUB+= WITH_ZAPTEL=""
MAKE_ENV+= WITH_ZAPTEL=1
.endif
#
# WITH_FREETDS, WITH_PGSQL and WITH_SQLITE can also be added to MAKE_ENV
# similarly
.if defined(WITHOUT_ODBC)
PLIST_SUB+= WITH_ODBC="@comment "
.else
LIB_DEPENDS+= odbc.1:${PORTSDIR}/databases/unixODBC
PLIST_SUB+= WITH_ODBC=""
MAKE_ENV+= WITH_ODBC=1
.endif
.if defined(WITHOUT_FAX)
PLIST_SUB+= WITH_FAX="@comment "
.else
MAKE_ENV+= WITH_FAX=1
LIB_DEPENDS+= spandsp.0:${PORTSDIR}/comms/spandsp
PLIST_SUB+= WITH_FAX=""
.endif
.if ${OSVERSION} >= 500036
PLIST_SUB+= NEWGCC=""
.else
PLIST_SUB+= NEWGCC="@comment "
.endif
post-patch:
${REINPLACE_CMD} -e 's|/var/lib|${PREFIX}/share|g' ${WRKSRC}/configs/musiconhold.conf.sample
.include <bsd.port.post.mk>
--- Makefile ends here ---
--- distinfo begins here ---
MD5 (asterisk-1.2.16.tar.gz) = 88cfcd5c3b2a8f2504e561cb93546299
SHA256 (asterisk-1.2.16.tar.gz) = cc70d2ff8a2cafe3c7cce10dc5e90146111bc686ed6e08fc753e950c7050611e
SIZE (asterisk-1.2.16.tar.gz) = 10612921
--- distinfo ends here ---
--- pkg-plist begins here ---
@unexec if cmp -s %D/etc/asterisk/adsi.conf %D/etc/asterisk/adsi.conf-dist; then rm -f %D/etc/asterisk/adsi.conf; fi
etc/asterisk/adsi.conf-dist
@exec [ -f %B/adsi.conf ] || cp %B/%f %B/adsi.conf
@unexec if cmp -s %D/etc/asterisk/adtranvofr.conf %D/etc/asterisk/adtranvofr.conf-dist; then rm -f %D/etc/asterisk/adtranvofr.conf; fi
etc/asterisk/adtranvofr.conf-dist
@exec [ -f %B/adtranvofr.conf ] || cp %B/%f %B/adtranvofr.conf
@unexec if cmp -s %D/etc/asterisk/agents.conf %D/etc/asterisk/agents.conf-dist; then rm -f %D/etc/asterisk/agents.conf; fi
etc/asterisk/agents.conf-dist
@exec [ -f %B/agents.conf ] || cp %B/%f %B/agents.conf
@unexec if cmp -s %D/etc/asterisk/alarmreceiver.conf %D/etc/asterisk/alarmreceiver.conf-dist; then rm -f %D/etc/asterisk/alarmreceiver.conf; fi
etc/asterisk/alarmreceiver.conf-dist
@exec [ -f %B/alarmreceiver.conf ] || cp %B/%f %B/alarmreceiver.conf
@unexec if cmp -s %D/etc/asterisk/alsa.conf %D/etc/asterisk/alsa.conf-dist; then rm -f %D/etc/asterisk/alsa.conf; fi
etc/asterisk/alsa.conf-dist
@exec [ -f %B/alsa.conf ] || cp %B/%f %B/alsa.conf
@unexec if cmp -s %D/etc/asterisk/asterisk.adsi %D/etc/asterisk/asterisk.adsi-dist; then rm -f %D/etc/asterisk/asterisk.adsi; fi
etc/asterisk/asterisk.adsi-dist
@exec [ -f %B/asterisk.adsi ] || cp %B/%f %B/asterisk.adsi
@unexec if cmp -s %D/etc/asterisk/asterisk.conf %D/etc/asterisk/asterisk.conf-dist; then rm -f %D/etc/asterisk/asterisk.conf; fi
etc/asterisk/asterisk.conf-dist
@exec [ -f %B/asterisk.conf ] || cp %B/%f %B/asterisk.conf
%%BRISTUFF%%@unexec if cmp -s %D/etc/asterisk/capi.conf %D/etc/asterisk/capi.conf-dist; then rm -f %D/etc/asterisk/capi.conf; fi
%%BRISTUFF%%etc/asterisk/capi.conf-dist
%%BRISTUFF%%@exec [ -f %B/capi.conf ] || cp %B/%f %B/capi.conf
@unexec if cmp -s %D/etc/asterisk/cdr.conf %D/etc/asterisk/cdr.conf-dist; then rm -f %D/etc/asterisk/cdr.conf; fi
etc/asterisk/cdr.conf-dist
@exec [ -f %B/cdr.conf ] || cp %B/%f %B/cdr.conf
@unexec if cmp -s %D/etc/asterisk/cdr_custom.conf %D/etc/asterisk/cdr_custom.conf-dist; then rm -f %D/etc/asterisk/cdr_custom.conf; fi
etc/asterisk/cdr_custom.conf-dist
@exec [ -f %B/cdr_custom.conf ] || cp %B/%f %B/cdr_custom.conf
@unexec if cmp -s %D/etc/asterisk/cdr_manager.conf %D/etc/asterisk/cdr_manager.conf-dist; then rm -f %D/etc/asterisk/cdr_manager.conf; fi
etc/asterisk/cdr_manager.conf-dist
@exec [ -f %B/cdr_manager.conf ] || cp %B/%f %B/cdr_manager.conf
@unexec if cmp -s %D/etc/asterisk/cdr_odbc.conf %D/etc/asterisk/cdr_odbc.conf-dist; then rm -f %D/etc/asterisk/cdr_odbc.conf; fi
etc/asterisk/cdr_odbc.conf-dist
@exec [ -f %B/cdr_odbc.conf ] || cp %B/%f %B/cdr_odbc.conf
@unexec if cmp -s %D/etc/asterisk/cdr_pgsql.conf %D/etc/asterisk/cdr_pgsql.conf-dist; then rm -f %D/etc/asterisk/cdr_pgsql.conf; fi
etc/asterisk/cdr_pgsql.conf-dist
@exec [ -f %B/cdr_pgsql.conf ] || cp %B/%f %B/cdr_pgsql.conf
@unexec if cmp -s %D/etc/asterisk/cdr_tds.conf %D/etc/asterisk/cdr_tds.conf-dist; then rm -f %D/etc/asterisk/cdr_tds.conf; fi
etc/asterisk/cdr_tds.conf-dist
@exec [ -f %B/cdr_tds.conf ] || cp %B/%f %B/cdr_tds.conf
@unexec if cmp -s %D/etc/asterisk/codecs.conf %D/etc/asterisk/codecs.conf-dist; then rm -f %D/etc/asterisk/codecs.conf; fi
etc/asterisk/codecs.conf-dist
@exec [ -f %B/codecs.conf ] || cp %B/%f %B/codecs.conf
@unexec if cmp -s %D/etc/asterisk/dnsmgr.conf %D/etc/asterisk/dnsmgr.conf-dist; then rm -f %D/etc/asterisk/dnsmgr.conf; fi
etc/asterisk/dnsmgr.conf-dist
@exec [ -f %B/dnsmgr.conf ] || cp %B/%f %B/dnsmgr.conf
@unexec if cmp -s %D/etc/asterisk/dundi.conf %D/etc/asterisk/dundi.conf-dist; then rm -f %D/etc/asterisk/dundi.conf; fi
etc/asterisk/dundi.conf-dist
@exec [ -f %B/dundi.conf ] || cp %B/%f %B/dundi.conf
@unexec if cmp -s %D/etc/asterisk/enum.conf %D/etc/asterisk/enum.conf-dist; then rm -f %D/etc/asterisk/enum.conf; fi
etc/asterisk/enum.conf-dist
@exec [ -f %B/enum.conf ] || cp %B/%f %B/enum.conf
@unexec if cmp -s %D/etc/asterisk/extconfig.conf %D/etc/asterisk/extconfig.conf-dist; then rm -f %D/etc/asterisk/extconfig.conf; fi
etc/asterisk/extconfig.conf-dist
@exec [ -f %B/extconfig.conf ] || cp %B/%f %B/extconfig.conf
@unexec if cmp -s %D/etc/asterisk/extensions.ael %D/etc/asterisk/extensions.ael-dist; then rm -f %D/etc/asterisk/extensions.ael; fi
etc/asterisk/extensions.ael-dist
@exec [ -f %B/extensions.ael ] || cp %B/%f %B/extensions.ael
@unexec if cmp -s %D/etc/asterisk/extensions.conf %D/etc/asterisk/extensions.conf-dist; then rm -f %D/etc/asterisk/extensions.conf; fi
etc/asterisk/extensions.conf-dist
@exec [ -f %B/extensions.conf ] || cp %B/%f %B/extensions.conf
@unexec if cmp -s %D/etc/asterisk/features.conf %D/etc/asterisk/features.conf-dist; then rm -f %D/etc/asterisk/features.conf; fi
etc/asterisk/features.conf-dist
@exec [ -f %B/features.conf ] || cp %B/%f %B/features.conf
@unexec if cmp -s %D/etc/asterisk/festival.conf %D/etc/asterisk/festival.conf-dist; then rm -f %D/etc/asterisk/festival.conf; fi
etc/asterisk/festival.conf-dist
@exec [ -f %B/festival.conf ] || cp %B/%f %B/festival.conf
@unexec if cmp -s %D/etc/asterisk/iax.conf %D/etc/asterisk/iax.conf-dist; then rm -f %D/etc/asterisk/iax.conf; fi
etc/asterisk/iax.conf-dist
@exec [ -f %B/iax.conf ] || cp %B/%f %B/iax.conf
@unexec if cmp -s %D/etc/asterisk/iaxprov.conf %D/etc/asterisk/iaxprov.conf-dist; then rm -f %D/etc/asterisk/iaxprov.conf; fi
etc/asterisk/iaxprov.conf-dist
@exec [ -f %B/iaxprov.conf ] || cp %B/%f %B/iaxprov.conf
@unexec if cmp -s %D/etc/asterisk/indications.conf %D/etc/asterisk/indications.conf-dist; then rm -f %D/etc/asterisk/indications.conf; fi
etc/asterisk/indications.conf-dist
@exec [ -f %B/indications.conf ] || cp %B/%f %B/indications.conf
@unexec if cmp -s %D/etc/asterisk/logger.conf %D/etc/asterisk/logger.conf-dist; then rm -f %D/etc/asterisk/logger.conf; fi
etc/asterisk/logger.conf-dist
@exec [ -f %B/logger.conf ] || cp %B/%f %B/logger.conf
@unexec if cmp -s %D/etc/asterisk/manager.conf %D/etc/asterisk/manager.conf-dist; then rm -f %D/etc/asterisk/manager.conf; fi
etc/asterisk/manager.conf-dist
@exec [ -f %B/manager.conf ] || cp %B/%f %B/manager.conf
@unexec if cmp -s %D/etc/asterisk/meetme.conf %D/etc/asterisk/meetme.conf-dist; then rm -f %D/etc/asterisk/meetme.conf; fi
etc/asterisk/meetme.conf-dist
@exec [ -f %B/meetme.conf ] || cp %B/%f %B/meetme.conf
@unexec if cmp -s %D/etc/asterisk/mgcp.conf %D/etc/asterisk/mgcp.conf-dist; then rm -f %D/etc/asterisk/mgcp.conf; fi
etc/asterisk/mgcp.conf-dist
@exec [ -f %B/mgcp.conf ] || cp %B/%f %B/mgcp.conf
@unexec if cmp -s %D/etc/asterisk/misdn.conf %D/etc/asterisk/misdn.conf-dist; then rm -f %D/etc/asterisk/misdn.conf; fi
etc/asterisk/misdn.conf-dist
@exec [ -f %B/misdn.conf ] || cp %B/%f %B/misdn.conf
@unexec if cmp -s %D/etc/asterisk/modem.conf %D/etc/asterisk/modem.conf-dist; then rm -f %D/etc/asterisk/modem.conf; fi
etc/asterisk/modem.conf-dist
@exec [ -f %B/modem.conf ] || cp %B/%f %B/modem.conf
@unexec if cmp -s %D/etc/asterisk/modules.conf %D/etc/asterisk/modules.conf-dist; then rm -f %D/etc/asterisk/modules.conf; fi
etc/asterisk/modules.conf-dist
@exec [ -f %B/modules.conf ] || cp %B/%f %B/modules.conf
@unexec if cmp -s %D/etc/asterisk/musiconhold.conf %D/etc/asterisk/musiconhold.conf-dist; then rm -f %D/etc/asterisk/musiconhold.conf; fi
etc/asterisk/musiconhold.conf-dist
@exec [ -f %B/musiconhold.conf ] || cp %B/%f %B/musiconhold.conf
@unexec if cmp -s %D/etc/asterisk/osp.conf %D/etc/asterisk/osp.conf-dist; then rm -f %D/etc/asterisk/osp.conf; fi
etc/asterisk/osp.conf-dist
@exec [ -f %B/osp.conf ] || cp %B/%f %B/osp.conf
@unexec if cmp -s %D/etc/asterisk/oss.conf %D/etc/asterisk/oss.conf-dist; then rm -f %D/etc/asterisk/oss.conf; fi
etc/asterisk/oss.conf-dist
@exec [ -f %B/oss.conf ] || cp %B/%f %B/oss.conf
@unexec if cmp -s %D/etc/asterisk/phone.conf %D/etc/asterisk/phone.conf-dist; then rm -f %D/etc/asterisk/phone.conf; fi
etc/asterisk/phone.conf-dist
@exec [ -f %B/phone.conf ] || cp %B/%f %B/phone.conf
@unexec if cmp -s %D/etc/asterisk/privacy.conf %D/etc/asterisk/privacy.conf-dist; then rm -f %D/etc/asterisk/privacy.conf; fi
etc/asterisk/privacy.conf-dist
@exec [ -f %B/privacy.conf ] || cp %B/%f %B/privacy.conf
@unexec if cmp -s %D/etc/asterisk/queues.conf %D/etc/asterisk/queues.conf-dist; then rm -f %D/etc/asterisk/queues.conf; fi
etc/asterisk/queues.conf-dist
@exec [ -f %B/queues.conf ] || cp %B/%f %B/queues.conf
@unexec if cmp -s %D/etc/asterisk/res_odbc.conf %D/etc/asterisk/res_odbc.conf-dist; then rm -f %D/etc/asterisk/res_odbc.conf; fi
etc/asterisk/res_odbc.conf-dist
@exec [ -f %B/res_odbc.conf ] || cp %B/%f %B/res_odbc.conf
@unexec if cmp -s %D/etc/asterisk/rpt.conf %D/etc/asterisk/rpt.conf-dist; then rm -f %D/etc/asterisk/rpt.conf; fi
etc/asterisk/rpt.conf-dist
@exec [ -f %B/rpt.conf ] || cp %B/%f %B/rpt.conf
@unexec if cmp -s %D/etc/asterisk/rtp.conf %D/etc/asterisk/rtp.conf-dist; then rm -f %D/etc/asterisk/rtp.conf; fi
etc/asterisk/rtp.conf-dist
@exec [ -f %B/rtp.conf ] || cp %B/%f %B/rtp.conf
@unexec if cmp -s %D/etc/asterisk/sip.conf %D/etc/asterisk/sip.conf-dist; then rm -f %D/etc/asterisk/sip.conf; fi
etc/asterisk/sip.conf-dist
@exec [ -f %B/sip.conf ] || cp %B/%f %B/sip.conf
@unexec if cmp -s %D/etc/asterisk/sip_notify.conf %D/etc/asterisk/sip_notify.conf-dist; then rm -f %D/etc/asterisk/sip_notify.conf; fi
etc/asterisk/sip_notify.conf-dist
@exec [ -f %B/sip_notify.conf ] || cp %B/%f %B/sip_notify.conf
@unexec if cmp -s %D/etc/asterisk/skinny.conf %D/etc/asterisk/skinny.conf-dist; then rm -f %D/etc/asterisk/skinny.conf; fi
etc/asterisk/skinny.conf-dist
@exec [ -f %B/skinny.conf ] || cp %B/%f %B/skinny.conf
@unexec if cmp -s %D/etc/asterisk/telcordia-1.adsi %D/etc/asterisk/telcordia-1.adsi-dist; then rm -f %D/etc/asterisk/telcordia-1.adsi; fi
etc/asterisk/telcordia-1.adsi-dist
@exec [ -f %B/telcordia-1.adsi ] || cp %B/%f %B/telcordia-1.adsi
@unexec if cmp -s %D/etc/asterisk/voicemail.conf %D/etc/asterisk/voicemail.conf-dist; then rm -f %D/etc/asterisk/voicemail.conf; fi
etc/asterisk/voicemail.conf-dist
@exec [ -f %B/voicemail.conf ] || cp %B/%f %B/voicemail.conf
@unexec if cmp -s %D/etc/asterisk/vpb.conf %D/etc/asterisk/vpb.conf-dist; then rm -f %D/etc/asterisk/vpb.conf; fi
etc/asterisk/vpb.conf-dist
@exec [ -f %B/vpb.conf ] || cp %B/%f %B/vpb.conf
%%BRISTUFF%%@unexec if cmp -s %D/etc/asterisk/watchdog.conf %D/etc/asterisk/watchdog.conf-dist; then rm -f %D/etc/asterisk/watchdog.conf; fi
%%BRISTUFF%%etc/asterisk/watchdog.conf-dist
%%BRISTUFF%%@exec [ -f %B/watchdog.conf ] || cp %B/%f %B/watchdog.conf
@unexec if cmp -s %D/etc/asterisk/zapata.conf %D/etc/asterisk/zapata.conf-dist; then rm -f %D/etc/asterisk/zapata.conf; fi
etc/asterisk/zapata.conf-dist
@exec [ -f %B/zapata.conf ] || cp %B/%f %B/zapata.conf
include/asterisk/acl.h
include/asterisk/adsi.h
include/asterisk/aes.h
include/asterisk/agi.h
include/asterisk/alaw.h
include/asterisk/app.h
include/asterisk/ast_expr.h
include/asterisk/astdb.h
include/asterisk/astmm.h
include/asterisk/astobj.h
include/asterisk/astosp.h
include/asterisk/build.h
include/asterisk/callerid.h
include/asterisk/causes.h
include/asterisk/cdr.h
%%BRISTUFF%%include/asterisk/chan_capi.h
%%BRISTUFF%%include/asterisk/chan_capi_app.h
include/asterisk/channel.h
include/asterisk/chanspy.h
include/asterisk/chanvars.h
include/asterisk/cli.h
include/asterisk/compat.h
include/asterisk/compiler.h
include/asterisk/config.h
include/asterisk/crypto.h
include/asterisk/devicestate.h
include/asterisk/dlfcn-compat.h
include/asterisk/dns.h
include/asterisk/dnsmgr.h
include/asterisk/doxyref.h
include/asterisk/dsp.h
include/asterisk/dundi.h
include/asterisk/endian.h
include/asterisk/enum.h
include/asterisk/features.h
include/asterisk/file.h
include/asterisk/frame.h
include/asterisk/fskmodem.h
include/asterisk/image.h
include/asterisk/indications.h
include/asterisk/inline_api.h
include/asterisk/io.h
include/asterisk/linkedlists.h
include/asterisk/localtime.h
include/asterisk/lock.h
include/asterisk/logger.h
include/asterisk/manager.h
include/asterisk/md5.h
include/asterisk/module.h
include/asterisk/monitor.h
include/asterisk/musiconhold.h
include/asterisk/netsock.h
include/asterisk/options.h
include/asterisk/pbx.h
include/asterisk/plc.h
include/asterisk/poll-compat.h
include/asterisk/privacy.h
include/asterisk/res_odbc.h
include/asterisk/rtp.h
include/asterisk/say.h
include/asterisk/sched.h
include/asterisk/slinfactory.h
include/asterisk/srv.h
include/asterisk/strings.h
include/asterisk/tdd.h
include/asterisk/term.h
include/asterisk/time.h
include/asterisk/transcap.h
include/asterisk/translate.h
include/asterisk/ulaw.h
include/asterisk/unaligned.h
include/asterisk/utils.h
include/asterisk/version.h
include/asterisk/vmodem.h
%%BRISTUFF%%include/asterisk/xlaw.h
lib/asterisk/modules/app_adsiprog.so
lib/asterisk/modules/app_alarmreceiver.so
lib/asterisk/modules/app_authenticate.so
%%BRISTUFF%%lib/asterisk/modules/app_callingpres.so
lib/asterisk/modules/app_cdr.so
lib/asterisk/modules/app_chanisavail.so
lib/asterisk/modules/app_chanspy.so
lib/asterisk/modules/app_controlplayback.so
lib/asterisk/modules/app_curl.so
lib/asterisk/modules/app_cut.so
lib/asterisk/modules/app_db.so
%%BRISTUFF%%lib/asterisk/modules/app_devstate.so
lib/asterisk/modules/app_dial.so
lib/asterisk/modules/app_dictate.so
lib/asterisk/modules/app_directed_pickup.so
lib/asterisk/modules/app_directory.so
lib/asterisk/modules/app_disa.so
lib/asterisk/modules/app_dumpchan.so
lib/asterisk/modules/app_echo.so
lib/asterisk/modules/app_enumlookup.so
lib/asterisk/modules/app_eval.so
lib/asterisk/modules/app_exec.so
lib/asterisk/modules/app_externalivr.so
lib/asterisk/modules/app_festival.so
%%WITH_ZAPTEL%%lib/asterisk/modules/app_flash.so
lib/asterisk/modules/app_forkcdr.so
lib/asterisk/modules/app_getcpeid.so
lib/asterisk/modules/app_groupcount.so
lib/asterisk/modules/app_hasnewvoicemail.so
lib/asterisk/modules/app_ices.so
lib/asterisk/modules/app_image.so
lib/asterisk/modules/app_lookupblacklist.so
lib/asterisk/modules/app_lookupcidname.so
lib/asterisk/modules/app_macro.so
lib/asterisk/modules/app_math.so
lib/asterisk/modules/app_md5.so
%%WITH_ZAPTEL%%lib/asterisk/modules/app_meetme.so
lib/asterisk/modules/app_milliwatt.so
lib/asterisk/modules/app_mixmonitor.so
lib/asterisk/modules/app_mp3.so
lib/asterisk/modules/app_nbscat.so
%%WITH_ZAPTEL%%lib/asterisk/modules/app_page.so
lib/asterisk/modules/app_parkandannounce.so
%%BRISTUFF%%lib/asterisk/modules/app_pickup.so
lib/asterisk/modules/app_playback.so
lib/asterisk/modules/app_privacy.so
lib/asterisk/modules/app_queue.so
lib/asterisk/modules/app_random.so
lib/asterisk/modules/app_read.so
lib/asterisk/modules/app_readfile.so
lib/asterisk/modules/app_realtime.so
lib/asterisk/modules/app_record.so
%%WITH_FAX%%lib/asterisk/modules/app_rxfax.so
lib/asterisk/modules/app_sayunixtime.so
%%BRISTUFF%%lib/asterisk/modules/app_segfault.so
lib/asterisk/modules/app_senddtmf.so
lib/asterisk/modules/app_sendtext.so
lib/asterisk/modules/app_setcallerid.so
lib/asterisk/modules/app_setcdruserfield.so
lib/asterisk/modules/app_setcidname.so
lib/asterisk/modules/app_setcidnum.so
lib/asterisk/modules/app_setrdnis.so
lib/asterisk/modules/app_settransfercapability.so
lib/asterisk/modules/app_sms.so
lib/asterisk/modules/app_softhangup.so
lib/asterisk/modules/app_stack.so
lib/asterisk/modules/app_system.so
lib/asterisk/modules/app_talkdetect.so
lib/asterisk/modules/app_test.so
lib/asterisk/modules/app_transfer.so
%%WITH_FAX%%lib/asterisk/modules/app_txfax.so
lib/asterisk/modules/app_txtcidname.so
lib/asterisk/modules/app_url.so
lib/asterisk/modules/app_userevent.so
lib/asterisk/modules/app_verbose.so
lib/asterisk/modules/app_voicemail.so
lib/asterisk/modules/app_waitforring.so
lib/asterisk/modules/app_waitforsilence.so
lib/asterisk/modules/app_while.so
lib/asterisk/modules/app_zapateller.so
%%WITH_ZAPTEL%%lib/asterisk/modules/app_zapbarge.so
%%WITH_ZAPTEL%%lib/asterisk/modules/app_zapras.so
%%WITH_ZAPTEL%%lib/asterisk/modules/app_zapscan.so
lib/asterisk/modules/cdr_csv.so
lib/asterisk/modules/cdr_custom.so
lib/asterisk/modules/cdr_manager.so
%%WITH_ODBC%%lib/asterisk/modules/cdr_odbc.so
lib/asterisk/modules/cdr_tds.so
lib/asterisk/modules/chan_agent.so
lib/asterisk/modules/chan_features.so
%%WITH_H323%%lib/asterisk/modules/chan_h323.so
lib/asterisk/modules/chan_iax2.so
lib/asterisk/modules/chan_local.so
lib/asterisk/modules/chan_mgcp.so
lib/asterisk/modules/chan_oss.so
lib/asterisk/modules/chan_sip.so
lib/asterisk/modules/chan_skinny.so
%%WITH_ZAPTEL%%lib/asterisk/modules/chan_zap.so
lib/asterisk/modules/codec_a_mu.so
lib/asterisk/modules/codec_adpcm.so
lib/asterisk/modules/codec_alaw.so
lib/asterisk/modules/codec_g726.so
lib/asterisk/modules/codec_gsm.so
lib/asterisk/modules/codec_ilbc.so
lib/asterisk/modules/codec_lpc10.so
lib/asterisk/modules/codec_speex.so
lib/asterisk/modules/codec_ulaw.so
lib/asterisk/modules/format_au.so
lib/asterisk/modules/format_g723_1.so
lib/asterisk/modules/format_g726.so
lib/asterisk/modules/format_g729.so
lib/asterisk/modules/format_gsm.so
lib/asterisk/modules/format_h263.so
lib/asterisk/modules/format_ilbc.so
lib/asterisk/modules/format_jpeg.so
lib/asterisk/modules/format_pcm.so
lib/asterisk/modules/format_pcm_alaw.so
lib/asterisk/modules/format_sln.so
lib/asterisk/modules/format_vox.so
lib/asterisk/modules/format_wav.so
lib/asterisk/modules/format_wav_gsm.so
lib/asterisk/modules/func_callerid.so
lib/asterisk/modules/func_enum.so
lib/asterisk/modules/func_uri.so
lib/asterisk/modules/pbx_ael.so
lib/asterisk/modules/pbx_config.so
lib/asterisk/modules/pbx_dundi.so
lib/asterisk/modules/pbx_functions.so
lib/asterisk/modules/pbx_loopback.so
lib/asterisk/modules/pbx_realtime.so
lib/asterisk/modules/pbx_spool.so
lib/asterisk/modules/res_adsi.so
lib/asterisk/modules/res_agi.so
%%WITH_ODBC%%lib/asterisk/modules/res_config_odbc.so
lib/asterisk/modules/res_crypto.so
lib/asterisk/modules/res_features.so
lib/asterisk/modules/res_indications.so
lib/asterisk/modules/res_monitor.so
lib/asterisk/modules/res_musiconhold.so
%%WITH_ODBC%%lib/asterisk/modules/res_odbc.so
%%BRISTUFF%%lib/asterisk/modules/res_watchdog.so
sbin/asterisk
sbin/astgenkey
sbin/astman
sbin/autosupport
sbin/rasterisk
sbin/safe_asterisk
sbin/smsq
sbin/stereorize
sbin/streamplayer
%%DATADIR%%/agi-bin/agi-test.agi
%%DATADIR%%/agi-bin/eagi-sphinx-test
%%DATADIR%%/agi-bin/eagi-test
%%BRISTUFF%%%%DATADIR%%/agi-bin/xagi-test
%%DATADIR%%/firmware/iax/iaxy.bin
%%DATADIR%%/images/asterisk-intro.jpg
%%DATADIR%%/keys/freeworlddialup.pub
%%DATADIR%%/keys/iaxtel.pub
%%DATADIR%%/mohmp3/fpm-calm-river.mp3
%%DATADIR%%/mohmp3/fpm-sunshine.mp3
%%DATADIR%%/mohmp3/fpm-world-mix.mp3
%%DATADIR%%/sounds/agent-alreadyon.gsm
%%DATADIR%%/sounds/agent-incorrect.gsm
%%DATADIR%%/sounds/agent-loggedoff.gsm
%%DATADIR%%/sounds/agent-loginok.gsm
%%DATADIR%%/sounds/agent-newlocation.gsm
%%DATADIR%%/sounds/agent-pass.gsm
%%DATADIR%%/sounds/agent-user.gsm
%%DATADIR%%/sounds/auth-incorrect.gsm
%%DATADIR%%/sounds/auth-thankyou.gsm
%%DATADIR%%/sounds/beep.gsm
%%DATADIR%%/sounds/beeperr.gsm
%%DATADIR%%/sounds/conf-adminmenu.gsm
%%DATADIR%%/sounds/conf-enteringno.gsm
%%DATADIR%%/sounds/conf-errormenu.gsm
%%DATADIR%%/sounds/conf-getchannel.gsm
%%DATADIR%%/sounds/conf-getconfno.gsm
%%DATADIR%%/sounds/conf-getpin.gsm
%%DATADIR%%/sounds/conf-hasjoin.gsm
%%DATADIR%%/sounds/conf-hasleft.gsm
%%DATADIR%%/sounds/conf-invalid.gsm
%%DATADIR%%/sounds/conf-invalidpin.gsm
%%DATADIR%%/sounds/conf-kicked.gsm
%%DATADIR%%/sounds/conf-leaderhasleft.gsm
%%DATADIR%%/sounds/conf-locked.gsm
%%DATADIR%%/sounds/conf-lockednow.gsm
%%DATADIR%%/sounds/conf-muted.gsm
%%DATADIR%%/sounds/conf-noempty.gsm
%%DATADIR%%/sounds/conf-onlyone.gsm
%%DATADIR%%/sounds/conf-onlyperson.gsm
%%DATADIR%%/sounds/conf-otherinparty.gsm
%%DATADIR%%/sounds/conf-placeintoconf.gsm
%%DATADIR%%/sounds/conf-thereare.gsm
%%DATADIR%%/sounds/conf-unlockednow.gsm
%%DATADIR%%/sounds/conf-unmuted.gsm
%%DATADIR%%/sounds/conf-usermenu.gsm
%%DATADIR%%/sounds/conf-userswilljoin.gsm
%%DATADIR%%/sounds/conf-userwilljoin.gsm
%%DATADIR%%/sounds/conf-waitforleader.gsm
%%DATADIR%%/sounds/demo-abouttotry.gsm
%%DATADIR%%/sounds/demo-congrats.gsm
%%DATADIR%%/sounds/demo-echodone.gsm
%%DATADIR%%/sounds/demo-echotest.gsm
%%DATADIR%%/sounds/demo-enterkeywords.gsm
%%DATADIR%%/sounds/demo-instruct.gsm
%%DATADIR%%/sounds/demo-moreinfo.gsm
%%DATADIR%%/sounds/demo-nogo.gsm
%%DATADIR%%/sounds/demo-nomatch.gsm
%%DATADIR%%/sounds/demo-thanks.gsm
%%DATADIR%%/sounds/dictate/both_help.gsm
%%DATADIR%%/sounds/dictate/enter_filename.gsm
%%DATADIR%%/sounds/dictate/forhelp.gsm
%%DATADIR%%/sounds/dictate/pause.gsm
%%DATADIR%%/sounds/dictate/paused.gsm
%%DATADIR%%/sounds/dictate/play_help.gsm
%%DATADIR%%/sounds/dictate/playback.gsm
%%DATADIR%%/sounds/dictate/playback_mode.gsm
%%DATADIR%%/sounds/dictate/record.gsm
%%DATADIR%%/sounds/dictate/record_help.gsm
%%DATADIR%%/sounds/dictate/record_mode.gsm
%%DATADIR%%/sounds/dictate/truncating_audio.gsm
%%DATADIR%%/sounds/digits/0.gsm
%%DATADIR%%/sounds/digits/1.gsm
%%DATADIR%%/sounds/digits/10.gsm
%%DATADIR%%/sounds/digits/11.gsm
%%DATADIR%%/sounds/digits/12.gsm
%%DATADIR%%/sounds/digits/13.gsm
%%DATADIR%%/sounds/digits/14.gsm
%%DATADIR%%/sounds/digits/15.gsm
%%DATADIR%%/sounds/digits/16.gsm
%%DATADIR%%/sounds/digits/17.gsm
%%DATADIR%%/sounds/digits/18.gsm
%%DATADIR%%/sounds/digits/19.gsm
%%DATADIR%%/sounds/digits/2.gsm
%%DATADIR%%/sounds/digits/20.gsm
%%DATADIR%%/sounds/digits/3.gsm
%%DATADIR%%/sounds/digits/30.gsm
%%DATADIR%%/sounds/digits/4.gsm
%%DATADIR%%/sounds/digits/40.gsm
%%DATADIR%%/sounds/digits/5.gsm
%%DATADIR%%/sounds/digits/50.gsm
%%DATADIR%%/sounds/digits/6.gsm
%%DATADIR%%/sounds/digits/60.gsm
%%DATADIR%%/sounds/digits/7.gsm
%%DATADIR%%/sounds/digits/70.gsm
%%DATADIR%%/sounds/digits/8.gsm
%%DATADIR%%/sounds/digits/80.gsm
%%DATADIR%%/sounds/digits/9.gsm
%%DATADIR%%/sounds/digits/90.gsm
%%DATADIR%%/sounds/digits/a-m.gsm
%%DATADIR%%/sounds/digits/at.gsm
%%DATADIR%%/sounds/digits/day-0.gsm
%%DATADIR%%/sounds/digits/day-1.gsm
%%DATADIR%%/sounds/digits/day-2.gsm
%%DATADIR%%/sounds/digits/day-3.gsm
%%DATADIR%%/sounds/digits/day-4.gsm
%%DATADIR%%/sounds/digits/day-5.gsm
%%DATADIR%%/sounds/digits/day-6.gsm
%%DATADIR%%/sounds/digits/dollars.gsm
%%DATADIR%%/sounds/digits/h-1.gsm
%%DATADIR%%/sounds/digits/h-10.gsm
%%DATADIR%%/sounds/digits/h-11.gsm
%%DATADIR%%/sounds/digits/h-12.gsm
%%DATADIR%%/sounds/digits/h-13.gsm
%%DATADIR%%/sounds/digits/h-14.gsm
%%DATADIR%%/sounds/digits/h-15.gsm
%%DATADIR%%/sounds/digits/h-16.gsm
%%DATADIR%%/sounds/digits/h-17.gsm
%%DATADIR%%/sounds/digits/h-18.gsm
%%DATADIR%%/sounds/digits/h-19.gsm
%%DATADIR%%/sounds/digits/h-2.gsm
%%DATADIR%%/sounds/digits/h-20.gsm
%%DATADIR%%/sounds/digits/h-3.gsm
%%DATADIR%%/sounds/digits/h-30.gsm
%%DATADIR%%/sounds/digits/h-4.gsm
%%DATADIR%%/sounds/digits/h-5.gsm
%%DATADIR%%/sounds/digits/h-6.gsm
%%DATADIR%%/sounds/digits/h-7.gsm
%%DATADIR%%/sounds/digits/h-8.gsm
%%DATADIR%%/sounds/digits/h-9.gsm
%%DATADIR%%/sounds/digits/hundred.gsm
%%DATADIR%%/sounds/digits/million.gsm
%%DATADIR%%/sounds/digits/minus.gsm
%%DATADIR%%/sounds/digits/mon-0.gsm
%%DATADIR%%/sounds/digits/mon-1.gsm
%%DATADIR%%/sounds/digits/mon-10.gsm
%%DATADIR%%/sounds/digits/mon-11.gsm
%%DATADIR%%/sounds/digits/mon-2.gsm
%%DATADIR%%/sounds/digits/mon-3.gsm
%%DATADIR%%/sounds/digits/mon-4.gsm
%%DATADIR%%/sounds/digits/mon-5.gsm
%%DATADIR%%/sounds/digits/mon-6.gsm
%%DATADIR%%/sounds/digits/mon-7.gsm
%%DATADIR%%/sounds/digits/mon-8.gsm
%%DATADIR%%/sounds/digits/mon-9.gsm
%%DATADIR%%/sounds/digits/oclock.gsm
%%DATADIR%%/sounds/digits/oh.gsm
%%DATADIR%%/sounds/digits/p-m.gsm
%%DATADIR%%/sounds/digits/pound.gsm
%%DATADIR%%/sounds/digits/star.gsm
%%DATADIR%%/sounds/digits/thousand.gsm
%%DATADIR%%/sounds/digits/today.gsm
%%DATADIR%%/sounds/digits/tomorrow.gsm
%%DATADIR%%/sounds/digits/yesterday.gsm
%%DATADIR%%/sounds/dir-instr.gsm
%%DATADIR%%/sounds/dir-intro-fn.gsm
%%DATADIR%%/sounds/dir-intro.gsm
%%DATADIR%%/sounds/dir-nomatch.gsm
%%DATADIR%%/sounds/dir-nomore.gsm
%%DATADIR%%/sounds/hello-world.gsm
%%DATADIR%%/sounds/hours.gsm
%%DATADIR%%/sounds/invalid.gsm
%%DATADIR%%/sounds/letters/a.gsm
%%DATADIR%%/sounds/letters/at.gsm
%%DATADIR%%/sounds/letters/b.gsm
%%DATADIR%%/sounds/letters/c.gsm
%%DATADIR%%/sounds/letters/d.gsm
%%DATADIR%%/sounds/letters/dash.gsm
%%DATADIR%%/sounds/letters/dollar.gsm
%%DATADIR%%/sounds/letters/dot.gsm
%%DATADIR%%/sounds/letters/e.gsm
%%DATADIR%%/sounds/letters/equals.gsm
%%DATADIR%%/sounds/letters/exclaimation-point.gsm
%%DATADIR%%/sounds/letters/f.gsm
%%DATADIR%%/sounds/letters/g.gsm
%%DATADIR%%/sounds/letters/h.gsm
%%DATADIR%%/sounds/letters/i.gsm
%%DATADIR%%/sounds/letters/j.gsm
%%DATADIR%%/sounds/letters/k.gsm
%%DATADIR%%/sounds/letters/l.gsm
%%DATADIR%%/sounds/letters/m.gsm
%%DATADIR%%/sounds/letters/n.gsm
%%DATADIR%%/sounds/letters/o.gsm
%%DATADIR%%/sounds/letters/p.gsm
%%DATADIR%%/sounds/letters/plus.gsm
%%DATADIR%%/sounds/letters/q.gsm
%%DATADIR%%/sounds/letters/r.gsm
%%DATADIR%%/sounds/letters/s.gsm
%%DATADIR%%/sounds/letters/slash.gsm
%%DATADIR%%/sounds/letters/space.gsm
%%DATADIR%%/sounds/letters/t.gsm
%%DATADIR%%/sounds/letters/u.gsm
%%DATADIR%%/sounds/letters/v.gsm
%%DATADIR%%/sounds/letters/w.gsm
%%DATADIR%%/sounds/letters/x.gsm
%%DATADIR%%/sounds/letters/y.gsm
%%DATADIR%%/sounds/letters/z.gsm
%%DATADIR%%/sounds/letters/zed.gsm
%%DATADIR%%/sounds/minutes.gsm
%%DATADIR%%/sounds/pbx-invalid.gsm
%%DATADIR%%/sounds/pbx-invalidpark.gsm
%%DATADIR%%/sounds/pbx-transfer.gsm
%%DATADIR%%/sounds/phonetic/9_p.gsm
%%DATADIR%%/sounds/phonetic/a_p.gsm
%%DATADIR%%/sounds/phonetic/b_p.gsm
%%DATADIR%%/sounds/phonetic/c_p.gsm
%%DATADIR%%/sounds/phonetic/d_p.gsm
%%DATADIR%%/sounds/phonetic/e_p.gsm
%%DATADIR%%/sounds/phonetic/f_p.gsm
%%DATADIR%%/sounds/phonetic/g_p.gsm
%%DATADIR%%/sounds/phonetic/h_p.gsm
%%DATADIR%%/sounds/phonetic/i_p.gsm
%%DATADIR%%/sounds/phonetic/j_p.gsm
%%DATADIR%%/sounds/phonetic/k_p.gsm
%%DATADIR%%/sounds/phonetic/l_p.gsm
%%DATADIR%%/sounds/phonetic/m_p.gsm
%%DATADIR%%/sounds/phonetic/n_p.gsm
%%DATADIR%%/sounds/phonetic/o_p.gsm
%%DATADIR%%/sounds/phonetic/p_p.gsm
%%DATADIR%%/sounds/phonetic/q_p.gsm
%%DATADIR%%/sounds/phonetic/r_p.gsm
%%DATADIR%%/sounds/phonetic/s_p.gsm
%%DATADIR%%/sounds/phonetic/t_p.gsm
%%DATADIR%%/sounds/phonetic/u_p.gsm
%%DATADIR%%/sounds/phonetic/v_p.gsm
%%DATADIR%%/sounds/phonetic/w_p.gsm
%%DATADIR%%/sounds/phonetic/x_p.gsm
%%DATADIR%%/sounds/phonetic/y_p.gsm
%%DATADIR%%/sounds/phonetic/z_p.gsm
%%DATADIR%%/sounds/priv-callee-options.gsm
%%DATADIR%%/sounds/priv-callpending.gsm
%%DATADIR%%/sounds/priv-introsaved.gsm
%%DATADIR%%/sounds/priv-recordintro.gsm
%%DATADIR%%/sounds/privacy-incorrect.gsm
%%DATADIR%%/sounds/privacy-prompt.gsm
%%DATADIR%%/sounds/privacy-thankyou.gsm
%%DATADIR%%/sounds/privacy-unident.gsm
%%DATADIR%%/sounds/queue-callswaiting.gsm
%%DATADIR%%/sounds/queue-holdtime.gsm
%%DATADIR%%/sounds/queue-less-than.gsm
%%DATADIR%%/sounds/queue-minutes.gsm
%%DATADIR%%/sounds/queue-periodic-announce.gsm
%%DATADIR%%/sounds/queue-reporthold.gsm
%%DATADIR%%/sounds/queue-seconds.gsm
%%DATADIR%%/sounds/queue-thankyou.gsm
%%DATADIR%%/sounds/queue-thereare.gsm
%%DATADIR%%/sounds/queue-youarenext.gsm
%%DATADIR%%/sounds/screen-callee-options.gsm
%%DATADIR%%/sounds/seconds.gsm
%%DATADIR%%/sounds/silence/1.gsm
%%DATADIR%%/sounds/silence/10.gsm
%%DATADIR%%/sounds/silence/2.gsm
%%DATADIR%%/sounds/silence/3.gsm
%%DATADIR%%/sounds/silence/4.gsm
%%DATADIR%%/sounds/silence/5.gsm
%%DATADIR%%/sounds/silence/6.gsm
%%DATADIR%%/sounds/silence/7.gsm
%%DATADIR%%/sounds/silence/8.gsm
%%DATADIR%%/sounds/silence/9.gsm
%%DATADIR%%/sounds/spy-agent.gsm
%%DATADIR%%/sounds/spy-h323.gsm
%%DATADIR%%/sounds/spy-iax.gsm
%%DATADIR%%/sounds/spy-iax2.gsm
%%DATADIR%%/sounds/spy-mgcp.gsm
%%DATADIR%%/sounds/spy-sip.gsm
%%DATADIR%%/sounds/spy-skinny.gsm
%%DATADIR%%/sounds/spy-zap.gsm
%%DATADIR%%/sounds/ss-noservice.gsm
%%DATADIR%%/sounds/transfer.gsm
%%DATADIR%%/sounds/tt-allbusy.gsm
%%DATADIR%%/sounds/tt-monkeys.gsm
%%DATADIR%%/sounds/tt-monkeysintro.gsm
%%DATADIR%%/sounds/tt-somethingwrong.gsm
%%DATADIR%%/sounds/tt-weasels.gsm
%%DATADIR%%/sounds/vm-Cust1.gsm
%%DATADIR%%/sounds/vm-Cust2.gsm
%%DATADIR%%/sounds/vm-Cust3.gsm
%%DATADIR%%/sounds/vm-Cust4.gsm
%%DATADIR%%/sounds/vm-Cust5.gsm
%%DATADIR%%/sounds/vm-Family.gsm
%%DATADIR%%/sounds/vm-Friends.gsm
%%DATADIR%%/sounds/vm-INBOX.gsm
%%DATADIR%%/sounds/vm-Old.gsm
%%DATADIR%%/sounds/vm-Work.gsm
%%DATADIR%%/sounds/vm-advopts.gsm
%%DATADIR%%/sounds/vm-and.gsm
%%DATADIR%%/sounds/vm-calldiffnum.gsm
%%DATADIR%%/sounds/vm-changeto.gsm
%%DATADIR%%/sounds/vm-delete.gsm
%%DATADIR%%/sounds/vm-deleted.gsm
%%DATADIR%%/sounds/vm-dialout.gsm
%%DATADIR%%/sounds/vm-enter-num-to-call.gsm
%%DATADIR%%/sounds/vm-extension.gsm
%%DATADIR%%/sounds/vm-first.gsm
%%DATADIR%%/sounds/vm-for.gsm
%%DATADIR%%/sounds/vm-forward.gsm
%%DATADIR%%/sounds/vm-forwardoptions.gsm
%%DATADIR%%/sounds/vm-from-extension.gsm
%%DATADIR%%/sounds/vm-from-phonenumber.gsm
%%DATADIR%%/sounds/vm-from.gsm
%%DATADIR%%/sounds/vm-goodbye.gsm
%%DATADIR%%/sounds/vm-helpexit.gsm
%%DATADIR%%/sounds/vm-incorrect-mailbox.gsm
%%DATADIR%%/sounds/vm-incorrect.gsm
%%DATADIR%%/sounds/vm-instructions.gsm
%%DATADIR%%/sounds/vm-intro.gsm
%%DATADIR%%/sounds/vm-isonphone.gsm
%%DATADIR%%/sounds/vm-isunavail.gsm
%%DATADIR%%/sounds/vm-last.gsm
%%DATADIR%%/sounds/vm-leavemsg.gsm
%%DATADIR%%/sounds/vm-login.gsm
%%DATADIR%%/sounds/vm-mailboxfull.gsm
%%DATADIR%%/sounds/vm-message.gsm
%%DATADIR%%/sounds/vm-messages.gsm
%%DATADIR%%/sounds/vm-minutes.gsm
%%DATADIR%%/sounds/vm-mismatch.gsm
%%DATADIR%%/sounds/vm-msginstruct.gsm
%%DATADIR%%/sounds/vm-msgsaved.gsm
%%DATADIR%%/sounds/vm-newpassword.gsm
%%DATADIR%%/sounds/vm-newuser.gsm
%%DATADIR%%/sounds/vm-next.gsm
%%DATADIR%%/sounds/vm-no.gsm
%%DATADIR%%/sounds/vm-nobodyavail.gsm
%%DATADIR%%/sounds/vm-nobox.gsm
%%DATADIR%%/sounds/vm-nomore.gsm
%%DATADIR%%/sounds/vm-nonumber.gsm
%%DATADIR%%/sounds/vm-num-i-have.gsm
%%DATADIR%%/sounds/vm-onefor.gsm
%%DATADIR%%/sounds/vm-options.gsm
%%DATADIR%%/sounds/vm-opts.gsm
%%DATADIR%%/sounds/vm-passchanged.gsm
%%DATADIR%%/sounds/vm-password.gsm
%%DATADIR%%/sounds/vm-press.gsm
%%DATADIR%%/sounds/vm-prev.gsm
%%DATADIR%%/sounds/vm-reachoper.gsm
%%DATADIR%%/sounds/vm-rec-busy.gsm
%%DATADIR%%/sounds/vm-rec-name.gsm
%%DATADIR%%/sounds/vm-rec-temp.gsm
%%DATADIR%%/sounds/vm-rec-unv.gsm
%%DATADIR%%/sounds/vm-received.gsm
%%DATADIR%%/sounds/vm-reenterpassword.gsm
%%DATADIR%%/sounds/vm-repeat.gsm
%%DATADIR%%/sounds/vm-review.gsm
%%DATADIR%%/sounds/vm-saved.gsm
%%DATADIR%%/sounds/vm-savedto.gsm
%%DATADIR%%/sounds/vm-savefolder.gsm
%%DATADIR%%/sounds/vm-savemessage.gsm
%%DATADIR%%/sounds/vm-saveoper.gsm
%%DATADIR%%/sounds/vm-sorry.gsm
%%DATADIR%%/sounds/vm-star-cancel.gsm
%%DATADIR%%/sounds/vm-starmain.gsm
%%DATADIR%%/sounds/vm-tempgreeting.gsm
%%DATADIR%%/sounds/vm-tempgreeting2.gsm
%%DATADIR%%/sounds/vm-tempremoved.gsm
%%DATADIR%%/sounds/vm-then-pound.gsm
%%DATADIR%%/sounds/vm-theperson.gsm
%%DATADIR%%/sounds/vm-tocallback.gsm
%%DATADIR%%/sounds/vm-tocallnum.gsm
%%DATADIR%%/sounds/vm-tocancel.gsm
%%DATADIR%%/sounds/vm-tocancelmsg.gsm
%%DATADIR%%/sounds/vm-toenternumber.gsm
%%DATADIR%%/sounds/vm-toforward.gsm
%%DATADIR%%/sounds/vm-tohearenv.gsm
%%DATADIR%%/sounds/vm-tomakecall.gsm
%%DATADIR%%/sounds/vm-tooshort.gsm
%%DATADIR%%/sounds/vm-toreply.gsm
%%DATADIR%%/sounds/vm-torerecord.gsm
%%DATADIR%%/sounds/vm-undelete.gsm
%%DATADIR%%/sounds/vm-undeleted.gsm
%%DATADIR%%/sounds/vm-unknown-caller.gsm
%%DATADIR%%/sounds/vm-whichbox.gsm
%%DATADIR%%/sounds/vm-youhave.gsm
@exec mkdir -p %%DATADIR%%/sounds/priv-callerintros
@dirrm %%DATADIR%%/sounds/silence
@dirrm %%DATADIR%%/sounds/priv-callerintros
@dirrm %%DATADIR%%/sounds/phonetic
@dirrm %%DATADIR%%/sounds/letters
@dirrm %%DATADIR%%/sounds/digits
@dirrm %%DATADIR%%/sounds/dictate
@dirrm %%DATADIR%%/sounds
@dirrm %%DATADIR%%/mohmp3
@dirrm %%DATADIR%%/keys
@dirrm %%DATADIR%%/images
@dirrm %%DATADIR%%/firmware/iax
@dirrm %%DATADIR%%/firmware
@dirrm %%DATADIR%%/agi-bin
@dirrm %%DATADIR%%
@dirrm lib/asterisk/modules
@dirrm lib/asterisk
@dirrm include/asterisk
@dirrm etc/asterisk
@cwd /var
spool/asterisk/voicemail/default/1234/busy.gsm
spool/asterisk/voicemail/default/1234/unavail.gsm
@exec mkdir -p %D/log/asterisk/cdr-csv
@exec mkdir -p %D/log/asterisk/cdr-custom
@exec mkdir -p %D/spool/asterisk/voicemail/default/1234/INBOX
@exec mkdir -p %D/spool/asterisk/dictate
@exec mkdir -p %D/spool/asterisk/meetme
@exec mkdir -p %D/spool/asterisk/monitor
@exec mkdir -p %D/spool/asterisk/system
@exec mkdir -p %D/spool/asterisk/tmp
@dirrm spool/asterisk/dictate
@dirrm spool/asterisk/meetme
@dirrm spool/asterisk/monitor
@dirrm spool/asterisk/system
@dirrm spool/asterisk/voicemail/default/1234/INBOX
@dirrm spool/asterisk/voicemail/default/1234
@dirrm spool/asterisk/voicemail/default
@dirrm spool/asterisk/voicemail
@dirrm spool/asterisk/tmp
@dirrm spool/asterisk
@dirrm log/asterisk/cdr-csv
@dirrm log/asterisk/cdr-custom
@dirrm log/asterisk
--- pkg-plist ends here ---
--- patch-Makefile begins here ---
--- Makefile.orig Wed Jan 10 03:16:45 2007
+++ Makefile Mon Mar 19 19:39:45 2007
@@ -19,8 +19,8 @@
# CROSS_COMPILE=/opt/montavista/pro/devkit/arm/xscale_be/bin/xscale_be-
# CROSS_COMPILE_BIN=/opt/montavista/pro/devkit/arm/xscale_be/bin/
# CROSS_COMPILE_TARGET=/opt/montavista/pro/devkit/arm/xscale_be/target
-CC=$(CROSS_COMPILE)gcc
-HOST_CC=gcc
+CC?=$(CROSS_COMPILE)gcc
+HOST_CC=${CC}
# CROSS_ARCH=Linux
# CROSS_PROC=arm
# SUB_PROC=xscale # or maverick
@@ -47,14 +47,14 @@
#K6OPT = -DK6OPT
#Tell gcc to optimize the code
-OPTIMIZE+=-O6
+#OPTIMIZE+=-O6
endif
#Overwite config files on "make samples"
-OVERWRITE=y
+OVERWRITE=n
#Include debug and macro symbols in the executables (-g) and profiling info (-pg)
-DEBUG=-g3 #-pg
+#DEBUG=-g3 #-pg
#Set NOCRYPTO to yes if you do not want to have crypto support or
#dependencies
@@ -88,7 +88,7 @@
# Where to install asterisk after compiling
# Default -> leave empty
-INSTALL_PREFIX?=
+INSTALL_PREFIX=$(PREFIX)
# Staging directory
# Files are copied here temporarily during the install process
@@ -111,17 +111,17 @@
BUSYDETECT+= #-DBUSYDETECT_COMPARE_TONE_AND_SILENCE
ifneq ($(OSARCH),SunOS)
- ASTLIBDIR=$(INSTALL_PREFIX)/usr/lib/asterisk
- ASTVARLIBDIR=$(INSTALL_PREFIX)/var/lib/asterisk
+ ASTLIBDIR=$(INSTALL_PREFIX)/lib/asterisk
+ ASTVARLIBDIR=$(INSTALL_PREFIX)/share/asterisk
ASTETCDIR=$(INSTALL_PREFIX)/etc/asterisk
- ASTSPOOLDIR=$(INSTALL_PREFIX)/var/spool/asterisk
- ASTLOGDIR=$(INSTALL_PREFIX)/var/log/asterisk
- ASTHEADERDIR=$(INSTALL_PREFIX)/usr/include/asterisk
+ ASTSPOOLDIR=/var/spool/asterisk
+ ASTLOGDIR=/var/log/asterisk
+ ASTHEADERDIR=$(INSTALL_PREFIX)/include/asterisk
ASTCONFPATH=$(ASTETCDIR)/asterisk.conf
- ASTBINDIR=$(INSTALL_PREFIX)/usr/bin
- ASTSBINDIR=$(INSTALL_PREFIX)/usr/sbin
- ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run
- ASTMANDIR=$(INSTALL_PREFIX)/usr/share/man
+ ASTBINDIR=$(INSTALL_PREFIX)/bin
+ ASTSBINDIR=$(INSTALL_PREFIX)/sbin
+ ASTVARRUNDIR=/var/run
+ ASTMANDIR=$(INSTALL_PREFIX)/man
MODULES_DIR=$(ASTLIBDIR)/modules
AGI_DIR=$(ASTVARLIBDIR)/agi-bin
else
@@ -226,25 +226,25 @@
endif
INCLUDE+=-Iinclude -I../include
-ASTCFLAGS+=-pipe -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG) $(INCLUDE) -D_REENTRANT -D_GNU_SOURCE #-DMAKE_VALGRIND_HAPPY
-ASTCFLAGS+=$(OPTIMIZE)
+ASTCFLAGS+=-Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG) $(INCLUDE) -D_REENTRANT -D_GNU_SOURCE -DMAKE_VALGRIND_HAPPY
+#ASTCFLAGS+=$(OPTIMIZE)
ASTOBJ=-o asterisk
ifeq ($(findstring BSD,$(OSARCH)),BSD)
PROC=$(shell uname -m)
- ASTCFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/include -L$(CROSS_COMPILE_TARGET)/usr/local/lib
+ ASTCFLAGS+=-I$(CROSS_COMPILE_TARGET)$(LOCALBASE)/include -L$(CROSS_COMPILE_TARGET)$(LOCALBASE)/lib
endif
ifneq ($(PROC),ultrasparc)
- ASTCFLAGS+=$(shell if $(CC) -march=$(PROC) -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=$(PROC)"; fi)
+# ASTCFLAGS+=$(shell if $(CC) -march=$(PROC) -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=$(PROC)"; fi)
endif
ifeq ($(PROC),ppc)
ASTCFLAGS+=-fsigned-char
endif
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/osp/osp.h),)
- ASTCFLAGS+=-DOSP_SUPPORT -I$(CROSS_COMPILE_TARGET)/usr/local/include/osp
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/osp/osp.h),)
+ ASTCFLAGS+=-DOSP_SUPPORT -I$(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/osp
else
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/osp/osp.h),)
ASTCFLAGS+=-DOSP_SUPPORT -I$(CROSS_COMPILE_TARGET)/usr/include/osp
@@ -253,27 +253,24 @@
ifeq ($(OSARCH),FreeBSD)
BSDVERSION=$(shell make -V OSVERSION -f $(CROSS_COMPILE_TARGET)/usr/share/mk/bsd.port.subdir.mk)
- ASTCFLAGS+=$(shell if test $(BSDVERSION) -lt 500016 ; then echo "-D_THREAD_SAFE"; fi)
- LIBS+=$(shell if test $(BSDVERSION) -lt 502102 ; then echo "-lc_r"; else echo "-pthread"; fi)
- ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/spandsp),)
- ASTCFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/include/spandsp
+ ASTCFLAGS+=$(PTHREAD_CFLAGS)
+ LIBS+=$(PTHREAD_LIBS)
+ ifneq ($(wildcard $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/spandsp),)
+ ASTCFLAGS+=-I$(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/spandsp
endif
MPG123TARG=freebsd
- # XXX FreeBSD paths
- PREFIX?=/usr/local
- ASTLIBDIR=$(INSTALL_PREFIX)$(PREFIX)/lib/asterisk
- ASTVARLIBDIR=$(INSTALL_PREFIX)$(PREFIX)/share/asterisk
- ASTETCDIR=$(INSTALL_PREFIX)$(PREFIX)/etc/asterisk
- ASTSPOOLDIR=$(INSTALL_PREFIX)/var/spool/asterisk
- ASTLOGDIR=$(INSTALL_PREFIX)/var/log/asterisk
- ASTHEADERDIR=$(INSTALL_PREFIX)$(PREFIX)/include/asterisk
+ ASTLIBDIR=$(INSTALL_PREFIX)/lib/asterisk
+ ASTVARLIBDIR=$(INSTALL_PREFIX)/share/asterisk
+ ASTETCDIR=$(INSTALL_PREFIX)/etc/asterisk
+ ASTSPOOLDIR=/var/spool/asterisk
+ ASTLOGDIR=/var/log/asterisk
+ ASTHEADERDIR=$(INSTALL_PREFIX)/include/asterisk
ASTCONFPATH=$(ASTETCDIR)/asterisk.conf
- ASTBINDIR=$(INSTALL_PREFIX)$(PREFIX)/bin
- ASTSBINDIR=$(INSTALL_PREFIX)$(PREFIX)/sbin
- ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run
- ASTMANDIR=$(INSTALL_PREFIX)$(PREFIX)/man
- # XXX end FreeBSD paths
+ ASTBINDIR=$(INSTALL_PREFIX)/bin
+ ASTSBINDIR=$(INSTALL_PREFIX)/sbin
+ ASTVARRUNDIR=/var/run
+ ASTMANDIR=$(INSTALL_PREFIX)/man
endif # FreeBSD
@@ -307,7 +304,7 @@
ifndef WITHOUT_ZAPTEL
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/pkg/include/zaptel.h),)
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/pkg/include/zaptel.h),)
ASTCFLAGS+=-DZAPTEL_OPTIMIZATIONS
endif
@@ -414,7 +411,7 @@
endif
# This is used when generating the doxygen documentation
-ifneq ($(wildcard /usr/local/bin/dot)$(wildcard /usr/bin/dot),)
+ifneq ($(wildcard $(LOCALBASE)/bin/dot)$(wildcard /usr/bin/dot),)
HAVEDOT=yes
else
HAVEDOT=no
@@ -431,7 +428,7 @@
@echo " + $(MAKE) install +"
@echo " +-------------------------------------------+"
-all: cleantest depend asterisk subdirs
+all: cleantest depend asterisk subdirs manpage
#ifneq ($(wildcard tags),)
ctags: tags
@@ -450,13 +447,13 @@
cd editline && unset CFLAGS LIBS && test -f config.h || CFLAGS="$(OPTIMIZE)" ./configure
$(MAKE) -C editline libedit.a
-db1-ast/libdb1.a: FORCE
- @if [ -d db1-ast ]; then \
- $(MAKE) -C db1-ast libdb1.a ; \
- else \
- echo "You need to do a cvs update -d not just cvs update"; \
- exit 1; \
- fi
+#db1-ast/libdb1.a: FORCE
+# @if [ -d db1-ast ]; then \
+# $(MAKE) -C db1-ast libdb1.a ; \
+# else \
+# echo "You need to do a cvs update -d not just cvs update"; \
+# exit 1; \
+# fi
ifneq ($(wildcard .depend),)
include .depend
@@ -480,10 +477,10 @@
manpage: asterisk.8
-asterisk.8: asterisk.sgml
- rm -f asterisk.8
- docbook2man asterisk.sgml
- mv ./*.8 asterisk.8
+#asterisk.8: asterisk.sgml
+# rm -f asterisk.8
+# docbook2man asterisk.sgml
+# mv ./*.8 asterisk.8
asterisk.pdf: asterisk.sgml
docbook2pdf asterisk.sgml
@@ -523,14 +520,14 @@
cygwin_a:
$(MAKE) -C cygwin all
-asterisk: $(CYGLOADER) editline/libedit.a db1-ast/libdb1.a stdtime/libtime.a $(OBJS)
+asterisk: $(CYGLOADER) editline/libedit.a stdtime/libtime.a $(OBJS)
build_tools/make_build_h > include/asterisk/build.h.tmp
if cmp -s include/asterisk/build.h.tmp include/asterisk/build.h ; then echo ; else \
mv include/asterisk/build.h.tmp include/asterisk/build.h ; \
fi
rm -f include/asterisk/build.h.tmp
$(CC) -c -o buildinfo.o $(CFLAGS) buildinfo.c
- $(CC) $(DEBUG) $(ASTOBJ) $(ASTLINK) $(OBJS) buildinfo.o $(LIBEDIT) db1-ast/libdb1.a stdtime/libtime.a $(LIBS)
+ $(CC) $(DEBUG) $(ASTOBJ) $(ASTLINK) $(OBJS) buildinfo.o $(LIBEDIT) stdtime/libtime.a $(LIBS)
muted: muted.o
$(CC) $(AUDIO_LIBS) -o muted muted.o
@@ -552,12 +549,12 @@
datafiles: all
if [ x`$(ID) -un` = xroot ]; then sh mkpkgconfig $(DESTDIR)/usr/lib/pkgconfig; fi
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/digits
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/silence
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/priv-callerintros
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/sounds/digits
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/sounds/silence
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/sounds/priv-callerintros
for x in sounds/digits/*.gsm; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/digits ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/digits ; \
else \
echo "No description for $$x"; \
exit 1; \
@@ -565,34 +562,34 @@
done
for x in sounds/silence/*.gsm; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/silence ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/silence ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/dictate
+ ${MKDIR} $(DESTDIR)$(ASTVARLIBDIR)/sounds/dictate
for x in sounds/dictate/*.gsm; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/dictate ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/dictate ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters
+ ${MKDIR} $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters
for x in sounds/letters/*.gsm; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic
+ ${MKDIR} $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic
for x in sounds/phonetic/*.gsm; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic ; \
else \
echo "No description for $$x"; \
exit 1; \
@@ -600,18 +597,18 @@
done
for x in sounds/demo-* sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-* sounds/spy-* sounds/priv-* sounds/screen-* sounds/hello-* sounds/hours* sounds/minute* sounds/second* ; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/mohmp3
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/images
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/mohmp3
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/images
for x in images/*.jpg; do \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/images ; \
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(ASTVARLIBDIR)/images ; \
done
- mkdir -p $(DESTDIR)$(AGI_DIR)
+ $(MKDIR) $(DESTDIR)$(AGI_DIR)
update:
@if [ -d .svn ]; then \
@@ -640,47 +637,47 @@
OLDHEADERS=$(filter-out $(NEWHEADERS),$(notdir $(wildcard $(DESTDIR)$(ASTHEADERDIR)/*.h)))
bininstall: all
- mkdir -p $(DESTDIR)$(MODULES_DIR)
- mkdir -p $(DESTDIR)$(ASTSBINDIR)
- mkdir -p $(DESTDIR)$(ASTETCDIR)
- mkdir -p $(DESTDIR)$(ASTBINDIR)
- mkdir -p $(DESTDIR)$(ASTVARRUNDIR)
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/voicemail
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/dictate
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/system
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/meetme
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/monitor
- if [ -f asterisk ]; then $(INSTALL) -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/; fi
- if [ -f cygwin/asterisk.exe ]; then $(INSTALL) -m 755 cygwin/asterisk.exe $(DESTDIR)$(ASTSBINDIR)/; fi
- if [ -f asterisk.dll ]; then $(INSTALL) -m 755 asterisk.dll $(DESTDIR)$(ASTSBINDIR)/; fi
+ $(MKDIR) $(DESTDIR)$(MODULES_DIR)
+ $(MKDIR) $(DESTDIR)$(ASTSBINDIR)
+ $(MKDIR) $(DESTDIR)$(ASTETCDIR)
+ $(MKDIR) $(DESTDIR)$(ASTBINDIR)
+ $(MKDIR) $(DESTDIR)$(ASTVARRUNDIR)
+ $(MKDIR) $(DESTDIR)$(ASTSPOOLDIR)/voicemail
+ $(MKDIR) $(DESTDIR)$(ASTSPOOLDIR)/dictate
+ $(MKDIR) $(DESTDIR)$(ASTSPOOLDIR)/system
+ $(MKDIR) $(DESTDIR)$(ASTSPOOLDIR)/tmp
+ $(MKDIR) $(DESTDIR)$(ASTSPOOLDIR)/meetme
+ $(MKDIR) $(DESTDIR)$(ASTSPOOLDIR)/monitor
+ if [ -f asterisk ]; then $(BSD_INSTALL_PROGRAM) asterisk $(DESTDIR)$(ASTSBINDIR)/; fi
+ if [ -f cygwin/asterisk.exe ]; then $(BSD_INSTALL_PROGRAM) cygwin/asterisk.exe $(DESTDIR)$(ASTSBINDIR)/; fi
+ if [ -f asterisk.dll ]; then $(BSD_INSTALL_PROGRAM) asterisk.dll $(DESTDIR)$(ASTSBINDIR)/; fi
$(LN) -sf asterisk $(DESTDIR)$(ASTSBINDIR)/rasterisk
- $(INSTALL) -m 755 contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/
- $(INSTALL) -m 755 contrib/scripts/autosupport $(DESTDIR)$(ASTSBINDIR)/
+ $(BSD_INSTALL_SCRIPT) contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/
+ $(BSD_INSTALL_SCRIPT) contrib/scripts/autosupport $(DESTDIR)$(ASTSBINDIR)/
if [ ! -f $(DESTDIR)$(ASTSBINDIR)/safe_asterisk ]; then \
cat contrib/scripts/safe_asterisk | sed 's|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;' > $(DESTDIR)$(ASTSBINDIR)/safe_asterisk ;\
chmod 755 $(DESTDIR)$(ASTSBINDIR)/safe_asterisk;\
fi
- $(INSTALL) -d $(DESTDIR)$(ASTHEADERDIR)
- $(INSTALL) -m 644 include/asterisk/*.h $(DESTDIR)$(ASTHEADERDIR)
+ $(MKDIR) $(DESTDIR)$(ASTHEADERDIR)
+ $(BSD_INSTALL_DATA) include/asterisk/*.h $(DESTDIR)$(ASTHEADERDIR)
if [ -n "$(OLDHEADERS)" ]; then \
rm -f $(addprefix $(DESTDIR)$(ASTHEADERDIR)/,$(OLDHEADERS)) ;\
fi
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds
- mkdir -p $(DESTDIR)$(ASTLOGDIR)/cdr-csv
- mkdir -p $(DESTDIR)$(ASTLOGDIR)/cdr-custom
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/keys
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/firmware
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax
- mkdir -p $(DESTDIR)$(ASTMANDIR)/man8
- $(INSTALL) -m 644 keys/iaxtel.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
- $(INSTALL) -m 644 keys/freeworlddialup.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
- $(INSTALL) -m 644 asterisk.8 $(DESTDIR)$(ASTMANDIR)/man8
- $(INSTALL) -m 644 contrib/scripts/astgenkey.8 $(DESTDIR)$(ASTMANDIR)/man8
- $(INSTALL) -m 644 contrib/scripts/autosupport.8 $(DESTDIR)$(ASTMANDIR)/man8
- $(INSTALL) -m 644 contrib/scripts/safe_asterisk.8 $(DESTDIR)$(ASTMANDIR)/man8
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/sounds
+ $(MKDIR) $(DESTDIR)$(ASTLOGDIR)/cdr-csv
+ $(MKDIR) $(DESTDIR)$(ASTLOGDIR)/cdr-custom
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/keys
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/firmware
+ $(MKDIR) $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax
+ $(MKDIR) $(DESTDIR)$(ASTMANDIR)/man8
+ $(BSD_INSTALL_DATA) keys/iaxtel.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
+ $(BSD_INSTALL_DATA) keys/freeworlddialup.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
+ $(BSD_INSTALL_DATA) asterisk.8 $(DESTDIR)$(ASTMANDIR)/man8
+ $(BSD_INSTALL_DATA) contrib/scripts/astgenkey.8 $(DESTDIR)$(ASTMANDIR)/man8
+ $(BSD_INSTALL_DATA) contrib/scripts/autosupport.8 $(DESTDIR)$(ASTMANDIR)/man8
+ $(BSD_INSTALL_DATA) contrib/scripts/safe_asterisk.8 $(DESTDIR)$(ASTMANDIR)/man8
if [ -d contrib/firmware/iax ]; then \
- $(INSTALL) -m 644 contrib/firmware/iax/iaxy.bin $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax/iaxy.bin; \
+ $(BSD_INSTALL_DATA) contrib/firmware/iax/iaxy.bin $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax/iaxy.bin; \
else \
echo "You need to do cvs update -d not just cvs update" ; \
fi
@@ -710,46 +707,28 @@
echo " WARNING WARNING WARNING" ;\
fi
-install: all datafiles bininstall install-subdirs
+install: all datafiles bininstall install-subdirs samples
@if [ -x /usr/sbin/asterisk-post-install ]; then \
/usr/sbin/asterisk-post-install $(DESTDIR) . ; \
fi
- @echo " +---- Asterisk Installation Complete -------+"
- @echo " + +"
- @echo " + YOU MUST READ THE SECURITY DOCUMENT +"
- @echo " + +"
- @echo " + Asterisk has successfully been installed. +"
- @echo " + If you would like to install the sample +"
- @echo " + configuration files (overwriting any +"
- @echo " + existing config files), run: +"
- @echo " + +"
- @echo " + $(MAKE) samples +"
- @echo " + +"
- @echo " +----------------- or ---------------------+"
- @echo " + +"
- @echo " + You can go ahead and install the asterisk +"
- @echo " + program documentation now or later run: +"
- @echo " + +"
- @echo " + $(MAKE) progdocs +"
- @echo " + +"
- @echo " + **Note** This requires that you have +"
- @echo " + doxygen installed on your local system +"
- @echo " +-------------------------------------------+"
@$(MAKE) -s oldmodcheck
upgrade: all bininstall
adsi:
- mkdir -p $(DESTDIR)$(ASTETCDIR)
+ $(MKDIR) $(DESTDIR)$(ASTETCDIR)
for x in configs/*.adsi; do \
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(ASTETCDIR)/`basename $$x`-dist; \
if [ ! -f $(DESTDIR)$(ASTETCDIRX)/$$x ]; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTETCDIR)/`basename $$x` ; \
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(ASTETCDIR)/`basename $$x` ; \
fi ; \
done
samples: adsi
- mkdir -p $(DESTDIR)$(ASTETCDIR)
+ echo ADSI INSTALL $(BSD_INSTALL_DATA)
+ $(MKDIR) $(DESTDIR)$(ASTETCDIR)
for x in configs/*.sample; do \
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(ASTETCDIR)/`basename $$x .sample`-dist;\
if [ -f $(DESTDIR)$(ASTETCDIR)/`basename $$x .sample` ]; then \
if [ "$(OVERWRITE)" = "y" ]; then \
if cmp -s $(DESTDIR)$(ASTETCDIR)/`basename $$x .sample` $$x ; then \
@@ -762,9 +741,9 @@
continue; \
fi ;\
fi ; \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTETCDIR)/`basename $$x .sample` ;\
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(ASTETCDIR)/`basename $$x .sample` ;\
done
- if [ "$(OVERWRITE)" = "y" ] || [ ! -f $(DESTDIR)$(ASTCONFPATH) ]; then \
+ if true ; then \
( \
echo "[directories]" ; \
echo "astetcdir => $(ASTETCDIR)" ; \
@@ -781,25 +760,25 @@
echo ";astctlowner = root" ; \
echo ";astctlgroup = apache" ; \
echo ";astctl = asterisk.ctl" ; \
- ) > $(DESTDIR)$(ASTCONFPATH) ; \
+ ) > $(DESTDIR)$(ASTCONFPATH)-dist ; \
else \
echo "Skipping asterisk.conf creation"; \
fi
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
+ ${MKDIR} $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
for x in sounds/demo-*; do \
if $(GREP) -q "^%`basename $$x`%" sounds.txt; then \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
- mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/mohmp3 ; \
+ ${MKDIR} $(DESTDIR)$(ASTVARLIBDIR)/mohmp3 ; \
for x in sounds/*.mp3; do \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/mohmp3 ; \
+ $(BSD_INSTALL_DATA) -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/mohmp3 ; \
done
rm -f $(DESTDIR)$(ASTVARLIBDIR)/mohmp3/sample-hold.mp3
- mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/voicemail/default/1234/INBOX
+ ${MKDIR} $(DESTDIR)$(ASTSPOOLDIR)/voicemail/default/1234/INBOX
:> $(DESTDIR)$(ASTSPOOLDIR)/voicemail/default/1234/unavail.gsm
for x in vm-theperson digits/1 digits/2 digits/3 digits/4 vm-isunavail; do \
cat $(DESTDIR)$(ASTVARLIBDIR)/sounds/$$x.gsm >> $(DESTDIR)$(ASTSPOOLDIR)/voicemail/default/1234/unavail.gsm ; \
@@ -813,9 +792,9 @@
@[ -d $(DESTDIR)$(HTTP_DOCSDIR)/ ] || ( printf "http docs directory not found.\nUpdate assignment of variable HTTP_DOCSDIR in Makefile!\n" && exit 1 )
@[ -d $(DESTDIR)$(HTTP_CGIDIR) ] || ( printf "cgi-bin directory not found.\nUpdate assignment of variable HTTP_CGIDIR in Makefile!\n" && exit 1 )
$(INSTALL) -m 4755 -o root -g root contrib/scripts/vmail.cgi $(DESTDIR)$(HTTP_CGIDIR)/vmail.cgi
- mkdir -p $(DESTDIR)$(HTTP_DOCSDIR)/_asterisk
+ $(MKDIR) $(DESTDIR)$(HTTP_DOCSDIR)/_asterisk
for x in images/*.gif; do \
- $(INSTALL) -m 644 $$x $(DESTDIR)$(HTTP_DOCSDIR)/_asterisk/; \
+ $(BSD_INSTALL_DATA) $$x $(DESTDIR)$(HTTP_DOCSDIR)/_asterisk/; \
done
@echo " +--------- Asterisk Web Voicemail ----------+"
@echo " + +"
@@ -842,10 +821,10 @@
__rpm: include/asterisk/version.h spec
rm -rf /tmp/asterisk ; \
- mkdir -p /tmp/asterisk/redhat/RPMS/i386 ; \
+ $(MKDIR) /tmp/asterisk/redhat/RPMS/i386 ; \
$(MAKE) DESTDIR=/tmp/asterisk install ; \
$(MAKE) DESTDIR=/tmp/asterisk samples ; \
- mkdir -p /tmp/asterisk/etc/rc.d/init.d ; \
+ $(MKDIR) /tmp/asterisk/etc/rc.d/init.d ; \
cp -f contrib/init.d/rc.redhat.asterisk /tmp/asterisk/etc/rc.d/init.d/asterisk ; \
rpmbuild --rcfile /usr/lib/rpm/rpmrc:redhat/rpmrc -bb asterisk.spec
--- patch-Makefile ends here ---
--- patch-cdr::Makefile begins here ---
--- cdr/Makefile.orig Thu Nov 16 21:29:28 2006
+++ cdr/Makefile Mon Mar 19 19:49:53 2007
@@ -21,8 +21,8 @@
endif
ifeq ($(findstring BSD,${OSARCH}),BSD)
- CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/include
- SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/local/lib
+ CFLAGS+=-I$(CROSS_COMPILE_TARGET)$(LOCALBASE)/include
+ SOLINK+=-L$(CROSS_COMPILE_TARGET)$(LOCALBASE)/lib
endif
#The problem with sparc is the best stuff is in newer versions of gcc (post 3.0) only.
@@ -38,21 +38,21 @@
#
# unixODBC stuff...
#
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/odbcinst.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/odbcinst.h),)
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/odbcinst.h)$(wildcard $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/odbcinst.h),)
MODS+=cdr_odbc.so
endif
#
# FreeTDS stuff...
#
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/tds.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/tds.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/freetds/tds.h),)
- ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/local/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.64),1)
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/tds.h)$(wildcard $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/tds.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/freetds/tds.h),)
+ ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.64),1)
CFLAGS += -DFREETDS_0_64
else
- ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/local/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.63),1)
+ ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.63),1)
CFLAGS += -DFREETDS_0_63
else
- ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/local/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.62),1)
+ ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.62),1)
CFLAGS += -DFREETDS_0_62
else
CFLAGS += -DFREETDS_PRE_0_62
@@ -65,7 +65,7 @@
#
# PGSQL stuff... Autoconf anyone??
#
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/postgresql/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/pgsql/include/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/pgsql/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/pgsql/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/opt/pgsql/include/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/libpq-fe.h),)
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/postgresql/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/pgsql/include/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/pgsql/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)${LOCALBASE}/include/pgsql/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/opt/pgsql/include/libpq-fe.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/libpq-fe.h),)
MODS+=cdr_pgsql.so
endif
@@ -86,9 +86,9 @@
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/lib/pgsql
endif
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/pgsql),)
- CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/include/pgsql
- MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/local/lib/pgsql
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/pgsql),)
+ CFLAGS+=-I$(CROSS_COMPILE_TARGET)$(LOCALBASE)/include/pgsql
+ MLFLAGS+=-L$(CROSS_COMPILE_TARGET)$(LOCALBASE)/lib/pgsql
endif
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/opt/pgsql/include),)
@@ -114,7 +114,7 @@
all: depend $(MODS)
install: all
- for x in $(MODS); do $(INSTALL) -m 755 $$x $(DESTDIR)$(MODULES_DIR) ; done
+ for x in $(MODS); do $(BSD_INSTALL_PROGRAM) $$x $(DESTDIR)$(MODULES_DIR) ; done
clean:
rm -f *.so *.o .depend
--- patch-cdr::Makefile ends here ---
--- patch-channels::chan_sip.c begins here ---
--- channels/chan_sip.c.orig Fri Mar 2 18:02:46 2007
+++ channels/chan_sip.c Mon Mar 19 19:57:05 2007
@@ -339,7 +339,7 @@
static char default_language[MAX_LANGUAGE] = "";
-#define DEFAULT_CALLERID "asterisk"
+#define DEFAULT_CALLERID "Unknown"
static char default_callerid[AST_MAX_EXTENSION] = DEFAULT_CALLERID;
static char default_fromdomain[AST_MAX_EXTENSION] = "";
@@ -483,6 +483,7 @@
struct sip_route {
struct sip_route *next;
+ int lr;
char hop[0];
};
@@ -2807,6 +2808,8 @@
tmp->nativeformats = ast_codec_choose(&i->prefs, global_capability, 1);
fmt = ast_best_codec(tmp->nativeformats);
+ pbx_builtin_setvar_helper(tmp, "SIP_CODEC_USED", ast_getformatname(fmt));
+
if (title)
snprintf(tmp->name, sizeof(tmp->name), "SIP/%s-%08x", title, (int)(long) i);
else if (strchr(i->fromdomain,':'))
@@ -6226,6 +6229,7 @@
/* Make a struct route */
thishop = malloc(sizeof(*thishop) + len);
if (thishop) {
+ thishop->lr = (strnstr(rr, ";lr", len) != NULL ? 1 : 0);
ast_copy_string(thishop->hop, rr, len);
ast_log(LOG_DEBUG, "build_route: Record-Route hop: <%s>\n", thishop->hop);
/* Link in */
@@ -6251,31 +6255,41 @@
/* Only append the contact if we are dealing with a strict router */
if (!head || (!ast_strlen_zero(head->hop) && strstr(head->hop,";lr") == NULL) ) {
- /* 2nd append the Contact: if there is one */
- /* Can be multiple Contact headers, comma separated values - we just take the first */
- contact = get_header(req, "Contact");
- if (!ast_strlen_zero(contact)) {
- ast_log(LOG_DEBUG, "build_route: Contact hop: %s\n", contact);
- /* Look for <: delimited address */
- c = strchr(contact, '<');
- if (c) {
- /* Take to > */
- ++c;
- len = strcspn(c, ">") + 1;
- } else {
- /* No <> - just take the lot */
- c = contact;
- len = strlen(contact) + 1;
- }
- thishop = malloc(sizeof(*thishop) + len);
+ /* Duplicate first route from the list */
+ if (head && head->lr) {
+ thishop = (struct sip_route *)malloc(sizeof(struct sip_route)+strlen(head->hop)+1);
if (thishop) {
- ast_copy_string(thishop->hop, c, len);
- thishop->next = NULL;
- /* Goes at the end */
- if (tail)
- tail->next = thishop;
- else
- head = thishop;
+ memcpy(thishop, head, sizeof(struct sip_route)+strlen(head->hop)+1);
+ thishop->next = head;
+ head = thishop;
+ }
+ } else {
+ /* Append the Contact: if there is one and first route is w/o `lr' param */
+ /* Can be multiple Contact headers, comma separated values - we just take the first */
+ contact = get_header(req, "Contact");
+ if (!ast_strlen_zero(contact)) {
+ ast_log(LOG_DEBUG, "build_route: Contact hop: %s\n", contact);
+ /* Look for <: delimited address */
+ c = strchr(contact, '<');
+ if (c) {
+ /* Take to > */
+ ++c;
+ len = strcspn(c, ">") + 1;
+ } else {
+ /* No <> - just take the lot */
+ c = contact;
+ len = strlen(contact) + 1;
+ }
+ thishop = malloc(sizeof(*thishop) + len);
+ if (thishop) {
+ ast_copy_string(thishop->hop, c, len);
+ thishop->next = NULL;
+ /* Goes at the end */
+ if (tail)
+ tail->next = thishop;
+ else
+ head = thishop;
+ }
}
}
}
@@ -9278,6 +9292,13 @@
secret = p->peersecret;
md5secret = p->peermd5secret;
}
+ /* No authentication. Try to get auth info from channel vars */
+ if (ast_strlen_zero(username))
+ {
+ username = pbx_builtin_getvar_helper(p->owner, "SIP_AUTH_NAME");
+ secret = pbx_builtin_getvar_helper(p->owner, "SIP_AUTH_SECRET");
+ md5secret = pbx_builtin_getvar_helper(p->owner, "SIP_AUTH_MD5SECRET");
+ }
if (ast_strlen_zero(username)) /* We have no authentication */
return -1;
@@ -10671,7 +10692,11 @@
gotdest = get_destination(p, NULL);
get_rdnis(p, NULL);
- extract_uri(p, req);
+ build_route(p, req, 0);
+ if (!p->route->lr)
+ strncpy(p->uri, p->route->hop, sizeof(p->uri) - 1);
+ else
+ extract_uri(p, req);
build_contact(p);
if (gotdest) {
@@ -10692,7 +10717,6 @@
c = sip_new(p, AST_STATE_DOWN, ast_strlen_zero(p->username) ? NULL : p->username );
*recount = 1;
/* Save Record-Route for any later requests we make on this dialogue */
- build_route(p, req, 0);
if (c) {
/* Pre-lock the call */
ast_mutex_lock(&c->lock);
@@ -10778,6 +10802,12 @@
transmit_response(p, "180 Ringing", req);
break;
case AST_STATE_UP:
+ /* Assuming this to be reinvite, process new SDP portion */
+ if (!ast_strlen_zero(get_header(req, "Content-Type"))) {
+ process_sdp(p, req);
+ } else {
+ ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n");
+ }
transmit_response_with_sdp(p, "200 OK", req, 1);
break;
default:
--- patch-channels::chan_sip.c ends here ---
--- patch-utils::Makefile begins here ---
--- utils/Makefile.orig Wed Jan 24 18:43:50 2007
+++ utils/Makefile Mon Mar 19 20:07:50 2007
@@ -17,17 +17,17 @@
CFLAGS+=-DNO_AST_MM
ifeq ($(findstring BSD,${OSARCH}),BSD)
- CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/include -L$(CROSS_COMPILE_TARGET)/usr/local/lib
+ CFLAGS+=-I$(CROSS_COMPILE_TARGET)${LOCALBASE}/include -L$(CROSS_COMPILE_TARGET)${LOCALBASE}/lib
endif
# to get check_expr, add it to the TARGET list
TARGET=stereorize streamplayer
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/popt.h)$(wildcard -f $(CROSS_COMPILE_TARGET)/usr/local/include/popt.h),)
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/popt.h)$(wildcard -f $(CROSS_COMPILE_TARGET)${LOCALBASE}/include/popt.h),)
TARGET+=smsq
endif
-ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/newt.h)$(wildcard -f $(CROSS_COMPILE_TARGET)/usr/local/include/newt.h),)
+ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/newt.h)$(wildcard -f $(CROSS_COMPILE_TARGET)${LOCALBASE}/include/newt.h),)
TARGET+=astman
endif
@@ -41,7 +41,7 @@
install:
for x in $(TARGET); do \
if [ "$$x" != "none" ]; then \
- $(INSTALL) -m 755 $$x $(DESTDIR)$(ASTSBINDIR)/$$x; \
+ $(BSD_INSTALL_PROGRAM) $$x $(DESTDIR)$(ASTSBINDIR)/$$x; \
fi; \
done
--- patch-utils::Makefile ends here ---
--- patch-zzz-asterisk-1.2.16.1-codec-negotiation-20070319 begins here ---
--- Makefile.orig Wed Sep 6 23:09:10 2006
+++ ./Makefile Mon Oct 9 13:01:08 2006
@@ -772,6 +772,47 @@
echo ";astctlowner = root" ; \
echo ";astctlgroup = apache" ; \
echo ";astctl = asterisk.ctl" ; \
+ echo ";"; \
+ echo "; The following section allows to choose the translation and the codec"; \
+ echo "; negotiation algorithms"; \
+ echo ";"; \
+ echo "[codec_negotiation]"; \
+ echo ";"; \
+ echo "; The translation_algorithm option allows to choose between two"; \
+ echo "; algorythms:"; \
+ echo ";"; \
+ echo "; 1. Always follow the format of data that the peer sends in."; \
+ echo "; For example suppose the peer announced support for G729 and ULAW and"; \
+ echo "; sends data in G729. Then Asterisk will translate all outgoing frames"; \
+ echo "; to G729 regardless of initial format of the outgoing frames even if"; \
+ echo "; they are in ULAW format. Outgoing G729 frames of course will not be"; \
+ echo "; translated."; \
+ echo ";"; \
+ echo "; The name of this algorithm is:"; \
+ echo "; strict"; \
+ echo ";"; \
+ echo "; Synonyms are:"; \
+ echo "; follow_peer"; \
+ echo "; avoid_asymmetry"; \
+ echo ";"; \
+ echo "; 2. Avoid translations if possible."; \
+ echo "; For example suppose the peer announced support for G729 and ULAW and"; \
+ echo "; sends data in G729. If Asterisk is to send the frame in G729 or ULAW"; \
+ echo "; format then no translation will be performed and so frame is sent"; \
+ echo "; unchanged. If the outgoing frame is in other format (not G729 or ULAW)"; \
+ echo "; then the frame will be translated to G729 format."; \
+ echo ";"; \
+ echo "; The name of the algorithm is:"; \
+ echo "; loose"; \
+ echo ";"; \
+ echo "; Synonyms are:"; \
+ echo "; save_cpu"; \
+ echo "; avoid_translation"; \
+ echo "; asymmetric"; \
+ echo ";"; \
+ echo "; Default: strict"; \
+ echo ";"; \
+ echo ";translation_algorithm = strict"; \
) > $(DESTDIR)$(ASTCONFPATH)-dist ; \
else \
echo "Skipping asterisk.conf creation"; \
--- apps/app_chanisavail.c.orig Tue Nov 29 20:24:39 2005
+++ apps/app_chanisavail.c Mon Oct 9 13:01:08 2006
@@ -118,7 +118,7 @@
snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
status = inuse = ast_device_state(trychan);
}
- if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, number, &status))) {
+ if ((inuse <= 1) && (tempchan = ast_request(tech, &chan->nativeformats, number, &status))) {
pbx_builtin_setvar_helper(chan, "AVAILCHAN", tempchan->name);
/* Store the originally used channel too */
snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
--- apps/app_dial.c.orig Sat Aug 5 09:37:59 2006
+++ apps/app_dial.c Mon Oct 9 13:01:08 2006
@@ -469,7 +469,7 @@
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
/* Setup parameters */
- o->chan = ast_request(tech, in->nativeformats, stuff, &cause);
+ o->chan = ast_request(tech, &in->nativeformats, stuff, &cause);
if (!o->chan)
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
else
@@ -1050,7 +1050,7 @@
ast_log(LOG_DEBUG, "Dialing by extension %s\n", numsubst);
}
/* Request the peer */
- tmp->chan = ast_request(tech, chan->nativeformats, numsubst, &cause);
+ tmp->chan = ast_request(tech, &chan->nativeformats, numsubst, &cause);
if (!tmp->chan) {
/* If we can't, just go on to the next call */
ast_log(LOG_NOTICE, "Unable to create channel of type '%s' (cause %d - %s)\n", tech, cause, ast_cause2str(cause));
@@ -1081,7 +1081,7 @@
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", chan->name, tech, stuff, tmp->chan->name);
ast_hangup(tmp->chan);
/* Setup parameters */
- tmp->chan = ast_request(tech, chan->nativeformats, stuff, &cause);
+ tmp->chan = ast_request(tech, &chan->nativeformats, stuff, &cause);
if (!tmp->chan)
ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
else
--- apps/app_dumpchan.c.orig Wed Jun 14 17:07:53 2006
+++ apps/app_dumpchan.c Mon Oct 9 13:01:08 2006
@@ -113,7 +113,7 @@
ast_state2str(c->_state),
c->_state,
c->rings,
- c->nativeformats,
+ ast_codec_pref_bits(&c->nativeformats),
c->writeformat,
c->readformat,
c->fds[0], c->fin & 0x7fffffff, (c->fin & 0x80000000) ? " (DEBUGGED)" : "",
--- apps/app_echo.c.orig Tue Nov 29 20:24:39 2005
+++ apps/app_echo.c Mon Oct 9 13:01:08 2006
@@ -60,8 +60,8 @@
struct localuser *u;
struct ast_frame *f;
LOCAL_USER_ADD(u);
- ast_set_write_format(chan, ast_best_codec(chan->nativeformats));
- ast_set_read_format(chan, ast_best_codec(chan->nativeformats));
+ ast_set_write_format(chan, ast_best_codec(ast_codec_pref_bits(&chan->nativeformats)));
+ ast_set_read_format(chan, ast_best_codec(ast_codec_pref_bits(&chan->nativeformats)));
/* Do our thing here */
while(ast_waitfor(chan, -1) > -1) {
f = ast_read(chan);
--- apps/app_meetme.c.orig Tue Sep 12 00:47:23 2006
+++ apps/app_meetme.c Mon Oct 9 13:01:08 2006
@@ -454,11 +454,15 @@
/* Make a new one */
cnf = calloc(1, sizeof(*cnf));
if (cnf) {
+ struct ast_codec_pref formats;
+ ast_codec_pref_init(&formats);
+ ast_codec_pref_append(&formats, AST_FORMAT_ULAW);
+
ast_copy_string(cnf->confno, confno, sizeof(cnf->confno));
ast_copy_string(cnf->pin, pin, sizeof(cnf->pin));
ast_copy_string(cnf->pinadmin, pinadmin, sizeof(cnf->pinadmin));
cnf->markedusers = 0;
- cnf->chan = ast_request("zap", AST_FORMAT_ULAW, "pseudo", NULL);
+ cnf->chan = ast_request("zap", &formats, "pseudo", NULL);
if (cnf->chan) {
cnf->fd = cnf->chan->fds[0]; /* for use by conf_play() */
} else {
--- apps/app_page.c.orig Tue Sep 12 00:47:23 2006
+++ apps/app_page.c Mon Oct 9 13:01:08 2006
@@ -84,7 +84,10 @@
static void *page_thread(void *data)
{
struct calloutdata *cd = data;
- ast_pbx_outgoing_app(cd->tech, AST_FORMAT_SLINEAR, cd->resource, 30000,
+ struct ast_codec_pref slin;
+ ast_codec_pref_init(&slin);
+ ast_codec_pref_append(&slin, AST_FORMAT_SLINEAR);
+ ast_pbx_outgoing_app(cd->tech, &slin, cd->resource, 30000,
"MeetMe", cd->meetmeopts, NULL, 0, cd->cidnum, cd->cidname, cd->variables, NULL, NULL);
free(cd);
return NULL;
--- apps/app_parkandannounce.c.orig Tue Nov 29 20:24:39 2005
+++ apps/app_parkandannounce.c Mon Oct 9 13:01:08 2006
@@ -84,6 +84,11 @@
struct localuser *u;
+ struct ast_codec_pref formats;
+
+ ast_codec_pref_init(&formats);
+ ast_codec_pref_append(&formats, AST_FORMAT_SLINEAR);
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "ParkAndAnnounce requires arguments: (announce:template|timeout|dial|[return_context])\n");
return -1;
@@ -183,7 +188,7 @@
memset(&oh, 0, sizeof(oh));
oh.parent_channel = chan;
- dchan = __ast_request_and_dial(dialtech, AST_FORMAT_SLINEAR, dialstr,30000, &outstate, chan->cid.cid_num, chan->cid.cid_name, &oh);
+ dchan = __ast_request_and_dial(dialtech, &formats, dialstr,30000, &outstate, chan->cid.cid_num, chan->cid.cid_name, &oh);
if(dchan) {
if(dchan->_state == AST_STATE_UP) {
--- apps/app_queue.c.orig Sun Sep 3 20:38:22 2006
+++ apps/app_queue.c Mon Oct 9 13:01:08 2006
@@ -1509,7 +1509,7 @@
location = "";
/* Request the peer */
- tmp->chan = ast_request(tech, qe->chan->nativeformats, location, &status);
+ tmp->chan = ast_request(tech, &qe->chan->nativeformats, location, &status);
if (!tmp->chan) { /* If we can't, just go on to the next call */
#if 0
ast_log(LOG_NOTICE, "Unable to create channel of type '%s' for Queue\n", cur->tech);
@@ -1821,7 +1821,7 @@
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
/* Setup parameters */
- o->chan = ast_request(tech, in->nativeformats, stuff, &status);
+ o->chan = ast_request(tech, &in->nativeformats, stuff, &status);
if (status != o->oldstatus)
update_dial_status(qe->parent, o->member, status);
if (!o->chan) {
--- asterisk.c.orig Tue Aug 22 01:34:26 2006
+++ ./asterisk.c Mon Oct 9 13:01:08 2006
@@ -177,6 +177,7 @@
int fully_booted = 0;
char record_cache_dir[AST_CACHE_DIR_LEN] = AST_TMP_DIR;
char debug_filename[AST_FILENAME_MAX] = "";
+enum ast_trans_algorithm option_translation_algorithm = AST_TRANS_ALG_STRICT;
static int ast_socket = -1; /*!< UNIX Socket for allowing remote control */
static int ast_consock = -1; /*!< UNIX Socket for controlling another asterisk */
@@ -1993,6 +1994,30 @@
ast_copy_string(ast_config_AST_RUN_GROUP, v->value, sizeof(ast_config_AST_RUN_GROUP));
}
v = v->next;
+ }
+ option_translation_algorithm = AST_TRANS_ALG_STRICT;
+ for (v = ast_variable_browse(cfg, "codec_negotiation"); v; v = v->next)
+ {
+ if (!strcasecmp(v->name, "translation_algorithm")) {
+ if (!strcasecmp(v->value, "loose") ||
+ !strcasecmp(v->value, "save_cpu") ||
+ !strcasecmp(v->value, "avoid_translation") ||
+ !strcasecmp(v->value, "asymmetric"))
+ {
+ option_translation_algorithm = AST_TRANS_ALG_LOOSE;
+ }
+/*
+ else if (!strcasecmp(v->value, "strict") ||
+ !strcasecmp(v->value, "follow_peer") ||
+ !strcasecmp(v->value, "avoid_asymmetry"))
+ {
+ option_translation_algorithm = AST_TRANS_ALG_STRICT;
+ }
+*/
+ else {
+ option_translation_algorithm = AST_TRANS_ALG_STRICT;
+ }
+ }
}
ast_config_destroy(cfg);
}
--- channel.c.orig Sat Sep 9 23:24:19 2006
+++ ./channel.c Mon Oct 9 13:01:08 2006
@@ -927,10 +927,7 @@
ast_moh_cleanup(chan);
/* Free translatosr */
- if (chan->readtrans)
- ast_translator_free_path(chan->readtrans);
- if (chan->writetrans)
- ast_translator_free_path(chan->writetrans);
+ ast_translator_free_translations(chan);
if (chan->pbx)
ast_log(LOG_WARNING, "PBX may not have been terminated properly on '%s'\n", chan->name);
free_cid(&chan->cid);
@@ -1299,14 +1296,9 @@
static void free_translation(struct ast_channel *clone)
{
- if (clone->writetrans)
- ast_translator_free_path(clone->writetrans);
- if (clone->readtrans)
- ast_translator_free_path(clone->readtrans);
- clone->writetrans = NULL;
- clone->readtrans = NULL;
- clone->rawwriteformat = clone->nativeformats;
- clone->rawreadformat = clone->nativeformats;
+ ast_translator_free_translations(clone);
+ clone->rawwriteformat = clone->nativeformats.audio_bits;
+ clone->rawreadformat = clone->nativeformats.audio_bits;
}
/*--- ast_hangup: Hangup a channel */
@@ -1950,10 +1942,11 @@
if (f && (f->frametype == AST_FRAME_VOICE)) {
- if (!(f->subclass & chan->nativeformats)) {
+ if (!(f->subclass & chan->nativeformats.audio_bits)) {
+ char buf[512];
/* This frame can't be from the current native formats -- drop it on the
floor */
- ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n", chan->name, ast_getformatname(f->subclass), ast_getformatname(chan->nativeformats));
+ ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %s since our native format has changed to %s\n", chan->name, ast_getformatname(f->subclass), ast_codec_pref_dump(buf, sizeof(buf), &chan->nativeformats));
ast_frfree(f);
f = &null_frame;
} else {
@@ -1981,11 +1974,9 @@
if (ast_writestream(chan->monitor->read_stream, f) < 0)
ast_log(LOG_WARNING, "Failed to write data to channel monitor read stream\n");
}
- if (chan->readtrans) {
- f = ast_translate(chan->readtrans, f, 1);
- if (!f)
- f = &null_frame;
- }
+ f = ast_translate_read(chan, f, 1);
+ if (!f)
+ f = &null_frame;
}
}
@@ -2304,7 +2295,7 @@
break;
default:
if (chan->tech->write) {
- f = (chan->writetrans) ? ast_translate(chan->writetrans, fr, 0) : fr;
+ f = ast_translate_write(chan, fr, 0);
if (f) {
if (f->frametype == AST_FRAME_VOICE && chan->spies)
queue_frame_to_spies(chan, f, SPY_WRITE);
@@ -2362,12 +2353,12 @@
}
static int set_format(struct ast_channel *chan, int fmt, int *rawformat, int *format,
- struct ast_trans_pvt **trans, const int direction)
+ const int direction)
{
int native;
int res;
- native = chan->nativeformats;
+ native = ast_codec_pref_index_audio(&chan->nativeformats, 0);
/* Find a translation path from the native format to one of the desired formats */
if (!direction)
/* reading */
@@ -2377,33 +2368,26 @@
res = ast_translator_best_choice(&native, &fmt);
if (res < 0) {
+ char buf[512];
ast_log(LOG_WARNING, "Unable to find a codec translation path from %s to %s\n",
- ast_getformatname(native), ast_getformatname(fmt));
+ ast_getformatname_multiple(buf, sizeof(buf), native), ast_getformatname(fmt));
+/*
return -1;
+*/
}
/* Now we have a good choice for both. */
ast_mutex_lock(&chan->lock);
- if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format) || (*trans))) {
+ if ((*rawformat == native) && (*format == fmt) && ((*rawformat == *format))) {
/* the channel is already in these formats, so nothing to do */
ast_mutex_unlock(&chan->lock);
return 0;
}
- *rawformat = native;
+ *rawformat = chan->lastreadformat = native;
/* User perspective is fmt */
*format = fmt;
- /* Free any read translation we have right now */
- if (*trans)
- ast_translator_free_path(*trans);
- /* Build a translation path from the raw format to the desired format */
- if (!direction)
- /* reading */
- *trans = ast_translator_build_path(*format, *rawformat);
- else
- /* writing */
- *trans = ast_translator_build_path(*rawformat, *format);
ast_mutex_unlock(&chan->lock);
if (option_debug)
ast_log(LOG_DEBUG, "Set channel %s to %s format %s\n", chan->name,
@@ -2413,17 +2397,15 @@
int ast_set_read_format(struct ast_channel *chan, int fmt)
{
- return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat,
- &chan->readtrans, 0);
+ return set_format(chan, fmt, &chan->rawreadformat, &chan->readformat, 0);
}
int ast_set_write_format(struct ast_channel *chan, int fmt)
{
- return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat,
- &chan->writetrans, 1);
+ return set_format(chan, fmt, &chan->rawwriteformat, &chan->writeformat, 1);
}
-struct ast_channel *__ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
+struct ast_channel *__ast_request_and_dial(const char *type, const struct ast_codec_pref *formats, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
{
int state = 0;
int cause = 0;
@@ -2431,7 +2413,7 @@
struct ast_frame *f;
int res = 0;
- chan = ast_request(type, format, data, &cause);
+ chan = ast_request(type, formats, data, &cause);
if (chan) {
if (oh) {
if (oh->vars)
@@ -2537,20 +2519,20 @@
return chan;
}
-struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
+struct ast_channel *ast_request_and_dial(const char *type, const struct ast_codec_pref *formats, void *data, int timeout, int *outstate, const char *cidnum, const char *cidname)
{
- return __ast_request_and_dial(type, format, data, timeout, outstate, cidnum, cidname, NULL);
+ return __ast_request_and_dial(type, formats, data, timeout, outstate, cidnum, cidname, NULL);
}
-struct ast_channel *ast_request(const char *type, int format, void *data, int *cause)
+struct ast_channel *ast_request(const char *type, const struct ast_codec_pref *requested_formats, void *data, int *cause)
{
struct chanlist *chan;
struct ast_channel *c;
- int capabilities;
- int fmt;
- int res;
int foo;
+ struct ast_codec_pref formats;
+ memcpy(&formats, requested_formats, sizeof(formats));
+ ast_codec_pref_append_missing2(&formats, ast_compatible_audio_formats(formats.audio_bits));
if (!cause)
cause = &foo;
*cause = AST_CAUSE_NOTDEFINED;
@@ -2561,22 +2543,25 @@
}
for (chan = backends; chan; chan = chan->next) {
+ struct ast_codec_pref tmp_formats;
if (strcasecmp(type, chan->tech->type))
continue;
- capabilities = chan->tech->capabilities;
- fmt = format;
- res = ast_translator_best_choice(&fmt, &capabilities);
- if (res < 0) {
- ast_log(LOG_WARNING, "No translator path exists for channel type %s (native %d) to %d\n", type, chan->tech->capabilities, format);
+ if (!(chan->tech->capabilities & ast_codec_pref_bits(&formats)))
+ {
+ char buf[512];
+ ast_log(LOG_WARNING, "Channel %s does not support requested formats %s\n", type, ast_codec_pref_dump(buf, sizeof(buf), &formats));
ast_mutex_unlock(&chlock);
return NULL;
}
ast_mutex_unlock(&chlock);
- if (!chan->tech->requester)
+ if (!chan->tech->requester) {
+ ast_log(LOG_WARNING, "Cannot allocate channel %s because it hasn't registered the requester function\n", type);
return NULL;
-
- if (!(c = chan->tech->requester(type, capabilities, data, cause)))
+ }
+ memcpy(&tmp_formats, &formats, sizeof(formats));
+ ast_codec_pref_remove2(&tmp_formats, ~chan->tech->capabilities);
+ if (!(c = chan->tech->requester(type, &tmp_formats, data, cause)))
return NULL;
if (c->_state == AST_STATE_DOWN) {
@@ -2744,15 +2729,31 @@
{
int src;
int dst;
+ int res = -1;
+ int i, j, done;
/* Set up translation from the chan to the peer */
- src = chan->nativeformats;
- dst = peer->nativeformats;
- if (ast_translator_best_choice(&dst, &src) < 0) {
- ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", chan->name, src, peer->name, dst);
+ done = 0;
+ for (i = 0; i < 32 && !done; ++i) {
+ dst = ast_codec_pref_index_audio(&peer->nativeformats, i);
+ if (!dst) break;
+ for (j = 0; j < 32 && !done; ++j) {
+ src = ast_codec_pref_index_audio(&chan->nativeformats, j);
+ if (!src) break;
+ res = ast_translator_best_choice(&dst, &src);
+ if (res >= 0)
+ done = 1;
+ }
+ }
+ if (res < 0) {
+ char buf[512], buf2[512];
+ ast_log(LOG_WARNING, "No path to translate from %s %s to %s %s\n",
+ chan->name,
+ ast_codec_pref_dump(buf, sizeof(buf), &chan->nativeformats),
+ peer->name,
+ ast_codec_pref_dump(buf2, sizeof(buf2), &peer->nativeformats));
return -1;
}
-
/* if the best path is not 'pass through', then
transcoding is needed; if desired, force transcode path
to use SLINEAR between channels */
@@ -2768,10 +2769,25 @@
}
/* Set up translation from the peer to the chan */
- src = peer->nativeformats;
- dst = chan->nativeformats;
- if (ast_translator_best_choice(&dst, &src) < 0) {
- ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", peer->name, src, chan->name, dst);
+ done = 0;
+ for (i = 0; i < 32 && !done; ++i) {
+ dst = ast_codec_pref_index_audio(&peer->nativeformats, i);
+ if (!dst) break;
+ for (j = 0; j < 32 && !done; ++j) {
+ src = ast_codec_pref_index_audio(&chan->nativeformats, j);
+ if (!src) break;
+ res = ast_translator_best_choice(&src, &dst);
+ if (res >= 0)
+ done = 1;
+ }
+ }
+ if (res < 0) {
+ char buf[512], buf2[512];
+ ast_log(LOG_WARNING, "No path to translate from %s %s to %s %s\n",
+ peer->name,
+ ast_codec_pref_dump(buf2, sizeof(buf2), &peer->nativeformats),
+ chan->name,
+ ast_codec_pref_dump(buf, sizeof(buf), &chan->nativeformats));
return -1;
}
/* if the best path is not 'pass through', then
@@ -3137,7 +3153,7 @@
original->fds[AST_MAX_FDS - 2] = original->timingfd;
/* Our native formats are different now */
- original->nativeformats = clone->nativeformats;
+ memcpy(&original->nativeformats, &clone->nativeformats, sizeof(struct ast_codec_pref));
/* Context, extension, priority, app data, jump table, remain the same */
/* pvt switches. pbx stays the same, as does next */
@@ -3335,15 +3351,16 @@
cs[1] = c1;
pvt0 = c0->tech_pvt;
pvt1 = c1->tech_pvt;
- o0nativeformats = c0->nativeformats;
- o1nativeformats = c1->nativeformats;
+ o0nativeformats = ast_codec_pref_bits(&c0->nativeformats);
+ o1nativeformats = ast_codec_pref_bits(&c1->nativeformats);
watch_c0_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_0;
watch_c1_dtmf = config->flags & AST_BRIDGE_DTMF_CHANNEL_1;
for (;;) {
if ((c0->tech_pvt != pvt0) || (c1->tech_pvt != pvt1) ||
- (o0nativeformats != c0->nativeformats) ||
- (o1nativeformats != c1->nativeformats)) {
+ (o0nativeformats != ast_codec_pref_bits(&c0->nativeformats)) ||
+ (o1nativeformats != ast_codec_pref_bits(&c1->nativeformats)))
+ {
/* Check for Masquerade, codec changes, etc */
res = AST_BRIDGE_RETRY;
break;
@@ -3490,8 +3507,8 @@
"CallerID2: %s\r\n",
c0->name, c1->name, c0->uniqueid, c1->uniqueid, c0->cid.cid_num, c1->cid.cid_num);
- o0nativeformats = c0->nativeformats;
- o1nativeformats = c1->nativeformats;
+ o1nativeformats = ast_codec_pref_bits(&c1->nativeformats);
+ o0nativeformats = ast_codec_pref_bits(&c0->nativeformats);
if (config->feature_timer) {
nexteventts = ast_tvadd(config->start_time, ast_samp2tv(config->feature_timer, 1000));
@@ -3624,7 +3641,8 @@
}
if (((c0->writeformat != c1->readformat) || (c0->readformat != c1->writeformat) ||
- (c0->nativeformats != o0nativeformats) || (c1->nativeformats != o1nativeformats)) &&
+ (ast_codec_pref_bits(&c0->nativeformats) != o0nativeformats) ||
+ (ast_codec_pref_bits(&c1->nativeformats) != o1nativeformats)) &&
!(c0->generator || c1->generator)) {
if (ast_channel_make_compatible(c0, c1)) {
ast_log(LOG_WARNING, "Can't make %s and %s compatible\n", c0->name, c1->name);
@@ -3638,8 +3656,8 @@
c0->name, c1->name, c0->uniqueid, c1->uniqueid, c0->cid.cid_num, c1->cid.cid_num);
return AST_BRIDGE_FAILED;
}
- o0nativeformats = c0->nativeformats;
- o1nativeformats = c1->nativeformats;
+ o0nativeformats = ast_codec_pref_bits(&c0->nativeformats);
+ o1nativeformats = ast_codec_pref_bits(&c1->nativeformats);
}
res = ast_generic_bridge(c0, c1, config, fo, rc, nexteventts);
if (res != AST_BRIDGE_RETRY)
--- channels/chan_agent.c.orig Wed Sep 6 21:16:41 2006
+++ channels/chan_agent.c Mon Oct 9 13:01:08 2006
@@ -209,10 +209,10 @@
#define CHECK_FORMATS(ast, p) do { \
if (p->chan) {\
- if (ast->nativeformats != p->chan->nativeformats) { \
- ast_log(LOG_DEBUG, "Native formats changing from %d to %d\n", ast->nativeformats, p->chan->nativeformats); \
+ if (!ast_codec_pref_eq_noorder(&ast->nativeformats, &p->chan->nativeformats)) { \
+ ast_log(LOG_DEBUG, "Native formats changing from %d to %d\n", ast_codec_pref_bits(&ast->nativeformats), ast_codec_pref_bits(&p->chan->nativeformats)); \
/* Native formats changed, reset things */ \
- ast->nativeformats = p->chan->nativeformats; \
+ memcpy(&ast->nativeformats, &p->chan->nativeformats, sizeof(ast->nativeformats)); \
ast_log(LOG_DEBUG, "Resetting read to %d and write to %d\n", ast->readformat, ast->writeformat);\
ast_set_read_format(ast, ast->readformat); \
ast_set_write_format(ast, ast->writeformat); \
@@ -239,7 +239,7 @@
} \
} while(0)
-static struct ast_channel *agent_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *agent_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int agent_devicestate(void *data);
static int agent_digit(struct ast_channel *ast, char digit);
static int agent_call(struct ast_channel *ast, char *dest, int timeout);
@@ -678,20 +678,20 @@
ast_log( LOG_DEBUG, "Waited for stream, result '%d'\n", res);
}
if (!res) {
- res = ast_set_read_format(p->chan, ast_best_codec(p->chan->nativeformats));
+ res = ast_set_read_format(p->chan, ast_best_codec(p->chan->nativeformats.audio_bits));
ast_log( LOG_DEBUG, "Set read format, result '%d'\n", res);
if (res)
- ast_log(LOG_WARNING, "Unable to set read format to %s\n", ast_getformatname(ast_best_codec(p->chan->nativeformats)));
+ ast_log(LOG_WARNING, "Unable to set read format to %s\n", ast_getformatname(ast_best_codec(p->chan->nativeformats.audio_bits)));
} else {
/* Agent hung-up */
p->chan = NULL;
}
if (!res) {
- ast_set_write_format(p->chan, ast_best_codec(p->chan->nativeformats));
+ ast_set_write_format(p->chan, ast_best_codec(p->chan->nativeformats.audio_bits));
ast_log( LOG_DEBUG, "Set write format, result '%d'\n", res);
if (res)
- ast_log(LOG_WARNING, "Unable to set write format to %s\n", ast_getformatname(ast_best_codec(p->chan->nativeformats)));
+ ast_log(LOG_WARNING, "Unable to set write format to %s\n", ast_getformatname(ast_best_codec(p->chan->nativeformats.audio_bits)));
}
if( !res )
{
@@ -945,7 +945,7 @@
ast_copy_string(tmp->context, p->chan->context, sizeof(tmp->context));
ast_copy_string(tmp->exten, p->chan->exten, sizeof(tmp->exten));
} else {
- tmp->nativeformats = AST_FORMAT_SLINEAR;
+ ast_codec_pref_append(&tmp->nativeformats, AST_FORMAT_SLINEAR);
tmp->writeformat = AST_FORMAT_SLINEAR;
tmp->rawwriteformat = AST_FORMAT_SLINEAR;
tmp->readformat = AST_FORMAT_SLINEAR;
@@ -1272,7 +1272,7 @@
}
/*--- agent_request: Part of the Asterisk PBX interface ---*/
-static struct ast_channel *agent_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *agent_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
struct agent_pvt *p;
struct ast_channel *chan = NULL;
@@ -1336,7 +1336,7 @@
chan = agent_new(p, AST_STATE_DOWN);
} else if (!p->owner && !ast_strlen_zero(p->loginchan)) {
/* Adjustable agent */
- p->chan = ast_request("Local", format, p->loginchan, cause);
+ p->chan = ast_request("Local", formats, p->loginchan, cause);
if (p->chan)
chan = agent_new(p, AST_STATE_DOWN);
}
@@ -1903,14 +1903,14 @@
ast_mutex_lock(&agentlock);
ast_mutex_lock(&p->lock);
if (!res) {
- res = ast_set_read_format(chan, ast_best_codec(chan->nativeformats));
+ res = ast_set_read_format(chan, ast_best_codec(chan->nativeformats.audio_bits));
if (res)
- ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(chan->nativeformats));
+ ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(chan->nativeformats.audio_bits));
}
if (!res) {
- res = ast_set_write_format(chan, ast_best_codec(chan->nativeformats));
+ res = ast_set_write_format(chan, ast_best_codec(chan->nativeformats.audio_bits));
if (res)
- ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(chan->nativeformats));
+ ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(chan->nativeformats.audio_bits));
}
/* Check once more just in case */
if (p->chan)
--- channels/chan_alsa.c.orig Wed Dec 21 22:01:16 2005
+++ channels/chan_alsa.c Mon Oct 9 13:01:08 2006
@@ -785,7 +785,7 @@
snprintf(tmp->name, sizeof(tmp->name), "ALSA/%s", indevname);
tmp->type = type;
tmp->fds[0] = readdev;
- tmp->nativeformats = AST_FORMAT_SLINEAR;
+ ast_codec_pref_set2(&tmp->nativeformats, AST_FORMAT_SLINEAR);
tmp->readformat = AST_FORMAT_SLINEAR;
tmp->writeformat = AST_FORMAT_SLINEAR;
tmp->tech_pvt = p;
--- channels/chan_features.c.orig Wed Aug 30 21:59:44 2006
+++ channels/chan_features.c Mon Oct 9 13:01:08 2006
@@ -94,7 +94,7 @@
#define SUB_CALLWAIT 1 /* Call-Waiting call on hold */
#define SUB_THREEWAY 2 /* Three-way call */
-static struct ast_channel *features_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *features_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int features_digit(struct ast_channel *ast, char digit);
static int features_call(struct ast_channel *ast, char *dest, int timeout);
static int features_hangup(struct ast_channel *ast);
@@ -188,8 +188,8 @@
p->subs[index].owner->timingfd = p->subchan->timingfd;
p->subs[index].owner->alertpipe[0] = p->subchan->alertpipe[0];
p->subs[index].owner->alertpipe[1] = p->subchan->alertpipe[1];
- if (p->subs[index].owner->nativeformats != p->subchan->readformat) {
- p->subs[index].owner->nativeformats = p->subchan->readformat;
+ if (!(ast_codec_pref_bits(&p->subs[index].owner->nativeformats) & p->subchan->readformat)) {
+ ast_codec_pref_append(&p->subs[index].owner->nativeformats, p->subchan->readformat);
if (p->subs[index].owner->readformat)
ast_set_read_format(p->subs[index].owner, p->subs[index].owner->readformat);
if (p->subs[index].owner->writeformat)
@@ -396,7 +396,7 @@
return 0;
}
-static struct feature_pvt *features_alloc(char *data, int format)
+static struct feature_pvt *features_alloc(char *data, const struct ast_codec_pref *formats)
{
struct feature_pvt *tmp;
char *dest=NULL;
@@ -427,7 +427,7 @@
}
ast_mutex_unlock(&featurelock);
if (!tmp) {
- chan = ast_request(tech, format, dest, &status);
+ chan = ast_request(tech, formats, dest, &status);
if (!chan) {
ast_log(LOG_NOTICE, "Unable to allocate subchannel '%s/%s'\n", tech, dest);
return NULL;
@@ -485,7 +485,7 @@
tmp->rawwriteformat = p->subchan->rawwriteformat;
tmp->readformat = p->subchan->readformat;
tmp->rawreadformat = p->subchan->rawreadformat;
- tmp->nativeformats = p->subchan->readformat;
+ ast_codec_pref_append(&tmp->nativeformats, p->subchan->readformat);
tmp->tech_pvt = p;
p->subs[index].owner = tmp;
if (!p->owner)
@@ -498,12 +498,12 @@
}
-static struct ast_channel *features_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *features_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
struct feature_pvt *p;
struct ast_channel *chan = NULL;
- p = features_alloc(data, format);
+ p = features_alloc(data, formats);
if (p && !p->subs[SUB_REAL].owner)
chan = features_new(p, AST_STATE_DOWN, SUB_REAL);
if (chan)
--- channels/chan_h323.c.orig Wed Aug 30 21:59:44 2006
+++ channels/chan_h323.c Mon Oct 9 13:01:08 2006
@@ -193,7 +193,7 @@
static int restart_monitor(void);
static int h323_do_reload(void);
-static struct ast_channel *oh323_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *oh323_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int oh323_digit(struct ast_channel *c, char digit);
static int oh323_call(struct ast_channel *c, char *dest, int timeout);
static int oh323_hangup(struct ast_channel *c);
@@ -226,10 +226,11 @@
/* Channel and private structures should be already locked */
static void __oh323_update_info(struct ast_channel *c, struct oh323_pvt *pvt)
{
- if (c->nativeformats != pvt->nativeformats) {
+ if (ast_codec_pref_bits(&c->nativeformats) != pvt->nativeformats) {
if (h323debug)
ast_log(LOG_DEBUG, "Preparing %s for new native format\n", c->name);
- c->nativeformats = pvt->nativeformats;
+ ast_codec_pref_init(&c->nativeformats);
+ ast_codec_pref_append_missing2(&c->nativeformats, pvt->nativeformats);
ast_set_read_format(c, c->readformat);
ast_set_write_format(c, c->writeformat);
}
@@ -557,15 +558,15 @@
if (pvt->owner) {
/* We already hold the channel lock */
if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass != pvt->owner->nativeformats) {
+ if (!(f->subclass & pvt->owner->nativeformats.audio_bits)) {
/* Try to avoid deadlock */
if (ast_mutex_trylock(&pvt->owner->lock)) {
ast_log(LOG_NOTICE, "Format changed but channel is locked. Ignoring frame...\n");
return &null_frame;
}
ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
- pvt->owner->nativeformats = f->subclass;
- pvt->nativeformats = f->subclass;
+ ast_codec_pref_append(&pvt->owner->nativeformats, f->subclass);
+ pvt->nativeformats |= f->subclass;
ast_set_read_format(pvt->owner, pvt->owner->readformat);
ast_set_write_format(pvt->owner, pvt->owner->writeformat);
ast_mutex_unlock(&pvt->owner->lock);
@@ -610,9 +611,9 @@
return 0;
}
} else {
- if (!(frame->subclass & c->nativeformats)) {
+ if (!(frame->subclass & c->nativeformats.audio_bits)) {
ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
- frame->subclass, c->nativeformats, c->readformat, c->writeformat);
+ frame->subclass, ast_codec_pref_bits(&c->nativeformats), c->readformat, c->writeformat);
return 0;
}
}
@@ -735,12 +736,12 @@
if (ch) {
ch->tech = &oh323_tech;
snprintf(ch->name, sizeof(ch->name), "H323/%s", host);
- ch->nativeformats = pvt->options.capability;
- if (!ch->nativeformats) {
- ch->nativeformats = global_options.capability;
+ ast_codec_pref_append_missing2(&ch->nativeformats, pvt->options.capability);
+ if (!ast_codec_pref_bits(&ch->nativeformats)) {
+ ast_codec_pref_append(&ch->nativeformats, global_options.capability);
}
- pvt->nativeformats = ch->nativeformats;
- fmt = ast_best_codec(ch->nativeformats);
+ pvt->nativeformats = ast_codec_pref_bits(&ch->nativeformats);
+ fmt = ast_best_codec(ch->nativeformats.audio_bits);
ch->type = type;
ch->fds[0] = ast_rtp_fd(pvt->rtp);
if (state == AST_STATE_RING) {
@@ -1006,9 +1007,8 @@
return 0;
}
}
-static struct ast_channel *oh323_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *oh323_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
struct oh323_pvt *pvt;
struct ast_channel *tmpc = NULL;
char *dest = (char *)data;
@@ -1016,18 +1016,12 @@
char *h323id = NULL;
char tmp[256], tmp1[256];
- ast_log(LOG_DEBUG, "type=%s, format=%d, data=%s.\n", type, format, (char *)data);
+ ast_log(LOG_DEBUG, "type=%s, format=%s, data=%s.\n", type, ast_codec_pref_dump(tmp, sizeof(tmp), formats), (char *)data);
pvt = oh323_alloc(0);
if (!pvt) {
ast_log(LOG_WARNING, "Unable to build pvt data for '%s'\n", (char *)data);
return NULL;
}
- oldformat = format;
- format &= ((AST_FORMAT_MAX_AUDIO << 1) - 1);
- if (!format) {
- ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", format);
- return NULL;
- }
strncpy(tmp, dest, sizeof(tmp) - 1);
host = strchr(tmp, '@');
if (host) {
@@ -1163,14 +1157,6 @@
}
/**
- * Definition taken from rtp.c for rtpPayloadType because we need it here.
- */
-struct rtpPayloadType {
- int isAstFormat; /* whether the following code is an AST_FORMAT */
- int code;
-};
-
-/**
* Call-back function passing remote ip/port information from H.323 to asterisk
*
* Returns nothing
@@ -1197,7 +1183,8 @@
rtptype = ast_rtp_lookup_pt(pvt->rtp, pt);
pvt->nativeformats = rtptype.code;
if (pvt->owner && !ast_mutex_trylock(&pvt->owner->lock)) {
- pvt->owner->nativeformats = pvt->nativeformats;
+ ast_codec_pref_init(&pvt->owner->nativeformats);
+ ast_codec_pref_append_missing2(&pvt->owner->nativeformats, pvt->nativeformats);
ast_set_read_format(pvt->owner, pvt->owner->readformat);
ast_set_write_format(pvt->owner, pvt->owner->writeformat);
if (pvt->options.progress_audio)
@@ -2277,7 +2264,7 @@
}
}
-static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
+static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, const struct ast_codec_pref *codecs, int nat_active)
{
/* XXX Deal with Video */
struct oh323_pvt *pvt;
--- channels/chan_iax2.c.orig Wed Sep 6 18:55:20 2006
+++ channels/chan_iax2.c Mon Oct 9 13:01:08 2006
@@ -742,7 +742,7 @@
static int iax2_poke_peer(struct iax2_peer *peer, int heldcall);
static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const char *template, int force);
-static struct ast_channel *iax2_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *iax2_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int iax2_devicestate(void *data);
static int iax2_digit(struct ast_channel *c, char digit);
static int iax2_sendtext(struct ast_channel *c, const char *text);
@@ -1959,7 +1959,7 @@
char iabuf[INET_ADDRSTRLEN];
struct iax2_peer *peer;
char codec_buf[512];
- int x = 0, codec = 0, load_realtime = 0;
+ int load_realtime = 0;
if (argc < 4)
return RESULT_SHOWUSAGE;
@@ -1984,19 +1984,9 @@
ast_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
ast_cli(fd, "%s\n", codec_buf);
- ast_cli(fd, " Codec Order : (");
- for(x = 0; x < 32 ; x++) {
- codec = ast_codec_pref_index(&peer->prefs,x);
- if(!codec)
- break;
- ast_cli(fd, "%s", ast_getformatname(codec));
- if(x < 31 && ast_codec_pref_index(&peer->prefs,x+1))
- ast_cli(fd, "|");
- }
-
- if (!x)
- ast_cli(fd, "none");
- ast_cli(fd, ")\n");
+ ast_cli(fd, " Codec Order : ");
+ ast_codec_pref_dump(codec_buf, sizeof(codec_buf), &peer->prefs);
+ ast_cli(fd, "%s\n", codec_buf);
ast_cli(fd, " Status : ");
peer_status(peer, status, sizeof(status));
@@ -2787,7 +2777,7 @@
memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
sin->sin_port = htons(IAX_DEFAULT_PORTNO);
/* use global iax prefs for unknown peer/user */
- ast_codec_pref_convert(&prefs, cai->prefs, sizeof(cai->prefs), 1);
+ ast_codec_pref_convert_to_buf(&prefs, cai->prefs, sizeof(cai->prefs));
return 0;
} else {
ast_log(LOG_WARNING, "No such host: %s\n", peername);
@@ -2816,7 +2806,7 @@
cai->capability = peer->capability;
cai->encmethods = peer->encmethods;
cai->sockfd = peer->sockfd;
- ast_codec_pref_convert(&peer->prefs, cai->prefs, sizeof(cai->prefs), 1);
+ ast_codec_pref_convert_to_buf(&peer->prefs, cai->prefs, sizeof(cai->prefs));
ast_copy_string(cai->context, peer->context, sizeof(cai->context));
ast_copy_string(cai->peercontext, peer->peercontext, sizeof(cai->peercontext));
ast_copy_string(cai->username, peer->username, sizeof(cai->username));
@@ -3065,7 +3055,7 @@
if (pds.password)
ast_copy_string(iaxs[callno]->secret, pds.password, sizeof(iaxs[callno]->secret));
- iax_ie_append_int(&ied, IAX_IE_FORMAT, c->nativeformats);
+ iax_ie_append_int(&ied, IAX_IE_FORMAT, ast_codec_pref_bits(&c->nativeformats));
iax_ie_append_int(&ied, IAX_IE_CAPABILITY, iaxs[callno]->capability);
iax_ie_append_short(&ied, IAX_IE_ADSICPE, c->adsicpe);
iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime(cai.timezone));
@@ -3236,13 +3226,13 @@
}
return AST_BRIDGE_FAILED_NOWARN;
}
- if (c0->nativeformats != c1->nativeformats) {
+ if (!ast_codec_pref_eq_noorder(&c0->nativeformats, &c1->nativeformats)) {
if (option_verbose > 2) {
char buf0[255];
char buf1[255];
- ast_getformatname_multiple(buf0, sizeof(buf0) -1, c0->nativeformats);
- ast_getformatname_multiple(buf1, sizeof(buf1) -1, c1->nativeformats);
- ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs %d[%s] %d[%s] , can't native bridge...\n", c0->nativeformats, buf0, c1->nativeformats, buf1);
+ ast_codec_pref_dump(buf0, sizeof(buf0), &c0->nativeformats);
+ ast_codec_pref_dump(buf1, sizeof(buf1), &c1->nativeformats);
+ ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs %d[%s] %d[%s] , can't native bridge...\n", ast_codec_pref_bits(&c0->nativeformats), buf0, ast_codec_pref_bits(&c1->nativeformats), buf1);
}
/* Remove from native mode */
lock_both(callno0, callno1);
@@ -3435,7 +3425,7 @@
snprintf(tmp->name, sizeof(tmp->name), "IAX2/%s-%d", i->host, i->callno);
tmp->type = channeltype;
/* We can support any format by default, until we get restricted */
- tmp->nativeformats = capability;
+ ast_codec_pref_set2(&tmp->nativeformats, capability);
tmp->readformat = ast_best_codec(capability);
tmp->writeformat = ast_best_codec(capability);
tmp->tech_pvt = CALLNO_TO_PTR(i->callno);
@@ -4786,8 +4776,8 @@
/* Use provided preferences until told otherwise for actual preferences */
if(ies->codec_prefs) {
- ast_codec_pref_convert(&iaxs[callno]->rprefs, ies->codec_prefs, 32, 0);
- ast_codec_pref_convert(&iaxs[callno]->prefs, ies->codec_prefs, 32, 0);
+ ast_codec_pref_convert_from_buf(&iaxs[callno]->rprefs, ies->codec_prefs, 32);
+ ast_codec_pref_convert_from_buf(&iaxs[callno]->prefs, ies->codec_prefs, 32);
}
if (!gotcapability)
@@ -6785,11 +6775,11 @@
}
if (iaxs[fr->callno]) {
if (iaxs[fr->callno]->owner) {
- orignative = iaxs[fr->callno]->owner->nativeformats;
- iaxs[fr->callno]->owner->nativeformats = f.subclass;
+ orignative = ast_codec_pref_bits(&iaxs[fr->callno]->owner->nativeformats);
+ ast_codec_pref_set2(&iaxs[fr->callno]->owner->nativeformats, f.subclass);
if (iaxs[fr->callno]->owner->readformat)
ast_set_read_format(iaxs[fr->callno]->owner, iaxs[fr->callno]->owner->readformat);
- iaxs[fr->callno]->owner->nativeformats = orignative;
+ ast_codec_pref_set2(&iaxs[fr->callno]->owner->nativeformats, orignative);
ast_mutex_unlock(&iaxs[fr->callno]->owner->lock);
}
} else {
@@ -6934,8 +6924,8 @@
using_prefs = "mine";
/* If the information elements are in here... use them */
if (ies.codec_prefs)
- ast_codec_pref_convert(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32, 0);
- if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0)) {
+ ast_codec_pref_convert_from_buf(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32);
+ if (ast_codec_pref_index_audio(&iaxs[fr->callno]->rprefs, 0)) {
/* If we are codec_first_choice we let the caller have the 1st shot at picking the codec.*/
if (ast_test_flag(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
pref = iaxs[fr->callno]->rprefs;
@@ -6978,7 +6968,7 @@
strcpy(host_pref_buf,"disabled");
} else {
using_prefs = "mine";
- if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0)) {
+ if (ast_codec_pref_index_audio(&iaxs[fr->callno]->rprefs, 0)) {
/* Do the opposite of what we tried above. */
if (ast_test_flag(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
pref = iaxs[fr->callno]->prefs;
@@ -7132,7 +7122,7 @@
iaxs[fr->callno]->peerformat = ies.format;
} else {
if (iaxs[fr->callno]->owner)
- iaxs[fr->callno]->peerformat = iaxs[fr->callno]->owner->nativeformats;
+ iaxs[fr->callno]->peerformat = ast_codec_pref_bits(&iaxs[fr->callno]->owner->nativeformats);
else
iaxs[fr->callno]->peerformat = iaxs[fr->callno]->capability;
}
@@ -7149,9 +7139,11 @@
ast_set_flag(&iaxs[fr->callno]->state, IAX_STATE_STARTED);
if (iaxs[fr->callno]->owner) {
/* Switch us to use a compatible format */
- iaxs[fr->callno]->owner->nativeformats = iaxs[fr->callno]->peerformat;
- if (option_verbose > 2)
- ast_verbose(VERBOSE_PREFIX_3 "Format for call is %s\n", ast_getformatname(iaxs[fr->callno]->owner->nativeformats));
+ ast_codec_pref_set2(&iaxs[fr->callno]->owner->nativeformats, iaxs[fr->callno]->peerformat);
+ if (option_verbose > 2) {
+ char buf[512];
+ ast_verbose(VERBOSE_PREFIX_3 "Format for call is %s\n", ast_codec_pref_dump(buf, sizeof(buf), &iaxs[fr->callno]->owner->nativeformats));
+ }
retryowner2:
if (ast_mutex_trylock(&iaxs[fr->callno]->owner->lock)) {
ast_mutex_unlock(&iaxsl[fr->callno]);
@@ -7340,8 +7332,8 @@
} else {
using_prefs = "mine";
if (ies.codec_prefs)
- ast_codec_pref_convert(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32, 0);
- if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0)) {
+ ast_codec_pref_convert_from_buf(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32);
+ if (ast_codec_pref_index_audio(&iaxs[fr->callno]->rprefs, 0)) {
if (ast_test_flag(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
pref = iaxs[fr->callno]->rprefs;
using_prefs = "caller";
@@ -7386,7 +7378,7 @@
strcpy(host_pref_buf,"disabled");
} else {
using_prefs = "mine";
- if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0)) {
+ if (ast_codec_pref_index_audio(&iaxs[fr->callno]->rprefs, 0)) {
/* Do the opposite of what we tried above. */
if (ast_test_flag(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
pref = iaxs[fr->callno]->prefs;
@@ -7955,11 +7947,9 @@
}
}
-static struct ast_channel *iax2_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *iax2_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
int callno;
- int res;
- int fmt, native;
struct sockaddr_in sin;
struct ast_channel *c;
struct parsed_dial_string pds;
@@ -8013,22 +8003,8 @@
if (c) {
/* Choose a format we can live with */
- if (c->nativeformats & format)
- c->nativeformats &= format;
- else {
- native = c->nativeformats;
- fmt = format;
- res = ast_translator_best_choice(&fmt, &native);
- if (res < 0) {
- ast_log(LOG_WARNING, "Unable to create translator path for %s to %s on %s\n",
- ast_getformatname(c->nativeformats), ast_getformatname(fmt), c->name);
- ast_hangup(c);
- return NULL;
- }
- c->nativeformats = native;
- }
- c->readformat = ast_best_codec(c->nativeformats);
- c->writeformat = c->readformat;
+ ast_codec_pref_remove2(&c->nativeformats, ~ast_codec_pref_bits(formats));
+ c->readformat = c->writeformat = ast_codec_pref_index_audio(&c->nativeformats, 0);
}
return c;
@@ -9390,7 +9366,7 @@
*ptr = '\0';
}
index = atoi(codecnum);
- if((codec = ast_codec_pref_index(&peer->prefs, index))) {
+ if((codec = ast_codec_pref_index_audio(&peer->prefs, index))) {
ast_copy_string(buf, ast_getformatname(codec), len);
}
}
--- channels/chan_local.c.orig Fri Sep 8 07:37:07 2006
+++ channels/chan_local.c Mon Oct 9 13:01:08 2006
@@ -70,7 +70,7 @@
/* Protect the interface list (of sip_pvt's) */
AST_MUTEX_DEFINE_STATIC(locallock);
-static struct ast_channel *local_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *local_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int local_digit(struct ast_channel *ast, char digit);
static int local_call(struct ast_channel *ast, char *dest, int timeout);
static int local_hangup(struct ast_channel *ast);
@@ -468,7 +468,7 @@
}
/*--- local_alloc: Create a call structure */
-static struct local_pvt *local_alloc(char *data, int format)
+static struct local_pvt *local_alloc(char *data, const struct ast_codec_pref *formats)
{
struct local_pvt *tmp;
char *c;
@@ -493,7 +493,7 @@
strncpy(tmp->context, c, sizeof(tmp->context) - 1);
} else
strncpy(tmp->context, "default", sizeof(tmp->context) - 1);
- tmp->reqformat = format;
+ tmp->reqformat = ast_codec_pref_bits(formats);
if (!ast_exists_extension(NULL, tmp->context, tmp->exten, 1, NULL)) {
ast_log(LOG_NOTICE, "No such extension/context %s@%s creating local channel\n", tmp->exten, tmp->context);
ast_mutex_destroy(&tmp->lock);
@@ -529,8 +529,8 @@
}
tmp2->tech = tmp->tech = &local_tech;
- tmp->nativeformats = p->reqformat;
- tmp2->nativeformats = p->reqformat;
+ ast_codec_pref_append_missing2(&tmp->nativeformats, p->reqformat);
+ ast_codec_pref_append_missing2(&tmp2->nativeformats, p->reqformat);
snprintf(tmp->name, sizeof(tmp->name), "Local/%s@%s-%04x,1", p->exten, p->context, randnum);
snprintf(tmp2->name, sizeof(tmp2->name), "Local/%s@%s-%04x,2", p->exten, p->context, randnum);
tmp->type = type;
@@ -566,12 +566,12 @@
/*--- local_request: Part of PBX interface */
-static struct ast_channel *local_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *local_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
struct local_pvt *p;
struct ast_channel *chan = NULL;
- p = local_alloc(data, format);
+ p = local_alloc(data, formats);
if (p)
chan = local_new(p, AST_STATE_DOWN);
return chan;
--- channels/chan_mgcp.c.orig Wed Aug 30 21:59:44 2006
+++ channels/chan_mgcp.c Mon Oct 9 13:01:08 2006
@@ -487,7 +487,7 @@
static int mgcp_do_reload(void);
static int mgcp_reload(int fd, int argc, char *argv[]);
-static struct ast_channel *mgcp_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *mgcp_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int mgcp_call(struct ast_channel *ast, char *dest, int timeout);
static int mgcp_hangup(struct ast_channel *ast);
static int mgcp_answer(struct ast_channel *ast);
@@ -1222,9 +1222,10 @@
if (sub->owner) {
/* We already hold the channel lock */
if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass != sub->owner->nativeformats) {
+ if (f->subclass != sub->owner->nativeformats.audio_bits) {
ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
- sub->owner->nativeformats = f->subclass;
+/* ast_codec_pref_init(&sub->owner->nativeformats);*/
+ ast_codec_pref_append(&sub->owner->nativeformats, f->subclass);
ast_set_read_format(sub->owner, sub->owner->readformat);
ast_set_write_format(sub->owner, sub->owner->writeformat);
}
@@ -1263,9 +1264,9 @@
return 0;
}
} else {
- if (!(frame->subclass & ast->nativeformats)) {
+ if (!(frame->subclass & ast_codec_pref_bits(&ast->nativeformats))) {
ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
- frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
+ frame->subclass, ast_codec_pref_bits(&ast->nativeformats), ast->readformat, ast->writeformat);
return -1;
}
}
@@ -1388,10 +1389,10 @@
tmp = ast_channel_alloc(1);
if (tmp) {
tmp->tech = &mgcp_tech;
- tmp->nativeformats = i->capability;
- if (!tmp->nativeformats)
- tmp->nativeformats = capability;
- fmt = ast_best_codec(tmp->nativeformats);
+ ast_codec_pref_set2(&tmp->nativeformats, i->capability);
+ if (!ast_codec_pref_bits(&tmp->nativeformats))
+ ast_codec_pref_set2(&tmp->nativeformats, capability);
+ fmt = ast_best_codec(tmp->nativeformats.audio_bits);
snprintf(tmp->name, sizeof(tmp->name), "MGCP/%s@%s-%d", i->name, i->parent->name, sub->id);
if (sub->rtp)
tmp->fds[0] = ast_rtp_fd(sub->rtp);
@@ -3477,20 +3478,13 @@
return 0;
}
-static struct ast_channel *mgcp_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *mgcp_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
struct mgcp_subchannel *sub;
struct ast_channel *tmpc = NULL;
char tmp[256];
char *dest = data;
- oldformat = format;
- format &= capability;
- if (!format) {
- ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", format);
- return NULL;
- }
strncpy(tmp, dest, sizeof(tmp) - 1);
if (ast_strlen_zero(tmp)) {
ast_log(LOG_NOTICE, "MGCP Channels require an endpoint\n");
@@ -3920,13 +3914,13 @@
return NULL;
}
-static int mgcp_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
+static int mgcp_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, const struct ast_codec_pref *codecs, int nat_active)
{
/* XXX Is there such thing as video support with MGCP? XXX */
struct mgcp_subchannel *sub;
sub = chan->tech_pvt;
if (sub) {
- transmit_modify_with_sdp(sub, rtp, codecs);
+ transmit_modify_with_sdp(sub, rtp, ast_codec_pref_bits(codecs));
return 0;
}
return -1;
--- channels/chan_modem.c.orig Sat Aug 5 08:08:50 2006
+++ channels/chan_modem.c Mon Oct 9 13:01:08 2006
@@ -114,7 +114,7 @@
int dep_warning = 0;
-static struct ast_channel *modem_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *modem_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause);
static int modem_digit(struct ast_channel *ast, char digit);
static int modem_call(struct ast_channel *ast, char *idest, int timeout);
static int modem_hangup(struct ast_channel *ast);
@@ -566,7 +566,7 @@
snprintf(tmp->name, sizeof(tmp->name), "Modem[%s]/%s", i->mc->name, i->dev + 5);
tmp->type = type;
tmp->fds[0] = i->fd;
- tmp->nativeformats = i->mc->formats;
+ ast_codec_pref_append_missing2(&tmp->nativeformats, i->mc->formats);
ast_setstate(tmp, state);
if (state == AST_STATE_RING)
tmp->rings = 1;
@@ -814,9 +814,8 @@
return tmp;
}
-static struct ast_channel *modem_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *modem_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
struct ast_modem_pvt *p;
struct ast_channel *tmp = NULL;
char dev[80];
@@ -826,7 +825,6 @@
strncpy(dev, (char *)data, sizeof(dev)-1);
stringp=dev;
strsep(&stringp, ":");
- oldformat = format;
if (!dep_warning) {
ast_log(LOG_WARNING, "This channel driver is deprecated. Please see the UPGRADE.txt file.\n");
@@ -853,7 +851,7 @@
/* if it belongs to the proper group, and the format matches
* and it is not in use, we found a candidate! */
if (p->group & group &&
- p->mc->formats & format &&
+ p->mc->formats & formats->bits &&
!p->owner) {
/* XXX Not quite sure that not having an owner is
* sufficient evidence of beeing a free device XXX */
@@ -863,7 +861,7 @@
}
} else {
if (!strcmp(dev, p->dev + 5)) {
- if (p->mc->formats & format) {
+ if (p->mc->formats & formats->bits) {
if (!p->owner) {
tmp = ast_modem_new(p, AST_STATE_DOWN);
restart_monitor();
@@ -871,7 +869,7 @@
} else
ast_log(LOG_WARNING, "Device '%s' is busy\n", p->dev);
} else
- ast_log(LOG_WARNING, "Asked for a format %s line on %s\n", ast_getformatname(format), p->dev);
+ ast_log(LOG_WARNING, "Asked for a format %s line on %s\n", ast_getformatname(formats->bits), p->dev);
break;
}
}
--- channels/chan_oss.c.orig Wed Jul 5 18:31:01 2006
+++ channels/chan_oss.c Mon Oct 9 13:01:08 2006
@@ -315,7 +315,7 @@
static int setformat(struct chan_oss_pvt *o, int mode);
-static struct ast_channel *oss_request(const char *type, int format, void *data
+static struct ast_channel *oss_request(const char *type, const struct ast_codec_pref *formats, void *data
, int *cause);
static int oss_digit(struct ast_channel *c, char digit);
static int oss_text(struct ast_channel *c, const char *text);
@@ -881,7 +881,7 @@
snprintf(c->name, sizeof(c->name), "OSS/%s", o->device + 5);
c->type = o->type;
c->fds[0] = o->sounddev; /* -1 if device closed, override later */
- c->nativeformats = AST_FORMAT_SLINEAR;
+ ast_codec_pref_append(&c->nativeformats, AST_FORMAT_SLINEAR);
c->readformat = AST_FORMAT_SLINEAR;
c->writeformat = AST_FORMAT_SLINEAR;
c->tech_pvt = o;
@@ -912,7 +912,7 @@
}
static struct ast_channel *oss_request(const char *type,
- int format, void *data, int *cause)
+ const struct ast_codec_pref *formats, void *data, int *cause)
{
struct ast_channel *c;
struct chan_oss_pvt *o = find_desc(data);
@@ -922,10 +922,6 @@
if (o == NULL) {
ast_log(LOG_NOTICE, "Device %s not found\n", (char *)data);
/* XXX we could default to 'dsp' perhaps ? */
- return NULL;
- }
- if ((format & AST_FORMAT_SLINEAR) == 0) {
- ast_log(LOG_NOTICE, "Format 0x%x unsupported\n", format);
return NULL;
}
if (o->owner) {
--- channels/chan_phone.c.orig Wed Aug 30 21:59:44 2006
+++ channels/chan_phone.c Mon Oct 9 13:01:08 2006
@@ -148,7 +148,7 @@
static char cid_num[AST_MAX_EXTENSION];
static char cid_name[AST_MAX_EXTENSION];
-static struct ast_channel *phone_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *phone_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause);
static int phone_digit(struct ast_channel *ast, char digit);
static int phone_call(struct ast_channel *ast, char *dest, int timeout);
static int phone_hangup(struct ast_channel *ast);
@@ -797,20 +797,20 @@
/* XXX Switching formats silently causes kernel panics XXX */
if (i->mode == MODE_FXS &&
ioctl(i->fd, PHONE_QUERY_CODEC, &codec) == 0) {
- if (codec.type == LINEAR16)
- tmp->nativeformats =
+ if (codec.type == LINEAR16) {
+ ast_codec_pref_append(&tmp->nativeformats, AST_FORMAT_SLINEAR);
tmp->rawreadformat =
tmp->rawwriteformat =
AST_FORMAT_SLINEAR;
- else {
- tmp->nativeformats =
+ } else {
+ ast_codec_pref_append_missing2(&tmp->nativeformats, prefformat & ~AST_FORMAT_SLINEAR);
tmp->rawreadformat =
tmp->rawwriteformat =
prefformat & ~AST_FORMAT_SLINEAR;
}
}
else {
- tmp->nativeformats = prefformat;
+ ast_codec_pref_append_missing2(&tmp->nativeformats, prefformat);
tmp->rawreadformat = prefformat;
tmp->rawwriteformat = prefformat;
}
@@ -1171,9 +1171,8 @@
return tmp;
}
-static struct ast_channel *phone_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *phone_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
struct phone_pvt *p;
struct ast_channel *tmp = NULL;
char *name = data;
@@ -1186,7 +1185,7 @@
p = iflist;
while(p) {
if (p->mode == MODE_FXS ||
- format & (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) {
+ formats->audio_bits & (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) {
size_t length = strlen(p->dev + 5);
if (strncmp(name, p->dev + 5, length) == 0 &&
!isalnum(name[length])) {
@@ -1201,14 +1200,6 @@
}
ast_mutex_unlock(&iflock);
restart_monitor();
- if (tmp == NULL) {
- oldformat = format;
- format &= (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW);
- if (!format) {
- ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", oldformat);
- return NULL;
- }
- }
return tmp;
}
--- channels/chan_sip.c.orig Mon Mar 19 22:20:26 2007
+++ channels/chan_sip.c Tue Mar 20 22:19:38 2007
@@ -447,7 +447,7 @@
#define DEC_CALL_LIMIT 0
#define INC_CALL_LIMIT 1
-static struct ast_codec_pref prefs;
+static struct ast_codec_pref global_prefs;
/*! \brief sip_request: The data grabbed from the UDP socket */
@@ -596,7 +596,9 @@
int method; /*!< SIP method of this packet */
char callid[128]; /*!< Global CallID */
char randdata[80]; /*!< Random data */
- struct ast_codec_pref prefs; /*!< codec prefs */
+ struct ast_codec_pref userprefs; /*!< codec prefs */
+ int usercapability; /*!< user capabilities */
+ struct ast_codec_pref formats; /*!< current channel formats */
unsigned int ocseq; /*!< Current outgoing seqno */
unsigned int icseq; /*!< Current incoming seqno */
ast_group_t callgroup; /*!< Call group */
@@ -605,10 +607,6 @@
unsigned int flags; /*!< SIP_ flags */
int timer_t1; /*!< SIP timer T1, ms rtt */
unsigned int sipoptions; /*!< Supported SIP sipoptions on the other end */
- int capability; /*!< Special capability (codec) */
- int jointcapability; /*!< Supported capability at both ends (codecs ) */
- int peercapability; /*!< Supported peer capability */
- int prefcodec; /*!< Preferred codec (outbound only) */
int noncodeccapability;
int jointnoncodeccapability;
int callingpres; /*!< Calling presentation */
@@ -621,7 +619,7 @@
struct sockaddr_in sa; /*!< Our peer */
struct sockaddr_in redirip; /*!< Where our RTP should be going if not to us */
struct sockaddr_in vredirip; /*!< Where our Video RTP should be going if not to us */
- int redircodecs; /*!< Redirect codecs */
+ struct ast_codec_pref redircodecs; /*!< Redirect codecs */
struct sockaddr_in recv; /*!< Received as */
struct in_addr ourip; /*!< Our IP */
struct ast_channel *owner; /*!< Who owns us */
@@ -911,7 +909,7 @@
static int expire_register(void *data);
static int callevents = 0;
-static struct ast_channel *sip_request_call(const char *type, int format, void *data, int *cause);
+static struct ast_channel *sip_request_call(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int sip_devicestate(void *data);
static int sip_sendtext(struct ast_channel *ast, const char *text);
static int sip_call(struct ast_channel *ast, char *dest, int timeout);
@@ -929,6 +927,7 @@
static int check_sip_domain(const char *domain, char *context, size_t len); /* Check if domain is one of our local domains */
static void append_date(struct sip_request *req); /* Append date to SIP packet */
static int determine_firstline_parts(struct sip_request *req);
+static void sip_fixup_codecs(struct ast_channel *chan, const struct ast_codec_pref *peer_codecs);
static void sip_dump_history(struct sip_pvt *dialog); /* Dump history to LOG_DEBUG at end of dialog, before destroying data */
static const struct cfsubscription_types *find_subscription_type(enum subscriptiontype subtype);
static int transmit_state_notify(struct sip_pvt *p, int state, int full, int substate, int timeout);
@@ -938,7 +937,7 @@
static const struct ast_channel_tech sip_tech = {
.type = channeltype,
.description = "Session Initiation Protocol (SIP)",
- .capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1),
+ .capabilities = ((AST_FORMAT_MAX_VIDEO << 1) - 1),
.properties = AST_CHAN_TP_WANTSJITTER,
.requester = sip_request_call,
.devicestate = sip_devicestate,
@@ -954,6 +953,7 @@
.send_digit = sip_senddigit,
.bridge = ast_rtp_bridge,
.send_text = sip_sendtext,
+ .fixup_codecs = sip_fixup_codecs,
};
#ifdef __AST_DEBUG_MALLOC
@@ -1884,8 +1884,7 @@
}
ast_copy_flags(r, peer, SIP_FLAGS_TO_COPY);
- r->capability = peer->capability;
- r->prefs = peer->prefs;
+ r->userprefs = peer->prefs;
if (r->rtp) {
ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
ast_rtp_setnat(r->rtp, (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
@@ -2084,8 +2083,25 @@
ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
res = update_call_counter(p, INC_CALL_LIMIT);
if ( res != -1 ) {
+ int x;
+ int codec_index = 0;
+ int codec_pt_order[256];
+
p->callingpres = ast->cid.cid_pres;
- p->jointcapability = p->capability;
+ ast_codec_pref_init(&p->formats);
+ ast_rtp_offered_from_local(p->rtp, 0);
+ if (p->vrtp)
+ ast_rtp_offered_from_local(p->vrtp, 0);
+ for (x = 0; x < codec_index; ++x) {
+ struct rtpPayloadType pt;
+ pt = ast_rtp_lookup_pt(p->rtp, codec_pt_order[x]);
+ if (!pt.isAstFormat && !pt.code && p->vrtp)
+ pt = ast_rtp_lookup_pt(p->vrtp, codec_pt_order[x]);
+ if (pt.isAstFormat) {
+ ast_codec_pref_append(&p->formats, pt.code);
+ }
+ }
+ ast_codec_pref_remove2(&p->formats, ~p->usercapability);
p->jointnoncodeccapability = p->noncodeccapability;
transmit_invite(p, SIP_INVITE, 1, 2);
if (p->maxtime) {
@@ -2541,12 +2557,18 @@
fmt = ast_getformatbyname(codec);
if (fmt) {
- ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
- if (p->jointcapability & fmt) {
- p->jointcapability &= fmt;
- p->capability &= fmt;
+ if (fmt & p->usercapability)
+ {
+ ast_log(LOG_NOTICE, "Changing codec to '%s' for this call because of ${SIP_CODEC) variable\n",codec);
+ if (ast_codec_pref_bits(&p->formats) & fmt) {
+ ast_codec_pref_set2(&p->formats, fmt);
+ if (p->owner) {
+ memcpy(&p->owner->nativeformats, &p->formats, sizeof(p->formats));
+ }
+ } else
+ ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because it is not shared by both ends.\n");
} else
- ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because it is not shared by both ends.\n");
+ ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because codec %s is disallowed by user preferences.\n", codec);
} else
ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n",codec);
return;
@@ -2582,9 +2604,9 @@
int res = 0;
switch (frame->frametype) {
case AST_FRAME_VOICE:
- if (!(frame->subclass & ast->nativeformats)) {
+ if (!(frame->subclass & ast->nativeformats.audio_bits)) {
ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
- frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
+ frame->subclass, ast->nativeformats.audio_bits, ast->readformat, ast->writeformat);
return 0;
}
if (p) {
@@ -2592,6 +2614,9 @@
if (p->rtp) {
/* If channel is not up, activate early media session */
if ((ast->_state != AST_STATE_UP) && !ast_test_flag(p, SIP_PROGRESS_SENT) && !ast_test_flag(p, SIP_OUTGOING)) {
+ int compatible_codecs = ast_compatible_audio_formats(frame->subclass) | ast->nativeformats.video_bits;
+ ast_codec_pref_remove2(&ast->nativeformats, ~compatible_codecs);
+ ast_codec_pref_remove2(&p->formats, ~compatible_codecs);
transmit_response_with_sdp(p, "183 Session Progress", &p->initreq, 0);
ast_set_flag(p, SIP_PROGRESS_SENT);
}
@@ -2775,7 +2800,29 @@
return res;
}
-
+/*--- sip_fixup_codecs: try to fixup codec list
+*/
+static void sip_fixup_codecs(struct ast_channel *chan, const struct ast_codec_pref *peer_codecs)
+{
+ struct sip_pvt *p = chan->tech_pvt;
+ int codecs_to_preserve;
+ ast_mutex_lock(&p->lock);
+ if (!ast_test_flag(p, SIP_OUTGOING)) {
+ /* This is incoming call so its codec list is to be reordered */
+ codecs_to_preserve = ast_codec_pref_bits(&chan->nativeformats);
+ memcpy(&chan->nativeformats, peer_codecs, sizeof(chan->nativeformats));
+ }
+ else {
+ codecs_to_preserve = ast_codec_pref_bits(peer_codecs);
+ }
+ ast_codec_pref_remove2(&chan->nativeformats, ~codecs_to_preserve);
+ memcpy(&p->formats, &chan->nativeformats, sizeof(chan->nativeformats));
+ ast_codec_pref_remove2(&p->formats, ~p->usercapability);
+ if (AST_STATE_UP == chan->_state) {
+ transmit_reinvite_with_sdp(p);
+ }
+ ast_mutex_unlock(&p->lock);
+}
/*! \brief sip_new: Initiate a call in the SIP channel */
/* called from sip_request_call (calls from the pbx ) */
@@ -2800,13 +2847,10 @@
tmp->tech = &sip_tech;
/* Select our native format based on codec preference until we receive
something from another device to the contrary. */
- if (i->jointcapability)
- tmp->nativeformats = ast_codec_choose(&i->prefs, i->jointcapability, 1);
- else if (i->capability)
- tmp->nativeformats = ast_codec_choose(&i->prefs, i->capability, 1);
- else
- tmp->nativeformats = ast_codec_choose(&i->prefs, global_capability, 1);
- fmt = ast_best_codec(tmp->nativeformats);
+ memcpy(&tmp->nativeformats, &i->formats, sizeof(i->formats));
+
+ ast_codec_pref_remove2(&tmp->nativeformats, ~i->usercapability);
+ fmt = ast_codec_pref_index_audio(&tmp->nativeformats, 0);
pbx_builtin_setvar_helper(tmp, "SIP_CODEC_USED", ast_getformatname(fmt));
@@ -3045,14 +3089,14 @@
if (p->owner) {
/* We already hold the channel lock */
if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass != p->owner->nativeformats) {
- if (!(f->subclass & p->jointcapability)) {
+ if (!(f->subclass & p->owner->nativeformats.audio_bits)) {
+ if (!(f->subclass & ast_codec_pref_bits(&p->formats))) {
ast_log(LOG_DEBUG, "Bogus frame of format '%s' received from '%s'!\n",
ast_getformatname(f->subclass), p->owner->name);
return &null_frame;
}
ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
- p->owner->nativeformats = f->subclass;
+ ast_codec_pref_append(&p->owner->nativeformats, f->subclass);
ast_set_read_format(p->owner, p->owner->readformat);
ast_set_write_format(p->owner, p->owner->writeformat);
}
@@ -3118,7 +3162,8 @@
p->autokillid = -1;
p->subscribed = NONE;
p->stateid = -1;
- p->prefs = prefs;
+ p->userprefs = global_prefs;
+ p->usercapability = global_capability;
if (intended_method != SIP_OPTIONS) /* Peerpoke has it's own system */
p->timer_t1 = 500; /* Default SIP retransmission timer T1 (RFC 3261) */
#ifdef OSP_SUPPORT
@@ -3180,7 +3225,6 @@
ast_copy_flags(p, &global_flags, SIP_FLAGS_TO_COPY);
/* Assign default music on hold class */
strcpy(p->musicclass, global_musicclass);
- p->capability = global_capability;
if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
p->noncodeccapability |= AST_RTP_DTMF;
strcpy(p->context, default_context);
@@ -3584,6 +3628,8 @@
int x,y;
int debug=sip_debug_test_pvt(p);
struct ast_channel *bridgepeer = NULL;
+ int codec_index = 0;
+ int codec_pt_order[256];
if (!p->rtp) {
ast_log(LOG_ERROR, "Got SDP but have no RTP session allocated.\n");
@@ -3613,6 +3659,12 @@
}
sdpLineNum_iterator_init(&iterator, req);
ast_set_flag(p, SIP_NOVIDEO);
+ /*
+ * We have to scan m= line first, remember codec order then scan a= lines
+ * and only then build prefs. This is because there is no way to identify dynamic
+ * payload types before processing a= lines. At the same time we cannot rely
+ * on a= lines completely since UA may omit them for static payloads.
+ */
while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
int found = 0;
if ((sscanf(m, "audio %d/%d RTP/AVP %n", &x, &y, &len) == 2) ||
@@ -3630,6 +3682,7 @@
if (debug)
ast_verbose("Found RTP audio format %d\n", codec);
ast_rtp_set_m_type(p->rtp, codec);
+ codec_pt_order[codec_index++] = codec;
codecs = ast_skip_blanks(codecs + len);
}
}
@@ -3650,6 +3703,7 @@
if (debug)
ast_verbose("Found RTP video format %d\n", codec);
ast_rtp_set_m_type(p->vrtp, codec);
+ codec_pt_order[codec_index++] = codec;
codecs = ast_skip_blanks(codecs + len);
}
}
@@ -3730,6 +3784,20 @@
if (p->vrtp)
ast_rtp_set_rtpmap_type(p->vrtp, codec, "video", mimeSubtype);
}
+ ast_codec_pref_init(&p->formats);
+ ast_rtp_offered_from_local(p->rtp, 0);
+ if (p->vrtp)
+ ast_rtp_offered_from_local(p->vrtp, 0);
+ for (x = 0; x < codec_index; ++x) {
+ struct rtpPayloadType pt;
+ pt = ast_rtp_lookup_pt(p->rtp, codec_pt_order[x]);
+ if (!pt.isAstFormat && !pt.code && p->vrtp)
+ pt = ast_rtp_lookup_pt(p->vrtp, codec_pt_order[x]);
+ if (pt.isAstFormat) {
+ ast_codec_pref_append(&p->formats, pt.code);
+ }
+ }
+ ast_codec_pref_remove2(&p->formats, ~p->usercapability);
/* Now gather all of the codecs that were asked for: */
ast_rtp_get_current_formats(p->rtp,
@@ -3737,8 +3805,6 @@
if (p->vrtp)
ast_rtp_get_current_formats(p->vrtp,
&vpeercapability, &vpeernoncodeccapability);
- p->jointcapability = p->capability & (peercapability | vpeercapability);
- p->peercapability = (peercapability | vpeercapability);
p->jointnoncodeccapability = p->noncodeccapability & peernoncodeccapability;
if (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO) {
@@ -3757,17 +3823,17 @@
char s1[slen], s2[slen], s3[slen], s4[slen];
ast_verbose("Capabilities: us - %s, peer - audio=%s/video=%s, combined - %s\n",
- ast_getformatname_multiple(s1, slen, p->capability),
+ ast_getformatname_multiple(s1, slen, p->usercapability),
ast_getformatname_multiple(s2, slen, peercapability),
ast_getformatname_multiple(s3, slen, vpeercapability),
- ast_getformatname_multiple(s4, slen, p->jointcapability));
+ ast_codec_pref_dump(s4, slen, &p->formats));
ast_verbose("Non-codec capabilities: us - %s, peer - %s, combined - %s\n",
ast_rtp_lookup_mime_multiple(s1, slen, p->noncodeccapability, 0),
ast_rtp_lookup_mime_multiple(s2, slen, peernoncodeccapability, 0),
ast_rtp_lookup_mime_multiple(s3, slen, p->jointnoncodeccapability, 0));
}
- if (!p->jointcapability) {
+ if (!ast_codec_pref_bits(&p->formats)) {
ast_log(LOG_NOTICE, "No compatible codecs!\n");
return -1;
}
@@ -3775,16 +3841,7 @@
if (!p->owner) /* There's no open channel owning us */
return 0;
- if (!(p->owner->nativeformats & p->jointcapability)) {
- const unsigned slen=512;
- char s1[slen], s2[slen];
- ast_log(LOG_DEBUG, "Oooh, we need to change our formats since our peer supports only %s and not %s\n",
- ast_getformatname_multiple(s1, slen, p->jointcapability),
- ast_getformatname_multiple(s2, slen, p->owner->nativeformats));
- p->owner->nativeformats = ast_codec_choose(&p->prefs, p->jointcapability, 1);
- ast_set_read_format(p->owner, p->owner->readformat);
- ast_set_write_format(p->owner, p->owner->writeformat);
- }
+ memcpy(&p->owner->nativeformats, &p->formats, sizeof(p->formats));
if ((bridgepeer=ast_bridged_channel(p->owner))) {
/* We have a bridge */
/* Turn on/off music on hold if we are holding/unholding */
@@ -4481,8 +4538,10 @@
if (debug)
ast_verbose("Adding codec 0x%x (%s) to SDP\n", codec, ast_getformatname(codec));
- if ((rtp_code = ast_rtp_lookup_code(p->rtp, 1, codec)) == -1)
- return;
+ if ((rtp_code = ast_rtp_lookup_code(p->rtp, 1, codec)) == -1) {
+ if (!p->vrtp || (rtp_code = ast_rtp_lookup_code(p->vrtp, 1, codec)) == -1)
+ return;
+ }
ast_build_string(m_buf, m_size, " %d", rtp_code);
ast_build_string(a_buf, a_size, "a=rtpmap:%d %s/%d\r\n", rtp_code,
@@ -4540,7 +4599,7 @@
size_t a_video_left = sizeof(a_video);
char iabuf[INET_ADDRSTRLEN];
int x;
- int capability;
+ const struct ast_codec_pref *capability;
struct sockaddr_in dest;
struct sockaddr_in vdest = { 0, };
int debug;
@@ -4552,7 +4611,7 @@
ast_log(LOG_WARNING, "No way to add SDP without an RTP structure\n");
return -1;
}
- capability = p->jointcapability;
+ capability = &p->formats;
if (!p->sessionid) {
p->sessionid = getpid();
@@ -4565,14 +4624,21 @@
if (p->redirip.sin_addr.s_addr) {
dest.sin_port = p->redirip.sin_port;
- dest.sin_addr = p->redirip.sin_addr;
- if (p->redircodecs)
- capability = p->redircodecs;
+ if (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE) {
+ dest.sin_port = sin.sin_port;
+ dest.sin_addr = p->ourip;
+ } else {
+ dest.sin_port = p->redirip.sin_port;
+ dest.sin_addr = p->redirip.sin_addr;
+ }
+ if (ast_codec_pref_bits(&p->redircodecs)) {
+ /* We are to get all compatible with redircodecs codecs */
+ capability = &p->redircodecs;
+ }
} else {
dest.sin_addr = p->ourip;
dest.sin_port = sin.sin_port;
}
-
/* Determine video destination */
if (p->vrtp) {
if (p->vredirip.sin_addr.s_addr) {
@@ -4602,62 +4668,78 @@
ast_build_string(&m_video_next, &m_video_left, "m=video %d RTP/AVP", ntohs(vdest.sin_port));
/* Prefer the codec we were requested to use, first, no matter what */
- if (capability & p->prefcodec) {
- if (p->prefcodec <= AST_FORMAT_MAX_AUDIO)
- add_codec_to_sdp(p, p->prefcodec, 8000,
- &m_audio_next, &m_audio_left,
- &a_audio_next, &a_audio_left,
- debug);
- else
- add_codec_to_sdp(p, p->prefcodec, 90000,
- &m_video_next, &m_video_left,
- &a_video_next, &a_video_left,
- debug);
- alreadysent |= p->prefcodec;
+ pref_codec = ast_codec_pref_index_audio(capability, 0);
+ if (pref_codec) {
+ add_codec_to_sdp(p, pref_codec, 8000,
+ &m_audio_next, &m_audio_left,
+ &a_audio_next, &a_audio_left,
+ debug);
+ alreadysent |= pref_codec;
+ }
+ pref_codec = ast_codec_pref_index_video(capability, 0);
+ if (pref_codec) {
+ add_codec_to_sdp(p, pref_codec, 90000,
+ &m_video_next, &m_video_left,
+ &a_video_next, &a_video_left,
+ debug);
+ alreadysent |= pref_codec;
}
/* Start by sending our preferred codecs */
for (x = 0; x < 32; x++) {
- if (!(pref_codec = ast_codec_pref_index(&p->prefs, x)))
+ if (!(pref_codec = ast_codec_pref_index_audio(&p->userprefs, x)))
break;
- if (!(capability & pref_codec))
+ if (!(capability->audio_bits & pref_codec) ||
+ (alreadysent & pref_codec))
+ {
continue;
+ }
+ add_codec_to_sdp(p, pref_codec, 8000,
+ &m_audio_next, &m_audio_left,
+ &a_audio_next, &a_audio_left,
+ debug);
+ alreadysent |= pref_codec;
+ }
+ for (x = 0; x < 32; x++) {
+ if (!(pref_codec = ast_codec_pref_index_video(&p->userprefs, x)))
+ break;
- if (alreadysent & pref_codec)
+ if (!(capability->video_bits & pref_codec) ||
+ (alreadysent & pref_codec))
+ {
continue;
-
- if (pref_codec <= AST_FORMAT_MAX_AUDIO)
- add_codec_to_sdp(p, pref_codec, 8000,
- &m_audio_next, &m_audio_left,
- &a_audio_next, &a_audio_left,
- debug);
- else
- add_codec_to_sdp(p, pref_codec, 90000,
- &m_video_next, &m_video_left,
- &a_video_next, &a_video_left,
- debug);
+ }
+ add_codec_to_sdp(p, pref_codec, 90000,
+ &m_video_next, &m_video_left,
+ &a_video_next, &a_video_left,
+ debug);
alreadysent |= pref_codec;
}
-
/* Now send any other common codecs, and non-codec formats: */
- for (x = 1; x <= ((videosupport && p->vrtp) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO); x <<= 1) {
- if (!(capability & x))
+ for (x = 0 ; x < 32 ; x++) {
+ if(!(pref_codec = ast_codec_pref_index_audio(capability, x)))
+ break;
+ if (alreadysent & pref_codec)
continue;
- if (alreadysent & x)
+ add_codec_to_sdp(p, pref_codec, 8000,
+ &m_audio_next, &m_audio_left,
+ &a_audio_next, &a_audio_left,
+ debug);
+ alreadysent |= pref_codec;
+ }
+ for (x = 0 ; x < 32 ; x++) {
+ if(!(pref_codec = ast_codec_pref_index_video(capability, x)))
+ break;
+ if (alreadysent & pref_codec)
continue;
- if (x <= AST_FORMAT_MAX_AUDIO)
- add_codec_to_sdp(p, x, 8000,
- &m_audio_next, &m_audio_left,
- &a_audio_next, &a_audio_left,
- debug);
- else
- add_codec_to_sdp(p, x, 90000,
- &m_video_next, &m_video_left,
- &a_video_next, &a_video_left,
- debug);
+ add_codec_to_sdp(p, pref_codec, 90000,
+ &m_video_next, &m_video_left,
+ &a_video_next, &a_video_left,
+ debug);
+ alreadysent |= pref_codec;
}
for (x = 1; x <= AST_RTP_MAX; x <<= 1) {
@@ -4679,7 +4761,7 @@
ast_build_string(&m_video_next, &m_video_left, "\r\n");
len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m_audio) + strlen(a_audio);
- if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+ if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && capability->video_bits) /* only if video response is appropriate */
len += strlen(m_video) + strlen(a_video);
add_header(resp, "Content-Type", "application/sdp");
@@ -4691,7 +4773,7 @@
add_line(resp, t);
add_line(resp, m_audio);
add_line(resp, a_audio);
- if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && (capability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
+ if ((p->vrtp) && (!ast_test_flag(p, SIP_NOVIDEO)) && capability->video_bits) { /* only if video response is appropriate */
add_line(resp, m_video);
add_line(resp, a_video);
}
@@ -4729,7 +4811,6 @@
}
respprep(&resp, p, msg, req);
if (p->rtp) {
- ast_rtp_offered_from_local(p->rtp, 0);
try_suggested_sip_codec(p);
add_sdp(&resp, p);
} else {
@@ -4804,7 +4885,6 @@
add_header(&req, "Allow", ALLOWED_METHODS);
if (sipdebug)
add_header(&req, "X-asterisk-info", "SIP re-invite (RTP bridge)");
- ast_rtp_offered_from_local(p->rtp, 1);
add_sdp(&req, p);
/* Use this as the basis */
copy_request(&p->initreq, &req);
@@ -5146,7 +5226,6 @@
}
}
if (sdp && p->rtp) {
- ast_rtp_offered_from_local(p->rtp, 1);
add_sdp(&req, p);
} else {
add_header_contentLength(&req, 0);
@@ -7283,7 +7362,8 @@
p->chanvars = tmpvar;
}
}
- p->prefs = user->prefs;
+ p->usercapability = user->capability;
+ p->userprefs = user->prefs;
/* replace callerid if rpid found, and not restricted */
if (!ast_strlen_zero(rpid_num) && ast_test_flag(p, SIP_TRUSTRPID)) {
if (*calleridname)
@@ -7331,10 +7411,7 @@
p->pickupgroup = user->pickupgroup;
if (user->callingpres)
p->callingpres = user->callingpres;
- p->capability = user->capability;
- p->jointcapability = user->capability;
- if (p->peercapability)
- p->jointcapability &= p->peercapability;
+ ast_codec_pref_remove2(&p->formats, ~user->capability);
if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
p->noncodeccapability |= AST_RTP_DTMF;
else
@@ -7439,11 +7516,8 @@
p->amaflags = peer->amaflags;
p->callgroup = peer->callgroup;
p->pickupgroup = peer->pickupgroup;
- p->capability = peer->capability;
- p->prefs = peer->prefs;
- p->jointcapability = peer->capability;
- if (p->peercapability)
- p->jointcapability &= p->peercapability;
+ ast_codec_pref_remove2(&p->formats, ~peer->capability);
+ p->userprefs = peer->prefs;
if ((ast_test_flag(p, SIP_DTMF) == SIP_DTMF_RFC2833) || (ast_test_flag(p, SIP_DTMF) == SIP_DTMF_AUTO))
p->noncodeccapability |= AST_RTP_DTMF;
else
@@ -8052,18 +8126,9 @@
/*! \brief print_codec_to_cli: Print codec list from preference to CLI/manager */
static void print_codec_to_cli(int fd, struct ast_codec_pref *pref)
{
- int x, codec;
-
- for(x = 0; x < 32 ; x++) {
- codec = ast_codec_pref_index(pref, x);
- if (!codec)
- break;
- ast_cli(fd, "%s", ast_getformatname(codec));
- if (x < 31 && ast_codec_pref_index(pref, x + 1))
- ast_cli(fd, ",");
- }
- if (!x)
- ast_cli(fd, "none");
+ char buf[512];
+ ast_codec_pref_dump(buf, sizeof(buf), pref);
+ ast_cli(fd, "%s", buf);
}
static const char *domain_mode_to_text(const enum domain_mode mode)
@@ -8230,10 +8295,9 @@
ast_cli(fd, " Codecs : ");
ast_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
ast_cli(fd, "%s\n", codec_buf);
- ast_cli(fd, " Codec Order : (");
+ ast_cli(fd, " Codec Order : ");
print_codec_to_cli(fd, &peer->prefs);
-
- ast_cli(fd, ")\n");
+ ast_cli(fd, "\n");
ast_cli(fd, " Status : ");
peer_status(peer, status, sizeof(status));
@@ -8293,11 +8357,19 @@
ast_cli(fd, "CodecOrder: ");
pref = &peer->prefs;
for(x = 0; x < 32 ; x++) {
- codec = ast_codec_pref_index(pref,x);
+ codec = ast_codec_pref_index_audio(pref,x);
+ if (!codec)
+ break;
+ ast_cli(fd, "%s", ast_getformatname(codec));
+ if (x < 31 && ast_codec_pref_index_audio(pref,x+1))
+ ast_cli(fd, ",");
+ }
+ for(x = 0; x < 32 ; x++) {
+ codec = ast_codec_pref_index_video(pref,x);
if (!codec)
break;
ast_cli(fd, "%s", ast_getformatname(codec));
- if (x < 31 && ast_codec_pref_index(pref,x+1))
+ if (x < 31 && ast_codec_pref_index_video(pref,x+1))
ast_cli(fd, ",");
}
@@ -8329,9 +8401,8 @@
{
char cbuf[256];
struct sip_user *user;
- struct ast_codec_pref *pref;
struct ast_variable *v;
- int x = 0, codec = 0, load_realtime = 0;
+ int load_realtime = 0;
if (argc < 4)
return RESULT_SHOWUSAGE;
@@ -8358,20 +8429,9 @@
print_group(fd, user->pickupgroup, 0);
ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), user->cid_name, user->cid_num, "<unspecified>"));
ast_cli(fd, " ACL : %s\n", (user->ha?"Yes":"No"));
- ast_cli(fd, " Codec Order : (");
- pref = &user->prefs;
- for(x = 0; x < 32 ; x++) {
- codec = ast_codec_pref_index(pref,x);
- if (!codec)
- break;
- ast_cli(fd, "%s", ast_getformatname(codec));
- if (x < 31 && ast_codec_pref_index(pref,x+1))
- ast_cli(fd, "|");
- }
-
- if (!x)
- ast_cli(fd, "none");
- ast_cli(fd, ")\n");
+ ast_cli(fd, " Codec Order : ");
+ print_codec_to_cli(fd, &user->prefs);
+ ast_cli(fd, "\n");
if (user->chanvars) {
ast_cli(fd, " Variables :\n");
@@ -8456,7 +8516,7 @@
ast_cli(fd, "\nGlobal Signalling Settings:\n");
ast_cli(fd, "---------------------------\n");
ast_cli(fd, " Codecs: ");
- print_codec_to_cli(fd, &prefs);
+ print_codec_to_cli(fd, &global_prefs);
ast_cli(fd, "\n");
ast_cli(fd, " Relax DTMF: %s\n", relaxdtmf ? "Yes" : "No");
ast_cli(fd, " Compact SIP headers: %s\n", compactheaders ? "Yes" : "No");
@@ -8558,7 +8618,7 @@
ast_strlen_zero(cur->username) ? ( ast_strlen_zero(cur->cid_num) ? "(None)" : cur->cid_num ) : cur->username,
cur->callid,
cur->ocseq, cur->icseq,
- ast_getformatname(cur->owner ? cur->owner->nativeformats : 0),
+ ast_getformatname(cur->owner ? ast_codec_pref_index_audio(&cur->owner->nativeformats, 0) : 0),
ast_test_flag(cur, SIP_CALL_ONHOLD) ? "Yes" : "No",
ast_test_flag(cur, SIP_NEEDDESTROY) ? "(d)" : "",
cur->lastmsg );
@@ -8730,6 +8790,7 @@
char iabuf[INET_ADDRSTRLEN];
size_t len;
int found = 0;
+ char buf[512];
if (argc != 4)
return RESULT_SHOWUSAGE;
@@ -8745,11 +8806,8 @@
ast_cli(fd, " * SIP Call\n");
ast_cli(fd, " Direction: %s\n", ast_test_flag(cur, SIP_OUTGOING)?"Outgoing":"Incoming");
ast_cli(fd, " Call-ID: %s\n", cur->callid);
- ast_cli(fd, " Our Codec Capability: %d\n", cur->capability);
ast_cli(fd, " Non-Codec Capability: %d\n", cur->noncodeccapability);
- ast_cli(fd, " Their Codec Capability: %d\n", cur->peercapability);
- ast_cli(fd, " Joint Codec Capability: %d\n", cur->jointcapability);
- ast_cli(fd, " Format %s\n", ast_getformatname(cur->owner ? cur->owner->nativeformats : 0) );
+ ast_cli(fd, " Formats %s\n", cur->owner ? ast_codec_pref_dump(buf, sizeof(buf), &cur->owner->nativeformats) : "Unknown");
ast_cli(fd, " Theoretical Address: %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), cur->sa.sin_addr), ntohs(cur->sa.sin_port));
ast_cli(fd, " Received Address: %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), cur->recv.sin_addr), ntohs(cur->recv.sin_port));
ast_cli(fd, " NAT Support: %s\n", nat2str(ast_test_flag(cur, SIP_NAT)));
@@ -9559,7 +9617,7 @@
*ptr = '\0';
}
index = atoi(codecnum);
- if((codec = ast_codec_pref_index(&peer->prefs, index))) {
+ if((codec = ast_codec_pref_index_audio(&peer->prefs, index))) {
ast_copy_string(buf, ast_getformatname(codec), len);
}
}
@@ -10583,7 +10641,6 @@
char *supported;
char *required;
unsigned int required_profile = 0;
-
/* Find out what they support */
if (!p->sipoptions) {
supported = get_header(req, "Supported");
@@ -10636,7 +10693,6 @@
return -1;
}
} else {
- p->jointcapability = p->capability;
ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n");
}
}
@@ -10668,7 +10724,6 @@
return -1;
}
} else {
- p->jointcapability = p->capability;
ast_log(LOG_DEBUG, "Hm.... No sdp for the moment\n");
}
/* Queue NULL frame to prod ast_rtp_bridge if appropriate */
@@ -10816,7 +10871,7 @@
}
} else {
if (p && !ast_test_flag(p, SIP_NEEDDESTROY) && !ignore) {
- if (!p->jointcapability) {
+ if (!ast_codec_pref_bits(&p->formats)) {
transmit_response_reliable(p, "488 Not Acceptable Here (codec error)", req, 1);
} else {
ast_log(LOG_NOTICE, "Unable to create/find channel\n");
@@ -11907,22 +11962,14 @@
/*! \brief sip_request: PBX interface function -build SIP pvt structure ---*/
/* SIP calls initiated by the PBX arrive here */
-static struct ast_channel *sip_request_call(const char *type, int format, void *data, int *cause)
+static struct ast_channel *sip_request_call(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
struct sip_pvt *p;
struct ast_channel *tmpc = NULL;
char *ext, *host;
char tmp[256];
char *dest = data;
- oldformat = format;
- format &= ((AST_FORMAT_MAX_AUDIO << 1) - 1);
- if (!format) {
- ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format %s while capability is %s\n", ast_getformatname(oldformat), ast_getformatname(global_capability));
- *cause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL; /* Can't find codec to connect to host */
- return NULL;
- }
p = sip_alloc(NULL, NULL, 0, SIP_INVITE);
if (!p) {
ast_log(LOG_ERROR, "Unable to build sip pvt data for '%s' (Out of memory)\n", (char *)data);
@@ -11955,6 +12002,7 @@
ext = NULL;
}
}
+ ast_codec_pref_combine(&p->formats, formats, global_capability);
if (create_addr(p, host)) {
*cause = AST_CAUSE_UNREGISTERED;
@@ -11980,7 +12028,6 @@
#if 0
printf("Setting up to call extension '%s' at '%s'\n", ext ? ext : "<none>", host);
#endif
- p->prefcodec = format;
ast_mutex_lock(&p->lock);
tmpc = sip_new(p, AST_STATE_DOWN, host); /* Place the call */
ast_mutex_unlock(&p->lock);
@@ -12288,7 +12335,7 @@
user->ha = NULL;
ast_copy_flags(user, &global_flags, SIP_FLAGS_TO_COPY);
user->capability = global_capability;
- user->prefs = prefs;
+ user->prefs = global_prefs;
/* set default context */
strcpy(user->context, default_context);
strcpy(user->language, default_language);
@@ -12391,7 +12438,7 @@
peer->rtpkeepalive = global_rtpkeepalive;
ast_set_flag(peer, SIP_SELFDESTRUCT);
ast_set_flag(&peer->flags_page2, SIP_PAGE2_DYNAMIC);
- peer->prefs = prefs;
+ peer->prefs = global_prefs;
reg_source_db(peer);
return peer;
@@ -12473,7 +12520,7 @@
peer->pickupgroup = 0;
peer->rtpkeepalive = global_rtpkeepalive;
peer->maxms = default_qualify;
- peer->prefs = prefs;
+ peer->prefs = global_prefs;
oldha = peer->ha;
peer->ha = NULL;
peer->addr.sin_family = AF_INET;
@@ -12696,7 +12743,7 @@
memset(&bindaddr, 0, sizeof(bindaddr));
memset(&localaddr, 0, sizeof(localaddr));
memset(&externip, 0, sizeof(externip));
- memset(&prefs, 0 , sizeof(prefs));
+ memset(&global_prefs, 0 , sizeof(global_prefs));
sipdebug &= ~SIP_DEBUG_CONFIG;
/* Initialize some reasonable defaults at SIP reload */
@@ -12894,9 +12941,9 @@
externrefresh = 10;
}
} else if (!strcasecmp(v->name, "allow")) {
- ast_parse_allow_disallow(&prefs, &global_capability, v->value, 1);
+ ast_parse_allow_disallow(&global_prefs, &global_capability, v->value, 1);
} else if (!strcasecmp(v->name, "disallow")) {
- ast_parse_allow_disallow(&prefs, &global_capability, v->value, 0);
+ ast_parse_allow_disallow(&global_prefs, &global_capability, v->value, 0);
} else if (!strcasecmp(v->name, "allowexternaldomains")) {
allow_external_domains = ast_true(v->value);
} else if (!strcasecmp(v->name, "autodomain")) {
@@ -13103,7 +13150,7 @@
}
/*! \brief sip_set_rtp_peer: Set the RTP peer for this call ---*/
-static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
+static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, const struct ast_codec_pref *codecs, int nat_active)
{
struct sip_pvt *p;
int changed = 0;
@@ -13124,8 +13171,10 @@
memset(&p->vredirip, 0, sizeof(p->vredirip));
changed = 1;
}
- if (codecs && (p->redircodecs != codecs)) {
- p->redircodecs = codecs;
+ if (codecs && ast_codec_pref_bits(codecs) &&
+ !ast_codec_pref_eq_noorder(codecs, &p->redircodecs))
+ {
+ memcpy(&p->redircodecs, codecs, sizeof(p->redircodecs));
changed = 1;
}
if (changed && !ast_test_flag(p, SIP_GOTREFER)) {
@@ -13393,20 +13442,12 @@
return -1;
}
-/*! \brief sip_get_codec: Return SIP UA's codec (part of the RTP interface) ---*/
-static int sip_get_codec(struct ast_channel *chan)
-{
- struct sip_pvt *p = chan->tech_pvt;
- return p->peercapability;
-}
-
/*! \brief sip_rtp: Interface structure with callbacks used to connect to rtp module --*/
static struct ast_rtp_protocol sip_rtp = {
type: channeltype,
get_rtp_info: sip_get_rtp_peer,
get_vrtp_info: sip_get_vrtp_peer,
set_rtp_peer: sip_set_rtp_peer,
- get_codec: sip_get_codec,
};
/*! \brief sip_poke_all_peers: Send a poke to all known peers */
--- channels/chan_skinny.c.orig Wed Aug 30 21:59:44 2006
+++ channels/chan_skinny.c Mon Oct 9 13:01:08 2006
@@ -897,7 +897,7 @@
struct skinnysession *next;
} *sessions = NULL;
-static struct ast_channel *skinny_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *skinny_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int skinny_call(struct ast_channel *ast, char *dest, int timeout);
static int skinny_hangup(struct ast_channel *ast);
static int skinny_answer(struct ast_channel *ast);
@@ -1343,7 +1343,7 @@
return NULL;
}
-static int skinny_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
+static int skinny_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, const struct ast_codec_pref *codecs, int nat_active)
{
struct skinny_subchannel *sub;
sub = chan->tech_pvt;
@@ -2050,9 +2050,9 @@
if (sub->owner) {
/* We already hold the channel lock */
if (f->frametype == AST_FRAME_VOICE) {
- if (f->subclass != sub->owner->nativeformats) {
+ if (!(f->subclass & ast_codec_pref_bits(&sub->owner->nativeformats))) {
ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
- sub->owner->nativeformats = f->subclass;
+ ast_codec_pref_append(&sub->owner->nativeformats, f->subclass);
ast_set_read_format(sub->owner, sub->owner->readformat);
ast_set_write_format(sub->owner, sub->owner->writeformat);
}
@@ -2083,9 +2083,9 @@
return 0;
}
} else {
- if (!(frame->subclass & ast->nativeformats)) {
+ if (!(frame->subclass & ast_codec_pref_bits(&ast->nativeformats))) {
ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native formats is %d (read/write = %d/%d)\n",
- frame->subclass, ast->nativeformats, ast->readformat, ast->writeformat);
+ frame->subclass, ast_codec_pref_bits(&ast->nativeformats), ast->readformat, ast->writeformat);
return -1;
}
}
@@ -2241,11 +2241,11 @@
tmp = ast_channel_alloc(1);
if (tmp) {
tmp->tech = &skinny_tech;
- tmp->nativeformats = l->capability;
- if (!tmp->nativeformats)
- tmp->nativeformats = capability;
- fmt = ast_best_codec(tmp->nativeformats);
- ast_verbose("skinny_new: tmp->nativeformats=%d fmt=%d\n", tmp->nativeformats, fmt);
+ ast_codec_pref_append_missing2(&tmp->nativeformats, l->capability);
+ if (!ast_codec_pref_bits(&tmp->nativeformats))
+ ast_codec_pref_append_missing2(&tmp->nativeformats, capability);
+ fmt = ast_best_codec(ast_codec_pref_bits(&tmp->nativeformats));
+ ast_verbose("skinny_new: tmp->nativeformats=%d fmt=%d\n", ast_codec_pref_bits(&tmp->nativeformats), fmt);
snprintf(tmp->name, sizeof(tmp->name), "Skinny/%s@%s-%d", l->name, l->parent->name, sub->callid);
if (sub->rtp) {
tmp->fds[0] = ast_rtp_fd(sub->rtp);
@@ -3032,20 +3032,13 @@
return 0;
}
-static struct ast_channel *skinny_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *skinny_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
struct skinny_subchannel *sub;
struct ast_channel *tmpc = NULL;
char tmp[256];
char *dest = data;
- oldformat = format;
- format &= capability;
- if (!format) {
- ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", format);
- return NULL;
- }
strncpy(tmp, dest, sizeof(tmp) - 1);
if (ast_strlen_zero(tmp)) {
ast_log(LOG_NOTICE, "Skinny channels require a device\n");
--- channels/chan_zap.c.orig Fri Aug 25 18:21:18 2006
+++ channels/chan_zap.c Mon Oct 9 13:01:08 2006
@@ -689,7 +689,7 @@
} *iflist = NULL, *ifend = NULL;
-static struct ast_channel *zt_request(const char *type, int format, void *data, int *cause);
+static struct ast_channel *zt_request(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
static int zt_digit(struct ast_channel *ast, char digit);
static int zt_sendtext(struct ast_channel *c, const char *text);
static int zt_call(struct ast_channel *ast, char *rdest, int timeout);
@@ -5022,7 +5022,7 @@
} while (x < 3);
tmp->type = type;
tmp->fds[0] = i->subs[index].zfd;
- tmp->nativeformats = AST_FORMAT_SLINEAR | deflaw;
+ ast_codec_pref_append_missing2(&tmp->nativeformats, AST_FORMAT_SLINEAR | deflaw);
/* Start out assuming ulaw since it's smaller :) */
tmp->rawreadformat = deflaw;
tmp->readformat = deflaw;
@@ -7443,9 +7443,8 @@
}
#endif
-static struct ast_channel *zt_request(const char *type, int format, void *data, int *cause)
+static struct ast_channel *zt_request(const char *type, const struct ast_codec_pref *formats, void *data, int *cause)
{
- int oldformat;
int groupmatch = 0;
int channelmatch = -1;
int roundrobin = 0;
@@ -7474,13 +7473,6 @@
lock = &iflock;
start = iflist;
end = ifend;
- /* We do signed linear */
- oldformat = format;
- format &= (AST_FORMAT_SLINEAR | AST_FORMAT_ULAW);
- if (!format) {
- ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", oldformat);
- return NULL;
- }
if (data) {
dest = ast_strdupa((char *)data);
} else {
@@ -8103,9 +8095,12 @@
}
if (nextidle > -1) {
if (ast_tvdiff_ms(ast_tvnow(), lastidle) > 1000) {
+ struct ast_codec_pref ulaw;
+ ast_codec_pref_init(&ulaw);
+ ast_codec_pref_append(&ulaw, AST_FORMAT_ULAW);
/* Don't create a new idle call more than once per second */
snprintf(idlen, sizeof(idlen), "%d/%s", pri->pvts[nextidle]->channel, pri->idledial);
- idle = zt_request("Zap", AST_FORMAT_ULAW, idlen, &cause);
+ idle = zt_request("Zap", &ulaw, idlen, &cause);
if (idle) {
pri->pvts[nextidle]->isidlecall = 1;
if (ast_pthread_create(&p, NULL, do_idle_thread, idle)) {
--- channels/iax2-parser.c.orig Tue Nov 29 20:24:39 2005
+++ channels/iax2-parser.c Mon Oct 9 13:01:08 2006
@@ -94,7 +94,7 @@
strncpy(output, value, maxlen);
output[maxlen] = '\0';
- ast_codec_pref_convert(&pref, output, total_len, 0);
+ ast_codec_pref_convert_from_buf(&pref, output, total_len);
memset(output,0,total_len);
ast_codec_pref_string(&pref, output, total_len);
}
--- cli.c.orig Mon Feb 27 17:20:48 2006
+++ ./cli.c Mon Oct 9 13:01:08 2006
@@ -780,7 +780,7 @@
c->name, c->type, c->uniqueid,
(c->cid.cid_num ? c->cid.cid_num : "(N/A)"),
(c->cid.cid_name ? c->cid.cid_name : "(N/A)"),
- (c->cid.cid_dnid ? c->cid.cid_dnid : "(N/A)" ), ast_state2str(c->_state), c->_state, c->rings, c->nativeformats, c->writeformat, c->readformat,
+ (c->cid.cid_dnid ? c->cid.cid_dnid : "(N/A)" ), ast_state2str(c->_state), c->_state, c->rings, ast_codec_pref_bits(&c->nativeformats), c->writeformat, c->readformat,
c->fds[0], c->fin & 0x7fffffff, (c->fin & 0x80000000) ? " (DEBUGGED)" : "",
c->fout & 0x7fffffff, (c->fout & 0x80000000) ? " (DEBUGGED)" : "", (long)c->whentohangup,
cdrtime, c->_bridge ? c->_bridge->name : "<none>", ast_bridged_channel(c) ? ast_bridged_channel(c)->name : "<none>",
--- file.c.orig Wed Jun 14 05:20:22 2006
+++ ./file.c Mon Oct 9 13:01:08 2006
@@ -801,6 +801,7 @@
{
struct ast_filestream *fs;
struct ast_filestream *vfs;
+ char buf[512];
fs = ast_openstream(chan, filename, preflang);
vfs = ast_openvstream(chan, filename, preflang);
@@ -821,7 +822,7 @@
#endif
return 0;
}
- ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_getformatname(chan->nativeformats), strerror(errno));
+ ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n", filename, ast_codec_pref_dump(buf, sizeof(buf), &chan->nativeformats), strerror(errno));
return -1;
}
--- frame.c.orig Mon Jul 31 07:06:16 2006
+++ ./frame.c Mon Oct 9 13:01:08 2006
@@ -870,30 +870,54 @@
return 0;
}
-void ast_codec_pref_convert(struct ast_codec_pref *pref, char *buf, size_t size, int right)
+void ast_codec_pref_convert_to_buf(const struct ast_codec_pref *pref, char *buf, size_t size)
{
- int x = 0, differential = (int) 'A', mem = 0;
- char *from = NULL, *to = NULL;
-
- if(right) {
- from = pref->order;
- to = buf;
- mem = size;
- } else {
- to = pref->order;
- from = buf;
- mem = 32;
+ int limit = size < 32 ? size : 32;
+ int i;
+ int x = 0;
+
+ memset(buf, 0, size);
+ for (i = 0; i < limit; ++i)
+ {
+ if (!pref->audio_order[i])
+ break;
+ buf[i] = pref->audio_order[i] + (int) 'A';
+ }
+ x = i;
+ for (i = 0; (i + x) < limit; ++i)
+ {
+ if (!pref->video_order[i])
+ break;
+ buf[i + x] = pref->video_order[i] + (int) 'A';
}
+}
- memset(to, 0, mem);
- for (x = 0; x < 32 ; x++) {
- if(!from[x])
+void ast_codec_pref_convert_from_buf(struct ast_codec_pref *pref, char *buf, size_t size)
+{
+ int i;
+ int limit = size < 32 ? size : 32;
+ int slot;
+ static int max_slot = sizeof(AST_FORMAT_LIST) / sizeof(struct ast_format_list);
+
+ ast_codec_pref_init(pref);
+ for (i = 0; i < limit; ++i)
+ {
+ if (!buf[i])
break;
- to[x] = right ? (from[x] + differential) : (from[x] - differential);
+ slot = buf[i] - 1 - (int) 'A';
+ if (slot >= 0 && slot < max_slot) {
+ ast_codec_pref_append(pref, AST_FORMAT_LIST[slot].bits);
+ }
}
}
-int ast_codec_pref_string(struct ast_codec_pref *pref, char *buf, size_t size)
+char *ast_codec_pref_dump(char *buf, size_t size, const struct ast_codec_pref *pref)
+{
+ ast_codec_pref_string(pref, buf, size);
+ return buf;
+}
+
+int ast_codec_pref_string(const struct ast_codec_pref *pref, char *buf, size_t size)
{
int x = 0, codec = 0;
size_t total_len = 0, slen = 0;
@@ -906,7 +930,7 @@
for(x = 0; x < 32 ; x++) {
if(total_len <= 0)
break;
- if(!(codec = ast_codec_pref_index(pref,x)))
+ if(!(codec = ast_codec_pref_index_audio(pref,x)))
break;
if((formatname = ast_getformatname(codec))) {
slen = strlen(formatname);
@@ -915,7 +939,28 @@
strncat(buf,formatname,total_len);
total_len -= slen;
}
- if(total_len && x < 31 && ast_codec_pref_index(pref , x + 1)) {
+ if(total_len && x < 31 && ast_codec_pref_index_audio(pref , x + 1)) {
+ strncat(buf,"|",total_len);
+ total_len--;
+ }
+ }
+ if ((slen <= total_len) && pref->video_bits) {
+ strncat(buf,"|",total_len);
+ total_len--;
+ }
+ for(x = 0; x < 32 ; x++) {
+ if(total_len <= 0)
+ break;
+ if(!(codec = ast_codec_pref_index_video(pref,x)))
+ break;
+ if((formatname = ast_getformatname(codec))) {
+ slen = strlen(formatname);
+ if(slen > total_len)
+ break;
+ strncat(buf,formatname,total_len);
+ total_len -= slen;
+ }
+ if(total_len && x < 31 && ast_codec_pref_index_video(pref , x + 1)) {
strncat(buf,"|",total_len);
total_len--;
}
@@ -928,18 +973,34 @@
return size - total_len;
}
-int ast_codec_pref_index(struct ast_codec_pref *pref, int index)
+int ast_codec_pref_index_audio(const struct ast_codec_pref *pref, int index)
{
int slot = 0;
- if((index >= 0) && (index < sizeof(pref->order))) {
- slot = pref->order[index];
+ if((index >= 0) && (index < sizeof(pref->audio_order))) {
+ slot = pref->audio_order[index];
}
return slot ? AST_FORMAT_LIST[slot-1].bits : 0;
}
+int ast_codec_pref_index_video(const struct ast_codec_pref *pref, int index)
+{
+ int slot = 0;
+
+
+ if((index >= 0) && (index < sizeof(pref->video_order))) {
+ slot = pref->video_order[index];
+ }
+
+ return slot ? AST_FORMAT_LIST[slot-1].bits : 0;
+}
+
+int ast_codec_pref_bits(const struct ast_codec_pref *pref) {
+ return pref->audio_bits | pref->video_bits;
+}
+
/*! \brief ast_codec_pref_remove: Remove codec from pref list ---*/
void ast_codec_pref_remove(struct ast_codec_pref *pref, int format)
{
@@ -948,29 +1009,49 @@
size_t size = 0;
int slot = 0;
- if(!pref->order[0])
+ if (!(pref->audio_order[0] + pref->video_order[0]) ||
+ !(ast_codec_pref_bits(pref) & format))
+ {
return;
-
+ }
size = sizeof(AST_FORMAT_LIST) / sizeof(struct ast_format_list);
memcpy(&oldorder,pref,sizeof(struct ast_codec_pref));
memset(pref,0,sizeof(struct ast_codec_pref));
for (x = 0; x < size; x++) {
- slot = oldorder.order[x];
+ slot = oldorder.audio_order[x];
if(! slot)
break;
- if(AST_FORMAT_LIST[slot-1].bits != format)
- pref->order[y++] = slot;
+ if(AST_FORMAT_LIST[slot-1].bits != format) {
+ pref->audio_order[y++] = slot;
+ pref->audio_bits |= AST_FORMAT_LIST[slot - 1].bits;
+ }
+ }
+ for (y = 0, x = 0; x < size; x++) {
+ slot = oldorder.video_order[x];
+ if(! slot)
+ break;
+ if(AST_FORMAT_LIST[slot-1].bits != format) {
+ pref->video_order[y++] = slot;
+ pref->video_bits |= AST_FORMAT_LIST[slot - 1].bits;
+ }
}
-
}
/*! \brief ast_codec_pref_append: Append codec to list ---*/
int ast_codec_pref_append(struct ast_codec_pref *pref, int format)
{
size_t size = 0;
- int x = 0, newindex = -1;
+ int x = 0, newindex = 0;
+ char *order = format < AST_FORMAT_MAX_AUDIO ?
+ pref->audio_order :
+ pref->video_order;
+ int *bits = format < AST_FORMAT_MAX_AUDIO ?
+ &pref->audio_bits :
+ &pref->video_bits;
+ if (!format)
+ return 0;
ast_codec_pref_remove(pref, format);
size = sizeof(AST_FORMAT_LIST) / sizeof(struct ast_format_list);
@@ -984,8 +1065,9 @@
if(newindex) {
for (x = 0; x < size; x++) {
- if(!pref->order[x]) {
- pref->order[x] = newindex;
+ if(!order[x]) {
+ order[x] = newindex;
+ *bits |= format;
break;
}
}
@@ -1003,7 +1085,20 @@
size = sizeof(AST_FORMAT_LIST) / sizeof(struct ast_format_list);
for (x = 0; x < size; x++) {
- slot = pref->order[x];
+ slot = pref->audio_order[x];
+
+ if(!slot)
+ break;
+ if ( formats & AST_FORMAT_LIST[slot-1].bits ) {
+ ret = AST_FORMAT_LIST[slot-1].bits;
+ break;
+ }
+ }
+ if(ret)
+ return ret;
+
+ for (x = 0; x < size; x++) {
+ slot = pref->video_order[x];
if(!slot)
break;
@@ -1048,6 +1143,108 @@
memset(pref, 0, sizeof(*pref));
}
}
+ }
+}
+
+void ast_codec_pref_append_missing2(struct ast_codec_pref *pref, int newformats)
+{
+ int i;
+ int format;
+
+ for (i = 0; i < 32; ++i) {
+ format = (1 << i);
+ if (!(format & ast_codec_pref_bits(pref)) &&
+ (format & newformats))
+ {
+ ast_codec_pref_append(pref, format);
+ }
+ }
+}
+
+void ast_codec_pref_append_missing(struct ast_codec_pref *pref, const struct ast_codec_pref *newformats)
+{
+ int i;
+ int format;
+ const int size = sizeof(AST_FORMAT_LIST) / sizeof(struct ast_format_list);
+ int slot;
+
+ for (i = 0; i < size; i++) {
+ if (!(slot = newformats->audio_order[i]))
+ break;
+ format = AST_FORMAT_LIST[slot - 1].bits;
+ if (!(format & pref->audio_bits))
+ ast_codec_pref_append(pref, format);
+ }
+ for (i = 0; i < size; i++) {
+ if (!(slot = newformats->video_order[i]))
+ break;
+ format = AST_FORMAT_LIST[slot - 1].bits;
+ if (!(format & pref->video_bits))
+ ast_codec_pref_append(pref, format);
+ }
+}
+
+void ast_codec_pref_init(struct ast_codec_pref *pref)
+{
+ memset(pref, 0, sizeof(*pref));
+}
+
+void ast_codec_pref_set2(struct ast_codec_pref *pref, int formats)
+{
+ ast_codec_pref_init(pref);
+ ast_codec_pref_append_missing2(pref, formats);
+}
+
+int ast_codec_pref_intersect(const struct ast_codec_pref *pref1, const struct ast_codec_pref *pref2)
+{
+ return (pref1->video_bits | pref1->audio_bits) &
+ (pref2->video_bits | pref2->audio_bits);
+}
+
+int ast_codec_pref_eq_noorder(const struct ast_codec_pref *pref1, const struct ast_codec_pref *pref2)
+{
+ return (pref1->video_bits | pref1->audio_bits) ==
+ (pref2->video_bits | pref2->audio_bits);
+}
+
+void ast_codec_pref_combine(struct ast_codec_pref *dest,
+ const struct ast_codec_pref *main,
+ const int mask)
+{
+ const int size = sizeof(AST_FORMAT_LIST) / sizeof(struct ast_format_list);
+ int i;
+ int slot;
+ int format;
+
+ ast_codec_pref_init(dest);
+ for (i = 0; i < size; ++i)
+ {
+ if (!(slot = main->audio_order[i]))
+ break;
+ format = AST_FORMAT_LIST[slot - 1].bits;
+ if (mask & format)
+ ast_codec_pref_append(dest, format);
+ }
+ for (i = 0; i < size; ++i)
+ {
+ if (!(slot = main->video_order[i]))
+ break;
+ format = AST_FORMAT_LIST[slot - 1].bits;
+ if (mask & format)
+ ast_codec_pref_append(dest, format);
+ }
+}
+
+void ast_codec_pref_remove2(struct ast_codec_pref *pref, int formats)
+{
+ int i;
+ int format;
+
+ for (i = 0; i < 32; ++i)
+ {
+ format = (1 << i);
+ if (format & formats & ast_codec_pref_bits(pref))
+ ast_codec_pref_remove(pref, format);
}
}
--- include/asterisk/channel.h.orig Thu Jun 1 23:27:50 2006
+++ include/asterisk/channel.h Mon Oct 9 13:01:08 2006
@@ -114,6 +114,7 @@
#include "asterisk/cdr.h"
#include "asterisk/utils.h"
#include "asterisk/linkedlists.h"
+#include "asterisk/translate.h"
#define MAX_LANGUAGE 20
@@ -182,7 +183,7 @@
int properties;
/*! Requester - to set up call data structures (pvt's) */
- struct ast_channel *(* const requester)(const char *type, int format, void *data, int *cause);
+ struct ast_channel *(* const requester)(const char *type, const struct ast_codec_pref *format, void *data, int *cause);
/*! Devicestate call back */
int (* const devicestate)(void *data);
@@ -242,6 +243,9 @@
/*! Find bridged channel */
struct ast_channel *(* const bridged_channel)(struct ast_channel *chan, struct ast_channel *bridge);
+
+ /*! Try to fixup codecs */
+ void (*fixup_codecs)(struct ast_channel *chan, const struct ast_codec_pref *peer_codecs);
};
struct ast_channel_spy_list;
@@ -328,9 +332,11 @@
int rings;
/*! Kinds of data this channel can natively handle */
- int nativeformats;
+ struct ast_codec_pref nativeformats;
/*! Requested read format */
int readformat;
+ /*! Format of last frame read */
+ int lastreadformat;
/*! Requested write format */
int writeformat;
@@ -401,9 +407,9 @@
struct ast_frame *readq;
int alertpipe[2];
/*! Write translation path */
- struct ast_trans_pvt *writetrans;
+ struct ast_trans_pvt *writetrans_matrix[MAX_FORMAT][MAX_FORMAT];
/*! Read translation path */
- struct ast_trans_pvt *readtrans;
+ struct ast_trans_pvt *readtrans_matrix[MAX_FORMAT][MAX_FORMAT];
/*! Raw read format */
int rawreadformat;
/*! Raw write format */
@@ -570,7 +576,7 @@
* by the low level module
* \return Returns an ast_channel on success, NULL on failure.
*/
-struct ast_channel *ast_request(const char *type, int format, void *data, int *status);
+struct ast_channel *ast_request(const char *type, const struct ast_codec_pref *formats, void *data, int *status);
/*!
* \brief Request a channel of a given type, with data as optional information used
@@ -585,9 +591,9 @@
* \return Returns an ast_channel on success or no answer, NULL on failure. Check the value of chan->_state
* to know if the call was answered or not.
*/
-struct ast_channel *ast_request_and_dial(const char *type, int format, void *data, int timeout, int *reason, const char *cidnum, const char *cidname);
+struct ast_channel *ast_request_and_dial(const char *type, const struct ast_codec_pref *format, void *data, int timeout, int *reason, const char *cidnum, const char *cidname);
-struct ast_channel *__ast_request_and_dial(const char *type, int format, void *data, int timeout, int *reason, const char *cidnum, const char *cidname, struct outgoing_helper *oh);
+struct ast_channel *__ast_request_and_dial(const char *type, const struct ast_codec_pref *format, void *data, int timeout, int *reason, const char *cidnum, const char *cidname, struct outgoing_helper *oh);
/*!\brief Register a channel technology (a new channel driver)
* Called by a channel module to register the kind of channels it supports.
--- include/asterisk/frame.h.orig Tue Nov 29 20:24:39 2005
+++ include/asterisk/frame.h Mon Oct 9 13:01:08 2006
@@ -34,7 +34,10 @@
#include "asterisk/endian.h"
struct ast_codec_pref {
- char order[32];
+ char audio_order[32];
+ char video_order[32];
+ int audio_bits;
+ int video_bits;
};
/*! \page Def_Frame AST Multimedia and signalling frames
@@ -191,6 +194,8 @@
#define AST_FORMAT_SPEEX (1 << 9)
/*! iLBC Free Compression */
#define AST_FORMAT_ILBC (1 << 10)
+/*! ADPCM (G.726, 40kbps) */
+#define AST_FORMAT_G726_40 (1 << 11)
/*! Maximum audio format */
#define AST_FORMAT_MAX_AUDIO (1 << 15)
/*! JPEG Images */
@@ -423,12 +428,24 @@
/*! \brief Initialize a codec preference to "no preference" */
extern void ast_codec_pref_init(struct ast_codec_pref *pref);
-/*! \brief Codec located at a particular place in the preference index */
-extern int ast_codec_pref_index(struct ast_codec_pref *pref, int index);
+/*! \brief Return bitmap of common codecs of the two preferences */
+extern int ast_codec_pref_intersect(const struct ast_codec_pref *pref1, const struct ast_codec_pref *pref2);
+
+/*! \brief Returns true if both prefs consists of the same set of codecs disregarding their order */
+extern int ast_codec_pref_eq_noorder(const struct ast_codec_pref *pref1, const struct ast_codec_pref *pref2);
+
+/*! \brief Audio codec located at a particular place in the preference index */
+extern int ast_codec_pref_index_audio(const struct ast_codec_pref *pref, int index);
+
+/*! \brief Video codec located at a particular place in the preference index */
+extern int ast_codec_pref_index_video(const struct ast_codec_pref *pref, int index);
/*! \brief Remove a codec from a preference list */
extern void ast_codec_pref_remove(struct ast_codec_pref *pref, int format);
+/*! \brief Returns the full bitmap of all codecs */
+extern int ast_codec_pref_bits(const struct ast_codec_pref *pref);
+
/*! \brief Append a codec to a preference list, removing it first if it was already there */
extern int ast_codec_pref_append(struct ast_codec_pref *pref, int format);
@@ -441,10 +458,15 @@
extern void ast_parse_allow_disallow(struct ast_codec_pref *pref, int *mask, const char *list, int allowing);
/*! \brief Dump codec preference list into a string */
-extern int ast_codec_pref_string(struct ast_codec_pref *pref, char *buf, size_t size);
+extern int ast_codec_pref_string(const struct ast_codec_pref *pref, char *buf, size_t size);
+
+/*! \brief Dump codec preference list into a string */
+extern char *ast_codec_pref_dump(char *buf, size_t size, const struct ast_codec_pref *pref);
-/*! \brief Shift a codec preference list up or down 65 bytes so that it becomes an ASCII string */
-extern void ast_codec_pref_convert(struct ast_codec_pref *pref, char *buf, size_t size, int right);
+/*! \brief Shift a codec preference list up 65 bytes so that it becomes an ASCII string */
+extern void ast_codec_pref_convert_to_buf(const struct ast_codec_pref *pref, char *buf, size_t size);
+/*! \brief Shift a codec preference list down 65 bytes so that it becomes an codec set */
+extern void ast_codec_pref_convert_from_buf(struct ast_codec_pref *pref, char *buf, size_t size);
/*! \brief Returns the number of samples contained in the frame */
extern int ast_codec_get_samples(struct ast_frame *f);
@@ -457,6 +479,57 @@
{
return (format == AST_FORMAT_ILBC) ? 30 : 20;
}
+
+/*!
+ * \brief Append codecs.
+ * \param pref Codec set to be modified.
+ * \param newformats Bitmap of codecs to be appended.
+ *
+ * Append codecs from newformats to pref but only those that are not
+ * already in the pref.
+ */
+void ast_codec_pref_append_missing2(struct ast_codec_pref *pref, int newformats);
+
+/*!
+ * \brief Append codecs.
+ * \param pref Codec set to be modified.
+ * \param newformats Codecs to be appended.
+ *
+ * Append codecs from newformats to pref but only those that are not
+ * already in the pref. Codecs appended after last codec in pref using
+ * order from newformats.
+ */
+void ast_codec_pref_append_missing(struct ast_codec_pref *pref, const struct ast_codec_pref *newformats);
+
+/*!
+ * \brief Clear the pref then append formats given.
+ * \param pref Codec set to be set.
+ * \param formats Bitmap of codecs to be put to pref.
+ *
+ * Clears pref and puts given formats into it. Codec order is not well
+ * predictable so avoid using this function if codec order is important.
+ */
+void ast_codec_pref_set2(struct ast_codec_pref *pref, int formats);
+
+/*!
+ * \brief Combine codecs from main and mask and put them to dest.
+ * \param dest Codec set to be modified.
+ * \param main Source codec set.
+ * \param mask Bitmap of formats.
+ *
+ * Set dest to all codecs from main (in that order) but only
+ * those that exist in mask. Previous content of dest is destroyed.
+ */
+void ast_codec_pref_combine(struct ast_codec_pref *dest, const struct ast_codec_pref *main, const int mask);
+
+/*!
+ * \brief Remove codecs.
+ * \param pref Codec set to be modified.
+ * \param formats Bitmap of codecs to be removed.
+ *
+ * Removes codecs that passed in bitmap formats from codec set pref.
+ */
+void ast_codec_pref_remove2(struct ast_codec_pref *pref, int formats);
/*!
\brief Adjusts the volume of the audio samples contained in a frame.
--- include/asterisk/options.h.orig Mon May 1 23:44:24 2006
+++ include/asterisk/options.h Mon Oct 9 13:01:08 2006
@@ -60,6 +60,9 @@
#define VERBOSE_PREFIX_3 " -- "
#define VERBOSE_PREFIX_4 " > "
+enum ast_trans_algorithm { AST_TRANS_ALG_STRICT, AST_TRANS_ALG_LOOSE };
+extern enum ast_trans_algorithm option_translation_algorithm;
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
--- include/asterisk/pbx.h.orig Wed Mar 29 22:11:18 2006
+++ include/asterisk/pbx.h Mon Oct 9 13:01:08 2006
@@ -563,11 +563,11 @@
/* Synchronously or asynchronously make an outbound call and send it to a
particular extension */
-int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel);
+int ast_pbx_outgoing_exten(const char *type, const struct ast_codec_pref *formats, void *data, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel);
/* Synchronously or asynchronously make an outbound call and send it to a
particular application with given extension */
-int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel);
+int ast_pbx_outgoing_app(const char *type, const struct ast_codec_pref *formats, void *data, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel);
/* Evaluate a condition for non-falseness and return a boolean */
int pbx_checkcondition(char *condition);
--- include/asterisk/rtp.h.orig Fri Sep 1 20:35:06 2006
+++ include/asterisk/rtp.h Mon Oct 9 13:01:08 2006
@@ -53,10 +53,16 @@
/* Get RTP struct, or NULL if unwilling to transfer */
struct ast_rtp *(* const get_vrtp_info)(struct ast_channel *chan);
/* Set RTP peer */
- int (* const set_rtp_peer)(struct ast_channel *chan, struct ast_rtp *peer, struct ast_rtp *vpeer, int codecs, int nat_active);
- int (* const get_codec)(struct ast_channel *chan);
+ int (* const set_rtp_peer)(struct ast_channel *chan, struct ast_rtp *peer, struct ast_rtp *vpeer, const struct ast_codec_pref *codecs, int nat_active);
+/* int (* const get_codec)(struct ast_channel *chan);*/
const char * const type;
struct ast_rtp_protocol *next;
+};
+
+/* The value of each payload format mapping: */
+struct rtpPayloadType {
+ int isAstFormat; /* whether the following code is an AST_FORMAT */
+ int code;
};
/*!
--- include/asterisk/translate.h.orig Tue Nov 29 20:24:39 2005
+++ include/asterisk/translate.h Mon Oct 9 13:01:08 2006
@@ -34,6 +34,7 @@
/* Declared by individual translators */
struct ast_translator_pvt;
+struct ast_channel;
/*! data structure associated with a translator */
struct ast_translator {
@@ -102,6 +103,13 @@
*/
extern void ast_translator_free_path(struct ast_trans_pvt *tr);
+/*! Frees a translation path matrix assosiated with channel */
+/*!
+ * \param chan channel to free translation path matrix
+ * Frees the translation matrix in the given channel
+ */
+extern void ast_translator_free_translations(struct ast_channel *chan);
+
/*! translates one or more frames */
/*!
* \param tr translator structure to use for translation
@@ -112,6 +120,35 @@
* Returns an ast_frame of the new translation format on success, NULL on failure
*/
extern struct ast_frame *ast_translate(struct ast_trans_pvt *tr, struct ast_frame *f, int consume);
+/*! translates read frames */
+/*!
+ * \param chan channel through which the frame comes in
+ * \param f frame to translate
+ * \param consume Whether or not to free the original frame
+ * Translate frame into the readformat of the channel from any format and receive
+ * zero or one output frames. Consume determines whether the original frame
+ * should be freed.
+ * Returns an ast_frame of the new translation format on success, NULL on failure
+ */
+extern struct ast_frame *ast_translate_read(struct ast_channel *chan, struct ast_frame *f, int consume);
+/*! translates frames for writing */
+/*!
+ * \param chan channel through which the frame comes out
+ * \param f frame to translate
+ * \param consume Whether or not to free the original frame
+ * Translate frame into the writeformat of the channel from any format and receive
+ * zero or one output frames. Consume determines whether the original frame
+ * should be freed.
+ * Returns an ast_frame of the new translation format on success, NULL on failure
+ */
+extern struct ast_frame *ast_translate_write(struct ast_channel *chan, struct ast_frame *f, int consume);
+
+/*!
+ * Returns all formats that can be converted by asterisk from/to supplied format
+ * plus the format itself.
+ * \param formats formats for which to search compatible formats
+ */
+extern int ast_compatible_audio_formats(int format);
#if defined(__cplusplus) || defined(c_plusplus)
}
--- manager.c.orig Sat Feb 11 20:15:00 2006
+++ ./manager.c Mon Oct 9 13:01:08 2006
@@ -935,14 +935,18 @@
int res;
int reason = 0;
struct ast_channel *chan = NULL;
+ struct ast_codec_pref slin;
+
+ ast_codec_pref_init(&slin);
+ ast_codec_pref_append(&slin, AST_FORMAT_SLINEAR);
if (!ast_strlen_zero(in->app)) {
- res = ast_pbx_outgoing_app(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->app, in->appdata, &reason, 1,
+ res = ast_pbx_outgoing_app(in->tech, &slin, in->data, in->timeout, in->app, in->appdata, &reason, 1,
!ast_strlen_zero(in->cid_num) ? in->cid_num : NULL,
!ast_strlen_zero(in->cid_name) ? in->cid_name : NULL,
in->vars, in->account, &chan);
} else {
- res = ast_pbx_outgoing_exten(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->context, in->exten, in->priority, &reason, 1,
+ res = ast_pbx_outgoing_exten(in->tech, &slin, in->data, in->timeout, in->context, in->exten, in->priority, &reason, 1,
!ast_strlen_zero(in->cid_num) ? in->cid_num : NULL,
!ast_strlen_zero(in->cid_name) ? in->cid_name : NULL,
in->vars, in->account, &chan);
@@ -1016,6 +1020,11 @@
pthread_t th;
pthread_attr_t attr;
+ struct ast_codec_pref slin;
+
+ memset(&slin, 0, sizeof(&slin));
+ ast_codec_pref_append(&slin, AST_FORMAT_SLINEAR);
+
if (!name) {
astman_send_error(s, m, "Channel not specified");
return 0;
@@ -1079,10 +1088,10 @@
}
}
} else if (!ast_strlen_zero(app)) {
- res = ast_pbx_outgoing_app(tech, AST_FORMAT_SLINEAR, data, to, app, appdata, &reason, 1, l, n, vars, account, NULL);
+ res = ast_pbx_outgoing_app(tech, &slin, data, to, app, appdata, &reason, 1, l, n, vars, account, NULL);
} else {
if (exten && context && pi)
- res = ast_pbx_outgoing_exten(tech, AST_FORMAT_SLINEAR, data, to, context, exten, pi, &reason, 1, l, n, vars, account, NULL);
+ res = ast_pbx_outgoing_exten(tech, &slin, data, to, context, exten, pi, &reason, 1, l, n, vars, account, NULL);
else {
astman_send_error(s, m, "Originate with 'Exten' requires 'Context' and 'Priority'");
return 0;
--- pbx.c.orig Thu Aug 24 22:41:26 2006
+++ ./pbx.c Mon Oct 9 13:01:08 2006
@@ -4981,7 +4981,7 @@
return 0; /* success */
}
-int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **channel)
+int ast_pbx_outgoing_exten(const char *type, const struct ast_codec_pref *formats, void *data, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **channel)
{
struct ast_channel *chan;
struct async_stat *as;
@@ -4991,7 +4991,7 @@
if (sync) {
LOAD_OH(oh);
- chan = __ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name, &oh);
+ chan = __ast_request_and_dial(type, formats, data, timeout, reason, cid_num, cid_name, &oh);
if (channel) {
*channel = chan;
if (chan)
@@ -5093,7 +5093,7 @@
goto outgoing_exten_cleanup;
}
memset(as, 0, sizeof(struct async_stat));
- chan = ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name);
+ chan = ast_request_and_dial(type, formats, data, timeout, reason, cid_num, cid_name);
if (channel) {
*channel = chan;
if (chan)
@@ -5155,7 +5155,7 @@
return NULL;
}
-int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel)
+int ast_pbx_outgoing_app(const char *type, const struct ast_codec_pref *formats, void *data, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel)
{
struct ast_channel *chan;
struct async_stat *as;
@@ -5175,7 +5175,7 @@
goto outgoing_app_cleanup;
}
if (sync) {
- chan = __ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name, &oh);
+ chan = __ast_request_and_dial(type, formats, data, timeout, reason, cid_num, cid_name, &oh);
if (chan) {
if (chan->cdr) { /* check if the channel already has a cdr record, if not give it one */
ast_log(LOG_WARNING, "%s already has a call record??\n", chan->name);
@@ -5262,7 +5262,7 @@
goto outgoing_app_cleanup;
}
memset(as, 0, sizeof(struct async_stat));
- chan = __ast_request_and_dial(type, format, data, timeout, reason, cid_num, cid_name, &oh);
+ chan = __ast_request_and_dial(type, formats, data, timeout, reason, cid_num, cid_name, &oh);
if (!chan) {
free(as);
res = -1;
--- pbx/pbx_spool.c.orig Sat Feb 11 20:15:00 2006
+++ pbx/pbx_spool.c Mon Oct 9 13:01:08 2006
@@ -256,14 +256,19 @@
{
struct outgoing *o = data;
int res, reason;
+ struct ast_codec_pref slin;
+
+ ast_codec_pref_init(&slin);
+ ast_codec_pref_append(&slin, AST_FORMAT_SLINEAR);
+
if (!ast_strlen_zero(o->app)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Attempting call on %s/%s for application %s(%s) (Retry %d)\n", o->tech, o->dest, o->app, o->data, o->retries);
- res = ast_pbx_outgoing_app(o->tech, AST_FORMAT_SLINEAR, o->dest, o->waittime * 1000, o->app, o->data, &reason, 2 /* wait to finish */, o->cid_num, o->cid_name, o->vars, o->account, NULL);
+ res = ast_pbx_outgoing_app(o->tech, &slin, o->dest, o->waittime * 1000, o->app, o->data, &reason, 2 /* wait to finish */, o->cid_num, o->cid_name, o->vars, o->account, NULL);
} else {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Attempting call on %s/%s for %s@%s:%d (Retry %d)\n", o->tech, o->dest, o->exten, o->context,o->priority, o->retries);
- res = ast_pbx_outgoing_exten(o->tech, AST_FORMAT_SLINEAR, o->dest, o->waittime * 1000, o->context, o->exten, o->priority, &reason, 2 /* wait to finish */, o->cid_num, o->cid_name, o->vars, o->account, NULL);
+ res = ast_pbx_outgoing_exten(o->tech, &slin, o->dest, o->waittime * 1000, o->context, o->exten, o->priority, &reason, 2 /* wait to finish */, o->cid_num, o->cid_name, o->vars, o->account, NULL);
}
if (res) {
ast_log(LOG_NOTICE, "Call failed to go through, reason %d\n", reason);
--- res/res_features.c.orig Wed Aug 2 02:07:06 2006
+++ res/res_features.c Mon Oct 9 13:01:08 2006
@@ -211,7 +211,7 @@
}
}
-static struct ast_channel *ast_feature_request_and_dial(struct ast_channel *caller, const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name);
+static struct ast_channel *ast_feature_request_and_dial(struct ast_channel *caller, const char *type, const struct ast_codec_pref *formats, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name);
static void *ast_bridge_call_thread(void *data)
@@ -721,7 +721,7 @@
cid_name = transferer->cid.cid_name;
if (ast_exists_extension(transferer, transferer_real_context,xferto, 1, cid_num)) {
snprintf(dialstr, sizeof(dialstr), "%s@%s/n", xferto, transferer_real_context);
- newchan = ast_feature_request_and_dial(transferer, "Local", ast_best_codec(transferer->nativeformats), dialstr, 15000, &outstate, cid_num, cid_name);
+ newchan = ast_feature_request_and_dial(transferer, "Local", &transferer->nativeformats, dialstr, 15000, &outstate, cid_num, cid_name);
ast_indicate(transferer, -1);
if (newchan) {
res = ast_channel_make_compatible(transferer, newchan);
@@ -1088,7 +1088,7 @@
}
-static struct ast_channel *ast_feature_request_and_dial(struct ast_channel *caller, const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name)
+static struct ast_channel *ast_feature_request_and_dial(struct ast_channel *caller, const char *type, const struct ast_codec_pref *formats, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name)
{
int state = 0;
int cause = 0;
@@ -1099,7 +1099,7 @@
struct ast_frame *f = NULL;
int res = 0, ready = 0;
- if ((chan = ast_request(type, format, data, &cause))) {
+ if ((chan = ast_request(type, formats, data, &cause))) {
ast_set_callerid(chan, cid_num, cid_name, cid_num);
ast_channel_inherit_variables(caller, chan);
if (!ast_call(chan, data, timeout)) {
@@ -1304,6 +1304,27 @@
set_config_flags(chan, peer, config);
config->firstpass = 1;
+ if (ast_codec_pref_intersect(&chan->nativeformats, &peer->nativeformats))
+ {
+ if (chan->tech->fixup_codecs &&
+ ast_codec_pref_intersect(&chan->nativeformats, &peer->nativeformats) != ast_codec_pref_bits(&chan->nativeformats))
+ {
+ struct ast_codec_pref tmp;
+ memcpy(&tmp, &peer->nativeformats, sizeof(tmp));
+ /* Provide all compatible formats also */
+ ast_codec_pref_append_missing2(&tmp, ast_compatible_audio_formats(tmp.audio_bits));
+ chan->tech->fixup_codecs(chan, &tmp);
+ }
+ if (peer->tech->fixup_codecs &&
+ ast_codec_pref_intersect(&chan->nativeformats, &peer->nativeformats) != ast_codec_pref_bits(&peer->nativeformats))
+ {
+ struct ast_codec_pref tmp;
+ memcpy(&tmp, &peer->nativeformats, sizeof(tmp));
+ /* Provide all compatible formats also */
+ ast_codec_pref_append_missing2(&tmp, ast_compatible_audio_formats(tmp.audio_bits));
+ peer->tech->fixup_codecs(peer, &tmp);
+ }
+ }
/* Answer if need be */
if (ast_answer(chan))
return -1;
--- rtp.c.orig Fri Sep 1 20:35:06 2006
+++ ./rtp.c Mon Oct 9 13:01:08 2006
@@ -53,6 +53,7 @@
#include "asterisk/cli.h"
#include "asterisk/unaligned.h"
#include "asterisk/utils.h"
+#include "asterisk/translate.h"
#define MAX_TIMESTAMP_SKEW 640
@@ -70,13 +71,13 @@
static int nochecksums = 0;
#endif
-/* The value of each payload format mapping: */
-struct rtpPayloadType {
- int isAstFormat; /* whether the following code is an AST_FORMAT */
- int code;
-};
-
#define MAX_RTP_PT 256
+/*
+ * RFC3551, Section 6:
+ * "...payload type values in the range 96-127 MAY be defined dynamically..."
+ */
+#define MAX_RTP_STATIC_PT 95
+
#define FLAG_3389_WARNING (1 << 0)
#define FLAG_NAT_ACTIVE (3 << 1)
@@ -740,8 +741,11 @@
/* By default, use the well-known value for this type (although it may */
/* still be set to a different value by a subsequent "a=rtpmap:" line): */
void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt) {
- if (pt < 0 || pt > MAX_RTP_PT)
- return; /* bogus payload type */
+ /*
+ * Get only static payload types here
+ */
+ if (pt < 0 || pt > MAX_RTP_STATIC_PT)
+ return; /* non-static payload type */
if (static_RTP_PT[pt].code != 0) {
rtp->current_RTP_PT[pt] = static_RTP_PT[pt];
@@ -801,8 +805,9 @@
if (!rtp->rtp_offered_from_local)
result = rtp->current_RTP_PT[pt];
- /* If it doesn't exist, check our static RTP type list, just in case */
- if (!result.code)
+ /* If it doesn't exist, check our static RTP type list, just in case
+ (and only for static payload types). */
+ if (!result.code && pt <= (rtp->rtp_offered_from_local ? MAX_RTP_PT : MAX_RTP_STATIC_PT))
result = static_RTP_PT[pt];
return result;
}
@@ -1536,11 +1541,15 @@
void *pvt0, *pvt1;
int codec0,codec1, oldcodec0, oldcodec1;
+ struct ast_codec_pref codecs0;
+ struct ast_codec_pref codecs1;
memset(&vt0, 0, sizeof(vt0));
memset(&vt1, 0, sizeof(vt1));
memset(&vac0, 0, sizeof(vac0));
memset(&vac1, 0, sizeof(vac1));
+ ast_codec_pref_init(&codecs0);
+ ast_codec_pref_init(&codecs1);
/* if need DTMF, cant native bridge */
if (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))
@@ -1593,28 +1602,21 @@
ast_mutex_unlock(&c1->lock);
return AST_BRIDGE_FAILED_NOWARN;
}
- /* Get codecs from both sides */
- if (pr0->get_codec)
- codec0 = pr0->get_codec(c0);
- else
- codec0 = 0;
- if (pr1->get_codec)
- codec1 = pr1->get_codec(c1);
- else
- codec1 = 0;
- if (pr0->get_codec && pr1->get_codec) {
- /* Hey, we can't do reinvite if both parties speak different codecs */
- if (!(codec0 & codec1)) {
- if (option_debug)
- ast_log(LOG_DEBUG, "Channel codec0 = %d is not codec1 = %d, cannot native bridge in RTP.\n", codec0, codec1);
- ast_mutex_unlock(&c0->lock);
- ast_mutex_unlock(&c1->lock);
- return AST_BRIDGE_FAILED_NOWARN;
- }
+ codec0 = ast_codec_pref_bits(&c0->nativeformats);
+ codec1 = ast_codec_pref_bits(&c1->nativeformats);
+ memcpy(&codecs0, &c0->nativeformats, sizeof(codecs0));
+ memcpy(&codecs1, &c1->nativeformats, sizeof(codecs1));
+ /* Hey, we can't do reinvite if both parties speak different codecs */
+ if (!(codec0 & codec1)) {
+ if (option_debug)
+ ast_log(LOG_DEBUG, "Channel codec0 = %d is not codec1 = %d, cannot native bridge in RTP.\n", codec0, codec1);
+ ast_mutex_unlock(&c0->lock);
+ ast_mutex_unlock(&c1->lock);
+ return AST_BRIDGE_FAILED_NOWARN;
}
/* Ok, we should be able to redirect the media. Start with one channel */
- if (pr0->set_rtp_peer(c0, p1, vp1, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE)))
+ if (pr0->set_rtp_peer(c0, p1, vp1, &codecs1, ast_test_flag(p1, FLAG_NAT_ACTIVE)))
ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
else {
/* Store RTP peer */
@@ -1623,7 +1625,7 @@
ast_rtp_get_peer(vp1, &vac1);
}
/* Then test the other channel */
- if (pr1->set_rtp_peer(c1, p0, vp0, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE)))
+ if (pr1->set_rtp_peer(c1, p0, vp0, &codecs0, ast_test_flag(p0, FLAG_NAT_ACTIVE)))
ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
else {
/* Store RTP peer */
@@ -1647,11 +1649,11 @@
(c0->masq || c0->masqr || c1->masq || c1->masqr)) {
ast_log(LOG_DEBUG, "Oooh, something is weird, backing out\n");
if (c0->tech_pvt == pvt0) {
- if (pr0->set_rtp_peer(c0, NULL, NULL, 0, 0))
+ if (pr0->set_rtp_peer(c0, NULL, NULL, NULL, 0))
ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c0->name);
}
if (c1->tech_pvt == pvt1) {
- if (pr1->set_rtp_peer(c1, NULL, NULL, 0, 0))
+ if (pr1->set_rtp_peer(c1, NULL, NULL, NULL, 0))
ast_log(LOG_WARNING, "Channel '%s' failed to break RTP bridge\n", c1->name);
}
return AST_BRIDGE_RETRY;
@@ -1659,10 +1661,8 @@
/* Now check if they have changed address */
ast_rtp_get_peer(p1, &t1);
ast_rtp_get_peer(p0, &t0);
- if (pr0->get_codec)
- codec0 = pr0->get_codec(c0);
- if (pr1->get_codec)
- codec1 = pr1->get_codec(c1);
+ codec0 = ast_codec_pref_bits(&c0->nativeformats);
+ codec1 = ast_codec_pref_bits(&c1->nativeformats);
if (vp1)
ast_rtp_get_peer(vp1, &vt1);
if (vp0)
@@ -1678,7 +1678,9 @@
ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n",
c1->name, ast_inet_ntoa(iabuf, sizeof(iabuf), vac1.sin_addr), ntohs(vac1.sin_port), oldcodec1);
}
- if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE)))
+ memcpy(&codecs1, &c1->nativeformats, sizeof(codecs1));
+ ast_codec_pref_append_missing2(&codecs1, ast_compatible_audio_formats(codecs1.audio_bits));
+ if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, &codecs1, ast_test_flag(p1, FLAG_NAT_ACTIVE)))
ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c0->name, c1->name);
memcpy(&ac1, &t1, sizeof(ac1));
memcpy(&vac1, &vt1, sizeof(vac1));
@@ -1691,7 +1693,9 @@
ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n",
c0->name, ast_inet_ntoa(iabuf, sizeof(iabuf), ac0.sin_addr), ntohs(ac0.sin_port), oldcodec0);
}
- if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE)))
+ memcpy(&codecs0, &c0->nativeformats, sizeof(codecs0));
+ ast_codec_pref_append_missing2(&codecs0, ast_compatible_audio_formats(codecs0.audio_bits));
+ if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, &codecs0, ast_test_flag(p0, FLAG_NAT_ACTIVE)))
ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c1->name, c0->name);
memcpy(&ac0, &t0, sizeof(ac0));
memcpy(&vac0, &vt0, sizeof(vac0));
--- translate.c.orig Sat Feb 25 21:54:40 2006
+++ ./translate.c Mon Oct 9 13:02:01 2006
@@ -89,6 +89,23 @@
return -1;
}
+void ast_translator_free_translations(struct ast_channel *chan)
+{
+ int x, y;
+ for (x = 0; x < MAX_FORMAT; ++x) {
+ for (y = 0; y < MAX_FORMAT; ++y) {
+ if (chan->readtrans_matrix[x][y]) {
+ ast_translator_free_path(chan->readtrans_matrix[x][y]);
+ chan->readtrans_matrix[x][y] = NULL;
+ }
+ if (chan->writetrans_matrix[x][y]) {
+ ast_translator_free_path(chan->writetrans_matrix[x][y]);
+ chan->writetrans_matrix[x][y] = NULL;
+ }
+ }
+ }
+}
+
void ast_translator_free_path(struct ast_trans_pvt *p)
{
struct ast_trans_pvt *pl, *pn;
@@ -152,6 +169,67 @@
return tmpr;
}
+struct ast_frame *ast_translate_read(struct ast_channel *chan, struct ast_frame *f, int consume)
+{
+ int dest_codec;
+ int dest_codec_idx;
+ int src_codec_idx;
+ struct ast_trans_pvt *trans;
+
+ chan->lastreadformat = f->subclass;
+ /* If the user perspective is this codec then do not translate */
+ if (chan->readformat & f->subclass) {
+ return f;
+ }
+ /* Otherwise translate into the user perspective codec */
+ dest_codec = chan->readformat;
+ dest_codec_idx = powerof(dest_codec);
+ src_codec_idx = powerof(f->subclass);
+ ast_mutex_lock(&chan->lock);
+ trans = chan->readtrans_matrix[src_codec_idx][dest_codec_idx];
+ if (NULL == trans) {
+ trans = ast_translator_build_path(dest_codec, f->subclass);
+ chan->readtrans_matrix[src_codec_idx][dest_codec_idx] = trans;
+ }
+ ast_mutex_unlock(&chan->lock);
+ if (trans)
+ f = ast_translate(trans, f, consume);
+ return f;
+}
+
+struct ast_frame *ast_translate_write(struct ast_channel *chan, struct ast_frame *f, int consume)
+{
+ int dest_codec;
+ int dest_codec_idx;
+ int src_codec_idx;
+ struct ast_trans_pvt *trans;
+ /* If channel supports this codec then do not translate */
+ if ((chan->nativeformats.audio_bits & f->subclass) &&
+ ((option_translation_algorithm == AST_TRANS_ALG_LOOSE) ||
+ (f->subclass & chan->lastreadformat)) ||
+ (chan->lastreadformat == NULL))
+ {
+ return f;
+ }
+ /*
+ * Use the codec that the UA is using currently
+ * (faxing does not work without this for example)
+ */
+ dest_codec = chan->lastreadformat;
+ dest_codec_idx = powerof(dest_codec);
+ src_codec_idx = powerof(f->subclass);
+ ast_mutex_lock(&chan->lock);
+ trans = chan->writetrans_matrix[src_codec_idx][dest_codec_idx];
+ if (NULL == trans) {
+ trans = ast_translator_build_path(dest_codec, f->subclass);
+ chan->writetrans_matrix[src_codec_idx][dest_codec_idx] = trans;
+ }
+ ast_mutex_unlock(&chan->lock);
+ if (trans)
+ f = ast_translate(trans, f, consume);
+ return f;
+}
+
struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f, int consume)
{
struct ast_trans_pvt *p;
@@ -506,4 +584,26 @@
}
return best;
+}
+
+int ast_compatible_audio_formats(int formats)
+{
+ int retval = formats;
+ int x, y;
+
+ for (x = 0; x < MAX_FORMAT; ++x)
+ {
+ if ((1 << x) & formats)
+ {
+ for (y = 0; y < MAX_FORMAT; ++y)
+ {
+ if (tr_matrix[x][y].step)
+ {
+ retval |= (1 << y);
+ }
+ }
+ }
+ }
+ return retval;
+
}
--- patch-zzz-asterisk-1.2.16.1-codec-negotiation-20070319 ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list