Hi,
Back in January/February at the start of this year, Paul announced that
he would be stepping down, and he requested that someone would stand for
being the new maintainer.
As far as I know, this didn't happen, up until Filipe Coelho(?) offered
to maintain JACK1. After speaking with Paul around March, he said that
once Ardour 5.0 was released he would do the final release of JACK1 and
then hand over maintainership.
There are a few pull requests on the GitHub, some of which are critical
to the core functionality of JACK1, like the patch for OSX which begins
to modernise JACK1's usages of the CoreAudio APIs (while still
maintaining backward compatibility).
I'd like to help the JACK community in getting OSX support
up-to-scratch. There is a promising project called CaptainJack
(https://github.com/Qix-/CaptainJack) which aims to be a modern
replacement for JackOSX, which is a vital part of the JACK ecosystem
within OSX. While it is just a start, it shows there is at least some
interest.
My question to the community is: Should an effort be put in to revive JACK1?
And to Paul; I know it's only been a little over a month since 5.0 was
released, but is it possible you could do this 'final release' of JACK1
soon so we can get the ball rolling again, or at least give some sort of
time-frame on when this can be achieved.
I personally think there should be an effort, the main issue at this
time is how the clients are sorted, and there is a patch for this. I
would be willing to step forward to fix all the issues related to OSX,
and reattempt integration of Fons' topological sort patch. In addition
to this, JACK1 is a good code-base, albeit slightly outdated, which
makes a great reference implementation for JACK3.
--
Josh
Hi,
I found some extremely useful stuff and it was a real discovery for me, just give it a try! You may find more information here <http://spoquizugu.comicbooktheatre.com/e4eor>
me
Forwarding to Jack-devel (it was a direct reply to me, but I can't do
anything with it at this stage).
-------- Forwarded Message --------
Subject: Re: [Jack-Devel] Negative xruns
Date: Fri, 9 Sep 2016 12:11:01 +0200
From: Miroslav Urbanek <mu(a)miroslavurbanek.com>
To: Josh de Kock <josh(a)itanimul.li>
Here you go.
MU
Hi,
I wonder how you normally handle the situation when the
program exits abnormally (for instance if the user kills a client)
while freewheeling.
I'm not so interested in detecting this when it happens, but
I want to handle it somewhat gracefully when my program
is started again. I.e. I don't want the program not producing
any sound and not informing that something is wrong.
As far as I can see, there is no function to check whether
jack is currently freewheeling (or is there?). So are there any
potential problems just calling "jack_set_freewheel(g_jack_client, 1)"
during program startup? (i.e. whether we are freewheeling or not)
Maybe I have misunderstood how things work, or I'm using too old
version of jack, but here's what happens:
1. Start jack 2 (jack-audio-connection-kit-devel-1.9.9.5-1.fc17.x86_64)
2. Press the "Start transport rolling" button in qjackctl.
3. Qjackctl reports "Rolling" in the display.
4. Create jack client
5. Call jack_transport_query(client, NULL).
6. jack_transport_query(client, NULL) always returns JackTransportStopped
Shouldn't jack_transport_query(client, NULL) return JackTransportRolling?
(It doesn't matter whether I activate the client or not before calling
jack_transport_query(client, NULL)).
Hi! In reference to https://github.com/jackaudio/example-clients: I saw
the code as part of a question on Stackoverflow
(http://stackoverflow.com/q/29748082/6544953). Would it be possible to
include the source code below as an example?
* There's already a midi controlled synth application in that repo
(midisine.c). But I feel the example demonstrates in a clearer way
how to send audio to the sound card's stereo output, because it just
uses audio data, not audio data plus midi handling.
* There's also the simple client example (simple_client.c), but that
one (effectively) handles bi-directional audio data streaming. This
client just sends audio data which makes it clearer how to use data
output (and, by implication, data input).
Long story in short - this example is clearer to n00bs (like me).
Thank you for your consideration!
> |/** @file simple_client.c * * @brief This simple client demonstrates
> the basic features of JACK * as they would be used by many
> applications.
> */#include<stdio.h>#include<errno.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<signal.h>#ifndefWIN32
> #include<unistd.h>#endif#include<jack/jack.h>jack_port_t*output_port1,*output_port2;jack_client_t*client;#ifndefM_PI
> #defineM_PI (3.14159265)#endif#defineTABLE_SIZE
> (200)typedefstruct{floatsine[TABLE_SIZE];intleft_phase;intright_phase;}paTestData;staticvoidsignal_handler(intsig){jack_client_close(client);fprintf(stderr,"signal
> received, exiting ...\n");exit(0);}/** * The process callback for this
> JACK application is called in a * special realtime thread once for
> each audio cycle. * * This client follows a simple rule: when the JACK
> transport is * running, copy the input port to the output. When it
> stops, exit.
> */intprocess(jack_nframes_tnframes,void*arg){jack_default_audio_sample_t*out1,*out2;paTestData
> *data =(paTestData*)arg;inti;out1
> =(jack_default_audio_sample_t*)jack_port_get_buffer(output_port1,nframes);out2
> =(jack_default_audio_sample_t*)jack_port_get_buffer(output_port2,nframes);for(i
> =0;i<nframes;i++){out1[i]=data->sine[data->left_phase];// left
> out2[i]=data->sine[data->right_phase];// right data->left_phase
> +=1;if(data->left_phase >=TABLE_SIZE)data->left_phase
> -=TABLE_SIZE;data->right_phase +=10;// higher pitch so we can
> distinguish left and right. if(data->right_phase
> >=TABLE_SIZE)data->right_phase -=TABLE_SIZE;}return0;}/** * JACK calls
> this shutdown_callback if the server ever shuts down or * decides to
> disconnect the client.
> */voidjack_shutdown(void*arg){exit(1);}intmain(intargc,char*argv[]){constchar**ports;constchar*client_name;constchar*server_name
> =NULL;jack_options_toptions
> =JackNullOption;jack_status_tstatus;paTestData data;inti;/*if (argc >=
> 2) { // client name specified? client_name = argv[1]; if (argc >= 3) {
> // server name specified? server_name = argv[2]; int my_option =
> JackNullOption | JackServerName; options = (jack_options_t)my_option;
> } } else { // use basename of argv[0] client_name = strrchr(argv[0],
> '/'); if (client_name == 0) { client_name = argv[0]; } else {
> client_name++; } }*/client_name ="mytest";for(i
> =0;i<TABLE_SIZE;i++){data.sine[i]=0.2*(float)sin(((double)i
> /(double)TABLE_SIZE)*M_PI *2.);}data.left_phase =data.right_phase
> =0;// open a client connection to the JACK server client
> =jack_client_open(client_name,options,&status,server_name);if(client
> ==NULL){fprintf(stderr,"jack_client_open() failed, ""status =
> 0x%2.0x\n",status);if(status &JackServerFailed){fprintf(stderr,"Unable
> to connect to JACK server\n");}exit(1);}if(status
> &JackServerStarted){fprintf(stderr,"JACK server started\n");}if(status
> &JackNameNotUnique){client_name
> =jack_get_client_name(client);fprintf(stderr,"unique name `%s'
> assigned\n",client_name);}// tell the JACK server to call `process()'
> whenever//there is work to be
> done.jack_set_process_callback(client,process,&data);// tell the JACK
> server to call `jack_shutdown()' if//it ever shuts down, either
> entirely, or if it//just decides to stop calling
> us.jack_on_shutdown(client,jack_shutdown,0);// create two ports
> output_port1
> =jack_port_register(client,"output1",JACK_DEFAULT_AUDIO_TYPE,JackPortIsOutput,0);output_port2
> =jack_port_register(client,"output2",JACK_DEFAULT_AUDIO_TYPE,JackPortIsOutput,0);if((output_port1
> ==NULL)||(output_port2 ==NULL)){fprintf(stderr,"no more JACK ports
> available\n");exit(1);}//Tell the JACK server that we are ready to
> roll. Our// process() callback will start running now.
> if(jack_activate(client)){fprintf(stderr,"cannot activate
> client");exit(1);}// Connect the ports. You can't do this before the
> client is// activated, because we can't make connections to clients//
> that aren't running. Note the confusing (but necessary)// orientation
> of the driver backend ports: playback ports are// "input" to the
> backend, and capture ports are "output" from// it.ports
> =jack_get_ports(client,NULL,NULL,JackPortIsPhysical|JackPortIsInput);if(ports
> ==NULL){fprintf(stderr,"no physical playback
> ports\n");exit(1);}if(jack_connect(client,jack_port_name(output_port1),ports[0])){fprintf(stderr,"cannot
> connect output
> ports\n");}if(jack_connect(client,jack_port_name(output_port2),ports[1])){fprintf(stderr,"cannot
> connect output ports\n");}jack_free(ports);// install a signal handler
> to properly quits jack client #ifdefWIN32
> signal(SIGINT,signal_handler);signal(SIGABRT,signal_handler);signal(SIGTERM,signal_handler);#elsesignal(SIGQUIT,signal_handler);signal(SIGTERM,signal_handler);signal(SIGHUP,signal_handler);signal(SIGINT,signal_handler);#endif//
> keep running until the Ctrl+C while(1){#ifdefWIN32
> Sleep(1000);#elsesleep(1);#endif}jack_client_close(client);exit(0);}|