mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
create audiobuffer class
This commit is contained in:
parent
3e1dc4ee1c
commit
da478d3b83
2 changed files with 26 additions and 15 deletions
|
@ -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,18 +117,14 @@ 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:
|
||||
while audio_buffer.nbuffer >= 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]
|
||||
# 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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue