all repos — mgba @ d5b8fdf81cff2e1cc2dc2836926aa9919ce3146e

mGBA Game Boy Advance Emulator

src/platform/qt/AudioDevice.cpp (view raw)

 1#include "AudioDevice.h"
 2
 3extern "C" {
 4#include "gba.h"
 5#include "gba-audio.h"
 6#include "gba-thread.h"
 7}
 8
 9using namespace QGBA;
10
11AudioDevice::AudioDevice(QObject* parent)
12	: QIODevice(parent)
13	, m_context(nullptr)
14	, m_drift(0)
15{
16	setOpenMode(ReadOnly);
17}
18
19void AudioDevice::setFormat(const QAudioFormat& format) {
20	if (!GBAThreadHasStarted(m_context)) {
21		return;
22	}
23	GBAThreadInterrupt(m_context);
24	m_ratio = GBAAudioCalculateRatio(&m_context->gba->audio, m_context->fpsTarget, format.sampleRate());
25	GBAThreadContinue(m_context);
26}
27
28void AudioDevice::setInput(GBAThread* input) {
29	m_context = input;
30}
31
32qint64 AudioDevice::readData(char* data, qint64 maxSize) {
33	if (maxSize > 0xFFFFFFFF) {
34		maxSize = 0xFFFFFFFF;
35	}
36
37	if (!m_context->gba) {
38		return 0;
39	}
40
41	return GBAAudioResampleNN(&m_context->gba->audio, m_ratio, &m_drift, reinterpret_cast<GBAStereoSample*>(data), maxSize / sizeof(GBAStereoSample)) * sizeof(GBAStereoSample);
42}
43
44qint64 AudioDevice::writeData(const char*, qint64) {
45	return 0;
46}