mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-04-10 13:40:37 -04:00
Multiple audio support: transfer start/stop audio to audio FIFO management in AudioDeviceManager
This commit is contained in:
parent
937bc19375
commit
5b7cbdf0e5
@ -271,13 +271,11 @@ bool BladerfOutput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initGeneration())
|
||||
{
|
||||
m_deviceAPI->startGeneration();
|
||||
DSPEngine::instance()->startAudioInput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopGeneration();
|
||||
DSPEngine::instance()->stopAudioInput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -213,13 +213,11 @@ bool FileSinkOutput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initGeneration())
|
||||
{
|
||||
m_deviceAPI->startGeneration();
|
||||
DSPEngine::instance()->startAudioInput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopGeneration();
|
||||
DSPEngine::instance()->stopAudioInput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -257,13 +257,11 @@ bool HackRFOutput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initGeneration())
|
||||
{
|
||||
m_deviceAPI->startGeneration();
|
||||
DSPEngine::instance()->startAudioInput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopGeneration();
|
||||
DSPEngine::instance()->stopAudioInput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -515,13 +515,11 @@ bool LimeSDROutput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initGeneration())
|
||||
{
|
||||
m_deviceAPI->startGeneration();
|
||||
DSPEngine::instance()->startAudioInput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopGeneration();
|
||||
DSPEngine::instance()->stopAudioInput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -201,13 +201,11 @@ bool PlutoSDROutput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initGeneration())
|
||||
{
|
||||
m_deviceAPI->startGeneration();
|
||||
DSPEngine::instance()->startAudioInput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopGeneration();
|
||||
DSPEngine::instance()->stopAudioInput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -201,13 +201,11 @@ bool SDRdaemonSinkOutput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initGeneration())
|
||||
{
|
||||
m_deviceAPI->startGeneration();
|
||||
DSPEngine::instance()->startAudioInput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopGeneration();
|
||||
DSPEngine::instance()->stopAudioInput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -292,13 +292,11 @@ bool AirspyInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -310,13 +310,11 @@ bool AirspyHFInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -288,13 +288,11 @@ bool AirspyHFIInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -297,13 +297,11 @@ bool BladerfInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -234,13 +234,11 @@ bool FCDProInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -228,13 +228,11 @@ bool FCDProPlusInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -316,13 +316,11 @@ bool FileSourceInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -278,13 +278,11 @@ bool HackRFInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -707,13 +707,11 @@ bool LimeSDRInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -180,13 +180,11 @@ bool PerseusInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -210,13 +210,11 @@ bool PlutoSDRInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -324,13 +324,11 @@ bool RTLSDRInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -205,13 +205,11 @@ bool SDRdaemonSourceInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -320,13 +320,11 @@ bool SDRPlayInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -197,13 +197,11 @@ bool TestSourceInput::handleMessage(const Message& message)
|
||||
if (m_deviceAPI->initAcquisition())
|
||||
{
|
||||
m_deviceAPI->startAcquisition();
|
||||
DSPEngine::instance()->startAudioOutput();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_deviceAPI->stopAcquisition();
|
||||
DSPEngine::instance()->stopAudioOutput();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -88,25 +88,45 @@ void AudioDeviceManager::setInputVolume(float inputVolume)
|
||||
void AudioDeviceManager::addAudioSink(AudioFifo* audioFifo)
|
||||
{
|
||||
qDebug("AudioDeviceInfo::addAudioSink");
|
||||
|
||||
if (m_audioOutput.getNbFifos() == 0) {
|
||||
startAudioOutput();
|
||||
}
|
||||
|
||||
m_audioOutput.addFifo(audioFifo);
|
||||
}
|
||||
|
||||
void AudioDeviceManager::removeAudioSink(AudioFifo* audioFifo)
|
||||
{
|
||||
qDebug("AudioDeviceInfo::removeAudioSink");
|
||||
|
||||
m_audioOutput.removeFifo(audioFifo);
|
||||
|
||||
if (m_audioOutput.getNbFifos() == 0) {
|
||||
stopAudioOutput();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioDeviceManager::addAudioSource(AudioFifo* audioFifo)
|
||||
{
|
||||
qDebug("AudioDeviceInfo::addAudioSource");
|
||||
|
||||
if (m_audioInput.getNbFifos() == 0) {
|
||||
startAudioInput();
|
||||
}
|
||||
|
||||
m_audioInput.addFifo(audioFifo);
|
||||
}
|
||||
|
||||
void AudioDeviceManager::removeAudioSource(AudioFifo* audioFifo)
|
||||
{
|
||||
qDebug("AudioDeviceInfo::removeAudioSource");
|
||||
|
||||
m_audioInput.removeFifo(audioFifo);
|
||||
|
||||
if (m_audioInput.getNbFifos() == 0) {
|
||||
stopAudioInput();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioDeviceManager::startAudioOutput()
|
||||
|
@ -51,11 +51,6 @@ public:
|
||||
void addAudioSource(AudioFifo* audioFifo); //!< Add an audio source
|
||||
void removeAudioSource(AudioFifo* audioFifo); //!< Remove an audio source
|
||||
|
||||
void startAudioOutput();
|
||||
void stopAudioOutput();
|
||||
|
||||
void startAudioInput();
|
||||
void stopAudioInput();
|
||||
void setAudioInputVolume(float volume) { m_audioInput.setVolume(volume); }
|
||||
|
||||
private:
|
||||
@ -73,6 +68,11 @@ private:
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
|
||||
void startAudioOutput();
|
||||
void stopAudioOutput();
|
||||
void startAudioInput();
|
||||
void stopAudioInput();
|
||||
|
||||
friend class AudioDialog;
|
||||
friend class MainSettings;
|
||||
};
|
||||
|
@ -37,7 +37,7 @@ AudioInput::~AudioInput()
|
||||
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
|
||||
for (AudioFifos::iterator it = m_audioFifos.begin(); it != m_audioFifos.end(); ++it)
|
||||
for (std::list<AudioFifo*>::iterator it = m_audioFifos.begin(); it != m_audioFifos.end(); ++it)
|
||||
{
|
||||
delete *it;
|
||||
}
|
||||
@ -116,79 +116,6 @@ bool AudioInput::start(int device, int rate)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AudioInput::startImmediate(int device, int rate)
|
||||
{
|
||||
|
||||
if (QIODevice::isOpen())
|
||||
{
|
||||
qInfo("AudioInput::startImmediate: already started");
|
||||
return true;
|
||||
}
|
||||
|
||||
QAudioDeviceInfo devInfo;
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
|
||||
if (device < 0)
|
||||
{
|
||||
devInfo = QAudioDeviceInfo::defaultInputDevice();
|
||||
qWarning("AudioInput::startImmediate: using default device %s", qPrintable(devInfo.defaultInputDevice().deviceName()));
|
||||
}
|
||||
else
|
||||
{
|
||||
QList<QAudioDeviceInfo> devicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
|
||||
|
||||
if (device < devicesInfo.size())
|
||||
{
|
||||
devInfo = devicesInfo[device];
|
||||
qWarning("AudioInput::startImmediate: using audio device #%d: %s", device, qPrintable(devInfo.defaultInputDevice().deviceName()));
|
||||
}
|
||||
else
|
||||
{
|
||||
devInfo = QAudioDeviceInfo::defaultInputDevice();
|
||||
qWarning("AudioInput::startImmediate: audio device #%d does not exist. Using default device %s", device, qPrintable(devInfo.defaultInputDevice().deviceName()));
|
||||
}
|
||||
}
|
||||
|
||||
//QAudioDeviceInfo devInfo(QAudioDeviceInfo::defaultOutputDevice());
|
||||
|
||||
m_audioFormat.setSampleRate(rate);
|
||||
m_audioFormat.setChannelCount(2);
|
||||
m_audioFormat.setSampleSize(16);
|
||||
m_audioFormat.setCodec("audio/pcm");
|
||||
m_audioFormat.setByteOrder(QAudioFormat::LittleEndian);
|
||||
m_audioFormat.setSampleType(QAudioFormat::SignedInt);
|
||||
|
||||
if (!devInfo.isFormatSupported(m_audioFormat))
|
||||
{
|
||||
m_audioFormat = devInfo.nearestFormat(m_audioFormat);
|
||||
qWarning("AudioInput::startImmediate: %d Hz S16_LE audio format not supported. New rate: %d", rate, m_audioFormat.sampleRate());
|
||||
}
|
||||
else
|
||||
{
|
||||
qInfo("AudioInput::startImmediate: audio format OK");
|
||||
}
|
||||
|
||||
if (m_audioFormat.sampleSize() != 16)
|
||||
{
|
||||
qWarning("AudioInput::startImmediate: Audio device ( %s ) failed", qPrintable(devInfo.defaultInputDevice().deviceName()));
|
||||
return false;
|
||||
}
|
||||
|
||||
m_audioInput = new QAudioInput(devInfo, m_audioFormat);
|
||||
m_audioInput->setVolume(m_volume);
|
||||
|
||||
QIODevice::open(QIODevice::ReadWrite);
|
||||
|
||||
m_audioInput->start(this);
|
||||
|
||||
if (m_audioInput->state() != QAudio::ActiveState)
|
||||
{
|
||||
qWarning("AudioInput::startImmediate: cannot start");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void AudioInput::stop()
|
||||
{
|
||||
qDebug("AudioInput::stop");
|
||||
@ -210,21 +137,6 @@ void AudioInput::stop()
|
||||
}
|
||||
}
|
||||
|
||||
void AudioInput::stopImmediate()
|
||||
{
|
||||
if (!QIODevice::isOpen())
|
||||
{
|
||||
qInfo("AudioInput::stopImmediate: already stopped");
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug("AudioInput::stopImmediate");
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
QIODevice::close();
|
||||
delete m_audioInput;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioInput::addFifo(AudioFifo* audioFifo)
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
@ -267,7 +179,7 @@ qint64 AudioInput::writeData(const char *data, qint64 len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (AudioFifos::iterator it = m_audioFifos.begin(); it != m_audioFifos.end(); ++it)
|
||||
for (std::list<AudioFifo*>::iterator it = m_audioFifos.begin(); it != m_audioFifos.end(); ++it)
|
||||
{
|
||||
(*it)->write(reinterpret_cast<const quint8*>(data), len/4, 10);
|
||||
}
|
||||
|
@ -37,11 +37,9 @@ public:
|
||||
bool start(int device, int rate);
|
||||
void stop();
|
||||
|
||||
bool startImmediate(int device, int rate);
|
||||
void stopImmediate();
|
||||
|
||||
void addFifo(AudioFifo* audioFifo);
|
||||
void removeFifo(AudioFifo* audioFifo);
|
||||
int getNbFifos() const { return m_audioFifos.size(); }
|
||||
|
||||
uint getRate() const { return m_audioFormat.sampleRate(); }
|
||||
void setOnExit(bool onExit) { m_onExit = onExit; }
|
||||
@ -54,8 +52,7 @@ private:
|
||||
bool m_onExit;
|
||||
float m_volume;
|
||||
|
||||
typedef std::list<AudioFifo*> AudioFifos;
|
||||
AudioFifos m_audioFifos;
|
||||
std::list<AudioFifo*> m_audioFifos;
|
||||
std::vector<qint32> m_mixBuffer;
|
||||
|
||||
QAudioFormat m_audioFormat;
|
||||
|
@ -39,6 +39,7 @@ public:
|
||||
|
||||
void addFifo(AudioFifo* audioFifo);
|
||||
void removeFifo(AudioFifo* audioFifo);
|
||||
int getNbFifos() const { return m_audioFifos.size(); }
|
||||
|
||||
uint getRate() const { return m_audioFormat.sampleRate(); }
|
||||
void setOnExit(bool onExit) { m_onExit = onExit; }
|
||||
|
@ -50,11 +50,6 @@ public:
|
||||
void removeLastDeviceSinkEngine();
|
||||
|
||||
AudioDeviceManager *getAudioDeviceManager() { return &m_audioDeviceManager; }
|
||||
void startAudioOutput() { m_audioDeviceManager.startAudioOutput(); }
|
||||
void stopAudioOutput() { m_audioDeviceManager.stopAudioOutput(); }
|
||||
|
||||
void startAudioInput() { m_audioDeviceManager.startAudioInput(); }
|
||||
void stopAudioInput() {m_audioDeviceManager.stopAudioInput(); }
|
||||
|
||||
DSPDeviceSourceEngine *getDeviceSourceEngineByIndex(uint deviceIndex) { return m_deviceSourceEngines[deviceIndex]; }
|
||||
DSPDeviceSourceEngine *getDeviceSourceEngineByUID(uint uid);
|
||||
|
Loading…
Reference in New Issue
Block a user