| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2017 F4EXB                                                      //
 | 
					
						
							|  |  |  | // written by Edouard Griffiths                                                  //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify          //
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by          //
 | 
					
						
							|  |  |  | // the Free Software Foundation as version 3 of the License, or                  //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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 V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef INCLUDE_AUDIODEVICEMANGER_H
 | 
					
						
							|  |  |  | #define INCLUDE_AUDIODEVICEMANGER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QStringList>
 | 
					
						
							|  |  |  | #include <QList>
 | 
					
						
							|  |  |  | #include <QMap>
 | 
					
						
							|  |  |  | #include <QAudioDeviceInfo>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "audio/audioinput.h"
 | 
					
						
							|  |  |  | #include "audio/audiooutput.h"
 | 
					
						
							|  |  |  | #include "export.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  | class QDataStream; | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | class AudioFifo; | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  | class MessageQueue; | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class SDRBASE_API AudioDeviceManager { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     class InputDeviceInfo | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |         InputDeviceInfo() : | 
					
						
							|  |  |  |             sampleRate(m_defaultAudioSampleRate), | 
					
						
							|  |  |  |             volume(m_defaultAudioInputVolume) | 
					
						
							|  |  |  |         {} | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |         void resetToDefaults() { | 
					
						
							|  |  |  |             sampleRate = m_defaultAudioSampleRate; | 
					
						
							|  |  |  |             volume = m_defaultAudioInputVolume; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |         unsigned int sampleRate; | 
					
						
							|  |  |  |         float volume; | 
					
						
							|  |  |  |         friend QDataStream& operator<<(QDataStream& ds, const InputDeviceInfo& info); | 
					
						
							|  |  |  |         friend QDataStream& operator>>(QDataStream& ds, InputDeviceInfo& info); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     class OutputDeviceInfo | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     public: | 
					
						
							|  |  |  |         OutputDeviceInfo() : | 
					
						
							|  |  |  |             sampleRate(m_defaultAudioSampleRate), | 
					
						
							|  |  |  |             udpAddress(m_defaultUDPAddress), | 
					
						
							|  |  |  |             udpPort(m_defaultUDPPort), | 
					
						
							|  |  |  |             copyToUDP(false), | 
					
						
							| 
									
										
										
										
											2018-03-26 21:10:09 +02:00
										 |  |  |             udpUseRTP(false), | 
					
						
							|  |  |  |             udpChannelMode(AudioOutput::UDPChannelLeft) | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |         {} | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |         void resetToDefaults() { | 
					
						
							|  |  |  |             sampleRate = m_defaultAudioSampleRate; | 
					
						
							|  |  |  |             udpAddress = m_defaultUDPAddress; | 
					
						
							|  |  |  |             udpPort = m_defaultUDPPort; | 
					
						
							|  |  |  |             copyToUDP = false; | 
					
						
							|  |  |  |             udpUseRTP = false; | 
					
						
							| 
									
										
										
										
											2018-03-26 21:10:09 +02:00
										 |  |  |             udpChannelMode = AudioOutput::UDPChannelLeft; | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |         unsigned int sampleRate; | 
					
						
							|  |  |  |         QString udpAddress; | 
					
						
							|  |  |  |         quint16 udpPort; | 
					
						
							|  |  |  |         bool copyToUDP; | 
					
						
							|  |  |  |         bool udpUseRTP; | 
					
						
							| 
									
										
										
										
											2018-03-26 21:10:09 +02:00
										 |  |  |         AudioOutput::UDPChannelMode udpChannelMode; | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |         friend QDataStream& operator<<(QDataStream& ds, const OutputDeviceInfo& info); | 
					
						
							|  |  |  |         friend QDataStream& operator>>(QDataStream& ds, OutputDeviceInfo& info); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | 	AudioDeviceManager(); | 
					
						
							|  |  |  | 	~AudioDeviceManager(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const QList<QAudioDeviceInfo>& getInputDevices() const { return m_inputDevicesInfo; } | 
					
						
							|  |  |  |     const QList<QAudioDeviceInfo>& getOutputDevices() const { return m_outputDevicesInfo; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool getOutputDeviceName(int outputDeviceIndex, QString &deviceName) const; | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |     bool getInputDeviceName(int inputDeviceIndex, QString &deviceName) const; | 
					
						
							| 
									
										
										
										
											2018-03-26 18:41:09 +02:00
										 |  |  |     int getOutputDeviceIndex(const QString &deviceName) const; | 
					
						
							|  |  |  |     int getInputDeviceIndex(const QString &deviceName) const; | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     void addAudioSink(AudioFifo* audioFifo, MessageQueue *sampleSinkMessageQueue, int outputDeviceIndex = -1); //!< Add the audio sink
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |     void removeAudioSink(AudioFifo* audioFifo); //!< Remove the audio sink
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     void addAudioSource(AudioFifo* audioFifo, MessageQueue *sampleSourceMessageQueue, int inputDeviceIndex = -1);    //!< Add an audio source
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |     void removeAudioSource(AudioFifo* audioFifo); //!< Remove an audio source
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |     bool getInputDeviceInfo(const QString& deviceName, InputDeviceInfo& deviceInfo) const; | 
					
						
							|  |  |  |     bool getOutputDeviceInfo(const QString& deviceName, OutputDeviceInfo& deviceInfo) const; | 
					
						
							|  |  |  |     int getInputSampleRate(int inputDeviceIndex = -1); | 
					
						
							|  |  |  |     int getOutputSampleRate(int outputDeviceIndex = -1); | 
					
						
							|  |  |  |     void setInputDeviceInfo(int inputDeviceIndex, const InputDeviceInfo& deviceInfo); | 
					
						
							|  |  |  |     void setOutputDeviceInfo(int outputDeviceIndex, const OutputDeviceInfo& deviceInfo); | 
					
						
							|  |  |  |     void unsetInputDeviceInfo(int inputDeviceIndex); | 
					
						
							|  |  |  |     void unsetOutputDeviceInfo(int outputDeviceIndex); | 
					
						
							|  |  |  |     void inputInfosCleanup();  //!< Remove input info from map for input devices not present
 | 
					
						
							|  |  |  |     void outputInfosCleanup(); //!< Remove output info from map for output devices not present
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |     static const unsigned int m_defaultAudioSampleRate = 48000; | 
					
						
							|  |  |  |     static const float m_defaultAudioInputVolume; | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     static const QString m_defaultUDPAddress; | 
					
						
							|  |  |  |     static const quint16 m_defaultUDPPort = 9998; | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |     static const QString m_defaultDeviceName; | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |     QList<QAudioDeviceInfo> m_inputDevicesInfo; | 
					
						
							|  |  |  |     QList<QAudioDeviceInfo> m_outputDevicesInfo; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     QMap<AudioFifo*, int> m_audioSinkFifos; //< audio sink FIFO to audio output device index-1 map
 | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |     QMap<AudioFifo*, MessageQueue*> m_audioFifoToSinkMessageQueues; //!< audio sink FIFO to attached sink message queue
 | 
					
						
							|  |  |  |     QMap<int, QList<MessageQueue*> > m_outputDeviceSinkMessageQueues; //!< sink message queues attached to device
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |     QMap<int, AudioOutput*> m_audioOutputs; //!< audio device index to audio output map (index -1 is default device)
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     QMap<QString, OutputDeviceInfo> m_audioOutputInfos; //!< audio device name to audio output info
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  |     QMap<AudioFifo*, int> m_audioSourceFifos; //< audio source FIFO to audio input device index-1 map
 | 
					
						
							| 
									
										
										
										
											2018-03-26 11:55:45 +02:00
										 |  |  |     QMap<AudioFifo*, MessageQueue*> m_audioFifoToSourceMessageQueues; //!< audio source FIFO to attached source message queue
 | 
					
						
							|  |  |  |     QMap<int, QList<MessageQueue*> > m_inputDeviceSourceMessageQueues; //!< sink message queues attached to device
 | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  |     QMap<int, AudioInput*> m_audioInputs; //!< audio device index to audio input map (index -1 is default device)
 | 
					
						
							|  |  |  |     QMap<QString, InputDeviceInfo> m_audioInputInfos; //!< audio device name to audio input device info
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void resetToDefaults(); | 
					
						
							|  |  |  |     QByteArray serialize() const; | 
					
						
							|  |  |  |     bool deserialize(const QByteArray& data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void startAudioOutput(int outputDeviceIndex); | 
					
						
							|  |  |  |     void stopAudioOutput(int outputDeviceIndex); | 
					
						
							|  |  |  |     void startAudioInput(int inputDeviceIndex); | 
					
						
							|  |  |  |     void stopAudioInput(int inputDeviceIndex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void serializeInputMap(QByteArray& data) const; | 
					
						
							|  |  |  |     void deserializeInputMap(QByteArray& data); | 
					
						
							|  |  |  |     void debugAudioInputInfos() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void serializeOutputMap(QByteArray& data) const; | 
					
						
							|  |  |  |     void deserializeOutputMap(QByteArray& data); | 
					
						
							|  |  |  |     void debugAudioOutputInfos() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	friend class MainSettings; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::InputDeviceInfo& info); | 
					
						
							| 
									
										
										
										
											2018-03-25 11:50:34 +02:00
										 |  |  | QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::InputDeviceInfo& info); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QDataStream& operator<<(QDataStream& ds, const AudioDeviceManager::OutputDeviceInfo& info); | 
					
						
							|  |  |  | QDataStream& operator>>(QDataStream& ds, AudioDeviceManager::OutputDeviceInfo& info); | 
					
						
							| 
									
										
										
										
											2018-03-25 04:22:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif // INCLUDE_AUDIODEVICEMANGER_H
 |