Kernel: Don't stop audio processing after each entry in AC97

This commit is contained in:
Bananymous 2025-08-06 01:48:42 +03:00
parent d1c814cf9d
commit 7ad3f967db
2 changed files with 13 additions and 14 deletions

View File

@ -28,7 +28,7 @@ namespace Kernel
BAN::ErrorOr<void> initialize_bld(); BAN::ErrorOr<void> initialize_bld();
BAN::ErrorOr<void> initialize_interrupts(); BAN::ErrorOr<void> initialize_interrupts();
void queue_samples_to_bld(); bool queue_samples_to_bld();
private: private:
static constexpr size_t m_bdl_entries = 32; static constexpr size_t m_bdl_entries = 32;

View File

@ -185,14 +185,10 @@ namespace Kernel
void AC97AudioController::handle_new_data() void AC97AudioController::handle_new_data()
{ {
ASSERT(m_spinlock.current_processor_has_lock()); ASSERT(m_spinlock.current_processor_has_lock());
if (m_bdl_head != m_bdl_tail)
return;
queue_samples_to_bld(); queue_samples_to_bld();
} }
void AC97AudioController::queue_samples_to_bld() bool AC97AudioController::queue_samples_to_bld()
{ {
ASSERT(m_spinlock.current_processor_has_lock()); ASSERT(m_spinlock.current_processor_has_lock());
@ -228,7 +224,7 @@ namespace Kernel
// if head was not updated, no data was queued // if head was not updated, no data was queued
if (lvi == m_bdl_head) if (lvi == m_bdl_head)
return; return false;
m_sample_data_blocker.unblock(); m_sample_data_blocker.unblock();
@ -238,6 +234,8 @@ namespace Kernel
const uint8_t control = m_bus_master->read8(BusMasterRegister::PO_CR); const uint8_t control = m_bus_master->read8(BusMasterRegister::PO_CR);
if (!(control & RDBM)) if (!(control & RDBM))
m_bus_master->write8(BusMasterRegister::PO_CR, control | RDBM); m_bus_master->write8(BusMasterRegister::PO_CR, control | RDBM);
return true;
} }
void AC97AudioController::handle_irq() void AC97AudioController::handle_irq()
@ -249,17 +247,18 @@ namespace Kernel
SpinLockGuard _(m_spinlock); SpinLockGuard _(m_spinlock);
if (status & LVBCI) bool did_enqueue = false;
if (status & BCIS)
{
m_bdl_tail = (m_bdl_tail + 1) % m_bdl_entries;
did_enqueue = queue_samples_to_bld();
}
if ((status & LVBCI) && !did_enqueue)
{ {
const uint8_t control = m_bus_master->read8(BusMasterRegister::PO_CR); const uint8_t control = m_bus_master->read8(BusMasterRegister::PO_CR);
m_bus_master->write8(BusMasterRegister::PO_CR, control & ~RDBM); m_bus_master->write8(BusMasterRegister::PO_CR, control & ~RDBM);
} }
if (status & BCIS)
{
m_bdl_tail = (m_bdl_tail + 1) % m_bdl_entries;
queue_samples_to_bld();
}
} }
} }