Add a skeleton backend for MMDevApi

This commit is contained in:
Chris Robinson
2011-05-15 20:26:25 -07:00
parent 442e41f825
commit 2940b0f390
5 changed files with 193 additions and 0 deletions
+3
View File
@@ -63,6 +63,9 @@ static BackendInfo BackendList[] = {
#ifdef HAVE_SOLARIS
{ "solaris", alc_solaris_init, alc_solaris_deinit, alc_solaris_probe, EmptyFuncs },
#endif
#ifdef HAVE_MMDEVAPI
{ "mmdevapi", alcMMDevApiInit, alcMMDevApiDeinit, alcMMDevApiProbe, EmptyFuncs },
#endif
#ifdef HAVE_DSOUND
{ "dsound", alcDSoundInit, alcDSoundDeinit, alcDSoundProbe, EmptyFuncs },
#endif
+170
View File
@@ -0,0 +1,170 @@
/**
* OpenAL cross platform audio library
* Copyright (C) 2011 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"
#define _WIN32_WINNT 0x0500
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <dsound.h>
#include <cguid.h>
#include <mmreg.h>
#ifndef _WAVEFORMATEXTENSIBLE_
#include <ks.h>
#include <ksmedia.h>
#endif
#include "alMain.h"
#include "AL/al.h"
#include "AL/alc.h"
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
static ALboolean is_loaded = AL_FALSE;
typedef struct {
volatile int killNow;
ALvoid *thread;
} MMDevApiData;
static const ALCchar mmDevice[] = "MMDevApi Default";
static void *MMDevApiLoad(void)
{
return (void*)is_loaded;
}
static ALCboolean MMDevApiOpenPlayback(ALCdevice *device, const ALCchar *deviceName)
{
MMDevApiData *pData = NULL;
HRESULT hr = E_FAIL;
if(!MMDevApiLoad())
return ALC_FALSE;
if(!deviceName)
deviceName = mmDevice;
else if(strcmp(deviceName, mmDevice) != 0)
return ALC_FALSE;
//Initialise requested device
pData = calloc(1, sizeof(MMDevApiData));
if(!pData)
{
alcSetError(device, ALC_OUT_OF_MEMORY);
return ALC_FALSE;
}
//MMDevApi Init code
if(FAILED(hr))
{
free(pData);
AL_PRINT("Device init failed: 0x%08lx\n", hr);
return ALC_FALSE;
}
device->szDeviceName = strdup(deviceName);
device->ExtraData = pData;
return ALC_TRUE;
}
static void MMDevApiClosePlayback(ALCdevice *device)
{
MMDevApiData *pData = device->ExtraData;
free(pData);
device->ExtraData = NULL;
}
static ALCboolean MMDevApiResetPlayback(ALCdevice *device)
{
(void)device;
return ALC_FALSE;
}
static void MMDevApiStopPlayback(ALCdevice *device)
{
MMDevApiData *pData = device->ExtraData;
if(!pData->thread)
return;
pData->killNow = 1;
StopThread(pData->thread);
pData->thread = NULL;
pData->killNow = 0;
}
static ALCboolean MMDevApiOpenCapture(ALCdevice *device, const ALCchar *deviceName)
{
(void)device;
(void)deviceName;
return ALC_FALSE;
}
static const BackendFuncs MMDevApiFuncs = {
MMDevApiOpenPlayback,
MMDevApiClosePlayback,
MMDevApiResetPlayback,
MMDevApiStopPlayback,
MMDevApiOpenCapture,
NULL,
NULL,
NULL,
NULL,
NULL
};
void alcMMDevApiInit(BackendFuncs *FuncList)
{
*FuncList = MMDevApiFuncs;
}
void alcMMDevApiDeinit(void)
{
if(is_loaded)
{
is_loaded = AL_FALSE;
}
}
void alcMMDevApiProbe(int type)
{
if(!MMDevApiLoad()) return;
if(type == DEVICE_PROBE)
AppendDeviceList(mmDevice);
else if(type == ALL_DEVICE_PROBE)
AppendAllDeviceList(mmDevice);
}
+14
View File
@@ -28,6 +28,7 @@ SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
OPTION(ALSA "Check for ALSA backend" ON)
OPTION(OSS "Check for OSS backend" ON)
OPTION(SOLARIS "Check for Solaris backend" ON)
OPTION(MMDEVAPI "Check for MMDevApi" ON)
OPTION(DSOUND "Check for DirectSound backend" ON)
OPTION(WINMM "Check for Windows Multimedia backend" ON)
OPTION(PORTAUDIO "Check for PortAudio backend" ON)
@@ -405,6 +406,19 @@ IF(SOLARIS)
ENDIF()
ENDIF()
# Check for MMDevApi backend
IF(HAVE_WINDOWS_H)
IF(MMDEVAPI)
CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
IF(HAVE_MMDEVICEAPI_H)
SET(HAVE_MMDEVAPI 1)
SET(ALC_OBJS ${ALC_OBJS} Alc/mmdevapi.c)
SET(BACKENDS "${BACKENDS} MMDevApi,")
ENDIF()
ENDIF()
ENDIF()
# Check DSound/MMSystem backend
IF(DSOUND)
CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
+3
View File
@@ -361,6 +361,9 @@ void alc_oss_probe(int type);
void alc_solaris_init(BackendFuncs *func_list);
void alc_solaris_deinit(void);
void alc_solaris_probe(int type);
void alcMMDevApiInit(BackendFuncs *func_list);
void alcMMDevApiDeinit(void);
void alcMMDevApiProbe(int type);
void alcDSoundInit(BackendFuncs *func_list);
void alcDSoundDeinit(void);
void alcDSoundProbe(int type);
+3
View File
@@ -13,6 +13,9 @@
/* Define if we have the Solaris backend */
#cmakedefine HAVE_SOLARIS
/* Define if we have the MMDevApi backend */
#cmakedefine HAVE_MMDEVAPI
/* Define if we have the DSound backend */
#cmakedefine HAVE_DSOUND