2018-01-15 03:29:11 +01:00
|
|
|
// Copyright 2018 yuzu emulator team
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
2018-07-20 05:04:25 +02:00
|
|
|
#include <array>
|
2018-09-12 03:45:20 +02:00
|
|
|
#include <cstring>
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
#include <vector>
|
2018-08-03 21:30:01 +02:00
|
|
|
|
2018-09-12 03:45:20 +02:00
|
|
|
#include "audio_core/audio_out.h"
|
2018-08-03 21:30:01 +02:00
|
|
|
#include "audio_core/codec.h"
|
2018-09-12 03:45:20 +02:00
|
|
|
#include "common/common_funcs.h"
|
2018-01-15 03:29:11 +01:00
|
|
|
#include "common/logging/log.h"
|
2018-09-12 03:45:20 +02:00
|
|
|
#include "common/swap.h"
|
2018-07-27 04:35:23 +02:00
|
|
|
#include "core/core.h"
|
2018-01-15 03:29:11 +01:00
|
|
|
#include "core/hle/ipc_helpers.h"
|
2018-01-22 04:03:36 +01:00
|
|
|
#include "core/hle/kernel/hle_ipc.h"
|
2018-11-27 00:34:07 +01:00
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
|
#include "core/hle/kernel/readable_event.h"
|
|
|
|
#include "core/hle/kernel/writable_event.h"
|
2018-01-15 03:29:11 +01:00
|
|
|
#include "core/hle/service/audio/audout_u.h"
|
2019-03-05 22:45:22 +01:00
|
|
|
#include "core/hle/service/audio/errors.h"
|
2018-09-12 03:45:20 +02:00
|
|
|
#include "core/memory.h"
|
2018-01-15 03:29:11 +01:00
|
|
|
|
2018-04-20 03:41:44 +02:00
|
|
|
namespace Service::Audio {
|
2018-01-15 03:29:11 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
constexpr std::array<char, 10> DefaultDevice{{"DeviceOut"}};
|
|
|
|
constexpr int DefaultSampleRate{48000};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-09-12 03:45:20 +02:00
|
|
|
struct AudoutParams {
|
|
|
|
s32_le sample_rate;
|
|
|
|
u16_le channel_count;
|
|
|
|
INSERT_PADDING_BYTES(2);
|
|
|
|
};
|
|
|
|
static_assert(sizeof(AudoutParams) == 0x8, "AudoutParams is an invalid size");
|
|
|
|
|
|
|
|
enum class AudioState : u32 {
|
|
|
|
Started,
|
|
|
|
Stopped,
|
|
|
|
};
|
|
|
|
|
2018-01-22 04:03:36 +01:00
|
|
|
class IAudioOut final : public ServiceFramework<IAudioOut> {
|
|
|
|
public:
|
2019-07-19 09:22:57 +02:00
|
|
|
IAudioOut(Core::System& system, AudoutParams audio_params, AudioCore::AudioOut& audio_core,
|
|
|
|
std::string&& device_name, std::string&& unique_name)
|
2018-12-02 05:56:17 +01:00
|
|
|
: ServiceFramework("IAudioOut"), audio_core(audio_core),
|
2019-11-26 22:29:34 +01:00
|
|
|
device_name(std::move(device_name)),
|
|
|
|
audio_params(audio_params), main_memory{system.Memory()} {
|
2019-04-10 20:48:37 +02:00
|
|
|
// clang-format off
|
2018-01-22 04:03:36 +01:00
|
|
|
static const FunctionInfo functions[] = {
|
2018-04-10 17:51:50 +02:00
|
|
|
{0, &IAudioOut::GetAudioOutState, "GetAudioOutState"},
|
|
|
|
{1, &IAudioOut::StartAudioOut, "StartAudioOut"},
|
|
|
|
{2, &IAudioOut::StopAudioOut, "StopAudioOut"},
|
2018-07-12 08:57:31 +02:00
|
|
|
{3, &IAudioOut::AppendAudioOutBufferImpl, "AppendAudioOutBuffer"},
|
2018-04-10 17:51:50 +02:00
|
|
|
{4, &IAudioOut::RegisterBufferEvent, "RegisterBufferEvent"},
|
2018-07-12 08:57:31 +02:00
|
|
|
{5, &IAudioOut::GetReleasedAudioOutBufferImpl, "GetReleasedAudioOutBuffer"},
|
2018-07-27 04:35:23 +02:00
|
|
|
{6, &IAudioOut::ContainsAudioOutBuffer, "ContainsAudioOutBuffer"},
|
2018-07-12 08:57:31 +02:00
|
|
|
{7, &IAudioOut::AppendAudioOutBufferImpl, "AppendAudioOutBufferAuto"},
|
|
|
|
{8, &IAudioOut::GetReleasedAudioOutBufferImpl, "GetReleasedAudioOutBufferAuto"},
|
2018-07-27 04:35:23 +02:00
|
|
|
{9, &IAudioOut::GetAudioOutBufferCount, "GetAudioOutBufferCount"},
|
2018-04-10 17:51:50 +02:00
|
|
|
{10, nullptr, "GetAudioOutPlayedSampleCount"},
|
|
|
|
{11, nullptr, "FlushAudioOutBuffers"},
|
2019-06-16 11:06:33 +02:00
|
|
|
{12, &IAudioOut::SetAudioOutVolume, "SetAudioOutVolume"},
|
|
|
|
{13, &IAudioOut::GetAudioOutVolume, "GetAudioOutVolume"},
|
2018-01-22 04:03:36 +01:00
|
|
|
};
|
2019-04-10 20:48:37 +02:00
|
|
|
// clang-format on
|
2018-01-22 04:03:36 +01:00
|
|
|
RegisterHandlers(functions);
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
|
|
|
// This is the event handle used to check if the audio buffer was released
|
2019-11-03 10:10:12 +01:00
|
|
|
buffer_event =
|
|
|
|
Kernel::WritableEvent::CreateEventPair(system.Kernel(), "IAudioOutBufferReleased");
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2019-02-14 18:42:58 +01:00
|
|
|
stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate,
|
|
|
|
audio_params.channel_count, std::move(unique_name),
|
2018-11-27 15:18:29 +01:00
|
|
|
[=]() { buffer_event.writable->Signal(); });
|
2018-03-04 16:34:25 +01:00
|
|
|
}
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
|
|
|
private:
|
2018-07-27 04:35:23 +02:00
|
|
|
struct AudioBuffer {
|
|
|
|
u64_le next;
|
|
|
|
u64_le buffer;
|
|
|
|
u64_le buffer_capacity;
|
|
|
|
u64_le buffer_size;
|
|
|
|
u64_le offset;
|
|
|
|
};
|
|
|
|
static_assert(sizeof(AudioBuffer) == 0x28, "AudioBuffer is an invalid size");
|
|
|
|
|
2018-04-03 05:31:29 +02:00
|
|
|
void GetAudioOutState(Kernel::HLERequestContext& ctx) {
|
2018-07-02 18:13:26 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
2018-11-26 07:06:13 +01:00
|
|
|
|
2018-04-03 05:31:29 +02:00
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
rb.Push(RESULT_SUCCESS);
|
2018-07-27 04:35:23 +02:00
|
|
|
rb.Push(static_cast<u32>(stream->IsPlaying() ? AudioState::Started : AudioState::Stopped));
|
2018-04-03 05:31:29 +02:00
|
|
|
}
|
|
|
|
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
void StartAudioOut(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
|
|
|
|
|
|
|
if (stream->IsPlaying()) {
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
2019-03-05 22:45:22 +01:00
|
|
|
rb.Push(ERR_OPERATION_FAILED);
|
2018-07-27 04:35:23 +02:00
|
|
|
return;
|
|
|
|
}
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
audio_core.StartStream(stream);
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-01-24 01:52:18 +01:00
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
void StopAudioOut(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2019-03-07 01:00:16 +01:00
|
|
|
if (stream->IsPlaying()) {
|
|
|
|
audio_core.StopStream(stream);
|
|
|
|
}
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-01-24 01:52:18 +01:00
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RegisterBufferEvent(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-01-24 01:52:18 +01:00
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
2018-11-27 15:18:29 +01:00
|
|
|
rb.PushCopyObjects(buffer_event.readable);
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
}
|
|
|
|
|
2018-07-12 08:57:31 +02:00
|
|
|
void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "(STUBBED) called {}", ctx.Description());
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
const auto& input_buffer{ctx.ReadBuffer()};
|
|
|
|
ASSERT_MSG(input_buffer.size() == sizeof(AudioBuffer),
|
|
|
|
"AudioBuffer input is an invalid size!");
|
|
|
|
AudioBuffer audio_buffer{};
|
|
|
|
std::memcpy(&audio_buffer, input_buffer.data(), sizeof(AudioBuffer));
|
|
|
|
const u64 tag{rp.Pop<u64>()};
|
|
|
|
|
2018-08-04 06:03:12 +02:00
|
|
|
std::vector<s16> samples(audio_buffer.buffer_size / sizeof(s16));
|
2019-11-26 22:29:34 +01:00
|
|
|
main_memory.ReadBlock(audio_buffer.buffer, samples.data(), audio_buffer.buffer_size);
|
2018-07-27 04:35:23 +02:00
|
|
|
|
2018-08-04 06:03:12 +02:00
|
|
|
if (!audio_core.QueueBuffer(stream, tag, std::move(samples))) {
|
2018-07-27 04:35:23 +02:00
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
2019-03-05 22:45:22 +01:00
|
|
|
rb.Push(ERR_BUFFER_COUNT_EXCEEDED);
|
2019-03-05 22:55:53 +01:00
|
|
|
return;
|
2018-07-27 04:35:23 +02:00
|
|
|
}
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-01-24 01:52:18 +01:00
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
2018-07-12 08:57:31 +02:00
|
|
|
void GetReleasedAudioOutBufferImpl(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called {}", ctx.Description());
|
2018-11-26 07:06:13 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
const u64 max_count{ctx.GetWriteBufferSize() / sizeof(u64)};
|
|
|
|
const auto released_buffers{audio_core.GetTagsAndReleaseBuffers(stream, max_count)};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
std::vector<u64> tags{released_buffers};
|
|
|
|
tags.resize(max_count);
|
|
|
|
ctx.WriteBuffer(tags);
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-01-24 01:52:18 +01:00
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
2018-07-27 04:35:23 +02:00
|
|
|
rb.Push<u32>(static_cast<u32>(released_buffers.size()));
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
}
|
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
void ContainsAudioOutBuffer(Kernel::HLERequestContext& ctx) {
|
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
2018-11-26 07:06:13 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
const u64 tag{rp.Pop<u64>()};
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
rb.Push(stream->ContainsBuffer(tag));
|
|
|
|
}
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
void GetAudioOutBufferCount(Kernel::HLERequestContext& ctx) {
|
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
2018-11-26 07:06:13 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
rb.Push(static_cast<u32>(stream->GetQueueSize()));
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
}
|
|
|
|
|
2019-06-16 11:06:33 +02:00
|
|
|
void SetAudioOutVolume(Kernel::HLERequestContext& ctx) {
|
|
|
|
IPC::RequestParser rp{ctx};
|
2019-06-16 12:18:35 +02:00
|
|
|
const float volume = rp.Pop<float>();
|
2019-06-16 11:06:33 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called, volume={}", volume);
|
|
|
|
|
|
|
|
stream->SetVolume(volume);
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
void GetAudioOutVolume(Kernel::HLERequestContext& ctx) {
|
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
rb.Push(RESULT_SUCCESS);
|
2019-06-16 12:18:35 +02:00
|
|
|
rb.Push(stream->GetVolume());
|
2019-06-16 11:06:33 +02:00
|
|
|
}
|
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
AudioCore::AudioOut& audio_core;
|
|
|
|
AudioCore::StreamPtr stream;
|
2018-11-21 20:39:16 +01:00
|
|
|
std::string device_name;
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2019-10-05 01:51:56 +02:00
|
|
|
[[maybe_unused]] AudoutParams audio_params {};
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-11-27 15:18:29 +01:00
|
|
|
/// This is the event handle used to check if the audio buffer was released
|
|
|
|
Kernel::EventPair buffer_event;
|
2019-11-26 22:29:34 +01:00
|
|
|
Memory::Memory& main_memory;
|
2018-01-22 04:03:36 +01:00
|
|
|
};
|
|
|
|
|
2019-07-19 09:22:57 +02:00
|
|
|
AudOutU::AudOutU(Core::System& system_) : ServiceFramework("audout:u"), system{system_} {
|
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = {
|
|
|
|
{0, &AudOutU::ListAudioOutsImpl, "ListAudioOuts"},
|
|
|
|
{1, &AudOutU::OpenAudioOutImpl, "OpenAudioOut"},
|
|
|
|
{2, &AudOutU::ListAudioOutsImpl, "ListAudioOutsAuto"},
|
|
|
|
{3, &AudOutU::OpenAudioOutImpl, "OpenAudioOutAuto"},
|
|
|
|
};
|
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
RegisterHandlers(functions);
|
|
|
|
audio_core = std::make_unique<AudioCore::AudioOut>();
|
|
|
|
}
|
|
|
|
|
|
|
|
AudOutU::~AudOutU() = default;
|
|
|
|
|
2018-07-12 08:57:31 +02:00
|
|
|
void AudOutU::ListAudioOutsImpl(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
2018-11-26 07:06:13 +01:00
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
ctx.WriteBuffer(DefaultDevice);
|
2018-01-22 04:03:36 +01:00
|
|
|
|
2018-09-19 07:09:59 +02:00
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
2018-01-15 03:29:11 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
2018-07-27 04:35:23 +02:00
|
|
|
rb.Push<u32>(1); // Amount of audio devices
|
2018-01-15 03:29:11 +01:00
|
|
|
}
|
|
|
|
|
2018-07-12 08:57:31 +02:00
|
|
|
void AudOutU::OpenAudioOutImpl(Kernel::HLERequestContext& ctx) {
|
2018-07-27 04:35:23 +02:00
|
|
|
LOG_DEBUG(Service_Audio, "called");
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
|
2018-11-21 20:39:16 +01:00
|
|
|
const auto device_name_data{ctx.ReadBuffer()};
|
|
|
|
std::string device_name;
|
|
|
|
if (device_name_data[0] != '\0') {
|
|
|
|
device_name.assign(device_name_data.begin(), device_name_data.end());
|
|
|
|
} else {
|
|
|
|
device_name.assign(DefaultDevice.begin(), DefaultDevice.end());
|
|
|
|
}
|
|
|
|
ctx.WriteBuffer(device_name);
|
|
|
|
|
2018-07-27 04:35:23 +02:00
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
auto params{rp.PopRaw<AudoutParams>()};
|
|
|
|
if (params.channel_count <= 2) {
|
|
|
|
// Mono does not exist for audout
|
|
|
|
params.channel_count = 2;
|
|
|
|
} else {
|
|
|
|
params.channel_count = 6;
|
audout:u OpenAudioOut and IAudioOut (#138)
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* Updated the audout:u and IAudioOut, now it might work with RetroArch without trigger an assert, however it's not the ideal implementation
* audout:u OpenAudioOut implementation and IAudioOut cmd 1,2,3,4,5 implementation
* using an enum for audio_out_state as well as changing its initialize to member initializer list
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* Minor fixes, added Service_Audio for LOG_*, changed PcmFormat enum to EnumClass
* added missing Audio loggin subclass, minor fixes, clang comment breakline
* Solving backend logging conflict
* minor fix
* Fixed duplicated Service NVDRV in backend.cpp, my bad
2018-01-25 04:17:54 +01:00
|
|
|
}
|
2018-07-27 04:35:23 +02:00
|
|
|
if (!params.sample_rate) {
|
|
|
|
params.sample_rate = DefaultSampleRate;
|
|
|
|
}
|
|
|
|
|
2018-11-21 20:39:16 +01:00
|
|
|
std::string unique_name{fmt::format("{}-{}", device_name, audio_out_interfaces.size())};
|
|
|
|
auto audio_out_interface = std::make_shared<IAudioOut>(
|
2019-07-19 09:22:57 +02:00
|
|
|
system, params, *audio_core, std::move(device_name), std::move(unique_name));
|
2018-01-22 21:27:55 +01:00
|
|
|
|
2018-01-24 01:52:18 +01:00
|
|
|
IPC::ResponseBuilder rb{ctx, 6, 0, 1};
|
2018-01-22 21:27:55 +01:00
|
|
|
rb.Push(RESULT_SUCCESS);
|
2018-07-27 04:35:23 +02:00
|
|
|
rb.Push<u32>(DefaultSampleRate);
|
|
|
|
rb.Push<u32>(params.channel_count);
|
2018-08-03 21:30:01 +02:00
|
|
|
rb.Push<u32>(static_cast<u32>(AudioCore::Codec::PcmFormat::Int16));
|
2018-07-27 04:35:23 +02:00
|
|
|
rb.Push<u32>(static_cast<u32>(AudioState::Stopped));
|
2019-07-19 09:22:57 +02:00
|
|
|
rb.PushIpcInterface<IAudioOut>(audio_out_interface);
|
2018-11-21 20:39:16 +01:00
|
|
|
|
|
|
|
audio_out_interfaces.push_back(std::move(audio_out_interface));
|
2018-01-22 21:27:55 +01:00
|
|
|
}
|
|
|
|
|
2018-04-20 03:41:44 +02:00
|
|
|
} // namespace Service::Audio
|