summaryrefslogtreecommitdiff
path: root/libs/backends
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2020-04-10 05:01:19 +0200
committerRobin Gareus <robin@gareus.org>2020-04-10 05:01:30 +0200
commite8efd45c0512cb07a6ac2658575f44c16cc60b69 (patch)
tree185c5a9f65b25ad2b2eb243a56a9712d4f0bfb80 /libs/backends
parent78b29c55d3c4f056bbdd23354ee8390d769c67da (diff)
Fix ALSA slave-device half-duplex mode
Diffstat (limited to 'libs/backends')
-rw-r--r--libs/backends/alsa/alsa_slave.cc34
1 files changed, 22 insertions, 12 deletions
diff --git a/libs/backends/alsa/alsa_slave.cc b/libs/backends/alsa/alsa_slave.cc
index af7b62ed9e..43c2877229 100644
--- a/libs/backends/alsa/alsa_slave.cc
+++ b/libs/backends/alsa/alsa_slave.cc
@@ -61,19 +61,25 @@ AlsaAudioSlave::AlsaAudioSlave (
_ratio = (double) master_rate / (double) _pcmi.fsamp();
#ifndef NDEBUG
- fprintf (stdout, " --[[ ALSA Slave %s/%s ratio: %.4f\n", play_name, capt_name, _ratio);
+ fprintf (stdout, " --[[ ALSA Slave %s/%s ratio: %.4f\n",
+ capt_name ? capt_name : "-",
+ play_name ? play_name : "-",
+ _ratio);
_pcmi.printinfo ();
fprintf (stdout, " --]]\n");
#endif
- _src_capt.setup (_ratio, _pcmi.ncapt (), /*quality*/ 32); // save capture to master
- _src_play.setup (1.0 / _ratio, _pcmi.nplay (), /*quality*/ 32); // master to slave play
-
- _src_capt.set_rrfilt (100);
- _src_play.set_rrfilt (100);
+ if (_pcmi.ncapt () > 0) {
+ _src_capt.setup (_ratio, _pcmi.ncapt (), /*quality*/ 32); // save capture to master
+ _src_capt.set_rrfilt (100);
+ _capt_buff = (float*) malloc (sizeof(float) * _pcmi.ncapt () * _samples_per_period);
+ }
+ if (_pcmi.nplay () > 0) {
+ _src_play.setup (1.0 / _ratio, _pcmi.nplay (), /*quality*/ 32); // master to slave play
+ _src_play.set_rrfilt (100);
+ _play_buff = (float*) malloc (sizeof(float) * _pcmi.nplay () * _samples_per_period);
+ }
- _capt_buff = (float*) malloc (sizeof(float) * _pcmi.ncapt () * _samples_per_period);
- _play_buff = (float*) malloc (sizeof(float) * _pcmi.nplay () * _samples_per_period);
_src_buff = (float*) malloc (sizeof(float) * std::max (_pcmi.nplay (), _pcmi.ncapt ()));
}
@@ -357,7 +363,9 @@ AlsaAudioSlave::cycle_start (double tme, double mst_speed, bool drain)
_src_capt.set_rratio (mst_speed / slave_speed);
_src_play.set_rratio (slave_speed / mst_speed);
- memset (_capt_buff, 0, sizeof(float) * _pcmi.ncapt () * _samples_per_period);
+ if (_capt_buff) {
+ memset (_capt_buff, 0, sizeof(float) * _pcmi.ncapt () * _samples_per_period);
+ }
if (drain) {
g_atomic_int_set(&_draining, 1);
@@ -384,7 +392,7 @@ AlsaAudioSlave::cycle_start (double tme, double mst_speed, bool drain)
}
bool underflow = false;
- while (_src_capt.out_count && _active) {
+ while (_src_capt.out_count && _active && nchn > 0) {
if (_rb_capture.read_space() < nchn) {
underflow = true;
break;
@@ -411,11 +419,13 @@ AlsaAudioSlave::cycle_start (double tme, double mst_speed, bool drain)
g_atomic_int_set(&_draining, 1);
}
- if (!_active || underflow) {
+ if ((!_active || underflow) && _capt_buff) {
memset (_capt_buff, 0, sizeof(float) * _pcmi.ncapt () * _samples_per_period);
}
- memset (_play_buff, 0, sizeof(float) * _pcmi.nplay () * _samples_per_period);
+ if (_play_buff) {
+ memset (_play_buff, 0, sizeof(float) * _pcmi.nplay () * _samples_per_period);
+ }
}
void