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 | 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> | 2007-01-30 Stephane Letz <letz@grame.fr> | ||||
@@ -327,7 +327,7 @@ bool JackClient::Execute() | |||||
// Process call | // Process call | ||||
if (IsActive()) { | if (IsActive()) { | ||||
CallSyncCallback(); | CallSyncCallback(); | ||||
bool res = CallProcessCallback(); | |||||
bool res = CallProcessCallback(); | |||||
CallTimebaseCallback(); | CallTimebaseCallback(); | ||||
if (!res) | if (!res) | ||||
goto end; | goto end; | ||||
@@ -3,7 +3,7 @@ | |||||
prefix := /usr/local | prefix := /usr/local | ||||
prefix := ${DESTDIR}${prefix} | 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) | 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_ALSA := jack_alsa.so | ||||
TARGET_LINUX_FREEBOB := jack_freebob.so | |||||
TARGET_LINUX_DUMMY := jack_dummy.so | TARGET_LINUX_DUMMY := jack_dummy.so | ||||
VPATH := $(subprojects) | 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 \ | 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_alsa := JackAlsaDriver.o memops.o generic_hw.o hdsp.o hammerfall.o ice1712.o | ||||
objects_linux_freebob := JackFreebobDriver.o | |||||
objects_linux_dummy := JackDummyDriver.o | objects_linux_dummy := JackDummyDriver.o | ||||
CFLAGS := -g -O3 -fPIC -DUSE_POSIX_SHM $(addprefix -I, $(subprojects)) $(CFLAGS) | 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 | # 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 | 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 | $(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) | $(TARGET_LINUX_ALSA) : $(objects_linux_alsa) | ||||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_alsa) $(LIB_LINUX) libjackdmp.so -o $(TARGET_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) | $(TARGET_LINUX_DUMMY) : $(objects_linux_dummy) | ||||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_dummy) $(LIB_LINUX) libjackdmp.so -o $(TARGET_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 | cp libjackdmp.so $(prefix)/lib | ||||
install -d $(prefix)/lib/jackmp/ | install -d $(prefix)/lib/jackmp/ | ||||
cp jack_alsa.so $(prefix)/lib/jackmp | cp jack_alsa.so $(prefix)/lib/jackmp | ||||
cp jack_freebob.so $(prefix)/lib/jackmp | |||||
cp jack_dummy.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 && [ -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* | cd $(prefix)/lib && rm -f libjack.so* | ||||
@@ -108,6 +118,8 @@ install: | |||||
/sbin/ldconfig | /sbin/ldconfig | ||||
# Remove jackdmp and tries to restore jack | # Remove jackdmp and tries to restore jack | ||||
uninstall: remove | |||||
remove: | remove: | ||||
rm $(prefix)/bin/jackdmp | rm $(prefix)/bin/jackdmp | ||||
rm $(prefix)/lib/libjackmp.so | rm $(prefix)/lib/libjackmp.so | ||||
@@ -121,7 +133,7 @@ remove: | |||||
clean : | clean : | ||||
rm -f *.o | 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 | synchroClient synchroServer synchroServerClient testSem jack_test | ||||
depend : | 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__ */ | |||||