2805 lines
87 KiB
C++
2805 lines
87 KiB
C++
/*
|
|
* Copyright (C) 2013 Teluu Inc. (http://www.teluu.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef __PJSUA2_MEDIA_HPP__
|
|
#define __PJSUA2_MEDIA_HPP__
|
|
|
|
/**
|
|
* @file pjsua2/media.hpp
|
|
* @brief PJSUA2 media operations
|
|
*/
|
|
#include <pjsua-lib/pjsua.h>
|
|
#include <pjsua2/types.hpp>
|
|
|
|
/** PJSUA2 API is inside pj namespace */
|
|
namespace pj
|
|
{
|
|
|
|
/**
|
|
* @defgroup PJSUA2_MED Media
|
|
* @ingroup PJSUA2_Ref
|
|
* @{
|
|
*/
|
|
|
|
using std::string;
|
|
using std::vector;
|
|
|
|
/**
|
|
* This structure contains all the information needed to completely describe
|
|
* a media.
|
|
*/
|
|
struct MediaFormat
|
|
{
|
|
/**
|
|
* The format id that specifies the audio sample or video pixel format.
|
|
* Some well known formats ids are declared in pjmedia_format_id
|
|
* enumeration.
|
|
*
|
|
* @see pjmedia_format_id
|
|
*/
|
|
pj_uint32_t id;
|
|
|
|
/**
|
|
* The top-most type of the media, as an information.
|
|
*/
|
|
pjmedia_type type;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
MediaFormat() : id(0), type(PJMEDIA_TYPE_NONE)
|
|
{}
|
|
};
|
|
|
|
/**
|
|
* This structure describe detail information about an audio media.
|
|
*/
|
|
struct MediaFormatAudio : public MediaFormat
|
|
{
|
|
unsigned clockRate; /**< Audio clock rate in samples or Hz. */
|
|
unsigned channelCount; /**< Number of channels. */
|
|
unsigned frameTimeUsec; /**< Frame interval, in microseconds. */
|
|
unsigned bitsPerSample; /**< Number of bits per sample. */
|
|
pj_uint32_t avgBps; /**< Average bitrate */
|
|
pj_uint32_t maxBps; /**< Maximum bitrate */
|
|
|
|
/**
|
|
* Construct from pjmedia_format.
|
|
*/
|
|
void fromPj(const pjmedia_format &format);
|
|
|
|
/**
|
|
* Export to pjmedia_format.
|
|
*/
|
|
pjmedia_format toPj() const;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
MediaFormatAudio() : clockRate(0), channelCount(0), frameTimeUsec(0),
|
|
bitsPerSample(0), avgBps(0), maxBps(0)
|
|
{}
|
|
|
|
/**
|
|
* Initialization
|
|
*/
|
|
void init(pj_uint32_t formatId, unsigned clockRate, unsigned channelCount,
|
|
int frameTimeUsec, int bitsPerSample,
|
|
pj_uint32_t avgBps=0, pj_uint32_t maxBps=0);
|
|
};
|
|
|
|
/**
|
|
* This structure describe detail information about an video media.
|
|
*/
|
|
struct MediaFormatVideo : public MediaFormat
|
|
{
|
|
unsigned width; /**< Video width. */
|
|
unsigned height; /**< Video height. */
|
|
int fpsNum; /**< Frames per second numerator. */
|
|
int fpsDenum; /**< Frames per second denumerator. */
|
|
pj_uint32_t avgBps; /**< Average bitrate. */
|
|
pj_uint32_t maxBps; /**< Maximum bitrate. */
|
|
|
|
/**
|
|
* Construct from pjmedia_format.
|
|
*/
|
|
void fromPj(const pjmedia_format &format);
|
|
|
|
/**
|
|
* Export to pjmedia_format.
|
|
*/
|
|
pjmedia_format toPj() const;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
MediaFormatVideo() : width(0), height(0), fpsNum(0),
|
|
fpsDenum(1), avgBps(0), maxBps(0)
|
|
{}
|
|
|
|
/**
|
|
* Initialization
|
|
*/
|
|
void init(pj_uint32_t formatId, unsigned width, unsigned height,
|
|
int fpsNum, int fpsDenum=1,
|
|
pj_uint32_t avgBps=0, pj_uint32_t maxBps=0);
|
|
};
|
|
|
|
/** Array of MediaFormatAudio */
|
|
typedef std::vector<MediaFormatAudio> MediaFormatAudioVector;
|
|
|
|
/** Array of MediaFormatVideo */
|
|
typedef std::vector<MediaFormatVideo> MediaFormatVideoVector;
|
|
|
|
/**
|
|
* This structure descibes information about a particular media port that
|
|
* has been registered into the conference bridge.
|
|
*/
|
|
struct ConfPortInfo
|
|
{
|
|
/**
|
|
* Conference port number.
|
|
*/
|
|
int portId;
|
|
|
|
/**
|
|
* Port name.
|
|
*/
|
|
string name;
|
|
|
|
/**
|
|
* Media audio format information
|
|
*/
|
|
MediaFormatAudio format;
|
|
|
|
/**
|
|
* Tx level adjustment. Value 1.0 means no adjustment, value 0 means
|
|
* the port is muted, value 2.0 means the level is amplified two times.
|
|
*/
|
|
float txLevelAdj;
|
|
|
|
/**
|
|
* Rx level adjustment. Value 1.0 means no adjustment, value 0 means
|
|
* the port is muted, value 2.0 means the level is amplified two times.
|
|
*/
|
|
float rxLevelAdj;
|
|
|
|
/**
|
|
* Array of listeners (in other words, ports where this port is
|
|
* transmitting to).
|
|
*/
|
|
IntVector listeners;
|
|
|
|
public:
|
|
/**
|
|
* Construct from pjsua_conf_port_info.
|
|
*/
|
|
void fromPj(const pjsua_conf_port_info &port_info);
|
|
};
|
|
|
|
/**
|
|
* Media port, corresponds to pjmedia_port
|
|
*/
|
|
typedef void *MediaPort;
|
|
|
|
/**
|
|
* Media.
|
|
*/
|
|
class Media
|
|
{
|
|
public:
|
|
/**
|
|
* Virtual destructor.
|
|
*/
|
|
virtual ~Media();
|
|
|
|
/**
|
|
* Get type of the media.
|
|
*
|
|
* @return The media type.
|
|
*/
|
|
pjmedia_type getType() const;
|
|
|
|
protected:
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
Media(pjmedia_type med_type);
|
|
|
|
private:
|
|
/**
|
|
* Media type.
|
|
*/
|
|
pjmedia_type type;
|
|
};
|
|
|
|
/**
|
|
* Parameters for AudioMedia::startTransmit2() method.
|
|
*/
|
|
struct AudioMediaTransmitParam
|
|
{
|
|
/**
|
|
* Signal level adjustment. Value 1.0 means no level adjustment,
|
|
* while value 0 means to mute the port.
|
|
*
|
|
* Default: 1.0
|
|
*/
|
|
float level;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
AudioMediaTransmitParam();
|
|
};
|
|
|
|
/**
|
|
* Audio Media. This is a lite wrapper class for audio conference bridge port,
|
|
* i.e: this class only maintains one data member, conference slot ID, and
|
|
* the methods are simply proxies for conference bridge operations.
|
|
*
|
|
* Application can create a derived class and use registerMediaPort2()/
|
|
* unregisterMediaPort() to register/unregister a media port to/from the
|
|
* conference bridge.
|
|
*
|
|
* The library will not keep a list of AudioMedia instances, so any
|
|
* AudioMedia (descendant) instances instantiated by application must be
|
|
* maintained and destroyed by the application itself.
|
|
*
|
|
* Note that any PJSUA2 APIs that return AudioMedia instance(s) such as
|
|
* Endpoint::mediaEnumPorts2() or Call::getAudioMedia() will just return
|
|
* generated copy. All AudioMedia methods should work normally on this
|
|
* generated copy instance.
|
|
*/
|
|
class AudioMedia : public Media
|
|
{
|
|
public:
|
|
/**
|
|
* Get information about the specified conference port.
|
|
*/
|
|
ConfPortInfo getPortInfo() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get port Id.
|
|
*/
|
|
int getPortId() const;
|
|
|
|
/**
|
|
* Get information from specific port id.
|
|
*/
|
|
static ConfPortInfo getPortInfoFromId(int port_id) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Establish unidirectional media flow to sink. This media port
|
|
* will act as a source, and it may transmit to multiple destinations/sink.
|
|
* And if multiple sources are transmitting to the same sink, the media
|
|
* will be mixed together. Source and sink may refer to the same Media,
|
|
* effectively looping the media.
|
|
*
|
|
* If bidirectional media flow is desired, application needs to call
|
|
* this method twice, with the second one called from the opposite source
|
|
* media.
|
|
*
|
|
* @param sink The destination Media.
|
|
*/
|
|
void startTransmit(const AudioMedia &sink) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Establish unidirectional media flow to sink. This media port
|
|
* will act as a source, and it may transmit to multiple destinations/sink.
|
|
* And if multiple sources are transmitting to the same sink, the media
|
|
* will be mixed together. Source and sink may refer to the same Media,
|
|
* effectively looping the media.
|
|
*
|
|
* Signal level from this source to the sink can be adjusted by making
|
|
* it louder or quieter via the parameter param. The level adjustment
|
|
* will apply to a specific connection only (i.e. only for signal
|
|
* from this source to the sink), as compared to
|
|
* adjustTxLevel()/adjustRxLevel() which applies to all signals from/to
|
|
* this media port. The signal adjustment
|
|
* will be cumulative, in this following order:
|
|
* signal from this source will be adjusted with the level specified
|
|
* in adjustTxLevel(), then with the level specified via this API,
|
|
* and finally with the level specified to the sink's adjustRxLevel().
|
|
*
|
|
* If bidirectional media flow is desired, application needs to call
|
|
* this method twice, with the second one called from the opposite source
|
|
* media.
|
|
*
|
|
* @param sink The destination Media.
|
|
* @param param The parameter.
|
|
*/
|
|
void startTransmit2(const AudioMedia &sink,
|
|
const AudioMediaTransmitParam ¶m) const
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Stop media flow to destination/sink port.
|
|
*
|
|
* @param sink The destination media.
|
|
*
|
|
*/
|
|
void stopTransmit(const AudioMedia &sink) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Adjust the signal level to be transmitted from the bridge to this
|
|
* media port by making it louder or quieter.
|
|
*
|
|
* @param level Signal level adjustment. Value 1.0 means no
|
|
* level adjustment, while value 0 means to mute
|
|
* the port.
|
|
*/
|
|
void adjustRxLevel(float level) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Adjust the signal level to be received from this media port (to
|
|
* the bridge) by making it louder or quieter.
|
|
*
|
|
* @param level Signal level adjustment. Value 1.0 means no
|
|
* level adjustment, while value 0 means to mute
|
|
* the port.
|
|
*/
|
|
void adjustTxLevel(float level) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the last received signal level.
|
|
*
|
|
* @return Signal level in percent.
|
|
*/
|
|
unsigned getRxLevel() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the last transmitted signal level.
|
|
*
|
|
* @return Signal level in percent.
|
|
*/
|
|
unsigned getTxLevel() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Warning: deprecated and will be removed in future release.
|
|
*
|
|
* Typecast from base class Media. This is useful for application written
|
|
* in language that does not support downcasting such as Python.
|
|
*
|
|
* @param media The object to be downcasted
|
|
*
|
|
* @return The object as AudioMedia instance
|
|
*/
|
|
static AudioMedia* typecastFromMedia(Media *media);
|
|
|
|
/**
|
|
* Default Constructor.
|
|
*
|
|
* Normally application will not create AudioMedia object directly,
|
|
* but it instantiates an AudioMedia derived class. This is set as public
|
|
* because some STL vector implementations require it.
|
|
*/
|
|
AudioMedia();
|
|
|
|
/**
|
|
* Virtual Destructor.
|
|
*/
|
|
virtual ~AudioMedia();
|
|
|
|
protected:
|
|
/**
|
|
* Conference port Id.
|
|
*/
|
|
int id;
|
|
|
|
protected:
|
|
/**
|
|
* Warning: deprecated and will be removed in future release, use
|
|
* registerMediaPort2() instead.
|
|
*
|
|
* This method needs to be called by descendants of this class to register
|
|
* the media port created to the conference bridge and Endpoint's
|
|
* media list.
|
|
*
|
|
* param port The media port to be registered to the conference bridge.
|
|
*
|
|
*/
|
|
void registerMediaPort(MediaPort port) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This method needs to be called by descendants of this class to register
|
|
* the media port created to the conference bridge and Endpoint's
|
|
* media list.
|
|
*
|
|
* param port The media port to be registered to the conference bridge.
|
|
* param pool The memory pool.
|
|
*
|
|
*/
|
|
void registerMediaPort2(MediaPort port, pj_pool_t *pool)
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This method needs to be called by descendants of this class to remove
|
|
* the media port from the conference bridge and Endpoint's media list.
|
|
* Descendant should only call this method if it has registered the media
|
|
* with the previous call to registerMediaPort().
|
|
*/
|
|
void unregisterMediaPort() PJSUA2_THROW(Error);
|
|
|
|
private:
|
|
/* Memory pool for deprecated registerMediaPort() */
|
|
pj_caching_pool mediaCachingPool;
|
|
pj_pool_t *mediaPool;
|
|
};
|
|
|
|
/**
|
|
* Warning: deprecated, use AudioMediaVector2 instead.
|
|
*
|
|
* Array of Audio Media.
|
|
*/
|
|
typedef std::vector<AudioMedia*> AudioMediaVector;
|
|
|
|
|
|
/** Array of Audio Media */
|
|
typedef std::vector<AudioMedia> AudioMediaVector2;
|
|
|
|
/**
|
|
* This structure describes a media frame.
|
|
*/
|
|
struct MediaFrame
|
|
{
|
|
pjmedia_frame_type type; /**< Frame type. */
|
|
ByteVector buf; /**< Frame buffer content. */
|
|
unsigned size; /**< Frame size in bytes. */
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
MediaFrame()
|
|
: type(PJMEDIA_FRAME_TYPE_NONE),
|
|
size(0)
|
|
{}
|
|
};
|
|
|
|
/**
|
|
* Audio Media Port.
|
|
*/
|
|
class AudioMediaPort : public AudioMedia
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
AudioMediaPort();
|
|
|
|
/**
|
|
* Destructor. This will unregister the audio media port from the
|
|
* conference bridge.
|
|
*/
|
|
virtual ~AudioMediaPort();
|
|
|
|
/**
|
|
* Create an audio media port and register it to the conference bridge.
|
|
*
|
|
* @param name The port name.
|
|
* @param fmt The audio format.
|
|
*/
|
|
void createPort(const string &name, MediaFormatAudio &fmt)
|
|
PJSUA2_THROW(Error);
|
|
|
|
/*
|
|
* Callbacks
|
|
*/
|
|
/**
|
|
* This callback is called to request a frame from this port. On input,
|
|
* frame.size indicates the capacity of the frame buffer and frame.buf
|
|
* will initially be an empty vector. Application can then set the frame
|
|
* type and fill the vector.
|
|
*
|
|
* @param frame The frame.
|
|
*/
|
|
virtual void onFrameRequested(MediaFrame &frame)
|
|
{ PJ_UNUSED_ARG(frame); }
|
|
|
|
/**
|
|
* This callback is called when this port receives a frame. The frame
|
|
* content will be provided in frame.buf vector, and the frame size
|
|
* can be found in either frame.size or the vector's size (both
|
|
* have the same value).
|
|
*
|
|
* @param frame The frame.
|
|
*/
|
|
virtual void onFrameReceived(MediaFrame &frame)
|
|
{ PJ_UNUSED_ARG(frame); }
|
|
|
|
private:
|
|
pj_pool_t *pool;
|
|
pjmedia_port port;
|
|
};
|
|
|
|
/**
|
|
* This structure contains additional info about AudioMediaPlayer.
|
|
*/
|
|
struct AudioMediaPlayerInfo
|
|
{
|
|
/**
|
|
* Format ID of the payload.
|
|
*/
|
|
pjmedia_format_id formatId;
|
|
|
|
/**
|
|
* The number of bits per sample of the file payload. For example,
|
|
* the value is 16 for PCM WAV and 8 for Alaw/Ulas WAV files.
|
|
*/
|
|
unsigned payloadBitsPerSample;
|
|
|
|
/**
|
|
* The WAV payload size in bytes.
|
|
*/
|
|
pj_uint32_t sizeBytes;
|
|
|
|
/**
|
|
* The WAV payload size in samples.
|
|
*/
|
|
pj_uint32_t sizeSamples;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
AudioMediaPlayerInfo()
|
|
: formatId(PJMEDIA_FORMAT_L16),
|
|
payloadBitsPerSample(0),
|
|
sizeBytes(0),
|
|
sizeSamples(0)
|
|
{}
|
|
};
|
|
|
|
/**
|
|
* Audio Media Player.
|
|
*/
|
|
class AudioMediaPlayer : public AudioMedia
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
AudioMediaPlayer();
|
|
|
|
/**
|
|
* Create a file player, and automatically add this
|
|
* player to the conference bridge.
|
|
*
|
|
* @param file_name The filename to be played. Currently only
|
|
* WAV files are supported, and the WAV file MUST be
|
|
* formatted as 16bit PCM mono/single channel (any
|
|
* clock rate is supported).
|
|
* @param options Optional option flag. Application may specify
|
|
* PJMEDIA_FILE_NO_LOOP to prevent playback loop.
|
|
*/
|
|
void createPlayer(const string &file_name,
|
|
unsigned options=0) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Create a file playlist media port, and automatically add the port
|
|
* to the conference bridge.
|
|
*
|
|
* @param file_names Array of file names to be added to the play list.
|
|
* Note that the files must have the same clock rate,
|
|
* number of channels, and number of bits per sample.
|
|
* @param label Optional label to be set for the media port.
|
|
* @param options Optional option flag. Application may specify
|
|
* PJMEDIA_FILE_NO_LOOP to prevent looping.
|
|
*/
|
|
void createPlaylist(const StringVector &file_names,
|
|
const string &label="",
|
|
unsigned options=0) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get additional info about the player. This operation is only valid
|
|
* for player. For playlist, Error will be thrown.
|
|
*
|
|
* @return the info.
|
|
*/
|
|
AudioMediaPlayerInfo getInfo() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get current playback position in samples. This operation is not valid
|
|
* for playlist.
|
|
*
|
|
* @return Current playback position, in samples.
|
|
*/
|
|
pj_uint32_t getPos() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set playback position in samples. This operation is not valid for
|
|
* playlist.
|
|
*
|
|
* @param samples The desired playback position, in samples.
|
|
*/
|
|
void setPos(pj_uint32_t samples) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Warning: deprecated and will be removed in future release.
|
|
*
|
|
* Typecast from base class AudioMedia. This is useful for application
|
|
* written in language that does not support downcasting such as Python.
|
|
*
|
|
* @param media The object to be downcasted
|
|
*
|
|
* @return The object as AudioMediaPlayer instance
|
|
*/
|
|
static AudioMediaPlayer* typecastFromAudioMedia(AudioMedia *media);
|
|
|
|
/**
|
|
* Destructor. This will unregister the player port from the conference
|
|
* bridge.
|
|
*/
|
|
virtual ~AudioMediaPlayer();
|
|
|
|
public:
|
|
/*
|
|
* Callbacks
|
|
*/
|
|
|
|
|
|
/* Unfortunately for pjsua2, a hard deprecation is inevitable. */
|
|
#if 0 // !DEPRECATED_FOR_TICKET_2251
|
|
/**
|
|
* Register a callback to be called when the file player reading has
|
|
* reached the end of file, or when the file reading has reached the
|
|
* end of file of the last file for a playlist. If the file or playlist
|
|
* is set to play repeatedly, then the callback will be called multiple
|
|
* times.
|
|
*
|
|
* @return If the callback returns false, the playback
|
|
* will stop. Note that if application destroys
|
|
* the player in the callback, it must return
|
|
* false here.
|
|
*/
|
|
virtual bool onEof()
|
|
{ return true; }
|
|
#endif
|
|
|
|
/**
|
|
* Register a callback to be called when the file player reading has
|
|
* reached the end of file, or when the file reading has reached the
|
|
* end of file of the last file for a playlist. If the file or playlist
|
|
* is set to play repeatedly, then the callback will be called multiple
|
|
* times.
|
|
*
|
|
* If application wishes to stop the playback, it can stop the media
|
|
* transmission in the callback, and only after all transmissions have
|
|
* been stopped, could the application safely destroy the player.
|
|
*/
|
|
virtual void onEof2()
|
|
{ }
|
|
|
|
private:
|
|
/**
|
|
* Player Id.
|
|
*/
|
|
int playerId;
|
|
|
|
/**
|
|
* Low level PJMEDIA callback
|
|
*/
|
|
static void eof_cb(pjmedia_port *port,
|
|
void *usr_data);
|
|
};
|
|
|
|
/**
|
|
* Audio Media Recorder.
|
|
*/
|
|
class AudioMediaRecorder : public AudioMedia
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
AudioMediaRecorder();
|
|
|
|
/**
|
|
* Create a file recorder, and automatically connect this recorder to
|
|
* the conference bridge. The recorder currently supports recording WAV
|
|
* file. The type of the recorder to use is determined by the extension of
|
|
* the file (e.g. ".wav").
|
|
*
|
|
* @param file_name Output file name. The function will determine the
|
|
* default format to be used based on the file extension.
|
|
* Currently ".wav" is supported on all platforms.
|
|
* @param enc_type Optionally specify the type of encoder to be used to
|
|
* compress the media, if the file can support different
|
|
* encodings. This value must be zero for now.
|
|
* @param max_size Maximum file size. Specify zero or -1 to remove size
|
|
* limitation. This value must be zero or -1 for now.
|
|
* @param options Optional options, which can be used to specify the
|
|
* recording file format. Supported options are
|
|
* PJMEDIA_FILE_WRITE_PCM, PJMEDIA_FILE_WRITE_ALAW,
|
|
* and PJMEDIA_FILE_WRITE_ULAW. Default is zero or
|
|
* PJMEDIA_FILE_WRITE_PCM.
|
|
*/
|
|
void createRecorder(const string &file_name,
|
|
unsigned enc_type=0,
|
|
long max_size=0,
|
|
unsigned options=0) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Warning: deprecated and will be removed in future release.
|
|
*
|
|
* Typecast from base class AudioMedia. This is useful for application
|
|
* written in language that does not support downcasting such as Python.
|
|
*
|
|
* @param media The object to be downcasted
|
|
*
|
|
* @return The object as AudioMediaRecorder instance
|
|
*/
|
|
static AudioMediaRecorder* typecastFromAudioMedia(AudioMedia *media);
|
|
|
|
/**
|
|
* Destructor. This will unregister the recorder port from the conference
|
|
* bridge.
|
|
*/
|
|
virtual ~AudioMediaRecorder();
|
|
|
|
private:
|
|
/**
|
|
* Recorder Id.
|
|
*/
|
|
int recorderId;
|
|
};
|
|
|
|
/**
|
|
* Tone descriptor (abstraction for pjmedia_tone_desc)
|
|
*/
|
|
class ToneDesc : public pjmedia_tone_desc
|
|
{
|
|
public:
|
|
ToneDesc()
|
|
{
|
|
pj_bzero(this, sizeof(*this));
|
|
}
|
|
~ToneDesc() {}
|
|
};
|
|
|
|
/**
|
|
* Array of tone descriptor.
|
|
*/
|
|
typedef std::vector<ToneDesc> ToneDescVector;
|
|
|
|
/**
|
|
* Tone digit (abstraction for pjmedia_tone_digit)
|
|
*/
|
|
class ToneDigit : public pjmedia_tone_digit
|
|
{
|
|
public:
|
|
ToneDigit()
|
|
{
|
|
pj_bzero(this, sizeof(*this));
|
|
}
|
|
~ToneDigit() {}
|
|
};
|
|
|
|
/**
|
|
* Array of tone digits.
|
|
*/
|
|
typedef std::vector<ToneDigit> ToneDigitVector;
|
|
|
|
/**
|
|
* A digit in tone digit map
|
|
*/
|
|
struct ToneDigitMapDigit
|
|
{
|
|
public:
|
|
string digit; /**< the digit */
|
|
int freq1; /**< first frequency */
|
|
int freq2; /**< second frequency */
|
|
};
|
|
|
|
/**
|
|
* Tone digit map
|
|
*/
|
|
typedef std::vector<ToneDigitMapDigit> ToneDigitMapVector;
|
|
|
|
/**
|
|
* Tone generator.
|
|
*/
|
|
class ToneGenerator : public AudioMedia
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
ToneGenerator();
|
|
|
|
/**
|
|
* Destructor. This will unregister the tone generator port from the
|
|
* conference bridge.
|
|
*/
|
|
~ToneGenerator();
|
|
|
|
/**
|
|
* Create tone generator and register the port to the conference bridge.
|
|
*/
|
|
void createToneGenerator(unsigned clock_rate = 16000,
|
|
unsigned channel_count = 1) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Check if the tone generator is still busy producing some tones.
|
|
* @return Non-zero if busy.
|
|
*/
|
|
bool isBusy() const;
|
|
|
|
/**
|
|
* Instruct the tone generator to stop current processing.
|
|
*/
|
|
void stop() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Rewind the playback. This will start the playback to the first
|
|
* tone in the playback list.
|
|
*/
|
|
void rewind() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Instruct the tone generator to play single or dual frequency tones
|
|
* with the specified duration. The new tones will be appended to
|
|
* currently playing tones, unless stop() is called before calling this
|
|
* function. The playback will begin as soon as the tone generator is
|
|
* connected to other media.
|
|
*
|
|
* @param tones Array of tones to be played.
|
|
* @param loop Play the tone in a loop.
|
|
*/
|
|
void play(const ToneDescVector &tones,
|
|
bool loop=false) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Instruct the tone generator to play multiple MF digits with each of
|
|
* the digits having individual ON/OFF duration. Each of the digit in the
|
|
* digit array must have the corresponding descriptor in the digit map.
|
|
* The new tones will be appended to currently playing tones, unless
|
|
* stop() is called before calling this function. The playback will begin
|
|
* as soon as the tone generator is connected to a sink media.
|
|
*
|
|
* @param digits Array of MF digits.
|
|
* @param loop Play the tone in a loop.
|
|
*/
|
|
void playDigits(const ToneDigitVector &digits,
|
|
bool loop=false) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the digit-map currently used by this tone generator.
|
|
*
|
|
* @return The digitmap currently used by the tone generator
|
|
*/
|
|
ToneDigitMapVector getDigitMap() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set digit map to be used by the tone generator.
|
|
*
|
|
* @param digit_map Digitmap to be used by the tone generator.
|
|
*/
|
|
void setDigitMap(const ToneDigitMapVector &digit_map) PJSUA2_THROW(Error);
|
|
|
|
private:
|
|
pj_pool_t *pool;
|
|
pjmedia_port *tonegen;
|
|
pjmedia_tone_digit_map digitMap;
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
* Sound device management
|
|
*/
|
|
|
|
/**
|
|
* Audio device information structure.
|
|
*/
|
|
struct AudioDevInfo
|
|
{
|
|
/**
|
|
* The device ID
|
|
*/
|
|
pjmedia_aud_dev_index id;
|
|
|
|
/**
|
|
* The device name
|
|
*/
|
|
string name;
|
|
|
|
/**
|
|
* Maximum number of input channels supported by this device. If the
|
|
* value is zero, the device does not support input operation (i.e.
|
|
* it is a playback only device).
|
|
*/
|
|
unsigned inputCount;
|
|
|
|
/**
|
|
* Maximum number of output channels supported by this device. If the
|
|
* value is zero, the device does not support output operation (i.e.
|
|
* it is an input only device).
|
|
*/
|
|
unsigned outputCount;
|
|
|
|
/**
|
|
* Default sampling rate.
|
|
*/
|
|
unsigned defaultSamplesPerSec;
|
|
|
|
/**
|
|
* The underlying driver name
|
|
*/
|
|
string driver;
|
|
|
|
/**
|
|
* Device capabilities, as bitmask combination of pjmedia_aud_dev_cap.
|
|
*/
|
|
unsigned caps;
|
|
|
|
/**
|
|
* Supported audio device routes, as bitmask combination of
|
|
* pjmedia_aud_dev_route. The value may be zero if the device
|
|
* does not support audio routing.
|
|
*/
|
|
unsigned routes;
|
|
|
|
/**
|
|
* Array of supported extended audio formats
|
|
*/
|
|
MediaFormatAudioVector extFmt;
|
|
|
|
/**
|
|
* Construct from pjmedia_aud_dev_info.
|
|
*/
|
|
void fromPj(const pjmedia_aud_dev_info &dev_info);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
~AudioDevInfo();
|
|
};
|
|
|
|
/**
|
|
* Warning: deprecated, use AudioDevInfoVector2 instead.
|
|
*
|
|
* Array of audio device info.
|
|
*/
|
|
typedef std::vector<AudioDevInfo*> AudioDevInfoVector;
|
|
|
|
/** Array of audio device info */
|
|
typedef std::vector<AudioDevInfo> AudioDevInfoVector2;
|
|
|
|
/**
|
|
* Audio device manager.
|
|
*/
|
|
class AudDevManager
|
|
{
|
|
public:
|
|
/**
|
|
* Get currently active capture sound devices. If sound devices has not been
|
|
* created, it is possible that the function returns -1 as device IDs.
|
|
*
|
|
* @return Device ID of the capture device.
|
|
*/
|
|
int getCaptureDev() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the AudioMedia of the capture audio device.
|
|
*
|
|
* @return Audio media for the capture device.
|
|
*/
|
|
AudioMedia &getCaptureDevMedia() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get currently active playback sound devices. If sound devices has not
|
|
* been created, it is possible that the function returns -1 as device IDs.
|
|
*
|
|
* @return Device ID of the playback device.
|
|
*/
|
|
int getPlaybackDev() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the AudioMedia of the speaker/playback audio device.
|
|
*
|
|
* @return Audio media for the speaker/playback device.
|
|
*/
|
|
AudioMedia &getPlaybackDevMedia() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Select or change capture sound device. Application may call this
|
|
* function at any time to replace current sound device. Calling this
|
|
* method will not change the state of the sound device (opened/closed).
|
|
*
|
|
* @param capture_dev Device ID of the capture device.
|
|
*/
|
|
void setCaptureDev(int capture_dev) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Select or change playback sound device. Application may call this
|
|
* function at any time to replace current sound device. Calling this
|
|
* method will not change the state of the sound device (opened/closed).
|
|
*
|
|
* @param playback_dev Device ID of the playback device.
|
|
*/
|
|
void setPlaybackDev(int playback_dev) const PJSUA2_THROW(Error);
|
|
|
|
#if !DEPRECATED_FOR_TICKET_2232
|
|
/**
|
|
* Warning: deprecated, use enumDev2 instead. This function is not
|
|
* safe in multithreaded environment.
|
|
*
|
|
* Enum all audio devices installed in the system. This function is not
|
|
* safe in multithreaded environment.
|
|
*
|
|
* @return The list of audio device info.
|
|
*/
|
|
const AudioDevInfoVector &enumDev() PJSUA2_THROW(Error);
|
|
#endif
|
|
|
|
/**
|
|
* Enum all audio devices installed in the system.
|
|
*
|
|
* @return The list of audio device info.
|
|
*/
|
|
AudioDevInfoVector2 enumDev2() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set pjsua to use null sound device. The null sound device only provides
|
|
* the timing needed by the conference bridge, and will not interract with
|
|
* any hardware.
|
|
*
|
|
*/
|
|
void setNullDev() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Disconnect the main conference bridge from any sound devices, and let
|
|
* application connect the bridge to it's own sound device/master port.
|
|
*
|
|
* @return The port interface of the conference bridge,
|
|
* so that application can connect this to it's
|
|
* own sound device or master port.
|
|
*/
|
|
MediaPort *setNoDev();
|
|
|
|
/**
|
|
* Set sound device mode.
|
|
*
|
|
* Note that this method will open the sound device, using current
|
|
* active IDs set via setCaptureDev() or setPlaybackDev(), if the flag
|
|
* PJSUA_SND_DEV_NO_IMMEDIATE_OPEN is not specified.
|
|
*
|
|
* @param mode The sound device mode, as bitmask combination
|
|
* of #pjsua_snd_dev_mode
|
|
*
|
|
*/
|
|
void setSndDevMode(unsigned mode) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Change the echo cancellation settings.
|
|
*
|
|
* The behavior of this function depends on whether the sound device is
|
|
* currently active, and if it is, whether device or software AEC is
|
|
* being used.
|
|
*
|
|
* If the sound device is currently active, and if the device supports AEC,
|
|
* this function will forward the change request to the device and it will
|
|
* be up to the device on whether support the request. If software AEC is
|
|
* being used (the software EC will be used if the device does not support
|
|
* AEC), this function will change the software EC settings. In all cases,
|
|
* the setting will be saved for future opening of the sound device.
|
|
*
|
|
* If the sound device is not currently active, this will only change the
|
|
* default AEC settings and the setting will be applied next time the
|
|
* sound device is opened.
|
|
*
|
|
* @param tail_msec The tail length, in miliseconds. Set to zero to
|
|
* disable AEC.
|
|
* @param options Options to be passed to pjmedia_echo_create().
|
|
* Normally the value should be zero.
|
|
*
|
|
*/
|
|
void setEcOptions(unsigned tail_msec, unsigned options) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get current echo canceller tail length.
|
|
*
|
|
* @return The EC tail length in milliseconds,
|
|
* If AEC is disabled, the value will be zero.
|
|
*/
|
|
unsigned getEcTail() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Check whether the sound device is currently active. The sound device
|
|
* may be inactive if the application has set the auto close feature to
|
|
* non-zero (the sndAutoCloseTime setting in MediaConfig), or
|
|
* if null sound device or no sound device has been configured via the
|
|
* setNoDev() function.
|
|
*/
|
|
bool sndIsActive() const;
|
|
|
|
/**
|
|
* Refresh the list of sound devices installed in the system. This method
|
|
* will only refresh the list of audio device so all active audio streams
|
|
* will be unaffected. After refreshing the device list, application MUST
|
|
* make sure to update all index references to audio devices before calling
|
|
* any method that accepts audio device index as its parameter.
|
|
*
|
|
*/
|
|
void refreshDevs() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the number of sound devices installed in the system.
|
|
*
|
|
* @return The number of sound devices installed in the
|
|
* system.
|
|
*
|
|
*/
|
|
unsigned getDevCount() const;
|
|
|
|
/**
|
|
* Get device information.
|
|
*
|
|
* @param id The audio device ID.
|
|
*
|
|
* @return The device information which will be filled in
|
|
* by this method once it returns successfully.
|
|
*/
|
|
AudioDevInfo getDevInfo(int id) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Lookup device index based on the driver and device name.
|
|
*
|
|
* @param drv_name The driver name.
|
|
* @param dev_name The device name.
|
|
*
|
|
* @return The device ID. If the device is not found,
|
|
* Error will be thrown.
|
|
*/
|
|
int lookupDev(const string &drv_name,
|
|
const string &dev_name) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get string info for the specified capability.
|
|
*
|
|
* @param cap The capability ID.
|
|
*
|
|
* @return Capability name.
|
|
*/
|
|
string capName(pjmedia_aud_dev_cap cap) const;
|
|
|
|
/**
|
|
* This will configure audio format capability (other than PCM) to the
|
|
* sound device being used. If sound device is currently active, the method
|
|
* will forward the setting to the sound device instance to be applied
|
|
* immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_EXT_FORMAT capability in AudioDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param format The audio format.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*
|
|
*/
|
|
void setExtFormat(const MediaFormatAudio &format, bool keep=true)
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio format capability (other than PCM) of the sound device
|
|
* being used. If sound device is currently active, the method will forward
|
|
* the request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_EXT_FORMAT capability in AudioDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* @return The audio format.
|
|
*
|
|
*/
|
|
MediaFormatAudio getExtFormat() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio input latency control or query capability to
|
|
* the sound device being used. If sound device is currently active,
|
|
* the method will forward the setting to the sound device instance to be
|
|
* applied immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY capability in AudioDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param latency_msec The input latency.
|
|
* @param keep Specify whether the setting is to be kept
|
|
* for future use.
|
|
*/
|
|
void
|
|
setInputLatency(unsigned latency_msec, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio input latency control or query capability of the sound
|
|
* device being used. If sound device is currently active, the method will
|
|
* forward the request to the sound device. If sound device is currently
|
|
* inactive, and if application had previously set the setting and mark the
|
|
* setting as kept, then that setting will be returned. Otherwise, this
|
|
* method will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY capability in AudioDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* @return The audio input latency.
|
|
*
|
|
*/
|
|
unsigned getInputLatency() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio output latency control or query capability to
|
|
* the sound device being used. If sound device is currently active,
|
|
* the method will forward the setting to the sound device instance to be
|
|
* applied immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY capability in AudioDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param latency_msec The output latency.
|
|
* @param keep Specify whether the setting is to be kept
|
|
* for future use.
|
|
*
|
|
*/
|
|
void
|
|
setOutputLatency(unsigned latency_msec, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio output latency control or query capability of the sound
|
|
* device being used. If sound device is currently active, the method will
|
|
* forward the request to the sound device. If sound device is currently
|
|
* inactive, and if application had previously set the setting and mark the
|
|
* setting as kept, then that setting will be returned. Otherwise, this
|
|
* method will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY capability in AudioDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* @return The audio output latency.
|
|
*
|
|
*/
|
|
unsigned getOutputLatency() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio input volume level capability to the
|
|
* sound device being used.
|
|
* If sound device is currently active, the method will forward the
|
|
* setting to the sound device instance to be applied immediately,
|
|
* if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param volume The input volume level, in percent.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*
|
|
*/
|
|
void setInputVolume(unsigned volume, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio input volume level capability of the sound device being
|
|
* used. If sound device is currently active, the method will forward the
|
|
* request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown. *
|
|
|
|
* @return The audio input volume level, in percent.
|
|
*
|
|
*/
|
|
unsigned getInputVolume() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio output volume level capability to the sound
|
|
* device being used. If sound device is currently active, the method will
|
|
* forward the setting to the sound device instance to be applied
|
|
* immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param volume The output volume level, in percent.
|
|
* @param keep Specify whether the setting is to be kept
|
|
* for future use.
|
|
*
|
|
*/
|
|
void setOutputVolume(unsigned volume, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio output volume level capability of the sound device being
|
|
* used. If sound device is currently active, the method will forward the
|
|
* request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio output volume level, in percent.
|
|
*
|
|
*/
|
|
unsigned getOutputVolume() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio input signal level capability of the sound device being
|
|
* used. If sound device is currently active, the method will forward the
|
|
* request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio input signal level, in percent.
|
|
*
|
|
*/
|
|
unsigned getInputSignal() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio output signal level capability of the sound device being
|
|
* used. If sound device is currently active, the method will forward the
|
|
* request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio output signal level, in percent.
|
|
*
|
|
*/
|
|
unsigned getOutputSignal() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio input route capability to the sound device
|
|
* being used. If sound device is currently active, the method will
|
|
* forward the setting to the sound device instance to be applied
|
|
* immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param route The audio input route.
|
|
* @param keep Specify whether the setting is to be kept
|
|
* for future use.
|
|
*
|
|
*/
|
|
void setInputRoute(pjmedia_aud_dev_route route, bool keep=true)
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio input route capability of the sound device being used.
|
|
* If sound device is currently active, the method will forward the
|
|
* request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio input route.
|
|
*
|
|
*/
|
|
pjmedia_aud_dev_route getInputRoute() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio output route capability to the sound device
|
|
* being used. If sound device is currently active, the method will
|
|
* forward the setting to the sound device instance to be applied
|
|
* immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param route The audio output route.
|
|
* @param keep Specify whether the setting is to be kept
|
|
* for future use.
|
|
*
|
|
*/
|
|
void setOutputRoute(pjmedia_aud_dev_route route, bool keep=true)
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio output route capability of the sound device being used.
|
|
* If sound device is currently active, the method will forward the
|
|
* request to the sound device. If sound device is currently inactive,
|
|
* and if application had previously set the setting and mark the setting
|
|
* as kept, then that setting will be returned. Otherwise, this method
|
|
* will raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE capability in AudioDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio output route.
|
|
*
|
|
*/
|
|
pjmedia_aud_dev_route getOutputRoute() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio voice activity detection capability to
|
|
* the sound device being used. If sound device is currently active,
|
|
* the method will forward the setting to the sound device instance
|
|
* to be applied immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_VAD
|
|
* capability in AudioDevInfo.caps flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param enable Enable/disable voice activity detection
|
|
* feature. Set true to enable.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*
|
|
*/
|
|
void setVad(bool enable, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio voice activity detection capability of the sound device
|
|
* being used. If sound device is currently active, the method will
|
|
* forward the request to the sound device. If sound device is currently
|
|
* inactive, and if application had previously set the setting and mark
|
|
* the setting as kept, then that setting will be returned. Otherwise,
|
|
* this method will raise error.
|
|
*
|
|
* This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_VAD
|
|
* capability in AudioDevInfo.caps flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio voice activity detection feature.
|
|
*
|
|
*/
|
|
bool getVad() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio comfort noise generation capability to
|
|
* the sound device being used. If sound device is currently active,
|
|
* the method will forward the setting to the sound device instance
|
|
* to be applied immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_CNG
|
|
* capability in AudioDevInfo.caps flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param enable Enable/disable comfort noise generation
|
|
* feature. Set true to enable.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*
|
|
*/
|
|
void setCng(bool enable, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio comfort noise generation capability of the sound device
|
|
* being used. If sound device is currently active, the method will
|
|
* forward the request to the sound device. If sound device is currently
|
|
* inactive, and if application had previously set the setting and mark
|
|
* the setting as kept, then that setting will be returned. Otherwise,
|
|
* this method will raise error.
|
|
*
|
|
* This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_CNG
|
|
* capability in AudioDevInfo.caps flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio comfort noise generation feature.
|
|
*
|
|
*/
|
|
bool getCng() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure audio packet loss concealment capability to
|
|
* the sound device being used. If sound device is currently active,
|
|
* the method will forward the setting to the sound device instance
|
|
* to be applied immediately, if it supports it.
|
|
*
|
|
* This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_PLC
|
|
* capability in AudioDevInfo.caps flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the sound device to be
|
|
* used.
|
|
*
|
|
* @param enable Enable/disable packet loss concealment
|
|
* feature. Set true to enable.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*
|
|
*/
|
|
void setPlc(bool enable, bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the audio packet loss concealment capability of the sound device
|
|
* being used. If sound device is currently active, the method will
|
|
* forward the request to the sound device. If sound device is currently
|
|
* inactive, and if application had previously set the setting and mark
|
|
* the setting as kept, then that setting will be returned. Otherwise,
|
|
* this method will raise error.
|
|
*
|
|
* This method is only valid if the device has PJMEDIA_AUD_DEV_CAP_PLC
|
|
* capability in AudioDevInfo.caps flags, otherwise Error will be thrown.
|
|
*
|
|
* @return The audio packet loss concealment feature.
|
|
*
|
|
*/
|
|
bool getPlc() const PJSUA2_THROW(Error);
|
|
|
|
private:
|
|
#if !DEPRECATED_FOR_TICKET_2232
|
|
AudioDevInfoVector audioDevList;
|
|
#endif
|
|
AudioMedia *devMedia;
|
|
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
AudDevManager();
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
~AudDevManager();
|
|
|
|
void clearAudioDevList();
|
|
int getActiveDev(bool is_capture) const PJSUA2_THROW(Error);
|
|
|
|
friend class Endpoint;
|
|
};
|
|
|
|
|
|
/**
|
|
* Extra audio device. This class allows application to have multiple
|
|
* sound device instances active concurrently.
|
|
|
|
* Application may also use this class to improve media clock. Normally
|
|
* media clock is driven by sound device in master port, but unfortunately
|
|
* some sound devices may produce jittery clock. To improve media clock,
|
|
* application can install Null Sound Device (i.e: using
|
|
* AudDevManager::setNullDev()), which will act as a master port, and
|
|
* install the sound device as extra sound device.
|
|
*
|
|
* Note that extra sound device will not have auto-close upon idle feature.
|
|
* Also note that the extra sound device only supports mono channel.
|
|
*/
|
|
class ExtraAudioDevice : public AudioMedia
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param playdev Playback device ID.
|
|
* @param recdev Record device ID.
|
|
*/
|
|
ExtraAudioDevice(int playdev, int recdev);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
virtual ~ExtraAudioDevice();
|
|
|
|
/**
|
|
* Open the audio device using format (e.g.: clock rate, bit per sample,
|
|
* samples per frame) matched to the conference bridge's format, except
|
|
* the channel count, which will be set to one (mono channel). This will
|
|
* also register the audio device port to conference bridge.
|
|
*/
|
|
void open();
|
|
|
|
/**
|
|
* Close the audio device and unregister the audio device port from the
|
|
* conference bridge.
|
|
*/
|
|
void close() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Is the extra audio device opened?
|
|
*
|
|
* @return 'true' if it is opened.
|
|
*/
|
|
bool isOpened();
|
|
|
|
protected:
|
|
int playDev;
|
|
int recDev;
|
|
void *ext_snd_dev;
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
* Video media
|
|
*/
|
|
|
|
/**
|
|
* Representation of media coordinate.
|
|
*/
|
|
struct MediaCoordinate
|
|
{
|
|
int x; /**< X position of the coordinate */
|
|
int y; /**< Y position of the coordinate */
|
|
};
|
|
|
|
/**
|
|
* Representation of media size.
|
|
*/
|
|
struct MediaSize
|
|
{
|
|
unsigned w; /**< The width. */
|
|
unsigned h; /**< The height. */
|
|
};
|
|
|
|
|
|
/**
|
|
* This structure descibes information about a particular media port that
|
|
* has been registered into the conference bridge.
|
|
*/
|
|
struct VidConfPortInfo
|
|
{
|
|
/**
|
|
* Conference port number.
|
|
*/
|
|
int portId;
|
|
|
|
/**
|
|
* Port name.
|
|
*/
|
|
string name;
|
|
|
|
/**
|
|
* Media audio format information
|
|
*/
|
|
MediaFormatVideo format;
|
|
|
|
/**
|
|
* Array of listeners (in other words, ports where this port is
|
|
* transmitting to).
|
|
*/
|
|
IntVector listeners;
|
|
|
|
/**
|
|
* Array of listeners (in other words, ports where this port is
|
|
* listening to).
|
|
*/
|
|
IntVector transmitters;
|
|
|
|
public:
|
|
/**
|
|
* Construct from pjsua_conf_port_info.
|
|
*/
|
|
void fromPj(const pjsua_vid_conf_port_info &port_info);
|
|
};
|
|
|
|
/**
|
|
* Parameters for VideoMedia::startTransmit() method.
|
|
*/
|
|
struct VideoMediaTransmitParam
|
|
{
|
|
};
|
|
|
|
/**
|
|
* Video Media.
|
|
*/
|
|
class VideoMedia : public Media
|
|
{
|
|
public:
|
|
/**
|
|
* Get information about the specified conference port.
|
|
*/
|
|
VidConfPortInfo getPortInfo() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get port Id.
|
|
*/
|
|
int getPortId() const;
|
|
|
|
/**
|
|
* Get information from specific port id.
|
|
*/
|
|
static VidConfPortInfo getPortInfoFromId(int port_id) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Establish unidirectional media flow to sink. This media port
|
|
* will act as a source, and it may transmit to multiple destinations/sink.
|
|
* And if multiple sources are transmitting to the same sink, the media
|
|
* will be mixed together. Source and sink may refer to the same Media,
|
|
* effectively looping the media.
|
|
*
|
|
* If bidirectional media flow is desired, application needs to call
|
|
* this method twice, with the second one called from the opposite source
|
|
* media.
|
|
*
|
|
* @param sink The destination Media.
|
|
* @param param The parameter.
|
|
*/
|
|
void startTransmit(const VideoMedia &sink,
|
|
const VideoMediaTransmitParam ¶m) const
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Stop media flow to destination/sink port.
|
|
*
|
|
* @param sink The destination media.
|
|
*
|
|
*/
|
|
void stopTransmit(const VideoMedia &sink) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Update or refresh port states from video port info. Some port may
|
|
* change its port info in the middle of a session, for example when
|
|
* a video stream decoder learns that incoming video size or frame rate
|
|
* has changed, video conference needs to be informed to update its
|
|
* internal states.
|
|
*
|
|
*/
|
|
void update() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Default Constructor.
|
|
*
|
|
* Normally application will not create VideoMedia object directly,
|
|
* but it instantiates a VideoMedia derived class. This is set as public
|
|
* because some STL vector implementations require it.
|
|
*/
|
|
VideoMedia();
|
|
|
|
/**
|
|
* Virtual Destructor
|
|
*/
|
|
virtual ~VideoMedia();
|
|
|
|
protected:
|
|
/**
|
|
* Conference port Id.
|
|
*/
|
|
int id;
|
|
|
|
protected:
|
|
/**
|
|
* This method needs to be called by descendants of this class to register
|
|
* the media port created to the conference bridge and Endpoint's
|
|
* media list.
|
|
*
|
|
* param port The media port to be registered to the conference bridge.
|
|
* param pool The memory pool.
|
|
*/
|
|
void registerMediaPort(MediaPort port, pj_pool_t *pool) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This method needs to be called by descendants of this class to remove
|
|
* the media port from the conference bridge and Endpoint's media list.
|
|
* Descendant should only call this method if it has registered the media
|
|
* with the previous call to registerMediaPort().
|
|
*/
|
|
void unregisterMediaPort();
|
|
};
|
|
|
|
/** Array of Video Media */
|
|
typedef std::vector<VideoMedia> VideoMediaVector;
|
|
|
|
|
|
/**
|
|
* Window handle.
|
|
*/
|
|
typedef struct WindowHandle {
|
|
void *window; /**< Window */
|
|
void *display; /**< Display */
|
|
} WindowHandle;
|
|
|
|
/**
|
|
* Video window handle.
|
|
*/
|
|
struct VideoWindowHandle
|
|
{
|
|
/**
|
|
* The window handle type.
|
|
*/
|
|
pjmedia_vid_dev_hwnd_type type;
|
|
|
|
/**
|
|
* The window handle.
|
|
*/
|
|
WindowHandle handle;
|
|
};
|
|
|
|
/**
|
|
* This structure describes video window info.
|
|
*/
|
|
typedef struct VideoWindowInfo
|
|
{
|
|
/**
|
|
* Flag to indicate whether this window is a native window,
|
|
* such as created by built-in preview device. If this field is
|
|
* true, only the video window handle field of this
|
|
* structure is valid.
|
|
*/
|
|
bool isNative;
|
|
|
|
/**
|
|
* Video window handle.
|
|
*/
|
|
VideoWindowHandle winHandle;
|
|
|
|
/**
|
|
* Renderer device ID.
|
|
*/
|
|
int renderDeviceId;
|
|
|
|
/**
|
|
* Window show status. The window is hidden if false.
|
|
*/
|
|
bool show;
|
|
|
|
/**
|
|
* Window position.
|
|
*/
|
|
MediaCoordinate pos;
|
|
|
|
/**
|
|
* Window size.
|
|
*/
|
|
MediaSize size;
|
|
|
|
} VideoWindowInfo;
|
|
|
|
/**
|
|
* Video window.
|
|
*/
|
|
class VideoWindow
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor
|
|
*/
|
|
VideoWindow(int win_id);
|
|
|
|
/**
|
|
* Get window info.
|
|
*
|
|
* @return video window info.
|
|
*/
|
|
VideoWindowInfo getInfo() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get video media or conference bridge port of the renderer of
|
|
* this video window.
|
|
*
|
|
* @return Video media of this renderer window.
|
|
*/
|
|
VideoMedia getVideoMedia() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Show or hide window. This operation is not valid for native windows
|
|
* (VideoWindowInfo.isNative=true), on which native windowing API
|
|
* must be used instead.
|
|
*
|
|
* @param show Set to true to show the window, false to
|
|
* hide the window.
|
|
*
|
|
*/
|
|
void Show(bool show) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set video window position. This operation is not valid for native windows
|
|
* (VideoWindowInfo.isNative=true), on which native windowing API
|
|
* must be used instead.
|
|
*
|
|
* @param pos The window position.
|
|
*
|
|
*/
|
|
void setPos(const MediaCoordinate &pos) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Resize window. This operation is not valid for native windows
|
|
* (VideoWindowInfo.isNative=true), on which native windowing API
|
|
* must be used instead.
|
|
*
|
|
* @param size The new window size.
|
|
*
|
|
*/
|
|
void setSize(const MediaSize &size) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Rotate the video window. This function will change the video orientation
|
|
* and also possibly the video window size (width and height get swapped).
|
|
* This operation is not valid for native windows (VideoWindowInfo.isNative
|
|
* =true), on which native windowing API must be used instead.
|
|
*
|
|
* @param angle The rotation angle in degrees, must be
|
|
* multiple of 90.
|
|
* Specify positive value for clockwise rotation or
|
|
* negative value for counter-clockwise rotation.
|
|
*/
|
|
void rotate(int angle) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set output window. This operation is valid only when the underlying
|
|
* video device supports PJMEDIA_VIDEO_DEV_CAP_OUTPUT_WINDOW capability AND
|
|
* allows the output window to be changed on-the-fly, otherwise Error will
|
|
* be thrown. Currently it is only supported on Android.
|
|
*
|
|
* @param win The new output window.
|
|
*/
|
|
void setWindow(const VideoWindowHandle &win) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set video window full-screen. This operation is valid only when the
|
|
* underlying video device supports PJMEDIA_VID_DEV_CAP_OUTPUT_FULLSCREEN
|
|
* capability. Currently it is only supported on SDL backend.
|
|
*
|
|
* @param enabled Set to true if full screen is desired, false
|
|
* otherwise.
|
|
*/
|
|
void setFullScreen(bool enabled) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Set video window full-screen. This operation is valid only when the
|
|
* underlying video device supports PJMEDIA_VID_DEV_CAP_OUTPUT_FULLSCREEN
|
|
* capability. Currently it is only supported on SDL backend.
|
|
*
|
|
* @param mode Fullscreen mode, see
|
|
* pjmedia_vid_dev_fullscreen_flag.
|
|
*/
|
|
void setFullScreen2(pjmedia_vid_dev_fullscreen_flag mode)
|
|
PJSUA2_THROW(Error);
|
|
|
|
private:
|
|
pjsua_vid_win_id winId;
|
|
};
|
|
|
|
/**
|
|
* This structure contains parameters for VideoPreview::start()
|
|
*/
|
|
struct VideoPreviewOpParam {
|
|
/**
|
|
* Device ID for the video renderer to be used for rendering the
|
|
* capture stream for preview. This parameter is ignored if native
|
|
* preview is being used.
|
|
*
|
|
* Default: PJMEDIA_VID_DEFAULT_RENDER_DEV
|
|
*/
|
|
pjmedia_vid_dev_index rendId;
|
|
|
|
/**
|
|
* Show window initially.
|
|
*
|
|
* Default: PJ_TRUE.
|
|
*/
|
|
bool show;
|
|
|
|
/**
|
|
* Window flags. The value is a bitmask combination of
|
|
* \a pjmedia_vid_dev_wnd_flag.
|
|
*
|
|
* Default: 0.
|
|
*/
|
|
unsigned windowFlags;
|
|
|
|
/**
|
|
* Media format video. By default, this parameter is uninitialized
|
|
* and will not be used.
|
|
*
|
|
* To initialize it, use MediaFormatVideo::init().
|
|
* If left uninitialized, the capture device will be opened using
|
|
* PJMEDIA wrapper default format, e.g:
|
|
* - Android : PJMEDIA_FORMAT_I420 using the first supported size and 15fps
|
|
* - iOS : PJMEDIA_FORMAT_BGRA using size 352x288 and 15fps
|
|
* Note that when the preview is already opened, this setting will be
|
|
* ignored.
|
|
*/
|
|
MediaFormatVideo format;
|
|
|
|
/**
|
|
* Optional output window to be used to display the video preview.
|
|
* This parameter will only be used if the video device supports
|
|
* PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW capability and the capability
|
|
* is not read-only.
|
|
*/
|
|
VideoWindowHandle window;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor initializes with default values.
|
|
*/
|
|
VideoPreviewOpParam();
|
|
|
|
/**
|
|
* Convert from pjsip
|
|
*/
|
|
void fromPj(const pjsua_vid_preview_param &prm);
|
|
|
|
/**
|
|
* Convert to pjsip
|
|
*/
|
|
pjsua_vid_preview_param toPj() const;
|
|
};
|
|
|
|
/**
|
|
* Video Preview
|
|
*/
|
|
class VideoPreview {
|
|
public:
|
|
/**
|
|
* Constructor
|
|
*/
|
|
VideoPreview(int dev_id);
|
|
|
|
/**
|
|
* Determine if the specified video input device has built-in native
|
|
* preview capability. This is a convenience function that is equal to
|
|
* querying device's capability for PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW
|
|
* capability.
|
|
*
|
|
* @return true if it has.
|
|
*/
|
|
bool hasNative();
|
|
|
|
/**
|
|
* Start video preview window for the specified capture device.
|
|
*
|
|
* @param param Video preview parameters.
|
|
*/
|
|
void start(const VideoPreviewOpParam ¶m) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Stop video preview.
|
|
*/
|
|
void stop() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the preview window handle associated with the capture device,if any.
|
|
*/
|
|
VideoWindow getVideoWindow();
|
|
|
|
/**
|
|
* Get video media or conference bridge port of the video capture device.
|
|
*
|
|
* @return Video media of the video capture device.
|
|
*/
|
|
VideoMedia getVideoMedia() PJSUA2_THROW(Error);
|
|
|
|
private:
|
|
pjmedia_vid_dev_index devId;
|
|
pjsua_vid_win_id winId;
|
|
void updateDevId();
|
|
};
|
|
|
|
/**
|
|
* Video device information structure.
|
|
*/
|
|
struct VideoDevInfo
|
|
{
|
|
/**
|
|
* The device ID
|
|
*/
|
|
pjmedia_vid_dev_index id;
|
|
|
|
/**
|
|
* The device name
|
|
*/
|
|
string name;
|
|
|
|
/**
|
|
* The underlying driver name
|
|
*/
|
|
string driver;
|
|
|
|
/**
|
|
* The supported direction of the video device, i.e. whether it supports
|
|
* capture only, render only, or both.
|
|
*/
|
|
pjmedia_dir dir;
|
|
|
|
/**
|
|
* Device capabilities, as bitmask combination of #pjmedia_vid_dev_cap
|
|
*/
|
|
unsigned caps;
|
|
|
|
/**
|
|
* Array of supported video formats. Some fields in each supported video
|
|
* format may be set to zero or of "unknown" value, to indicate that the
|
|
* value is unknown or should be ignored. When these value are not set
|
|
* to zero, it indicates that the exact format combination is being used.
|
|
*/
|
|
MediaFormatVideoVector fmt;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
VideoDevInfo() : id(-1), dir(PJMEDIA_DIR_NONE), caps(0)
|
|
{}
|
|
|
|
/**
|
|
* Construct from pjmedia_vid_dev_info.
|
|
*/
|
|
void fromPj(const pjmedia_vid_dev_info &dev_info);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
~VideoDevInfo();
|
|
};
|
|
|
|
/**
|
|
* Warning: deprecated, use VideoDevInfoVector2 instead.
|
|
*
|
|
* Array of video device info.
|
|
*/
|
|
typedef std::vector<VideoDevInfo*> VideoDevInfoVector;
|
|
|
|
/** Array of video device info */
|
|
typedef std::vector<VideoDevInfo> VideoDevInfoVector2;
|
|
|
|
/**
|
|
* Parameter for switching device with PJMEDIA_VID_DEV_CAP_SWITCH capability.
|
|
*/
|
|
struct VideoSwitchParam
|
|
{
|
|
/**
|
|
* Target device ID to switch to. Once the switching is successful, the
|
|
* video stream will use this device and the old device will be closed.
|
|
*/
|
|
pjmedia_vid_dev_index target_id;
|
|
};
|
|
|
|
/**
|
|
* Video device manager.
|
|
*/
|
|
class VidDevManager {
|
|
public:
|
|
|
|
/**
|
|
* Initialize the video device subsystem. This will register all supported
|
|
* video device factories to the video device subsystem.
|
|
*
|
|
* By default, library will initialize video device subsystem automatically
|
|
* on library initialization, so application will never need to invoke this
|
|
* function. However, when PJSUA_DONT_INIT_VID_DEV_SUBSYS is set to
|
|
* non-zero, application should invoke this function before accessing
|
|
* video device.
|
|
*/
|
|
void initSubsys() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Refresh the list of video devices installed in the system. This function
|
|
* will only refresh the list of video device so all active video streams
|
|
* will be unaffected. After refreshing the device list, application MUST
|
|
* make sure to update all index references to video devices (i.e. all
|
|
* variables of type pjmedia_vid_dev_index) before calling any function
|
|
* that accepts video device index as its parameter.
|
|
*/
|
|
void refreshDevs() PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the number of video devices installed in the system.
|
|
*
|
|
* @return The number of devices.
|
|
*/
|
|
unsigned getDevCount();
|
|
|
|
/**
|
|
* Retrieve the video device info for the specified device index.
|
|
*
|
|
* @param dev_id The video device id
|
|
*
|
|
* @return The list of video device info
|
|
*/
|
|
VideoDevInfo getDevInfo(int dev_id) const PJSUA2_THROW(Error);
|
|
|
|
#if !DEPRECATED_FOR_TICKET_2232
|
|
/**
|
|
* Warning: deprecated, use enumDev2() instead. This function is not
|
|
* safe in multithreaded environment.
|
|
*
|
|
* Enum all video devices installed in the system.
|
|
*
|
|
* @return The list of video device info
|
|
*/
|
|
const VideoDevInfoVector &enumDev() PJSUA2_THROW(Error);
|
|
#endif
|
|
|
|
/**
|
|
* Enum all video devices installed in the system.
|
|
*
|
|
* @return The list of video device info
|
|
*/
|
|
VideoDevInfoVector2 enumDev2() const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Lookup device index based on the driver and device name.
|
|
*
|
|
* @param drv_name The driver name.
|
|
* @param dev_name The device name.
|
|
*
|
|
* @return The device ID. If the device is not found,
|
|
* Error will be thrown.
|
|
*/
|
|
int lookupDev(const string &drv_name,
|
|
const string &dev_name) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get string info for the specified capability.
|
|
*
|
|
* @param cap The capability ID.
|
|
*
|
|
* @return Capability name.
|
|
*/
|
|
string capName(pjmedia_vid_dev_cap cap) const;
|
|
|
|
/**
|
|
* This will configure video format capability to the video device.
|
|
* If video device is currently active, the method will forward the setting
|
|
* to the video device instance to be applied immediately, if it
|
|
* supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_FORMAT capability in VideoDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the video device to be
|
|
* used.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @param format The video format.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*/
|
|
void setFormat(int dev_id,
|
|
const MediaFormatVideo &format,
|
|
bool keep) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the video format capability to the video device.
|
|
* If video device is currently active, the method will forward the request
|
|
* to the video device. If video device is currently inactive, and if
|
|
* application had previously set the setting and mark the setting as kept,
|
|
* then that setting will be returned. Otherwise, this method will
|
|
* raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_FORMAT capability in VideoDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @return keep The video format.
|
|
*/
|
|
MediaFormatVideo getFormat(int dev_id) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure video format capability to the video device.
|
|
* If video device is currently active, the method will forward the setting
|
|
* to the video device instance to be applied immediately, if it
|
|
* supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_INPUT_SCALE capability in VideoDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the video device to be
|
|
* used.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @param scale The video scale.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*/
|
|
void setInputScale(int dev_id,
|
|
const MediaSize &scale,
|
|
bool keep) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the video input scale capability to the video device.
|
|
* If video device is currently active, the method will forward the request
|
|
* to the video device. If video device is currently inactive, and if
|
|
* application had previously set the setting and mark the setting as kept,
|
|
* then that setting will be returned. Otherwise, this method will
|
|
* raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_FORMAT capability in VideoDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @return keep The video format.
|
|
*/
|
|
MediaSize getInputScale(int dev_id) const PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure fast switching to another video device.
|
|
* If video device is currently active, the method will forward the setting
|
|
* to the video device instance to be applied immediately, if it
|
|
* supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS capability in VideoDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* Note that in case the setting is kept for future use, it will be applied
|
|
* to any devices, even when application has changed the video device to be
|
|
* used.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @param flags The video window flag.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*/
|
|
void setOutputWindowFlags(int dev_id, int flags, bool keep)
|
|
PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Get the window output flags capability to the video device.
|
|
* If video device is currently active, the method will forward the request
|
|
* to the video device. If video device is currently inactive, and if
|
|
* application had previously set the setting and mark the setting as kept,
|
|
* then that setting will be returned. Otherwise, this method will
|
|
* raise error.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW_FLAGS capability in VideoDevInfo.caps
|
|
* flags, otherwise Error will be thrown.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @return keep The video format.
|
|
*/
|
|
int getOutputWindowFlags(int dev_id) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* This will configure fast switching to another video device.
|
|
* If video device is currently active, the method will forward the setting
|
|
* to the video device instance to be applied immediately, if it
|
|
* supports it.
|
|
*
|
|
* This method is only valid if the device has
|
|
* PJMEDIA_VID_DEV_CAP_SWITCH capability in VideoDevInfo.caps flags,
|
|
* otherwise Error will be thrown.
|
|
*
|
|
* @param dev_id The video device id.
|
|
* @param param The video switch param.
|
|
*/
|
|
void switchDev(int dev_id,
|
|
const VideoSwitchParam ¶m) PJSUA2_THROW(Error);
|
|
|
|
/**
|
|
* Check whether the video capture device is currently active, i.e. if
|
|
* a video preview has been started or there is a video call using
|
|
* the device.
|
|
*
|
|
* @param dev_id The video device id
|
|
*
|
|
* @return True if it's active.
|
|
*/
|
|
bool isCaptureActive(int dev_id) const;
|
|
|
|
/**
|
|
* This will configure video orientation of the video capture device.
|
|
* If the device is currently active (i.e. if there is a video call
|
|
* using the device or a video preview has been started), the method
|
|
* will forward the setting to the video device instance to be applied
|
|
* immediately, if it supports it.
|
|
*
|
|
* The setting will be saved for future opening of the video device,
|
|
* if the "keep" argument is set to true. If the video device is
|
|
* currently inactive, and the "keep" argument is false, this method
|
|
* will throw Error.
|
|
*
|
|
* @param dev_id The video device id
|
|
* @param orient The video orientation.
|
|
* @param keep Specify whether the setting is to be kept for
|
|
* future use.
|
|
*
|
|
*/
|
|
void setCaptureOrient(pjmedia_vid_dev_index dev_id,
|
|
pjmedia_orient orient,
|
|
bool keep=true) PJSUA2_THROW(Error);
|
|
|
|
private:
|
|
#if !DEPRECATED_FOR_TICKET_2232
|
|
VideoDevInfoVector videoDevList;
|
|
#endif
|
|
|
|
void clearVideoDevList();
|
|
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
VidDevManager();
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
~VidDevManager();
|
|
|
|
friend class Endpoint;
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
* Codec management
|
|
*/
|
|
|
|
/**
|
|
* This structure describes codec information.
|
|
*/
|
|
struct CodecInfo
|
|
{
|
|
/**
|
|
* Codec unique identification.
|
|
*/
|
|
string codecId;
|
|
|
|
/**
|
|
* Codec priority (integer 0-255).
|
|
*/
|
|
pj_uint8_t priority;
|
|
|
|
/**
|
|
* Codec description.
|
|
*/
|
|
string desc;
|
|
|
|
/**
|
|
* Construct from pjsua_codec_info.
|
|
*/
|
|
void fromPj(const pjsua_codec_info &codec_info);
|
|
};
|
|
|
|
/**
|
|
* Warning: deprecated, use CodecInfoVector2 instead.
|
|
*
|
|
* Array of codec info.
|
|
*/
|
|
typedef std::vector<CodecInfo*> CodecInfoVector;
|
|
|
|
/** Array of codec info */
|
|
typedef std::vector<CodecInfo> CodecInfoVector2;
|
|
|
|
/**
|
|
* Structure of codec specific parameters which contains name=value pairs.
|
|
* The codec specific parameters are to be used with SDP according to
|
|
* the standards (e.g: RFC 3555) in SDP 'a=fmtp' attribute.
|
|
*/
|
|
typedef struct CodecFmtp
|
|
{
|
|
string name; /**< name */
|
|
string val; /**< value */
|
|
} CodecFmtp;
|
|
|
|
/** Array of codec fmtp */
|
|
typedef std::vector<CodecFmtp> CodecFmtpVector;
|
|
|
|
/**
|
|
* Audio codec parameters info.
|
|
*/
|
|
struct CodecParamInfo
|
|
{
|
|
unsigned clockRate; /**< Sampling rate in Hz */
|
|
unsigned channelCnt; /**< Channel count. */
|
|
unsigned avgBps; /**< Average bandwidth in bits/sec */
|
|
unsigned maxBps; /**< Maximum bandwidth in bits/sec */
|
|
unsigned maxRxFrameSize; /**< Maximum frame size */
|
|
unsigned frameLen; /**< Decoder frame ptime in msec. */
|
|
unsigned frameLenDenum; /**< Decoder frame ptime denum, or
|
|
zero if ptime is integer. */
|
|
unsigned encFrameLen; /**< Encoder ptime, or zero if it's
|
|
equal to decoder ptime. */
|
|
unsigned encFrameLenDenum; /**< Encoder ptime denum, or zero
|
|
if ptime is integer. */
|
|
unsigned pcmBitsPerSample; /**< Bits/sample in the PCM side */
|
|
unsigned pt; /**< Payload type. */
|
|
pjmedia_format_id fmtId; /**< Source format, it's format of
|
|
encoder input and decoder
|
|
output. */
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
CodecParamInfo()
|
|
: clockRate(0),
|
|
channelCnt(0),
|
|
avgBps(0),
|
|
maxBps(0),
|
|
maxRxFrameSize(0),
|
|
frameLen(0),
|
|
frameLenDenum(0),
|
|
encFrameLen(0),
|
|
encFrameLenDenum(0),
|
|
pcmBitsPerSample(0),
|
|
pt(0),
|
|
fmtId(PJMEDIA_FORMAT_L16)
|
|
{}
|
|
};
|
|
|
|
/**
|
|
* Audio codec parameters setting.
|
|
*/
|
|
struct CodecParamSetting
|
|
{
|
|
unsigned frmPerPkt; /**< Number of frames per packet. */
|
|
bool vad; /**< Voice Activity Detector. */
|
|
bool cng; /**< Comfort Noise Generator. */
|
|
bool penh; /**< Perceptual Enhancement */
|
|
bool plc; /**< Packet loss concealment */
|
|
bool reserved; /**< Reserved, must be zero. */
|
|
CodecFmtpVector encFmtp; /**< Encoder's fmtp params. */
|
|
CodecFmtpVector decFmtp; /**< Decoder's fmtp params. */
|
|
unsigned packetLoss; /**< Encoder's expected pkt loss %. */
|
|
unsigned complexity; /**< Encoder complexity, 0-10(max). */
|
|
bool cbr; /**< Constant bit rate? */
|
|
};
|
|
|
|
/**
|
|
* Detailed codec attributes used in configuring an audio codec and in querying
|
|
* the capability of audio codec factories.
|
|
*
|
|
* Please note that codec parameter also contains SDP specific setting,
|
|
* setting::decFmtp and setting::encFmtp, which may need to be set
|
|
* appropriately based on the effective setting.
|
|
* See each codec documentation for more detail.
|
|
*/
|
|
struct CodecParam
|
|
{
|
|
/** info */
|
|
struct CodecParamInfo info;
|
|
/** setting */
|
|
struct CodecParamSetting setting;
|
|
|
|
void fromPj(const pjmedia_codec_param ¶m);
|
|
|
|
pjmedia_codec_param toPj() const;
|
|
};
|
|
|
|
/**
|
|
* Opus codec parameters setting;
|
|
*/
|
|
struct CodecOpusConfig
|
|
{
|
|
unsigned sample_rate; /**< Sample rate in Hz. */
|
|
unsigned channel_cnt; /**< Number of channels. */
|
|
unsigned frm_ptime; /**< Frame time in msec. */
|
|
unsigned frm_ptime_denum;/**< Frame time denumerator. */
|
|
unsigned bit_rate; /**< Encoder bit rate in bps. */
|
|
unsigned packet_loss; /**< Encoder's expected packet loss pct. */
|
|
unsigned complexity; /**< Encoder complexity, 0-10(10 is highest)*/
|
|
bool cbr; /**< Constant bit rate? */
|
|
|
|
pjmedia_codec_opus_config toPj() const;
|
|
void fromPj(const pjmedia_codec_opus_config &config);
|
|
};
|
|
|
|
/**
|
|
* Lyra codec setting;
|
|
*/
|
|
struct CodecLyraConfig
|
|
{
|
|
/**
|
|
* The value represents the decoder bitrate requested by the receiver.
|
|
* Endpoints can be configured with different bitrates. For example,
|
|
* the local endpoint might be set to a bitrate of 3200, while
|
|
* the remote endpoint is set to 6000. In this scenario, the remote
|
|
* endpoint will send data at 3200 bitrate, while the local endpoint
|
|
* will send data at 6000 bitrate. Valid bitrate: 3200, 6000, 9200.
|
|
* By default it is set to PJMEDIA_CODEC_LYRA_DEFAULT_BIT_RATE.
|
|
*/
|
|
unsigned bitRate;
|
|
|
|
/**
|
|
* Lyra required some additional (model) files, including
|
|
* \b lyra_config.binarypb , \b lyragan.tflite , \b quantizer.tflite and
|
|
* \b soundstream_encoder.tflite .
|
|
* This setting represents the folder containing the above files.
|
|
* The specified folder should contain these files. If an invalid folder
|
|
* is provided, the codec creation will fail.
|
|
*/
|
|
string modelPath;
|
|
|
|
pjmedia_codec_lyra_config toPj() const;
|
|
void fromPj(const pjmedia_codec_lyra_config &config);
|
|
};
|
|
|
|
/**
|
|
* Detailed codec attributes used in configuring a video codec and in querying
|
|
* the capability of video codec factories.
|
|
*
|
|
* Please note that codec parameter also contains SDP specific setting,
|
|
* #decFmtp and #encFmtp, which may need to be set appropriately based on
|
|
* the effective setting. See each codec documentation for more detail.
|
|
*/
|
|
struct VidCodecParam
|
|
{
|
|
pjmedia_dir dir; /**< Direction */
|
|
pjmedia_vid_packing packing; /**< Packetization strategy. */
|
|
|
|
struct
|
|
MediaFormatVideo encFmt; /**< Encoded format */
|
|
CodecFmtpVector encFmtp; /**< Encoder fmtp params */
|
|
unsigned encMtu; /**< MTU or max payload size setting*/
|
|
|
|
struct
|
|
MediaFormatVideo decFmt; /**< Decoded format */
|
|
CodecFmtpVector decFmtp; /**< Decoder fmtp params */
|
|
|
|
bool ignoreFmtp; /**< Ignore fmtp params. If set to
|
|
true, the codec will apply
|
|
format settings specified in
|
|
encFmt and decFmt only. */
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
VidCodecParam() : dir(PJMEDIA_DIR_NONE),
|
|
packing(PJMEDIA_VID_PACKING_UNKNOWN),
|
|
encMtu(0),
|
|
ignoreFmtp(false)
|
|
{}
|
|
|
|
void fromPj(const pjmedia_vid_codec_param ¶m);
|
|
|
|
pjmedia_vid_codec_param toPj() const;
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
* Media event
|
|
*/
|
|
|
|
/**
|
|
* This structure describes a media format changed event.
|
|
*/
|
|
struct MediaFmtChangedEvent
|
|
{
|
|
unsigned newWidth; /**< The new width. */
|
|
unsigned newHeight; /**< The new height. */
|
|
};
|
|
|
|
/**
|
|
* This structure describes an audio device error event.
|
|
*/
|
|
struct AudDevErrorEvent
|
|
{
|
|
pjmedia_dir dir; /**< The direction. */
|
|
int id; /**< The audio device ID. */
|
|
pj_status_t status; /**< The status code. */
|
|
};
|
|
|
|
/**
|
|
* Media event data.
|
|
*/
|
|
typedef union MediaEventData {
|
|
/**
|
|
* Media format changed event data.
|
|
*/
|
|
MediaFmtChangedEvent fmtChanged;
|
|
|
|
/**
|
|
* Audio device error event data.
|
|
*/
|
|
AudDevErrorEvent audDevError;
|
|
|
|
/**
|
|
* Pointer to storage to user event data, if it's outside
|
|
* this struct
|
|
*/
|
|
GenericData ptr;
|
|
|
|
} MediaEventData;
|
|
|
|
/**
|
|
* This structure describes a media event. It corresponds to the
|
|
* pjmedia_event structure.
|
|
*/
|
|
struct MediaEvent
|
|
{
|
|
/**
|
|
* The event type.
|
|
*/
|
|
pjmedia_event_type type;
|
|
|
|
/**
|
|
* Additional data/parameters about the event. The type of data
|
|
* will be specific to the event type being reported.
|
|
*/
|
|
MediaEventData data;
|
|
|
|
/**
|
|
* Pointer to original pjmedia_event. Only valid when the struct
|
|
* is converted from PJSIP's pjmedia_event.
|
|
*/
|
|
void *pjMediaEvent;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
MediaEvent() : type(PJMEDIA_EVENT_NONE), pjMediaEvent(NULL)
|
|
{}
|
|
|
|
/**
|
|
* Convert from pjsip
|
|
*/
|
|
void fromPj(const pjmedia_event &ev);
|
|
};
|
|
|
|
/**
|
|
* @} // PJSUA2_MED
|
|
*/
|
|
|
|
} // namespace pj
|
|
|
|
#endif /* __PJSUA2_MEDIA_HPP__ */
|