From 5080419b61129ba2c03ba707b8c5b55aed78ab29 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Mon, 19 Jun 2023 20:40:15 +0200 Subject: [PATCH] Kernel: Do not set a default sample rate for AC'97 Let's use the device's initial sample rate as our active sample rate and work from there. --- Kernel/Devices/Audio/AC97.cpp | 12 +++++++++--- Kernel/Devices/Audio/AC97.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Kernel/Devices/Audio/AC97.cpp b/Kernel/Devices/Audio/AC97.cpp index 3bffa78596..36a263a453 100644 --- a/Kernel/Devices/Audio/AC97.cpp +++ b/Kernel/Devices/Audio/AC97.cpp @@ -15,7 +15,6 @@ namespace Kernel { static constexpr int buffer_descriptor_list_max_entries = 32; -static constexpr u16 pcm_default_sample_rate = 44100; static constexpr u16 pcm_fixed_sample_rate = 48000; // Valid output range - with double-rate enabled, sample rate can go up to 96kHZ @@ -125,7 +124,8 @@ UNMAP_AFTER_INIT ErrorOr AC97::initialize(Badge) } m_mixer_io_window->write16(NativeAudioMixerRegister::ExtendedAudioStatusControl, extended_audio_status); - TRY(set_pcm_output_sample_rate(m_variable_rate_pcm_supported ? pcm_default_sample_rate : pcm_fixed_sample_rate)); + // Get the device's current sample rate + m_sample_rate = read_pcm_output_sample_rate(); // Left and right volume of 0 means attenuation of 0 dB set_master_output_volume(0, 0, Muted::No); @@ -144,6 +144,12 @@ void AC97::set_master_output_volume(u8 left_channel, u8 right_channel, Muted mut m_mixer_io_window->write16(NativeAudioMixerRegister::SetMasterOutputVolume, volume_value); } +u32 AC97::read_pcm_output_sample_rate() +{ + auto const double_rate_shift = m_double_rate_pcm_enabled ? 1 : 0; + return static_cast(m_mixer_io_window->read16(NativeAudioMixerRegister::PCMFrontDACRate)) << double_rate_shift; +} + ErrorOr AC97::set_pcm_output_sample_rate(u32 sample_rate) { if (m_sample_rate == sample_rate) @@ -157,7 +163,7 @@ ErrorOr AC97::set_pcm_output_sample_rate(u32 sample_rate) return ENOTSUP; m_mixer_io_window->write16(NativeAudioMixerRegister::PCMFrontDACRate, shifted_sample_rate); - m_sample_rate = static_cast(m_mixer_io_window->read16(NativeAudioMixerRegister::PCMFrontDACRate)) << double_rate_shift; + m_sample_rate = read_pcm_output_sample_rate(); dmesgln_pci(*this, "PCM front DAC rate set to {} Hz", m_sample_rate); diff --git a/Kernel/Devices/Audio/AC97.h b/Kernel/Devices/Audio/AC97.h index 9e1c5ea2d4..1b0ab9aecb 100644 --- a/Kernel/Devices/Audio/AC97.h +++ b/Kernel/Devices/Audio/AC97.h @@ -162,6 +162,7 @@ private: virtual bool handle_irq(RegisterState const&) override; void set_master_output_volume(u8, u8, Muted); + u32 read_pcm_output_sample_rate(); ErrorOr set_pcm_output_sample_rate(u32); void set_pcm_output_volume(u8, u8, Muted); ErrorOr write_single_buffer(UserOrKernelBuffer const&, size_t, size_t);