mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-07 01:13:50 +02:00
241 lines
10 KiB
C++
241 lines
10 KiB
C++
// rdhpisoundcard.h
|
|
//
|
|
// Sound card subsystem for the HPI Library.
|
|
//
|
|
// (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
|
|
// 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 <qobject.h>
|
|
#include <qstring.h>
|
|
#include <qtimer.h>
|
|
|
|
#include <rdconfig.h>
|
|
|
|
#include "rdhpiinformation.h"
|
|
|
|
#include <asihpi/hpi.h>
|
|
#ifndef HPI_VER
|
|
#include <asihpi/hpi_version.h>
|
|
#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
|