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:
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