src/platform/qt/AudioProcessorQt.cpp (view raw)
1/* Copyright (c) 2013-2015 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "AudioProcessorQt.h"
7
8#include "AudioDevice.h"
9#include "LogController.h"
10
11#include <QAudioOutput>
12
13#include <mgba/core/core.h>
14#include <mgba/core/thread.h>
15
16using namespace QGBA;
17
18AudioProcessorQt::AudioProcessorQt(QObject* parent)
19 : AudioProcessor(parent)
20{
21}
22
23void AudioProcessorQt::setInput(std::shared_ptr<CoreController> controller) {
24 AudioProcessor::setInput(controller);
25 if (m_device) {
26 m_device->setInput(input());
27 if (m_audioOutput) {
28 m_device->setFormat(m_audioOutput->format());
29 }
30 }
31}
32
33void AudioProcessorQt::stop() {
34 if (m_device) {
35 m_device.reset();
36 }
37 pause();
38 AudioProcessor::stop();
39}
40
41bool AudioProcessorQt::start() {
42 if (!input()) {
43 LOG(QT, WARN) << tr("Can't start an audio processor without input");
44 return false;
45 }
46
47 if (!m_device) {
48 m_device = std::make_unique<AudioDevice>(this);
49 }
50
51 if (!m_audioOutput) {
52 QAudioFormat format;
53 format.setSampleRate(m_sampleRate);
54 format.setChannelCount(2);
55 format.setSampleSize(16);
56 format.setCodec("audio/pcm");
57 format.setByteOrder(QAudioFormat::Endian(QSysInfo::ByteOrder));
58 format.setSampleType(QAudioFormat::SignedInt);
59
60 m_audioOutput = new QAudioOutput(format, this);
61 m_audioOutput->setCategory("game");
62 }
63
64 m_device->setInput(input());
65 m_device->setFormat(m_audioOutput->format());
66
67 m_audioOutput->start(m_device.get());
68 return m_audioOutput->state() == QAudio::ActiveState;
69}
70
71void AudioProcessorQt::pause() {
72 if (m_audioOutput) {
73 m_audioOutput->stop();
74 }
75}
76
77void AudioProcessorQt::setBufferSamples(int) {
78}
79
80void AudioProcessorQt::inputParametersChanged() {
81 if (m_device) {
82 m_device->setFormat(m_audioOutput->format());
83 }
84}
85
86void AudioProcessorQt::requestSampleRate(unsigned rate) {
87 m_sampleRate = rate;
88 if (m_device) {
89 QAudioFormat format(m_audioOutput->format());
90 format.setSampleRate(rate);
91 m_device->setFormat(format);
92 }
93}
94
95unsigned AudioProcessorQt::sampleRate() const {
96 if (!m_audioOutput) {
97 return 0;
98 }
99 return m_audioOutput->format().sampleRate();
100}