summaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2009-09-12 18:19:52 -0700
committerChris Robinson <[email protected]>2009-09-12 18:19:52 -0700
commite25b01c3a2b7e7b3b419c376e63ccae172c268bc (patch)
tree57760ce6767f5ed0f1e0a989bb5021dda5cec8a3 /Alc
parentb29a24afb06724e47d47597a88f93e01044418e7 (diff)
Start Solaris playback when a context is ready
Diffstat (limited to 'Alc')
-rw-r--r--Alc/solaris.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/Alc/solaris.c b/Alc/solaris.c
index b5659608..9ac00d8d 100644
--- a/Alc/solaris.c
+++ b/Alc/solaris.c
@@ -92,10 +92,7 @@ static ALuint SolarisProc(ALvoid *ptr)
static ALCboolean solaris_open_playback(ALCdevice *device, const ALCchar *deviceName)
{
- audio_info_t info;
- ALuint frameSize;
char driver[64];
- int numChannels;
solaris_data *data;
strncpy(driver, GetConfigValue("solaris", "device", "/dev/audio"), sizeof(driver)-1);
@@ -116,10 +113,29 @@ static ALCboolean solaris_open_playback(ALCdevice *device, const ALCchar *device
return ALC_FALSE;
}
- numChannels = aluChannelsFromFormat(device->Format);
+ device->szDeviceName = strdup(deviceName);
+ device->ExtraData = data;
+ return ALC_TRUE;
+}
+
+static void solaris_close_playback(ALCdevice *device)
+{
+ solaris_data *data = (solaris_data*)device->ExtraData;
+
+ close(data->fd);
+ free(data);
+ device->ExtraData = NULL;
+}
+
+static ALCboolean solaris_start_context(ALCdevice *device, ALCcontext *context)
+{
+ solaris_data *data = (solaris_data*)device->ExtraData;
+ audio_info_t info;
+ ALuint frameSize;
+ int numChannels;
+ (void)context;
+
AUDIO_INITINFO(&info);
- info.play.sample_rate = device->Frequency;
- info.play.channels = numChannels;
switch(aluBytesFromFormat(device->Format))
{
@@ -146,22 +162,22 @@ static ALCboolean solaris_open_playback(ALCdevice *device, const ALCchar *device
AL_PRINT("Unknown format?! %x\n", device->Format);
}
+ numChannels = aluChannelsFromFormat(device->Format);
+ info.play.sample_rate = device->Frequency;
+ info.play.channels = numChannels;
+
frameSize = numChannels * aluBytesFromFormat(device->Format);
info.play.buffer_size = device->BufferSize * frameSize;
if(ioctl(data->fd, AUDIO_SETINFO, &info) < 0)
{
AL_PRINT("ioctl failed: %s\n", strerror(errno));
- close(data->fd);
- free(data);
return ALC_FALSE;
}
if(aluChannelsFromFormat(device->Format) != info.play.channels)
{
AL_PRINT("Could not set %d channels, got %d instead\n", aluChannelsFromFormat(device->Format), info.play.channels);
- close(data->fd);
- free(data);
return ALC_FALSE;
}
@@ -169,8 +185,6 @@ static ALCboolean solaris_open_playback(ALCdevice *device, const ALCchar *device
(info.play.precision == 16 && aluBytesFromFormat(device->Format) == 2)))
{
AL_PRINT("Could not set %d-bit output, got %d\n", aluBytesFromFormat(device->Format)*8, info.play.precision);
- close(data->fd);
- free(data);
return ALC_FALSE;
}
@@ -180,43 +194,31 @@ static ALCboolean solaris_open_playback(ALCdevice *device, const ALCchar *device
data->data_size = device->UpdateSize * frameSize;
data->mix_data = calloc(1, data->data_size);
- device->ExtraData = data;
data->thread = StartThread(SolarisProc, device);
if(data->thread == NULL)
{
- device->ExtraData = NULL;
free(data->mix_data);
- free(data);
+ data->mix_data = NULL;
return ALC_FALSE;
}
- device->szDeviceName = strdup(deviceName);
return ALC_TRUE;
}
-static void solaris_close_playback(ALCdevice *device)
+static void solaris_stop_context(ALCdevice *device, ALCcontext *context)
{
solaris_data *data = (solaris_data*)device->ExtraData;
+ (void)context;
+
+ if(!data->thread)
+ return;
+
data->killNow = 1;
StopThread(data->thread);
-
- close(data->fd);
+ data->thread = NULL;
free(data->mix_data);
- free(data);
- device->ExtraData = NULL;
-}
-
-static ALCboolean solaris_start_context(ALCdevice *device, ALCcontext *context)
-{
- device->Frequency = context->fFrequency;
- return ALC_TRUE;
-}
-
-static void solaris_stop_context(ALCdevice *device, ALCcontext *context)
-{
- (void)device;
- (void)context;
+ data->mix_data = NULL;
}