From 15dd413256b3cde26d5e276929d719e9aeef03d5 Mon Sep 17 00:00:00 2001 From: Terence Fan Date: Thu, 28 Aug 2025 15:44:16 +0800 Subject: [PATCH] Add Get/SET VBR language binding --- encoder.go | 33 +++++++++++++++++++++++++++++++++ encoder_test.go | 24 +++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/encoder.go b/encoder.go index b88dc98..868a820 100644 --- a/encoder.go +++ b/encoder.go @@ -104,6 +104,17 @@ bridge_encoder_reset_state(OpusEncoder *st) return opus_encoder_ctl(st, OPUS_RESET_STATE); } +int +bridge_encoder_set_vbr(OpusEncoder *st, opus_int32 vbr) +{ + return opus_encoder_ctl(st, OPUS_SET_VBR(vbr)); +} + +int +bridge_encoder_get_vbr(OpusEncoder *st, opus_int32 *vbr) +{ + return opus_encoder_ctl(st, OPUS_GET_VBR(vbr)); +} */ import "C" @@ -400,3 +411,25 @@ func (enc *Encoder) Reset() error { } return nil } + +func (enc *Encoder) SetVBR(v bool) error { + vbr := C.opus_int32(0) + if v { + vbr = 1 + } + res := C.bridge_encoder_set_vbr(enc.p, vbr) + if res != C.OPUS_OK { + return Error(res) + } + return nil +} + +// IsCBR checks if encoder is using CBR (false = VBR). +func (enc *Encoder) GetVBR() (bool, error) { + var vbr C.opus_int32 + res := C.bridge_encoder_get_vbr(enc.p, &vbr) + if res != C.OPUS_OK { + return false, Error(res) + } + return vbr == 1, nil +} diff --git a/encoder_test.go b/encoder_test.go index 56d1282..6446813 100644 --- a/encoder_test.go +++ b/encoder_test.go @@ -4,7 +4,9 @@ package opus -import "testing" +import ( + "testing" +) func TestEncoderNew(t *testing.T) { enc, err := NewEncoder(48000, 1, AppVoIP) @@ -391,3 +393,23 @@ func TestEncoder_Reset(t *testing.T) { } RunTestCodec(t, enc) } + +func TestEncoder_SetGetVBR(t *testing.T) { + enc, err := NewEncoder(48000, 1, AppVoIP) + if err != nil || enc == nil { + t.Errorf("Error creating new encoder: %v", err) + } + if vbr, err := enc.GetVBR(); err != nil { + t.Errorf("Error getting VBR: %v", err) + } else if !vbr { + t.Error("VBR should be enabled by default") + } + if err := enc.SetVBR(false); err != nil { + t.Errorf("Error setting VBR: %v", err) + } + if vbr, err := enc.GetVBR(); err != nil { + t.Errorf("Error getting VBR: %v", err) + } else if vbr { + t.Error("VBR should be disabled") + } +}