diff options
| author | bunnei <bunneidev@gmail.com> | 2018-01-24 23:09:03 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-24 23:09:03 -0500 |
| commit | 748c0de539674dc8ca4a5a8aadd2a61b0eabe652 (patch) | |
| tree | ae56efe8654d3aa3a5e75ec04bd9dfdcc06023a9 /src/core/hle/service/audio | |
| parent | 44eb8402322a47a52f0401f9ef7473bea719e2bf (diff) | |
| parent | de177f66926a5170c1ad0621085494d27de8e2d4 (diff) | |
Merge pull request #137 from bunnei/improve-ipc
Improve IPC, unify Domains and Sessions, and add validation
Diffstat (limited to 'src/core/hle/service/audio')
| -rw-r--r-- | src/core/hle/service/audio/audout_u.cpp | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index df04d636e..f56ba2ea1 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp @@ -23,7 +23,7 @@ constexpr u64 audio_ticks{static_cast<u64>(BASE_CLOCK_RATE / 500)}; class IAudioOut final : public ServiceFramework<IAudioOut> { public: - IAudioOut() : ServiceFramework("IAudioOut"), audio_out_state(Stopped) { + IAudioOut() : ServiceFramework("IAudioOut"), audio_out_state(AudioState::Stopped) { static const FunctionInfo functions[] = { {0x0, nullptr, "GetAudioOutState"}, {0x1, &IAudioOut::StartAudioOut, "StartAudioOut"}, @@ -58,29 +58,29 @@ private: void StartAudioOut(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); - // start audio - audio_out_state = Started; + // Start audio + audio_out_state = AudioState::Started; - IPC::RequestBuilder rb{ctx, 2}; + IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); } void StopAudioOut(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); - // stop audio - audio_out_state = Stopped; + // Stop audio + audio_out_state = AudioState::Stopped; queue_keys.clear(); - IPC::RequestBuilder rb{ctx, 2}; + IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); } void RegisterBufferEvent(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); - IPC::RequestBuilder rb{ctx, 2, 1}; + IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(RESULT_SUCCESS); rb.PushCopyObjects(buffer_event); } @@ -89,11 +89,10 @@ private: LOG_WARNING(Service_Audio, "(STUBBED) called"); IPC::RequestParser rp{ctx}; - u64 key = rp.Pop<u64>(); - + const u64 key{rp.Pop<u64>()}; queue_keys.insert(queue_keys.begin(), key); - IPC::RequestBuilder rb{ctx, 2}; + IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); } @@ -102,11 +101,10 @@ private: const auto& buffer = ctx.BufferDescriptorB()[0]; - // TODO(st4rk): this is how libtransistor currently implements the - // GetReleasedAudioOutBuffer, it should return the key (a VAddr) to the APP and this address + // TODO(st4rk): This is how libtransistor currently implements the + // GetReleasedAudioOutBuffer, it should return the key (a VAddr) to the app and this address // is used to know which buffer should be filled with data and send again to the service // through AppendAudioOutBuffer. Check if this is the proper way to do it. - u64 key{0}; if (queue_keys.size()) { @@ -116,7 +114,7 @@ private: Memory::WriteBlock(buffer.Address(), &key, sizeof(u64)); - IPC::RequestBuilder rb{ctx, 3}; + IPC::ResponseBuilder rb{ctx, 3}; rb.Push(RESULT_SUCCESS); // TODO(st4rk): This might be the total of released buffers, needs to be verified on // hardware @@ -124,8 +122,7 @@ private: } void UpdateAudioBuffersCallback() { - - if (audio_out_state != Started) { + if (audio_out_state != AudioState::Started) { return; } @@ -136,7 +133,7 @@ private: buffer_event->Signal(); } - enum AudioState : u32 { + enum class AudioState : u32 { Started, Stopped, }; @@ -148,10 +145,10 @@ private: /// This is the evend handle used to check if the audio buffer was released Kernel::SharedPtr<Kernel::Event> buffer_event; - /// (st4rk): this is just a temporary workaround for the future implementation. Libtransistor + /// (st4rk): This is just a temporary workaround for the future implementation. Libtransistor /// uses the key as an address in the App, so we need to return when the /// GetReleasedAudioOutBuffer_1 is called, otherwise we'll run in problems, because - /// libtransistor uses the key returned as an pointer; + /// libtransistor uses the key returned as an pointer. std::vector<u64> queue_keys; AudioState audio_out_state; @@ -166,14 +163,12 @@ void AudOutU::ListAudioOuts(Kernel::HLERequestContext& ctx) { Memory::WriteBlock(buffer.Address(), &audio_interface[0], audio_interface.size()); - IPC::RequestBuilder rb = rp.MakeBuilder(3, 0, 0, 0); + IPC::ResponseBuilder rb = rp.MakeBuilder(3, 0, 0); rb.Push(RESULT_SUCCESS); - // TODO(st4rk): we're currently returning only one audio interface - // (stringlist size) - // however, it's highly possible to have more than one interface (despite that - // libtransistor - // requires only one). + // TODO(st4rk): We're currently returning only one audio interface (stringlist size). However, + // it's highly possible to have more than one interface (despite that libtransistor requires + // only one). rb.Push<u32>(1); } @@ -184,20 +179,13 @@ void AudOutU::OpenAudioOut(Kernel::HLERequestContext& ctx) { audio_out_interface = std::make_shared<IAudioOut>(); } - auto sessions = Kernel::ServerSession::CreateSessionPair(audio_out_interface->GetServiceName()); - auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); - auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); - audio_out_interface->ClientConnected(server); - LOG_DEBUG(Service, "called, initialized IAudioOut -> session=%u", client->GetObjectId()); - IPC::RequestBuilder rb{ctx, 6, 0, 1}; - + IPC::ResponseBuilder rb{ctx, 6, 0, 1}; rb.Push(RESULT_SUCCESS); rb.Push<u32>(sample_rate); rb.Push<u32>(audio_channels); rb.Push<u32>(static_cast<u32>(PcmFormat::Int16)); - // this field is unknown - rb.Push<u32>(0); - rb.PushMoveObjects(std::move(client)); + rb.Push<u32>(0); // This field is unknown + rb.PushIpcInterface<Audio::IAudioOut>(audio_out_interface); } AudOutU::AudOutU() : ServiceFramework("audout:u") { |
