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__ */ | |||