audiomanager: remove audio signalling

This is in preparation for upcoming modifications that we'll be making to the
AudioManager.
This commit is contained in:
itsmattkc
2020-04-21 17:45:39 +10:00
parent baa8df38f6
commit 1d3b9bbf13
8 changed files with 39 additions and 85 deletions
+5 -12
View File
@@ -135,11 +135,12 @@ void AudioManager::SetOutputDevice(const QAudioDeviceInfo &info)
abort();
}
output_manager_.SetOutputDevice(info, format);
if (info.isFormatSupported(format)) {
output_manager_.SetOutputDevice(info, format);
} else {
qWarning() << "Output format not supported by device";
}
}
// Un-comment this to get debug information about what the audio output is doing
//connect(output_.get(), &QAudioOutput::stateChanged, this, &AudioManager::OutputStateChanged);
}
void AudioManager::SetOutputParams(const AudioRenderingParams &params)
@@ -195,10 +196,7 @@ AudioManager::AudioManager() :
{
RefreshDevices();
connect(&output_manager_, &AudioOutputManager::SentSamples, this, &AudioManager::SentSamples);
connect(&output_manager_, &AudioOutputManager::OutputNotified, this, &AudioManager::OutputNotified);
output_manager_.SetEnableSendingSamples(true);
}
AudioManager::~AudioManager()
@@ -258,11 +256,6 @@ void AudioManager::RefreshThreadDone()
emit DeviceListReady();
}
void AudioManager::OutputStateChanged(QAudio::State state)
{
qDebug() << state;
}
AudioRefreshDevicesObject::AudioRefreshDevicesObject()
{
}
-4
View File
@@ -103,8 +103,6 @@ public:
signals:
void DeviceListReady();
void SentSamples(QVector<double> averages);
void OutputNotified();
private:
@@ -132,8 +130,6 @@ private:
private slots:
void RefreshThreadDone();
void OutputStateChanged(QAudio::State state);
};
OLIVE_NAMESPACE_EXIT
+5 -16
View File
@@ -26,8 +26,7 @@
OLIVE_NAMESPACE_ENTER
AudioOutputDeviceProxy::AudioOutputDeviceProxy() :
device_(nullptr),
send_averages_(false)
device_(nullptr)
{
}
@@ -41,7 +40,9 @@ void AudioOutputDeviceProxy::SetDevice(QIODevice *device, int playback_speed)
device_ = device;
if (!device_->isOpen()) {
device_->open(QIODevice::ReadOnly);
if (!device_->open(QIODevice::ReadOnly)) {
qWarning() << "Failed to open sub-device";
}
}
playback_speed_ = playback_speed;
@@ -51,11 +52,6 @@ void AudioOutputDeviceProxy::SetDevice(QIODevice *device, int playback_speed)
}
}
void AudioOutputDeviceProxy::SetSendAverages(bool send)
{
send_averages_ = send;
}
void AudioOutputDeviceProxy::close()
{
QIODevice::close();
@@ -73,8 +69,6 @@ qint64 AudioOutputDeviceProxy::readData(char *data, qint64 maxlen)
qint64 read_count;
if (tempo_processor_.IsOpen()) {
while ((read_count = tempo_processor_.Pull(data, static_cast<int>(maxlen))) == 0) {
@@ -92,11 +86,6 @@ qint64 AudioOutputDeviceProxy::readData(char *data, qint64 maxlen)
read_count = ReverseAwareRead(data, maxlen);
}
// If we read any
if (read_count > 0 && send_averages_) {
emit ProcessedAverages(AudioBufferAverage::ProcessAverages(data, static_cast<int>(read_count), params_.channel_count()));
}
return read_count;
}
@@ -108,7 +97,7 @@ qint64 AudioOutputDeviceProxy::writeData(const char *data, qint64 maxSize)
Q_UNUSED(data)
Q_UNUSED(maxSize)
return -1;
return 0;
}
qint64 AudioOutputDeviceProxy::ReverseAwareRead(char *data, qint64 maxlen)
-7
View File
@@ -38,13 +38,8 @@ public:
void SetDevice(QIODevice* device, int playback_speed);
void SetSendAverages(bool send);
virtual void close() override;
signals:
void ProcessedAverages(QVector<double> averages);
protected:
virtual qint64 readData(char *data, qint64 maxlen) override;
@@ -57,8 +52,6 @@ private:
TempoProcessor tempo_processor_;
bool send_averages_;
AudioRenderingParams params_;
int playback_speed_;
+19 -23
View File
@@ -23,6 +23,8 @@
#include <QDebug>
#include <QtMath>
#include <QFile>
#include "bufferaverage.h"
OLIVE_NAMESPACE_ENTER
@@ -30,15 +32,18 @@ OLIVE_NAMESPACE_ENTER
AudioOutputManager::AudioOutputManager(QObject *parent) :
QObject(parent),
output_(nullptr),
push_device_(nullptr),
enable_sending_samples_(false)
push_device_(nullptr)
{
connect(&device_proxy_, &AudioOutputDeviceProxy::ProcessedAverages, this, &AudioOutputManager::SentSamples);
}
AudioOutputManager::~AudioOutputManager()
{
delete output_;
}
bool AudioOutputManager::OutputIsSet()
{
return (output_.get());
return output_;
}
void AudioOutputManager::Push(const QByteArray& samples)
@@ -107,9 +112,6 @@ void AudioOutputManager::PushMoreSamples()
qint64 write_count = push_device_->write(read_ptr,
pushed_samples_.size() - pushed_sample_index_);
// Emit the samples we just sent
ProcessAverages(read_ptr, static_cast<int>(write_count));
// Increment sample buffer index (faster than shift the bytes up)
pushed_sample_index_ += static_cast<int>(write_count);
@@ -119,13 +121,6 @@ void AudioOutputManager::PushMoreSamples()
}
}
void AudioOutputManager::SetEnableSendingSamples(bool e)
{
enable_sending_samples_ = e;
device_proxy_.SetSendAverages(e);
}
void AudioOutputManager::SetOutputDevice(QAudioDeviceInfo info, QAudioFormat format)
{
// Whatever the output is doing right now, stop it
@@ -135,23 +130,24 @@ void AudioOutputManager::SetOutputDevice(QAudioDeviceInfo info, QAudioFormat for
if (device_proxy_.isOpen()) {
device_proxy_.close();
}
delete output_;
}
// Create a new output device and start it in push mode
output_ = std::unique_ptr<QAudioOutput>(new QAudioOutput(info, format, this));
output_ = new QAudioOutput(info, format, this);
output_->setNotifyInterval(1);
push_device_ = output_->start();
connect(output_.get(), &QAudioOutput::notify, this, &AudioOutputManager::PushMoreSamples);
connect(output_.get(), &QAudioOutput::notify, this, &AudioOutputManager::OutputNotified);
connect(output_, &QAudioOutput::notify, this, &AudioOutputManager::PushMoreSamples);
connect(output_, &QAudioOutput::notify, this, &AudioOutputManager::OutputNotified);
// Un-comment this to get debug information about what the audio output is doing
//connect(output_, &QAudioOutput::stateChanged, this, &AudioOutputManager::OutputStateChanged);
}
void AudioOutputManager::ProcessAverages(const char *data, int length)
void AudioOutputManager::OutputStateChanged(QAudio::State state)
{
if (!enable_sending_samples_ || length == 0) {
return;
}
emit SentSamples(AudioBufferAverage::ProcessAverages(data, length, output_.get()->format().channelCount()));
qDebug() << state << output_->error();
}
OLIVE_NAMESPACE_EXIT
+10 -20
View File
@@ -26,6 +26,7 @@
#include <QBuffer>
#include <QIODevice>
#include <QMutex>
#include <QThread>
#include "outputdeviceproxy.h"
@@ -37,12 +38,9 @@ class AudioOutputManager : public QObject
public:
AudioOutputManager(QObject* parent = nullptr);
bool OutputIsSet();
virtual ~AudioOutputManager() override;
/**
* @brief If enabled, this will emit the SentSamples() signal whenever samples are sent to the output device
*/
void SetEnableSendingSamples(bool e);
bool OutputIsSet();
void SetOutputDevice(QAudioDeviceInfo info, QAudioFormat format);
@@ -60,34 +58,26 @@ public:
void SetParameters(const AudioRenderingParams& params);
signals:
/**
* @brief Signal emitted when samples are sent to the output device
*
* This sends an array of values corresponding to the channel count. Each value is an average of all the samples just
* sent to that channel. Useful for connecting to AudioMonitor.
*
* Can be disabled with SetEnableSendingSamples() to save CPU usage.
*/
void SentSamples(QVector<double> averages);
public slots:
signals:
void OutputNotified();
private:
void ProcessAverages(const char* data, int length);
std::unique_ptr<QAudioOutput> output_;
QAudioOutput* output_;
QIODevice* push_device_;
QByteArray pushed_samples_;
int pushed_sample_index_;
bool enable_sending_samples_;
AudioOutputDeviceProxy device_proxy_;
private slots:
void PushMoreSamples();
void OutputStateChanged(QAudio::State state);
};
OLIVE_NAMESPACE_EXIT
-1
View File
@@ -39,7 +39,6 @@ AudioMonitor::AudioMonitor(QWidget *parent) :
clear_timer_.setInterval(kClearTimerInterval);
clear_timer_.setSingleShot(true);
connect(AudioManager::instance(), &AudioManager::SentSamples, this, &AudioMonitor::SetValues);
connect(&clear_timer_, &QTimer::timeout, this, &AudioMonitor::Clear);
}
-2
View File
@@ -321,8 +321,6 @@ void MainWindow::ProjectOpen(Project *p)
}
panel->set_project(p);
// FIXME Use settings data to create panels and restore state if they exist
}
void MainWindow::ProjectClose(Project *p)