zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 7522ff2be5614566b9893d44fd77bc518fcfad11
parent 8bdbb9cf94fbc7d4510cb7cb0e3b2064a0f86109
Author: paulnasca <paulnasca>
Date:   Tue, 16 Dec 2003 18:11:15 +0000

The jack support is available as JACK (the old jack support) or JACK_RT (the new RT-safe, but broken support)

Diffstat:
Msrc/Makefile | 5+++++
Msrc/Makefile.inc | 1+
Msrc/Output/JACKaudiooutput.C | 98+++----------------------------------------------------------------------------
Msrc/Output/JACKaudiooutput.h | 4+---
Msrc/Output/Makefile | 4++++
Msrc/main.C | 13+++++++++++--
6 files changed, 25 insertions(+), 100 deletions(-)

diff --git a/src/Makefile b/src/Makefile @@ -41,6 +41,11 @@ CXXFLAGS += `pkg-config --cflags jack` LIBS+= `pkg-config --libs jack` endif +ifeq ($(AUDIOOUT),JACK_RT) +CXXFLAGS += `pkg-config --cflags jack` +LIBS+= `pkg-config --libs jack` +endif + objects=main.o subdirs=DSP Effects Input Misc Output Params Synth Seq diff --git a/src/Makefile.inc b/src/Makefile.inc @@ -22,6 +22,7 @@ LINUX_MIDIIN=ALSA LINUX_AUDIOOUT=OSS #LINUX_AUDIOOUT=NONE #LINUX_AUDIOOUT=JACK +#LINUX_AUDIOOUT=JACK_RT JACK_RT support is broken #for PortAudio (PA) #LINUX_AUDIOOUT=PA diff --git a/src/Output/JACKaudiooutput.C b/src/Output/JACKaudiooutput.C @@ -21,44 +21,21 @@ */ #include <stdlib.h> -#include <string.h> -#include <pthread.h> -#include <unistd.h> #include "JACKaudiooutput.h" Master *jackmaster; jack_client_t *jackclient; jack_port_t *outport_left,*outport_right; -jack_ringbuffer_t *rb=NULL; -REALTYPE *jackoutl,*jackoutr; -int jackfinish=0; - -void *thread_blocked(void *arg); int jackprocess(jack_nframes_t nframes,void *arg); int jacksrate(jack_nframes_t nframes,void *arg); void jackshutdown(void *arg); -pthread_cond_t more_data=PTHREAD_COND_INITIALIZER; -pthread_mutex_t zyn_thread_lock=PTHREAD_MUTEX_INITIALIZER; - -pthread_t bthr; - - void JACKaudiooutputinit(Master *master_){ jackmaster=master_; jackclient=0; char tmpstr[100]; - jackoutl=new REALTYPE [SOUND_BUFFER_SIZE]; - jackoutr=new REALTYPE [SOUND_BUFFER_SIZE]; - - int rbbufsize=SOUND_BUFFER_SIZE*sizeof (REALTYPE)*2*2; - printf("%d\n",rbbufsize); - rb=jack_ringbuffer_create(rbbufsize); - memset(rb->buf,rbbufsize,0); - - for (int i=0;i<15;i++){ if (i!=0) snprintf(tmpstr,100,"ZynAddSubFX_%d",i); else snprintf(tmpstr,100,"ZynAddSubFX"); @@ -88,8 +65,6 @@ void JACKaudiooutputinit(Master *master_){ fprintf(stderr,"Cannot activate jack client\n"); exit(1); }; - - pthread_create(&bthr,NULL,thread_blocked,NULL); /* jack_connect(jackclient,jack_port_name(outport_left),"alsa_pcm:out_1"); @@ -97,86 +72,19 @@ void JACKaudiooutputinit(Master *master_){ */ }; -void *thread_blocked(void *arg){ - int datasize=SOUND_BUFFER_SIZE*sizeof (REALTYPE); - - //try to get realtime - sched_param sc; - sc.sched_priority=50; - int err=sched_setscheduler(0,SCHED_FIFO,&sc); - - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); - pthread_mutex_lock(&zyn_thread_lock); - - while (jackfinish==0){ - while (jack_ringbuffer_write_space(rb)>=datasize){ - pthread_mutex_lock(&jackmaster->mutex); - jackmaster->GetAudioOutSamples(SOUND_BUFFER_SIZE,jack_get_sample_rate(jackclient),jackoutl,jackoutr); - pthread_mutex_unlock(&jackmaster->mutex); - - jack_ringbuffer_write(rb, (char *) jackoutl,datasize); - jack_ringbuffer_write(rb, (char *) jackoutr,datasize); - }; - pthread_cond_wait(&more_data,&zyn_thread_lock); - }; - pthread_mutex_unlock(&zyn_thread_lock); - - return(0); -}; - - int jackprocess(jack_nframes_t nframes,void *arg){ jack_default_audio_sample_t *outl=(jack_default_audio_sample_t *) jack_port_get_buffer (outport_left, nframes); jack_default_audio_sample_t *outr=(jack_default_audio_sample_t *) jack_port_get_buffer (outport_right, nframes); - int datasize=nframes*sizeof (REALTYPE); - int incoming_datasize=SOUND_BUFFER_SIZE*sizeof (REALTYPE); - int data_read=0; - - - if (jack_ringbuffer_read_space(rb)>=(2*incoming_datasize)){ - if (datasize>incoming_datasize){ - data_read=0; - while (data_read < datasize){ - jack_ringbuffer_read(rb, (char *) outl+data_read,datasize); - jack_ringbuffer_read(rb, (char *) outr+data_read,datasize); - data_read+=incoming_datasize; - }; - } else if (datasize==incoming_datasize){ - jack_ringbuffer_read(rb, (char *) outl,datasize); - jack_ringbuffer_read(rb, (char *) outr,datasize); - } else { - }; - } else {//the ringbuffer is empty or there are too small amount of samples in it - for (int i=0;i<nframes;i++){ - outl[i]=0.0;outr[i]=0.0; - }; - }; -/* if (jack_ringbuffer_read_space(rb)>=datasize){ - jack_ringbuffer_read(rb, (char *) outl,datasize); - jack_ringbuffer_read(rb, (char *) outr,datasize); - } else {//the ringbuffer is empty or there are too small amount of samples in it - for (int i=0;i<nframes;i++){ - outl[i]=0.0;outr[i]=0.0; - }; - }; -*/ - if (pthread_mutex_trylock(&zyn_thread_lock)==0){ - pthread_cond_signal(&more_data); - pthread_mutex_unlock(&zyn_thread_lock); - }; + pthread_mutex_lock(&jackmaster->mutex); + jackmaster->GetAudioOutSamples(nframes,jack_get_sample_rate(jackclient),outl,outr); + pthread_mutex_unlock(&jackmaster->mutex); return(0); }; void JACKfinish(){ - jackfinish=1; - jack_ringbuffer_free(rb); jack_client_close(jackclient); - - usleep(100000); - delete(jackoutl); - delete(jackoutr); }; int jacksrate(jack_nframes_t nframes,void *arg){ diff --git a/src/Output/JACKaudiooutput.h b/src/Output/JACKaudiooutput.h @@ -23,9 +23,7 @@ #define JACK_AUDIO_OUTPUT_H #include <jack/jack.h> -extern "C" { -#include <jack/ringbuffer.h> -}; + #include "../globals.h" #include "../Misc/Master.h" diff --git a/src/Output/Makefile b/src/Output/Makefile @@ -6,6 +6,10 @@ ifeq ($(AUDIOOUT),JACK) objects+=JACKaudiooutput.o endif +ifeq ($(AUDIOOUT),JACK_RT) +objects+=JACK_RTaudiooutput.o +endif + ifeq ($(AUDIOOUT),PA) objects+=PAaudiooutput.o endif diff --git a/src/main.C b/src/main.C @@ -66,6 +66,8 @@ int swaplr=0;//1 for left-right swapping #ifdef JACKAUDIOOUT #include "Output/JACKaudiooutput.h" +#elif JACK_RTAUDIOOUT +#include "Output/JACKaudiooutput.h" #elif PAAUDIOOUT #include "Output/PAaudiooutput.h" #elif OSSAUDIOOUT @@ -120,7 +122,7 @@ void *thread1(void *arg){ /* * Wave output thread (if is not compiled for JACK, Portaudio and VST) */ -#if !(defined(JACKAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT)) +#if !(defined(JACKAUDIOOUT)||defined(JACK_RTAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT)) void *thread2(void *arg){ REALTYPE outputl[SOUND_BUFFER_SIZE]; @@ -190,8 +192,10 @@ void *thread4(void *arg){ void initprogram(){ #ifndef JACKAUDIOOUT +#ifndef JACK_RTAUDIOOUT fprintf(stderr,"\nSample Rate = \t\t%d\n",SAMPLE_RATE); #endif +#endif fprintf(stderr,"Sound Buffer Size = \t%d samples\n",SOUND_BUFFER_SIZE); fprintf(stderr,"Internal latency = \t%.1f ms\n",SOUND_BUFFER_SIZE*1000.0/SAMPLE_RATE); fprintf(stderr,"ADsynth Oscil.Size = \t%d samples\n",OSCIL_SIZE); @@ -208,6 +212,8 @@ void initprogram(){ audioout=new OSSaudiooutput(); #elif JACKAUDIOOUT JACKaudiooutputinit(master); +#elif JACK_RTAUDIOOUT + JACKaudiooutputinit(master); #elif PAAUDIOOUT PAaudiooutputinit(master); #endif @@ -235,6 +241,9 @@ void exitprogram(){ #ifdef JACKAUDIOOUT JACKfinish(); #endif +#ifdef JACK_RTAUDIOOUT + JACKfinish(); +#endif #ifdef PAAUDIOOUT PAfinish(); #endif @@ -398,7 +407,7 @@ int main(int argc, char *argv[]){ pthread_create(&thr1,NULL,thread1,NULL); #endif -#if !(defined(JACKAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT)) +#if !(defined(JACKAUDIOOUT)||defined(JACK_RTAUDIOOUT)||defined(PAAUDIOOUT)||defined(VSTAUDIOOUT)) pthread_create(&thr2,NULL,thread2,NULL); #endif