From 663850a2b825e762667f930cd5a4ee87de853444 Mon Sep 17 00:00:00 2001
From: Sebastian P <5564491+s3lph@users.noreply.github.com>
Date: Sat, 19 Mar 2022 21:32:00 +0100
Subject: Implement a workaround to signal Opus support (mumble) (#1764)

* Mumble: Implement a workaround to signal Opus support without pulling in the CGO gopus dependency.

* mumble: lowercase error messages

* mumble: Add link to #1750 in bridge/mumble/codec.go
---
 bridge/mumble/codec.go  | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
 bridge/mumble/mumble.go |  1 +
 2 files changed, 71 insertions(+)
 create mode 100644 bridge/mumble/codec.go

diff --git a/bridge/mumble/codec.go b/bridge/mumble/codec.go
new file mode 100644
index 00000000..1306e408
--- /dev/null
+++ b/bridge/mumble/codec.go
@@ -0,0 +1,70 @@
+package bmumble
+
+import (
+	"fmt"
+
+	"layeh.com/gumble/gumble"
+)
+
+// This is a dummy implementation of a Gumble audio codec which claims
+// to implement Opus, but does not actually do anything.  This serves
+// as a workaround until https://github.com/layeh/gumble/pull/61 is
+// merged.
+// See https://github.com/42wim/matterbridge/issues/1750 for details.
+
+const (
+	audioCodecIDOpus = 4
+)
+
+func registerNullCodecAsOpus() {
+	codec := &NullCodec{
+		encoder: &NullAudioEncoder{},
+		decoder: &NullAudioDecoder{},
+	}
+	gumble.RegisterAudioCodec(audioCodecIDOpus, codec)
+}
+
+type NullCodec struct {
+	encoder *NullAudioEncoder
+	decoder *NullAudioDecoder
+}
+
+func (c *NullCodec) ID() int {
+	return audioCodecIDOpus
+}
+
+func (c *NullCodec) NewEncoder() gumble.AudioEncoder {
+	e := &NullAudioEncoder{}
+	return e
+}
+
+func (c *NullCodec) NewDecoder() gumble.AudioDecoder {
+	d := &NullAudioDecoder{}
+	return d
+}
+
+type NullAudioEncoder struct{}
+
+func (e *NullAudioEncoder) ID() int {
+	return audioCodecIDOpus
+}
+
+func (e *NullAudioEncoder) Encode(pcm []int16, mframeSize, maxDataBytes int) ([]byte, error) {
+	return nil, fmt.Errorf("not implemented")
+}
+
+func (e *NullAudioEncoder) Reset() {
+}
+
+type NullAudioDecoder struct{}
+
+func (d *NullAudioDecoder) ID() int {
+	return audioCodecIDOpus
+}
+
+func (d *NullAudioDecoder) Decode(data []byte, frameSize int) ([]int16, error) {
+	return nil, fmt.Errorf("not implemented")
+}
+
+func (d *NullAudioDecoder) Reset() {
+}
diff --git a/bridge/mumble/mumble.go b/bridge/mumble/mumble.go
index d27d8caa..1943bd39 100644
--- a/bridge/mumble/mumble.go
+++ b/bridge/mumble/mumble.go
@@ -185,6 +185,7 @@ func (b *Bmumble) doConnect() error {
 		gumbleConfig.Password = password
 	}
 
+	registerNullCodecAsOpus()
 	client, err := gumble.DialWithDialer(new(net.Dialer), b.GetString("Server"), gumbleConfig, &b.tlsConfig)
 	if err != nil {
 		return err
-- 
cgit v1.2.3