aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2008-01-18 00:28:25 -0800
committerChris Robinson <[email protected]>2008-01-18 00:28:25 -0800
commit497ada9c77b5a8434a4fb09ab00251ee680b5340 (patch)
treed07bc3d09bce5f6bc438f24ae5457bd542de2571
parent73e386dc6f3fd6fb5c801fe39a9cc3d1984c23d1 (diff)
Buffer size fixes. Partially reverts the ALSA buffer size "fix"
-rw-r--r--Alc/ALc.c4
-rw-r--r--Alc/alsa.c24
-rw-r--r--openalrc.sample8
3 files changed, 21 insertions, 15 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index dfd6b4b9..5ff7a91c 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1172,9 +1172,9 @@ ALCAPI ALCdevice* ALCAPIENTRY alcOpenDevice(const ALCchar *deviceName)
device->FrameSize = aluBytesFromFormat(device->Format) *
device->Channels;
- device->UpdateFreq = GetConfigValueInt(NULL, "refresh", 0);
+ device->UpdateFreq = GetConfigValueInt(NULL, "refresh", 8192);
if((ALint)device->UpdateFreq <= 0)
- device->UpdateFreq = 8192 * device->Frequency / 22050;
+ device->UpdateFreq = 8192;
// Find a playback device to open
for(i = 0;BackendList[i].Init;i++)
diff --git a/Alc/alsa.c b/Alc/alsa.c
index 9b81ebed..9484cf2c 100644
--- a/Alc/alsa.c
+++ b/Alc/alsa.c
@@ -67,6 +67,7 @@ MAKE_FUNC(snd_pcm_hw_params_set_rate_near);
MAKE_FUNC(snd_pcm_hw_params_set_rate);
MAKE_FUNC(snd_pcm_hw_params_set_buffer_size_near);
MAKE_FUNC(snd_pcm_hw_params_set_buffer_size_min);
+MAKE_FUNC(snd_pcm_hw_params_get_period_size);
MAKE_FUNC(snd_pcm_hw_params_get_access);
MAKE_FUNC(snd_pcm_hw_params);
MAKE_FUNC(snd_pcm_prepare);
@@ -355,10 +356,8 @@ open_alsa:
AL_PRINT("Unknown format?! %x\n", device->Format);
}
- periods = GetConfigValueInt("alsa", "periods", 4);
- if((int)periods <= 0)
- periods = 4;
- bufferSizeInFrames = device->UpdateFreq / periods;
+ periods = GetConfigValueInt("alsa", "periods", 0);
+ bufferSizeInFrames = device->UpdateFreq;
str = GetConfigValue("alsa", "mmap", "true");
allowmmap = (strcasecmp(str, "true") == 0 ||
@@ -378,7 +377,7 @@ open_alsa:
/* set channels (implicitly sets frame bits) */
ok(psnd_pcm_hw_params_set_channels(data->pcmHandle, p, device->Channels), "set channels") &&
/* set periods (implicitly constrains period/buffer parameters) */
- ok(psnd_pcm_hw_params_set_periods_near(data->pcmHandle, p, &periods, NULL), "set periods near") &&
+ (!periods || ok(psnd_pcm_hw_params_set_periods_near(data->pcmHandle, p, &periods, NULL), "set periods near")) &&
/* set rate (implicitly constrains period/buffer parameters) */
ok(psnd_pcm_hw_params_set_rate_near(data->pcmHandle, p, &device->Frequency, NULL), "set rate near") &&
/* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */
@@ -403,6 +402,15 @@ open_alsa:
return ALC_FALSE;
}
+ if((i=psnd_pcm_hw_params_get_period_size(p, &bufferSizeInFrames, NULL)) < 0)
+ {
+ AL_PRINT("get_period_size failed: %s\n", psnd_strerror(i));
+ psnd_pcm_hw_params_free(p);
+ psnd_pcm_close(data->pcmHandle);
+ free(data);
+ return ALC_FALSE;
+ }
+
psnd_pcm_hw_params_free(p);
device->MaxNoOfSources = 256;
@@ -467,7 +475,6 @@ static ALCboolean alsa_open_capture(ALCdevice *pDevice, const ALCchar *deviceNam
{
snd_pcm_format_t alsaFormat;
snd_pcm_hw_params_t *p;
- unsigned int periods = 4;
snd_pcm_uframes_t bufferSizeInFrames;
alsa_data *data;
char driver[64];
@@ -534,7 +541,7 @@ open_alsa:
AL_PRINT("Unknown format?! %x\n", format);
}
- bufferSizeInFrames = SampleSize / periods;
+ bufferSizeInFrames = SampleSize;
psnd_pcm_hw_params_malloc(&p);
#define ok(func, str) (i=(func),((i<0)?(err=(str)),0:1))
@@ -546,8 +553,6 @@ open_alsa:
ok(psnd_pcm_hw_params_set_format(data->pcmHandle, p, alsaFormat), "set format") &&
/* set channels (implicitly sets frame bits) */
ok(psnd_pcm_hw_params_set_channels(data->pcmHandle, p, pDevice->Channels), "set channels") &&
- /* set periods (implicitly constrains period/buffer parameters) */
- ok(psnd_pcm_hw_params_set_periods_near(data->pcmHandle, p, &periods, NULL), "set periods near") &&
/* set rate (implicitly constrains period/buffer parameters) */
ok(psnd_pcm_hw_params_set_rate(data->pcmHandle, p, frequency, 0), "set rate") &&
/* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */
@@ -737,6 +742,7 @@ LOAD_FUNC(snd_pcm_hw_params_set_rate_near);
LOAD_FUNC(snd_pcm_hw_params_set_rate);
LOAD_FUNC(snd_pcm_hw_params_set_buffer_size_near);
LOAD_FUNC(snd_pcm_hw_params_set_buffer_size_min);
+LOAD_FUNC(snd_pcm_hw_params_get_period_size);
LOAD_FUNC(snd_pcm_hw_params_get_access);
LOAD_FUNC(snd_pcm_hw_params);
LOAD_FUNC(snd_pcm_prepare);
diff --git a/openalrc.sample b/openalrc.sample
index 0e33e648..4650e5a0 100644
--- a/openalrc.sample
+++ b/openalrc.sample
@@ -36,9 +36,8 @@ cf_level = 0 # Sets the crossfeed level for stereo output. Valid values are:
frequency = 44100 # Sets the output frequency. Default is 44100
-refresh = 0 # Sets the number of frames-per-update. Default is calculated as
- # 8192*frequency/22050. Note that the actual granularity may or
- # may not be less than this.
+refresh = 8192 # Sets the buffer size, in frames. Default is 8192. Note that
+ # the actual granularity may or may not be less than this.
drivers = # Sets the backend driver list order, comma-seperated. Unknown
# backends and duplicated names are ignored, and unlisted backends
@@ -50,7 +49,8 @@ drivers = # Sets the backend driver list order, comma-seperated. Unknown
device = default # Sets the device name for the default playback device.
# Default is default
-periods = 4 # Sets the number of update buffers. Default is 4
+periods = 0 # Sets the number of update buffers for playback. A value of 0
+ # means auto-select. Default is 0
capture = default # Sets the device name for the default capture device.
# Default is default