Initial patch for openal.

This commit is contained in:
Scott McCreary
2010-09-22 05:21:49 +00:00
parent 83c7c978df
commit 042087d61e

View File

@@ -0,0 +1,346 @@
diff -Naur openal-soft-1.12.854/Alc/ALc.c openal-soft-1.12.854-haiku/Alc/ALc.c
--- openal-soft-1.12.854/Alc/ALc.c 2010-03-30 05:00:12.029884416 +0000
+++ openal-soft-1.12.854-haiku/Alc/ALc.c 2010-08-16 18:07:11.204472320 +0000
@@ -60,6 +60,9 @@
#ifdef HAVE_SOLARIS
{ "solaris", alc_solaris_init, alc_solaris_deinit, alc_solaris_probe, EmptyFuncs },
#endif
+#ifdef HAVE_HAIKU
+ { "haiku", alc_haiku_init, alc_haiku_deinit, alc_haiku_probe, EmptyFuncs },
+#endif
#ifdef HAVE_DSOUND
{ "dsound", alcDSoundInit, alcDSoundDeinit, alcDSoundProbe, EmptyFuncs },
#endif
diff -Naur openal-soft-1.12.854/Alc/haiku.cxx openal-soft-1.12.854-haiku/Alc/haiku.cxx
--- openal-soft-1.12.854/Alc/haiku.cxx 1970-01-01 00:00:00.000000000 +0000
+++ openal-soft-1.12.854-haiku/Alc/haiku.cxx 2010-08-16 18:06:36.999030784 +0000
@@ -0,0 +1,242 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 1999-2007 by authors.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <memory.h>
+#include <unistd.h>
+#include <errno.h>
+#include <math.h>
+
+#include "alMain.h"
+#include "AL/al.h"
+#include "AL/alc.h"
+
+#include <Application.h>
+#include <SoundPlayer.h>
+#include <signal.h>
+#include <OS.h>
+
+static const ALCchar haiku_device[] = "Haiku Software";
+
+typedef struct {
+ BSoundPlayer *player;
+ ALCdevice *device;
+} haiku_data;
+
+static void
+BufferProc(void *theCookie, void *buffer, size_t size,
+ const media_raw_audio_format &format) {
+
+ haiku_data *data = (haiku_data *) theCookie;
+
+ if (!data) {
+ memset(buffer, size, 0); // fill with silence cookie bad
+ return;
+ }
+
+ if (!data->device) {
+ memset(buffer, size, 0); // fill with silence device not setup
+ return;
+ }
+
+ if (data->device->Connected) {
+ if (data->device->UpdateSize >= size) {
+ // Now fill the buffer with sound!
+ aluMixData(data->device, buffer, size);
+ } else {
+ memset(buffer, size, 0); // fill with silence not enough data for a buffer
+ }
+ } else {
+ memset(buffer, size, 0); // fill with silence device not connected
+ }
+}
+
+static ALCboolean haiku_open_playback(ALCdevice *device, const ALCchar *deviceName)
+{
+ haiku_data *data;
+
+ if (!deviceName)
+ deviceName = haiku_device;
+ else if (strcmp(deviceName, haiku_device) != 0)
+ return ALC_FALSE;
+
+ data = (haiku_data*)calloc(1, sizeof(haiku_data));
+
+ data->device = device;
+
+ device->szDeviceName = strdup(deviceName);
+ device->ExtraData = data;
+
+ return ALC_TRUE;
+}
+
+static void haiku_close_playback(ALCdevice *device)
+{
+ haiku_data *data = (haiku_data*)device->ExtraData;
+
+ data->device = NULL;
+
+ if (data->player) {
+ data->player->Stop();
+ delete data->player;
+ data->player = NULL;
+ }
+
+ free(data);
+ device->ExtraData = NULL;
+}
+
+static ALCboolean haiku_reset_playback(ALCdevice *device)
+{
+ haiku_data *data = (haiku_data*)device->ExtraData;
+ ALuint frameSize;
+ int numChannels;
+
+ numChannels = aluChannelsFromFormat(device->Format);
+ frameSize = numChannels * aluBytesFromFormat(device->Format);
+
+ media_raw_audio_format format;
+ format = media_raw_audio_format::wildcard;
+ format.frame_rate = device->Frequency;
+ format.channel_count = numChannels;
+
+ switch(aluBytesFromFormat(device->Format)) {
+ case 1:
+ format.format = media_raw_audio_format::B_AUDIO_UCHAR; // port audio suggests uchar
+ format.byte_order = B_MEDIA_LITTLE_ENDIAN; // Not relevant for single byte types
+ break;
+ case 2:
+ format.format = media_raw_audio_format::B_AUDIO_SHORT;
+ format.byte_order = B_MEDIA_LITTLE_ENDIAN; // Important here but this is a guess
+ break;
+ case 4:
+ format.format = media_raw_audio_format::B_AUDIO_FLOAT;
+ format.byte_order = B_MEDIA_LITTLE_ENDIAN; // Important here but this is a guess
+ break;
+ default:
+ return ALC_FALSE;
+ }
+
+ format.buffer_size = device->UpdateSize * device->NumUpdates * frameSize;
+
+ printf("Setup format of Rate(%.0f) Channels (%ld) ByteSize(%d) Buffer(%ld)\n",
+ format.frame_rate, format.channel_count, aluBytesFromFormat(device->Format), format.buffer_size);
+
+ data->player = new BSoundPlayer(&format, "ALplayer", BufferProc, NULL, &data);
+ data->player->SetVolume(1.0);
+ data->player->SetHasData(true);
+ data->player->Start();
+
+ return ALC_TRUE;
+}
+
+static void haiku_stop_playback(ALCdevice *device)
+{
+ haiku_data *data = (haiku_data*)device->ExtraData;
+
+ if (!data->player)
+ return;
+
+ data->player->Stop();
+ delete data->player;
+ data->player = NULL;
+}
+
+
+static ALCboolean haiku_open_capture(ALCdevice *device, const ALCchar *deviceName)
+{
+ (void)device;
+ (void)deviceName;
+ return ALC_FALSE;
+}
+
+static void haiku_close_capture(ALCdevice *device)
+{
+ (void)device;
+}
+
+static void haiku_start_capture(ALCdevice *pDevice)
+{
+ (void)pDevice;
+}
+
+static void haiku_stop_capture(ALCdevice *pDevice)
+{
+ (void)pDevice;
+}
+
+static void haiku_capture_samples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples)
+{
+ (void)pDevice;
+ (void)pBuffer;
+ (void)lSamples;
+}
+
+static ALCuint haiku_available_samples(ALCdevice *pDevice)
+{
+ (void)pDevice;
+ return 0;
+}
+
+BackendFuncs haiku_funcs = {
+ haiku_open_playback,
+ haiku_close_playback,
+ haiku_reset_playback,
+ haiku_stop_playback,
+ haiku_open_capture,
+ haiku_close_capture,
+ haiku_start_capture,
+ haiku_stop_capture,
+ haiku_capture_samples,
+ haiku_available_samples
+};
+
+void alc_haiku_init(BackendFuncs *func_list)
+{
+ /* BSoundPlayer requires a BApplication object */
+ new BApplication("application/x-vnd.ALplayer");
+
+ *func_list = haiku_funcs;
+}
+
+void alc_haiku_deinit(void)
+{
+}
+
+void alc_haiku_probe(int type)
+{
+#ifdef HAVE_STAT
+ struct stat buf;
+ if(stat(GetConfigValue("haiku", "device", "/dev/audio"), &buf) != 0)
+ return;
+#endif
+
+ if(type == DEVICE_PROBE)
+ AppendDeviceList(haiku_device);
+ else if(type == ALL_DEVICE_PROBE)
+ AppendAllDeviceList(haiku_device);
+}
diff -Naur openal-soft-1.12.854/CMakeLists.txt openal-soft-1.12.854-haiku/CMakeLists.txt
--- openal-soft-1.12.854/CMakeLists.txt 2010-03-30 05:03:34.024117248 +0000
+++ openal-soft-1.12.854-haiku/CMakeLists.txt 2010-08-16 18:08:22.231211008 +0000
@@ -13,13 +13,14 @@
INCLUDE(CheckSharedLibraryExists)
INCLUDE(CheckIncludeFile)
INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckCXXSourceCompiles)
INCLUDE(CheckSymbolExists)
INCLUDE(CheckCCompilerFlag)
INCLUDE(CheckCSourceCompiles)
INCLUDE(CheckTypeSize)
-PROJECT(OpenAL C)
+PROJECT(OpenAL)
SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
@@ -28,6 +29,7 @@
OPTION(ALSA "Check for ALSA backend" ON)
OPTION(OSS "Check for OSS backend" ON)
OPTION(SOLARIS "Check for Solaris backend" ON)
+OPTION(HAIKU "Check for Haiku backend" ON)
OPTION(DSOUND "Check for DirectSound backend" ON)
OPTION(WINMM "Check for Windows Multimedia backend" ON)
OPTION(PORTAUDIO "Check for PortAudio backend" ON)
@@ -347,6 +349,24 @@
ENDIF()
ENDIF()
+# Check Haiku backend
+IF(HAIKU)
+ CHECK_CXX_SOURCE_COMPILES("#include <SoundPlayer.h>
+ int main(void)
+ {
+ BSoundPlayer *player;
+ return 0;
+ }
+ " HAVE_SOUND_PLAYER_H)
+ IF(HAVE_SOUND_PLAYER_H)
+ SET(HAVE_HAIKU 1)
+ SET(ALC_OBJS ${ALC_OBJS} Alc/haiku.cxx)
+ SET(BACKENDS "${BACKENDS} Haiku,")
+ SET(EXTRA_LIBS be ${EXTRA_LIBS})
+ SET(EXTRA_LIBS media ${EXTRA_LIBS})
+ ENDIF()
+ENDIF()
+
# Check DSound/MMSystem backend
IF(DSOUND)
CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
diff -Naur openal-soft-1.12.854/OpenAL32/Include/alMain.h openal-soft-1.12.854-haiku/OpenAL32/Include/alMain.h
--- openal-soft-1.12.854/OpenAL32/Include/alMain.h 2010-03-26 01:36:26.025690112 +0000
+++ openal-soft-1.12.854-haiku/OpenAL32/Include/alMain.h 2010-08-16 18:09:12.255328256 +0000
@@ -209,6 +209,9 @@
void alc_solaris_init(BackendFuncs *func_list);
void alc_solaris_deinit(void);
void alc_solaris_probe(int type);
+void alc_haiku_init(BackendFuncs *func_list);
+void alc_haiku_deinit(void);
+void alc_haiku_probe(int type);
void alcDSoundInit(BackendFuncs *func_list);
void alcDSoundDeinit(void);
void alcDSoundProbe(int type);
@@ -335,7 +338,7 @@
extern ALint RTPrioLevel;
-ALCvoid ReleaseALC(ALCvoid);
+ALCvoid ReleaseALC(void);
void AppendDeviceList(const ALCchar *name);
void AppendAllDeviceList(const ALCchar *name);
diff -Naur openal-soft-1.12.854/config.h.in openal-soft-1.12.854-haiku/config.h.in
--- openal-soft-1.12.854/config.h.in 2010-03-08 05:55:13.023855104 +0000
+++ openal-soft-1.12.854-haiku/config.h.in 2010-08-16 18:09:32.332922880 +0000
@@ -13,6 +13,9 @@
/* Define if we have the Solaris backend */
#cmakedefine HAVE_SOLARIS
+/* Define if we have the Haiku backend */
+#cmakedefine HAVE_HAIKU
+
/* Define if we have the DSound backend */
#cmakedefine HAVE_DSOUND