From fa48b9d88548b5c63330f811aa57d07a9bf020ec Mon Sep 17 00:00:00 2001 From: "Ithamar R. Adema" Date: Thu, 17 May 2007 11:16:05 +0000 Subject: [PATCH] Fixed the problem of not being able to work from Haiku. The main problem was that although the multi_audio API on BeOS hands the driver the settings as made in the Media prefs, the Haiku one just gives maximum values and assumes the driver will scale the values down. I didn't do that. If you run Haiku on HDA hardware, you should have sound now too! :) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21161 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/audio/hda/driver.h | 3 +++ .../drivers/audio/hda/hda_multi_audio.c | 21 +++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/hda/driver.h b/src/add-ons/kernel/drivers/audio/hda/driver.h index 3f3719af9b..ebaf68af7f 100644 --- a/src/add-ons/kernel/drivers/audio/hda/driver.h +++ b/src/add-ons/kernel/drivers/audio/hda/driver.h @@ -30,6 +30,9 @@ #define MAX_CODEC_RESPONSES 10 #define MAXINPUTS 32 +/* FIXME: Find out why we need so much! */ +#define DEFAULT_FRAMESPERBUF 4096 + typedef struct hda_controller_s hda_controller; typedef struct hda_codec_s hda_codec; typedef struct hda_afg_s hda_afg; diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.c b/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.c index 8a749f52e5..e925adbbcb 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.c +++ b/src/add-ons/kernel/drivers/audio/hda/hda_multi_audio.c @@ -153,12 +153,25 @@ get_buffers(hda_afg* afg, multi_buffer_list* data) dprintf("%s: record: %ld buffers, %ld channels, %ld samples\n", __func__, data->request_record_buffers, data->request_record_channels, data->request_record_buffer_size); + /* Workaround for Haiku multi_audio API, since it prefers to let the driver pick + values, while the BeOS multi_audio actually gives the user's defaults. */ if (data->request_playback_buffers > STRMAXBUF || - data->request_playback_buffers < STRMINBUF || - data->request_record_buffers > STRMAXBUF || - data->request_record_buffers < STRMINBUF) { - return B_BAD_VALUE; + data->request_playback_buffers < STRMINBUF) { + data->request_playback_buffers = STRMINBUF; } + + if (data->request_record_buffers > STRMAXBUF || + data->request_record_buffers < STRMINBUF) { + data->request_record_buffers = STRMINBUF; + } + + if (data->request_playback_buffer_size == 0) + data->request_playback_buffer_size = DEFAULT_FRAMESPERBUF; + + if (data->request_record_buffer_size == 0) + data->request_record_buffer_size = DEFAULT_FRAMESPERBUF; + + /* ... from here on, we can assume again that a reasonable request is being made */ data->flags = 0;