Index: webrtc/modules/audio_coding/include/audio_coding_module.h |
diff --git a/webrtc/modules/audio_coding/include/audio_coding_module.h b/webrtc/modules/audio_coding/include/audio_coding_module.h |
index 9e7991f22f37930ea613c59ea702a9eb22210eba..55571f29d505197b764ee3b26f992e97edeb785e 100644 |
--- a/webrtc/modules/audio_coding/include/audio_coding_module.h |
+++ b/webrtc/modules/audio_coding/include/audio_coding_module.h |
@@ -207,6 +207,37 @@ class AudioCodingModule { |
virtual void RegisterExternalSendCodec( |
AudioEncoder* external_speech_encoder) = 0; |
+ // Class for doing type erasure on a functor with signature |
+ // AudioEncoder*(AudioEncoder*). Any functor with this signature will |
+ // implicitly convert to EncoderVisitor. |
+ class EncoderVisitor final { |
+ public: |
+ template <typename F> |
+ EncoderVisitor(const F& f) : f_(&f), call_(Call<F>) {} |
+ AudioEncoder* operator()(AudioEncoder* enc) const { return call_(f_, enc); } |
+ |
+ private: |
+ template <typename F> |
+ static AudioEncoder* Call(const void* f, AudioEncoder* enc) { |
+ return (*static_cast<const F*>(f))(enc); |
+ } |
+ const void* const f_; |
+ AudioEncoder* (*const call_)(const void* f, AudioEncoder* enc); |
+ }; |
+ |
+ // |ev| is called exactly once with one argument: the current encoder (or |
+ // nullptr if there is no current encoder). For the duration of the call, |
+ // |ev| has exclusive access to its argument. |ev|'s return value (which may |
+ // be its argument, another AudioEncoder*, or nullptr) is the new current |
+ // encoder. The encoder will be used as-is, without applying VAD/DTX or RED |
+ // or anything. |
+ virtual void VisitEncoder(const EncoderVisitor& ev) = 0; |
+ |
+ // Utility method for simply replacing the existing encoder with a new one. |
+ void SetEncoder(AudioEncoder* new_encoder) { |
+ VisitEncoder([&](AudioEncoder* old_encoder) { return new_encoder; }); |
+ } |
+ |
/////////////////////////////////////////////////////////////////////////// |
// int32_t SendCodec() |
// Get parameters for the codec currently registered as send codec. |
@@ -472,6 +503,29 @@ class AudioCodingModule { |
// |
virtual int RegisterReceiveCodec(const CodecInst& receive_codec) = 0; |
+ // Class for doing type erasure on a functor with signature AudioDecoder*(). |
+ // Any functor with this signature will implicitly convert to DecoderFactory. |
+ class DecoderFactory final { |
+ public: |
+ template <typename F> |
+ DecoderFactory(const F& f) : f_(&f), call_(Call<F>) {} |
+ AudioDecoder* operator()() const { return call_(f_); } |
+ |
+ private: |
+ template <typename F> |
+ static AudioDecoder* Call(const void* f) { |
+ return (*static_cast<const F*>(f))(); |
+ } |
+ const void* const f_; |
+ AudioDecoder* (*const call_)(const void* f); |
+ }; |
+ |
+ // Register a decoder; call repeatedly to register multiple decoders. |df| is |
+ // a decoder factory that returns an iSAC decoder; it will be called once if |
+ // the decoder being registered is iSAC. |
+ virtual int RegisterReceiveCodec(const CodecInst& receive_codec, |
+ const DecoderFactory& df) = 0; |
+ |
// Registers an external decoder. The name is only used to provide information |
// back to the caller about the decoder. Hence, the name is arbitrary, and may |
// be empty. |