Fixed latest bugs. Now everything seems to be working, at least with the RtAudio API

This commit is contained in:
Anne de Jong 2020-11-07 16:33:49 +01:00
parent 4e0c09d356
commit 3d188281ab
5 changed files with 32 additions and 34 deletions

View File

@ -154,14 +154,6 @@ Daq::Daq(const DeviceInfo &devinfo, const DaqConfiguration &config)
throw runtime_error( throw runtime_error(
"Output monitoring only possible when output is enabled"); "Output monitoring only possible when output is enabled");
} }
// Some sanity checks
if (eninchannels.size() != 4) {
throw runtime_error("Invalid length of enabled inChannels vector");
}
if (enoutchannels.size() != 1) {
throw runtime_error("Invalid length of enabled outChannels vector");
}
} }

View File

@ -193,6 +193,13 @@ class AudioDaq: public Daq {
void start(SafeQueue<void*> *inqueue, SafeQueue<void*> *outqueue) { void start(SafeQueue<void*> *inqueue, SafeQueue<void*> *outqueue) {
this->inqueue = inqueue;
this->outqueue = outqueue;
if(monitorOutput) {
this->outDelayqueue = new SafeQueue<void*>();
}
if(isRunning()){ if(isRunning()){
throw runtime_error("Stream already running"); throw runtime_error("Stream already running");
} }
@ -209,6 +216,7 @@ class AudioDaq: public Daq {
} }
void stop() { void stop() {
if(!isRunning()) { if(!isRunning()) {
cerr << "Stream is already stopped" << endl; cerr << "Stream is already stopped" << endl;
} }
@ -216,6 +224,9 @@ class AudioDaq: public Daq {
assert(rtaudio); assert(rtaudio);
rtaudio->stopStream(); rtaudio->stopStream();
} }
if(inqueue) delete inqueue;
if(outqueue) delete outqueue;
if(outDelayqueue) delete outDelayqueue;
} }
bool isRunning() const {return (rtaudio && rtaudio->isStreamRunning());} bool isRunning() const {return (rtaudio && rtaudio->isStreamRunning());}

View File

@ -3,6 +3,7 @@ from .lasp_deviceinfo cimport DeviceInfo
from .lasp_daqconfig cimport DaqConfiguration from .lasp_daqconfig cimport DaqConfiguration
from cpython.ref cimport PyObject,Py_INCREF, Py_DECREF from cpython.ref cimport PyObject,Py_INCREF, Py_DECREF
import numpy as np
from .lasp_device_common import AvType from .lasp_device_common import AvType
__all__ = ['Daq'] __all__ = ['Daq']

View File

@ -59,9 +59,6 @@ class AvStream:
self.input_sensitivity = np.asarray(self.input_sensitivity) self.input_sensitivity = np.asarray(self.input_sensitivity)
# Fill in numpy data type, and sample width
datatype = daqconfig.dataTypeIndex
# Counters for the number of frames that have been coming in # Counters for the number of frames that have been coming in
self._aframectr = Atomic(0) self._aframectr = Atomic(0)
self._vframectr = Atomic(0) self._vframectr = Atomic(0)
@ -88,6 +85,7 @@ class AvStream:
self._daq = Daq(device, daqconfig) self._daq = Daq(device, daqconfig)
self.blocksize = self._daq.nFramesPerBlock self.blocksize = self._daq.nFramesPerBlock
self.samplerate = self._daq.samplerate self.samplerate = self._daq.samplerate
self.dtype = self._daq.getNumpyDataType()
def nCallbacks(self): def nCallbacks(self):
"""Returns the current number of installed callbacks.""" """Returns the current number of installed callbacks."""
@ -164,27 +162,23 @@ class AvStream:
# the output buffer to zero # the output buffer to zero
noutput_cb = len(self._callbacks[AvType.audio_output]) noutput_cb = len(self._callbacks[AvType.audio_output])
shouldhaveoutput = (self.avtype == AvType.audio_output or
self.daqconfig.duplex_mode)
if noutput_cb == 0 and shouldhaveoutput and outdata is not None:
outdata[:, :] = 0
# Loop over callbacks # Loop over callbacks
if outdata is not None: if outdata is not None:
for cb in self._callbacks[AvType.audio_output]: try:
try: if len(self._callbacks[AvType.audio_output]) == 0:
cb(indata, outdata, self._aframectr()) outdata[:, :] = 0
except Exception as e: for cb in self._callbacks[AvType.audio_output]:
print(e) cb(indata, outdata, self._aframectr())
return 2 except Exception as e:
print(e)
return 2
if indata is not None: if indata is not None:
for cb in self._callbacks[AvType.audio_input]: try:
try: for cb in self._callbacks[AvType.audio_input]:
cb(indata, outdata, self._aframectr()) cb(indata, outdata, self._aframectr())
except Exception as e: except Exception as e:
print(e) print(e)
return 1 return 1
return 0 if self._running else 1 return 0 if self._running else 1
@ -199,8 +193,8 @@ class AvStream:
self._vframectr <<= 0 self._vframectr <<= 0
self._video_started <<= False self._video_started <<= False
self._audiobackend.stop() self._daq.stop()
self._audiobackend = None self._daq = None
def isRunning(self): def isRunning(self):
return self._running() return self._running()

View File

@ -37,7 +37,7 @@ class Recording:
if stream.avtype != AvType.audio_input: if stream.avtype != AvType.audio_input:
raise RuntimeError('Stream does not have any input channels') raise RuntimeError('Stream does not have any input channels')
self.blocksize = stream.blocksize self.blocksize = stream.blocksize
self.samplerate = stream.input_samplerate self.samplerate = stream.samplerate
self._running = Atomic(False) self._running = Atomic(False)
self._running_cond = Condition() self._running_cond = Condition()
self.rectime = rectime self.rectime = rectime
@ -81,7 +81,7 @@ class Recording:
self._ad = f.create_dataset('audio', self._ad = f.create_dataset('audio',
(1, stream.blocksize, nchannels), (1, stream.blocksize, nchannels),
dtype=stream.input_numpy_dtype, dtype=stream.dtype,
maxshape=(None, stream.blocksize, maxshape=(None, stream.blocksize,
nchannels), nchannels),
compression='gzip' compression='gzip'
@ -96,7 +96,7 @@ class Recording:
compression='gzip' compression='gzip'
) )
f.attrs['samplerate'] = stream.input_samplerate f.attrs['samplerate'] = stream.samplerate
f.attrs['nchannels'] = nchannels f.attrs['nchannels'] = nchannels
f.attrs['blocksize'] = stream.blocksize f.attrs['blocksize'] = stream.blocksize
f.attrs['sensitivity'] = stream.input_sensitivity f.attrs['sensitivity'] = stream.input_sensitivity