diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b6160b3b..4c465bd3 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -52,11 +52,12 @@ add_library(skyline SHARED ${source_DIR}/skyline/services/serviceman.cpp ${source_DIR}/skyline/services/sm/IUserInterface.cpp ${source_DIR}/skyline/services/fatalsrv/IService.cpp - ${source_DIR}/skyline/services/audout/audout.cpp - ${source_DIR}/skyline/services/audren/IAudioRendererManager.cpp - ${source_DIR}/skyline/services/audren/IAudioRenderer.cpp - ${source_DIR}/skyline/services/audren/voice.cpp - ${source_DIR}/skyline/services/audren/memoryPool.cpp + ${source_DIR}/skyline/services/audio/IAudioOutManager.cpp + ${source_DIR}/skyline/services/audio/IAudioOut.cpp + ${source_DIR}/skyline/services/audio/IAudioRendererManager.cpp + ${source_DIR}/skyline/services/audio/IAudioRenderer/IAudioRenderer.cpp + ${source_DIR}/skyline/services/audio/IAudioRenderer/voice.cpp + ${source_DIR}/skyline/services/audio/IAudioRenderer/memoryPool.cpp ${source_DIR}/skyline/services/settings/ISystemSettingsServer.cpp ${source_DIR}/skyline/services/apm/apm.cpp ${source_DIR}/skyline/services/am/applet.cpp diff --git a/app/src/main/cpp/skyline/audio.cpp b/app/src/main/cpp/skyline/audio.cpp index ee451f0c..7df34f60 100644 --- a/app/src/main/cpp/skyline/audio.cpp +++ b/app/src/main/cpp/skyline/audio.cpp @@ -13,7 +13,11 @@ namespace skyline::audio { outputStream->requestStart(); } - std::shared_ptr Audio::OpenTrack(int channelCount, int sampleRate, const std::function &releaseCallback) { + Audio::~Audio() { + outputStream->close(); + } + + std::shared_ptr Audio::OpenTrack(const int channelCount, const int sampleRate, const std::function &releaseCallback) { std::shared_ptr track = std::make_shared(channelCount, sampleRate, releaseCallback); audioTracks.push_back(track); @@ -27,7 +31,7 @@ namespace skyline::audio { oboe::DataCallbackResult Audio::onAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames) { i16 *destBuffer = static_cast(audioData); - int setIndex = 0; + uint setIndex = 0; size_t sampleI16Size = static_cast(numFrames) * audioStream->getChannelCount(); for (auto &track : audioTracks) { diff --git a/app/src/main/cpp/skyline/audio.h b/app/src/main/cpp/skyline/audio.h index 8b71a9bd..6f7cc3ba 100644 --- a/app/src/main/cpp/skyline/audio.h +++ b/app/src/main/cpp/skyline/audio.h @@ -20,6 +20,11 @@ namespace skyline::audio { public: Audio(const DeviceState &state); + /** + * @brief The destructor for the audio class + */ + ~Audio(); + /** * @brief Opens a new track that can be used to play sound * @param channelCount The amount channels that are present in the track @@ -27,7 +32,7 @@ namespace skyline::audio { * @param releaseCallback The callback to call when a buffer has been released * @return A shared pointer to a new AudioTrack object */ - std::shared_ptr OpenTrack(int channelCount, int sampleRate, const std::function &releaseCallback); + std::shared_ptr OpenTrack(const int channelCount, const int sampleRate, const std::function &releaseCallback); /** * @brief Closes a track and frees its data diff --git a/app/src/main/cpp/skyline/audio/track.cpp b/app/src/main/cpp/skyline/audio/track.cpp index ed55feec..9aaffede 100644 --- a/app/src/main/cpp/skyline/audio/track.cpp +++ b/app/src/main/cpp/skyline/audio/track.cpp @@ -1,7 +1,7 @@ #include "track.h" namespace skyline::audio { - AudioTrack::AudioTrack(int channelCount, int sampleRate, const std::function &releaseCallback) : channelCount(channelCount), sampleRate(sampleRate), releaseCallback(releaseCallback) { + AudioTrack::AudioTrack(const int channelCount, const int sampleRate, const std::function &releaseCallback) : channelCount(channelCount), sampleRate(sampleRate), releaseCallback(releaseCallback) { if (sampleRate != constant::SampleRate) throw exception("Unsupported audio sample rate: {}", sampleRate); diff --git a/app/src/main/cpp/skyline/audio/track.h b/app/src/main/cpp/skyline/audio/track.h index c47a5329..f902cab1 100644 --- a/app/src/main/cpp/skyline/audio/track.h +++ b/app/src/main/cpp/skyline/audio/track.h @@ -15,8 +15,8 @@ namespace skyline::audio { const std::function releaseCallback; //!< Callback called when a buffer has been played std::deque identifierQueue; //!< Queue of all appended buffer identifiers - int channelCount; //!< The amount channels present in the track - int sampleRate; //!< The sample rate of the track + const int channelCount; //!< The amount channels present in the track + const int sampleRate; //!< The sample rate of the track public: std::queue sampleQueue; //!< Queue of all appended buffer data @@ -30,7 +30,7 @@ namespace skyline::audio { * @param sampleRate The sample rate to use for the track * @param releaseCallback A callback to call when a buffer has been played */ - AudioTrack(int channelCount, int sampleRate, const std::function &releaseCallback); + AudioTrack(const int channelCount, const int sampleRate, const std::function &releaseCallback); /** * @brief Starts audio playback using data from appended buffers. diff --git a/app/src/main/cpp/skyline/services/audout/audout.cpp b/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp similarity index 60% rename from app/src/main/cpp/skyline/services/audout/audout.cpp rename to app/src/main/cpp/skyline/services/audio/IAudioOut.cpp index 58739c9f..7e403e76 100644 --- a/app/src/main/cpp/skyline/services/audout/audout.cpp +++ b/app/src/main/cpp/skyline/services/audio/IAudioOut.cpp @@ -1,36 +1,8 @@ -#include "audout.h" #include +#include "IAudioOut.h" -namespace skyline::service::audout { - audoutU::audoutU(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::audout_u, "audout:u", { - {0x0, SFUNC(audoutU::ListAudioOuts)}, - {0x1, SFUNC(audoutU::OpenAudioOut)} - }) {} - - void audoutU::ListAudioOuts(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - state.process->WriteMemory(reinterpret_cast(const_cast(constant::DefaultAudioOutName.data())), - request.outputBuf.at(0).address, constant::DefaultAudioOutName.size()); - } - - void audoutU::OpenAudioOut(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { - u32 sampleRate = request.Pop(); - request.Pop(); // Channel count is stored in the upper half of a u32 - u16 channelCount = request.Pop(); - - state.logger->Debug("audoutU: Opening an IAudioOut with sample rate: {}, channel count: {}", sampleRate, channelCount); - - sampleRate = sampleRate ? sampleRate : audio::constant::SampleRate; - channelCount = channelCount ? channelCount : static_cast(audio::constant::ChannelCount); - manager.RegisterService(std::make_shared(state, manager, channelCount, sampleRate), session, response); - - response.Push(sampleRate); - response.Push(channelCount); - response.Push(0); - response.Push(static_cast(audio::PcmFormat::Int16)); - response.Push(static_cast(audio::AudioOutState::Stopped)); - } - - IAudioOut::IAudioOut(const DeviceState &state, ServiceManager &manager, int channelCount, int sampleRate) : sampleRate(sampleRate), channelCount(channelCount), releaseEvent(std::make_shared(state)), BaseService(state, manager, Service::audout_IAudioOut, "audout:IAudioOut", { +namespace skyline::service::audio { + IAudioOut::IAudioOut(const DeviceState &state, ServiceManager &manager, const int channelCount, const int sampleRate) : sampleRate(sampleRate), channelCount(channelCount), releaseEvent(std::make_shared(state)), BaseService(state, manager, Service::audio_IAudioOut, "audio:IAudioOut", { {0x0, SFUNC(IAudioOut::GetAudioOutState)}, {0x1, SFUNC(IAudioOut::StartAudioOut)}, {0x2, SFUNC(IAudioOut::StopAudioOut)}, @@ -39,7 +11,7 @@ namespace skyline::service::audout { {0x5, SFUNC(IAudioOut::GetReleasedAudioOutBuffer)}, {0x6, SFUNC(IAudioOut::ContainsAudioOutBuffer)} }) { - track = state.audio->OpenTrack(channelCount, audio::constant::SampleRate, [this]() { this->releaseEvent->Signal(); }); + track = state.audio->OpenTrack(channelCount, skyline::audio::constant::SampleRate, [this]() { this->releaseEvent->Signal(); }); } IAudioOut::~IAudioOut() { @@ -74,7 +46,7 @@ namespace skyline::service::audout { tmpSampleBuffer.resize(data.sampleSize / sizeof(i16)); state.process->ReadMemory(tmpSampleBuffer.data(), data.sampleBufferPtr, data.sampleSize); - resampler.ResampleBuffer(tmpSampleBuffer, static_cast(sampleRate) / audio::constant::SampleRate, channelCount); + resampler.ResampleBuffer(tmpSampleBuffer, static_cast(sampleRate) / skyline::audio::constant::SampleRate, channelCount); track->AppendBuffer(tmpSampleBuffer, tag); } diff --git a/app/src/main/cpp/skyline/services/audout/audout.h b/app/src/main/cpp/skyline/services/audio/IAudioOut.h similarity index 65% rename from app/src/main/cpp/skyline/services/audout/audout.h rename to app/src/main/cpp/skyline/services/audio/IAudioOut.h index 2369c0c5..bdcdfc2c 100644 --- a/app/src/main/cpp/skyline/services/audout/audout.h +++ b/app/src/main/cpp/skyline/services/audio/IAudioOut.h @@ -1,53 +1,31 @@ #pragma once -#include