git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1398 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.62
@@ -2,6 +2,13 @@ | |||
Jackdmp changes log | |||
--------------------------- | |||
2007-02-05 Stephane Letz <letz@grame.fr> | |||
* Add Pieter Palmers FreeBob driver. | |||
2007-01-31 Stephane Letz <letz@grame.fr> | |||
* Use pthread_attr_setstacksize in JackPosixThread class. | |||
2007-01-30 Stephane Letz <letz@grame.fr> | |||
@@ -327,7 +327,7 @@ bool JackClient::Execute() | |||
// Process call | |||
if (IsActive()) { | |||
CallSyncCallback(); | |||
bool res = CallProcessCallback(); | |||
bool res = CallProcessCallback(); | |||
CallTimebaseCallback(); | |||
if (!res) | |||
goto end; | |||
@@ -3,7 +3,7 @@ | |||
prefix := /usr/local | |||
prefix := ${DESTDIR}${prefix} | |||
subprojects := ../common ../tests ../example-clients alsa | |||
subprojects := ../common ../tests ../example-clients alsa freebob | |||
sources := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard ../common/*.cpp) $(wildcard ../tests/*.cpp) | |||
@@ -17,11 +17,13 @@ TARGET_LINUX_WRAPPER_LIB := libjackwrapper.so | |||
TARGET_LINUX_ALSA := jack_alsa.so | |||
TARGET_LINUX_FREEBOB := jack_freebob.so | |||
TARGET_LINUX_DUMMY := jack_dummy.so | |||
VPATH := $(subprojects) | |||
LIB_LINUX := -lpthread -lrt -lasound | |||
LIB_LINUX := -lpthread -lrt -lasound | |||
objects_common_server_lib := JackActivationCount.o JackAPI.o JackAudioDriver.o JackClient.o JackConnectionManager.o \ | |||
@@ -39,6 +41,8 @@ objects_linux_server := Jackdmp.o | |||
objects_linux_alsa := JackAlsaDriver.o memops.o generic_hw.o hdsp.o hammerfall.o ice1712.o | |||
objects_linux_freebob := JackFreebobDriver.o | |||
objects_linux_dummy := JackDummyDriver.o | |||
CFLAGS := -g -O3 -fPIC -DUSE_POSIX_SHM $(addprefix -I, $(subprojects)) $(CFLAGS) | |||
@@ -53,10 +57,12 @@ CXXFLAGS := -g -O3 -fPIC -DSOCKET_RPC_FIFO_SEMA -D__SMP__ -DADDON_DIR=\"$(prefix | |||
# Add the -D__CLIENTDEBUG__ flag to activate client validation | |||
linux : $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_DUMMY) \ | |||
synchroClient synchroServer synchroServerClient testSem jack_test | |||
linux : $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) \ | |||
$(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | |||
synchroClient synchroServer synchroServerClient testSem jack_test | |||
all : $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_DUMMY) | |||
all : $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_ALSA) \ | |||
$(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) | |||
synchroClient: JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o | |||
$(CXX) $(CXXFLAGS) JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o $(LIB_LINUX) -o synchroClient | |||
@@ -89,6 +95,9 @@ $(TARGET_LINUX_SERVER) : $(objects_linux_server) | |||
$(TARGET_LINUX_ALSA) : $(objects_linux_alsa) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_alsa) $(LIB_LINUX) libjackdmp.so -o $(TARGET_LINUX_ALSA) | |||
$(TARGET_LINUX_FREEBOB) : $(objects_linux_freebob) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_freebob) $(LIB_LINUX) -lfreebob libjackdmp.so -o $(TARGET_LINUX_FREEBOB) | |||
$(TARGET_LINUX_DUMMY) : $(objects_linux_dummy) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_dummy) $(LIB_LINUX) libjackdmp.so -o $(TARGET_LINUX_DUMMY) | |||
@@ -100,6 +109,7 @@ install: | |||
cp libjackdmp.so $(prefix)/lib | |||
install -d $(prefix)/lib/jackmp/ | |||
cp jack_alsa.so $(prefix)/lib/jackmp | |||
cp jack_freebob.so $(prefix)/lib/jackmp | |||
cp jack_dummy.so $(prefix)/lib/jackmp | |||
cd $(prefix)/lib && [ -f libjack.so.0.0.23 ] && mv -f libjack.so.0.0.23 tmp_libjack.so.0.0.23 || echo "Jack not found, continue..." | |||
cd $(prefix)/lib && rm -f libjack.so* | |||
@@ -108,6 +118,8 @@ install: | |||
/sbin/ldconfig | |||
# Remove jackdmp and tries to restore jack | |||
uninstall: remove | |||
remove: | |||
rm $(prefix)/bin/jackdmp | |||
rm $(prefix)/lib/libjackmp.so | |||
@@ -121,7 +133,7 @@ remove: | |||
clean : | |||
rm -f *.o | |||
rm -f $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_DUMMY) \ | |||
rm -f $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | |||
synchroClient synchroServer synchroServerClient testSem jack_test | |||
depend : | |||
@@ -0,0 +1,98 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004 Grame | |||
Copyright (C) 2007 Pieter Palmers | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program 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 General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef __JackFreebobDriver__ | |||
#define __JackFreebobDriver__ | |||
#include "JackAudioDriver.h" | |||
#include "JackThreadedDriver.h" | |||
#include "JackTime.h" | |||
#include "freebob_driver.h" | |||
namespace Jack | |||
{ | |||
/*! | |||
\brief The FreeBoB driver. | |||
*/ | |||
class JackFreebobDriver : public JackAudioDriver | |||
{ | |||
private: | |||
// enable verbose messages | |||
int g_verbose; | |||
jack_driver_t* fDriver; | |||
jack_time_t fDelayedUst; | |||
int freebob_driver_attach (freebob_driver_t *driver); | |||
int freebob_driver_detach (freebob_driver_t *driver); | |||
int freebob_driver_read (freebob_driver_t * driver, jack_nframes_t nframes); | |||
int freebob_driver_write (freebob_driver_t * driver, jack_nframes_t nframes); | |||
jack_nframes_t freebob_driver_wait (freebob_driver_t *driver, | |||
int extra_fd, int *status, | |||
float *delayed_usecs); | |||
int freebob_driver_start (freebob_driver_t *driver); | |||
int freebob_driver_stop (freebob_driver_t *driver); | |||
int freebob_driver_restart (freebob_driver_t *driver); | |||
freebob_driver_t *freebob_driver_new (char *name, freebob_jack_settings_t *params); | |||
void freebob_driver_delete (freebob_driver_t *driver); | |||
#ifdef FREEBOB_DRIVER_WITH_MIDI | |||
freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver); | |||
void freebob_driver_midi_finish (freebob_driver_midi_handle_t *m); | |||
int freebob_driver_midi_start (freebob_driver_midi_handle_t *m); | |||
int freebob_driver_midi_stop (freebob_driver_midi_handle_t *m); | |||
#endif | |||
void jack_driver_init (jack_driver_t *driver); | |||
void jack_driver_nt_init (jack_driver_nt_t * driver); | |||
void jack_driver_nt_finish(jack_driver_nt_t * driver); | |||
public: | |||
JackFreebobDriver(const char* name, JackEngine* engine, JackSynchro** table): JackAudioDriver(name, engine, table) | |||
{} | |||
virtual ~JackFreebobDriver() | |||
{} | |||
int Open(freebob_jack_settings_t *cmlparams); | |||
int Close(); | |||
int Attach(); | |||
int Detach(); | |||
int Start(); | |||
int Stop(); | |||
int Read(); | |||
int Write(); | |||
int SetBufferSize(jack_nframes_t nframes); | |||
void PrintState(); | |||
}; | |||
} // end of namespace | |||
#endif |
@@ -0,0 +1,245 @@ | |||
/* freebob_driver.h | |||
* | |||
* FreeBob Backend for Jack | |||
* FreeBob = Firewire (pro-)audio for linux | |||
* | |||
* adapted for jackmp | |||
* | |||
* http://freebob.sf.net | |||
* http://jackit.sf.net | |||
* | |||
* Copyright (C) 2005,2006,2007 Pieter Palmers <pieterpalmers@users.sourceforge.net> | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License as published by | |||
* the Free Software Foundation; either version 2 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program 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 General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program; if not, write to the Free Software | |||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
/* | |||
* Main Jack driver entry routines | |||
* | |||
*/ | |||
#ifndef __JACK_FREEBOB_DRIVER_H__ | |||
#define __JACK_FREEBOB_DRIVER_H__ | |||
// #define FREEBOB_DRIVER_WITH_MIDI | |||
// #define DEBUG_ENABLED | |||
#include <libfreebob/freebob.h> | |||
#include <libfreebob/freebob_streaming.h> | |||
#include <string.h> | |||
#include <stdlib.h> | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <poll.h> | |||
#include <sys/time.h> | |||
#include <netinet/in.h> | |||
#include <endian.h> | |||
#include <pthread.h> | |||
#include <semaphore.h> | |||
#include <driver.h> | |||
#include <types.h> | |||
#ifdef FREEBOB_DRIVER_WITH_MIDI | |||
#include <JackPosixThread.h> | |||
#include <alsa/asoundlib.h> | |||
#endif | |||
// debug print control flags | |||
#define DEBUG_LEVEL_BUFFERS (1<<0) | |||
#define DEBUG_LEVEL_HANDLERS (1<<1) | |||
#define DEBUG_LEVEL_XRUN_RECOVERY (1<<2) | |||
#define DEBUG_LEVEL_WAIT (1<<3) | |||
#define DEBUG_LEVEL_RUN_CYCLE (1<<8) | |||
#define DEBUG_LEVEL_PACKETCOUNTER (1<<16) | |||
#define DEBUG_LEVEL_STARTUP (1<<17) | |||
#define DEBUG_LEVEL_THREADS (1<<18) | |||
#ifdef DEBUG_ENABLED | |||
// default debug level | |||
#define DEBUG_LEVEL ( DEBUG_LEVEL_RUN_CYCLE | \ | |||
(DEBUG_LEVEL_XRUN_RECOVERY)| DEBUG_LEVEL_STARTUP | DEBUG_LEVEL_WAIT | DEBUG_LEVEL_PACKETCOUNTER) | |||
#warning Building debug build! | |||
#define printMessage(format, args...) jack_error( "FreeBoB MSG: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ##args ) | |||
#define printError(format, args...) jack_error( "FreeBoB ERR: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ##args ) | |||
/* #define printEnter() jack_error( "FBDRV ENTERS: %s (%s)", __FUNCTION__, __FILE__) | |||
#define printExit() jack_error( "FBDRV EXITS: %s (%s)", __FUNCTION__, __FILE__)*/ | |||
#define printEnter() | |||
#define printExit() | |||
#define debugError(format, args...) jack_error( "FREEBOB ERR: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ##args ) | |||
#define debugPrint(Level, format, args...) if(DEBUG_LEVEL & (Level)) jack_error("DEBUG %s:%d (%s) :" format, __FILE__, __LINE__, __FUNCTION__, ##args ); | |||
#define debugPrintShort(Level, format, args...) if(DEBUG_LEVEL & (Level)) jack_error( format,##args ); | |||
#define debugPrintWithTimeStamp(Level, format, args...) if(DEBUG_LEVEL & (Level)) jack_error( "%16lu: "format, debugGetCurrentUTime(),##args ); | |||
#define SEGFAULT int *test=NULL; *test=1; | |||
#else | |||
#define DEBUG_LEVEL | |||
#define printMessage(format, args...) if(g_verbose) \ | |||
jack_error("FreeBoB MSG: " format, ##args ) | |||
#define printError(format, args...) jack_error("FreeBoB ERR: " format, ##args ) | |||
#define printEnter() | |||
#define printExit() | |||
#define debugError(format, args...) | |||
#define debugPrint(Level, format, args...) | |||
#define debugPrintShort(Level, format, args...) | |||
#define debugPrintWithTimeStamp(Level, format, args...) | |||
#endif | |||
// thread priority setup | |||
#define FREEBOB_RT_PRIORITY_PACKETIZER_RELATIVE 5 | |||
#ifdef FREEBOB_DRIVER_WITH_MIDI | |||
#define ALSA_SEQ_BUFF_SIZE 1024 | |||
#define MIDI_TRANSMIT_BUFFER_SIZE 1024 | |||
#define MIDI_THREAD_SLEEP_TIME_USECS 100 | |||
// midi priority should be higher than the audio priority in order to | |||
// make sure events are not only delivered on period boundarys | |||
// but I think it should be smaller than the packetizer thread in order not | |||
// to lose any packets | |||
#define FREEBOB_RT_PRIORITY_MIDI_RELATIVE 4 | |||
#endif | |||
typedef struct _freebob_driver freebob_driver_t; | |||
/* | |||
* Jack Driver command line parameters | |||
*/ | |||
typedef struct _freebob_jack_settings freebob_jack_settings_t; | |||
struct _freebob_jack_settings | |||
{ | |||
int period_size_set; | |||
jack_nframes_t period_size; | |||
int sample_rate_set; | |||
int sample_rate; | |||
int buffer_size_set; | |||
jack_nframes_t buffer_size; | |||
int port_set; | |||
int port; | |||
int node_id_set; | |||
int node_id; | |||
int playback_ports; | |||
int capture_ports; | |||
jack_nframes_t capture_frame_latency; | |||
jack_nframes_t playback_frame_latency; | |||
freebob_handle_t fb_handle; | |||
}; | |||
#ifdef FREEBOB_DRIVER_WITH_MIDI | |||
typedef struct | |||
{ | |||
int stream_nr; | |||
int seq_port_nr; | |||
snd_midi_event_t *parser; | |||
snd_seq_t *seq_handle; | |||
} | |||
freebob_midi_port_t; | |||
typedef struct _freebob_driver_midi_handle | |||
{ | |||
freebob_device_t *dev; | |||
freebob_driver_t *driver; | |||
snd_seq_t *seq_handle; | |||
pthread_t queue_thread; | |||
pthread_t dequeue_thread; | |||
int queue_thread_realtime; | |||
int queue_thread_priority; | |||
int nb_input_ports; | |||
int nb_output_ports; | |||
freebob_midi_port_t **input_ports; | |||
freebob_midi_port_t **output_ports; | |||
freebob_midi_port_t **input_stream_port_map; | |||
int *output_port_stream_map; | |||
} | |||
freebob_driver_midi_handle_t; | |||
#endif | |||
/* | |||
* JACK driver structure | |||
*/ | |||
struct _freebob_driver | |||
{ | |||
JACK_DRIVER_NT_DECL | |||
jack_nframes_t sample_rate; | |||
jack_nframes_t period_size; | |||
unsigned long wait_time; | |||
jack_time_t wait_last; | |||
jack_time_t wait_next; | |||
int wait_late; | |||
jack_client_t *client; | |||
int xrun_detected; | |||
int xrun_count; | |||
int process_count; | |||
/* settings from the command line */ | |||
freebob_jack_settings_t settings; | |||
/* the freebob virtual device */ | |||
freebob_device_t *dev; | |||
JSList *capture_ports; | |||
JSList *playback_ports; | |||
JSList *monitor_ports; | |||
unsigned long playback_nchannels; | |||
unsigned long capture_nchannels; | |||
unsigned long playback_nchannels_audio; | |||
unsigned long capture_nchannels_audio; | |||
jack_nframes_t playback_frame_latency; | |||
jack_nframes_t capture_frame_latency; | |||
freebob_device_info_t device_info; | |||
freebob_options_t device_options; | |||
#ifdef FREEBOB_DRIVER_WITH_MIDI | |||
freebob_driver_midi_handle_t *midi_handle; | |||
#endif | |||
}; | |||
#endif /* __JACK_FREEBOB_DRIVER_H__ */ | |||