// rdhpisoundcard.cpp // // The audio card subsystem for the HPI Library. // // (C) Copyright 2002-2019 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 // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // #include #include #include #include #include #include "rdhpisoundcard.h" RDHPISoundCard::RDHPISoundCard(RDConfig *config,QObject *parent) : QObject(parent) { card_config=config; card_quantity=0; fade_type=RDHPISoundCard::Log; for(int i=0;i=HPI_MAX_ADAPTERS) { return false; } return timescale_support[card]; } bool RDHPISoundCard::haveInputVolume(int card,int stream,int port) const { if(card>=HPI_MAX_ADAPTERS||stream>=HPI_MAX_STREAMS||port>=HPI_MAX_NODES) { return false; } return input_stream_volume[card][stream][port]; } bool RDHPISoundCard::haveOutputVolume(int card,int stream,int port) const { if(card>=HPI_MAX_ADAPTERS||stream>=HPI_MAX_STREAMS||port>=HPI_MAX_NODES) { return false; } return output_stream_volume[card][stream][port]; } bool RDHPISoundCard::haveInputLevel(int card,int port) const { if(card>=HPI_MAX_ADAPTERS||port>=HPI_MAX_NODES) { return false; } return input_port_level[card][port]; } bool RDHPISoundCard::haveOutputLevel(int card,int port) const { if(card>=HPI_MAX_ADAPTERS||port>=HPI_MAX_NODES) { return false; } return output_port_level[card][port]; } bool RDHPISoundCard::haveInputStreamVOX(int card,int stream) const { if(card>=HPI_MAX_ADAPTERS||stream>=HPI_MAX_STREAMS) { return false; } return input_stream_vox[card][stream]; } RDHPISoundCard::SourceNode RDHPISoundCard::getInputPortMux(int card,int port) { uint16_t type; uint16_t index; LogHpi(HPI_Multiplexer_GetSource(NULL,input_mux_control[card][port], &type,&index),__LINE__); return (RDHPISoundCard::SourceNode)type; } bool RDHPISoundCard::setInputPortMux(int card,int port,RDHPISoundCard::SourceNode node) { switch(node) { case RDHPISoundCard::LineIn: if(HPI_Multiplexer_SetSource(NULL, input_mux_control[card][port],node,0)!=0) { return false; } break; case RDHPISoundCard::AesEbuIn: if(LogHpi(HPI_Multiplexer_SetSource(NULL, input_mux_control[card][port],node, input_mux_index[card][port][1]), __LINE__)!=0) { return false; } break; default: return false; break; } return true; } unsigned short RDHPISoundCard::getInputPortError(int card,int port) { uint16_t error_word=0; if(input_port_aesebu[card][port]) { if(HPI_AESEBU_Receiver_GetErrorStatus(NULL, input_port_aesebu_control[card][port], &error_word)==0) { // // Do nothing // // Needed to suppress the goofy 'result unused' compiler warnings. // } } return error_word; } RDHPISoundCard::FadeProfile RDHPISoundCard::getFadeProfile() const { return fade_type; } void RDHPISoundCard::setFadeProfile(RDHPISoundCard::FadeProfile profile) { fade_type=profile; switch(fade_type) { case RDHPISoundCard::Linear: hpi_fade_type=HPI_VOLUME_AUTOFADE_LINEAR; break; case RDHPISoundCard::Log: hpi_fade_type=HPI_VOLUME_AUTOFADE_LOG; break; } } RDConfig *RDHPISoundCard::config() const { return card_config; } bool RDHPISoundCard::haveInputStreamMeter(int card,int stream) const { return input_stream_meter[card][stream]; } bool RDHPISoundCard::haveInputPortMeter(int card,int port) const { return input_stream_meter[card][port]; } bool RDHPISoundCard::haveOutputStreamMeter(int card,int stream) const { return output_stream_meter[card][stream]; } bool RDHPISoundCard::haveOutputPortMeter(int card,int port) const { return output_port_meter[card][port]; } bool RDHPISoundCard::haveTuner(int card,int port) const { return false; } void RDHPISoundCard::setTunerBand(int card,int port, RDHPISoundCard::TunerBand band) { } int RDHPISoundCard::tunerFrequency(int card,int port) { return 0; } void RDHPISoundCard::setTunerFrequency(int card,int port,int freq) { } bool RDHPISoundCard::tunerSubcarrier(int card,int port, RDHPISoundCard::Subcarrier sub) { return false; } int RDHPISoundCard::tunerLowFrequency(int card,int port, RDHPISoundCard::TunerBand band) { return 0; } int RDHPISoundCard::tunerHighFrequency(int card,int port, RDHPISoundCard::TunerBand band) { return 0; } bool RDHPISoundCard::inputStreamMeter(int card,int stream,short *level) { if(card>=card_quantity) { return false; } if(stream>=card_input_streams[card]) { return false; } LogHpi(HPI_MeterGetPeak(NULL, input_stream_meter_control[card][stream],level), __LINE__); return true; } bool RDHPISoundCard::outputStreamMeter(int card,int stream,short *level) { if(card>=card_quantity) { return false; } if(stream>=card_output_streams[card]) { return false; } LogHpi(HPI_MeterGetPeak(NULL,output_stream_meter_control[card][stream], level),__LINE__); return true; } bool RDHPISoundCard::inputPortMeter(int card,int port,short *level) { if(card>=card_quantity) { return false; } if(port>=card_input_ports[card]) { return false; } LogHpi(HPI_MeterGetPeak(NULL,input_port_meter_control[card][port],level), __LINE__); return true; } bool RDHPISoundCard::outputPortMeter(int card,int port,short *level) { if(card>=card_quantity) { return false; } if(port>=card_output_ports[card]) { return false; } LogHpi(HPI_MeterGetPeak(NULL,output_port_meter_control[card][port],level), __LINE__); return true; } bool RDHPISoundCard::haveInputMode(int card,int port) const { return input_port_mode[card][port]; } bool RDHPISoundCard::haveOutputMode(int card,int stream) const { return output_stream_mode[card][stream]; } bool RDHPISoundCard::haveInputPortMux(int card,int port) const { return input_port_mux[card][port]; } bool RDHPISoundCard::queryInputPortMux(int card,int port,SourceNode node) const { switch(node) { case RDHPISoundCard::LineIn: return input_port_mux_type[card][port][0]; break; case RDHPISoundCard::AesEbuIn: return input_port_mux_type[card][port][1]; break; default: return false; break; } } bool RDHPISoundCard::haveInputStreamMux(int card,int stream) const { return input_stream_mux[card][stream]; } int RDHPISoundCard::getInputVolume(int card,int stream,int port) { short gain[2]; LogHpi(HPI_VolumeGetGain(NULL,input_stream_volume_control[card][stream][port], gain),__LINE__); return gain[0]; } int RDHPISoundCard::getOutputVolume(int card,int stream,int port) { short gain[2]; LogHpi(HPI_VolumeGetGain(NULL,output_stream_volume_control[card][stream][port],gain),__LINE__); return gain[0]; } int RDHPISoundCard::getInputLevel(int card,int port) { short gain[2]; LogHpi(HPI_VolumeGetGain(NULL,input_port_level_control[card][port],gain), __LINE__); return gain[0]; } int RDHPISoundCard::getOutputLevel(int card,int port) { short gain[2]; LogHpi(HPI_VolumeGetGain(NULL,output_port_level_control[card][port],gain), __LINE__); return gain[0]; } void RDHPISoundCard::setInputVolume(int card,int stream,int level) { if(!haveInputVolume(card,stream,0)) { return; } short gain[2]; gain[0]=level; gain[1]=level; LogHpi(HPI_VolumeSetGain(NULL,input_stream_volume_control[card][stream][0], gain),__LINE__); } void RDHPISoundCard::setOutputVolume(int card,int stream,int port,int level) { if(!haveOutputVolume(card,stream,port)) { return; } short gain[2]; gain[0]=level; gain[1]=level; LogHpi(HPI_VolumeSetGain(NULL, output_stream_volume_control[card][stream][port], gain),__LINE__); } void RDHPISoundCard::fadeOutputVolume(int card,int stream,int port, int level,int length) { if(!haveOutputVolume(card,stream,port)) { return; } short gain[2]; gain[0]=level; gain[1]=level; LogHpi(HPI_VolumeAutoFadeProfile(NULL, output_stream_volume_control[card][stream][port], gain,length,hpi_fade_type),__LINE__); } void RDHPISoundCard::setInputLevel(int card,int port,int level) { short gain[HPI_MAX_CHANNELS]; if(!haveInputLevel(card,port)) { return; } for(unsigned i=0;i>13)&7); hpi_info[i].setDspMinorVersion((dummy_version>>7)&63); hpi_info[i].setPcbVersion((char)(((dummy_version>>3)&7)+'A')); hpi_info[i].setAssemblyVersion(dummy_version&7); LogHpi(HPI_AdapterClose(NULL,card_index[i]),__LINE__); str=QString(tr("Input Stream")); for(int j=0;jstart(METER_INTERVAL); } hpi_err_t RDHPISoundCard::LogHpi(hpi_err_t err,int lineno) { char err_txt[200]; if(err!=0) { HPI_GetErrorText(err,err_txt); RDApplication::syslog(card_config,LOG_WARNING, "HPI Error: %s, %s line %d",err_txt,__FILE__,lineno); } return err; }