Move dbus device reservation code to jackdbus

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3579 0c269be4-1314-0410-8aa9-9f06e86f4224
This commit is contained in:
nedko 2009-07-07 17:18:11 +00:00
parent 9b185921d8
commit 3aa9b525c3
13 changed files with 117 additions and 38 deletions

View File

@ -43,6 +43,7 @@
#include "JackLockedEngine.h"
#include "JackConstants.h"
#include "JackDriverLoader.h"
#include "JackServerGlobals.h"
using namespace Jack;
@ -618,7 +619,9 @@ get_realtime_priority_constraint()
return constraint_ptr;
}
EXPORT jackctl_server_t * jackctl_server_create()
EXPORT jackctl_server_t * jackctl_server_create(
bool (* on_device_acquire)(const char * device_name),
void (* on_device_release)(const char * device_name))
{
struct jackctl_server * server_ptr;
union jackctl_parameter_value value;
@ -762,6 +765,9 @@ EXPORT jackctl_server_t * jackctl_server_create()
goto fail_free_parameters;
}
JackServerGlobals::on_device_acquire = on_device_acquire;
JackServerGlobals::on_device_release = on_device_release;
if (!jackctl_drivers_load(server_ptr))
{
goto fail_free_parameters;

View File

@ -88,7 +88,9 @@ jackctl_wait_signals(
sigset_t signals);
EXPORT jackctl_server_t *
jackctl_server_create();
jackctl_server_create(
bool (* on_device_acquire)(const char * device_name),
void (* on_device_release)(const char * device_name));
EXPORT void
jackctl_server_destroy(

View File

@ -30,6 +30,8 @@ namespace Jack
JackServer* JackServerGlobals::fInstance;
unsigned int JackServerGlobals::fUserCount;
bool (* JackServerGlobals::on_device_acquire)(const char * device_name) = NULL;
void (* JackServerGlobals::on_device_release)(const char * device_name) = NULL;
int JackServerGlobals::Start(const char* server_name,
jack_driver_desc_t* driver_desc,

View File

@ -38,6 +38,8 @@ struct SERVER_EXPORT JackServerGlobals
{
static JackServer* fInstance;
static unsigned int fUserCount;
static bool (* on_device_acquire)(const char * device_name);
static void (* on_device_release)(const char * device_name);
JackServerGlobals();
~JackServerGlobals();

View File

@ -207,7 +207,7 @@ int main(int argc, char* argv[])
copyright(stdout);
server_ctl = jackctl_server_create();
server_ctl = jackctl_server_create(NULL, NULL);
if (server_ctl == NULL) {
fprintf(stderr, "Failed to create server object\n");
return -1;

View File

@ -109,12 +109,17 @@ jackctl_wait_signals(
/**
* Call this function to create server object.
*
* @param on_device_acquire - Optional callback to be called before device is acquired. If false is returned, device usage will fail
* @param on_device_release - Optional callback to be called after device is released.
*
* @return server object handle, NULL if creation of server object
* failed. Successfully created server object must be destroyed with
* paired call to ::jackctl_server_destroy
*/
jackctl_server_t *
jackctl_server_create();
jackctl_server_create(
bool (* on_device_acquire)(const char * device_name),
void (* on_device_release)(const char * device_name));
/**
* Call this function to destroy server object.

View File

@ -29,6 +29,7 @@
#include "controller.h"
#include "controller_internal.h"
#include "xml.h"
#include "reserve.h"
struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[] =
{
@ -279,6 +280,58 @@ jack_controller_switch_master(
return TRUE;
}
/* TODO: use contianer with unique entries (dict) */
bool g_reserved_device_valid = false;
static rd_device * g_reserved_device;
static
bool
on_device_acquire(const char * device_name)
{
int ret;
DBusError error;
if (g_reserved_device_valid) {
jack_error("Ignoring reservation for more than one device (acquire)");
return false;
}
ret = rd_acquire(
&g_reserved_device,
g_connection,
device_name,
"Jack audio server",
INT32_MAX,
NULL,
&error);
if (ret < 0)
{
jack_error("Failed to acquire device name : %s error : %s", device_name, (error.message ? error.message : strerror(-ret)));
return false;
}
g_reserved_device_valid = true;
jack_info("Acquired audio card %s", device_name);
return true;
}
static
void
on_device_release(const char * device_name)
{
if (!g_reserved_device_valid) {
jack_error("Ignoring reservation for more than one device(release)");
}
rd_release(g_reserved_device);
g_reserved_device_valid = false;
jack_info("Released audio card %s", device_name);
}
void *
jack_controller_create(
DBusConnection *connection)
@ -303,7 +356,7 @@ jack_controller_create(
goto fail;
}
controller_ptr->server = jackctl_server_create();
controller_ptr->server = jackctl_server_create(on_device_acquire, on_device_release);
if (controller_ptr->server == NULL)
{
jack_error("Failed to create server object");

View File

@ -312,5 +312,6 @@ jack_dbus_send_signal(
#define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
extern DBusConnection * g_connection;
#endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */

View File

@ -59,6 +59,7 @@ def build(bld):
#'xml_nop.c',
'xml_write_raw.c',
'sigsegv.c',
'reserve.c',
]
if bld.env['IS_LINUX']:
obj.uselib = 'PTHREAD DL RT DBUS-1 EXPAT'

View File

@ -167,7 +167,7 @@ int main(int argc, char *argv[])
}
}
server = jackctl_server_create();
server = jackctl_server_create(NULL, NULL);
parameters = jackctl_server_get_parameters(server);
/*

View File

@ -48,8 +48,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "usx2y.h"
#include "generic.h"
#include "memops.h"
#include "JackServerGlobals.h"
#include "audio_reserve.h"
//#define DEBUG_WAKEUP 1
@ -2233,25 +2233,24 @@ int JackAlsaDriver::Open(jack_nframes_t nframes,
else if (strcmp(midi_driver_name, "raw") == 0)
midi = alsa_rawmidi_new((jack_client_t*)this);
#if defined(JACK_DBUS)
if (audio_reservation_init() < 0) {
jack_error("Audio device reservation service not available....");
} else if (strcmp(capture_driver_name, playback_driver_name) == 0) { // Same device for input and output
fReservedCaptureDevice = audio_acquire(card_to_num(capture_driver_name));
if (fReservedCaptureDevice == NULL) {
jack_error("Error audio device %s cannot be acquired, trying to open it anyway...", capture_driver_name);
}
} else {
fReservedCaptureDevice = audio_acquire(card_to_num(capture_driver_name));
if (fReservedCaptureDevice == NULL) {
jack_error("Error capture audio device %s cannot be acquired, trying to open it anyway...", capture_driver_name);
}
fReservedPlaybackDevice = audio_acquire(card_to_num(playback_driver_name));
if (fReservedPlaybackDevice == NULL) {
jack_error("Error playback audio device %s cannot be acquired, trying to open it anyway...", playback_driver_name);
}
if (JackServerGlobals::on_device_acquire != NULL)
{
int capture_card = card_to_num(capture_driver_name);
int playback_card = card_to_num(playback_driver_name);
char audio_name[32];
snprintf(audio_name, sizeof(audio_name) - 1, "Audio%d", capture_card);
if (!JackServerGlobals::on_device_acquire(audio_name)) {
jack_error("Audio device %s cannot be acquired, trying to open it anyway...", capture_driver_name);
}
if (playback_card != capture_card) {
snprintf(audio_name, sizeof(audio_name) - 1, "Audio%d", playback_card);
if (!JackServerGlobals::on_device_acquire(audio_name)) {
jack_error("Audio device %s cannot be acquired, trying to open it anyway...", playback_driver_name);
}
}
}
#endif
fDriver = alsa_driver_new ("alsa_pcm", (char*)playback_driver_name, (char*)capture_driver_name,
NULL,
@ -2286,11 +2285,23 @@ int JackAlsaDriver::Close()
{
JackAudioDriver::Close();
alsa_driver_delete((alsa_driver_t*)fDriver);
#if defined(JACK_DBUS)
audio_release(fReservedCaptureDevice);
audio_release(fReservedPlaybackDevice);
audio_reservation_finish();
#endif
if (JackServerGlobals::on_device_release != NULL)
{
char audio_name[32];
int capture_card = card_to_num(fCaptureDriverName);
if (capture_card >= 0) {
snprintf(audio_name, sizeof(audio_name) - 1, "Audio%d", capture_card);
JackServerGlobals::on_device_release(audio_name);
}
int playback_card = card_to_num(fPlaybackDriverName);
if (playback_card >= 0 && playback_card != capture_card) {
snprintf(audio_name, sizeof(audio_name) - 1, "Audio%d", playback_card);
JackServerGlobals::on_device_release(audio_name);
}
}
return 0;
}

View File

@ -40,8 +40,8 @@ class JackAlsaDriver : public JackAudioDriver
private:
jack_driver_t* fDriver;
void* fReservedCaptureDevice;
void* fReservedPlaybackDevice;
int fReservedCaptureDevice;
int fReservedPlaybackDevice;
void alsa_driver_release_channel_dependent_memory(alsa_driver_t *driver);
int alsa_driver_check_capabilities(alsa_driver_t *driver);
@ -121,8 +121,8 @@ class JackAlsaDriver : public JackAudioDriver
JackAlsaDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table)
: JackAudioDriver(name, alias, engine, table)
,fDriver(NULL)
,fReservedCaptureDevice(NULL)
,fReservedPlaybackDevice(NULL)
,fReservedCaptureDevice(-1)
,fReservedPlaybackDevice(-1)
{}
virtual ~JackAlsaDriver()
{}

View File

@ -47,10 +47,6 @@ def build(bld):
'alsa/hammerfall.c',
'alsa/ice1712.c'
]
if bld.env['BUILD_JACKDBUS']:
alsa_driver_src += ['../dbus/reserve.c', '../dbus/audio_reserve.c']
if bld.env['BUILD_DRIVER_ALSA'] == True:
create_jack_driver_obj(bld, 'alsa', alsa_driver_src, "ALSA")