HamRemote/opus/decoder.py
2023-02-09 08:33:01 +01:00

60 lines
1.8 KiB
Python

"""High-level interface to a opus.api.decoder functions"""
from opus.api import decoder, ctl
class Decoder(object):
def __init__(self, fs, channels):
"""
Parameters:
fs : sampling rate
channels : number of channels
"""
self._fs = fs
self._channels = channels
self._state = decoder.create(fs, channels)
def __del__(self):
if hasattr(self, '_state'):
# Destroying state only if __init__ completed successfully
decoder.destroy(self._state)
def reset_state(self):
"""Resets the codec state to be equivalent to a freshly initialized state"""
decoder.ctl(self._state, ctl.reset_state)
def decode(self, data, frame_size, decode_fec=False):
return decoder.decode(self._state, data, len(data), frame_size, decode_fec, channels=self._channels)
def decode_float(self, data, frame_size, decode_fec=False):
return decoder.decode_float(self._state, data, len(data), frame_size, decode_fec, channels=self._channels)
# CTL interfaces
_get_final_range = lambda self: decoder.ctl(self._state, ctl.get_final_range)
final_range = property(_get_final_range)
_get_bandwidth = lambda self: decoder.ctl(self._state, ctl.get_bandwidth)
bandwidth = property(_get_bandwidth)
_get_pitch = lambda self: decoder.ctl(self._state, ctl.get_pitch)
pitch = property(_get_pitch)
_get_lsb_depth = lambda self: decoder.ctl(self._state, ctl.get_lsb_depth)
_set_lsb_depth = lambda self, x: decoder.ctl(self._state, ctl.set_lsb_depth, x)
lsb_depth = property(_get_lsb_depth, _set_lsb_depth)
_get_gain = lambda self: decoder.ctl(self._state, ctl.get_gain)
_set_gain = lambda self, x: decoder.ctl(self._state, ctl.set_gain, x)
gain = property(_get_gain, _set_gain)