AppKonference is a fork of AppConference. It comprises a set of enhancements
needed to migrate a MeetMe application to AppConference.  The goals of this
project are scalability and stability focused on voice.

Here's the url to the AppKonference sourceforge site:
	http://sourceforge.net/projects/appkonference/

You can check out the code for the AppKonference project using subversion:
	svn co https://appkonference.svn.sourceforge.net/svnroot/appkonference

Here is a brief summary of the changes to AppConference:

Added commands to mute/unmute a conference, increase/decrease conference
volume, increase/decrease member volume, and start/stop moh for a member.

Changed play sound command so that more than one sound can be entered on
the command line.

Added conference parameter, max_users, that limits conference members to a user
specified maximum.

Added channel variable, KONFERENCE, which is set to MAXUSERS or KICKED after
exiting the application so that the reason for leaving a conference can be
determined in the dial plan.

Added application, KonferenceCount, was so that the member count can be used in
the dial plan.

Added new AMI event messages for mute status: ConferenceMemberMute,
ConferenceMemberUnmute, ConferenceMute, and ConferenceUnmute.

Added conference flags to ConferenceDTMF, ConferenceJoin, ConferenceState, and
ConferenceLeave AMI event messages.

Added "x" option so that when a moderator leaves callers get kicked.

Added "a" option which sets vad and telephone flags on conference entry.

Changed formatting of conference list command to include new listening
state and did some rearrangement so that the channel name is displayed without
truncation.

Fixes for locking: First, fixed the conference thread so that the
conference list lock is only locked when it's required. Second, changed the
conference mutex to a rdlock for greater concurrency. Third, changed the way
sounds are handled so the member lock is not held over calls to asterisk
procedures.

Fixes for compiling with asterisk 1.6 and ifdef'ing out video and/or text
and/or dtmf. The default is voice only. To compile with video, text, and dtmf
change the defaults in the Makefile or specify them on the command line: make
VIDEO=1 TEXT=1 DTMF=1. 

Added an examples directory for a simple AMI based application and web site.

Changed find_member so that members are located via a hash table rather than a
sequential search through the conference and member lists.  The size of the
table is configurable via the Makefile and the default is 997 buckets.  To
change the default table size either edit the Makefile default or specify the
value on the command line: make CHANNEL_TABLE_SIZE=1009.  Table entries are
list heads and chaining is used to resolve collisions so that the number of
entries is not limited to the number of buckets in the table.  A bucket field
is added to the conference list command output so that a channel name can be
correlated with its hash table entry.

Changed add_member and remove_member for voice so that adding or removing a
member control block is O(1).  Specifically, the allocation of member id's is
changed to work like MeetMe, that is, the member id list is ordered, new
entries are placed at the end of the list, and the next member id  allocated is
the highest active id (the entry at the end of the list) plus one.  Further,
member control blocks are doubly linked so that removing a block doesn't
require running the list to find the back pointer required to update the member
list.

Changed conference_kickchannel, dropping the conference name argument, so that
its signature is consistent with the other commands which refer to a member by
channel name.

Added conference parameter, type, that can be used to partition users into
groups within a conference which can be managed differently via the AMI. The
ConferenceJoin, ConferenceLeave, and ConferenceDTMF events are updated to
include the new type field.

Added command to display the conference version number. The version number is
either the AppKonference release number or the subversion revision number if the
code was checked out from the AppKonference repository.

Fix to bump the conference thread's priority and change its scheduling
algorithm to fifo when asterisk is started realtime with the "-p" option.

Added conference parameter, spy, which specifies a conference member channel
name, the spyee. When a conference is entered in spy mode, the spyer receives
voice only from the spyee.  If unmuted, the spyer can whisper to the spyee,
that is, spyer voice is mixed with conference voice and sent to the spyee.
Note that this initial implementation limits one spyer per spyee and a spyer
can not be a spyee.

Added a new field, spy, to the conference list command output. The spy
field is the id of the spyee if the member is a spyer; otherwise, the asterisk
character is used to indicate the member is not a spyer.

Changed the application argument delimiter from the forward slash, "/", to the
comma character, ",", to simplify parsing of channel name parameters and to be
consistent with other asterisk applications.

Added "H" option which enables "music on hold" if there is only one member in
the conference.

Added an optional parameter, nohangup, to the conference end command so that
dial plan isn't terminated when the conference ends.

Added a directory to examples for munin plugins to graph conference and member
counts. 

Documented KonferenceCount application in Dialplan.txt.

Fix the play sound command so that it plays the input sound in the language
specified via the channel function or the default language if the langauge is
not set.

Fix to check the file descriptor is not the generator descriptor when the
member thread reads its channel. This is required since music on hold was added
because two threads now read the same channel when that channel is put on hold.

Fix some memory leaks found after reviewing the code: free the channel_table
when the module is unloaded; free zeta when the speex dsp is destroyed; destroy
member mutex and condition variable when the member is deleted; free last
cached frame and out packer control block when the member is deleted; destroy
conference mutex when the conference is deleted; and, finally, in process
outgoing frames, free the conference frame before checking for a soft hangup.

Added a new option to the play sound command for exit and entrance tones. The
new option, tone, plays a sound if and only if the soundq is empty so that
entrance and exit tones don't run together.

Add support for the high def audio codec g722. This feature requires asterisk
1.6 and is configurable via the Makefile variable AC_USE_G722. The default
value is undefined, that is, the g722 codec is not available.

Changed the thread model so that one thread mixes all the conferences. The
advantage of this approach to mixing is that it eliminates conflicts between
conference threads and it also reduces the load on the scheduler when there are
many active conferences.

Changed find_conf so that conferences are located via a hash table rather than
a sequential search through the conference list.  The size of the table is
configurable via the Makefile and the default is 199 buckets.  To change the
default table size either edit the Makefile default or specify the value on the
command line: make CONFERENCE_TABLE_SIZE=251.  Table entries are list heads and
chaining is used to resolve collisions so that the number of entries is not
limited to the number of buckets in the table.  A bucket field is added to the
conference list command output so that a conference name can be correlated with
its hash table entry.

Changed preprocessor flag, APP_KONFERENCE_DEBUG, so that debug logging is
enabled only if it's defined. To enable debug logging: edit the Makefile or
set it on the command line: make APP_KONFERENCE_DEBUG=1.

Removed channel and conference name strings from the member control block. The
former can be referenced via the channel pointer in the member control block.
The latter can be referenced via a pointer to conference control block which
was added to the member contol block for this purpose.

Changed the conference state event implementation so that speaking/silent
notifications are generated in the member thread. The advantage of this
approach is that it doesn't require the conference thread to periodically
scan the member list for member state changes.

Changed "x" option so that all members are kicked and the conference ends when
the last moderator leaves the conference.

Added a Makefile variable AC_USE_SPEEX. The default value is undefined, that
is, the SPEEX codec is not available.

Changed the format of the conference list command. Specifically, removed the
bucket field and added a duration field. The duration field indicates either
the conference elapsed time when conferences are listed or the member elapsed
time when members are listed.
