diff options
Diffstat (limited to 'src/audio_core')
21 files changed, 99 insertions, 88 deletions
diff --git a/src/audio_core/audio_in_manager.cpp b/src/audio_core/audio_in_manager.cpp index a3667524f..63b064922 100644 --- a/src/audio_core/audio_in_manager.cpp +++ b/src/audio_core/audio_in_manager.cpp | |||
| @@ -73,16 +73,15 @@ void Manager::BufferReleaseAndRegister() { | |||
| 73 | } | 73 | } |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | u32 Manager::GetDeviceNames(std::vector<Renderer::AudioDevice::AudioDeviceName>& names, | 76 | u32 Manager::GetDeviceNames(std::span<Renderer::AudioDevice::AudioDeviceName> names, |
| 77 | [[maybe_unused]] const u32 max_count, | ||
| 78 | [[maybe_unused]] const bool filter) { | 77 | [[maybe_unused]] const bool filter) { |
| 79 | std::scoped_lock l{mutex}; | 78 | std::scoped_lock l{mutex}; |
| 80 | 79 | ||
| 81 | LinkToManager(); | 80 | LinkToManager(); |
| 82 | 81 | ||
| 83 | auto input_devices{Sink::GetDeviceListForSink(Settings::values.sink_id.GetValue(), true)}; | 82 | auto input_devices{Sink::GetDeviceListForSink(Settings::values.sink_id.GetValue(), true)}; |
| 84 | if (input_devices.size() > 1) { | 83 | if (!input_devices.empty() && !names.empty()) { |
| 85 | names.emplace_back("Uac"); | 84 | names[0] = Renderer::AudioDevice::AudioDeviceName("Uac"); |
| 86 | return 1; | 85 | return 1; |
| 87 | } | 86 | } |
| 88 | return 0; | 87 | return 0; |
diff --git a/src/audio_core/audio_in_manager.h b/src/audio_core/audio_in_manager.h index 5c4614cd1..2179990e0 100644 --- a/src/audio_core/audio_in_manager.h +++ b/src/audio_core/audio_in_manager.h | |||
| @@ -60,13 +60,11 @@ public: | |||
| 60 | * Get a list of audio in device names. | 60 | * Get a list of audio in device names. |
| 61 | * | 61 | * |
| 62 | * @param names - Output container to write names to. | 62 | * @param names - Output container to write names to. |
| 63 | * @param max_count - Maximum number of device names to write. Unused | ||
| 64 | * @param filter - Should the list be filtered? Unused. | 63 | * @param filter - Should the list be filtered? Unused. |
| 65 | * | 64 | * |
| 66 | * @return Number of names written. | 65 | * @return Number of names written. |
| 67 | */ | 66 | */ |
| 68 | u32 GetDeviceNames(std::vector<Renderer::AudioDevice::AudioDeviceName>& names, u32 max_count, | 67 | u32 GetDeviceNames(std::span<Renderer::AudioDevice::AudioDeviceName> names, bool filter); |
| 69 | bool filter); | ||
| 70 | 68 | ||
| 71 | /// Core system | 69 | /// Core system |
| 72 | Core::System& system; | 70 | Core::System& system; |
diff --git a/src/audio_core/device/audio_buffers.h b/src/audio_core/device/audio_buffers.h index 5d8ed0ef7..9e84a9c05 100644 --- a/src/audio_core/device/audio_buffers.h +++ b/src/audio_core/device/audio_buffers.h | |||
| @@ -146,7 +146,11 @@ public: | |||
| 146 | break; | 146 | break; |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | tags[released++] = tag; | 149 | if (released < tags.size()) { |
| 150 | tags[released] = tag; | ||
| 151 | } | ||
| 152 | |||
| 153 | released++; | ||
| 150 | 154 | ||
| 151 | if (released >= tags.size()) { | 155 | if (released >= tags.size()) { |
| 152 | break; | 156 | break; |
diff --git a/src/audio_core/opus/decoder.cpp b/src/audio_core/opus/decoder.cpp index b7fed5304..0c110cbeb 100644 --- a/src/audio_core/opus/decoder.cpp +++ b/src/audio_core/opus/decoder.cpp | |||
| @@ -28,8 +28,8 @@ OpusDecoder::~OpusDecoder() { | |||
| 28 | } | 28 | } |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | Result OpusDecoder::Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, | 31 | Result OpusDecoder::Initialize(const OpusParametersEx& params, |
| 32 | u64 transfer_memory_size) { | 32 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { |
| 33 | auto frame_size{params.use_large_frame_size ? 5760 : 1920}; | 33 | auto frame_size{params.use_large_frame_size ? 5760 : 1920}; |
| 34 | shared_buffer_size = transfer_memory_size; | 34 | shared_buffer_size = transfer_memory_size; |
| 35 | shared_buffer = std::make_unique<u8[]>(shared_buffer_size); | 35 | shared_buffer = std::make_unique<u8[]>(shared_buffer_size); |
| @@ -59,7 +59,7 @@ Result OpusDecoder::Initialize(OpusParametersEx& params, Kernel::KTransferMemory | |||
| 59 | R_SUCCEED(); | 59 | R_SUCCEED(); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | Result OpusDecoder::Initialize(OpusMultiStreamParametersEx& params, | 62 | Result OpusDecoder::Initialize(const OpusMultiStreamParametersEx& params, |
| 63 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { | 63 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { |
| 64 | auto frame_size{params.use_large_frame_size ? 5760 : 1920}; | 64 | auto frame_size{params.use_large_frame_size ? 5760 : 1920}; |
| 65 | shared_buffer_size = transfer_memory_size; | 65 | shared_buffer_size = transfer_memory_size; |
diff --git a/src/audio_core/opus/decoder.h b/src/audio_core/opus/decoder.h index fd728958a..1b8c257d4 100644 --- a/src/audio_core/opus/decoder.h +++ b/src/audio_core/opus/decoder.h | |||
| @@ -22,10 +22,10 @@ public: | |||
| 22 | explicit OpusDecoder(Core::System& system, HardwareOpus& hardware_opus_); | 22 | explicit OpusDecoder(Core::System& system, HardwareOpus& hardware_opus_); |
| 23 | ~OpusDecoder(); | 23 | ~OpusDecoder(); |
| 24 | 24 | ||
| 25 | Result Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, | 25 | Result Initialize(const OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, |
| 26 | u64 transfer_memory_size); | ||
| 27 | Result Initialize(OpusMultiStreamParametersEx& params, Kernel::KTransferMemory* transfer_memory, | ||
| 28 | u64 transfer_memory_size); | 26 | u64 transfer_memory_size); |
| 27 | Result Initialize(const OpusMultiStreamParametersEx& params, | ||
| 28 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size); | ||
| 29 | Result DecodeInterleaved(u32* out_data_size, u64* out_time_taken, u32* out_sample_count, | 29 | Result DecodeInterleaved(u32* out_data_size, u64* out_time_taken, u32* out_sample_count, |
| 30 | std::span<const u8> input_data, std::span<u8> output_data, bool reset); | 30 | std::span<const u8> input_data, std::span<u8> output_data, bool reset); |
| 31 | Result SetContext([[maybe_unused]] std::span<const u8> context); | 31 | Result SetContext([[maybe_unused]] std::span<const u8> context); |
diff --git a/src/audio_core/opus/decoder_manager.cpp b/src/audio_core/opus/decoder_manager.cpp index 1464880a1..89eec1298 100644 --- a/src/audio_core/opus/decoder_manager.cpp +++ b/src/audio_core/opus/decoder_manager.cpp | |||
| @@ -38,7 +38,7 @@ OpusDecoderManager::OpusDecoderManager(Core::System& system_) | |||
| 38 | } | 38 | } |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | Result OpusDecoderManager::GetWorkBufferSize(OpusParameters& params, u64& out_size) { | 41 | Result OpusDecoderManager::GetWorkBufferSize(const OpusParameters& params, u32& out_size) { |
| 42 | OpusParametersEx ex{ | 42 | OpusParametersEx ex{ |
| 43 | .sample_rate = params.sample_rate, | 43 | .sample_rate = params.sample_rate, |
| 44 | .channel_count = params.channel_count, | 44 | .channel_count = params.channel_count, |
| @@ -47,11 +47,11 @@ Result OpusDecoderManager::GetWorkBufferSize(OpusParameters& params, u64& out_si | |||
| 47 | R_RETURN(GetWorkBufferSizeExEx(ex, out_size)); | 47 | R_RETURN(GetWorkBufferSizeExEx(ex, out_size)); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | Result OpusDecoderManager::GetWorkBufferSizeEx(OpusParametersEx& params, u64& out_size) { | 50 | Result OpusDecoderManager::GetWorkBufferSizeEx(const OpusParametersEx& params, u32& out_size) { |
| 51 | R_RETURN(GetWorkBufferSizeExEx(params, out_size)); | 51 | R_RETURN(GetWorkBufferSizeExEx(params, out_size)); |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | Result OpusDecoderManager::GetWorkBufferSizeExEx(OpusParametersEx& params, u64& out_size) { | 54 | Result OpusDecoderManager::GetWorkBufferSizeExEx(const OpusParametersEx& params, u32& out_size) { |
| 55 | R_UNLESS(IsValidChannelCount(params.channel_count), ResultInvalidOpusChannelCount); | 55 | R_UNLESS(IsValidChannelCount(params.channel_count), ResultInvalidOpusChannelCount); |
| 56 | R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); | 56 | R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); |
| 57 | 57 | ||
| @@ -63,8 +63,8 @@ Result OpusDecoderManager::GetWorkBufferSizeExEx(OpusParametersEx& params, u64& | |||
| 63 | R_SUCCEED(); | 63 | R_SUCCEED(); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(OpusMultiStreamParameters& params, | 66 | Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(const OpusMultiStreamParameters& params, |
| 67 | u64& out_size) { | 67 | u32& out_size) { |
| 68 | OpusMultiStreamParametersEx ex{ | 68 | OpusMultiStreamParametersEx ex{ |
| 69 | .sample_rate = params.sample_rate, | 69 | .sample_rate = params.sample_rate, |
| 70 | .channel_count = params.channel_count, | 70 | .channel_count = params.channel_count, |
| @@ -76,13 +76,13 @@ Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(OpusMultiStreamParame | |||
| 76 | R_RETURN(GetWorkBufferSizeForMultiStreamExEx(ex, out_size)); | 76 | R_RETURN(GetWorkBufferSizeForMultiStreamExEx(ex, out_size)); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(OpusMultiStreamParametersEx& params, | 79 | Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamEx( |
| 80 | u64& out_size) { | 80 | const OpusMultiStreamParametersEx& params, u32& out_size) { |
| 81 | R_RETURN(GetWorkBufferSizeForMultiStreamExEx(params, out_size)); | 81 | R_RETURN(GetWorkBufferSizeForMultiStreamExEx(params, out_size)); |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(OpusMultiStreamParametersEx& params, | 84 | Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx( |
| 85 | u64& out_size) { | 85 | const OpusMultiStreamParametersEx& params, u32& out_size) { |
| 86 | R_UNLESS(IsValidMultiStreamChannelCount(params.channel_count), ResultInvalidOpusChannelCount); | 86 | R_UNLESS(IsValidMultiStreamChannelCount(params.channel_count), ResultInvalidOpusChannelCount); |
| 87 | R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); | 87 | R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); |
| 88 | R_UNLESS(IsValidStreamCount(params.channel_count, params.total_stream_count, | 88 | R_UNLESS(IsValidStreamCount(params.channel_count, params.total_stream_count, |
diff --git a/src/audio_core/opus/decoder_manager.h b/src/audio_core/opus/decoder_manager.h index 70ebc4bab..8f6876d5c 100644 --- a/src/audio_core/opus/decoder_manager.h +++ b/src/audio_core/opus/decoder_manager.h | |||
| @@ -22,17 +22,19 @@ public: | |||
| 22 | return hardware_opus; | 22 | return hardware_opus; |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | Result GetWorkBufferSize(OpusParameters& params, u64& out_size); | 25 | Result GetWorkBufferSize(const OpusParameters& params, u32& out_size); |
| 26 | Result GetWorkBufferSizeEx(OpusParametersEx& params, u64& out_size); | 26 | Result GetWorkBufferSizeEx(const OpusParametersEx& params, u32& out_size); |
| 27 | Result GetWorkBufferSizeExEx(OpusParametersEx& params, u64& out_size); | 27 | Result GetWorkBufferSizeExEx(const OpusParametersEx& params, u32& out_size); |
| 28 | Result GetWorkBufferSizeForMultiStream(OpusMultiStreamParameters& params, u64& out_size); | 28 | Result GetWorkBufferSizeForMultiStream(const OpusMultiStreamParameters& params, u32& out_size); |
| 29 | Result GetWorkBufferSizeForMultiStreamEx(OpusMultiStreamParametersEx& params, u64& out_size); | 29 | Result GetWorkBufferSizeForMultiStreamEx(const OpusMultiStreamParametersEx& params, |
| 30 | Result GetWorkBufferSizeForMultiStreamExEx(OpusMultiStreamParametersEx& params, u64& out_size); | 30 | u32& out_size); |
| 31 | Result GetWorkBufferSizeForMultiStreamExEx(const OpusMultiStreamParametersEx& params, | ||
| 32 | u32& out_size); | ||
| 31 | 33 | ||
| 32 | private: | 34 | private: |
| 33 | Core::System& system; | 35 | Core::System& system; |
| 34 | HardwareOpus hardware_opus; | 36 | HardwareOpus hardware_opus; |
| 35 | std::array<u64, MaxChannels> required_workbuffer_sizes{}; | 37 | std::array<u32, MaxChannels> required_workbuffer_sizes{}; |
| 36 | }; | 38 | }; |
| 37 | 39 | ||
| 38 | } // namespace AudioCore::OpusDecoder | 40 | } // namespace AudioCore::OpusDecoder |
diff --git a/src/audio_core/opus/hardware_opus.cpp b/src/audio_core/opus/hardware_opus.cpp index 5ff71ab2d..30805f4a3 100644 --- a/src/audio_core/opus/hardware_opus.cpp +++ b/src/audio_core/opus/hardware_opus.cpp | |||
| @@ -42,7 +42,7 @@ HardwareOpus::HardwareOpus(Core::System& system_) | |||
| 42 | opus_decoder.SetSharedMemory(shared_memory); | 42 | opus_decoder.SetSharedMemory(shared_memory); |
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | u64 HardwareOpus::GetWorkBufferSize(u32 channel) { | 45 | u32 HardwareOpus::GetWorkBufferSize(u32 channel) { |
| 46 | if (!opus_decoder.IsRunning()) { | 46 | if (!opus_decoder.IsRunning()) { |
| 47 | return 0; | 47 | return 0; |
| 48 | } | 48 | } |
| @@ -55,10 +55,10 @@ u64 HardwareOpus::GetWorkBufferSize(u32 channel) { | |||
| 55 | ADSP::OpusDecoder::Message::GetWorkBufferSizeOK, msg); | 55 | ADSP::OpusDecoder::Message::GetWorkBufferSizeOK, msg); |
| 56 | return 0; | 56 | return 0; |
| 57 | } | 57 | } |
| 58 | return shared_memory.dsp_return_data[0]; | 58 | return static_cast<u32>(shared_memory.dsp_return_data[0]); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | u64 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count) { | 61 | u32 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count) { |
| 62 | std::scoped_lock l{mutex}; | 62 | std::scoped_lock l{mutex}; |
| 63 | shared_memory.host_send_data[0] = total_stream_count; | 63 | shared_memory.host_send_data[0] = total_stream_count; |
| 64 | shared_memory.host_send_data[1] = stereo_stream_count; | 64 | shared_memory.host_send_data[1] = stereo_stream_count; |
| @@ -70,7 +70,7 @@ u64 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 st | |||
| 70 | ADSP::OpusDecoder::Message::GetWorkBufferSizeForMultiStreamOK, msg); | 70 | ADSP::OpusDecoder::Message::GetWorkBufferSizeForMultiStreamOK, msg); |
| 71 | return 0; | 71 | return 0; |
| 72 | } | 72 | } |
| 73 | return shared_memory.dsp_return_data[0]; | 73 | return static_cast<u32>(shared_memory.dsp_return_data[0]); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, | 76 | Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, |
| @@ -94,8 +94,9 @@ Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, | |||
| 94 | 94 | ||
| 95 | Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, | 95 | Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, |
| 96 | u32 total_stream_count, | 96 | u32 total_stream_count, |
| 97 | u32 stereo_stream_count, void* mappings, | 97 | u32 stereo_stream_count, |
| 98 | void* buffer, u64 buffer_size) { | 98 | const void* mappings, void* buffer, |
| 99 | u64 buffer_size) { | ||
| 99 | std::scoped_lock l{mutex}; | 100 | std::scoped_lock l{mutex}; |
| 100 | shared_memory.host_send_data[0] = (u64)buffer; | 101 | shared_memory.host_send_data[0] = (u64)buffer; |
| 101 | shared_memory.host_send_data[1] = buffer_size; | 102 | shared_memory.host_send_data[1] = buffer_size; |
diff --git a/src/audio_core/opus/hardware_opus.h b/src/audio_core/opus/hardware_opus.h index b10184baa..caa746840 100644 --- a/src/audio_core/opus/hardware_opus.h +++ b/src/audio_core/opus/hardware_opus.h | |||
| @@ -16,14 +16,14 @@ class HardwareOpus { | |||
| 16 | public: | 16 | public: |
| 17 | HardwareOpus(Core::System& system); | 17 | HardwareOpus(Core::System& system); |
| 18 | 18 | ||
| 19 | u64 GetWorkBufferSize(u32 channel); | 19 | u32 GetWorkBufferSize(u32 channel); |
| 20 | u64 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count); | 20 | u32 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count); |
| 21 | 21 | ||
| 22 | Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, | 22 | Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, |
| 23 | u64 buffer_size); | 23 | u64 buffer_size); |
| 24 | Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, | 24 | Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, |
| 25 | u32 totaL_stream_count, u32 stereo_stream_count, | 25 | u32 totaL_stream_count, u32 stereo_stream_count, |
| 26 | void* mappings, void* buffer, u64 buffer_size); | 26 | const void* mappings, void* buffer, u64 buffer_size); |
| 27 | Result ShutdownDecodeObject(void* buffer, u64 buffer_size); | 27 | Result ShutdownDecodeObject(void* buffer, u64 buffer_size); |
| 28 | Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size); | 28 | Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size); |
| 29 | Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size, | 29 | Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size, |
diff --git a/src/audio_core/opus/parameters.h b/src/audio_core/opus/parameters.h index 4c54b2825..47c418b9f 100644 --- a/src/audio_core/opus/parameters.h +++ b/src/audio_core/opus/parameters.h | |||
| @@ -20,7 +20,7 @@ struct OpusParametersEx { | |||
| 20 | /* 0x00 */ u32 sample_rate; | 20 | /* 0x00 */ u32 sample_rate; |
| 21 | /* 0x04 */ u32 channel_count; | 21 | /* 0x04 */ u32 channel_count; |
| 22 | /* 0x08 */ bool use_large_frame_size; | 22 | /* 0x08 */ bool use_large_frame_size; |
| 23 | /* 0x09 */ INSERT_PADDING_BYTES(7); | 23 | /* 0x09 */ INSERT_PADDING_BYTES_NOINIT(7); |
| 24 | }; // size = 0x10 | 24 | }; // size = 0x10 |
| 25 | static_assert(sizeof(OpusParametersEx) == 0x10, "OpusParametersEx has the wrong size!"); | 25 | static_assert(sizeof(OpusParametersEx) == 0x10, "OpusParametersEx has the wrong size!"); |
| 26 | 26 | ||
| @@ -40,7 +40,7 @@ struct OpusMultiStreamParametersEx { | |||
| 40 | /* 0x08 */ u32 total_stream_count; | 40 | /* 0x08 */ u32 total_stream_count; |
| 41 | /* 0x0C */ u32 stereo_stream_count; | 41 | /* 0x0C */ u32 stereo_stream_count; |
| 42 | /* 0x10 */ bool use_large_frame_size; | 42 | /* 0x10 */ bool use_large_frame_size; |
| 43 | /* 0x11 */ INSERT_PADDING_BYTES(7); | 43 | /* 0x11 */ INSERT_PADDING_BYTES_NOINIT(7); |
| 44 | /* 0x18 */ std::array<u8, OpusStreamCountMax + 1> mappings; | 44 | /* 0x18 */ std::array<u8, OpusStreamCountMax + 1> mappings; |
| 45 | }; // size = 0x118 | 45 | }; // size = 0x118 |
| 46 | static_assert(sizeof(OpusMultiStreamParametersEx) == 0x118, | 46 | static_assert(sizeof(OpusMultiStreamParametersEx) == 0x118, |
diff --git a/src/audio_core/renderer/audio_device.cpp b/src/audio_core/renderer/audio_device.cpp index 2d9bf82bb..5be5594f6 100644 --- a/src/audio_core/renderer/audio_device.cpp +++ b/src/audio_core/renderer/audio_device.cpp | |||
| @@ -36,8 +36,7 @@ AudioDevice::AudioDevice(Core::System& system, const u64 applet_resource_user_id | |||
| 36 | : output_sink{system.AudioCore().GetOutputSink()}, | 36 | : output_sink{system.AudioCore().GetOutputSink()}, |
| 37 | applet_resource_user_id{applet_resource_user_id_}, user_revision{revision} {} | 37 | applet_resource_user_id{applet_resource_user_id_}, user_revision{revision} {} |
| 38 | 38 | ||
| 39 | u32 AudioDevice::ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer, | 39 | u32 AudioDevice::ListAudioDeviceName(std::span<AudioDeviceName> out_buffer) const { |
| 40 | const size_t max_count) const { | ||
| 41 | std::span<const AudioDeviceName> names{}; | 40 | std::span<const AudioDeviceName> names{}; |
| 42 | 41 | ||
| 43 | if (CheckFeatureSupported(SupportTags::AudioUsbDeviceOutput, user_revision)) { | 42 | if (CheckFeatureSupported(SupportTags::AudioUsbDeviceOutput, user_revision)) { |
| @@ -46,19 +45,18 @@ u32 AudioDevice::ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer, | |||
| 46 | names = device_names; | 45 | names = device_names; |
| 47 | } | 46 | } |
| 48 | 47 | ||
| 49 | const u32 out_count{static_cast<u32>(std::min(max_count, names.size()))}; | 48 | const u32 out_count{static_cast<u32>(std::min(out_buffer.size(), names.size()))}; |
| 50 | for (u32 i = 0; i < out_count; i++) { | 49 | for (u32 i = 0; i < out_count; i++) { |
| 51 | out_buffer.push_back(names[i]); | 50 | out_buffer[i] = names[i]; |
| 52 | } | 51 | } |
| 53 | return out_count; | 52 | return out_count; |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | u32 AudioDevice::ListAudioOutputDeviceName(std::vector<AudioDeviceName>& out_buffer, | 55 | u32 AudioDevice::ListAudioOutputDeviceName(std::span<AudioDeviceName> out_buffer) const { |
| 57 | const size_t max_count) const { | 56 | const u32 out_count{static_cast<u32>(std::min(out_buffer.size(), output_device_names.size()))}; |
| 58 | const u32 out_count{static_cast<u32>(std::min(max_count, output_device_names.size()))}; | ||
| 59 | 57 | ||
| 60 | for (u32 i = 0; i < out_count; i++) { | 58 | for (u32 i = 0; i < out_count; i++) { |
| 61 | out_buffer.push_back(output_device_names[i]); | 59 | out_buffer[i] = output_device_names[i]; |
| 62 | } | 60 | } |
| 63 | return out_count; | 61 | return out_count; |
| 64 | } | 62 | } |
diff --git a/src/audio_core/renderer/audio_device.h b/src/audio_core/renderer/audio_device.h index ca4040add..4242dad30 100644 --- a/src/audio_core/renderer/audio_device.h +++ b/src/audio_core/renderer/audio_device.h | |||
| @@ -36,20 +36,18 @@ public: | |||
| 36 | * Get a list of the available output devices. | 36 | * Get a list of the available output devices. |
| 37 | * | 37 | * |
| 38 | * @param out_buffer - Output buffer to write the available device names. | 38 | * @param out_buffer - Output buffer to write the available device names. |
| 39 | * @param max_count - Maximum number of devices to write (count of out_buffer). | ||
| 40 | * @return Number of device names written. | 39 | * @return Number of device names written. |
| 41 | */ | 40 | */ |
| 42 | u32 ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer, size_t max_count) const; | 41 | u32 ListAudioDeviceName(std::span<AudioDeviceName> out_buffer) const; |
| 43 | 42 | ||
| 44 | /** | 43 | /** |
| 45 | * Get a list of the available output devices. | 44 | * Get a list of the available output devices. |
| 46 | * Different to above somehow... | 45 | * Different to above somehow... |
| 47 | * | 46 | * |
| 48 | * @param out_buffer - Output buffer to write the available device names. | 47 | * @param out_buffer - Output buffer to write the available device names. |
| 49 | * @param max_count - Maximum number of devices to write (count of out_buffer). | ||
| 50 | * @return Number of device names written. | 48 | * @return Number of device names written. |
| 51 | */ | 49 | */ |
| 52 | u32 ListAudioOutputDeviceName(std::vector<AudioDeviceName>& out_buffer, size_t max_count) const; | 50 | u32 ListAudioOutputDeviceName(std::span<AudioDeviceName> out_buffer) const; |
| 53 | 51 | ||
| 54 | /** | 52 | /** |
| 55 | * Set the volume of all streams in the backend sink. | 53 | * Set the volume of all streams in the backend sink. |
diff --git a/src/audio_core/renderer/audio_renderer.cpp b/src/audio_core/renderer/audio_renderer.cpp index df03d03aa..7c728cb86 100644 --- a/src/audio_core/renderer/audio_renderer.cpp +++ b/src/audio_core/renderer/audio_renderer.cpp | |||
| @@ -17,9 +17,8 @@ Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* ren | |||
| 17 | 17 | ||
| 18 | Result Renderer::Initialize(const AudioRendererParameterInternal& params, | 18 | Result Renderer::Initialize(const AudioRendererParameterInternal& params, |
| 19 | Kernel::KTransferMemory* transfer_memory, | 19 | Kernel::KTransferMemory* transfer_memory, |
| 20 | const u64 transfer_memory_size, const u32 process_handle, | 20 | const u64 transfer_memory_size, Kernel::KProcess* process_handle, |
| 21 | Kernel::KProcess& process, const u64 applet_resource_user_id, | 21 | const u64 applet_resource_user_id, const s32 session_id) { |
| 22 | const s32 session_id) { | ||
| 23 | if (params.execution_mode == ExecutionMode::Auto) { | 22 | if (params.execution_mode == ExecutionMode::Auto) { |
| 24 | if (!manager.AddSystem(system)) { | 23 | if (!manager.AddSystem(system)) { |
| 25 | LOG_ERROR(Service_Audio, | 24 | LOG_ERROR(Service_Audio, |
| @@ -30,7 +29,7 @@ Result Renderer::Initialize(const AudioRendererParameterInternal& params, | |||
| 30 | } | 29 | } |
| 31 | 30 | ||
| 32 | initialized = true; | 31 | initialized = true; |
| 33 | system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, process, | 32 | system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, |
| 34 | applet_resource_user_id, session_id); | 33 | applet_resource_user_id, session_id); |
| 35 | 34 | ||
| 36 | return ResultSuccess; | 35 | return ResultSuccess; |
diff --git a/src/audio_core/renderer/audio_renderer.h b/src/audio_core/renderer/audio_renderer.h index 1219f74ca..f16adeda7 100644 --- a/src/audio_core/renderer/audio_renderer.h +++ b/src/audio_core/renderer/audio_renderer.h | |||
| @@ -38,14 +38,14 @@ public: | |||
| 38 | * @param params - Input parameters to initialize the system with. | 38 | * @param params - Input parameters to initialize the system with. |
| 39 | * @param transfer_memory - Game-supplied memory for all workbuffers. Unused. | 39 | * @param transfer_memory - Game-supplied memory for all workbuffers. Unused. |
| 40 | * @param transfer_memory_size - Size of the transfer memory. Unused. | 40 | * @param transfer_memory_size - Size of the transfer memory. Unused. |
| 41 | * @param process_handle - Process handle, also used for memory. Unused. | 41 | * @param process_handle - Process handle, also used for memory. |
| 42 | * @param applet_resource_user_id - Applet id for this renderer. Unused. | 42 | * @param applet_resource_user_id - Applet id for this renderer. Unused. |
| 43 | * @param session_id - Session id of this renderer. | 43 | * @param session_id - Session id of this renderer. |
| 44 | * @return Result code. | 44 | * @return Result code. |
| 45 | */ | 45 | */ |
| 46 | Result Initialize(const AudioRendererParameterInternal& params, | 46 | Result Initialize(const AudioRendererParameterInternal& params, |
| 47 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, | 47 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, |
| 48 | u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, | 48 | Kernel::KProcess* process_handle, u64 applet_resource_user_id, |
| 49 | s32 session_id); | 49 | s32 session_id); |
| 50 | 50 | ||
| 51 | /** | 51 | /** |
diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp index 667711e17..3dae6069f 100644 --- a/src/audio_core/renderer/behavior/info_updater.cpp +++ b/src/audio_core/renderer/behavior/info_updater.cpp | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | namespace AudioCore::Renderer { | 18 | namespace AudioCore::Renderer { |
| 19 | 19 | ||
| 20 | InfoUpdater::InfoUpdater(std::span<const u8> input_, std::span<u8> output_, | 20 | InfoUpdater::InfoUpdater(std::span<const u8> input_, std::span<u8> output_, |
| 21 | const u32 process_handle_, BehaviorInfo& behaviour_) | 21 | Kernel::KProcess* process_handle_, BehaviorInfo& behaviour_) |
| 22 | : input{input_.data() + sizeof(UpdateDataHeader)}, | 22 | : input{input_.data() + sizeof(UpdateDataHeader)}, |
| 23 | input_origin{input_}, output{output_.data() + sizeof(UpdateDataHeader)}, | 23 | input_origin{input_}, output{output_.data() + sizeof(UpdateDataHeader)}, |
| 24 | output_origin{output_}, in_header{reinterpret_cast<const UpdateDataHeader*>( | 24 | output_origin{output_}, in_header{reinterpret_cast<const UpdateDataHeader*>( |
diff --git a/src/audio_core/renderer/behavior/info_updater.h b/src/audio_core/renderer/behavior/info_updater.h index fb4b7d25a..4f27a817e 100644 --- a/src/audio_core/renderer/behavior/info_updater.h +++ b/src/audio_core/renderer/behavior/info_updater.h | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 9 | #include "core/hle/service/audio/errors.h" | 9 | #include "core/hle/service/audio/errors.h" |
| 10 | 10 | ||
| 11 | namespace Kernel { | ||
| 12 | class KProcess; | ||
| 13 | } | ||
| 14 | |||
| 11 | namespace AudioCore::Renderer { | 15 | namespace AudioCore::Renderer { |
| 12 | class BehaviorInfo; | 16 | class BehaviorInfo; |
| 13 | class VoiceContext; | 17 | class VoiceContext; |
| @@ -39,8 +43,8 @@ class InfoUpdater { | |||
| 39 | static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has the wrong size!"); | 43 | static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has the wrong size!"); |
| 40 | 44 | ||
| 41 | public: | 45 | public: |
| 42 | explicit InfoUpdater(std::span<const u8> input, std::span<u8> output, u32 process_handle, | 46 | explicit InfoUpdater(std::span<const u8> input, std::span<u8> output, |
| 43 | BehaviorInfo& behaviour); | 47 | Kernel::KProcess* process_handle, BehaviorInfo& behaviour); |
| 44 | 48 | ||
| 45 | /** | 49 | /** |
| 46 | * Update the voice channel resources. | 50 | * Update the voice channel resources. |
| @@ -197,7 +201,7 @@ private: | |||
| 197 | /// Expected output size, see CheckConsumedSize | 201 | /// Expected output size, see CheckConsumedSize |
| 198 | u64 expected_output_size; | 202 | u64 expected_output_size; |
| 199 | /// Unused | 203 | /// Unused |
| 200 | u32 process_handle; | 204 | Kernel::KProcess* process_handle; |
| 201 | /// Behaviour | 205 | /// Behaviour |
| 202 | BehaviorInfo& behaviour; | 206 | BehaviorInfo& behaviour; |
| 203 | }; | 207 | }; |
diff --git a/src/audio_core/renderer/memory/pool_mapper.cpp b/src/audio_core/renderer/memory/pool_mapper.cpp index 999bb746b..e47eb66d5 100644 --- a/src/audio_core/renderer/memory/pool_mapper.cpp +++ b/src/audio_core/renderer/memory/pool_mapper.cpp | |||
| @@ -8,11 +8,11 @@ | |||
| 8 | 8 | ||
| 9 | namespace AudioCore::Renderer { | 9 | namespace AudioCore::Renderer { |
| 10 | 10 | ||
| 11 | PoolMapper::PoolMapper(u32 process_handle_, bool force_map_) | 11 | PoolMapper::PoolMapper(Kernel::KProcess* process_handle_, bool force_map_) |
| 12 | : process_handle{process_handle_}, force_map{force_map_} {} | 12 | : process_handle{process_handle_}, force_map{force_map_} {} |
| 13 | 13 | ||
| 14 | PoolMapper::PoolMapper(u32 process_handle_, std::span<MemoryPoolInfo> pool_infos_, u32 pool_count_, | 14 | PoolMapper::PoolMapper(Kernel::KProcess* process_handle_, std::span<MemoryPoolInfo> pool_infos_, |
| 15 | bool force_map_) | 15 | u32 pool_count_, bool force_map_) |
| 16 | : process_handle{process_handle_}, pool_infos{pool_infos_.data()}, | 16 | : process_handle{process_handle_}, pool_infos{pool_infos_.data()}, |
| 17 | pool_count{pool_count_}, force_map{force_map_} {} | 17 | pool_count{pool_count_}, force_map{force_map_} {} |
| 18 | 18 | ||
| @@ -106,15 +106,17 @@ bool PoolMapper::IsForceMapEnabled() const { | |||
| 106 | return force_map; | 106 | return force_map; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | u32 PoolMapper::GetProcessHandle(const MemoryPoolInfo* pool) const { | 109 | Kernel::KProcess* PoolMapper::GetProcessHandle(const MemoryPoolInfo* pool) const { |
| 110 | switch (pool->GetLocation()) { | 110 | switch (pool->GetLocation()) { |
| 111 | case MemoryPoolInfo::Location::CPU: | 111 | case MemoryPoolInfo::Location::CPU: |
| 112 | return process_handle; | 112 | return process_handle; |
| 113 | case MemoryPoolInfo::Location::DSP: | 113 | case MemoryPoolInfo::Location::DSP: |
| 114 | return Kernel::Svc::CurrentProcess; | 114 | // return Kernel::Svc::CurrentProcess; |
| 115 | return nullptr; | ||
| 115 | } | 116 | } |
| 116 | LOG_WARNING(Service_Audio, "Invalid MemoryPoolInfo location!"); | 117 | LOG_WARNING(Service_Audio, "Invalid MemoryPoolInfo location!"); |
| 117 | return Kernel::Svc::CurrentProcess; | 118 | // return Kernel::Svc::CurrentProcess; |
| 119 | return nullptr; | ||
| 118 | } | 120 | } |
| 119 | 121 | ||
| 120 | bool PoolMapper::Map([[maybe_unused]] const u32 handle, [[maybe_unused]] const CpuAddr cpu_addr, | 122 | bool PoolMapper::Map([[maybe_unused]] const u32 handle, [[maybe_unused]] const CpuAddr cpu_addr, |
| @@ -147,14 +149,14 @@ bool PoolMapper::Unmap([[maybe_unused]] const u32 handle, [[maybe_unused]] const | |||
| 147 | } | 149 | } |
| 148 | 150 | ||
| 149 | bool PoolMapper::Unmap(MemoryPoolInfo& pool) const { | 151 | bool PoolMapper::Unmap(MemoryPoolInfo& pool) const { |
| 150 | [[maybe_unused]] u32 handle{0}; | 152 | [[maybe_unused]] Kernel::KProcess* handle{}; |
| 151 | 153 | ||
| 152 | switch (pool.GetLocation()) { | 154 | switch (pool.GetLocation()) { |
| 153 | case MemoryPoolInfo::Location::CPU: | 155 | case MemoryPoolInfo::Location::CPU: |
| 154 | handle = process_handle; | 156 | handle = process_handle; |
| 155 | break; | 157 | break; |
| 156 | case MemoryPoolInfo::Location::DSP: | 158 | case MemoryPoolInfo::Location::DSP: |
| 157 | handle = Kernel::Svc::CurrentProcess; | 159 | // handle = Kernel::Svc::CurrentProcess; |
| 158 | break; | 160 | break; |
| 159 | } | 161 | } |
| 160 | // nn::audio::dsp::UnmapUserPointer(handle, pool->cpu_address, pool->size); | 162 | // nn::audio::dsp::UnmapUserPointer(handle, pool->cpu_address, pool->size); |
diff --git a/src/audio_core/renderer/memory/pool_mapper.h b/src/audio_core/renderer/memory/pool_mapper.h index 95ae5d8ea..fb5122b73 100644 --- a/src/audio_core/renderer/memory/pool_mapper.h +++ b/src/audio_core/renderer/memory/pool_mapper.h | |||
| @@ -10,6 +10,10 @@ | |||
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | #include "core/hle/service/audio/errors.h" | 11 | #include "core/hle/service/audio/errors.h" |
| 12 | 12 | ||
| 13 | namespace Kernel { | ||
| 14 | class KProcess; | ||
| 15 | } | ||
| 16 | |||
| 13 | namespace AudioCore::Renderer { | 17 | namespace AudioCore::Renderer { |
| 14 | class AddressInfo; | 18 | class AddressInfo; |
| 15 | 19 | ||
| @@ -18,9 +22,9 @@ class AddressInfo; | |||
| 18 | */ | 22 | */ |
| 19 | class PoolMapper { | 23 | class PoolMapper { |
| 20 | public: | 24 | public: |
| 21 | explicit PoolMapper(u32 process_handle, bool force_map); | 25 | explicit PoolMapper(Kernel::KProcess* process_handle, bool force_map); |
| 22 | explicit PoolMapper(u32 process_handle, std::span<MemoryPoolInfo> pool_infos, u32 pool_count, | 26 | explicit PoolMapper(Kernel::KProcess* process_handle, std::span<MemoryPoolInfo> pool_infos, |
| 23 | bool force_map); | 27 | u32 pool_count, bool force_map); |
| 24 | 28 | ||
| 25 | /** | 29 | /** |
| 26 | * Clear the usage state for all given pools. | 30 | * Clear the usage state for all given pools. |
| @@ -98,7 +102,7 @@ public: | |||
| 98 | * @return CurrentProcessHandle if location == DSP, | 102 | * @return CurrentProcessHandle if location == DSP, |
| 99 | * the PoolMapper's process_handle if location == CPU | 103 | * the PoolMapper's process_handle if location == CPU |
| 100 | */ | 104 | */ |
| 101 | u32 GetProcessHandle(const MemoryPoolInfo* pool) const; | 105 | Kernel::KProcess* GetProcessHandle(const MemoryPoolInfo* pool) const; |
| 102 | 106 | ||
| 103 | /** | 107 | /** |
| 104 | * Map the given region with the given handle. This is a no-op. | 108 | * Map the given region with the given handle. This is a no-op. |
| @@ -167,7 +171,7 @@ public: | |||
| 167 | 171 | ||
| 168 | private: | 172 | private: |
| 169 | /// Process handle for this mapper, used when location == CPU | 173 | /// Process handle for this mapper, used when location == CPU |
| 170 | u32 process_handle; | 174 | Kernel::KProcess* process_handle{}; |
| 171 | /// List of memory pools assigned to this mapper | 175 | /// List of memory pools assigned to this mapper |
| 172 | MemoryPoolInfo* pool_infos{}; | 176 | MemoryPoolInfo* pool_infos{}; |
| 173 | /// The number of pools | 177 | /// The number of pools |
diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index ca656edae..c30d68426 100644 --- a/src/audio_core/renderer/system.cpp +++ b/src/audio_core/renderer/system.cpp | |||
| @@ -102,8 +102,8 @@ System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_) | |||
| 102 | 102 | ||
| 103 | Result System::Initialize(const AudioRendererParameterInternal& params, | 103 | Result System::Initialize(const AudioRendererParameterInternal& params, |
| 104 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, | 104 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, |
| 105 | u32 process_handle_, Kernel::KProcess& process_, | 105 | Kernel::KProcess* process_handle_, u64 applet_resource_user_id_, |
| 106 | u64 applet_resource_user_id_, s32 session_id_) { | 106 | s32 session_id_) { |
| 107 | if (!CheckValidRevision(params.revision)) { | 107 | if (!CheckValidRevision(params.revision)) { |
| 108 | return Service::Audio::ResultInvalidRevision; | 108 | return Service::Audio::ResultInvalidRevision; |
| 109 | } | 109 | } |
| @@ -119,7 +119,6 @@ Result System::Initialize(const AudioRendererParameterInternal& params, | |||
| 119 | behavior.SetUserLibRevision(params.revision); | 119 | behavior.SetUserLibRevision(params.revision); |
| 120 | 120 | ||
| 121 | process_handle = process_handle_; | 121 | process_handle = process_handle_; |
| 122 | process = &process_; | ||
| 123 | applet_resource_user_id = applet_resource_user_id_; | 122 | applet_resource_user_id = applet_resource_user_id_; |
| 124 | session_id = session_id_; | 123 | session_id = session_id_; |
| 125 | 124 | ||
| @@ -132,7 +131,8 @@ Result System::Initialize(const AudioRendererParameterInternal& params, | |||
| 132 | render_device = params.rendering_device; | 131 | render_device = params.rendering_device; |
| 133 | execution_mode = params.execution_mode; | 132 | execution_mode = params.execution_mode; |
| 134 | 133 | ||
| 135 | process->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); | 134 | process_handle->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), |
| 135 | transfer_memory_size); | ||
| 136 | 136 | ||
| 137 | // Note: We're not actually using the transfer memory because it's a pain to code for. | 137 | // Note: We're not actually using the transfer memory because it's a pain to code for. |
| 138 | // Allocate the memory normally instead and hope the game doesn't try to read anything back | 138 | // Allocate the memory normally instead and hope the game doesn't try to read anything back |
| @@ -616,7 +616,7 @@ void System::SendCommandToDsp() { | |||
| 616 | static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 * | 616 | static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 * |
| 617 | (static_cast<f32>(render_time_limit_percent) / 100.0f))}; | 617 | (static_cast<f32>(render_time_limit_percent) / 100.0f))}; |
| 618 | audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, | 618 | audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, |
| 619 | applet_resource_user_id, process, | 619 | applet_resource_user_id, process_handle, |
| 620 | reset_command_buffers); | 620 | reset_command_buffers); |
| 621 | reset_command_buffers = false; | 621 | reset_command_buffers = false; |
| 622 | command_buffer_size = command_size; | 622 | command_buffer_size = command_size; |
diff --git a/src/audio_core/renderer/system.h b/src/audio_core/renderer/system.h index 753a0b796..3533a74ef 100644 --- a/src/audio_core/renderer/system.h +++ b/src/audio_core/renderer/system.h | |||
| @@ -74,14 +74,14 @@ public: | |||
| 74 | * @param params - Input parameters to initialize the system with. | 74 | * @param params - Input parameters to initialize the system with. |
| 75 | * @param transfer_memory - Game-supplied memory for all workbuffers. Unused. | 75 | * @param transfer_memory - Game-supplied memory for all workbuffers. Unused. |
| 76 | * @param transfer_memory_size - Size of the transfer memory. Unused. | 76 | * @param transfer_memory_size - Size of the transfer memory. Unused. |
| 77 | * @param process_handle - Process handle, also used for memory. Unused. | 77 | * @param process_handle - Process handle, also used for memory. |
| 78 | * @param applet_resource_user_id - Applet id for this renderer. Unused. | 78 | * @param applet_resource_user_id - Applet id for this renderer. Unused. |
| 79 | * @param session_id - Session id of this renderer. | 79 | * @param session_id - Session id of this renderer. |
| 80 | * @return Result code. | 80 | * @return Result code. |
| 81 | */ | 81 | */ |
| 82 | Result Initialize(const AudioRendererParameterInternal& params, | 82 | Result Initialize(const AudioRendererParameterInternal& params, |
| 83 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, | 83 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, |
| 84 | u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, | 84 | Kernel::KProcess* process_handle, u64 applet_resource_user_id, |
| 85 | s32 session_id); | 85 | s32 session_id); |
| 86 | 86 | ||
| 87 | /** | 87 | /** |
| @@ -278,9 +278,7 @@ private: | |||
| 278 | /// Does what locks do | 278 | /// Does what locks do |
| 279 | std::mutex lock{}; | 279 | std::mutex lock{}; |
| 280 | /// Process this audio render is operating within, used for memory reads/writes. | 280 | /// Process this audio render is operating within, used for memory reads/writes. |
| 281 | Kernel::KProcess* process{}; | 281 | Kernel::KProcess* process_handle{}; |
| 282 | /// Handle for the process for this system, unused | ||
| 283 | u32 process_handle{}; | ||
| 284 | /// Applet resource id for this system, unused | 282 | /// Applet resource id for this system, unused |
| 285 | u64 applet_resource_user_id{}; | 283 | u64 applet_resource_user_id{}; |
| 286 | /// Controls performance input and output | 284 | /// Controls performance input and output |
diff --git a/src/audio_core/sink/oboe_sink.cpp b/src/audio_core/sink/oboe_sink.cpp index e61841172..466a9cc8e 100644 --- a/src/audio_core/sink/oboe_sink.cpp +++ b/src/audio_core/sink/oboe_sink.cpp | |||
| @@ -67,9 +67,13 @@ public: | |||
| 67 | oboe::AudioStreamBuilder builder; | 67 | oboe::AudioStreamBuilder builder; |
| 68 | 68 | ||
| 69 | const auto result = ConfigureBuilder(builder, direction)->openStream(temp_stream); | 69 | const auto result = ConfigureBuilder(builder, direction)->openStream(temp_stream); |
| 70 | ASSERT(result == oboe::Result::OK); | 70 | if (result == oboe::Result::OK) { |
| 71 | return temp_stream->getChannelCount() >= 6 ? 6 : 2; | ||
| 72 | } | ||
| 71 | 73 | ||
| 72 | return temp_stream->getChannelCount() >= 6 ? 6 : 2; | 74 | LOG_ERROR(Audio_Sink, "Failed to open {} stream. Using default channel count 2", |
| 75 | direction == oboe::Direction::Output ? "output" : "input"); | ||
| 76 | return 2; | ||
| 73 | } | 77 | } |
| 74 | 78 | ||
| 75 | protected: | 79 | protected: |