Skip to main content

Chapter 20: Conferencing

FreeSWITCH multi-party audio and video conferencing is provided by mod_conference. Callers are bridged into named rooms; each room is governed by a profile that sets codec parameters, audio behaviors, and video mixing options. All configuration lives in autoload_configs/conference.conf.xml and autoload_configs/conference_layouts.conf.xml.

Conference Model

A conference room is identified by a name string. When the conference dialplan application is invoked with roomname@profilename, FreeSWITCH looks up profilename in conference.conf.xml and creates the room (if it does not already exist) using that profile's parameters. Subsequent callers who dial the same room name join the existing instance.

Key points:

  • A profile is a named collection of parameters. It does not represent a room; it represents a configuration template.
  • Room names are arbitrary strings. They are typically constructed from the destination number and domain (for example, 3001-example.com) to prevent collisions across domains.
  • If no profile is specified, the default profile is used.
  • A room is destroyed automatically when the last member leaves (or when an endconf member leaves and the grace timer expires).

conference.conf.xml

The file is loaded by mod_conference at startup. It contains three top-level sections: <advertise>, <caller-controls>, and <profiles>.

The optional <advertise> section publishes SIP presence for listed rooms at startup.

<advertise>
<room name="3001@$${domain}" status="FreeSWITCH"/>
</advertise>
AttributePurpose
nameSIP AOR to advertise. Variable expansion applies.
statusPresence status string sent to subscribers.

Caller Controls

Caller controls map DTMF digits to in-conference actions for members who are in an active room. Controls are organized into named groups. The group named default is used when no caller-controls profile parameter specifies otherwise.

The reserved name none disables all DTMF controls for a profile (used by the sla profile, for example).

Controls are disabled per-member when the dist-dtmf member flag is set; DTMF is then passed through to other members instead.

<caller-controls>
<group name="default">
<control action="mute" digits="0"/>
<control action="deaf mute" digits="*"/>
<control action="energy up" digits="9"/>
<control action="energy equ" digits="8"/>
<control action="energy dn" digits="7"/>
<control action="vol talk up" digits="3"/>
<control action="vol talk zero" digits="2"/>
<control action="vol talk dn" digits="1"/>
<control action="vol listen up" digits="6"/>
<control action="vol listen zero" digits="5"/>
<control action="vol listen dn" digits="4"/>
<control action="hangup" digits="#"/>
</group>
</caller-controls>

Available control actions:

ActionEffect
muteToggle mute for the caller.
mute onUnconditionally mute the caller.
mute offUnconditionally unmute the caller.
vmuteToggle video mute for the caller.
vmute onUnconditionally video-mute the caller.
vmute offUnconditionally remove video mute.
vmute snapCapture a still image to use as the video-mute placeholder.
vmute snapoffRemove the captured still-image placeholder.
deaf muteToggle both deaf and mute simultaneously.
deafToggle deaf state only (audio receive).
deaf onUnconditionally make the caller deaf.
deaf offUnconditionally restore audio receive.
energy upIncrease the energy threshold (talk detection sensitivity).
energy equReset the energy threshold to the profile default.
energy dnDecrease the energy threshold.
vol talk upIncrease the caller's transmit volume.
vol talk zeroReset the caller's transmit volume.
vol talk dnDecrease the caller's transmit volume.
vol listen upIncrease the caller's receive volume.
vol listen zeroReset the caller's receive volume.
vol listen dnDecrease the caller's receive volume.
hangupDisconnect the caller from the conference.
lockToggle the conference lock state (moderator action).
transferTransfer the caller to a dialplan destination (requires data attribute on the <control> element).
execute_applicationExecute a dialplan application for the caller (requires data attribute).
floorToggle audio floor hold for the caller.
vid-floorToggle video floor hold for the caller.
vid-floor-forceForce video floor to the caller without toggling.
moh toggleToggle music-on-hold for the caller.
borderCycle the video border style for the caller (requires data attribute).
eventFire a custom event (requires data attribute on the <control> element).

A profile can assign a separate control group to moderators via moderator-controls.

Profile Parameters

A <profile> element contains <param name="..." value="..."/> child elements. Underscores in parameter names are interchangeable with hyphens during parsing.

Audio parameters:

ParameterPurposeAccepted ValuesDefault
rateAudio sample rate for the conference mixer.8000, 12000, 16000, 24000, 32000, 44100, 48000; or auto to inherit from the first caller's codec.8000
channelsAudio channel count.1 (mono), 2 (stereo); or auto.1
intervalFrame duration in milliseconds. Must be a multiple of 10 and within the platform maximum.Integer ms, or auto.20
energy-levelVoice activity detection threshold. Audio below this level is treated as silence and not mixed.Integer 0-1800 (arbitrary linear units).100
comfort-noiseEnable comfort noise generation during silence. true sets an internal level of 1400; a numeric value 2-9999 sets the level explicitly. false or 0 disables.true, false, or integer 2-9999.false
auto-gain-levelAutomatic gain control target level. When non-zero, AGC adjusts member transmit volume to reach this energy level.Integer, or false/0 to disable.0 (disabled)
auto-gain-low-energy-levelAGC lower energy bound; member volumes are not reduced below this level.Integer.None
auto-gain-marginAGC adjustment margin (dead band).Integer.None
auto-gain-change-factorAGC step size per adjustment period.Integer.None
auto-gain-period-lenNumber of frames per AGC adjustment period.Integer.None
auto-energy-levelTarget energy level for automatic energy threshold tracking. When set, the energy threshold floats to keep talk detection adaptive. If energy-level is unset, it is initialized to half of this value.Integer. Negative values clamp to 0.None (disabled)
auto-energy-secondsAveraging window, in seconds, used by the automatic energy tracker.Integer seconds. 0 or unset falls back to the default.5
max-energy-levelUpper energy bound. Audio above this level can trigger a member mute (used to suppress excessively loud or noisy members). 0 disables. If set below energy-level, it is disabled.Integer. Negative values clamp to 0.0 (disabled)
max-energy-hit-triggerNumber of consecutive over-max-energy-level frames required before the member is acted upon. Only applied when max-energy-level is set.Integer. Negative values clamp to 0.5
max-energy-level-mute-msDuration, in milliseconds, a member is muted after exceeding max-energy-level. Internally converted to a frame count using interval.Integer ms.None
timer-nameInternal timer module to use for mixing.Module name string (for example, soft).soft

Sound file parameters:

ParameterPurposeAccepted ValuesDefault
sound-prefixDirectory prefix for relative sound file paths used in other sound parameters.Directory path.First caller's sound_prefix channel variable.
tts-engineTTS engine module name. When set, sound parameters prefixed with say: are spoken rather than played from file.Engine name string (for example, flite, cepstral).None
tts-voiceTTS voice name to use with the configured TTS engine.Voice name string (for example, kal16, david).None
moh-soundMusic on hold file or stream, played when a member is alone in the room.File path or stream URI.None
perpetual-soundFile or stream played in a continuous loop regardless of member count; no member can speak while it plays.File path or stream URI.None
alone-soundFile played to a member when they are the only participant.File path or stream URI.None
member-enter-soundFile played privately to the joining member immediately after they enter.File path or stream URI.None
enter-soundFile or tone played to all members when someone joins.File path or stream URI.None
exit-soundFile or tone played to all members when someone leaves.File path or stream URI.None
muted-soundFile played to a member to confirm they have been muted.File path.None
unmuted-soundFile played to a member to confirm they have been unmuted.File path.None
mute-detect-soundFile played to a muted member when they speak (requires mute-detect flag).File path.None
deaf-soundFile played to a member to confirm they have been made deaf.File path.None
undeaf-soundFile played to a member to confirm deaf state was removed.File path.None
blind-soundFile played to a member to confirm they have been made video-blind.File path.None
unblind-soundFile played to a member to confirm video-blind state was removed.File path.None
kicked-soundFile played to a member being ejected.File path.None
locked-soundFile played to a caller attempting to join a locked conference.File path.None
is-locked-soundFile played to all members when the conference is locked during a call.File path.None
is-unlocked-soundFile played to all members when the conference is unlocked during a call.File path.None
pin-soundPrompt file played to collect a conference PIN.File path.None
bad-pin-soundFile played when an entered PIN is incorrect.File path.None

Access control parameters:

ParameterPurposeAccepted ValuesDefault
pinConference entry PIN. Members must match this value to join.Digit string.None
moderator-pinPIN that grants moderator status on entry.Digit string.None
pin-retriesMaximum number of PIN attempts before the caller is rejected.Integer >= 0.3
max-membersMaximum simultaneous members. 0 disables the limit. A value of 1 is invalid and treated as 0.Integer.0
max-members-soundFile played to a caller who is rejected because the room is full.File path.None

Behavior parameters:

ParameterPurposeAccepted ValuesDefault
domainSIP domain for presence.Domain string. Variable expansion applies.None
caller-controlsName of the <caller-controls> group to apply to regular members.Group name string; none to disable.default
moderator-controlsName of the <caller-controls> group to apply to moderator members.Group name string.None (uses caller-controls)
member-flagsPipe-delimited set of flags applied to every member that joins via this profile.See Member Flags.None
conference-flagsPipe-delimited set of flags that control conference-wide behavior.See Conference Flags.None
caller-id-nameCaller ID name used for outbound calls originated by the conference.String.conference (module app name)
caller-id-numberCaller ID number used for outbound calls originated by the conference.String.0000000000
announce-countPlay a member count announcement when membership reaches this threshold. 0 disables.Integer.0
suppress-eventsComma-delimited list of event subtypes to suppress. Valid values: del-member, energy-level, volume-level, gain-level, dtmf, stop-talking, start-talking, mute-detect, mute-member, hold-member, kick-member, dtmf-member, energy-level-member, volume-in-member, volume-out-member, play-file, play-file-done, play-file-member, speak-text, speak-text-member, lock, unlock, transfer, bgdial-result, floor-change, record.Comma-delimited string.None
verbose-eventsWhen set to true, fire additional detail in conference events.true, false.None
ivr-dtmf-timeoutMilliseconds to wait between DTMF digits when matching a caller-control sequence. Values below 500 are raised to 500.Integer ms.500
ivr-input-timeoutMilliseconds to wait for the first DTMF digit. 0 means wait indefinitely. Non-zero values below 500 are raised to 5000.Integer ms.0
endconf-grace-timeSeconds to delay conference termination after the last endconf member leaves.Integer seconds.None
terminate-on-silenceSeconds of conference-wide silence after which the conference is terminated. 0 or unset disables.Integer seconds.None
min-required-recording-participantsMinimum member count required for auto-recording to begin.1 or 2.1
broadcast-chat-messagesRelay SIP MESSAGE chat messages from members to all other members.true, false.true
heartbeat-period-secInterval in seconds at which a conference-heartbeat event is fired. 0 disables.Integer seconds.0
descriptionHuman-readable description string for the conference (included in CDR and events).String.None
outcall-templTemplate dial string used when the conference originates outbound calls (for example, via the dial/bgdial API or call-list features). Channel variables in the template are expanded per outbound call.Dial-string template with variable expansion.None

Recording parameters:

ParameterPurposeAccepted ValuesDefault
auto-recordPath template for automatic recording of every conference. Supports channel variables and strftime tokens. Special value shout://... records to an Icecast/Shoutcast stream.Path string.None
recording-metadataArbitrary metadata string attached to auto-recording events.String.None
cdr-log-dirDirectory for CDR XML files. auto writes to $PREFIX/logs/conference_cdr/. A relative path is anchored under $PREFIX/logs/.Path string or auto.None
cdr-event-modeControls whether CDR is written to file, fired as an event, or both.content, file, both.None

Video parameters:

ParameterPurposeAccepted ValuesDefault
video-modeVideo mixing strategy.passthrough, transcode, mux.passthrough
video-layout-nameLayout name or group:groupname for MCU video mixing. May appear multiple times in one profile; the first becomes the initial layout and subsequent values extend an auto-selection list.Layout name string or group:name.None
video-canvas-sizeResolution of the MCU mixing canvas.WIDTHxHEIGHT string (for example, 1920x1080).None
video-canvas-bgcolorBackground color for the MCU canvas in hex RGB.#RRGGBB string.None
video-border-colorColor of the border drawn around each member slot on the canvas.#RRGGBB string.None
video-border-sizeWidth in pixels of the border drawn around each member slot. 0 disables.Integer.0
video-letterbox-bgcolorFill color for letterbox bars when a source video does not match the slot aspect ratio.#RRGGBB string.None
video-fpsFrames per second for MCU output.Numeric.30
video-codec-bandwidthTarget output bandwidth for the MCU video encoder.Value with unit suffix, for example, 3mb.None
video-auto-floor-msecMilliseconds a member must hold the audio floor before automatically receiving the video floor. 0 disables automatic promotion.Integer ms.0
video-canvas-countNumber of simultaneous MCU canvases (for super-canvas / multi-canvas deployments).Integer.1
video-layout-confName of the layout configuration file from which this conference loads its video layouts.Config file name string.conference_layouts.conf
video-super-canvas-label-layersWhen non-zero, draw the canvas/layer label text on each layer of the super-canvas (the composite view of all canvases).Integer (0 off, non-zero on).0
video-super-canvas-show-all-layersWhen non-zero, the super-canvas shows all layers from every canvas rather than only active ones.Integer (0 off, non-zero on).0
video-super-canvas-bgcolorBackground color of the super-canvas in hex RGB.#RRGGBB string.#068df3
video-qualityEncoder quality preset for MCU output.Integer 0-4.1
video-kps-debounceMilliseconds to wait before adjusting the MCU encoder bitrate in response to bandwidth changes.Integer ms.5000
video-no-video-avatarImage file used as a placeholder for members without a camera.File path.None
video-mute-bannerText or image overlay displayed on a video-muted member's slot.String or file path.None
scale-h264-canvas-sizeDownscaled canvas resolution used for H.264 encoding when the primary canvas is larger.WIDTHxHEIGHT string.None
scale-h264-canvas-fps-divisorDivide the canvas FPS by this value for the scaled H.264 output. 0 uses the full rate.Integer.0
scale-h264-canvas-bandwidthBandwidth target for the scaled H.264 output.Value with unit suffix.None
video-codec-config-profile-nameNamed codec configuration profile to apply to MCU video encoding.String.None

Conference Flags

Conference flags are set in the profile via conference-flags (pipe-delimited) or via the conference_flags channel variable. They govern room-level behavior.

FlagEffect
wait-modHold all members in a waiting state until a moderator joins.
audio-alwaysMix audio from all members at all times, regardless of voice activity detection.
video-floor-onlyVideo floor is granted only explicitly, not automatically on audio floor.
rfc-4579Enable RFC 4579 conference event package signaling.
livearray-syncSynchronize member state to the Verto live array.
livearray-json-statusInclude JSON status in live array events.
json-eventsFire conference member events as JSON.
minimize-video-encodingEncode outbound video once and share the stream where possible.
manage-inbound-video-bitrateActively manage the bitrate requested from video senders.
video-required-for-canvasMembers without video are excluded from the MCU canvas.
video-mute-exit-canvasA video-muted member is removed from the canvas.
video-bridge-first-twoWhen exactly two video members are present, bridge video directly.
video-muxing-personal-canvasEach member receives a personal canvas (point-to-point view).
restart-auto-recordRestart the auto-recording when the conference is restarted.
auto-3d-positionEnable automatic 3D positional audio assignment based on canvas layout positions.
ded-vid-layer-audio-floorDedicate a video canvas layer to whichever member holds the audio floor.
breakableAllow the conference to be interrupted by a transfer or other channel application.

Member Flags (Profile)

The member-flags profile parameter sets default per-member flags for all members joining via that profile. The same flags can be set per-call at join time (see Member Flags at Join Time).

FlagEffect
muteMember joins muted (cannot speak).
vmuteMember joins with video muted (camera not transmitted).
deafMember joins deaf (cannot hear the conference).
blindMember joins video-blind (does not receive any video).
mute-detectFire an event when this muted member speaks.
dist-dtmfPass DTMF digits through to other members instead of processing them as controls.
skip-dtmfIgnore all DTMF input entirely for this member (neither controls nor passthrough).
moderatorGrant moderator status. Moderators receive the moderator-controls key map.
nomohSuppress music-on-hold for this member when they are alone.
endconfTerminate the conference when this member leaves.
mandatory_member_endconfSame as endconf but the conference terminates only if this member was the one who left (not if they were kicked).
mintwoKeep the conference alive until at least two members have joined (prevents immediate teardown).
ghostMember is invisible to the conference participant count and to other members.
join-onlyReject this member if no conference already exists; do not create a new room.
positionalEnable 3D positional audio for this member (requires auto-3d-position support in the layout).
no-positionalExplicitly disable 3D positional audio for this member even if the conference enables it.
join-vid-floorGrant the video floor to this member immediately on join.
no-video-blanksDo not send blank video frames to this member when no floor holder is active.
no-minimize-encodingForce a separate encode for this member even when minimize-video-encoding is set on the conference.
second-screenMember receives video but does not contribute audio or appear on the canvas. Also sets deaf and muted implicitly.
flip-videoFlip the member's inbound video vertically before mixing.
talk-data-eventsFire detailed talking data events for this member.
video-bridgeBridge video directly to this member when only two video participants are present.

Bundled Profiles

The vanilla configuration ships the following profiles in conference.conf.xml:

ProfileratechannelsNotes
default80001Narrowband audio. Used by the nb_conferences dialplan range (30xx).
wideband160001Wideband audio. Used by the wb_conferences dialplan range (31xx).
ultrawideband320001Ultra-wideband audio. Used by the uwb_conferences dialplan range (32xx). Includes commented-out video MCU parameters for reference.
cdquality480001CD-quality mono audio. Used by the cdquality_conferences dialplan range (33xx). Includes commented-out video MCU parameters for reference.
video-mcu-stereo480002CD-quality stereo audio with full MCU video mixing at 1920x1080, 30 fps, 3 Mbps. Default layout 3x3 with auto-selection from the grid group. energy-level is 200.
video-mcu-stereo-720480002Same as video-mcu-stereo with canvas 1280x720.
video-mcu-stereo-480480002Same as video-mcu-stereo with canvas 640x480.
video-mcu-stereo-320480002Same as video-mcu-stereo with canvas 480x320.
sla160001Shared Line Appearance helper profile. Caller controls are disabled (none), MOH is silence, energy-level is 200.

All bundled profiles set comfort-noise to true except the video-mcu-* profiles, which set it to false.

The four video-mcu-stereo* profiles share the same conference-flags value:

livearray-json-status|json-events|video-floor-only|rfc-4579|livearray-sync|
minimize-video-encoding|manage-inbound-video-bitrate|video-required-for-canvas|
video-mute-exit-canvas|mute-detect

They also set video-auto-floor-msec to 1000.

Minimal profile example (narrowband, no video):

<profile name="default">
<param name="domain" value="$${domain}"/>
<param name="rate" value="8000"/>
<param name="interval" value="20"/>
<param name="energy-level" value="100"/>
<param name="muted-sound" value="conference/conf-muted.wav"/>
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
<param name="alone-sound" value="conference/conf-alone.wav"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
<param name="comfort-noise" value="true"/>
</profile>

Video Layouts

Video layout configuration is in autoload_configs/conference_layouts.conf.xml. Layouts define how member video streams are positioned on the MCU canvas. The MCU canvas coordinate system is a normalized 360x360 unit grid, scaled to the actual canvas resolution at render time.

Layout Definitions

Each <layout> element contains one or more <image> child elements. Image placement attributes:

AttributePurpose
xHorizontal offset of the top-left corner in canvas units.
yVertical offset of the top-left corner in canvas units.
scaleWidth of the slot in canvas units. Height is derived from the aspect ratio.
hscaleExplicit height override in canvas units (for non-square slots).
floortrue marks this slot as reserved for the audio floor holder.
floor-onlySlot is filled only when there is a floor holder and a floor holder is present.
overlaptrue renders this slot on top of the primary layer (picture-in-picture).
zoomtrue crops and zooms the source video to fill the slot without letterboxing.
reservation_idNamed reservation (for example, presenter, secondary, third) used for explicit member placement.
auto-3d-positionLayout attribute (on the <layout> element, not <image>) that enables automatic 3D positioning for members with positional flag.

Bundled layout names:

1x1, 2x1, 1x2, 2x1-zoom, 3x1-zoom, 2x2, 3x3, 4x4, 5x5, 6x6, 8x8, 5-grid-zoom, 3x2-zoom, 7-grid-zoom, 4x2-zoom, 1x1+2x1, 1up_top_left+5, 1up_top_left+7, 1up_top_left+9, 2up_top+8, 2up_middle+8, 2up_bottom+8, 3up+4, 3up+9, 2x1-presenter-zoom, presenter-dual-vertical, presenter-dual-horizontal, presenter-overlap-small-top-right, presenter-overlap-small-bot-right, presenter-overlap-large-top-right, presenter-overlap-large-bot-right, overlaps.

Example: 3x3 layout definition:

<layout name="3x3" auto-3d-position="true">
<image x="0" y="0" scale="120"/>
<image x="120" y="0" scale="120"/>
<image x="240" y="0" scale="120"/>
<image x="0" y="120" scale="120"/>
<image x="120" y="120" scale="120"/>
<image x="240" y="120" scale="120"/>
<image x="0" y="240" scale="120"/>
<image x="120" y="240" scale="120"/>
<image x="240" y="240" scale="120"/>
</layout>

Layout Groups

Groups allow the MCU to automatically promote to a larger layout as membership grows. When a profile sets video-layout-name to group:groupname, the MCU selects the smallest layout in the group that accommodates the current member count.

<groups>
<group name="grid">
<layout>1x1</layout>
<layout>2x1</layout>
<layout>1x1+2x1</layout>
<layout>2x2</layout>
<layout>3x3</layout>
<layout>4x4</layout>
<layout>5x5</layout>
<layout>6x6</layout>
<layout>8x8</layout>
</group>
</groups>

Bundled groups:

GroupLayouts included
grid1x1, 2x1, 1x1+2x1, 2x2, 3x3, 4x4, 5x5, 6x6, 8x8
grid-zoom1x1, 2x1-zoom, 3x1-zoom, 2x2, 5-grid-zoom, 3x2-zoom, 7-grid-zoom, 4x2-zoom, 3x3
1up_top_left_plus1up_top_left+5, 1up_top_left+7, 1up_top_left+9
3up_plus3up+4, 3up+9

Referencing a group in a profile:

<param name="video-layout-name" value="group:grid"/>

The conference Dialplan Application

The conference application places a channel into a conference room; it is also summarized in the dptools reference.

Argument Syntax

conference <roomname>[@<profile>][+<pin>][+flags{<flag>|<flag>...}]
ComponentRequiredDescription
roomnameYesArbitrary string identifying the room. Rooms with identical names share the same conference instance.
@profileNoProfile name from conference.conf.xml. Defaults to default if omitted.
+pinNoPIN submitted by this caller for entry verification.
+flags{...}NoPer-call member flags (pipe-delimited). Merged with conference_member_flags channel variable and profile member-flags.

Example dialplan action:

<action application="conference" data="3001-${domain_name}@default"/>

Joining with a PIN and a moderator flag:

<action application="conference" data="3001-${domain_name}@default+54321+flags{moderator}"/>

Member Flags at Join Time

Member flags can be set in three ways; they are merged at join time:

  1. Profile member-flags parameter (applies to all members using that profile).
  2. conference_member_flags channel variable (set in the dialplan before calling conference).
  3. +flags{...} suffix in the conference application argument.

Setting flags via channel variable:

<action application="set" data="conference_member_flags=moderator|mute"/>
<action application="conference" data="3001-${domain_name}@default"/>

Bridge Mode

The bridge: prefix creates a two-party conference that immediately bridges to a remote endpoint:

conference bridge:<roomname>:<dial-string>

The room is created using the default profile unless the bridge variant specifies otherwise. When the bridged party answers, both legs are placed in the named room.

Example from the default dialplan:

<action application="conference"
data="bridge:mydynaconf:sofia/${use_profile}/1234@conference.freeswitch.org"/>

Default Dialplan Conference Extensions

The vanilla default dialplan context (dialplan/default.xml) provides pre-built conference extensions. All audio-only extensions answer the call before entering the conference.

Extension nameDestination patternProfileDescription
nb_conferences30xx (3000-3099)defaultNarrowband 8 kHz conferences. Room name: DDDD-${domain_name}.
wb_conferences31xx (3100-3199)widebandWideband 16 kHz conferences. Room name: DDDD-${domain_name}.
uwb_conferences32xx (3200-3299)ultrawidebandUltra-wideband 32 kHz conferences. Room name: DDDD-${domain_name}.
cdquality_conferences33xx (3300-3399)cdqualityCD-quality mono 48 kHz conferences. Room name: DDDD-${domain_name}.
cdquality_stereo_conferences35xx with -screen suffixvideo-mcu-stereoVideo MCU 1080p. Sets join-vid-floor member flag. Room name is the bare extension number.
conference-canvases35xx-canvas-Nvideo-mcu-stereoSets second-screen flag and video_initial_watching_canvas, then transfers to 35xx.
cdquality_conferences35xx (3500-3599)video-mcu-stereoVideo MCU 1080p stereo. Room name is the bare extension number.
cdquality_conferences_72036xx (3600-3699)video-mcu-stereo-720Video MCU 720p stereo. Room name is the bare extension number.
cdquality_conferences_48037xx (3700-3799)video-mcu-stereo-480Video MCU 480p stereo. Room name is the bare extension number.
cdquality_conferences_32038xx (3800-3899)video-mcu-stereo-320Video MCU 320p stereo. Room name is the bare extension number.
dynamic_conference5001N/ABridge mode: creates mydynaconf and immediately bridges to 1234@conference.freeswitch.org.

Narrowband conference dialplan extension (verified):

<extension name="nb_conferences">
<condition field="destination_number" expression="^(30\d{2})$">
<action application="answer"/>
<action application="conference" data="$1-${domain_name}@default"/>
</condition>
</extension>

Video MCU 1080p stereo extension (verified):

<extension name="cdquality_conferences">
<condition field="destination_number" expression="^(35\d{2})$">
<action application="answer"/>
<action application="conference" data="$1@video-mcu-stereo"/>
</condition>
</extension>

Note that the video MCU extensions (35xx-38xx) do not append ${domain_name} to the room name, so the room name is the bare extension number. The audio-only extensions (30xx-33xx) append -${domain_name} to namespace rooms per domain.


The conference API

mod_conference registers a single conference API command. It is invoked from the FreeSWITCH CLI (fs_cli), from mod_event_socket, or from the dialplan (via api/bgapi) to inspect and control running conferences. All control actions take the form:

conference <conf_name> <subcommand> [args]

where <conf_name> is the room name. A few global sub-commands (list, xml_list, json_list) can be issued without a conference name to operate across all rooms. The sub-commands below are the complete set registered in conference_api_sub_commands[].

Many member-targeted sub-commands accept a member selector in place of a numeric member ID:

SelectorMeaning
<member_id>A specific member by numeric ID.
allEvery member in the conference.
lastThe most recently joined member.
non_moderatorEvery member that is not a moderator.

In the argument columns below, \| separates alternatives, [ ] marks optional arguments, and < > marks a placeholder.

Membership, Mute, and State

Sub-commandPurposeArguments
muteMute a member (stop their audio from being mixed).<member_id|all|last|non_moderator> [quiet]
unmuteUnmute a member.<member_id|all|last|non_moderator> [quiet]
tmuteToggle a member's mute state.<member_id|all|last|non_moderator> [quiet]
vmuteVideo-mute a member (stop their camera from being mixed onto the canvas).<member_id|all|last|non_moderator> [quiet]
unvmuteRemove a member's video mute.<member_id|all|last|non_moderator> [quiet]
tvmuteToggle a member's video-mute state.<member_id|all|last|non_moderator> [quiet]
vmute-snapCapture a still image of the member's video to use as their video-mute placeholder.<member_id|all|last|non_moderator>
vblindMake a member video-blind (they receive no video).<member_id|all|last|non_moderator> [quiet]
unvblindRemove a member's video-blind state.<member_id|all|last|non_moderator> [quiet]
tvblindToggle a member's video-blind state.<member_id|all|last|non_moderator> [quiet]
deafMake a member deaf (they stop hearing the conference).<member_id|all|last|non_moderator>
undeafRemove a member's deaf state.<member_id|all|last|non_moderator>
holdPlace a member on hold, optionally playing a file to them.<member_id|all|last|non_moderator> [file]
unholdTake a member off hold.<member_id|all|last|non_moderator>
kickRemove a member from the conference, optionally playing a goodbye sound.<member_id|all|last|non_moderator> [sound_file]
hupHang up a member's channel (disconnect the call entirely).<member_id|all|last|non_moderator>
dtmfSend DTMF digits to a member's channel.<member_id|all|last|non_moderator> <digits>
relateSet a relationship between members (one-way mute/deaf, or clear).<member_id[,...]> <other_member_id[,...]> [nospeak|nohear|clear]
transferMove one or more members to another conference.<conference_name> <member_id> [<member_id> ...]
floorGrant the audio floor to a member.<member_id|last>

Audio: Energy, AGC, and Volume

Sub-commandPurposeArguments
energyGet or set the energy (talk-detection) threshold for a member.<member_id|all|last|non_moderator> [<newval>]
auto-energyGet or set the automatic energy-tracking level for a member.<member_id|all|last|non_moderator> [<newval>]
max-energyGet or set the maximum energy level (loud-member suppression) for a member.<member_id|all|last|non_moderator> [<newval>]
agcGet or set automatic gain control for a member.<member_id|all|last|non_moderator> [<newval>]
volume_inGet or set a member's input (transmit) volume.<member_id|all|last|non_moderator> [<newval>]
volume_outGet or set a member's output (receive) volume.<member_id|all|last|non_moderator> [<newval>]
positionSet a member's 3D audio position (requires positional audio).<member_id> <x>:<y>:<z>
auto-3d-positionToggle or set automatic 3D positioning for the conference.[on|off]
file-volSet the playback volume of currently playing files.<vol#>

Sounds and Playback

Sub-commandPurposeArguments
playPlay a file into the conference (to all, async, or to one member).<file_path> [async|<member_id> [nomux]]
pause_playPause or resume the currently playing file. Registered under the name pause.[<member_id>]
play_statusReport playback status of the current file.[<member_id>]
file_seekSeek within the currently playing file.[+-]<val> [<member_id>]
stopStop file playback.<current|all|async|last> [<member_id>]
mohControl music-on-hold playback.<file_path>|toggle|[on|off]
saySpeak text into the conference (TTS).<text>
saymemberSpeak text privately to one member (TTS).<member_id> <text>
enter_soundControl the per-member enter sound.on|off|none|file <filename>
exit_soundControl the per-member exit sound.on|off|none|file <filename>

Video

Sub-commandPurposeArguments
vid-floorGrant the video floor to a member, optionally forcing it.<member_id|last> [force]
clear-vid-floorClear the current video floor holder.(none)
vid-layoutSet the video layout (or a layout group) for a canvas.<layout_name>|group <group_name> [<canvas_id>]
vid-canvasGet or set which canvas a member is rendered on.<member_id|all|last|non_moderator> [<newval>]
vid-watching-canvasGet or set which canvas a member watches.<member_id|all|last|non_moderator> [<newval>]
vid-layerGet or set which canvas layer a member occupies.<member_id|all|last|non_moderator> [<newval>]
vid-res-idAssign a member to a reservation ID slot (named layout position).<member_id>|all <val>|clear [force]
vid-role-idAssign a video role ID to a member.<member_id|last> <val>|clear
vid-flipFlip a member's inbound video vertically.<member_id|all|last|non_moderator>
vid-filterApply a video filter string to a member.<member_id|all|last|non_moderator> <string>
vid-borderCycle/toggle the video border on a member's slot.<member_id|all|last|non_moderator>
vid-bannerSet overlay banner text on a member's slot.<member_id|last> <text>
vid-mute-imgSet or clear the member's video-mute placeholder image.<member_id|last> [<path>|clear]
vid-logo-imgSet or clear a logo image overlaid on the member's slot.<member_id|last> [<path>|clear]
vid-codec-groupSet or clear the member's video codec group.<member_id|last> [<group>|clear]
vid-fpsSet the canvas output frame rate.<fps>
vid-resSet the canvas output resolution.<WxH>
vid-bandwidthSet the video encoder bandwidth target.<BW>
vid-fgimgSet or clear the canvas foreground image.<file>|clear [<canvas_id>]
vid-bgimgSet or clear the canvas background image.<file>|clear [<canvas_id>]
vid-write-pngWrite the current canvas to a PNG file.<path>
vid-personalToggle personal-canvas (per-member) mode for the conference.[on|off]
camAdjust per-layer camera settings (zoom/pan and related layer attributes).<canvas_id> <layer_id> <attr>=<val> [...]
canvas-auto-clearEnable or disable automatic clearing of a canvas.<canvas_id> <true|false>
get-uuidReturn the channel UUID of a member.<member_id|last>

Recording

Sub-commandPurposeArguments
recordStart recording the conference to a file.<filename>
norecordStop a named recording, or all recordings.<filename|all>
chkrecordCheck the recording status of a conference.<confname>
pausePause an active recording.<filename>
resumeResume a paused recording.<filename>
recordingCombined recording control (start/stop/check/pause/resume).[start|stop|check|pause|resume] [<filename>|all]

Outbound Dial

Sub-commandPurposeArguments
dialOriginate an outbound call and join the answered party to the conference (blocking).<endpoint_module>/<destination> <callerid_number> <callerid_name>
bgdialSame as dial but originates in the background (non-blocking).<endpoint_module>/<destination> <callerid_number> <callerid_name>

Locking, PIN, and Vars

Sub-commandPurposeArguments
lockLock the conference (reject new members).(none)
unlockUnlock the conference.(none)
pinSet the conference entry PIN.<pin#>
nopinClear the conference entry PIN.(none)
getvarRead a conference variable.<varname>
setvarSet a conference variable.<varname> <value>
getRead a built-in conference parameter.<parameter-name>
setSet a built-in conference parameter.<max_members|sound_prefix|caller_id_name|caller_id_number|endconference_grace_time> <value>

Listing and Status

Sub-commandPurposeArguments
listList conferences and members (text). May run without a conference name.[delim <string>]|[count]
xml_listList conferences and members as XML.(none)
json_listList conferences and members as JSON.[compact]
countReport the member count of the conference.(none)

Example invocations:

conference 3001-example.com mute all
conference 3001-example.com play conference/welcome.wav async
conference 3001-example.com vid-layout group:grid
conference 3001-example.com bgdial sofia/internal/2000@example.com 2000 "Conf Dial"
conference list