Logo Search packages:      
Sourcecode: jack-audio-connection-kit version File versions  Download package

inprocess.c

Go to the documentation of this file.
/** @file inprocess.c
 *
 * @brief This demonstrates the basic concepts for writing a client
 * that runs within the JACK server process.
 *
 * For the sake of example, a port_pair_t is allocated in
 * jack_initialize(), passed to inprocess() as an argument, then freed
 * in jack_finish().
 */

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <jack/jack.h>

/**
 * For the sake of example, an instance of this struct is allocated in
 * jack_initialize(), passed to inprocess() as an argument, then freed
 * in jack_finish().
 */
00021 typedef struct {
      jack_port_t *input_port;
      jack_port_t *output_port;
} port_pair_t;

/**
 * Called in the realtime thread on every process cycle.  The entry
 * point name was passed to jack_set_process_callback() from
 * jack_initialize().  Although this is an internal client, its
 * process() interface is identical to @ref simple_client.c.
 *
 * @return 0 if successful; otherwise jack_finish() will be called and
 * the client terminated immediately.
 */
int
00036 inprocess (jack_nframes_t nframes, void *arg)
{
      port_pair_t *pp = arg;
      jack_default_audio_sample_t *out =
            jack_port_get_buffer (pp->output_port, nframes);
      jack_default_audio_sample_t *in =
            jack_port_get_buffer (pp->input_port, nframes);

      memcpy (out, in, sizeof (jack_default_audio_sample_t) * nframes);

      return 0;               /* continue */
}

/**
 * This required entry point is called after the client is loaded by
 * jack_internal_client_load().
 *
 * @param client pointer to JACK client structure.
 * @param load_init character string passed to the load operation.
 *
 * @return 0 if successful; otherwise jack_finish() will be called and
 * the client terminated immediately.
 */
int
00060 jack_initialize (jack_client_t *client, const char *load_init)
{
      port_pair_t *pp = malloc (sizeof (port_pair_t));

      if (pp == NULL)
            return 1;         /* heap exhausted */

      jack_set_process_callback (client, inprocess, pp);

      /* create a pair of ports */
      pp->input_port = jack_port_register (client, "input",
                                   JACK_DEFAULT_AUDIO_TYPE,
                                   JackPortIsInput, 0);
      pp->output_port = jack_port_register (client, "output",
                                    JACK_DEFAULT_AUDIO_TYPE,
                                    JackPortIsOutput, 0);

      /* join the process() cycle */
      jack_activate (client);

      /* connect the ports.  NOTE: this code only works with the
       * ALSA backend.  See simple_client.c for a better method that
       * works with any backend. */
      if (jack_connect (client, "alsa_pcm:capture_1",
                    jack_port_name (pp->input_port))) {
            fprintf (stderr, "cannot connect input port\n");
            return 1;         /* terminate client */
      }

      if (jack_connect (client, jack_port_name (pp->output_port),
                    "alsa_pcm:playback_1")) {
            fprintf (stderr, "cannot connect output port\n");
            return 1;         /* terminate client */
      }

      return 0;               /* success */
}

/**
 * This required entry point is called immediately before the client
 * is unloaded, which could happen due to a call to
 * jack_internal_client_unload(), or a nonzero return from either
 * jack_initialize() or inprocess().
 *
 * @param arg the same parameter provided to inprocess().
 */
void
00107 jack_finish (void *arg)
{
      if (arg)
            free ((port_pair_t *) arg);
}

Generated by  Doxygen 1.6.0   Back to index