diff --git a/sflphone-common/src/Codec.h b/sflphone-common/src/Codec.h index de1824f84f0533d06251e394e7f425eb3375d27a..b903443fe70e9f45d6fe640701b8cc7f8be90edd 100644 --- a/sflphone-common/src/Codec.h +++ b/sflphone-common/src/Codec.h @@ -32,6 +32,8 @@ #include "MimeParameters.h" // TODO Move to some higher directory +#include <tr1/memory> + #include <cc++/digest.h> /** @@ -59,6 +61,11 @@ class Codec : public virtual MimeParameters */ virtual std::string getDescription() const = 0; + /** + * @return A copy of the current codec. + */ + virtual Codec* clone() const = 0; + /** * Build a unique hash code for identifying the codec uniquely. * Note that if multiple implementations of codec are provided, diff --git a/sflphone-common/src/audio/codecs/alaw.cpp b/sflphone-common/src/audio/codecs/alaw.cpp index e38931c7a0bec69af664be1366dc43590b9c072d..f6826269eb889e1eba80029390dc86f6ce329d3a 100644 --- a/sflphone-common/src/audio/codecs/alaw.cpp +++ b/sflphone-common/src/audio/codecs/alaw.cpp @@ -135,6 +135,15 @@ class Alaw : public sfl::AudioCodec std::string getDescription() const { return "audio/PCMA 8000 (\"alaw\") codec."; } + + /** + * @Override + */ + Alaw* clone() const { + return new Alaw (*this); + } + + }; // the class factories diff --git a/sflphone-common/src/audio/codecs/audiocodec.h b/sflphone-common/src/audio/codecs/audiocodec.h index 1f183b2dfb81f21845b8d1af362db4268e06f385..20558f0527127525c1a223cfbc272eafa5052fb9 100644 --- a/sflphone-common/src/audio/codecs/audiocodec.h +++ b/sflphone-common/src/audio/codecs/audiocodec.h @@ -133,6 +133,11 @@ class AudioCodec : public Codec */ unsigned int getFrameSize() const; + /** + * @Override + */ + virtual AudioCodec* clone() const = 0; + protected: /** Holds SDP-compliant codec name */ std::string _codecName; // what we put inside sdp diff --git a/sflphone-common/src/audio/codecs/celtcodec.cpp b/sflphone-common/src/audio/codecs/celtcodec.cpp index 69d156e505567e754c70b14bca5d73e62f214efc..4ce2b45f201b4934343d9b51d438e797fe5ab3a4 100644 --- a/sflphone-common/src/audio/codecs/celtcodec.cpp +++ b/sflphone-common/src/audio/codecs/celtcodec.cpp @@ -156,6 +156,14 @@ class Celt : public sfl::AudioCodec return "audio/celt 32000 (\"HD\") codec. Based on libcelt, by Jean-Marc Valin."; } + /** + * @Override + */ + Celt* clone() const { + return new Celt (*this); + } + + private: CELTMode *_mode; diff --git a/sflphone-common/src/audio/codecs/g722.cpp b/sflphone-common/src/audio/codecs/g722.cpp index 339010148218486399be17cedd47b230956c7fb2..41ec89a9e101dd2ec3b6b7f45566947de22444e4 100644 --- a/sflphone-common/src/audio/codecs/g722.cpp +++ b/sflphone-common/src/audio/codecs/g722.cpp @@ -829,6 +829,14 @@ class G722 : public sfl::AudioCodec return "G722 codec. Most of the code comes from Steve Underwood (<steveu@coppice.org>) for the Asterisk project."; } + /** + * @Override + */ + G722* clone() const { + return new G722 (*this); + } + + private: g722_decode_state_t *decode_s; diff --git a/sflphone-common/src/audio/codecs/gsmcodec.cpp b/sflphone-common/src/audio/codecs/gsmcodec.cpp index 5c43b39cb8792630fa0a981c2d0ec76762f47ec8..8be02bc61c5a520f0a639a6a218bdac96459af04 100644 --- a/sflphone-common/src/audio/codecs/gsmcodec.cpp +++ b/sflphone-common/src/audio/codecs/gsmcodec.cpp @@ -93,6 +93,14 @@ class Gsm : public sfl::AudioCodec return "GSM codec. Based on libgsm, (C) Jutta Degener and Carsten Bormann, Technische Universitaet Berlin."; } + /** + * @Override + */ + Gsm* clone() const { + return new Gsm (*this); + } + + private: gsm _decode_gsmhandle; gsm _encode_gsmhandle; diff --git a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp index 7c3c076788f5ea847af7804e1ed5007797f674d7..e0fcd2a8150eb8e9a18d4247dbaa91953ffd4aab 100644 --- a/sflphone-common/src/audio/codecs/speexcodec_nb.cpp +++ b/sflphone-common/src/audio/codecs/speexcodec_nb.cpp @@ -121,6 +121,14 @@ class Speex : public sfl::AudioCodec return "audio/speex 8000 (\"narrow band\") codec. Based on libspeex, by Jean-Marc Valin."; } + /** + * @Override + */ + Speex* clone() const { + return new Speex (*this); + } + + private: const SpeexMode* _speexModePtr; SpeexBits _speex_dec_bits; diff --git a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp index ebffda8a717a8b2eaad659e2d38d9e866ab0cc31..36a8cd1f42abd4c376f316bf588fa756459e0bc9 100644 --- a/sflphone-common/src/audio/codecs/speexcodec_ub.cpp +++ b/sflphone-common/src/audio/codecs/speexcodec_ub.cpp @@ -123,6 +123,14 @@ class Speex : public sfl::AudioCodec return "audio/speex 32000 (\"ultra wide band\") codec. Based on libspeex, by Jean-Marc Valin."; } + /** + * @Override + */ + Speex* clone() const { + return new Speex (*this); + } + + private: const SpeexMode* _speexModePtr; SpeexBits _speex_dec_bits; diff --git a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp index 6e974e3e772ea5128415acf6fd6a23789d6f0991..e4fcd4146280b5b5037ddb6797ae1e7dd7e16c29 100644 --- a/sflphone-common/src/audio/codecs/speexcodec_wb.cpp +++ b/sflphone-common/src/audio/codecs/speexcodec_wb.cpp @@ -122,6 +122,13 @@ class Speex : public sfl::AudioCodec return "audio/speex 16000 (\"wide band\") codec. Based on libspeex, by Jean-Marc Valin."; } + /** + * @Override + */ + Speex* clone() const { + return new Speex (*this); + } + private: const SpeexMode* _speexModePtr; SpeexBits _speex_dec_bits; diff --git a/sflphone-common/src/audio/codecs/ulaw.cpp b/sflphone-common/src/audio/codecs/ulaw.cpp index e3560c0728210a1b0367b6c7aae8b119b544fe6d..56d65717425a1537dd281ad0cf9275ea05c2359d 100644 --- a/sflphone-common/src/audio/codecs/ulaw.cpp +++ b/sflphone-common/src/audio/codecs/ulaw.cpp @@ -130,6 +130,14 @@ class Ulaw : public sfl::AudioCodec std::string getDescription() const { return "audio/PCMU 8000 (\"ulaw\") codec."; } + + /** + * @Override + */ + Ulaw* clone() const { + return new Ulaw (*this); + } + }; // the class factories