aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/alsa.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2009-03-13 22:16:01 -0700
committerChris Robinson <[email protected]>2009-03-13 22:16:01 -0700
commit89ddd7d8e5a3338467c72dce291d8b5531aa6ae2 (patch)
tree99a3bfc75abdef418b218f10177026c7ebf0566c /Alc/alsa.c
parent8d0c4ccb3b128348446f67b2e2895e51230d27b5 (diff)
Don't modify the device struct until playback succesfully starts
Diffstat (limited to 'Alc/alsa.c')
-rw-r--r--Alc/alsa.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/Alc/alsa.c b/Alc/alsa.c
index f609ab8d..c0e688c2 100644
--- a/Alc/alsa.c
+++ b/Alc/alsa.c
@@ -320,6 +320,7 @@ static ALCboolean alsa_open_playback(ALCdevice *device, const ALCchar *deviceNam
snd_pcm_hw_params_t *p = NULL;
snd_pcm_access_t access;
unsigned int periods;
+ unsigned int rate;
alsa_data *data;
char driver[64];
const char *str;
@@ -394,6 +395,7 @@ open_alsa:
periods = GetConfigValueInt("alsa", "periods", 0);
bufferSizeInFrames = device->UpdateSize;
+ rate = device->Frequency;
str = GetConfigValue("alsa", "mmap", "true");
allowmmap = (strcasecmp(str, "true") == 0 ||
@@ -415,7 +417,7 @@ open_alsa:
/* set periods (implicitly constrains period/buffer parameters) */
(!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") &&
+ ok(psnd_pcm_hw_params_set_rate_near(data->pcmHandle, p, &rate, NULL), "set rate near") &&
/* set buffer size in frame units (implicitly sets period size/bytes/time and buffer time/bytes) */
ok(psnd_pcm_hw_params_set_buffer_size_near(data->pcmHandle, p, &bufferSizeInFrames), "set buffer size near") &&
/* install and prepare hardware configuration */
@@ -449,8 +451,6 @@ open_alsa:
psnd_pcm_hw_params_free(p);
- device->UpdateSize = bufferSizeInFrames;
-
data->size = psnd_pcm_frames_to_bytes(data->pcmHandle, device->UpdateSize);
if(access == SND_PCM_ACCESS_RW_INTERLEAVED)
{
@@ -491,6 +491,9 @@ open_alsa:
return ALC_FALSE;
}
+ device->UpdateSize = bufferSizeInFrames;
+ device->Frequency = rate;
+
return ALC_TRUE;
}