create audiobuffer class

This commit is contained in:
drowe67 2021-12-15 14:38:29 +10:30 committed by David Rowe
parent 3e1dc4ee1c
commit da478d3b83
2 changed files with 26 additions and 15 deletions

View file

@ -101,9 +101,7 @@ rx_bursts = 0
rx_errors = 0
timeout = time.time() + TIMEOUT
receive = True
naudio_buffer_max = codec2.api.freedv_get_n_max_modem_samples(freedv)*2
audio_buffer = np.zeros(naudio_buffer_max, dtype=np.int16)
naudio_buffer = 0
audio_buffer = codec2.audio_buffer(codec2.api.freedv_get_n_max_modem_samples(freedv))
# initial number of samples we need
nin = codec2.api.freedv_nin(freedv)
@ -119,19 +117,15 @@ while receive and time.time() < timeout:
x = np.frombuffer(data_in, dtype=np.int16)
if len(x) == 0:
receive = False
audio_buffer[naudio_buffer:naudio_buffer+len(x)] = x
naudio_buffer += len(x)
assert naudio_buffer <= naudio_buffer_max
audio_buffer.push(x)
# when we have enough samples call FreeDV Rx
while naudio_buffer >= nin:
nbytes = codec2.api.freedv_rawdatarx(freedv, bytes_out, audio_buffer.ctypes) # demodulate audio
# remove old samples from buffer
naudio_buffer -= nin;
audio_buffer[:naudio_buffer] = audio_buffer[nin:nin+naudio_buffer]
while audio_buffer.nbuffer >= nin:
# demodulate audio
nbytes = codec2.api.freedv_rawdatarx(freedv, bytes_out, audio_buffer.buffer.ctypes)
audio_buffer.pop(nin)
# call me on every loop!
nin = codec2.api.freedv_nin(freedv)
@ -140,8 +134,8 @@ while receive and time.time() < timeout:
rx_errors = rx_errors + 1
if DEBUGGING_MODE:
rx_status = codec2.api.rx_sync_flags_to_text[rx_status]
print("nin: %5d rx_status: %4s naudio_buffer: %4d len(audio_buffer): %d)" % \
(nin,rx_status,naudio_buffer,len(audio_buffer)), file=sys.stderr)
print("nin: %5d rx_status: %4s naudio_buffer: %4d" % \
(nin,rx_status,audio_buffer.nbuffer), file=sys.stderr)
if nbytes:
total_n_bytes = total_n_bytes + nbytes

View file

@ -6,6 +6,7 @@ from ctypes import *
import sys
import pathlib
from enum import Enum
import numpy as np
print("loading codec2 module", file=sys.stderr)
@ -19,6 +20,22 @@ class FREEDV_MODE(Enum):
def FREEDV_GET_MODE(mode):
return FREEDV_MODE[mode].value
class audio_buffer:
def __init__(self, size):
self.size = size
self.buffer = np.zeros(size, dtype=np.int16)
self.nbuffer = 0
def push(self,samples):
self.buffer[self.nbuffer:self.nbuffer+len(samples)] = samples
self.nbuffer += len(samples)
assert self.nbuffer <= self.size
def nbuffer(self):
return self.nbuffer
def pop(self,size):
self.nbuffer -= size;
self.buffer[:self.nbuffer] = self.buffer[size:size+self.nbuffer]
assert self.nbuffer >= 0
# LOAD FREEDV
libname = "libcodec2.so"
api = ctypes.CDLL(libname)