mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:17:34 +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:
parent
8b129476b1
commit
7126a42d4d
2 changed files with 10 additions and 11 deletions
|
@ -65,6 +65,8 @@ SB16& SB16::the()
|
||||||
|
|
||||||
void SB16::initialize()
|
void SB16::initialize()
|
||||||
{
|
{
|
||||||
|
disable_irq();
|
||||||
|
|
||||||
IO::out8(0x226, 1);
|
IO::out8(0x226, 1);
|
||||||
IO::delay();
|
IO::delay();
|
||||||
IO::out8(0x226, 0);
|
IO::out8(0x226, 0);
|
||||||
|
@ -81,7 +83,6 @@ void SB16::initialize()
|
||||||
auto vmin = dsp_read();
|
auto vmin = dsp_read();
|
||||||
|
|
||||||
kprintf("SB16: found version %d.%d\n", m_major_version, vmin);
|
kprintf("SB16: found version %d.%d\n", m_major_version, vmin);
|
||||||
enable_irq();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SB16::can_read(const FileDescription&) const
|
bool SB16::can_read(const FileDescription&) const
|
||||||
|
@ -134,16 +135,15 @@ void SB16::handle_irq()
|
||||||
if (m_major_version >= 4)
|
if (m_major_version >= 4)
|
||||||
IO::in8(DSP_R_ACK); // 16 bit interrupt
|
IO::in8(DSP_R_ACK); // 16 bit interrupt
|
||||||
|
|
||||||
m_interrupted = true;
|
m_irq_queue.wake_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SB16::wait_for_irq()
|
void SB16::wait_for_irq()
|
||||||
{
|
{
|
||||||
// Well, we have no way of knowing how much got written. So just hope all of
|
cli();
|
||||||
// it did, even if we're interrupted.
|
enable_irq();
|
||||||
(void)current->block_until("Interrupting", [this] {
|
current->wait_on(m_irq_queue);
|
||||||
return m_interrupted;
|
disable_irq();
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t SB16::write(FileDescription&, const u8* data, ssize_t length)
|
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;
|
u8 mode = (u8)SampleFormat::Signed | (u8)SampleFormat::Stereo;
|
||||||
|
|
||||||
disable_irq();
|
|
||||||
const int sample_rate = 44100;
|
const int sample_rate = 44100;
|
||||||
set_sample_rate(sample_rate);
|
set_sample_rate(sample_rate);
|
||||||
memcpy(m_dma_buffer_page->paddr().as_ptr(), data, length);
|
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);
|
||||||
dsp_write((u8)(sample_count >> 8));
|
dsp_write((u8)(sample_count >> 8));
|
||||||
|
|
||||||
m_interrupted = false;
|
|
||||||
enable_irq();
|
|
||||||
wait_for_irq();
|
wait_for_irq();
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <Kernel/IRQHandler.h>
|
#include <Kernel/IRQHandler.h>
|
||||||
#include <Kernel/VM/PhysicalAddress.h>
|
#include <Kernel/VM/PhysicalAddress.h>
|
||||||
#include <Kernel/VM/PhysicalPage.h>
|
#include <Kernel/VM/PhysicalPage.h>
|
||||||
|
#include <Kernel/WaitQueue.h>
|
||||||
|
|
||||||
class SB16;
|
class SB16;
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ private:
|
||||||
u8 dsp_read();
|
u8 dsp_read();
|
||||||
|
|
||||||
RefPtr<PhysicalPage> m_dma_buffer_page;
|
RefPtr<PhysicalPage> m_dma_buffer_page;
|
||||||
bool m_interrupted { false };
|
|
||||||
int m_major_version { 0 };
|
int m_major_version { 0 };
|
||||||
|
|
||||||
|
WaitQueue m_irq_queue;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue