Merge pull request #8911 from lioncash/cexpr-string

audio_device: Make AudioDeviceName constructor constexpr
This commit is contained in:
Morph 2022-09-16 10:18:58 -04:00 committed by GitHub
commit 60aa942210
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 27 deletions

View file

@ -82,7 +82,7 @@ u32 Manager::GetDeviceNames(std::vector<AudioRenderer::AudioDevice::AudioDeviceN
auto input_devices{Sink::GetDeviceListForSink(Settings::values.sink_id.GetValue(), true)}; auto input_devices{Sink::GetDeviceListForSink(Settings::values.sink_id.GetValue(), true)};
if (input_devices.size() > 1) { if (input_devices.size() > 1) {
names.push_back(AudioRenderer::AudioDevice::AudioDeviceName("Uac")); names.emplace_back("Uac");
return 1; return 1;
} }
return 0; return 0;

View file

@ -74,7 +74,7 @@ void Manager::BufferReleaseAndRegister() {
u32 Manager::GetAudioOutDeviceNames( u32 Manager::GetAudioOutDeviceNames(
std::vector<AudioRenderer::AudioDevice::AudioDeviceName>& names) const { std::vector<AudioRenderer::AudioDevice::AudioDeviceName>& names) const {
names.push_back({"DeviceOut"}); names.emplace_back("DeviceOut");
return 1; return 1;
} }

View file

@ -1,6 +1,9 @@
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <array>
#include <span>
#include "audio_core/audio_core.h" #include "audio_core/audio_core.h"
#include "audio_core/common/feature_support.h" #include "audio_core/common/feature_support.h"
#include "audio_core/renderer/audio_device.h" #include "audio_core/renderer/audio_device.h"
@ -9,14 +12,33 @@
namespace AudioCore::AudioRenderer { namespace AudioCore::AudioRenderer {
constexpr std::array usb_device_names{
AudioDevice::AudioDeviceName{"AudioStereoJackOutput"},
AudioDevice::AudioDeviceName{"AudioBuiltInSpeakerOutput"},
AudioDevice::AudioDeviceName{"AudioTvOutput"},
AudioDevice::AudioDeviceName{"AudioUsbDeviceOutput"},
};
constexpr std::array device_names{
AudioDevice::AudioDeviceName{"AudioStereoJackOutput"},
AudioDevice::AudioDeviceName{"AudioBuiltInSpeakerOutput"},
AudioDevice::AudioDeviceName{"AudioTvOutput"},
};
constexpr std::array output_device_names{
AudioDevice::AudioDeviceName{"AudioBuiltInSpeakerOutput"},
AudioDevice::AudioDeviceName{"AudioTvOutput"},
AudioDevice::AudioDeviceName{"AudioExternalOutput"},
};
AudioDevice::AudioDevice(Core::System& system, const u64 applet_resource_user_id_, AudioDevice::AudioDevice(Core::System& system, const u64 applet_resource_user_id_,
const u32 revision) const u32 revision)
: output_sink{system.AudioCore().GetOutputSink()}, : output_sink{system.AudioCore().GetOutputSink()},
applet_resource_user_id{applet_resource_user_id_}, user_revision{revision} {} applet_resource_user_id{applet_resource_user_id_}, user_revision{revision} {}
u32 AudioDevice::ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer, u32 AudioDevice::ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer,
const size_t max_count) { const size_t max_count) const {
std::span<AudioDeviceName> names{}; std::span<const AudioDeviceName> names{};
if (CheckFeatureSupported(SupportTags::AudioUsbDeviceOutput, user_revision)) { if (CheckFeatureSupported(SupportTags::AudioUsbDeviceOutput, user_revision)) {
names = usb_device_names; names = usb_device_names;
@ -24,7 +46,7 @@ u32 AudioDevice::ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer,
names = device_names; names = device_names;
} }
u32 out_count{static_cast<u32>(std::min(max_count, names.size()))}; const u32 out_count{static_cast<u32>(std::min(max_count, names.size()))};
for (u32 i = 0; i < out_count; i++) { for (u32 i = 0; i < out_count; i++) {
out_buffer.push_back(names[i]); out_buffer.push_back(names[i]);
} }
@ -32,8 +54,8 @@ u32 AudioDevice::ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer,
} }
u32 AudioDevice::ListAudioOutputDeviceName(std::vector<AudioDeviceName>& out_buffer, u32 AudioDevice::ListAudioOutputDeviceName(std::vector<AudioDeviceName>& out_buffer,
const size_t max_count) { const size_t max_count) const {
u32 out_count{static_cast<u32>(std::min(max_count, output_device_names.size()))}; const u32 out_count{static_cast<u32>(std::min(max_count, output_device_names.size()))};
for (u32 i = 0; i < out_count; i++) { for (u32 i = 0; i < out_count; i++) {
out_buffer.push_back(output_device_names[i]); out_buffer.push_back(output_device_names[i]);
@ -45,7 +67,7 @@ void AudioDevice::SetDeviceVolumes(const f32 volume) {
output_sink.SetDeviceVolume(volume); output_sink.SetDeviceVolume(volume);
} }
f32 AudioDevice::GetDeviceVolume([[maybe_unused]] std::string_view name) { f32 AudioDevice::GetDeviceVolume([[maybe_unused]] std::string_view name) const {
return output_sink.GetDeviceVolume(); return output_sink.GetDeviceVolume();
} }

View file

@ -3,7 +3,7 @@
#pragma once #pragma once
#include <span> #include <string_view>
#include "audio_core/audio_render_manager.h" #include "audio_core/audio_render_manager.h"
@ -23,21 +23,13 @@ namespace AudioRenderer {
class AudioDevice { class AudioDevice {
public: public:
struct AudioDeviceName { struct AudioDeviceName {
std::array<char, 0x100> name; std::array<char, 0x100> name{};
AudioDeviceName(const char* name_) { constexpr AudioDeviceName(std::string_view name_) {
std::strncpy(name.data(), name_, name.size()); name_.copy(name.data(), name.size() - 1);
} }
}; };
std::array<AudioDeviceName, 4> usb_device_names{"AudioStereoJackOutput",
"AudioBuiltInSpeakerOutput", "AudioTvOutput",
"AudioUsbDeviceOutput"};
std::array<AudioDeviceName, 3> device_names{"AudioStereoJackOutput",
"AudioBuiltInSpeakerOutput", "AudioTvOutput"};
std::array<AudioDeviceName, 3> output_device_names{"AudioBuiltInSpeakerOutput", "AudioTvOutput",
"AudioExternalOutput"};
explicit AudioDevice(Core::System& system, u64 applet_resource_user_id, u32 revision); explicit AudioDevice(Core::System& system, u64 applet_resource_user_id, u32 revision);
/** /**
@ -47,7 +39,7 @@ public:
* @param max_count - Maximum number of devices to write (count of out_buffer). * @param max_count - Maximum number of devices to write (count of out_buffer).
* @return Number of device names written. * @return Number of device names written.
*/ */
u32 ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer, size_t max_count); u32 ListAudioDeviceName(std::vector<AudioDeviceName>& out_buffer, size_t max_count) const;
/** /**
* Get a list of the available output devices. * Get a list of the available output devices.
@ -57,7 +49,7 @@ public:
* @param max_count - Maximum number of devices to write (count of out_buffer). * @param max_count - Maximum number of devices to write (count of out_buffer).
* @return Number of device names written. * @return Number of device names written.
*/ */
u32 ListAudioOutputDeviceName(std::vector<AudioDeviceName>& out_buffer, size_t max_count); u32 ListAudioOutputDeviceName(std::vector<AudioDeviceName>& out_buffer, size_t max_count) const;
/** /**
* Set the volume of all streams in the backend sink. * Set the volume of all streams in the backend sink.
@ -73,7 +65,7 @@ public:
* @param name - Name of the device to check. Unused. * @param name - Name of the device to check. Unused.
* @return Volume of the device. * @return Volume of the device.
*/ */
f32 GetDeviceVolume(std::string_view name); f32 GetDeviceVolume(std::string_view name) const;
private: private:
/// Backend output sink for the device /// Backend output sink for the device

View file

@ -246,9 +246,8 @@ void AudOutU::ListAudioOuts(Kernel::HLERequestContext& ctx) {
const auto write_count = const auto write_count =
static_cast<u32>(ctx.GetWriteBufferSize() / sizeof(AudioDevice::AudioDeviceName)); static_cast<u32>(ctx.GetWriteBufferSize() / sizeof(AudioDevice::AudioDeviceName));
std::vector<AudioDevice::AudioDeviceName> device_names{}; std::vector<AudioDevice::AudioDeviceName> device_names{};
std::string print_names{};
if (write_count > 0) { if (write_count > 0) {
device_names.push_back(AudioDevice::AudioDeviceName("DeviceOut")); device_names.emplace_back("DeviceOut");
LOG_DEBUG(Service_Audio, "called. \nName=DeviceOut"); LOG_DEBUG(Service_Audio, "called. \nName=DeviceOut");
} else { } else {
LOG_DEBUG(Service_Audio, "called. Empty buffer passed in."); LOG_DEBUG(Service_Audio, "called. Empty buffer passed in.");

View file

@ -252,7 +252,7 @@ private:
std::vector<AudioDevice::AudioDeviceName> out_names{}; std::vector<AudioDevice::AudioDeviceName> out_names{};
u32 out_count = impl->ListAudioDeviceName(out_names, in_count); const u32 out_count = impl->ListAudioDeviceName(out_names, in_count);
std::string out{}; std::string out{};
for (u32 i = 0; i < out_count; i++) { for (u32 i = 0; i < out_count; i++) {
@ -365,7 +365,7 @@ private:
std::vector<AudioDevice::AudioDeviceName> out_names{}; std::vector<AudioDevice::AudioDeviceName> out_names{};
u32 out_count = impl->ListAudioOutputDeviceName(out_names, in_count); const u32 out_count = impl->ListAudioOutputDeviceName(out_names, in_count);
std::string out{}; std::string out{};
for (u32 i = 0; i < out_count; i++) { for (u32 i = 0; i < out_count; i++) {