// rdhpisoundcard.h // // Sound 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. // #ifndef RDHPISOUNDCARD_H #define RDHPISOUNDCARD_H #define METER_INTERVAL 20 #include #include #include #include #include "rdhpiinformation.h" #include #ifndef HPI_VER #include #endif #if HPI_VER < 0x40411 typedef uint16_t hpi_err_t; typedef uint32_t hpi_handle_t; #endif /* * Definitions */ #define RDHPISOUNDCARD_HPI_MAX_LEVEL 2400 #define RDHPISOUNDCARD_HPI_MIN_LEVEL 0 class RDHPISoundCard : public QObject { Q_OBJECT; public: enum FadeProfile {Linear=0,Log=1}; enum Channel {Left=0,Right=1}; enum ChannelMode {Normal=0, // HPI_CHANNEL_MODE_NORMAL-1 Swap=1, // HPI_CHANNEL_MODE_SWAP-1 LeftOnly=2, // HPI_CHANNEL_MODE_LEFT_TO_STEREO-1 RightOnly=3}; // HPI_CHANNEL_MODE_RIGHT_TO_STEREO-1 enum DeviceClass {RecordDevice=0,PlayDevice=1}; enum Driver {Alsa=0,Hpi=1,Jack=2}; enum ClockSource {Internal=0,AesEbu=1,SpDiff=2,WordClock=4}; enum SourceNode {SourceBase=100, // HPI_SOURCENODE_BASE OStream=101, // HPI_SOURCENODE_OSTREAM LineIn=102, // HPI_SOURCENODE_LINEIN AesEbuIn=103, // HPI_SOURCENODE_AESEBU_IN Tuner=104, // HPI_SOURCENODE_TUNER RfIn=105, // HPI_SOURCENODE_RF Clock=106, // HPI_SOURCENODE_CLOCK_SOURCE Raw=107, // HPI_SOURCENODE_RAW_BITSTREAM Mic=108 // HPI_SOURCENODE_MICROPHONE }; /** * Mixer Destination Nodes **/ enum DestNode {DestBase=200, // HPI_DESTNODE_BASE IStream=201, // HPI_DESTNODE_ISTREAM LineOut=202, // HPI_DESTNODE_LINEOUT AesEbuOut=203, // HPI_DESTNODE_AESEBU_OUT RfOut=204, // HPI_DESTNODE_RF Speaker=205 // HPI_DESTNODE_SPEAKER }; enum TunerBand {Fm=0,FmStereo=1,Am=2,Tv=3}; enum Subcarrier {Mpx=0,Rds=1}; RDHPISoundCard(RDConfig *config,QObject *parent=0); ~RDHPISoundCard(); Driver driver() const; RDHPIInformation *hpiInformation(int card); int getCardQuantity() const; int getCardInputStreams(int card) const; int getCardOutputStreams(int card) const; int getCardInputPorts(int card) const; int getCardOutputPorts(int card) const; const void *getCardInfo(int card) const; QString getCardDescription(int card) const; QString getInputStreamDescription(int card,int stream) const; QString getOutputStreamDescription(int card,int stream) const; QString getInputPortDescription(int card,int port) const; QString getOutputPortDescription(int card,int port) const; bool setClockSource(int card,RDHPISoundCard::ClockSource src); bool haveTimescaling(int card) const; bool haveInputVolume(int card,int stream,int port) const; bool haveOutputVolume(int card,int stream,int port) const; bool haveInputLevel(int card,int port) const; bool haveOutputLevel(int card,int port) const; bool haveInputStreamMeter(int card,int stream) const; bool haveOutputStreamMeter(int card,int stream) const; bool haveInputPortMeter(int card,int port) const; bool haveOutputPortMeter(int card,int port) const; bool haveTuner(int card,int port) const; RDHPISoundCard::TunerBand tunerBand(int card,int port); void setTunerBand(int card,int port,RDHPISoundCard::TunerBand band); int tunerFrequency(int card,int port); void setTunerFrequency(int card,int port,int freq); bool tunerSubcarrier(int card,int port,RDHPISoundCard::Subcarrier sub); int tunerLowFrequency(int card,int port,RDHPISoundCard::TunerBand band); int tunerHighFrequency(int card,int port,RDHPISoundCard::TunerBand band); bool inputStreamMeter(int card,int stream,short *level); bool outputStreamMeter(int card,int stream,short *level); bool inputPortMeter(int card,int port,short *level); bool outputPortMeter(int card,int port,short *level); bool haveInputMode(int card,int port) const; bool haveOutputMode(int card,int stream) const; bool haveInputStreamVOX(int card,int stream) const; bool haveInputPortMux(int card,int port) const; bool queryInputPortMux(int card,int port,SourceNode node) const; bool haveInputStreamMux(int card,int stream) const; int getInputVolume(int card,int stream,int port); int getOutputVolume(int card,int stream,int port); int getInputLevel(int card,int port); int getOutputLevel(int card,int port); RDHPISoundCard::SourceNode getInputPortMux(int card,int port); bool setInputPortMux(int card,int port,RDHPISoundCard::SourceNode node); RDHPISoundCard::FadeProfile getFadeProfile() const; unsigned short getInputPortError(int card,int port); void setFadeProfile(RDHPISoundCard::FadeProfile profile); RDConfig *config() const; signals: void inputPortError(int card,int port); void leftInputStreamMeter(int card,int stream,int level); void leftOutputStreamMeter(int card,int stream,int level); void rightInputStreamMeter(int card,int stream,int level); void rightOutputStreamMeter(int card,int stream,int level); void leftInputPortMeter(int card,int port,int level); void leftOutputPortMeter(int card,int port,int level); void rightInputPortMeter(int card,int port,int level); void rightOutputPortMeter(int card,int port,int level); void inputMode(int card,int port,RDHPISoundCard::ChannelMode mode); void outputMode(int card,int stream,RDHPISoundCard::ChannelMode mode); void tunerSubcarrierChanged(RDHPISoundCard::Subcarrier car,bool state); public slots: void setInputVolume(int card,int stream,int level); void setOutputVolume(int card,int stream,int port,int level); void fadeOutputVolume(int card,int stream,int port,int level,int length); void setInputLevel(int card,int port,int level); void setOutputLevel(int card,int port,int level); void setInputMode(int card,int port,RDHPISoundCard::ChannelMode mode); void setOutputMode(int card,int stream,RDHPISoundCard::ChannelMode mode); void setInputStreamVOX(int card,int stream,short gain); bool havePassthroughVolume(int card,int in_port,int out_port); bool setPassthroughVolume(int card,int in_port,int out_port,int level); private slots: void clock(); private: void HPIProbe(); hpi_err_t LogHpi(hpi_err_t err,int lineno); uint16_t card_input_streams[HPI_MAX_ADAPTERS]; uint16_t card_output_streams[HPI_MAX_ADAPTERS]; uint16_t card_input_ports[HPI_MAX_ADAPTERS]; uint16_t card_output_ports[HPI_MAX_ADAPTERS]; QString card_description[HPI_MAX_ADAPTERS]; QString input_stream_description[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; QString output_stream_description[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; QString input_port_description[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; QString output_port_description[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool input_stream_volume[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS][HPI_MAX_NODES]; bool output_stream_volume[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS][HPI_MAX_NODES]; bool input_port_level[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool output_port_level[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool input_stream_meter[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool output_stream_meter[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool input_port_meter[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool output_port_meter[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool input_port_mode[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool output_stream_mode[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool input_stream_vox[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool input_port_mux[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool input_port_mux_type[HPI_MAX_ADAPTERS][HPI_MAX_NODES][2]; bool passthrough_port_volume[HPI_MAX_ADAPTERS][HPI_MAX_NODES][HPI_MAX_NODES]; uint16_t input_mux_index[HPI_MAX_ADAPTERS][HPI_MAX_NODES][2]; bool input_stream_mux[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool input_port_aesebu[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; uint16_t input_port_aesebu_error[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; bool timescale_support[HPI_MAX_ADAPTERS]; int card_quantity; QTimer *clock_timer; RDHPISoundCard::FadeProfile fade_type; uint32_t card_index[HPI_MAX_ADAPTERS]; hpi_handle_t hpi_mixer[HPI_MAX_ADAPTERS]; hpi_handle_t clock_source_control[HPI_MAX_ADAPTERS]; hpi_handle_t input_stream_volume_control[HPI_MAX_ADAPTERS] [HPI_MAX_STREAMS][HPI_MAX_NODES]; hpi_handle_t output_stream_volume_control[HPI_MAX_ADAPTERS] [HPI_MAX_STREAMS][HPI_MAX_NODES]; hpi_handle_t input_port_level_control[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; hpi_handle_t output_port_level_control[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; hpi_handle_t input_stream_meter_control[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; hpi_handle_t output_stream_meter_control[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; hpi_handle_t input_port_meter_control[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; hpi_handle_t output_port_meter_control[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; hpi_handle_t input_port_mode_control[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; hpi_handle_t output_stream_mode_control[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; hpi_handle_t input_stream_vox_control[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; bool input_mux_type[HPI_MAX_ADAPTERS]; hpi_handle_t input_mux_control[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS]; hpi_handle_t passthrough_port_volume_control[HPI_MAX_ADAPTERS] [HPI_MAX_NODES][HPI_MAX_NODES]; hpi_handle_t input_port_aesebu_control[HPI_MAX_ADAPTERS][HPI_MAX_NODES]; uint16_t hpi_fade_type; short input_stream_meter_peak[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS][HPI_MAX_CHANNELS]; short output_stream_meter_peak[HPI_MAX_ADAPTERS][HPI_MAX_STREAMS][HPI_MAX_CHANNELS]; short input_port_meter_peak[HPI_MAX_ADAPTERS][HPI_MAX_NODES][HPI_MAX_CHANNELS]; short output_port_meter_peak[HPI_MAX_ADAPTERS][HPI_MAX_NODES][HPI_MAX_CHANNELS]; RDHPIInformation hpi_info[HPI_MAX_ADAPTERS]; RDConfig *card_config; }; #endif // RDHPISOUNDCARD_H