diff --git a/ChangeLog b/ChangeLog index 52e01b08..6cfd346f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24469,3 +24469,7 @@ 2023-11-08 Fred Gleason * Fixed a bug in ripcd(8) that caused memory to be leaked when processing RMLs. +2023-11-13 Fred Gleason + * Fixed a bug in caed(8) that could cause play-outs from different + hosts to cross-talk into each other's outputs when using a shared + caed(8) instance. diff --git a/cae/cae.cpp b/cae/cae.cpp index f19239ac..b923851c 100644 --- a/cae/cae.cpp +++ b/cae/cae.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -364,6 +365,14 @@ void MainObject::loadPlaybackData(int id,unsigned card,const QString &name) play_handle[handle].stream=new_stream; play_handle[handle].owner=id; play_owner[card][new_stream]=id; + + // + // Mute all volume controls for the stream + // + for(int i=0;ioutputPortQuantity(card);i++) { + dvr->setOutputVolume(card,new_stream,i,RD_MUTE_DEPTH); + } + rda->syslog(LOG_INFO, "LoadPlayback Card: %d Stream: %d Name: %s Handle: %d", card,new_stream,(const char *)wavename.toUtf8(),handle); diff --git a/cae/driver.h b/cae/driver.h index 8ab46b2b..0f61a73a 100644 --- a/cae/driver.h +++ b/cae/driver.h @@ -48,8 +48,8 @@ class Driver : public QObject bool hasCard(int cardnum) const; virtual QString version() const=0; virtual bool initialize(unsigned *next_cardnum)=0;; - - public: + virtual int inputPortQuantity(int card) const=0; + virtual int outputPortQuantity(int card) const=0; virtual bool loadPlayback(int card,QString wavename,int *stream)=0; virtual bool unloadPlayback(int card,int stream)=0; virtual bool playbackPosition(int card,int stream,unsigned pos)=0; diff --git a/cae/driver_alsa.cpp b/cae/driver_alsa.cpp index bbcc5c92..2c0e3b7b 100644 --- a/cae/driver_alsa.cpp +++ b/cae/driver_alsa.cpp @@ -709,14 +709,16 @@ bool DriverAlsa::initialize(unsigned *next_cardnum) setCardName(*next_cardnum,snd_ctl_card_info_get_longname(card_info)); snd_ctl_close(snd_ctl); } - rda->station()-> - setCardInputs(*next_cardnum, - alsa_capture_format[*next_cardnum]. - channels/RD_DEFAULT_CHANNELS); - rda->station()-> - setCardOutputs(*next_cardnum, - alsa_play_format[*next_cardnum]. - channels/RD_DEFAULT_CHANNELS); + alsa_input_port_quantities[*next_cardnum]= + alsa_capture_format[*next_cardnum].channels/RD_DEFAULT_CHANNELS; + rda->station()->setCardInputs(*next_cardnum, + alsa_input_port_quantities.value(*next_cardnum)); + + alsa_output_port_quantities[*next_cardnum]= + alsa_play_format[*next_cardnum].channels/RD_DEFAULT_CHANNELS; + rda->station()->setCardOutputs(*next_cardnum, + alsa_output_port_quantities.value(*next_cardnum)); + card++; if(!pcm_opened) { return card>0; @@ -731,6 +733,18 @@ bool DriverAlsa::initialize(unsigned *next_cardnum) } +int DriverAlsa::inputPortQuantity(int card) const +{ + return alsa_input_port_quantities.value(card); +} + + +int DriverAlsa::outputPortQuantity(int card) const +{ + return alsa_output_port_quantities.value(card); +} + + bool DriverAlsa::loadPlayback(int card,QString wavename,int *stream) { #ifdef ALSA diff --git a/cae/driver_alsa.h b/cae/driver_alsa.h index 58eefe3c..8d5c177c 100644 --- a/cae/driver_alsa.h +++ b/cae/driver_alsa.h @@ -21,6 +21,8 @@ #ifndef DRIVER_ALSA_H #define DRIVER_ALSA_H +#include + #include #include @@ -53,6 +55,8 @@ class DriverAlsa : public Driver ~DriverAlsa(); QString version() const; bool initialize(unsigned *next_cardnum); + int inputPortQuantity(int card) const; + int outputPortQuantity(int card) const; bool loadPlayback(int card,QString wavename,int *stream); bool unloadPlayback(int card,int stream); bool playbackPosition(int card,int stream,unsigned pos); @@ -103,6 +107,8 @@ class DriverAlsa : public Driver void WriteAlsaBuffer(int card,int stream,short *buffer,unsigned len); void FillAlsaOutputStream(int card,int stream); void AlsaClock(); + QMap alsa_input_port_quantities; + QMap alsa_output_port_quantities; struct alsa_format alsa_play_format[RD_MAX_CARDS]; struct alsa_format alsa_capture_format[RD_MAX_CARDS]; short alsa_input_volume_db[RD_MAX_CARDS][RD_MAX_STREAMS]; diff --git a/cae/driver_hpi.cpp b/cae/driver_hpi.cpp index 4cc6652a..1ad27366 100644 --- a/cae/driver_hpi.cpp +++ b/cae/driver_hpi.cpp @@ -91,6 +91,18 @@ bool DriverHpi::initialize(unsigned *next_cardnum) } +int DriverHpi::inputPortQuantity(int card) const +{ + return d_sound_card->getCardInputPorts(card); +} + + +int DriverHpi::outputPortQuantity(int card) const +{ + return d_sound_card->getCardOutputPorts(card); +} + + bool DriverHpi::loadPlayback(int card,QString wavename,int *stream) { #ifdef HPI diff --git a/cae/driver_hpi.h b/cae/driver_hpi.h index 9d2cdb62..00e3b4ab 100644 --- a/cae/driver_hpi.h +++ b/cae/driver_hpi.h @@ -2,7 +2,7 @@ // // caed(8) driver for AudioScience HPI audio devices. // -// (C) Copyright 2021 Fred Gleason +// (C) Copyright 2021-2023 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -39,6 +39,8 @@ class DriverHpi : public Driver ~DriverHpi(); QString version() const; bool initialize(unsigned *next_cardnum); + int inputPortQuantity(int card) const; + int outputPortQuantity(int card) const; void updateMeters(); bool loadPlayback(int card,QString wavename,int *stream); bool unloadPlayback(int card,int stream); diff --git a/cae/driver_jack.cpp b/cae/driver_jack.cpp index 14247070..55d51458 100644 --- a/cae/driver_jack.cpp +++ b/cae/driver_jack.cpp @@ -707,6 +707,18 @@ bool DriverJack::initialize(unsigned *next_cardnum) } +int DriverJack::inputPortQuantity(int card) const +{ + return RD_MAX_PORTS; +} + + +int DriverJack::outputPortQuantity(int card) const +{ + return RD_MAX_PORTS; +} + + bool DriverJack::loadPlayback(int card,QString wavename,int *stream) { #ifdef JACK diff --git a/cae/driver_jack.h b/cae/driver_jack.h index 12299679..a1b8d81f 100644 --- a/cae/driver_jack.h +++ b/cae/driver_jack.h @@ -43,6 +43,8 @@ class DriverJack : public Driver ~DriverJack(); QString version() const; bool initialize(unsigned *next_cardnum); + int inputPortQuantity(int card) const; + int outputPortQuantity(int card) const; bool loadPlayback(int card,QString wavename,int *stream); bool unloadPlayback(int card,int stream); bool playbackPosition(int card,int stream,unsigned pos);