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']
command to be ignored when the 'handle' argument was greater
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
//
// (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
// 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 bool alsa_recording[RD_MAX_CARDS][RD_MAX_PORTS];
volatile bool alsa_ready[RD_MAX_CARDS][RD_MAX_PORTS];
volatile int alsa_channels;
void AlsaCapture1Callback(struct alsa_format *alsa_format)
{
}
void AlsaCapture2Callback(struct alsa_format *alsa_format)
void *AlsaCaptureCallback(void *ptr)
{
char alsa_buffer[RINGBUFFER_SIZE];
int modulo;
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) {
int s=snd_pcm_readi(alsa_format->pcm,alsa_format->card_buffer,
@ -82,196 +78,173 @@ void AlsaCapture2Callback(struct alsa_format *alsa_format)
}
else {
switch(alsa_format->format) {
case SND_PCM_FORMAT_S16_LE:
modulo=alsa_format->channels;
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+2*i]))+
(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*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;
}
case SND_PCM_FORMAT_S16_LE:
modulo=alsa_format->channels;
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+2*i]))+
(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*sizeof(int16_t));
break;
//
// Process Passthroughs
//
for(unsigned i=0;i<alsa_format->channels;i+=2) {
for(unsigned j=0;j<2;j++) {
case 2:
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];
((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_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;
//
// 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++) {
((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++) {
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];
}
((int16_t *)alsa_buffer)[2*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_buffer)[2*k+1]=
(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]->
addValue(((double)in_meter[i/2][j])/32768.0);
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*2*sizeof(int16_t));
break;
}
}
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;
//
// 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++) {
((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);
}
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+4*i+1]));
((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+4*i+3]));
}
alsa_record_ring[alsa_format->card][i]->
write(alsa_buffer,s*2*sizeof(int16_t));
break;
}
}
//
// 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;
//
// 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++) {
((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;
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;
}
void AlsaPlay1Callback(struct alsa_format *alsa_format)
{
}
void AlsaPlay2Callback(struct alsa_format *alsa_format)
void *AlsaPlayCallback(void *ptr)
{
int n=0;
int p;
@ -280,6 +253,11 @@ void AlsaPlay2Callback(struct alsa_format *alsa_format)
int16_t out_meter[RD_MAX_PORTS][2];
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) {
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));
}
}
}
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;
}
@ -692,7 +652,7 @@ void MainObject::alsaInit(RDStation *station)
}
}
}
alsa_channels=rd_config->channels();
// alsa_channels=rd_config->channels();
//
// Stop & Fade Timers
@ -779,9 +739,9 @@ void MainObject::alsaInit(RDStation *station)
}
station->
setCardInputs(i,
alsa_capture_format[i].channels/rd_config->channels());
alsa_capture_format[i].channels/RD_DEFAULT_CHANNELS);
station->
setCardOutputs(i,alsa_play_format[i].channels/rd_config->channels());
setCardOutputs(i,alsa_play_format[i].channels/RD_DEFAULT_CHANNELS);
}
else {
i--;
@ -1468,7 +1428,7 @@ bool MainObject::AlsaStartCaptureDevice(QString &dev,int card,snd_pcm_t *pcm)
// Channels
//
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 {
alsa_capture_format[card].channels=rd_config->alsaChannelsPerPcm();
@ -1625,7 +1585,7 @@ bool MainObject::AlsaStartPlayDevice(QString &dev,int card,snd_pcm_t *pcm)
// Channels
//
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 {
alsa_play_format[card].channels=rd_config->alsaChannelsPerPcm();

View File

@ -145,11 +145,6 @@ RealtimePriority=9
; when transcoding files.
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]
; If you are getting no output level meter indications with an older
; 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
//
// (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
// 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
{
return conf_uid;
@ -675,7 +669,6 @@ bool RDConfig::load()
profile->boolValue("Hacks","DisableMaintChecks",false);
conf_lock_rdairplay_memory=
profile->boolValue("Hacks","LockRdairplayMemory",false);
conf_channels=profile->intValue("Format","Channels",RD_DEFAULT_CHANNELS);
if((user=getpwnam(profile->stringValue("Identity","AudioOwner")))!=NULL) {
conf_uid=user->pw_uid;
}
@ -799,7 +792,6 @@ void RDConfig::clear()
conf_use_stream_meters=false;
conf_disable_maint_checks=false;
conf_lock_rdairplay_memory=false;
conf_channels=RD_DEFAULT_CHANNELS;
conf_uid=65535;
conf_gid=65535;
conf_pypad_uid=65535;

View File

@ -2,7 +2,7 @@
//
// 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
// it under the terms of the GNU General Public License version 2 as
@ -114,7 +114,6 @@ class RDConfig
bool lockRdairplayMemory() const;
QString caeLogfile() const;
bool enableMixerLogging() const;
unsigned channels() const;
uid_t uid() const;
gid_t gid() const;
uid_t pypadUid() const;
@ -187,7 +186,6 @@ class RDConfig
bool conf_disable_maint_checks;
bool conf_lock_rdairplay_memory;
std::vector<QString> conf_jack_ports[2];
unsigned conf_channels;
uid_t conf_uid;
gid_t conf_gid;
uid_t conf_pypad_uid;