ALSA implementation
Jan Zerebecki
jan.wine at zerebecki.de
Thu Sep 21 23:12:37 CDT 2006
On Mon, Sep 18, 2006 at 01:58:59AM +0200, Jan Zerebecki wrote:
> I explained in a different mail to this thread what bugs are in
> winealsa. (Archive link to that mail is:
> http://www.winehq.org/pipermail/wine-devel/2006-September/050826.html )
> It seems I just found out how to fix the other winealsa problem I
> mentioned in that mail, I'm currently testing if it works.
The intention is to get the same buffer size (in bytes) for different
formats, because dsound expects this (according to our dsound tests).
I tried with the attached patch but
snd_pcm_hw_params_set_buffer_size_near sets different than the
requested size and snd_pcm_hw_params_set_buffer_size doesn't work
at all. I don't know if this is because I am not familiar with
the api or because of a bug in it. Can anyone shed some light on
this who is more familiar with the alsa-lib api?
Jan
-------------- next part --------------
From: Jan Zerebecki <jan.wine at zerebecki.de>
Changelog:
winmm/winealsa: set buffer size
---
dlls/winmm/winealsa/audio.c | 17 ++++++++---------
1 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/dlls/winmm/winealsa/audio.c b/dlls/winmm/winealsa/audio.c
index 9eec364..d29e596 100644
--- a/dlls/winmm/winealsa/audio.c
+++ b/dlls/winmm/winealsa/audio.c
@@ -2334,10 +2334,8 @@ static DWORD wodOpen(WORD wDevID, LPWAVE
snd_pcm_access_t access;
snd_pcm_format_t format = -1;
unsigned int rate;
- unsigned int buffer_time = 500000;
- unsigned int period_time = 10000;
- snd_pcm_uframes_t buffer_size;
- snd_pcm_uframes_t period_size;
+ snd_pcm_uframes_t buffer_size = 48000;
+ snd_pcm_uframes_t period_size = 1024;
int flags;
int err=0;
int dir=0;
@@ -2561,15 +2559,16 @@ #define EXIT_ON_ERROR(f,e,txt) do \
wwo->format.Format.nChannels,
getFormat(wwo->format.Format.wFormatTag));
- dir=0;
- EXIT_ON_ERROR( snd_pcm_hw_params_set_buffer_time_near(pcm, hw_params, &buffer_time, &dir), MMSYSERR_INVALPARAM, "unable to set buffer time");
- dir=0;
- EXIT_ON_ERROR( snd_pcm_hw_params_set_period_time_near(pcm, hw_params, &period_time, &dir), MMSYSERR_INVALPARAM, "unable to set period time");
+ buffer_size = buffer_size / ( snd_pcm_format_physical_width(format) * wwo->format.Format.nChannels );
+ snd_pcm_uframes_t buffer_size_old = buffer_size;
+ EXIT_ON_ERROR( snd_pcm_hw_params_set_buffer_size_near(pcm, hw_params, &buffer_size), MMSYSERR_INVALPARAM, "unable to set buffer size");
+ dir=0;
+ EXIT_ON_ERROR( snd_pcm_hw_params_set_period_size_near(pcm, hw_params, &period_size, &dir), MMSYSERR_INVALPARAM, "unable to set period time");
+ if(buffer_size != buffer_size_old) ERR("buffer_size:%i buffer_size_old:%i\n", (int)buffer_size, (int)buffer_size_old);
EXIT_ON_ERROR( snd_pcm_hw_params(pcm, hw_params), MMSYSERR_INVALPARAM, "unable to set hw params for playback");
err = snd_pcm_hw_params_get_period_size(hw_params, &period_size, &dir);
- err = snd_pcm_hw_params_get_buffer_size(hw_params, &buffer_size);
snd_pcm_sw_params_current(pcm, sw_params);
EXIT_ON_ERROR( snd_pcm_sw_params_set_start_threshold(pcm, sw_params, dwFlags & WAVE_DIRECTSOUND ? INT_MAX : 1 ), MMSYSERR_ERROR, "unable to set start threshold");
More information about the wine-devel
mailing list