switch from qtMedia to rtAudio

This commit is contained in:
2025-12-22 20:47:39 -06:00
parent 783330990e
commit 73e77b6dc4
7 changed files with 29 additions and 76 deletions

View File

@@ -1,27 +1,28 @@
cmake_minimum_required(VERSION 3.21) cmake_minimum_required(VERSION 3.21)
project(metabolus LANGUAGES CXX) project(metabolus LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia) find_package(Qt6 REQUIRED COMPONENTS Widgets)
find_package(PkgConfig REQUIRED)
pkg_check_modules(RTAUDIO REQUIRED rtaudio)
qt_standard_project_setup() qt_standard_project_setup()
qt_add_executable(metabolus add_executable(metabolus
src/main.cpp src/main.cpp
src/MainWindow.cpp src/MainWindow.cpp
src/MainWindow.h src/MainWindow.h
src/MainWindow.ui src/MainWindow.ui
src/synth/AudioStream.cpp src/synth/AudioEngine.cpp
src/synth/AudioStream.h src/synth/AudioEngine.h
src/synth/Synth.cpp src/synth/Synth.cpp
src/synth/Synth.h src/synth/Synth.h
resources/resources.qrc resources/resources.qrc
) )
target_link_libraries(metabolus target_include_directories(metabolus PRIVATE ${RTAUDIO_INCLUDE_DIRS})
PRIVATE target_link_libraries(metabolus PRIVATE Qt6::Widgets ${RTAUDIO_LIBRARIES})
Qt6::Widgets target_compile_options(metabolus PRIVATE ${RTAUDIO_CFLAGS_OTHER})
Qt6::Multimedia
)

View File

@@ -21,11 +21,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
connect(ui->inputValue, &QLineEdit::editingFinished, this, &MainWindow::onValueChanged); connect(ui->inputValue, &QLineEdit::editingFinished, this, &MainWindow::onValueChanged);
// synth business // synth business
synth_ = new Synth(this); audio_ = new AudioEngine();
audioStream_ = new AudioStream(synth_, this); audio_->start();
audioStream_->start();
synth_->audioSink()->start(audioStream_);
} }
@@ -52,7 +49,7 @@ void MainWindow::onSliderValueChanged(int value) {
QSignalBlocker blocker(ui->inputValue); QSignalBlocker blocker(ui->inputValue);
ui->inputValue->setText(QString::number(value)); ui->inputValue->setText(QString::number(value));
synth_->setFrequency(static_cast<float>(value)); audio_->setFrequency(static_cast<float>(value));
} }
// allows only values within the min, max to be set by the text field // allows only values within the min, max to be set by the text field

View File

@@ -3,8 +3,7 @@
#include <QMainWindow> #include <QMainWindow>
#include "synth/Synth.h" #include "synth/AudioEngine.h"
#include "synth/AudioStream.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { namespace Ui {
@@ -42,7 +41,6 @@ private:
void applySliderStep(); void applySliderStep();
void syncValueToUi(int value); void syncValueToUi(int value);
Synth *synth_ = nullptr; AudioEngine* audio_ = nullptr;
AudioStream *audioStream_ = nullptr;
}; };

View File

@@ -1,27 +0,0 @@
#include "AudioStream.h"
#include <iostream>
AudioStream::AudioStream(Synth *synth, QObject *parent) : QIODevice(parent), synth_(synth) {
}
void AudioStream::start() {
// std::cout << "AudioStream::start()" << std::endl;
open(QIODevice::ReadOnly);
}
void AudioStream::stop() {
close();
}
qint64 AudioStream::readData(char *data, qint64 maxlen) {
// std::cout << "sample out " << std::endl;
QByteArray samples = synth_->generateSamples(maxlen);
memcpy(data, samples.constData(), samples.size());
return samples.size();
}

View File

@@ -1,23 +0,0 @@
#pragma once
#include <QIODevice>
#include "Synth.h"
class AudioStream : public QIODevice
{
Q_OBJECT
public:
explicit AudioStream(Synth *synth, QObject *parent = nullptr);
void start();
void stop();
protected:
qint64 readData(char *data, qint64 maxlen) override;
qint64 writeData(const char *, qint64) override { return 0; }
private:
Synth *synth_;
};

View File

@@ -1,4 +1,6 @@
/*
#include "Synth.h" #include "Synth.h"
#include <QMediaDevices> #include <QMediaDevices>
@@ -28,13 +30,12 @@ Synth::~Synth() {
void Synth::start() { void Synth::start() {
/*
// std::cout << "Synth::start()" << std::endl; // std::cout << "Synth::start()" << std::endl;
if (audioSink_->state() == QAudio::ActiveState) // if (audioSink_->state() == QAudio::ActiveState)
return; // return;
audioDevice_ = audioSink_->start(); // audioDevice_ = audioSink_->start();
*/
} }
void Synth::stop() { void Synth::stop() {
@@ -109,4 +110,6 @@ void Synth::applyConfig(const AudioConfig& config) {
audioSink_ = new QAudioSink(device, format_, this); audioSink_ = new QAudioSink(device, format_, this);
audioSink_->setBufferSize(config.bufferSize); audioSink_->setBufferSize(config.bufferSize);
} }
*/

View File

@@ -1,6 +1,8 @@
#pragma once #pragma once
/*
#include <QObject> #include <QObject>
#include <QAudioFormat> #include <QAudioFormat>
#include <QAudioSink> #include <QAudioSink>
@@ -45,4 +47,6 @@ private:
float phase_ = 0.0f; float phase_ = 0.0f;
float freq = 400.0f; float freq = 400.0f;
}; };
*/