HaikuPorts
  • Login
  • Preferences
  • Help/Guide
  • Wiki
  • Timeline
  • Roadmap
  • View Tickets
  • Search
  • Port Log
  • Blog

Context Navigation

  • Back to Ticket #366

Ticket #366: openal-1.13.patch

File openal-1.13.patch, 9.5 KB (added by michaelvoliveira, 4 years ago)

patch to enable native sound support for Haiku. Added David McPaul??? code to correct some deficiences from yeputons code, as appointed by KittyCat? from OpenAL community

  • openal-soft-1.

    diff -Naur openal-soft-1.13/Alc/ALc.c openal-soft-1.13-haiku/Alc/ALc.c
    old new  
    6060#ifdef HAVE_SOLARIS 
    6161    { "solaris", alc_solaris_init, alc_solaris_deinit, alc_solaris_probe, EmptyFuncs }, 
    6262#endif 
     63#ifdef HAVE_HAIKU 
     64    { "haiku", alc_haiku_init, alc_haiku_deinit, alc_haiku_probe, EmptyFuncs }, 
     65#endif 
    6366#ifdef HAVE_DSOUND 
    6467    { "dsound", alcDSoundInit, alcDSoundDeinit, alcDSoundProbe, EmptyFuncs }, 
    6568#endif 
  • Alc/haiku.cpp

    diff -Naur openal-soft-1.13/Alc/haiku.cpp openal-soft-1.13-haiku/Alc/haiku.cpp
    old new  
     1/** 
     2 * OpenAL cross platform audio library 
     3 * Copyright (C) 1999-2010 by authors. 
     4 * This library is free software; you can redistribute it and/or 
     5 *  modify it under the terms of the GNU Library General Public 
     6 *  License as published by the Free Software Foundation; either 
     7 *  version 2 of the License, or (at your option) any later version. 
     8  
     9 * This library is distributed in the hope that it will be useful, 
     10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
     11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
     12 *  Library General Public License for more details. 
     13 * 
     14 * You should have received a copy of the GNU Library General Public 
     15 *  License along with this library; if not, write to the 
     16 *  Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
     17 *  Boston, MA  02111-1307, USA. 
     18 * Or go to http://www.gnu.org/copyleft/lgpl.html 
     19 */ 
     20 
     21#include "config.h" 
     22#include <stdlib.h> 
     23#include <stdio.h> 
     24#include <memory.h> 
     25 
     26#include "alMain.h" 
     27#include "AL/al.h" 
     28#include "AL/alc.h" 
     29 
     30#include <SoundPlayer.h> 
     31 
     32void alc_haiku_init(BackendFuncs *func_list); 
     33void alc_haiku_deinit(); 
     34void alc_haiku_probe(int type); 
     35 
     36static const ALCchar haiku_device[] = "Haiku Software"; 
     37 
     38void alc_haiku_init(BackendFuncs *func_list) 
     39{ 
     40 
     41        ALCboolean HaikuOpenPlayback(ALCdevice *dev, const ALCchar *devName); 
     42        void HaikuPlayBufferCb(void *dev /* void *cookie */, void *buffer, size_t buf_sz, const media_raw_audio_format &fmt); 
     43        void HaikuClosePlayback(ALCdevice *dev); 
     44        ALCboolean HaikuResetPlayback(ALCdevice *dev); 
     45        void HaikuStopPlayback(ALCdevice *dev); 
     46 
     47        ALCboolean HaikuOpenCapture(ALCdevice *dev, const ALCchar *devName); 
     48        void HaikuCloseCapture(ALCdevice *dev); 
     49        void HaikuStartCapture(ALCdevice *dev); 
     50        void HaikuStopCapture(ALCdevice *dev); 
     51        ALCuint HaikuAvailableSamples(ALCdevice *Dev); 
     52        void HaikuCaptureSamples(ALCdevice *dev, ALCvoid *pBuf, ALCuint lSamples); 
     53 
     54        static BackendFuncs HaikuFuncs = { 
     55        HaikuOpenPlayback, 
     56        HaikuClosePlayback, 
     57        HaikuResetPlayback, 
     58        HaikuStopPlayback, 
     59        HaikuOpenCapture, 
     60        HaikuCloseCapture, 
     61        HaikuStartCapture, 
     62        HaikuStopCapture, 
     63        HaikuCaptureSamples, 
     64        HaikuAvailableSamples 
     65        }; 
     66 
     67     
     68    *func_list = HaikuFuncs; 
     69} 
     70 
     71void alc_haiku_deinit() 
     72{ 
     73} 
     74 
     75void alc_haiku_probe(int type) 
     76{ 
     77#ifdef HAVE_STAT 
     78    struct stat buf; 
     79    if(stat(GetConfigValue("haiku", "device", "/dev/audio"), &buf) != 0) 
     80        return; 
     81#endif 
     82 
     83    if(type == DEVICE_PROBE) 
     84        AppendDeviceList(haiku_device); 
     85    else if(type == ALL_DEVICE_PROBE) 
     86        AppendAllDeviceList(haiku_device); 
     87} 
     88 
     89typedef struct { 
     90    BSoundPlayer *pl; 
     91    ALCdevice *device; 
     92    ALuint frameSize; 
     93} HaikuData; 
     94 
     95ALCboolean HaikuOpenPlayback(ALCdevice *dev, const ALCchar *devName) 
     96{ 
     97        void HaikuPlayBufferCb(void *dev /* void *cookie */, void *buffer, size_t buf_sz, const media_raw_audio_format &fmt); 
     98         
     99        if (!devName) 
     100        devName = haiku_device; 
     101    else if (strcmp(devName, haiku_device) != 0) 
     102        return ALC_FALSE; 
     103 
     104    HaikuData *data = new HaikuData; 
     105    data = (HaikuData*)calloc(1, sizeof(HaikuData)); 
     106    data->device = dev; 
     107    dev->szDeviceName = strdup(devName); 
     108    dev->ExtraData = data; 
     109 
     110    media_raw_audio_format fmt; 
     111    fmt.frame_rate = dev->Frequency; 
     112    fmt.channel_count = ChannelsFromDevFmt(dev->FmtChans); 
     113    switch (dev->FmtType) { 
     114    case DevFmtByte: fmt.format = fmt.B_AUDIO_CHAR; break; 
     115    case DevFmtUByte: fmt.format = fmt.B_AUDIO_UCHAR; break; 
     116    case DevFmtShort: fmt.format = fmt.B_AUDIO_SHORT; break; 
     117    case DevFmtUShort: 
     118      delete data; dev->ExtraData = 0; 
     119      return ALC_FALSE; 
     120    case DevFmtFloat: fmt.format = fmt.B_AUDIO_FLOAT; break; 
     121    } 
     122    { 
     123        union { 
     124          char bytes[2]; 
     125          short data; 
     126        } test; 
     127        test.data = 10; 
     128        if (test.bytes[0] == 10) 
     129            fmt.byte_order = B_MEDIA_LITTLE_ENDIAN; 
     130        else 
     131            fmt.byte_order = B_MEDIA_BIG_ENDIAN; 
     132    } 
     133    fmt.buffer_size = 4096; 
     134 
     135    data->pl = new BSoundPlayer(&fmt, "OpenAL sound player", HaikuPlayBufferCb, NULL, dev); 
     136    if (data->pl->InitCheck() != B_OK) { 
     137      delete data->pl; 
     138      delete data; 
     139      dev->ExtraData = 0; 
     140      return ALC_FALSE; 
     141    } 
     142    data->frameSize = FrameSizeFromDevFmt(dev->FmtChans, dev->FmtType); 
     143    return ALC_TRUE; 
     144} 
     145void HaikuPlayBufferCb(void *cookie, void *buffer, size_t buf_sz, const media_raw_audio_format &fmt) 
     146{ 
     147        (void)fmt; 
     148    ALCdevice *dev = (ALCdevice*)cookie; 
     149    HaikuData *data = (HaikuData*)dev->ExtraData; 
     150    aluMixData(dev, buffer, buf_sz / data->frameSize); 
     151} 
     152 
     153void HaikuClosePlayback(ALCdevice *dev) { 
     154    HaikuData *data = (HaikuData*)dev->ExtraData; 
     155    data->pl->Stop(true, true); 
     156    delete data->pl; 
     157    delete data; dev->ExtraData = 0; 
     158} 
     159 
     160ALCboolean HaikuResetPlayback(ALCdevice *dev) 
     161{ 
     162    HaikuData *data = (HaikuData*)dev->ExtraData; 
     163    data->pl->Stop(true, true); 
     164 
     165    ALuint64 bufSize = dev->UpdateSize; 
     166    bufSize = bufSize / data->frameSize + (bufSize % data->frameSize > 0) ? 1 : 0; // Divide with round up 
     167    bufSize *= bufSize; 
     168    dev->UpdateSize = bufSize; 
     169 
     170    data->pl->Start(); 
     171    return ALC_TRUE; 
     172} 
     173 
     174void HaikuStopPlayback(ALCdevice *dev) { 
     175    HaikuData *data = (HaikuData*)dev->ExtraData; 
     176    data->pl->Stop(true, true); 
     177    return; 
     178} 
     179 
     180ALCboolean HaikuOpenCapture(ALCdevice *dev, const ALCchar *devName) 
     181{ 
     182        (void)dev; 
     183    (void)devName; 
     184    return ALC_FALSE; 
     185} 
     186 
     187void HaikuCloseCapture(ALCdevice *dev)  
     188{ 
     189        (void)dev;       
     190} 
     191 
     192void HaikuStartCapture(ALCdevice *dev)  
     193{ 
     194        (void)dev; 
     195} 
     196 
     197void HaikuStopCapture(ALCdevice *dev)  
     198{ 
     199        (void)dev; 
     200} 
     201 
     202ALCuint HaikuAvailableSamples(ALCdevice *Dev) 
     203{ 
     204        (void)Dev; 
     205    return 0; 
     206} 
     207 
     208void HaikuCaptureSamples(ALCdevice *dev, ALCvoid *pBuf, ALCuint lSamples)  
     209{ 
     210    (void)dev; 
     211    (void)pBuf; 
     212    (void)lSamples;      
     213} 
     214 
  • CMakeLists.txt

    diff -Naur openal-soft-1.13/CMakeLists.txt openal-soft-1.13-haiku/CMakeLists.txt
    old new  
    1616INCLUDE(CheckSymbolExists) 
    1717INCLUDE(CheckCCompilerFlag) 
    1818INCLUDE(CheckCSourceCompiles) 
     19INCLUDE(CheckCXXCompilerFlag) 
     20INCLUDE(CheckCXXSourceCompiles) 
    1921INCLUDE(CheckTypeSize) 
    2022 
    2123 
    22 PROJECT(OpenAL C) 
     24PROJECT(OpenAL C CXX) 
    2325 
    2426 
    2527SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE) 
    … …  
    2830OPTION(ALSA    "Check for ALSA backend"                ON) 
    2931OPTION(OSS     "Check for OSS backend"                 ON) 
    3032OPTION(SOLARIS "Check for Solaris backend"             ON) 
     33OPTION(HAIKU   "Check for Haiku backend"               ON) 
    3134OPTION(DSOUND  "Check for DirectSound backend"         ON) 
    3235OPTION(WINMM   "Check for Windows Multimedia backend"  ON) 
    3336OPTION(PORTAUDIO  "Check for PortAudio backend"        ON) 
    … …  
    334337SET(HAVE_ALSA       0) 
    335338SET(HAVE_OSS        0) 
    336339SET(HAVE_SOLARIS    0) 
     340SET(HAVE_HAIKU      0) 
    337341SET(HAVE_DSOUND     0) 
    338342SET(HAVE_WINMM      0) 
    339343SET(HAVE_PORTAUDIO  0) 
    … …  
    378382    ENDIF() 
    379383ENDIF() 
    380384 
     385# Check Haiku backend 
     386IF(HAIKU) 
     387    CHECK_CXX_SOURCE_COMPILES("#include <SoundPlayer.h> 
     388                           int main(void) 
     389                           { 
     390                               BSoundPlayer *player; 
     391                               return 0; 
     392                           } 
     393                          " HAVE_SOUND_PLAYER_H) 
     394    IF(HAVE_SOUND_PLAYER_H) 
     395        SET(HAVE_HAIKU 1) 
     396        SET(ALC_OBJS  ${ALC_OBJS} Alc/haiku.cpp) 
     397        SET(BACKENDS  "${BACKENDS} Haiku,") 
     398        SET(EXTRA_LIBS be ${EXTRA_LIBS}) 
     399        SET(EXTRA_LIBS media ${EXTRA_LIBS}) 
     400        ENDIF() 
     401ENDIF() 
     402 
    381403# Check DSound/MMSystem backend 
    382404IF(DSOUND) 
    383405    CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H) 
  • OpenAL32/Include/alMain.h

    diff -Naur openal-soft-1.13/OpenAL32/Include/alMain.h openal-soft-1.13-haiku/OpenAL32/Include/alMain.h
    old new  
    276276void alc_solaris_init(BackendFuncs *func_list); 
    277277void alc_solaris_deinit(void); 
    278278void alc_solaris_probe(int type); 
     279void alc_haiku_init(BackendFuncs *func_list); 
     280void alc_haiku_deinit(void); 
     281void alc_haiku_probe(int type); 
    279282void alcDSoundInit(BackendFuncs *func_list); 
    280283void alcDSoundDeinit(void); 
    281284void alcDSoundProbe(int type); 
  • openal-soft-1.

    diff -Naur openal-soft-1.13/config.h.in openal-soft-1.13-haiku/config.h.in
    old new  
    1313/* Define if we have the Solaris backend */ 
    1414#cmakedefine HAVE_SOLARIS 
    1515 
     16/* Define if we have the Haiku backend */ 
     17#cmakedefine HAVE_HAIKU 
     18 
    1619/* Define if we have the DSound backend */ 
    1720#cmakedefine HAVE_DSOUND 
    1821 

Download in other formats:

  • Original Format

Trac Powered

Powered by Trac 0.13dev-r10686
By Edgewall Software.

Visit the Trac open source project at
http://trac.edgewall.org/