/*
#cgo pkg-config: opus
#include <opus.h>
+
+int
+bridge_decoder_get_last_packet_duration(OpusDecoder *st, opus_int32 *samples)
+{
+ return opus_decoder_ctl(st, OPUS_GET_LAST_PACKET_DURATION(samples));
+}
*/
import "C"
}
return n, nil
}
+
+// Gets the duration (in samples) of the last packet successfully decoded or concealed.
+func (dec *Decoder) LastPacketDuration() (int,error){
+ var samples C.opus_int32
+ res := C.bridge_decoder_get_last_packet_duration(dec.p, &samples)
+ if res != C.OPUS_OK {
+ return 0, Error(res)
+ }
+ return int(samples), nil
+}
t.Errorf("Expected \"unitialized decoder\" error: %v", err)
}
}
+
+func TestDecoder_GetLastPacketDuration(t *testing.T) {
+ const G4 = 391.995
+ const SAMPLE_RATE = 48000
+ const FRAME_SIZE_MS = 60
+ const FRAME_SIZE = SAMPLE_RATE * FRAME_SIZE_MS / 1000
+ pcm := make([]int16, FRAME_SIZE)
+ enc, err := NewEncoder(SAMPLE_RATE, 1, AppVoIP)
+ if err != nil || enc == nil {
+ t.Fatalf("Error creating new encoder: %v", err)
+ }
+ addSine(pcm, SAMPLE_RATE, G4)
+
+ data := make([]byte, 1000)
+ n, err := enc.Encode(pcm, data)
+ if err != nil {
+ t.Fatalf("Couldn't encode data: %v", err)
+ }
+ data = data[:n]
+
+ dec, err := NewDecoder(SAMPLE_RATE, 1)
+ if err != nil || dec == nil {
+ t.Fatalf("Error creating new decoder: %v", err)
+ }
+ n, err = dec.Decode(data, pcm)
+ if err != nil {
+ t.Fatalf("Couldn't decode data: %v", err)
+ }
+ samples, err := dec.LastPacketDuration()
+ if err!=nil{
+ t.Fatalf("Couldn't get last packet duration: %v",err)
+ }
+ if samples!=n{
+ t.Fatalf("Wrong duration length. Expected %d. Got %d", n, samples)
+ }
+}