From 0bd93b7def8c10073f2cec8dad5caeb844acdb78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 7 Mar 2009 10:23:52 +0000 Subject: [PATCH] * Use a default buffer frame count that is adapted to the sample rate of the audio group. This is supposed to keep the latency about the same regardless of sample rate and lessen the requirements on the system performance when using higher sample rates. Currently the multi-audio addon uses the highest available rate. * Added TODO about the highest sample rate seemingly being forgotten in one place. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29421 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/audio/hda/driver.h | 2 - .../drivers/audio/hda/hda_controller.cpp | 2 + .../drivers/audio/hda/hda_multi_audio.cpp | 46 +++++++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/hda/driver.h b/src/add-ons/kernel/drivers/audio/hda/driver.h index 6ccb8cffb5..9e643231d4 100644 --- a/src/add-ons/kernel/drivers/audio/hda/driver.h +++ b/src/add-ons/kernel/drivers/audio/hda/driver.h @@ -43,8 +43,6 @@ #define MAX_ASSOCIATIONS 16 #define MAX_ASSOCIATION_PINS 16 -#define DEFAULT_FRAMES_PER_BUFFER 2048 - #define STREAM_MAX_BUFFERS 10 #define STREAM_MIN_BUFFERS 2 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 c68f00ca2e..817a7e7945 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -45,6 +45,8 @@ static const struct { {B_SR_96000, MAKE_RATE(48000, 2, 1), 96000}, {B_SR_176400, MAKE_RATE(44100, 4, 1), 176400}, {B_SR_192000, MAKE_RATE(48000, 4, 1), 192000}, +// TODO: What about this one? +// {B_SR_384000, MAKE_RATE(44100, ??, ??), 384000}, }; diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp index ffaa633731..50ab6ed6de 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.cpp @@ -672,6 +672,40 @@ set_mix(hda_audio_group* audioGroup, multi_mix_value_info * mmvi) } +static uint32 +default_buffer_length_for_rate(uint32 rate) +{ + // keep the latency about the same as 2048 frames per buffer at 44100 kHz + switch (rate) { + case B_SR_8000: + return 512; + case B_SR_11025: + return 512; + case B_SR_16000: + return 1024; + case B_SR_22050: + return 1024; + case B_SR_32000: + return 2048; + case B_SR_44100: + return 2048; + case B_SR_48000: + return 2048; + case B_SR_88200: + return 4096; + case B_SR_96000: + return 6144; + case B_SR_176400: + return 8192; + case B_SR_192000: + return 10240; + case B_SR_384000: + return 16384; + } + return 2048; +}; + + static status_t get_buffers(hda_audio_group* audioGroup, multi_buffer_list* data) { @@ -702,11 +736,15 @@ get_buffers(hda_audio_group* audioGroup, multi_buffer_list* data) || data->return_record_buffers < STREAM_MIN_BUFFERS) data->return_record_buffers = STREAM_MIN_BUFFERS; - if (data->return_playback_buffer_size == 0) - data->return_playback_buffer_size = DEFAULT_FRAMES_PER_BUFFER; + if (data->return_playback_buffer_size == 0) { + data->return_playback_buffer_size = default_buffer_length_for_rate( + audioGroup->playback_stream->sample_rate); + } - if (data->return_record_buffer_size == 0) - data->return_record_buffer_size = DEFAULT_FRAMES_PER_BUFFER; + if (data->return_record_buffer_size == 0) { + data->return_record_buffer_size = default_buffer_length_for_rate( + audioGroup->record_stream->sample_rate); + } /* ... from here on, we can assume again that a reasonable request is being made */