Chris Robinson fe6e532c87 Use a separate backend callback to start playback of the device
This allows us to properly update the ALCdevice and its resources with the new
parameters before starting playback, instead of expecting the mixer to block
and wait after it has begun.

This also lets us avoid holding the device lock while resetting and starting
the device, which helps prevent lock inversion on some backends (ie, one thread
locking A then B, and another thread locking B then A), ultimately allowing
certain backends to asynchronously update the ALCdevice without risk of lockup.
Capture still has issues here, however.
2012-03-05 07:11:09 -08:00

85 lines
2.0 KiB
C

/**
* OpenAL cross platform audio library
* Copyright (C) 2011 by Chris Robinson
* 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 <stdlib.h>
#include "alMain.h"
#include "AL/al.h"
#include "AL/alc.h"
static ALCenum loopback_open_playback(ALCdevice *device, const ALCchar *deviceName)
{
device->szDeviceName = strdup(deviceName);
return ALC_NO_ERROR;
}
static void loopback_close_playback(ALCdevice *device)
{
(void)device;
}
static ALCboolean loopback_reset_playback(ALCdevice *device)
{
SetDefaultWFXChannelOrder(device);
return ALC_TRUE;
}
static ALCboolean loopback_start_playback(ALCdevice *device)
{
return ALC_TRUE;
(void)device;
}
static void loopback_stop_playback(ALCdevice *device)
{
(void)device;
}
static const BackendFuncs loopback_funcs = {
loopback_open_playback,
loopback_close_playback,
loopback_reset_playback,
loopback_start_playback,
loopback_stop_playback,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
ALCboolean alc_loopback_init(BackendFuncs *func_list)
{
*func_list = loopback_funcs;
return ALC_TRUE;
}
void alc_loopback_deinit(void)
{
}
void alc_loopback_probe(enum DevProbe type)
{
(void)type;
}