mod_conference
About
mod_conference provides both inbound and outbound conference bridge service for FreeSWITCH™. It can process multiple bit rates, load various profiles that specify DTMF controls, play prompt sounds and tones, and many other functions. You can create as many conferences as you like, as long as there still are free system resources (i.e. memory, CPU power, network bandwidth) available.
Conferences created in the dialplan use profiles that are defined in conf/autoload_configs/conference.conf.xml, if you are using the standard configuration files.
Conference Configuration
Conference configuration settings are stored in conf/autoload_configs/conference.conf.xml
Community member Stanislav Sinyagin has posted a nice personal blog entry on how he configured his conference bridge.
The configuration has the following structure, each "[... config here ...]
" should be replaced with specific configuration statements as detailed in the sections that follow.
conference.conf.xml
<configuration name="conference.conf" description="Standard Conference configuration">
<advertise>
[... config here ...]
</advertise>
<caller-controls>
<group name="default">
[... config here ...]
</group>
</caller-controls>
<chat-permissions>
<profile name="default">
[... config here ...]
</profile>
</chat-permissions>
<profiles>
<profile name="default">
[... config here ...]
</profile>
</profiles>
</configuration>
advertise
This block specifies whether empty conferences should be advertised in presence, allowing you to see status of empty conferences. Any endpoint that supports presence, such as mod_sofia, can subscribe to these presence notifications.
Example configuration
<advertise>
<room name="888@$${subdomain}" status="FreeSWITCH"/>
</advertise>
The conference name (888 in this case) should be the profile name that you specified in <profiles> section, $${subdomain} will be replaced with the subdomain that you specified in freeswitch.xml.
"status" is advertised as whatever you pass to it (identifier) or "Available" if none is passed.
Example 'advertise' Event via mod_event_multicast
Advertise event
proto: conf
login: 888@example.com
from: 888@example.com
status: FreeSWITCH
rpid: idle
event_type: presence
Event-Name: PRESENCE_IN
Core-UUID: c76e2d7d-39d7-dc11-93bf-0090fb0792c6
FreeSWITCH-Hostname: example.com
FreeSWITCH-IPv4: 192.168.1.5
FreeSWITCH-IPv6: 127.0.0.1
Event-Date-Local: 2008-02-09 13:04:44
Event-Date-GMT: Sat, 09 Feb 2008 18:04:44 GMT
Event-Date-timestamp: 1202580284348009
Event-Calling-File: mod_conference.c
Event-Calling-Function: send_presence
Event-Calling-Line-Number: 5037
Multicast-Sender: example.com
caller-controls
Caller controls are used to modify the state of the conference, such as lowering the volume, mute a participant, and such. Below are the commands that can be assigned to digits and executed during a conference. The "moderator-controls" group provides additional controls for participants who enter the conference with the moderator flag set. See below.
Reserved Control Group Names
Name | Description |
---|---|
none | Use this name to prevent installing caller-controls for callers to a conference. |
default | This group of settings will be assigned if no "caller-controls" is specified. You can also assign it explicitly. This group is defined in vanilla config, thus removing it from the configurations will make no caller controls at all. |
Actions
Each of these actions can be configured in caller-controls to be invoked by a conference member who enters the conference with this caller-controls group. These are instances of the conference API.
Action | Description | Min. Version |
---|---|---|
mute | Toggle audio from this member into the conference | |
mute on | Disable audio from this member into the conference | |
mute off | Enable audio from this member into the conference | |
deaf mute | Block audio from conference to this member as well as mute, in one action | |
energy up | Increase minimum energy threshold by 1 unit above which sound will be admitted into conference (noise gate) | |
energy equ | Reset minimum energy threshold to default | |
energy dn | Decrease minimum energy threshold by 1 unit | |
vol talk up | Increase member talk (mic) volume into conference by 1 unit | |
vol talk zero | Reset talk volume to default setting | |
vol talk dn | Decrease talk volume by 1 unit | |
vol listen up | Increase member receive (earpiece) volume by 1 unit | |
vol listen zero | Reset member receive volume to default setting | |
vol listen dn | Decrease member receive volume by 1 unit | |
hangup | Leave the conference | |
event | Send the DTMF event via CUSTOM conference::maintenance subclass to the event system (even to event socket) | |
lock | Toggle the conference lock state (no new members can enter when locked) | |
transfer | Transfer member to a given extension in a dialplan context | |
execute_application | Execute a dialplan application | |
floor | Toggle yourself on and off of talking floor, as long as no one else has floor status. | |
vid-floor | Video floor. If video floor is currently locked, it will revert to auto; if there is no current holder, you become video floor holder | 1.6 |
vid-floor-force | Video floor. If video floor is currently locked, it will revert to auto, otherwise you become the locked video floor holder | 1.6 |
vmute | Video mute. Toggle video from this member into the conference | 1.6 |
vmute on | Disable video from this member into the conference | 1.6 |
vmute off | Enable video from this member into the conference | 1.6 |
vmute snap | Take a video snapshot for this user to be used when in vmute | 1.6 |
vmute snapoff | Discard the vmute video snapshot | 1.6 |
Default controls
<group name="default">
<control action="vol talk dn" digits="1"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk up" digits="3"/>
<control action="vol listen dn" digits="4"/>
<control action="vol listen zero" digits="5"/>
<control action="vol listen up" digits="6"/>
<control action="energy dn" digits="7"/>
<control action="energy equ" digits="8"/>
<control action="energy up" digits="9"/>
<control action="mute" digits="0"/>
<control action="deaf mute" digits="*"/>
<control action="hangup" digits="#"/>
</group>
Example Configuration
<caller-controls>
<group name="somekeys">
<control action="vol talk dn" digits="1"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk up" digits="3"/>
<control action="transfer" digits="5" data="100 XML default"/>
<control action="execute_application" digits="0" data="playback conf_help.wav"/>
<control action="execute_application" digits="#" data="execute_dialplan conference-menu"/>
</group>
</caller-controls>
Limitations
Be aware that the caller-controls are applied across the entire conference session. You cannot apply one group of caller-controls to one member and then a second group of caller-controls to a second member in the same conference session.
chat-permissions
The FreeSWITCH conference also provides limited chat capabilities via SIP, XMPP, and Verto.
A conference can be controlled through chat. This profile exists as part of the conference entity so you can have multiple profiles to limit access. When the conference advertises its presence (above) to a chat server, anyone on a federated server can talk to it and issue commands by typing messages via their favorite chat client (even if that is another FreeSWITCH™ box). To send commands to ConferenceA, from your jabber client send a message to conf+ConferenceA@freeswitch.mydomain.com
As of revision 3789 all commands except "list" have been disabled "until there is security"
Another Note: After spending much time trying to get control of mod_conference via Openfire XMPP server, asked around, and "bougyman" suggested that XMPP muc functionality is very limited as of January 2012.
Here is an example configuration
chat-permissions example
<configuration name="conference.conf" description="Audio Conference">
<profiles>
<profile name="default">
<param name="chat-permissions" value="default"/>
</profile>
</profiles>
<chat-permissions>
<profile name="default">
<!-- both of these users have a functionally equivalent capability set -->
<user name="bob@somewhere.com" commands="all"/>
<!-- individually specified commands must be enclosed with the | (pipe) character -->
<user name="harry@elsewhere.com" commands="|deaf|dial|energy|kick|list|lock|mute|norecord|play|record|relate|say|saymember|stop|transfer|undeaf|unlock|unmute|volume_in|volume_out|"/>
</profile>
</chat-permissions>
</configuration>
profiles
You can specify a number of different profiles in the profiles section, these will let you easily apply a number of settings to a conference. Please note that the profiles are not conference rooms, but define settings that are later applied to conference rooms. The dialplan section in this document will describe how you create conference rooms and apply these profile settings.
profiles structure
<profiles>
<profile name="default">
<param name="paramName" value="paramValue"/>
</profile>
</profiles>
You can have any number of <profile> tags, and each <profile> can have any number of <param> tags up to the entire set of parameters.
Conference Profile Parameters
You may specify the conference profile parameters listed below. Keep in mind that if TTS is enabled all audio-file params beginning with 'say:' will be considered text to say with TTS. A TTS module must be loaded by FreeSWITCH for this to work.
Name | Description | Example value | Allowed value | Default value | Played for | Min. Version |
---|---|---|---|---|---|---|
announce-count | Requires TTS. If the number of members equals or exceeds this value, the conference will speak the count to the conference after a new member joins | 5 | <integer> | 0 | ||
auto-gain-level | Enables Automatic Gain Control (AGC). If the parameter is set to 'true', then the default AGC value is used. If set to a number it will override the default value | 900 | <integer>|true | 1100 | ||
auto-record | Set a filename or stream value for this parameter in order to enable recording every conference call. Within mod_conference there is a special parameter named ${conference_name} that can be used to form the record filename. All channel variables are accessible as well for generating a unique filename. NOTE: auto-record doesn't begin recording until the number of conferees specified in min-required-recording-participants have joined. | Example 1: /var/myNFSshare/${conference_name}_${strftime(%Y-%m-%d-%H-%M-%S)}.wavExample 2: <shout://user:pass@server.com/live.mp3>Example 3: /var/myNFSshare/${conference_name}_${strftime(%Y-%m-%d-%H-%M-%S)}.mp4 will give you audio and video recording. | <file-path> | |||
broadcast-chat-message | Message to send in response to chat messages. | Please go away. | <string> | |||
caller-controls | Name of the caller control group to use for this profile. It must be one of those specified in the <caller-controls> section | somekeys | <control-name> | default | ||
moderator-controls | Name of the moderator control group to use for this profile. It must be one of those specified in the <caller-controls> section | somekeys | <control-name> | default | ||
cdr-log-dir | Target directory for conference CDRs to be written. Use "auto" to store in $PREFIX/log/conference_cdr. An absolute path is acceptable as is a relative path. A relative path will yield $PREFIX/log/<value> for the conference CDR directory | auto | <path>|auto | |||
cdr-event-mode | Include full cdr or path to file in conference cdr event | content | content|file | none | ||
caller-id-name | Default Caller ID Name for outbound calls originated by mod_conference | FreeSWITCH | <string> | conference | ||
caller-id-number | Default Caller ID Number for outbound calls originated by mod_conference | 8777423583 | <string> | 0000000000 | ||
channels | The number of audio channels. Special value "auto" sets this based on the channels of the first member to enter | 1 | 1|2 | auto | 1 | |
comfort-noise | Sets the volume level of background white noise to add to the conference. Special value "true" sets to default value. 0 for no CN (total silence). | 1400 | 0-10000|true | 1400 | ||
conference-flags | Can be any combination of allowed values separated by "|" (pipe character). | wait-mod|audio-always | See Table Conference Flags below | |||
description | Description of the conference that is included in some events | The main conference | <string> | |||
domain | The domain name used for presence events from conferences | $${domain} | <string> | |||
energy-level | Noise gate. Energy level required for audio to be sent to the other users. The energy level is a minimum threshold of 'voice energy' that must be present before audio is bridged into the conference. Useful if a participant is in a noisy environment, so their background noise is heard only when they speak. 0 disables the noise gate and will bridge all packets even if they are only background noise. | 300 | 0-1800 | |||
interval | Number of milliseconds per frame. Which may be different from ptime in SIP SDP, or driver with TDM. Higher numbers require less CPU but can degrade conversation quality, so experimentation with your setup is best. The default is good for conversation quality. Special "auto" value sets interval based on interval of the first member who enters. | 20 | 10-120 (only if divisible by 10) or auto | |||
max-members | Sets a maximum number of participants in conferences with this setting in its profile. | 20 | Integer > 1 | |||
member-flags | Can be any combination of allowed values separated by "|". See table below for descriptions. | nomoh|mute | See Table Member Flags below | |||
pin | Pin code that must be entered before user is allowed to enter the conference. | 12345 | <sritng> | |||
moderator-pin | Pin code that must be entered before moderator is allowed to enter the conference. | 12345 | <string> | |||
pin-retries | Max number of times the user or moderator will be asked for PIN | 3 | <integer> >= 0 | 3 | ||
rate | Audio sample rate. Special value "auto" sets this based on the rate of the first member to enter. | 8000 | 8000, 12000, 16000, 24000, 32000, 44100, 48000, auto | |||
sound-prefix | Set a default path here so you can use relative paths in the other sound params. | /soundfiles | <path-string> | |||
suppress-events | For use with the event socket. This parameter is a comma delimited string that specifies which events will NOT be sent to the socket when getting CUSTOM conference::maintenance events. | del-member,start-talking,stop-talking | See Table Conference Events below | |||
terminate-on-silence | Specifies the number of contiguous seconds of silence after which the conference will automatically terminate and disconnect all members. | 300 | <integer> > 0 | |||
timer-name | Name of the timer interface in freeswitch to use for timing the conference | soft | <timer-name> | soft | ||
tts-engine | Text-To-Speech (TTS) Engine to use | cepstral | <tts-name> | |||
tts-voice | TTS Voice to use | david | <tts-voice> | |||
verbose-events | Events related to the conference will send more data. Specifically the events related to members will include all the channel variables on each event | true | true|false | false | ||
alone-sound | File to play if you are alone in the conference | yactopitc.wav | <sound-path> | User | ||
bad-pin-sound | File to play to when the pin is invalid | invalid-pin.wav | <sound-path> | User | ||
enter-sound | File to play when you join the conference | welcome.wav | <sound-path> | All | ||
exit-sound | File to play when you leave the conference | exit.wav | <sound-path> | All | ||
is-locked-sound | File to play when the conference is locked during the call to the members in the conference | is-locked.wav | <sound-path> | All | ||
is-unlocked-sound | File to play when the conference is unlocked during the call | is-unlocked.wav | <sound-path> | All | ||
join-only-sound | File to play when member with join-only flag tries to create the conference (join as the first). | no_reources_try_later.wav | <sound-path> | User | ||
kicked-sound | File to play when you are kicked from the conference | kicked.wav | <sound-path> | User | ||
locked-sound | File to play when the conference is locked and someone goes to join | locked.wav | <sound-path> | All | ||
max-members-sound | If max-members has been reached, this sound plays instead of allowing new users to the conference | max-members.wav | <sound-path> | Caller | ||
moh-sound | the given sound file/resource will be played only when the conference size is 1 member. It will loop over and over until the member count is 2 or more. When the conference goes back to 1 member it will play again | idlemusic.wav | <sound-path> | All | ||
muted-sound | File to play when member is muted | muted.wav | <sound-path> | User | ||
mute-detect-sound | If the mute-detect member-flag has been set, this sound plays when the user talks while muted | mute-detect.wav | <sound-path> | User | ||
perpetual-sound | The given sound file/resource will be played on a loop forever. This can be used to broadcast sales or emergency messages to callers. | announcement.wav | <sound-path> | All | ||
pin-sound | File to prompt the user to enter the conference pin code. | pin.wav | <sound-path> | User | ||
unmuted-sound | File to play when member is unmuted. | unmuted.wav | <sound-path> | User | ||
ivr-dtmf-timeout | Inter-digit timeout between DTMF digits in milliseconds | 500 | <integer> >= 500 | 500 | ||
ivr-input-timeout | Time to wait for the first DTMF in milliseconds, zero = forever | 0 | <integer> >= 5000 or 0 | 0 | ||
endconf-grace-time | Defines how much time all members have before the conference is terminated when the last member with endconf leaves in seconds | 600 | <integer> >= 0 | 0 | ||
min-required-recording-participants | Minimum number of conference participants required for their audio to be heard in a recording and for auto recording to start. This can be either 1 (the default) or 2. | 1 | 1-2 | 1 | ||
outcall-templ | Template to use for outcall URL | <string> | ||||
video-mode | The mode to run video conferencing in. passthrough is non transcoded video follow audio. transcode allows for better switching and multiple codecs. mux allows for multiple parties on the video canvas at the same time | mux | muxtranscodepassthrough | passthrough | 1.6 | |
video-layout-name | The layout name from conference_layouts.conf.xml or group prefixed by "group:". Setting this setting will enable the video mux. Not setting this will switch video presentation based on floor. | group:grid2x2 | <layout-name> or group:<group-name> | 1.6 | ||
video-canvas-bgcolor | Overall Canvas color for video mux canvas as an HTML HEX color code | #333333 | <color-spec> | #333333 | 1.6 | |
video-letterbox-bgcolor | Color to use for bars on the caller video if their aspect ratio doesn’t fit the member square in the layout as an HTML HEX color code | #FFFFFF | <color-spec> | #000000 | 1.6 | |
video-canvas-size | Pixel dimensions of the video mux canvas | 800x600 | <integer>x<integer> | 1.6 | ||
video-fps | Frames per second to run the video mux at | 15 | <integer> | 15 | 1.6 | |
video-codec-bandwidth | The bandwidth maximum for the conference output video stream, This setting can be auto, our defined in KB (kilobytes), mb (megabits) or MB (megabytes) | 1MB | auto|<integer>KB | <integer>mb | <integer>MB | |
video-no-video-avatar | Path to PNG file for member without video to display. | 1.6 | ||||
video-canvas-count | Number of canvases to use in mux mode | 1 | 1-5 | 1 | 1.6 | |
video-quality | Motion factor of the video, this is used to adjust the video bitrate. From 1 to 4, low motion to high motion video. (ref. Kush Gauge formula for determining bitrate). | 1 | 1-4 | 1 | 1.6 | |
video-border-color | Border color around each video feed | #FFFFFF | <color-spec> | #000000 | 1.6 | |
video-border-size | Border size (in pixels) around each video feed | 5 | <integer> 0-50 | 0 | 1.6 | |
video-mute-banner | Sets the video mute banner text, font, font size, font color, and background color for the member. font_scale valid values 5-50, fg/bg hex color code, all settings besides text are optional. | {font_face=/path/to/font.ttf,font_scale=5,bg=#000000,fg=#FFFFFF}VIDEO MUTED"/> | 1.6 | |||
video-super-canvas-bgcolor | Background color of the supercanvas | #FFFFFF | <color-spec> | #068DF3 | 1.6 | |
video-super-canvas-label-layers | Label canvases in supercanvas | true | Boolean | false | 1.6 | |
video-super-canvas-show-all-layers | Display all canvases, even empty ones | true | Boolean | false | 1.6 | |
video-auto-floor-msec | Milliseconds of speaking before a speaker gets the floor | 800 | Integer >= 0 | 0 | 1.6 | |
video-kps-debounce | Milliseconds between sending packets to the client to request a client bitrate adjustment (video only). Note that FreeSWITCH may decide to force sending more frequently under certain circumstances. | 30000 | Integer >= 0 | 30000 | 1.6 | |
auto-record-canvas-id | Which canvas on the supercanvas to auto record, (range is the ) | 2 | Integer 1 - # of canvases | 1 | 1.6 | |
video-layout-conf | Specify an alternate conference layout config file. | custom_conference_layouts.conf | conference_layouts.conf | 1.8 |
Table: Member Flags
These flags can be applied to individual conferees when entering the conference to control what they can do and how their media is processed.
Member Flag | Description | Min. Version |
---|---|---|
mute | Enter conference muted | |
deaf | Enter conference deafed (can not hear conference); will also mute the mic | |
mute-detect | Play the mute_detect_sound when talking detected by this conferee while muted | |
dist-dtmf | Send any DTMF from this member to all participants | |
moderator | Flag member as a moderator | |
nomoh | Disable music on hold when this member is the only member in the conference | |
endconf | Ends conference when all members with this flag leave the conference after profile param endconf-grace-time has expired | |
mintwo | End conference when it drops below 2 participants after a member enters with this flag | |
ghost | Do not count member in conference tally | |
join-only | Only allow joining a conference that already exists | |
positional | Process this member for positional audio on stereo outputs | 1.4 |
no-positional | Do not process this member for positional audio on stereo outputs | 1.4 |
join-vid-floor | Locks member as the video floor holder | 1.6 |
no-minimize-encoding | Bypass the video transcode minimizer and encode the video individually for this member | 1.6 |
vmute | Enter conference video muted | 1.6 |
second-screen | Open a 'view only' connection to the conference, without impacting the conference count or data. | 1.6 |
Table: Conference Flags
These flags control the operation of the conference session and apply to all members.
Conference Flag | Description | Min. Version |
---|---|---|
wait-mod | Members will wait (with music) until a member with the 'moderator' flag set enters the conference | 1.0 |
audio-always | Do not use energy detection to choose which participants to mix; instead always mix audio from all members | 1.2 |
restart-auto-record | If the auto-record conference param is set, and recording is stopped, auto recording will continue in a new file | 1.2.16 |
rfc-4579 | Enable support for RFC-4579 SIP–based call control for conferences | 1.4 |
livearray-sync | Add support for livearray advertisement for the conference status | 1.4 |
auto-3d-position | Enable 3d positioned audio support | 1.4 |
json-events | Send event-channel JSON events when members enter and leave | 1.4 |
video-floor-only | Only video members can get floor. REMOVED in 1.6 | 1.4 |
minimize-video-encoding | Use a single video encoder per output codec | 1.6 |
livearray-json-status | Machine parseable version of display for conference live array. Example: {"audio":{"muted":false,"onHold":false,"talking":true,"floor":true,"energyScore":639},"video":{"avatarPresented":false,"mediaFlow":"sendRecv","muted":false,"floor":true,"reservationID":null,"videoLayerID":0}} | 1.6 |
video-bridge-first-two | In mux mode, If there are only 2 people in conference, you will see only the other member | 1.6 |
video-muxing-personal-canvas | In mux mode, each member will get their own canvas and they will not see themselves | 1.6 |
video-required-for-canvas | Only video participants will be shown on the canvas (no avatars) | 1.6 |
video-mute-exit-canvas | Don't display video muted users on the canvas | 1.6 |
manage-inbound-video-bitrate | If calling client supports TMMBR, on each change of layout position FreeSWITCH will instruct the client to increase/reduce the video bit rate appropriately. | 1.6 |
Table: Conference Events
These events are available to event consumers.
Event Name | Description |
---|---|
add-member | Member added to a conference |
del-member | Member removed from a conference |
energy-level | Conference default energy level changed |
volume-level | Conference default volume level changed |
gain-level | Conference default gain level changed |
dtmf | Key bound to transfer, event, or execute_application is hit by member |
stop-talking | Member stopped talking (as detected by energy level) |
start-talking | Member started talking (as detected by energy level) |
mute-detect | Detected member speaking (as detected by energy level) while muted |
mute-member | Member became muted |
unmute-member | Member became unmuted |
kick-member | Member kicked |
dtmf-member | Key bound to DTMF is hit by member |
energy-level-member | Member energy level changed |
volume-in-member | Member gain level changed |
volume-out-member | Member volume level changed |
play-file | Conference–level play file started |
play-file-done | Conference–level play file ended |
play-file-member | Member–level play file started |
lock | Conference locked, no one else can enter |
unlock | Conference unlocked |
transfer | Member transferred to another conference |
bgdial-result | Result from bgdial API command |
floor-change | Conference floor changed |
record | Conference recording started or stopped |
Conference Dialplan Application
The conference dialplan application is used to create conferences and to bind a profile to them.
Syntax
<action application="conference" data="confname[@profile][+[pin][+flags{mute|deaf|...}]">
<action application="conference" data="bridge:confname[@profile]:none|endpoint[+flags{mute|deaf|...}]">
The first time a conference name (confname) is used, it will be created on demand, and the pin will be set to what ever is specified at that time: the pin in the data string if specified, or if not, the "pin" setting in the conference profile, and if that is also unspecified, then there is no pin protection. Any later attempt to join the conference must specify the same pin number, if one existed when it was created.
"profile" should be one of those specified in the conference configuration, or "default".
If the data value starts with "bridge:
" then it is a bridging conference. The conference name should not be already in use. You can specify the special literal value of "_uuid_" for the conference name, and a a session-specific unique id will be generated for you.
Conferences stay alive until the number of members falls below the minimum. The minimum for bridging conferences is 2, and for other dynamically created conferences is 1.
Dialplan Examples
Action data= | Description |
---|---|
confname | profile is "default", no flags or pin |
confname+1234 | profile is "default", pin is 1234 |
confname@profilename+1234 | profile is "profilename", pin=1234, no flags |
confname+1234+flags{mute} | profile is "default", pin=1234, one flag |
confname++flags{endconf|moderator} | profile is "default", no p.i.n., multiple flags |
bridge:confname:1000@${domain_name} | a "bridging" conference, you must provide another endpoint, or 'none'. |
bridge:_uuid_:none | a "bridging" conference with UUID assigned as conference name |
*Note that while some parameters are optional, their order is very important |
Simple Dialplan Example
<action application="conference" data="meeting@mykeys">
Bridging conference example that plays ringback while other party is bridged in
<extension name="test_bridging_conference">
<condition field="destination_number" expression="^(3000)$">
<action application="answer"/>
<action application="playback" data="connecting_your_call.wav"/>
<action application="set" data="ringback=${us-ring}"/>
<action application="conference" data="bridge:$1-${domain_name}@default:user/1000@${domain_name}"/>
</condition>
</extension>
Adding Callers From Within The Conference With DTMF
By combining several elements — the dialplan, API calls, bind_digit_action — you can create a simple system for a caller to add another user to the conference. See Conference_Add_Call_Example for the code and explanation.
Announcing Caller Count While In Conference
See Conference Announce Count Inline for a simple example of how to allow a caller to hear an announcement of how many members are in the conference.
Propagate Out-of-Band DTMF to Conference Members
By default, out-of-band DTMF signals (RFC 2833?) are absorbed by the conference. However, there are two ways to accomplish this:
-
Set the dist-dtmf member flag in the conference configuration XML, eg: <param name="member-flags" value="dist-dtmf"/> With this parameter set, all of the caller controls such as modifying volume will be disabled and DTMF will simply pass through to all other members of the conference.
-
There is also an API call that will allow your application to send DTMF to a single conference member or all members:
<confname> dtmf-string <[member_id|all|last]> <digits>
Prompt for Name
Dialplan to prompt callers to speak their names before joining the conference and announce their name to other participants.
Speak name
<extension name="Record Name and schedule conf announce">
<condition field="destination_number" expression="^55(3\d\d\d)$">
<action application="answer"/>
<action application="set" data="namefile=/tmp/${uuid}-name.wav" inline="true"/>
<action application="sleep" data="1000"/>>
<action application="playback" data="voicemail/vm-record_name1.wav"/>
<action application="playback" data="tone_stream://%(1000,0,500)"/>
<action application="record" data="${namefile} 1"/>
<action application="playback" data="ivr/ivr-call_being_transferred.wav"/>
<action application="set" data="res=${sched_api +1 none conference $1-${domain} play file_string://${namefile}!conference/conf-has_joined.wav}"/>
<action application="transfer" data="$1 XML default"/>
</condition>
</extension>
API Reference
Command | Description | Syntax | Examples | Min. Version |
---|---|---|---|---|
agc | Adjust conference automatic gain control. | conference <confname> agc [on [<level>] | off] | Query level: conference testconf agcDisable: conference testconf agc offEnable: conference testconf agc onEnable w/ level: conference testconf agc on 1120 | |
bgdial | Background dial a destination via a specific endpoint | conference <confname> bgdial <dial-string> [<callerid_number> [<callerid_name>]] | ||
chkrecord | Query record status of conference | conference <confname> chkrecord | ||
deaf | Make a conference member deaf | conference <confname> deaf <member_id>|all | last | non_moderator |
dial | Dial a destination | conference <confname> dial <dial-string> [<callerid_number> [<callerid_name>]] | ||
dtmf | Send DTMF to any member of the conference | conference <confname> dtmf <member_id>|all | last | non_moderator <digits> |
energy | Adjusts the conference energy level for a specific member | conference <confname> energy <member_id>|all | last | non_moderator <newval> |
enter_sound | Changes the sound played while entering the conference | conference <confname> enter_sound on|off | none | file <filename> |
exit_sound | Changes the sound played while leaving the conference | conference <confname> exit_sound on|off | none | file <filename> |
floor | Toggle floor status of the member. | conference <confname> <member_id>|all | last | non_moderator |
file_seek | Seek to a point in the currently playing file, in milliseconds | conference <confname> file_seek [+|-]<val> | Move forward 1 second: conference testconf file_seek +1000Move backwards 1 second: conference testconf file_seek -1000Move to 10 seconds from the start: conference testconf file_seek 10000 | |
file-vol | Changes the volume of the currently playing sound file | conference <confname> file-vol <val> [async] | ||
get | Get runtime parameter of the given conference(table of allowed parameters below) | conference <confname> get <parameter_name> | ||
getvar | gets the value of a conference variable | conference <confname> getvar <var-name> | conference testconf getvar mycustomvar | |
hup | Kick without the kick sound | conference <confname> hup <member_id>|all | last | non_moderator |
kick | Kicks the member or all members from the conference | conference <confname> kick <member_id>|all | last | non_moderator |
list | Lists conferences | conference list [pretty|summary | count | delim <string>] |
lock | Lock a conference so no new members will be allowed to enter | conference <confname> lock | ||
mute | Mutes a conference member | conference <confname> mute <member_id>|all | last | non_moderator [quiet] |
nopin | Removes a pin from a conference | conference <confname> nopin | ||
norecord | Removes a recording or all recordings from a conference | conference <confname> norecord <file-path>|all | conference testconf norecord allconference testconf norecord /tmp/foo.wav | |
pause | Pause a conference recording | conference <confname> pause <file-path> | ||
pause_play | Pause playback of file to a conference | conference <confname> pause_play | ||
pin | Set or change a pin number for a conference | conference <confname> pin <pin-number> | Note: Members joined from conference dial commanddo not get prompted for a pin | |
play | Play an audio file to a conference or a specific member | conference <confname> play [{vol=<volume>,full-screen=true,png_ms=100}]<file-path> [async|<member_id> [nomux]] | full-screen param will play the video in full screen mode in the conference,png_ms depends on mod_png to be loaded, Specify a PNG file to play and how many milliseconds, -1 for indefinite | |
record | Record a conference to a file or stream | conference <confname> record <file-path> | ||
recording | Start or control a conference recording | conference <confname> recording start <file-path>conference <confname> recording checkconference <confname> recording stop <file-path>|allconference <confname> recording pause <file-path>conference <confname> recording resume <file-path> | ||
relate | Mute or Deaf a specific member to another memberControl who sees who's video when not using video mux | conference <confname> relate <member_id>[,<member_id>] <other_member_id>[,<other_member_id>] [nospeak|nohear | clear | sendvideo] |
resume | Resume recording | conference <confname> resume <file-path> | ||
say | Speak text into conference using TTS | conference <confname> say <text> | ||
saymember | Speak text to a member of a conference using TTS | conference <confname> saymember <member_id> <text> | ||
set | Set runtime parameter of a conference | conference <confname> set <parameter_name> <value> | ||
setvar | sets the value of a confernce variable | conference <confname> setvar <var-name> <var-value> | conference testconf setvar mycustomvar 1234 | |
stop | Stops any queued audio from playing into conference | conference <confname> [current|all] [<member_id>] | ||
tmute | Toggle mute on/off for a member of a conference | conference <confname> tmute <member_id>|all | last | non_moderator [quiet] |
transfer | Transfer a member from one conference to another conference | conference <confname> transfer <conference_name> <member_id> | ||
undeaf | Allow conference member to hear again | conference <confname> undeaf <member_id>|all | last | non_moderator |
unlock | Unlock a conference so that new members can enter | conference <confname> unlock | ||
unmute | Unmute a conference member | conference <confname> unmute <member_id>|all | last | non_moderator [quiet] |
volume_in | Adjust the gain on the audio coming from a member | conference <confname> volume_in <member_id>|all | last | non_moderator [<newval>] |
volume_out | Adjust the volume of audio going to a member | conference <confname> volume_out <member_id>|all | last | non_moderator [<newval>] |
xml_list | List all or specific conferences in XML format | conference xml_listconference <confname> xml_list | ||
vid-floor | Set or force the video floor for a member | conference <confname> vid-floor <member_id>|last [force] | 1.6 | |
vmute | Enable video mute for a member | conference <confname> vmute <member_id>|all | last | non_moderator [quiet] |
tvmute | Toggle video mute on/off for a member | conference <confname> tvmute <member_id>|all | last | non_moderator [quiet] |
vmute-snap | Take or clear a snapshot image of the member to be used during vmute | conference <confname> vmute-snap <member_id>|all | last | non_moderator [clear] |
unvmute | Unmute video for a member | conference <confname> unvmute <member_id>|all | last | non_moderator [quiet] |
vid-banner | Set a text banner on the members video | conference <confname> vid-banner <member_id>|all | last | non_moderator <text> |
vid-mute-img | Check, set or clear the file to use as the members video mute image | conference <confname> vid-mute-img <member_id>|all | last | non_moderator [<path> |
vid-logo-img | Check, set or clear the file to use as the members video logo image | conference <confname> vid-logo-img <member_id>|all | last | non_moderator [<path> |
vid-res-id | Set or clear the video reservation id for this member | conference <confname> vid-res-id <member_id>|all <val> | clear [force] | conference foo vid-res-id 1 res-barconference foo vid-res-id 2 res-baz forceconference foo vid-res-id all clear |
clear-vid-floor | Clear when the video floor is locked to a user | conference <confname> clear-vid-floor | 1.6 | |
vid-layout | List available video mux layouts or set the layout or group to use in the video mux | conference <confname> vid-layout list|<layout-name> | group <group_name> [<canvas_id>] | |
vid-fps | Set the frames per second rate of the video mux output for the conference | conference <confname> vid-fps <fps> | 1.6 | |
vid-bandwidth | Set the bandwidth used by the output video from the conference | conference <confname> vid-bandwidth <BW> | 1.6 | |
vid-write-png | Take a snapshot of the current video mux output and save it to a PNG file | conference <confname> vid-write-png <path> | 1.6 | |
vid-canvas | Set the canvas to display this member on | conference <confname> vid-canvas <member_id>|all | last | non_moderator [<canvas_id>] |
vid-watching-canvas | Set the canvas displayed to this member | conference <confname> vid-watching-canvas <member_id>|all | last | non_moderator [<canvas_id>] |
API Additional Notes
dial and bgdial
If the caller id values are not set, the variables in conference.conf.xml will be used. Specifically, the value for caller-id-number will be used for the number and the value for caller-id-name will be used for the name.
If the conference will be dynamically created as a result of this api call (ie this will be the first participant in the conference) - and the caller id name and number is not provided in the api call - the number and name will be "00000000" and "FreeSWITCH". This appears to be unaffected by the variables in conference.conf.xml.
get and set
Parameter | Description | Units | Writable |
---|---|---|---|
run_time | Seconds | ||
count | Number | ||
max_members | Number | Yes | |
rate | Number | ||
profile_name | String | ||
sound_prefix | String | Yes | |
caller_id_name | String | Yes | |
caller_id_number | String | Yes | |
is_locked | "locked" or blank | ||
endconference_grace_time | Seconds | Yes | |
uuid | String | ||
wait_mod | "true" or blank |
Dialplan usage example
<action application="set" data="conf_runtime=${conference(${conference_name} get run_time)}"/>
<action application="set" data="conf_sounddir=${conference(${conference_name} get sound_prefix)}"/>
<action application="set" data="conf_oldsound=${conference(${conference_name} set sound_prefix ${sound_prefix_pl})}"/>
<action application="set" data="void_result=${conference(${conference_name} set endconference_grace_time 300)}"/>
list
Command Output
First line:
- Conference <conference name> (<member_count> member[s][ locked])
- “locked" - The lock/unlock status of the conference.
Each following line is a comma-separated list for each conference leg with the following items:
-
id of participant(starts at 1 after FS restart)
-
Register string of participant
-
UUID of participant's call leg
-
Caller id name
-
Caller id number
-
Status (hear|speak|talking|video|floor)
- “hear" - The mute/unmute status of the member.
- “speak" - The “deaf /undeaf" status of the member.
- “talking" - The input channel is currently providing some amount of sound energy into conference.
- “video" - Providing video?
- “floor" - This member currently owns the floor.
-
Volume In setting
-
Detected energy
-
Volume Out setting
-
Energy Level setting
A handy way to test in an XML dialplan if a conference is active and allow a late caller to join
<extension name="late entry">
<condition field="destination_number" expression="^(300\d)$" />
<condition field="${conference $1 list count}" expression="^\d+">
<action application="conference" data="$1@default++flags{nomoh}"/>
</condition>
</extension>
If the conference is not active, the second "condition" test will fail and bypass this dialplan extension entry. If the conference is active the caller will join it with the 'nomoh' flag set.
relate
conference <conf-name> relate <datum-member1>[,<datum-member2>] <related-member1>[,<related-member2>] <relationship>
<datum> is the conference member that is the subject of the relation; in other words, the relationship will be established with respect to <datum>
<related-member> is the conference member that will be affected by the relate command
<relationship> can be one of
- nohear — the datum member will no longer hear the related-member; i.e. datum's ear will be muted to related-member's mouth
- nospeak — the datum member will no longer be able to speak to the related-member
- clear — reset the relationship between the two conference members
Note that "relate 1 2 nohear" gives the same result as "relate 2 1 nospeak", it is simply a matter of perspective.
Examples
conference 3000 relate 1 2 nospeak
Member 1 may now no longer speak to member 2, i.e. member 2 now cannot hear member 1.
conference 3000 relate 1 2 clear
Member 1 may now speak to member 2 again
conference 3100 relate 1 2 nohear
Member 1 now cannot hear member 2
conference 3100 relate 1 2 clear
Member 1 can now hear member 2 again
Both conference-member arguments can take multiple values, separated by commas (but no spaces!)
conference 3300 relate 1,2 3 nospeak
Member 1 and member 2 may now no longer speak to member 3.
conference 3001 relate 1 2,3 nohear
Member 1 now cannot hear member 2 nor member 3
Event Socket Use
You can subscribe to the following to receive conference events:
conference::maintenance
The "suppress-events" parameter can be added to the conference profile to prevent events from firing. e.g. if you're not interested in start or stop talking events:
<profile name="default"> ...other options... <param name="suppress-events" value="start-talking,stop-talking"/> </profile>
The events that can be suppressed are:
del-member, energy-level, volume-level, gain-level, dtmf, stop-talking, start-talking, mute-member, unmute-member, kick-member, dtmf-member, energy-level-member, volume-in-member, volume-out-member, play-file, play-file-member, speak-text, speak-text-member, lock, unlock, transfer, bgdial-result and floor-change.
Outbound Conference
Use conference_set_auto_outcall to have mod_conference call endpoints and join them to a conference bridge. To have it call more than one participant, just repeat the conference_set_auto_outcall action in the dialplan for each destination number or address.
Syntax
<action application="conference_set_auto_outcall" data="dialstring"/>
Example
Here is an example of using conference_set_auto_outcall with some of the other conference_auto_outcall_* parameters to start a conference when someone dials 12345. Extensions 1000 and 1001 will be dialed when the conference starts and will enter the conference muted.
Outbound example
<extension name="Demonstrate conference_set_auto_outcall">
<condition field="destination_number" expression="^(12345)$">
<action application="answer"/>
<action application="set" data="conference_auto_outcall_timeout=5"/>
<action application="set" data="conference_utils_auto_outcall_flags=mute"/>
<action application="set" data="conference_auto_outcall_caller_id_name=$${effective_caller_id_name}"/>
<action application="set" data="conference_auto_outcall_caller_id_number=$${effective_caller_id_number}"/>
<action application="set" data="conference_auto_outcall_profile=default"/>
<action application="set" data="conference_auto_outcall_prefix={sip_auto_answer=true,execute_on_answer='bind_meta_app 2 a s1 transfer::intercept:${uuid} inline'}"/>
<action application="set" data="conference_auto_outcall_timeout=60"/>
<action application="conference_set_auto_outcall" data="user/1000@$${domain}"/>
<action application="conference_set_auto_outcall" data="user/1001@$${domain}"/>
<action application="conference_set_auto_outcall" data="sofia/internal/gateway/signalwire/12024561000"/>
<action application="conference" data="$1@default"/>
</condition>
</extension>
Note that the internal extensions 1000 and 1001 will provide no ringback to avoid polluting the conference bridge with excessive noise, but the gateway is not under control of FreeSWITCH so it will provide early media.
Alternatively, you can set multiple destinations in one line, just remember to escape your variables if you have more than one or any non-escaped chars in it.
<action application="conference_set_auto_outcall" data="['var1=a,var2=b']user/1001@$${domain},['var1=c,var2=d']user/1002@$${domain}"/>
Variable | Description |
---|---|
conference_auto_outcall_announce | File name of audio message to play to conference member joining conference via the conference_set_auto_outcall application. |
conference_auto_outcall_caller_id_name | Caller ID name to use when dialing endpoints using conference_set_auto_outcall application |
conference_auto_outcall_caller_id_number | Caller ID number to use when dialing endpoints using conference_set_auto_outcall application |
conference_auto_outcall_delimiter | Delimiter between values held in cpstr, default = "," (the comma character) |
conference_utils_auto_outcall_flags | Conference member flags to set for members joining via conference_set_auto_outcall application (use | as separator for multiple flags) |
conference_auto_outcall_maxwait | Maximum time in seconds that the channel that initiated the conference_set_auto_outcall will wait for members to join the conference |
conference_auto_outcall_prefix | String to prepend to each of the dial-string values set from the conference_auto_outcall application |
conference_auto_outcall_profile | Conference profile to use for members joining the conference via the conference_set_auto_outcall application |
conference_auto_outcall_timeout | Originate timeout to use when joining a member to a conference via conference_set_auto_outcall application |
conference_auto_outcall_skip_member_beep | When true, do not play a beep to moderator when initiating an outbound conference call. Tone is 640Hz for 500msec |
Channel Variables
Read-Only
These channel variables are set by mod_conference.
Variable | Description |
---|---|
conference_last_matching_digits | Contains the last matching digits that the member sent into the conference |
conference_member_id | Contains the member_id of the member for the conference they are in |
conference_moderator | Contains "true" if the channel is connected to a conference as a moderator |
conference_name | The name of the last conference joined by this channel |
conference_recording | Contains the file name of the conference recording for the conference the channel is connected to |
conference_uuid | Unique id of the most recent conference in which the channel was a member |
last_transferred_conference | The name of the last conference this channel was connected to |
Settable Channel Variables
Set these channel variables to control the behavior of mod_conference for the current session. conference_auto_outcall_ variables are described above in the Outbound Conference section
Variable | Description | Example | Min. Version | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
conference_controls | Specify which conference control set to use when transferring a caller into a conference | <action application="set" data="conference_controls=moderator"/> | |||||||||||||
conference_enforce_security | Allows the conference security to be overridden. This applies in two different scenarios, one for inbound and one for outbound.By default, conference security is always applied to inbound calls and is always skipped for outbound calls. | Inbound<action application="set" data="conference_enforce_security=false"/> <action application="conference" data="3000"/> Outboundoriginate {conference_enforce_security=true}sofia/internal/1001 &conference(3000) | |||||||||||||
conference_enter_sound | Overrides the conference parameter for enter sound | <action application="set" data="conference_enter_sound=silence_stream://10"/> | |||||||||||||
conference_exit_sound | Overrides the conference parameter for exit sound | <action application="set" data="conference_exit_sound=silence_stream://10"/> | |||||||||||||
conference_flags | A comma separated list of conference flags, which will be applied when the conference is created. This allows to dynamically set the conference flags from the dial plan as opposed to setting them in the conference profile. | <action application="set" data="conference_flags=wait-mod,audio-always"/> | |||||||||||||
conference_member_flags | A comma separated list of member flags to be set on the channel, which is joining the conference. | <action application="set" data="conference_member_flags=mute"/> | |||||||||||||
conference_input_buffer_flush_msec | If the input buffer (audio from this member into the conference) builds up to longer than x milliseconds, then clear the buffer. | <action application="set" data="conference_input_buffer_flush_msec=500"/> | 20.23.2 | ||||||||||||
conference_output_buffer_flush_msec | If the output buffer (audio from the conference to this member) builds up to longer than x milliseconds, then clear the buffer. | <action application="set" data="conference_output_buffer_flush_msec=500"/> | 20.23.2 | ||||||||||||
conference_output_discard_low_energy | If the packet's energy level is less than this value and there are more than 2 packets waiting in the output buffer (audio from the conference to this member) then drop this packet. A few low energy packets must be sent first before any are dropped to avoid totally truncating silence. To discard the standard comfort noise in a conference, set this to 15 or higher. Default is 0 (don't discard low energy packets). | <action application="set" data="conference_output_discard_low_energy=20"/> | 20.23.2 | ||||||||||||
conference_permanent_wait_mod_moh | This variable controls how the enter and exit sounds interact with the MOH when the wait_mod flag is set. When this variable is set to true, the MOH keeps playing andthe enter and exit sounds are mixed with the MOH. When the variable is false or not set, then any playing MOH is first stopped, then the enter or exit sound is played and the MOH is started again.This functionality is useful in case the enter and exit sounds are used to announce the name of the caller, who is joining or leaving a conference. | ||||||||||||||
video_banner_text | Sets the video banner text, font, font size, font color, background color, min/max font size for the member (must be set before entering conference). font_scale valid values float between 5-50, fg/bg hex color code, min/max font size 5-24, all settings besides text are optional. | <action application="set" data="video_banner_text={font_face=/path/to/font.ttf,font_scale=5,bg=#000000,fg=#FFFFFF,min_font_size=8,max_font_size=14}Banner Text"/> | 1.6 | ||||||||||||
video_mute_banner | Sets the video mute banner text, font, font size, font color, background color, min/max font size for the member (must be set before entering conference). font_scale valid values float between 5-50, fg/bg hex color code, min/max font size 5-24, all settings besides text are optional. | <action application="set" data="video_mute_banner={font_face=/path/to/font.ttf,font_scale=5,bg=#000000,fg=#FFFFFF,min_font_size=8,max_font_size=14}VIDEO MUTED"/> | 1.6 | ||||||||||||
video_avatar_png | Path to PNG file to use when an avatar image is needed. | <action application="set" data="video_avatar_png=/path/to/file.png"/> | 1.6 | ||||||||||||
video_mute_png | Path to PNG file to use when you video mute, by default it will use your last video frame (overrides video_avatar_png). | <action application="set" data="video_mute_png=/path/to/file.png"/> | 1.6 | ||||||||||||
video_no_video_avatar_png | Path to PNG file for member without video to display (overrides video_avatar_png). | <action application="set" data="video_no_video_avatar_png=/path/to/file.png"/> | 1.6 | ||||||||||||
video_avatar_png | set video replacement avatar images | <action application="set" data="video_avatar_png=/path/to/file.png"/> | 1.6 | ||||||||||||
video_initial_canvas | Set to the initial canvas member should be displayed on | <action application="set" data="video_initial_canvas=2"/> | 1.6 | ||||||||||||
video_initial_watching_canvas | Set to the initial canvas member should see | <action application="set" data="video_initial_watching_canvas=2"/> | 1.6 | ||||||||||||
video_use_dedicated_encoder | If set to true, it allows the channel to have a dedicated encoder with its own bandwidth settings | <action application="set" data="video_use_dedicated_encoder=true"/> | 1.6 | ||||||||||||
conference_auto_record | Enable recording for this conference. | <action application="set" data="conference_auto_record=/tmp/${strftime(%Y-%m-%d %H:%M)}.wav"/> | 1.6 | ||||||||||||
video_logo_path | set an image logo, and optional text overlay | <action application="set" data="video_logo_path={position=left-bot,text_x=center,center_offset=190,text=#000000:transparent:/var/ccw/font/AEH.ttf:50:'${toupper ${caller_id_name}}',alt_text_x=center,alt_center_offset=190,alt_text_y=88,alt_text=#ffffff:transparent:/path/to/font/AEH.ttf:40:'${caller_id_number}'}/var/png/freeswitch.png"/>Parameters separated by a comma (,) are as follows:**position=**left-top | left-mid | left-bot | center-top | center-mid | center-bot | right-top | right-mid | right-bot**fit=**fit-size | fit-scale | fit-size-and-scale | fit-necessarycenter_offset=[ 0 or higher ]text=foreground:background:font_face:font_size:txttext_x=[ 0 or higher | center ]text_y=[ 0 or higher ]alt_text=foreground:background:font_face:font_size:txtalt_center_offset=[ 0 or higher ]alt_text_x=[ 0 or higher | center ]alt_text_y=[ 0 or higher ]text= and alt_text= arguments separated by colon (:) are as follows:foreground a hex notation color code i.e. #FF0000 for redbackground a hex notation color code or can be the word transparentfont_face a path to your font face i.e. /usr/share/font/monospace.ttffont_size a decimal value, or percentage value i.e. 10 or **10%**txt the literal text to display over the image logoYou could potentially use your name in text=x❌x❌${caller_id_name} and email, phone, or whatever in **alt_text=x❌x❌${caller_id_number}**and give alt_text_y slightly different y value so they're not on top of each other...**Note:**These options prepend the path of the file within { } curly braces, also notice video_logo_path and vid-logo-img achieve the same thingwhen using these options in dialplan, utilize video_logo_path like this <action application="set" data="video_logo_path={OPTIONS}/path/to/my.png"/> when using these options in fs_cli or esl, utilize vid-logo-img like this conference CONF vid-logo-img 1 {OPTIONS}/path/to/my.png |
Conference Variables
Conference level variables can be set on the profile, in the variables section of the profile.
Conference Variables Example
<profiles>
<profile name="default">
<variables>
<variable name="mycustomvar" value="customvalue">
</variables>
</profiles>
Since version 1.10.8 variables can also be set using the conference "getvar" and "setvar" api commands. and also any channel variables prefixed with "confvar_" will be converted into conference variables.
Sound files
Just about any format is supported, but currently it must be at the sample rate of the conference (no resampling is done). Since disk is cheaper than CPU, use a wav.
Custom Conference Layouts
Layout grid is square, its directly proportional to the canvas resolution and aspect ratio. These layouts will work on 4:3 or 16:9 aspect ratio. The values x, y, and scale are all of a range of 0-360, proportional to the actual final resolution.
Layout Example
<configuration name="conference_layouts.conf" description="Audio Conference">
<layout-settings>
<layouts>
<layout name="presenter-overlap-small-top-right">
<image x="0" y="0" scale="360" floor-only="true"/>
<image x="300" y="0" scale="60" overlap="true" reservation_id="presenter"/>
</layout>
<layout name="1up_top_left+5">
<image x="0" y="0" scale="240" floor="true" audio-position="-.5:0:0"/>
<image x="240" y="0" scale="120" audio-position=".25:0:0"/>
<image x="240" y="120" scale="120" audio-position=".25:0:-.25"/>
<image x="0" y="240" scale="120" audio-position="-.5:0:-1"/>
<image x="120" y="240" scale="120" audio-position="0:0:-1"/>
<image x="240" y="240" scale="120" audio-position=".25:0:-1"/>
</layout>
<layout name="1x1">
<image x="0" y="0" scale="360" floor="true"/>
</layout>
<layout name="2x2">
<image x="0" y="0" scale="180"/>
<image x="180" y="0" scale="180"/>
<image x="0" y="180" scale="180"/>
<image x="180" y="180" scale="180"/>
</layout>
</layouts>
<groups>
<group name="grid">
<layout>1x1</layout>
<layout>2x2</layout>
</group>
</groups>
</layout-settings>
<configuration>
Layout Param | Description |
---|---|
border | Border size around each video feed (in pixels), values from 0 - 50. Overrides video-border-size conference parameter |
bgimg | Full path to PNG file to use as a background image for the entire canvas |
Layout Image Param | Description |
---|---|
x | Value from 0-360, proportional to the canvas size, amount out of 360 for this images top left corner x position |
y | Value from 0-360, proportional to the canvas size amount out of 360 for this images top left corner y position |
scale | Value from 0-360, proportional to the canvas size amount out of 360 for this images size |
floor | with floor="true", this box will prefer the video floor holder and will switch as floor holder changes |
reservation_id | arbitrary named setting used to specify which location to put someone using the vid-res-id api command |
overlap | with overlap="true", this box will be redrawn on every frame. You must set this if box overlaps others to avoid flicker |
floor-only | with floor-only="true" this box will only show the video floor holder, and will be blank if there is none |
file-only | with file-only="true" this box will only show video files that are played via the conference play api. |
audio-position | Uses OpenAL to position the audio into the location of the square the speaker is in. Values are x:y:z where x, y and z are values on 3d coordinate system. These can be positive or negative floating point numbers. The larger the number, the further the “distance". X=left/right, Y=forward/backard, X=up/down. These are the same values used in the conference position command. |
auto-3d-position | Automatically position the conference member based on their location in the current layout. |
border | Border size around each video feed (in pixels), values from 0 - 50. Overrides <layout> tag |
Check this page for layout examples: FreeSWITCH 1.6 Video#Examples
See Also
Attachments:
image2019-7-26_15-11-2.png (image/png)