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.

Deprecated management commands KonferenceList and KonferenceEnd as similar
functions are available from the command line and via the AMI command action.

Deprecated input smoothing and output packing because packet size is fixed at
20 milliseconds so these functions are unnecessary.

Added a compiler flag, CACHE_CONTROL_BLOCKS, for conference and member block
reuse. To disable control block reuse edit the Makefile or clear it on the
command line: make CACHE_CONTROL_BLOCKS=0.

Changed the conference event privilege to user to reduce the number of events
an application has to monitor to support a conference.

Fix for compiling module with Asterisk 1.8. This fix is compatible with prior
Asterisk releases 1.4 and 1.6.

Deleted the RCS identifiers at the top of the module files because we're using
subversion. Deleted the TODO file since it's not being used to track future
enhancements. Fixed the Makefile clean target so that the module shared object
gets deleted with the other object files and deleted the distclean target.
Fixed the Makefile so that the module is compiled whenever an include file is
modified.

Changed the frame mixing algorithm to reduce calls to the buffer mixing
routine: First, the new algorithm loops over the input frames to create a mix
buffer for listeners. Then, speaker buffers are created by subtracting their
voice from the listener buffer. As a result, frame mixing is O(n) with respect
to invocations of the mix buffer routine which should be a considerable
improvement.

Changed the frame queueing routines for both speakers and listeners so they are
more efficient.  Specifically, the sequential search through the send frame
list to find the frame to queue to the input member is replaced with a fetch of
the appropriate frame pointer from either the member control block for speakers
or the conference control block for listeners. These pointers are steup when
the spoken frames are processed in the conference thread loop. 

Changed the frame mixing routines to use SIMD instructions for processing
samples which should be much more efficient than processing the samples
serially.

Fixed some compiler warnings by changing the Makefile to set the asterisk
version in a preprocessor flag and changed the source so that code is generated
for the for the appropriate asterisk version. The asterisk version can by
setting the new source directory variable on the command line: make
ASTERISK_SRC_DIRECTORY or by modifying the variable in the Makefile.

Added a compiler flag, VECTORS, that indicates gcc extensions for vector
operations are to be used for mixing frames. Modify the makefile to enable this
feature. 

Remove video features from conference module because we're only interested in
voice and video degrades voice performance.

Changed the code to use the c language idiom for conditionals testing pointers.

Changed the code to use the asterisk memory allocation routines rather than the
c library routines directly.

Reuse speaker and listener mix buffers. This should be more efficient than
allocating/freeing them every time voice frames are mixed.

Remove unnecessary calls to ast_frdup from queue frame for speaker and queue
frame for speaker routines.

Remove unnecessary calls to ast_frdup from frame mixing routines.

Remove dtmf forwarding as this feature was required for video and video is no
longer supported.

Reuse asterisk frames used for speaker and listener mix buffers.

Reuse conference frames used for speaker and listener mix buffers.

Typedef conference control blocks, conference frame header and soundq header.

Remove unused silence detection defines and cleanup member control block
silence detection definitions.

Remove unnecessary last frame cache code from conference thread's get incoming
frame routine.

Added another library for silence detection. The new library is enabled by
setting the silence detection compiler flag, SILDET, to one. The new library is
the default setting and the old library is deprecated.

Added a scoreboard for member speaking/silent state changes.  The scoreboard is
enabled by setting a two compiler flags: SPEAKER_SCOREBOARD and
CACHE_CONTROL_BLOCKS.  Member speaking/silent state change events are not
queued to the manager when the scoreboard is enabled. By default,
speaking/silent events are enabled and the scoreboard is disabled.
