all repos — mgba @ e8383209c52406356e43b41c4c5080318879c22e

mGBA Game Boy Advance Emulator

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 samples) {
 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}