python: Add PLC interface for the python wrapper
diff --git a/python/lc3.py b/python/lc3.py index 8c4ae71..eda76fa 100644 --- a/python/lc3.py +++ b/python/lc3.py
@@ -472,14 +472,14 @@ @typing.overload def decode( - self, data: bytes | bytearray | memoryview, bit_depth: None = None + self, data: bytes | bytearray | memoryview | None, bit_depth: None = None ) -> array.array[float]: ... @typing.overload - def decode(self, data: bytes | bytearray | memoryview, bit_depth: int) -> bytes: ... + def decode(self, data: bytes | bytearray | memoryview | None, bit_depth: int) -> bytes: ... def decode( - self, data: bytes | bytearray | memoryview, bit_depth: int | None = None + self, data: bytes | bytearray | memoryview | None, bit_depth: int | None = None ) -> bytes | array.array[float]: """ Decodes an LC3 frame. @@ -487,6 +487,8 @@ The input `data` is the channels concatenation of LC3 frames in a byte-like object. Interleaved PCM samples are returned according to the `bit_depth` indication. + Setting `data` to `None` enables PLC (Packet Loss Concealment) + reconstruction for the block of LC3 frames. When no `bit_depth` is defined, it's a vector of floating point values from -1 to 1, coding the sample levels. When `bit_depth` is defined, it returns a byte array, each sample coded on `bit_depth` bits. @@ -500,22 +502,28 @@ pcm_len = num_channels * self.get_frame_samples() pcm_buffer = (pcm_t * pcm_len)() - data_buffer = bytearray(data) - data_offset = 0 + if data is not None: + data_buffer = bytearray(data) + data_offset = 0 for ich, decoder in enumerate(self.__decoders): pcm_offset = ich * ctypes.sizeof(pcm_t) pcm = (pcm_t * (pcm_len - ich)).from_buffer(pcm_buffer, pcm_offset) - data_size = len(data_buffer) // num_channels + int( - ich < len(data_buffer) % num_channels - ) - buf = (c_byte * data_size).from_buffer(data_buffer, data_offset) - data_offset += data_size + if data is None: + ret = self.lib.lc3_decode( + decoder, None, 0, pcm_fmt, pcm, self.num_channels + ) + else: + data_size = len(data_buffer) // num_channels + int( + ich < len(data_buffer) % num_channels + ) + buf = (c_byte * data_size).from_buffer(data_buffer, data_offset) + data_offset += data_size + ret = self.lib.lc3_decode( + decoder, buf, len(buf), pcm_fmt, pcm, self.num_channels + ) - ret = self.lib.lc3_decode( - decoder, buf, len(buf), pcm_fmt, pcm, self.num_channels - ) if ret < 0: raise InvalidArgumentError("Bad parameters")