/* Copyright 2020-2021 Brad Parker Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #ifndef NO_SOUND #include #include #endif #include #include "core.h" #include "../common/video.h" void Core::audioSample(int16_t left, int16_t right) { // most cores just use the batch callback instead if(m_isAudioStreamReady && !m_isMuted) { emit Core::instance()->gotAudioSample(left, right); } } size_t Core::audioSampleBatch(const int16_t *data, size_t frames) { if(m_isAudioStreamReady && !m_isMuted) { emit Core::instance()->gotAudioSampleBatch(data, frames); } return frames; } void Core::onAudioStreamReady() { m_isAudioStreamReady = true; } void Core::setPaused(bool on) { std::cout << "set core pause to " << on << std::endl; m_isPaused = on; if(m_isPaused) { m_timer.stop(); }else{ m_timer.start(); } } bool Core::isPaused() const { return m_isPaused; } void Core::setMuted(bool on) { std::cout << "set core mute to " << on << std::endl; m_isMuted = on; } bool Core::isMuted() const { return m_isMuted; } void Core::setupAudio() { #ifdef NO_SOUND std::cout << "audio support not compiled in, no sound will play." << std::endl; #else bool audio = true; struct retro_system_av_info *avInfo = VideoState::instance()->avInfo(); // cores only support S16LE raw audio with 2 channels QAudioFormat audioFormat; // We're assuming our QAudioOutput's backend natively supports the core's sample rate, but this may not always be the case. // If it is not supported and/or your audio output mechanism cannot resample accordingly, you may need to implement this yourself (RetroArch does) audioFormat.setSampleRate(avInfo->timing.sample_rate); audioFormat.setChannelCount(2); audioFormat.setSampleSize(16); audioFormat.setCodec("audio/pcm"); audioFormat.setByteOrder(QAudioFormat::LittleEndian); audioFormat.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if(!info.isFormatSupported(audioFormat)) { std::cerr << "Core's audio format (S16LE stereo @ " << avInfo->timing.sample_rate << "Hz) not supported by backend, cannot play audio." << std::endl; audio = false; } if(audio) { emit audioReady(&audioFormat); } #endif }