From 1f5d96afb85daf74cabf5eb517d56ff408ddc266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 21 Aug 2009 21:55:40 +0000 Subject: [PATCH] we now print a warning message in the log when the interrupt comes in the second half of a buffer: this should mean the interrupt comes earlier than expected. Please report such warnings, they can help to investigate timing issues with some hda codecs. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32589 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/audio/hda/driver.h | 1 + .../kernel/drivers/audio/hda/hda_controller.cpp | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/hda/driver.h b/src/add-ons/kernel/drivers/audio/hda/driver.h index 2c3c55ef4d..0fe8000329 100644 --- a/src/add-ons/kernel/drivers/audio/hda/driver.h +++ b/src/add-ons/kernel/drivers/audio/hda/driver.h @@ -130,6 +130,7 @@ struct hda_stream { bool running; spinlock lock; /* Write lock */ uint32 type; + int32 warn_count; hda_controller* controller; diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp index 6bddce1c43..df0da37ef6 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -104,7 +104,8 @@ stream_handle_interrupt(hda_controller* controller, hda_stream* stream) } position = stream->Read32(HDAC_STREAM_POSITION); - bufferSize = ALIGN(stream->sample_size * stream->num_channels * stream->buffer_length, 128); + bufferSize = ALIGN(stream->sample_size * stream->num_channels + * stream->buffer_length, 128); // Buffer Completed Interrupt acquire_spinlock(&stream->lock); @@ -117,7 +118,12 @@ stream_handle_interrupt(hda_controller* controller, hda_stream* stream) release_sem_etc(controller->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE); - //dprintf("stream_handle_interrupt %d %d %ld\n", stream->id, stream->buffer_cycle, position); + if (stream->warn_count < 20 + && (position - stream->buffer_cycle * bufferSize) > (bufferSize >> 1)) { + dprintf("hda: stream incorrect position %ld %ld %ld\n", + stream->id, stream->buffer_cycle, position); + stream->warn_count++; + } } @@ -414,6 +420,7 @@ hda_stream_new(hda_audio_group* audioGroup, int type) stream->buffer_descriptors_area = B_ERROR; stream->type = type; stream->controller = controller; + stream->warn_count = 0; switch (type) { case STREAM_PLAYBACK: