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.
This commit is contained in:
Jelle Raaijmakers 2023-06-19 20:40:15 +02:00 committed by Andreas Kling
parent 5ef01e562a
commit 5080419b61
Notes: sideshowbarker 2024-07-17 01:27:18 +09:00
2 changed files with 10 additions and 3 deletions

View file

@ -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<void> AC97::initialize(Badge<AudioManagement>)
}
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<u32>(m_mixer_io_window->read16(NativeAudioMixerRegister::PCMFrontDACRate)) << double_rate_shift;
}
ErrorOr<void> AC97::set_pcm_output_sample_rate(u32 sample_rate)
{
if (m_sample_rate == sample_rate)
@ -157,7 +163,7 @@ ErrorOr<void> 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<u32>(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);

View file

@ -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<void> set_pcm_output_sample_rate(u32);
void set_pcm_output_volume(u8, u8, Muted);
ErrorOr<void> write_single_buffer(UserOrKernelBuffer const&, size_t, size_t);