Skip to content

Commit

Permalink
Add audio viz
Browse files Browse the repository at this point in the history
  • Loading branch information
Nax committed Sep 26, 2019
1 parent a95e0d6 commit e76d718
Show file tree
Hide file tree
Showing 8 changed files with 167 additions and 11 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Expand Up @@ -5,7 +5,7 @@ option(SUPERBUILD "Build this project using a superbuild" ON)

set(VERSION_MAJOR 0)
set(VERSION_MINOR 4)
set(VERSION_PATCH 0)
set(VERSION_PATCH 1)
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")

if (SUPERBUILD)
Expand Down
50 changes: 50 additions & 0 deletions src/nin/AudioVisualizer.cpp
@@ -0,0 +1,50 @@
#include "AudioVisualizer.h"

AudioVisualizer::AudioVisualizer(QWidget* parent)
: QOpenGLWidget(parent)
{
memset(_samples, 0, 1024 * 2);
setMinimumSize(512, 64);
}

void AudioVisualizer::initializeGL()
{

}

void AudioVisualizer::paintGL()
{
float x;
float sample;

glClearColor(0.f, 0.f, 1.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glColor3f(1.f, 1.f, 0.f);
glBegin(GL_LINE_STRIP);
{
std::unique_lock lock(_mutex);

for (int i = 0; i < 1024; ++i)
{
x = ((float)i) / 512.f - 1.f;
sample = ((float)_samples[i]) / 32768.f;
glVertex2f(x, sample);
}
}
glEnd();
}

void AudioVisualizer::resizeGL(int w, int h)
{
(void)w;
(void)h;
glViewport(-1, -1, 1, 1);
}

void AudioVisualizer::pushSamples(const int16_t* samples)
{
std::unique_lock lock(_mutex);

memcpy(_samples, samples, 2048);
}
27 changes: 27 additions & 0 deletions src/nin/AudioVisualizer.h
@@ -0,0 +1,27 @@
#ifndef AUDIO_VISUALIZER_H
#define AUDIO_VISUALIZER_H

#include <mutex>
#include <cstdint>
#include <QWidget>
#include <QOpenGLWidget>

class AudioVisualizer : public QOpenGLWidget
{
Q_OBJECT;

public:
explicit AudioVisualizer(QWidget* parent = nullptr);

virtual void initializeGL() override;
virtual void paintGL() override;
virtual void resizeGL(int w, int j) override;

void pushSamples(const int16_t* samples);

private:
std::mutex _mutex;
int16_t _samples[1024];
};

#endif
24 changes: 24 additions & 0 deletions src/nin/AudioVisualizerWindow.cpp
@@ -0,0 +1,24 @@
#include <QVboxLayout>
#include "AudioVisualizerWindow.h"
#include "AudioVisualizer.h"

AudioVisualizerWindow::AudioVisualizerWindow(QWidget* parent)
: QWidget(parent, Qt::Window)
{
QVBoxLayout* layout;

setWindowTitle("Audio Visualizer");

layout = new QVBoxLayout;

_audioVisualizer = new AudioVisualizer;
layout->addWidget(_audioVisualizer);

setLayout(layout);
}

void AudioVisualizerWindow::refresh(const int16_t* samples)
{
_audioVisualizer->pushSamples(samples);
_audioVisualizer->update();
}
25 changes: 25 additions & 0 deletions src/nin/AudioVisualizerWindow.h
@@ -0,0 +1,25 @@
#ifndef AUDIO_VISUALIZER_WINDOW_H
#define AUDIO_VISUALIZER_WINDOW_H

#include <cstdint>
#include <QWidget>

#include <nin/nin.h>
#include "HexView.h"

class AudioVisualizer;
class AudioVisualizerWindow : public QWidget
{
Q_OBJECT;

public:
explicit AudioVisualizerWindow(QWidget* parent = nullptr);

public slots:
void refresh(const int16_t* samples);

private:
AudioVisualizer* _audioVisualizer;
};

#endif
3 changes: 2 additions & 1 deletion src/nin/EmulatorWorker.cpp
Expand Up @@ -87,6 +87,7 @@ void EmulatorWorker::pause()
if (_workerState == WorkerState::Running)
{
_workerState = WorkerState::Paused;
emit update(_state);
lock.unlock();
_cv.notify_one();
}
Expand Down Expand Up @@ -170,9 +171,9 @@ void EmulatorWorker::workerUpdate()
if (ninRunCycles(_state, _frameCycles / 4 - cyc, &cyc))
{
emit frame((const char*)ninGetScreenBuffer(_state));
emit update(_state);
}
_cyc = cyc;
emit update(_state);
}

void EmulatorWorker::closeRomRaw()
Expand Down
38 changes: 31 additions & 7 deletions src/nin/MainWindow.cpp
Expand Up @@ -6,6 +6,7 @@
#include "Audio.h"
#include "RenderWidget.h"
#include "MemoryWindow.h"
#include "AudioVisualizerWindow.h"

#define DEADZONE (0.30)

Expand Down Expand Up @@ -107,8 +108,10 @@ void MainWindow::keyReleaseEvent(QKeyEvent* event)

void MainWindow::closeEvent(QCloseEvent* event)
{
if (!_memoryViewer.isNull())
_memoryViewer->close();
if (!_windowMemoryViewer.isNull())
_windowMemoryViewer->close();
if (!_windowAudioVisualizer.isNull())
_windowAudioVisualizer->close();
QMainWindow::closeEvent(event);
}

Expand All @@ -125,20 +128,36 @@ void MainWindow::openRecentFile()
openRom(action->data().toString());
}

void MainWindow::openMemoryViewer()
void MainWindow::openWindowMemoryViewer()
{
MemoryWindow* win;

if (_memoryViewer.isNull())
if (_windowMemoryViewer.isNull())
{
win = new MemoryWindow;
win->setAttribute(Qt::WA_DeleteOnClose);
connect(_emu, SIGNAL(update(NinState*)), win, SLOT(refresh(NinState*)));
win->show();
_memoryViewer = win;
_windowMemoryViewer = win;
}
else
_memoryViewer->activateWindow();
_windowMemoryViewer->activateWindow();
}

void MainWindow::openWindowAudioVisualizer()
{
AudioVisualizerWindow* win;

if (_windowAudioVisualizer.isNull())
{
win = new AudioVisualizerWindow;
win->setAttribute(Qt::WA_DeleteOnClose);
connect(_emu, SIGNAL(audio(const int16_t*)), win, SLOT(refresh(const int16_t*)));
win->show();
_windowAudioVisualizer = win;
}
else
_windowAudioVisualizer->activateWindow();
}

void MainWindow::createActions()
Expand All @@ -165,7 +184,11 @@ void MainWindow::createActions()
connect(_resumeEmulation, &QAction::triggered, _emu, &EmulatorWorker::resume);

_actionMemoryViewer = new QAction(tr("Memory Viewer"), this);
connect(_actionMemoryViewer, &QAction::triggered, this, &MainWindow::openMemoryViewer);
connect(_actionMemoryViewer, &QAction::triggered, this, &MainWindow::openWindowMemoryViewer);

_actionAudioVisualizer = new QAction(tr("Audio Visualizer"), this);
connect(_actionAudioVisualizer, &QAction::triggered, this, &MainWindow::openWindowAudioVisualizer);

}

void MainWindow::createMenus()
Expand All @@ -184,6 +207,7 @@ void MainWindow::createMenus()

_windowMenu = menuBar()->addMenu(tr("&Window"));
_windowMenu->addAction(_actionMemoryViewer);
_windowMenu->addAction(_actionAudioVisualizer);
}

void MainWindow::updateRecentFiles()
Expand Down
9 changes: 7 additions & 2 deletions src/nin/MainWindow.h
Expand Up @@ -13,6 +13,7 @@
class EmulatorWorker;
class Audio;
class MemoryWindow;
class AudioVisualizerWindow;
class MainWindow : public QMainWindow
{
Q_OBJECT;
Expand All @@ -27,7 +28,9 @@ class MainWindow : public QMainWindow
private slots:
void openFile();
void openRecentFile();
void openMemoryViewer();

void openWindowMemoryViewer();
void openWindowAudioVisualizer();

private:
void createActions();
Expand All @@ -44,7 +47,8 @@ private slots:
Audio* _audio;
RenderWidget* _render;

QPointer<MemoryWindow> _memoryViewer;
QPointer<MemoryWindow> _windowMemoryViewer;
QPointer<AudioVisualizerWindow> _windowAudioVisualizer;

QGamepad* _gamepad;

Expand All @@ -54,6 +58,7 @@ private slots:
QAction* _pauseEmulation;
QAction* _resumeEmulation;
QAction* _actionMemoryViewer;
QAction* _actionAudioVisualizer;

QMenu* _fileMenu;
QMenu* _emulationMenu;
Expand Down

0 comments on commit e76d718

Please sign in to comment.