Multiple audio support: transfer start/stop audio to audio FIFO management in AudioDeviceManager

This commit is contained in:
f4exb 2018-03-24 04:18:58 +01:00
parent 937bc19375
commit 5b7cbdf0e5
27 changed files with 30 additions and 147 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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()

View File

@ -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;
};

View File

@ -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);
}

View File

@ -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;

View File

@ -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; }

View File

@ -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);