1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 17:47:36 +00:00

Kernel: Allow higher audio sample rates than 65kHZ (u16)

Executing `asctl set r 96000` no longer results in weird sample rates
being set on the audio devices. SB16 checks for a sample rate between 1
and 44100 Hz, while AC97 implements double-rate support which allows
sample rates between 8kHz and 96kHZ.
This commit is contained in:
Jelle Raaijmakers 2021-11-24 12:20:20 +01:00 committed by Andreas Kling
parent c349634967
commit f97c9a5968
9 changed files with 56 additions and 28 deletions

View file

@ -43,14 +43,20 @@ private:
SetMasterOutputVolume = 0x02,
SetPCMOutputVolume = 0x18,
ExtendedAudioID = 0x28,
ExtendedAudioStatusControl = 0x2a,
PCMFrontDACRate = 0x2c,
};
enum ExtendedAudioMask : u16 {
VariableRatePCMAudio = 1 << 0,
DoubleRatePCMAudio = 1 << 1,
Revision = 3 << 10,
};
enum ExtendedAudioStatusControlFlag : u16 {
DoubleRateAudio = 1 << 1,
};
enum AC97Revision : u8 {
Revision21OrEarlier = 0b00,
Revision22 = 0b01,
@ -150,12 +156,13 @@ private:
void initialize();
void reset_pcm_out();
void set_master_output_volume(u8, u8, Muted);
void set_pcm_output_sample_rate(u16);
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);
OwnPtr<Memory::Region> m_buffer_descriptor_list;
u8 m_buffer_descriptor_list_index = 0;
bool m_double_rate_pcm_enabled = false;
IOAddress m_io_mixer_base;
IOAddress m_io_bus_base;
WaitQueue m_irq_queue;
@ -163,7 +170,7 @@ private:
u8 m_output_buffer_page_count = 4;
u8 m_output_buffer_page_index = 0;
AC97Channel m_pcm_out_channel;
u16 m_sample_rate = 44100;
u32 m_sample_rate = 44100;
};
}