1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:17:35 +00:00

Kernel: Use a WaitQueue in the SoundBlaster 16 driver

Instead of waking up to check for IRQ's regularly, use a WaitQueue and
wake it up in the IRQ handler.
This commit is contained in:
Andreas Kling 2019-12-01 12:53:19 +01:00
parent 8b129476b1
commit 7126a42d4d
2 changed files with 10 additions and 11 deletions

View file

@ -65,6 +65,8 @@ SB16& SB16::the()
void SB16::initialize()
{
disable_irq();
IO::out8(0x226, 1);
IO::delay();
IO::out8(0x226, 0);
@ -81,7 +83,6 @@ void SB16::initialize()
auto vmin = dsp_read();
kprintf("SB16: found version %d.%d\n", m_major_version, vmin);
enable_irq();
}
bool SB16::can_read(const FileDescription&) const
@ -134,16 +135,15 @@ void SB16::handle_irq()
if (m_major_version >= 4)
IO::in8(DSP_R_ACK); // 16 bit interrupt
m_interrupted = true;
m_irq_queue.wake_all();
}
void SB16::wait_for_irq()
{
// Well, we have no way of knowing how much got written. So just hope all of
// it did, even if we're interrupted.
(void)current->block_until("Interrupting", [this] {
return m_interrupted;
});
cli();
enable_irq();
current->wait_on(m_irq_queue);
disable_irq();
}
ssize_t SB16::write(FileDescription&, const u8* data, ssize_t length)
@ -162,7 +162,6 @@ ssize_t SB16::write(FileDescription&, const u8* data, ssize_t length)
u8 mode = (u8)SampleFormat::Signed | (u8)SampleFormat::Stereo;
disable_irq();
const int sample_rate = 44100;
set_sample_rate(sample_rate);
memcpy(m_dma_buffer_page->paddr().as_ptr(), data, length);
@ -183,8 +182,6 @@ ssize_t SB16::write(FileDescription&, const u8* data, ssize_t length)
dsp_write((u8)sample_count);
dsp_write((u8)(sample_count >> 8));
m_interrupted = false;
enable_irq();
wait_for_irq();
return length;
}