From dd7633c5f418952390d056146510040d08125ee4 Mon Sep 17 00:00:00 2001 From: Liav A Date: Tue, 11 Apr 2023 13:11:02 +0300 Subject: [PATCH] Kernel/Audio: Propagate errors when creating AudioChannels While doing this, we can also just return a normal RefPtr instead of a LockRefPtr, because we create these channels when initializing an audio controller, and never change the pointer in AudioController instances after their initialization, hence no locking is necessary. --- Kernel/Devices/Audio/AC97.cpp | 4 ++-- Kernel/Devices/Audio/AC97.h | 5 +++-- Kernel/Devices/Audio/Channel.cpp | 7 ++----- Kernel/Devices/Audio/Channel.h | 2 +- Kernel/Devices/Audio/Controller.h | 4 ++-- Kernel/Devices/Audio/IntelHDA/Controller.cpp | 4 ++-- Kernel/Devices/Audio/IntelHDA/Controller.h | 6 +++--- Kernel/Devices/Audio/Management.h | 2 +- 8 files changed, 16 insertions(+), 18 deletions(-) diff --git a/Kernel/Devices/Audio/AC97.cpp b/Kernel/Devices/Audio/AC97.cpp index bef42a6f22..3b85103c77 100644 --- a/Kernel/Devices/Audio/AC97.cpp +++ b/Kernel/Devices/Audio/AC97.cpp @@ -88,7 +88,7 @@ UNMAP_AFTER_INIT ErrorOr AC97::initialize(Badge) dbgln_if(AC97_DEBUG, "AC97 @ {}: mixer base: {:#04x}", device_identifier().address(), m_mixer_io_window); dbgln_if(AC97_DEBUG, "AC97 @ {}: bus base: {:#04x}", device_identifier().address(), m_bus_io_window); - m_audio_channel = AudioChannel::must_create(*this, 0); + m_audio_channel = TRY(AudioChannel::create(*this, 0)); // Read out AC'97 codec revision and vendor auto extended_audio_id = m_mixer_io_window->read16(NativeAudioMixerRegister::ExtendedAudioID); @@ -177,7 +177,7 @@ void AC97::set_pcm_output_volume(u8 left_channel, u8 right_channel, Muted mute) m_mixer_io_window->write16(NativeAudioMixerRegister::SetPCMOutputVolume, volume_value); } -LockRefPtr AC97::audio_channel(u32 index) const +RefPtr AC97::audio_channel(u32 index) const { if (index == 0) return m_audio_channel; diff --git a/Kernel/Devices/Audio/AC97.h b/Kernel/Devices/Audio/AC97.h index 5964220451..5477cf6a8d 100644 --- a/Kernel/Devices/Audio/AC97.h +++ b/Kernel/Devices/Audio/AC97.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -167,7 +168,7 @@ private: // ^AudioController virtual ErrorOr initialize(Badge) override; - virtual LockRefPtr audio_channel(u32 index) const override; + virtual RefPtr audio_channel(u32 index) const override; virtual ErrorOr write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) override; virtual ErrorOr set_pcm_output_sample_rate(size_t channel_index, u32 samples_per_second_rate) override; virtual ErrorOr get_pcm_output_sample_rate(size_t channel_index) override; @@ -185,7 +186,7 @@ private: NonnullOwnPtr m_pcm_out_channel; u32 m_sample_rate { 0 }; bool m_variable_rate_pcm_supported { false }; - LockRefPtr m_audio_channel; + RefPtr m_audio_channel; }; } diff --git a/Kernel/Devices/Audio/Channel.cpp b/Kernel/Devices/Audio/Channel.cpp index 104d9dc233..96c412f4f0 100644 --- a/Kernel/Devices/Audio/Channel.cpp +++ b/Kernel/Devices/Audio/Channel.cpp @@ -13,12 +13,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr AudioChannel::must_create(AudioController const& controller, size_t channel_index) +UNMAP_AFTER_INIT ErrorOr> AudioChannel::create(AudioController const& controller, size_t channel_index) { - auto audio_device_or_error = DeviceManagement::try_create_device(controller, channel_index); - // FIXME: Find a way to propagate errors - VERIFY(!audio_device_or_error.is_error()); - return audio_device_or_error.release_value(); + return *TRY(DeviceManagement::try_create_device(controller, channel_index)); } AudioChannel::AudioChannel(AudioController const& controller, size_t channel_index) diff --git a/Kernel/Devices/Audio/Channel.h b/Kernel/Devices/Audio/Channel.h index 7106bd9ae2..188264a8de 100644 --- a/Kernel/Devices/Audio/Channel.h +++ b/Kernel/Devices/Audio/Channel.h @@ -20,7 +20,7 @@ class AudioChannel final friend class DeviceManagement; public: - static NonnullLockRefPtr must_create(AudioController const&, size_t channel_index); + static ErrorOr> create(AudioController const&, size_t channel_index); virtual ~AudioChannel() override = default; // ^CharacterDevice diff --git a/Kernel/Devices/Audio/Controller.h b/Kernel/Devices/Audio/Controller.h index b7ba475d11..dfe39e9d84 100644 --- a/Kernel/Devices/Audio/Controller.h +++ b/Kernel/Devices/Audio/Controller.h @@ -8,11 +8,11 @@ #include #include +#include #include #include #include #include -#include #include #include #include @@ -30,7 +30,7 @@ class AudioController public: virtual ~AudioController() = default; - virtual LockRefPtr audio_channel(u32 index) const = 0; + virtual RefPtr audio_channel(u32 index) const = 0; virtual ErrorOr write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) = 0; virtual ErrorOr initialize(Badge) = 0; diff --git a/Kernel/Devices/Audio/IntelHDA/Controller.cpp b/Kernel/Devices/Audio/IntelHDA/Controller.cpp index 767e87210f..0588e47e46 100644 --- a/Kernel/Devices/Audio/IntelHDA/Controller.cpp +++ b/Kernel/Devices/Audio/IntelHDA/Controller.cpp @@ -92,7 +92,7 @@ UNMAP_AFTER_INIT ErrorOr Controller::initialize(Badge) return result.release_error(); } - m_audio_channel = AudioChannel::must_create(*this, fixed_audio_channel_index); + m_audio_channel = TRY(AudioChannel::create(*this, fixed_audio_channel_index)); return {}; } @@ -290,7 +290,7 @@ ErrorOr Controller::reset() return {}; } -LockRefPtr Controller::audio_channel(u32 index) const +RefPtr Controller::audio_channel(u32 index) const { if (index != fixed_audio_channel_index) return {}; diff --git a/Kernel/Devices/Audio/IntelHDA/Controller.h b/Kernel/Devices/Audio/IntelHDA/Controller.h index 5a04fd279a..e747453679 100644 --- a/Kernel/Devices/Audio/IntelHDA/Controller.h +++ b/Kernel/Devices/Audio/IntelHDA/Controller.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -16,7 +17,6 @@ #include #include #include -#include namespace Kernel::Audio::IntelHDA { @@ -65,7 +65,7 @@ private: ErrorOr reset(); // ^AudioController - virtual LockRefPtr audio_channel(u32 index) const override; + virtual RefPtr audio_channel(u32 index) const override; virtual ErrorOr write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) override; virtual ErrorOr initialize(Badge) override; virtual ErrorOr set_pcm_output_sample_rate(size_t channel_index, u32 samples_per_second_rate) override; @@ -79,7 +79,7 @@ private: OwnPtr m_response_buffer; Vector> m_codecs {}; OwnPtr m_output_path; - LockRefPtr m_audio_channel; + RefPtr m_audio_channel; }; } diff --git a/Kernel/Devices/Audio/Management.h b/Kernel/Devices/Audio/Management.h index d5b772d8dc..703bdb8c39 100644 --- a/Kernel/Devices/Audio/Management.h +++ b/Kernel/Devices/Audio/Management.h @@ -9,10 +9,10 @@ #include #include #include +#include #include #include #include -#include namespace Kernel {