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 */