2019-06-10 Fred Gleason <fredg@paravelsystems.com>

* Removed the 'Channels=' directive from the '[Format]' section
	of rd.conf(5).
This commit is contained in:
Fred Gleason 2019-06-10 15:32:53 -04:00
parent a7f6cf49cd
commit 75077f5145
5 changed files with 163 additions and 215 deletions

View File

@ -18753,3 +18753,6 @@
* Fixed a bug in caed(8) that caused the 'Unload Playback' ['UP'] * Fixed a bug in caed(8) that caused the 'Unload Playback' ['UP']
command to be ignored when the 'handle' argument was greater command to be ignored when the 'handle' argument was greater
than 23. than 23.
2019-06-10 Fred Gleason <fredg@paravelsystems.com>
* Removed the 'Channels=' directive from the '[Format]' section
of rd.conf(5).

View File

@ -2,7 +2,7 @@
// //
// The ALSA Driver for the Core Audio Engine component of Rivendell // The ALSA Driver for the Core Audio Engine component of Rivendell
// //
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -54,20 +54,16 @@ volatile bool alsa_eof[RD_MAX_CARDS][RD_MAX_STREAMS];
volatile int alsa_output_pos[RD_MAX_CARDS][RD_MAX_STREAMS]; volatile int alsa_output_pos[RD_MAX_CARDS][RD_MAX_STREAMS];
volatile bool alsa_recording[RD_MAX_CARDS][RD_MAX_PORTS]; volatile bool alsa_recording[RD_MAX_CARDS][RD_MAX_PORTS];
volatile bool alsa_ready[RD_MAX_CARDS][RD_MAX_PORTS]; volatile bool alsa_ready[RD_MAX_CARDS][RD_MAX_PORTS];
volatile int alsa_channels;
void *AlsaCaptureCallback(void *ptr)
void AlsaCapture1Callback(struct alsa_format *alsa_format)
{
}
void AlsaCapture2Callback(struct alsa_format *alsa_format)
{ {
char alsa_buffer[RINGBUFFER_SIZE]; char alsa_buffer[RINGBUFFER_SIZE];
int modulo; int modulo;
int16_t in_meter[RD_MAX_PORTS][2]; int16_t in_meter[RD_MAX_PORTS][2];
struct alsa_format *alsa_format=(struct alsa_format *)ptr;
signal(SIGTERM,SigHandler);
signal(SIGINT,SigHandler);
while(!alsa_format->exiting) { while(!alsa_format->exiting) {
int s=snd_pcm_readi(alsa_format->pcm,alsa_format->card_buffer, int s=snd_pcm_readi(alsa_format->pcm,alsa_format->card_buffer,
@ -82,196 +78,173 @@ void AlsaCapture2Callback(struct alsa_format *alsa_format)
} }
else { else {
switch(alsa_format->format) { switch(alsa_format->format) {
case SND_PCM_FORMAT_S16_LE: case SND_PCM_FORMAT_S16_LE:
modulo=alsa_format->channels; modulo=alsa_format->channels;
for(unsigned i=0;i<(alsa_format->channels/2);i++) { for(unsigned i=0;i<(alsa_format->channels/2);i++) {
if(alsa_recording[alsa_format->card][i]) { if(alsa_recording[alsa_format->card][i]) {
if(alsa_input_volume[alsa_format->card][i]!=0.0) { if(alsa_input_volume[alsa_format->card][i]!=0.0) {
switch(alsa_input_channels[alsa_format->card][i]) { switch(alsa_input_channels[alsa_format->card][i]) {
case 1: case 1:
for(int k=0;k<(2*s);k++) { for(int k=0;k<(2*s);k++) {
((int16_t *)alsa_buffer)[k]= ((int16_t *)alsa_buffer)[k]=
(int16_t)(alsa_input_volume[alsa_format->card][i]* (int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format-> (double)(((int16_t *)alsa_format->
card_buffer) card_buffer)
[modulo*k+2*i]))+ [modulo*k+2*i]))+
(int16_t)(alsa_input_volume[alsa_format->card][i]* (int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format-> (double)(((int16_t *)alsa_format->
card_buffer) card_buffer)
[modulo*k+2*i+1])); [modulo*k+2*i+1]));
}
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*sizeof(int16_t));
break;
case 2:
for(int k=0;k<s;k++) {
((int16_t *)alsa_buffer)[2*k]=
(int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+2*i]));
((int16_t *)alsa_buffer)[2*k+1]=
(int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+2*i+1]));
}
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*2*sizeof(int16_t));
break;
}
} }
} alsa_record_ring[alsa_format->card][i]->
} write(alsa_buffer,s*sizeof(int16_t));
break;
// case 2:
// Process Passthroughs
//
for(unsigned i=0;i<alsa_format->channels;i+=2) {
for(unsigned j=0;j<2;j++) {
for(int k=0;k<s;k++) { for(int k=0;k<s;k++) {
((int16_t *)alsa_format->passthrough_buffer)[2*k+j]= ((int16_t *)alsa_buffer)[2*k]=
((int16_t *)alsa_format-> (int16_t)(alsa_input_volume[alsa_format->card][i]*
card_buffer)[alsa_format->channels*k+i+j]; (double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+2*i]));
((int16_t *)alsa_buffer)[2*k+1]=
(int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+2*i+1]));
} }
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*2*sizeof(int16_t));
break;
} }
alsa_passthrough_ring[alsa_format->card][i/2]->
write(alsa_format->passthrough_buffer,4*s);
} }
}
}
// //
// Process Input Meters // Process Passthroughs
// //
for(unsigned i=0;i<alsa_format->channels;i+=2) { for(unsigned i=0;i<alsa_format->channels;i+=2) {
for(unsigned j=0;j<2;j++) { for(unsigned j=0;j<2;j++) {
in_meter[i/2][j]=0; for(int k=0;k<s;k++) {
((int16_t *)alsa_format->passthrough_buffer)[2*k+j]=
((int16_t *)alsa_format->
card_buffer)[alsa_format->channels*k+i+j];
}
}
alsa_passthrough_ring[alsa_format->card][i/2]->
write(alsa_format->passthrough_buffer,4*s);
}
//
// Process Input Meters
//
for(unsigned i=0;i<alsa_format->channels;i+=2) {
for(unsigned j=0;j<2;j++) {
in_meter[i/2][j]=0;
for(int k=0;k<s;k++) {
if(((int16_t *)alsa_format->
card_buffer)[alsa_format->channels*k+2*i+j]>
in_meter[i][j]) {
in_meter[i][j]=
((int16_t *)alsa_format->
card_buffer)[alsa_format->channels*k+2*i+j];
}
}
alsa_input_meter[alsa_format->card][i/2][j]->
addValue(((double)in_meter[i/2][j])/32768.0);
}
}
break;
case SND_PCM_FORMAT_S32_LE:
modulo=alsa_format->channels*2;
for(unsigned i=0;i<(alsa_format->channels/2);i++) {
if(alsa_recording[alsa_format->card][i]) {
if(alsa_input_volume[alsa_format->card][i]!=0.0) {
switch(alsa_input_channels[alsa_format->card][i]) {
case 1:
for(int k=0;k<(2*s);k++) {
((int16_t *)alsa_buffer)[k]=
(int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+4*i+1]))+
(int16_t)(alsa_input_volume[alsa_format->card][i]*
(double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+4*i+3]));
}
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*sizeof(int16_t));
break;
case 2:
for(int k=0;k<s;k++) { for(int k=0;k<s;k++) {
if(((int16_t *)alsa_format-> ((int16_t *)alsa_buffer)[2*k]=
card_buffer)[alsa_format->channels*k+2*i+j]> (int16_t)(alsa_input_volume[alsa_format->card][i]*
in_meter[i][j]) { (double)(((int16_t *)alsa_format->card_buffer)
in_meter[i][j]= [modulo*k+4*i+1]));
((int16_t *)alsa_format-> ((int16_t *)alsa_buffer)[2*k+1]=
card_buffer)[alsa_format->channels*k+2*i+j]; (int16_t)(alsa_input_volume[alsa_format->card][i]*
} (double)(((int16_t *)alsa_format->card_buffer)
[modulo*k+4*i+3]));
} }
alsa_input_meter[alsa_format->card][i/2][j]-> alsa_record_ring[alsa_format->card][i]->
addValue(((double)in_meter[i/2][j])/32768.0); write(alsa_buffer,s*2*sizeof(int16_t));
break;
} }
} }
break; }
}
case SND_PCM_FORMAT_S32_LE: //
modulo=alsa_format->channels*2; // Process Passthroughs
for(unsigned i=0;i<(alsa_format->channels/2);i++) { //
if(alsa_recording[alsa_format->card][i]) { for(unsigned i=0;i<alsa_format->channels;i+=2) {
if(alsa_input_volume[alsa_format->card][i]!=0.0) { for(unsigned j=0;j<2;j++) {
switch(alsa_input_channels[alsa_format->card][i]) { for(int k=0;k<s;k++) {
case 1: ((int32_t *)alsa_format->passthrough_buffer)[2*k+j]=
for(int k=0;k<(2*s);k++) { ((int32_t *)alsa_format->
((int16_t *)alsa_buffer)[k]= card_buffer)[alsa_format->channels*k+i+j];
(int16_t)(alsa_input_volume[alsa_format->card][i]* }
(double)(((int16_t *)alsa_format-> }
card_buffer) alsa_passthrough_ring[alsa_format->card][i/2]->
[modulo*k+4*i+1]))+ write(alsa_format->passthrough_buffer,8*s);
(int16_t)(alsa_input_volume[alsa_format->card][i]* }
(double)(((int16_t *)alsa_format->
card_buffer)
[modulo*k+4*i+3]));
}
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*sizeof(int16_t));
break;
case 2: //
for(int k=0;k<s;k++) { // Process Input Meters
((int16_t *)alsa_buffer)[2*k]= //
(int16_t)(alsa_input_volume[alsa_format->card][i]* for(unsigned i=0;i<alsa_format->channels;i+=2) {
(double)(((int16_t *)alsa_format->card_buffer) for(unsigned j=0;j<2;j++) {
[modulo*k+4*i+1])); in_meter[i/2][j]=0;
((int16_t *)alsa_buffer)[2*k+1]= for(int k=0;k<s;k++) {
(int16_t)(alsa_input_volume[alsa_format->card][i]* if(((int16_t *)alsa_format->
(double)(((int16_t *)alsa_format->card_buffer) card_buffer)[alsa_format->channels*2*k+2*i+1+2*j]>
[modulo*k+4*i+3])); in_meter[i/2][j]) {
} in_meter[i/2][j]=
alsa_record_ring[alsa_format->card][i]-> ((int16_t *)alsa_format->
write(alsa_buffer,s*2*sizeof(int16_t)); card_buffer)[alsa_format->channels*2*k+2*i+1+2*j];
break;
}
}
} }
} }
alsa_input_meter[alsa_format->card][i/2][j]->
addValue(((double)in_meter[i/2][j])/32768.0);
}
}
break;
// default:
// Process Passthroughs break;
//
for(unsigned i=0;i<alsa_format->channels;i+=2) {
for(unsigned j=0;j<2;j++) {
for(int k=0;k<s;k++) {
((int32_t *)alsa_format->passthrough_buffer)[2*k+j]=
((int32_t *)alsa_format->
card_buffer)[alsa_format->channels*k+i+j];
}
}
alsa_passthrough_ring[alsa_format->card][i/2]->
write(alsa_format->passthrough_buffer,8*s);
}
//
// Process Input Meters
//
for(unsigned i=0;i<alsa_format->channels;i+=2) {
for(unsigned j=0;j<2;j++) {
in_meter[i/2][j]=0;
for(int k=0;k<s;k++) {
if(((int16_t *)alsa_format->
card_buffer)[alsa_format->channels*2*k+2*i+1+2*j]>
in_meter[i/2][j]) {
in_meter[i/2][j]=
((int16_t *)alsa_format->
card_buffer)[alsa_format->channels*2*k+2*i+1+2*j];
}
}
alsa_input_meter[alsa_format->card][i/2][j]->
addValue(((double)in_meter[i/2][j])/32768.0);
}
}
break;
default:
break;
} }
} }
} }
}
void *AlsaCaptureCallback(void *ptr)
{
struct alsa_format *alsa_format=(struct alsa_format *)ptr;
signal(SIGTERM,SigHandler);
signal(SIGINT,SigHandler);
switch(alsa_channels) {
case 1:
AlsaCapture1Callback(alsa_format);
break;
case 2:
AlsaCapture2Callback(alsa_format);
break;
}
return 0; return 0;
} }
void AlsaPlay1Callback(struct alsa_format *alsa_format) void *AlsaPlayCallback(void *ptr)
{
}
void AlsaPlay2Callback(struct alsa_format *alsa_format)
{ {
int n=0; int n=0;
int p; int p;
@ -280,6 +253,11 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format)
int16_t out_meter[RD_MAX_PORTS][2]; int16_t out_meter[RD_MAX_PORTS][2];
int16_t stream_out_meter=0; int16_t stream_out_meter=0;
struct alsa_format *alsa_format=(struct alsa_format *)ptr;
signal(SIGTERM,SigHandler);
signal(SIGINT,SigHandler);
while(!alsa_format->exiting) { while(!alsa_format->exiting) {
memset(alsa_format->card_buffer,0,alsa_format->card_buffer_size); memset(alsa_format->card_buffer,0,alsa_format->card_buffer_size);
@ -549,25 +527,7 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format)
alsa_format->card)); alsa_format->card));
} }
} }
}
void *AlsaPlayCallback(void *ptr)
{
struct alsa_format *alsa_format=(struct alsa_format *)ptr;
signal(SIGTERM,SigHandler);
signal(SIGINT,SigHandler);
switch(alsa_channels) {
case 1:
AlsaPlay1Callback(alsa_format);
break;
case 2:
AlsaPlay2Callback(alsa_format);
break;
}
return 0; return 0;
} }
@ -692,7 +652,7 @@ void MainObject::alsaInit(RDStation *station)
} }
} }
} }
alsa_channels=rd_config->channels(); // alsa_channels=rd_config->channels();
// //
// Stop & Fade Timers // Stop & Fade Timers
@ -779,9 +739,9 @@ void MainObject::alsaInit(RDStation *station)
} }
station-> station->
setCardInputs(i, setCardInputs(i,
alsa_capture_format[i].channels/rd_config->channels()); alsa_capture_format[i].channels/RD_DEFAULT_CHANNELS);
station-> station->
setCardOutputs(i,alsa_play_format[i].channels/rd_config->channels()); setCardOutputs(i,alsa_play_format[i].channels/RD_DEFAULT_CHANNELS);
} }
else { else {
i--; i--;
@ -1468,7 +1428,7 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
// Channels // Channels
// //
if(rd_config->alsaChannelsPerPcm()<0) { if(rd_config->alsaChannelsPerPcm()<0) {
alsa_capture_format[card].channels=rd_config->channels()*RD_MAX_PORTS; alsa_capture_format[card].channels=RD_DEFAULT_CHANNELS*RD_MAX_PORTS;
} }
else { else {
alsa_capture_format[card].channels=rd_config->alsaChannelsPerPcm(); alsa_capture_format[card].channels=rd_config->alsaChannelsPerPcm();
@ -1625,7 +1585,7 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
// Channels // Channels
// //
if(rd_config->alsaChannelsPerPcm()<0) { if(rd_config->alsaChannelsPerPcm()<0) {
alsa_play_format[card].channels=rd_config->channels()*RD_MAX_PORTS; alsa_play_format[card].channels=RD_DEFAULT_CHANNELS*RD_MAX_PORTS;
} }
else { else {
alsa_play_format[card].channels=rd_config->alsaChannelsPerPcm(); alsa_play_format[card].channels=rd_config->alsaChannelsPerPcm();

View File

@ -145,11 +145,6 @@ RealtimePriority=9
; when transcoding files. ; when transcoding files.
TranscodingDelay=0 TranscodingDelay=0
[Format]
; This value is used when testing and developing new features in the
; audio drivers. It should never be altered on a production system.
Channels=2
[Hacks] [Hacks]
; If you are getting no output level meter indications with an older ; If you are getting no output level meter indications with an older
; ASI card (such as the ASI4215, ASI4113 or ASI4111), try uncommenting ; ASI card (such as the ASI4215, ASI4113 or ASI4111), try uncommenting

View File

@ -2,7 +2,7 @@
// //
// A container class for a Rivendell Base Configuration // A container class for a Rivendell Base Configuration
// //
// (C) Copyright 2002-2018 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -452,12 +452,6 @@ bool RDConfig::lockRdairplayMemory() const
} }
unsigned RDConfig::channels() const
{
return conf_channels;
}
uid_t RDConfig::uid() const uid_t RDConfig::uid() const
{ {
return conf_uid; return conf_uid;
@ -675,7 +669,6 @@ bool RDConfig::load()
profile->boolValue("Hacks","DisableMaintChecks",false); profile->boolValue("Hacks","DisableMaintChecks",false);
conf_lock_rdairplay_memory= conf_lock_rdairplay_memory=
profile->boolValue("Hacks","LockRdairplayMemory",false); profile->boolValue("Hacks","LockRdairplayMemory",false);
conf_channels=profile->intValue("Format","Channels",RD_DEFAULT_CHANNELS);
if((user=getpwnam(profile->stringValue("Identity","AudioOwner")))!=NULL) { if((user=getpwnam(profile->stringValue("Identity","AudioOwner")))!=NULL) {
conf_uid=user->pw_uid; conf_uid=user->pw_uid;
} }
@ -799,7 +792,6 @@ void RDConfig::clear()
conf_use_stream_meters=false; conf_use_stream_meters=false;
conf_disable_maint_checks=false; conf_disable_maint_checks=false;
conf_lock_rdairplay_memory=false; conf_lock_rdairplay_memory=false;
conf_channels=RD_DEFAULT_CHANNELS;
conf_uid=65535; conf_uid=65535;
conf_gid=65535; conf_gid=65535;
conf_pypad_uid=65535; conf_pypad_uid=65535;

View File

@ -2,7 +2,7 @@
// //
// A container class for a Rivendell Base Configuration // A container class for a Rivendell Base Configuration
// //
// (C) Copyright 2002-2018 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License version 2 as
@ -114,7 +114,6 @@ class RDConfig
bool lockRdairplayMemory() const; bool lockRdairplayMemory() const;
QString caeLogfile() const; QString caeLogfile() const;
bool enableMixerLogging() const; bool enableMixerLogging() const;
unsigned channels() const;
uid_t uid() const; uid_t uid() const;
gid_t gid() const; gid_t gid() const;
uid_t pypadUid() const; uid_t pypadUid() const;
@ -187,7 +186,6 @@ class RDConfig
bool conf_disable_maint_checks; bool conf_disable_maint_checks;
bool conf_lock_rdairplay_memory; bool conf_lock_rdairplay_memory;
std::vector<QString> conf_jack_ports[2]; std::vector<QString> conf_jack_ports[2];
unsigned conf_channels;
uid_t conf_uid; uid_t conf_uid;
gid_t conf_gid; gid_t conf_gid;
uid_t conf_pypad_uid; uid_t conf_pypad_uid;