* 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
This commit is contained in:
Stephan Aßmus 2009-03-07 10:23:52 +00:00
parent db90fa7022
commit 0bd93b7def
3 changed files with 44 additions and 6 deletions

View File

@ -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

View File

@ -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},
};

View File

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