summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/alsa/alsa_driver.c1269
-rw-r--r--drivers/alsa/alsa_driver.h269
-rw-r--r--drivers/alsa/generic.h6
-rw-r--r--drivers/alsa/generic_hw.c10
-rw-r--r--drivers/alsa/hammerfall.c58
-rw-r--r--drivers/alsa/hammerfall.h18
-rw-r--r--drivers/alsa/hdsp.c117
-rw-r--r--drivers/alsa/hdsp.h8
-rw-r--r--drivers/alsa/ice1712.c94
-rw-r--r--drivers/alsa/ice1712.h48
-rw-r--r--drivers/alsa/memops.c312
-rw-r--r--drivers/alsa/usx2y.c339
-rw-r--r--drivers/alsa/usx2y.h18
-rw-r--r--drivers/alsa_midi/a2j.h131
-rw-r--r--drivers/alsa_midi/alsa_midi.c1032
-rw-r--r--drivers/alsa_midi/alsa_midi_driver.c26
-rw-r--r--drivers/alsa_midi/list.c261
-rw-r--r--drivers/alsa_midi/list.h563
-rw-r--r--drivers/alsa_midi/midi_pack.h7
-rw-r--r--drivers/alsa_midi/midi_unpack.h87
-rw-r--r--drivers/alsa_midi/port.c56
-rw-r--r--drivers/alsa_midi/port.h6
-rw-r--r--drivers/alsa_midi/port_hash.c43
-rw-r--r--drivers/alsa_midi/port_hash.h8
-rw-r--r--drivers/alsa_midi/port_thread.c138
-rw-r--r--drivers/alsa_midi/port_thread.h12
-rw-r--r--drivers/am/alsa_midi.h6
-rw-r--r--drivers/am/alsa_midi_driver.c70
-rw-r--r--drivers/am/alsa_rawmidi.c704
-rw-r--r--drivers/am/alsa_seqmidi.c609
-rw-r--r--drivers/am/midi_pack.h7
-rw-r--r--drivers/am/midi_unpack.h87
-rw-r--r--[-rwxr-xr-x]drivers/coreaudio/coreaudio_driver.c1535
-rw-r--r--[-rwxr-xr-x]drivers/coreaudio/coreaudio_driver.h50
-rw-r--r--drivers/dummy/dummy_driver.c275
-rw-r--r--drivers/dummy/dummy_driver.h27
-rw-r--r--drivers/firewire/ffado_driver.c676
-rw-r--r--drivers/firewire/ffado_driver.h171
-rw-r--r--drivers/freebob/freebob_driver.c980
-rw-r--r--drivers/freebob/freebob_driver.h139
-rw-r--r--drivers/netjack/net_driver.c1114
-rw-r--r--drivers/netjack/net_driver.h9
-rw-r--r--drivers/netjack/netjack.c1188
-rw-r--r--drivers/netjack/netjack.h160
-rw-r--r--drivers/netjack/netjack_packet.c1979
-rw-r--r--drivers/netjack/netjack_packet.h108
-rw-r--r--drivers/oss/oss_driver.c1426
-rw-r--r--drivers/oss/oss_driver.h51
-rw-r--r--drivers/portaudio/portaudio_driver.c847
-rw-r--r--drivers/portaudio/portaudio_driver.h36
-rw-r--r--drivers/sun/sun_driver.c1326
-rw-r--r--drivers/sun/sun_driver.h53
52 files changed, 9262 insertions, 9307 deletions
diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c
index c7dd724..2f42e31 100644
--- a/drivers/alsa/alsa_driver.c
+++ b/drivers/alsa/alsa_driver.c
@@ -16,7 +16,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#include <math.h>
#include <stdio.h>
@@ -44,10 +44,10 @@
#include "usx2y.h"
#include "generic.h"
-extern void store_work_time (int);
-extern void store_wait_time (int);
-extern void show_wait_times ();
-extern void show_work_times ();
+extern void store_work_time(int);
+extern void store_wait_time(int);
+extern void show_wait_times();
+extern void show_work_times();
#undef DEBUG_WAKEUP
@@ -98,34 +98,34 @@ alsa_driver_check_capabilities (alsa_driver_t *driver)
}
static char*
-get_control_device_name(const char * device_name)
+get_control_device_name (const char * device_name)
{
- char * ctl_name;
- const char * comma;
-
- /* the user wants a hw or plughw device, the ctl name
- * should be hw:x where x is the card identification.
- * We skip the subdevice suffix that starts with comma */
-
- if (strncasecmp(device_name, "plughw:", 7) == 0) {
- /* skip the "plug" prefix" */
- device_name += 4;
- }
-
- comma = strchr(device_name, ',');
- if (comma == NULL) {
- ctl_name = strdup(device_name);
- if (ctl_name == NULL) {
- jack_error("strdup(\"%s\") failed.", device_name);
- }
- } else {
- ctl_name = strndup(device_name, comma - device_name);
- if (ctl_name == NULL) {
- jack_error("strndup(\"%s\", %u) failed.", device_name, (unsigned int)(comma - device_name));
- }
- }
-
- return ctl_name;
+ char * ctl_name;
+ const char * comma;
+
+ /* the user wants a hw or plughw device, the ctl name
+ * should be hw:x where x is the card identification.
+ * We skip the subdevice suffix that starts with comma */
+
+ if (strncasecmp (device_name, "plughw:", 7) == 0) {
+ /* skip the "plug" prefix" */
+ device_name += 4;
+ }
+
+ comma = strchr (device_name, ',');
+ if (comma == NULL) {
+ ctl_name = strdup (device_name);
+ if (ctl_name == NULL) {
+ jack_error ("strdup(\"%s\") failed.", device_name);
+ }
+ } else {
+ ctl_name = strndup (device_name, comma - device_name);
+ if (ctl_name == NULL) {
+ jack_error ("strndup(\"%s\", %u) failed.", device_name, (unsigned int)(comma - device_name));
+ }
+ }
+
+ return ctl_name;
}
static int
@@ -137,22 +137,22 @@ alsa_driver_check_card_type (alsa_driver_t *driver)
snd_ctl_card_info_alloca (&card_info);
- ctl_name = get_control_device_name(driver->alsa_name_playback);
+ ctl_name = get_control_device_name (driver->alsa_name_playback);
// XXX: I don't know the "right" way to do this. Which to use
// driver->alsa_name_playback or driver->alsa_name_capture.
if ((err = snd_ctl_open (&driver->ctl_handle, ctl_name, 0)) < 0) {
jack_error ("control open \"%s\" (%s)", ctl_name,
- snd_strerror(err));
- } else if ((err = snd_ctl_card_info(driver->ctl_handle, card_info)) < 0) {
+ snd_strerror (err));
+ } else if ((err = snd_ctl_card_info (driver->ctl_handle, card_info)) < 0) {
jack_error ("control hardware info \"%s\" (%s)",
driver->alsa_name_playback, snd_strerror (err));
snd_ctl_close (driver->ctl_handle);
}
- driver->alsa_driver = strdup(snd_ctl_card_info_get_driver (card_info));
+ driver->alsa_driver = strdup (snd_ctl_card_info_get_driver (card_info));
- free(ctl_name);
+ free (ctl_name);
return alsa_driver_check_capabilities (driver);
}
@@ -174,8 +174,8 @@ alsa_driver_hdsp_hardware (alsa_driver_t *driver)
static int
alsa_driver_ice1712_hardware (alsa_driver_t *driver)
{
- driver->hw = jack_alsa_ice1712_hw_new (driver);
- return 0;
+ driver->hw = jack_alsa_ice1712_hw_new (driver);
+ return 0;
}
static int
@@ -198,24 +198,24 @@ alsa_driver_hw_specific (alsa_driver_t *driver, int hw_monitoring,
{
int err;
- if (!strcmp(driver->alsa_driver, "RME9652")) {
+ if (!strcmp (driver->alsa_driver, "RME9652")) {
if ((err = alsa_driver_hammerfall_hardware (driver)) != 0) {
return err;
}
- } else if (!strcmp(driver->alsa_driver, "H-DSP")) {
- if ((err = alsa_driver_hdsp_hardware (driver)) !=0) {
- return err;
- }
- } else if (!strcmp(driver->alsa_driver, "ICE1712")) {
- if ((err = alsa_driver_ice1712_hardware (driver)) !=0) {
- return err;
- }
- } else if (!strcmp(driver->alsa_driver, "USB US-X2Y")) {
- if ((err = alsa_driver_usx2y_hardware (driver)) !=0) {
- return err;
+ } else if (!strcmp (driver->alsa_driver, "H-DSP")) {
+ if ((err = alsa_driver_hdsp_hardware (driver)) != 0) {
+ return err;
+ }
+ } else if (!strcmp (driver->alsa_driver, "ICE1712")) {
+ if ((err = alsa_driver_ice1712_hardware (driver)) != 0) {
+ return err;
+ }
+ } else if (!strcmp (driver->alsa_driver, "USB US-X2Y")) {
+ if ((err = alsa_driver_usx2y_hardware (driver)) != 0) {
+ return err;
}
} else {
- if ((err = alsa_driver_generic_hardware (driver)) != 0) {
+ if ((err = alsa_driver_generic_hardware (driver)) != 0) {
return err;
}
}
@@ -258,50 +258,50 @@ alsa_driver_setup_io_function_pointers (alsa_driver_t *driver)
case 2:
switch (driver->dither) {
case Rectangular:
- jack_info("Rectangular dithering at 16 bits");
- driver->write_via_copy = driver->quirk_bswap?
- sample_move_dither_rect_d16_sSs:
- sample_move_dither_rect_d16_sS;
+ jack_info ("Rectangular dithering at 16 bits");
+ driver->write_via_copy = driver->quirk_bswap ?
+ sample_move_dither_rect_d16_sSs :
+ sample_move_dither_rect_d16_sS;
break;
case Triangular:
- jack_info("Triangular dithering at 16 bits");
- driver->write_via_copy = driver->quirk_bswap?
- sample_move_dither_tri_d16_sSs:
- sample_move_dither_tri_d16_sS;
+ jack_info ("Triangular dithering at 16 bits");
+ driver->write_via_copy = driver->quirk_bswap ?
+ sample_move_dither_tri_d16_sSs :
+ sample_move_dither_tri_d16_sS;
break;
case Shaped:
- jack_info("Noise-shaped dithering at 16 bits");
- driver->write_via_copy = driver->quirk_bswap?
- sample_move_dither_shaped_d16_sSs:
- sample_move_dither_shaped_d16_sS;
+ jack_info ("Noise-shaped dithering at 16 bits");
+ driver->write_via_copy = driver->quirk_bswap ?
+ sample_move_dither_shaped_d16_sSs :
+ sample_move_dither_shaped_d16_sS;
break;
default:
- driver->write_via_copy = driver->quirk_bswap?
- sample_move_d16_sSs :
- sample_move_d16_sS;
+ driver->write_via_copy = driver->quirk_bswap ?
+ sample_move_d16_sSs :
+ sample_move_d16_sS;
break;
}
break;
case 3: /* NO DITHER */
- driver->write_via_copy = driver->quirk_bswap?
- sample_move_d24_sSs:
- sample_move_d24_sS;
+ driver->write_via_copy = driver->quirk_bswap ?
+ sample_move_d24_sSs :
+ sample_move_d24_sS;
break;
case 4: /* NO DITHER */
- driver->write_via_copy = driver->quirk_bswap?
- sample_move_d32u24_sSs:
- sample_move_d32u24_sS;
+ driver->write_via_copy = driver->quirk_bswap ?
+ sample_move_d32u24_sSs :
+ sample_move_d32u24_sS;
break;
default:
jack_error ("impossible sample width (%d) discovered!",
- driver->playback_sample_bytes);
+ driver->playback_sample_bytes);
exit (1);
}
}
@@ -313,19 +313,19 @@ alsa_driver_setup_io_function_pointers (alsa_driver_t *driver)
} else {
switch (driver->capture_sample_bytes) {
case 2:
- driver->read_via_copy = driver->quirk_bswap?
- sample_move_dS_s16s:
- sample_move_dS_s16;
+ driver->read_via_copy = driver->quirk_bswap ?
+ sample_move_dS_s16s :
+ sample_move_dS_s16;
break;
case 3:
- driver->read_via_copy = driver->quirk_bswap?
- sample_move_dS_s24s:
- sample_move_dS_s24;
+ driver->read_via_copy = driver->quirk_bswap ?
+ sample_move_dS_s24s :
+ sample_move_dS_s24;
break;
case 4:
- driver->read_via_copy = driver->quirk_bswap?
- sample_move_dS_s32u24s:
- sample_move_dS_s32u24;
+ driver->read_via_copy = driver->quirk_bswap ?
+ sample_move_dS_s32u24s :
+ sample_move_dS_s32u24;
break;
}
}
@@ -345,24 +345,25 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
int err, format;
unsigned int frame_rate;
snd_pcm_uframes_t stop_th;
+
static struct {
char Name[40];
snd_pcm_format_t format;
int swapped;
} formats[] = {
- {"32bit float little-endian", SND_PCM_FORMAT_FLOAT_LE, IS_LE},
- {"32bit integer little-endian", SND_PCM_FORMAT_S32_LE, IS_LE},
- {"32bit integer big-endian", SND_PCM_FORMAT_S32_BE, IS_BE},
- {"24bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE, IS_LE},
- {"24bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE, IS_BE},
- {"24bit little-endian", SND_PCM_FORMAT_S24_LE, IS_LE},
- {"24bit big-endian", SND_PCM_FORMAT_S24_BE, IS_BE},
- {"16bit little-endian", SND_PCM_FORMAT_S16_LE, IS_LE},
- {"16bit big-endian", SND_PCM_FORMAT_S16_BE, IS_BE},
+ { "32bit float little-endian", SND_PCM_FORMAT_FLOAT_LE, IS_LE },
+ { "32bit integer little-endian", SND_PCM_FORMAT_S32_LE, IS_LE },
+ { "32bit integer big-endian", SND_PCM_FORMAT_S32_BE, IS_BE },
+ { "24bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE, IS_LE },
+ { "24bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE, IS_BE },
+ { "24bit little-endian", SND_PCM_FORMAT_S24_LE, IS_LE },
+ { "24bit big-endian", SND_PCM_FORMAT_S24_BE, IS_BE },
+ { "16bit little-endian", SND_PCM_FORMAT_S16_LE, IS_LE },
+ { "16bit big-endian", SND_PCM_FORMAT_S16_BE, IS_BE },
};
-#define NUMFORMATS (sizeof(formats)/sizeof(formats[0]))
+#define NUMFORMATS (sizeof(formats) / sizeof(formats[0]))
- if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) {
+ if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) {
jack_error ("ALSA: no playback configurations available (%s)",
snd_strerror (err));
return -1;
@@ -416,10 +417,10 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
}
}
- frame_rate = driver->frame_rate ;
+ frame_rate = driver->frame_rate;
err = snd_pcm_hw_params_set_rate_near (handle, hw_params,
- &frame_rate, NULL) ;
- driver->frame_rate = frame_rate ;
+ &frame_rate, NULL);
+ driver->frame_rate = frame_rate;
if (err < 0) {
jack_error ("ALSA: cannot set sample/frame rate to %"
PRIu32 " for %s", driver->frame_rate,
@@ -429,10 +430,10 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
if (!*nchns) {
/*if not user-specified, try to find the maximum
* number of channels */
- unsigned int channels_max ;
+ unsigned int channels_max;
err = snd_pcm_hw_params_get_channels_max (hw_params,
&channels_max);
- *nchns = channels_max ;
+ *nchns = channels_max;
if (*nchns > 1024) {
@@ -442,14 +443,14 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
they can't be bothered to set up a proper
default device, limit the number of
channels for them to a sane default.
- */
+ */
jack_error (
-"You appear to be using the ALSA software \"plug\" layer, probably\n"
-"a result of using the \"default\" ALSA device. This is less\n"
-"efficient than it could be. Consider using a hardware device\n"
-"instead rather than using the plug layer. Usually the name of the\n"
-"hardware device that corresponds to the first sound card is hw:0\n"
+ "You appear to be using the ALSA software \"plug\" layer, probably\n"
+ "a result of using the \"default\" ALSA device. This is less\n"
+ "efficient than it could be. Consider using a hardware device\n"
+ "instead rather than using the plug layer. Usually the name of the\n"
+ "hardware device that corresponds to the first sound card is hw:0\n"
);
*nchns = 2;
}
@@ -474,8 +475,9 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
*nperiodsp = driver->user_nperiods;
snd_pcm_hw_params_set_periods_min (handle, hw_params, nperiodsp, NULL);
- if (*nperiodsp < driver->user_nperiods)
+ if (*nperiodsp < driver->user_nperiods) {
*nperiodsp = driver->user_nperiods;
+ }
if (snd_pcm_hw_params_set_periods_near (handle, hw_params,
nperiodsp, NULL) < 0) {
jack_error ("ALSA: cannot set number of periods to %u for %s",
@@ -485,15 +487,15 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
if (*nperiodsp < driver->user_nperiods) {
jack_error ("ALSA: got smaller periods %u than %u for %s",
- *nperiodsp, (unsigned int) driver->user_nperiods,
+ *nperiodsp, (unsigned int)driver->user_nperiods,
stream_name);
return -1;
}
jack_info ("ALSA: use %d periods for %s", *nperiodsp, stream_name);
#if 0
- if (!jack_power_of_two(driver->frames_per_cycle)) {
- jack_error("JACK: frames must be a power of two "
- "(64, 512, 1024, ...)\n");
+ if (!jack_power_of_two (driver->frames_per_cycle)) {
+ jack_error ("JACK: frames must be a power of two "
+ "(64, 512, 1024, ...)\n");
return -1;
}
#endif
@@ -544,8 +546,8 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
#if 0
jack_info ("set silence size to %lu * %lu = %lu",
- driver->frames_per_cycle, *nperiodsp,
- driver->frames_per_cycle * *nperiodsp);
+ driver->frames_per_cycle, *nperiodsp,
+ driver->frames_per_cycle * *nperiodsp);
if ((err = snd_pcm_sw_params_set_silence_size (
handle, sw_params,
@@ -556,14 +558,15 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
}
#endif
- if (handle == driver->playback_handle)
+ if (handle == driver->playback_handle) {
err = snd_pcm_sw_params_set_avail_min (
handle, sw_params,
driver->frames_per_cycle
* (*nperiodsp - driver->user_nperiods + 1));
- else
+ } else {
err = snd_pcm_sw_params_set_avail_min (
handle, sw_params, driver->frames_per_cycle);
+ }
if (err < 0) {
jack_error ("ALSA: cannot set avail min for %s", stream_name);
@@ -601,8 +604,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
driver->user_nperiods = user_nperiods;
jack_info ("configuring for %" PRIu32 "Hz, period = %"
- PRIu32 " frames (%.1f ms), buffer = %" PRIu32 " periods",
- rate, frames_per_cycle, (((float)frames_per_cycle / (float) rate) * 1000.0f), user_nperiods);
+ PRIu32 " frames (%.1f ms), buffer = %" PRIu32 " periods",
+ rate, frames_per_cycle, (((float)frames_per_cycle / (float)rate) * 1000.0f), user_nperiods);
if (driver->capture_handle) {
if (alsa_driver_configure_stream (
@@ -666,14 +669,12 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
driver->frame_rate = cr;
}
- }
- else if (driver->capture_handle && cr != driver->frame_rate) {
+ } else if (driver->capture_handle && cr != driver->frame_rate) {
jack_error ("capture sample rate in use (%d Hz) does not "
"match requested rate (%d Hz)",
cr, driver->frame_rate);
driver->frame_rate = cr;
- }
- else if (driver->playback_handle && pr != driver->frame_rate) {
+ } else if (driver->playback_handle && pr != driver->frame_rate) {
jack_error ("playback sample rate in use (%d Hz) does not "
"match requested rate (%d Hz)",
pr, driver->frame_rate);
@@ -684,28 +685,31 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
/* check the fragment size, since thats non-negotiable */
if (driver->playback_handle) {
- snd_pcm_access_t access;
+ snd_pcm_access_t access;
- err = snd_pcm_hw_params_get_period_size (
- driver->playback_hw_params, &p_period_size, &dir);
- if (err != 0)
+ err = snd_pcm_hw_params_get_period_size (
+ driver->playback_hw_params, &p_period_size, &dir);
+ if (err != 0) {
jack_error ("snd_pcm_hw_params_get_period_size (playback) : %s",
- snd_strerror (err));
+ snd_strerror (err));
+ }
- err = snd_pcm_hw_params_get_format (
- driver->playback_hw_params,
+ err = snd_pcm_hw_params_get_format (
+ driver->playback_hw_params,
&(driver->playback_sample_format));
- if (err != 0)
+ if (err != 0) {
jack_error ("snd_pcm_hw_params_get_format (playback) : %s",
- snd_strerror (err));
+ snd_strerror (err));
+ }
- err = snd_pcm_hw_params_get_access (driver->playback_hw_params,
+ err = snd_pcm_hw_params_get_access (driver->playback_hw_params,
&access);
- if (err != 0)
+ if (err != 0) {
jack_error ("snd_pcm_hw_params_get_access (playback) : %s",
- snd_strerror (err));
+ snd_strerror (err));
+ }
- driver->playback_interleaved =
+ driver->playback_interleaved =
(access == SND_PCM_ACCESS_MMAP_INTERLEAVED)
|| (access == SND_PCM_ACCESS_MMAP_COMPLEX);
@@ -719,28 +723,31 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
}
if (driver->capture_handle) {
- snd_pcm_access_t access;
+ snd_pcm_access_t access;
- err = snd_pcm_hw_params_get_period_size (
- driver->capture_hw_params, &c_period_size, &dir);
- if (err != 0)
+ err = snd_pcm_hw_params_get_period_size (
+ driver->capture_hw_params, &c_period_size, &dir);
+ if (err != 0) {
jack_error ("snd_pcm_hw_params_get_period_size (capture): %s",
- snd_strerror (err));
+ snd_strerror (err));
+ }
- err = snd_pcm_hw_params_get_format (
- driver->capture_hw_params,
+ err = snd_pcm_hw_params_get_format (
+ driver->capture_hw_params,
&(driver->capture_sample_format));
- if (err != 0)
+ if (err != 0) {
jack_error ("snd_pcm_hw_params_get_format (capture) : %s",
- snd_strerror (err));
+ snd_strerror (err));
+ }
- err = snd_pcm_hw_params_get_access (driver->capture_hw_params,
+ err = snd_pcm_hw_params_get_access (driver->capture_hw_params,
&access);
- if (err != 0)
+ if (err != 0) {
jack_error ("snd_pcm_hw_params_get_access (capture) : %s",
- snd_strerror (err));
+ snd_strerror (err));
+ }
- driver->capture_interleaved =
+ driver->capture_interleaved =
(access == SND_PCM_ACCESS_MMAP_INTERLEAVED)
|| (access == SND_PCM_ACCESS_MMAP_COMPLEX);
@@ -749,7 +756,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
PRIu32
" frames but got %uc frames for capture",
driver->frames_per_cycle, p_period_size);
- goto errout;
+ goto errout;
}
}
@@ -762,7 +769,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
if (driver->playback_handle) {
switch (driver->playback_sample_format) {
- case SND_PCM_FORMAT_FLOAT_LE:
+ case SND_PCM_FORMAT_FLOAT_LE:
case SND_PCM_FORMAT_S32_LE:
case SND_PCM_FORMAT_S24_3LE:
case SND_PCM_FORMAT_S24_3BE:
@@ -782,7 +789,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
if (driver->capture_handle) {
switch (driver->capture_sample_format) {
- case SND_PCM_FORMAT_FLOAT_LE:
+ case SND_PCM_FORMAT_FLOAT_LE:
case SND_PCM_FORMAT_S32_LE:
case SND_PCM_FORMAT_S24_3LE:
case SND_PCM_FORMAT_S24_3BE:
@@ -803,8 +810,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
if (driver->playback_interleaved) {
const snd_pcm_channel_area_t *my_areas;
snd_pcm_uframes_t offset, frames;
- if (snd_pcm_mmap_begin(driver->playback_handle,
- &my_areas, &offset, &frames) < 0) {
+ if (snd_pcm_mmap_begin (driver->playback_handle,
+ &my_areas, &offset, &frames) < 0) {
jack_error ("ALSA: %s: mmap areas info error",
driver->alsa_name_playback);
goto errout;
@@ -819,8 +826,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
if (driver->capture_interleaved) {
const snd_pcm_channel_area_t *my_areas;
snd_pcm_uframes_t offset, frames;
- if (snd_pcm_mmap_begin(driver->capture_handle,
- &my_areas, &offset, &frames) < 0) {
+ if (snd_pcm_mmap_begin (driver->capture_handle,
+ &my_areas, &offset, &frames) < 0) {
jack_error ("ALSA: %s: mmap areas info error",
driver->alsa_name_capture);
goto errout;
@@ -844,55 +851,53 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
channels require action on every cycle. any bits that are
not set after the engine's process() call indicate channels
that potentially need to be silenced.
- */
+ */
bitset_create (&driver->channels_done, driver->max_nchannels);
bitset_create (&driver->channels_not_done, driver->max_nchannels);
if (driver->playback_handle) {
- driver->playback_addr = (char **)
- malloc (sizeof (char *) * driver->playback_nchannels);
+ driver->playback_addr = (char**)
+ malloc (sizeof(char *) * driver->playback_nchannels);
memset (driver->playback_addr, 0,
- sizeof (char *) * driver->playback_nchannels);
- driver->playback_interleave_skip = (unsigned long *)
- malloc (sizeof (unsigned long *) * driver->playback_nchannels);
+ sizeof(char *) * driver->playback_nchannels);
+ driver->playback_interleave_skip = (unsigned long*)
+ malloc (sizeof(unsigned long *) * driver->playback_nchannels);
memset (driver->playback_interleave_skip, 0,
- sizeof (unsigned long *) * driver->playback_nchannels);
- driver->silent = (unsigned long *)
- malloc (sizeof (unsigned long)
- * driver->playback_nchannels);
+ sizeof(unsigned long *) * driver->playback_nchannels);
+ driver->silent = (unsigned long*)
+ malloc (sizeof(unsigned long)
+ * driver->playback_nchannels);
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
driver->silent[chn] = 0;
- }
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
bitset_add (driver->channels_done, chn);
- }
- driver->dither_state = (dither_state_t *)
- calloc ( driver->playback_nchannels,
- sizeof (dither_state_t));
+ driver->dither_state = (dither_state_t*)
+ calloc ( driver->playback_nchannels,
+ sizeof(dither_state_t));
}
if (driver->capture_handle) {
- driver->capture_addr = (char **)
- malloc (sizeof (char *) * driver->capture_nchannels);
+ driver->capture_addr = (char**)
+ malloc (sizeof(char *) * driver->capture_nchannels);
memset (driver->capture_addr, 0,
- sizeof (char *) * driver->capture_nchannels);
- driver->capture_interleave_skip = (unsigned long *)
- malloc (sizeof (unsigned long *) * driver->capture_nchannels);
+ sizeof(char *) * driver->capture_nchannels);
+ driver->capture_interleave_skip = (unsigned long*)
+ malloc (sizeof(unsigned long *) * driver->capture_nchannels);
memset (driver->capture_interleave_skip, 0,
- sizeof (unsigned long *) * driver->capture_nchannels);
+ sizeof(unsigned long *) * driver->capture_nchannels);
}
- driver->clock_sync_data = (ClockSyncStatus *)
- malloc (sizeof (ClockSyncStatus) * driver->max_nchannels);
+ driver->clock_sync_data = (ClockSyncStatus*)
+ malloc (sizeof(ClockSyncStatus) * driver->max_nchannels);
driver->period_usecs =
- (jack_time_t) floor ((((float) driver->frames_per_cycle) /
- driver->frame_rate) * 1000000.0f);
- driver->poll_timeout = (int) floor (1.5f * driver->period_usecs);
+ (jack_time_t)floor ((((float)driver->frames_per_cycle) /
+ driver->frame_rate) * 1000000.0f);
+ driver->poll_timeout = (int)floor (1.5f * driver->period_usecs);
if (driver->engine) {
if (driver->engine->set_buffer_size (driver->engine,
@@ -902,19 +907,19 @@ alsa_driver_set_parameters (alsa_driver_t *driver,
}
}
- driver->previously_successfully_configured = TRUE;
+ driver->previously_successfully_configured = TRUE;
return 0;
- errout:
- if (driver->previously_successfully_configured) {
- /* attempt to restore previous configuration */
- jack_info ("ALSA: falling back to old configuration");
- if (alsa_driver_set_parameters (driver, old_frames_per_cycle, old_user_nperiods, old_rate) == 0) {
- jack_error ("ALSA: reverted to previous parameters after failure");
- return 0;
- }
- }
- return -1;
+errout:
+ if (driver->previously_successfully_configured) {
+ /* attempt to restore previous configuration */
+ jack_info ("ALSA: falling back to old configuration");
+ if (alsa_driver_set_parameters (driver, old_frames_per_cycle, old_user_nperiods, old_rate) == 0) {
+ jack_error ("ALSA: reverted to previous parameters after failure");
+ return 0;
+ }
+ }
+ return -1;
}
static int
@@ -943,8 +948,8 @@ alsa_driver_get_channel_addresses (alsa_driver_t *driver,
if (capture_avail) {
if ((err = snd_pcm_mmap_begin (
driver->capture_handle, &driver->capture_areas,
- (snd_pcm_uframes_t *) capture_offset,
- (snd_pcm_uframes_t *) capture_avail)) < 0) {
+ (snd_pcm_uframes_t*)capture_offset,
+ (snd_pcm_uframes_t*)capture_avail)) < 0) {
jack_error ("ALSA: %s: mmap areas info error",
driver->alsa_name_capture);
return -1;
@@ -953,17 +958,17 @@ alsa_driver_get_channel_addresses (alsa_driver_t *driver,
for (chn = 0; chn < driver->capture_nchannels; chn++) {
const snd_pcm_channel_area_t *a =
&driver->capture_areas[chn];
- driver->capture_addr[chn] = (char *) a->addr
- + ((a->first + a->step * *capture_offset) / 8);
- driver->capture_interleave_skip[chn] = (unsigned long ) (a->step / 8);
+ driver->capture_addr[chn] = (char*)a->addr
+ + ((a->first + a->step * *capture_offset) / 8);
+ driver->capture_interleave_skip[chn] = (unsigned long )(a->step / 8);
}
}
if (playback_avail) {
if ((err = snd_pcm_mmap_begin (
driver->playback_handle, &driver->playback_areas,
- (snd_pcm_uframes_t *) playback_offset,
- (snd_pcm_uframes_t *) playback_avail)) < 0) {
+ (snd_pcm_uframes_t*)playback_offset,
+ (snd_pcm_uframes_t*)playback_avail)) < 0) {
jack_error ("ALSA: %s: mmap areas info error ",
driver->alsa_name_playback);
return -1;
@@ -972,9 +977,9 @@ alsa_driver_get_channel_addresses (alsa_driver_t *driver,
for (chn = 0; chn < driver->playback_nchannels; chn++) {
const snd_pcm_channel_area_t *a =
&driver->playback_areas[chn];
- driver->playback_addr[chn] = (char *) a->addr
- + ((a->first + a->step * *playback_offset) / 8);
- driver->playback_interleave_skip[chn] = (unsigned long ) (a->step / 8);
+ driver->playback_addr[chn] = (char*)a->addr
+ + ((a->first + a->step * *playback_offset) / 8);
+ driver->playback_interleave_skip[chn] = (unsigned long )(a->step / 8);
}
}
@@ -995,7 +1000,7 @@ alsa_driver_start (alsa_driver_t *driver)
if ((err = snd_pcm_prepare (driver->playback_handle)) < 0) {
jack_error ("ALSA: prepare error for playback on "
"\"%s\" (%s)", driver->alsa_name_playback,
- snd_strerror(err));
+ snd_strerror (err));
return -1;
}
}
@@ -1005,7 +1010,7 @@ alsa_driver_start (alsa_driver_t *driver)
if ((err = snd_pcm_prepare (driver->capture_handle)) < 0) {
jack_error ("ALSA: prepare error for capture on \"%s\""
" (%s)", driver->alsa_name_capture,
- snd_strerror(err));
+ snd_strerror (err));
return -1;
}
}
@@ -1042,14 +1047,14 @@ alsa_driver_start (alsa_driver_t *driver)
free (driver->pfd);
}
- driver->pfd = (struct pollfd *)
- malloc (sizeof (struct pollfd) *
- (driver->playback_nfds + driver->capture_nfds + 2));
+ driver->pfd = (struct pollfd*)
+ malloc (sizeof(struct pollfd) *
+ (driver->playback_nfds + driver->capture_nfds + 2));
if (driver->playback_handle) {
/* fill playback buffer with zeroes, and mark
all fragments as having data.
- */
+ */
pavail = snd_pcm_avail_update (driver->playback_handle);
@@ -1060,7 +1065,7 @@ alsa_driver_start (alsa_driver_t *driver)
}
if (alsa_driver_get_channel_addresses (driver,
- 0, &pavail, 0, &poffset)) {
+ 0, &pavail, 0, &poffset)) {
return -1;
}
@@ -1071,7 +1076,7 @@ alsa_driver_start (alsa_driver_t *driver)
alsa-lib may have a better function for doing this
here, where the goal is to silence the entire
buffer.
- */
+ */
for (chn = 0; chn < driver->playback_nchannels; chn++) {
alsa_driver_silence_on_channel (
@@ -1112,7 +1117,7 @@ alsa_driver_stop (alsa_driver_t *driver)
/* silence all capture port buffers, because we might
be entering offline mode.
- */
+ */
for (chn = 0, node = driver->capture_ports; node;
node = jack_slist_next (node), chn++) {
@@ -1121,9 +1126,9 @@ alsa_driver_stop (alsa_driver_t *driver)
char* buf;
jack_nframes_t nframes = driver->engine->control->buffer_size;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- memset (buf, 0, sizeof (jack_default_audio_sample_t) * nframes);
+ memset (buf, 0, sizeof(jack_default_audio_sample_t) * nframes);
}
if (driver->playback_handle) {
@@ -1159,8 +1164,9 @@ alsa_driver_restart (alsa_driver_t *driver)
int res;
driver->xrun_recovery = 1;
- if ((res = driver->nt_stop((struct _jack_driver_nt *) driver))==0)
- res = driver->nt_start((struct _jack_driver_nt *) driver);
+ if ((res = driver->nt_stop ((struct _jack_driver_nt*)driver)) == 0) {
+ res = driver->nt_start ((struct _jack_driver_nt*)driver);
+ }
driver->xrun_recovery = 0;
return res;
@@ -1172,47 +1178,46 @@ alsa_driver_xrun_recovery (alsa_driver_t *driver, float *delayed_usecs)
snd_pcm_status_t *status;
int res;
- snd_pcm_status_alloca(&status);
+ snd_pcm_status_alloca (&status);
if (driver->capture_handle) {
- if ((res = snd_pcm_status(driver->capture_handle, status))
+ if ((res = snd_pcm_status (driver->capture_handle, status))
< 0) {
- jack_error("status error: %s", snd_strerror(res));
+ jack_error ("status error: %s", snd_strerror (res));
}
} else {
- if ((res = snd_pcm_status(driver->playback_handle, status))
+ if ((res = snd_pcm_status (driver->playback_handle, status))
< 0) {
- jack_error("status error: %s", snd_strerror(res));
+ jack_error ("status error: %s", snd_strerror (res));
}
}
- if (snd_pcm_status_get_state(status) == SND_PCM_STATE_SUSPENDED)
- {
- MESSAGE("\n\n**** alsa_pcm: pcm in suspended state, resuming it \n\n" );
+ if (snd_pcm_status_get_state (status) == SND_PCM_STATE_SUSPENDED) {
+ MESSAGE ("\n\n**** alsa_pcm: pcm in suspended state, resuming it \n\n" );
if (driver->capture_handle) {
- if ((res = snd_pcm_prepare(driver->capture_handle))
+ if ((res = snd_pcm_prepare (driver->capture_handle))
< 0) {
- jack_error("error preparing after suspend: %s", snd_strerror(res));
+ jack_error ("error preparing after suspend: %s", snd_strerror (res));
}
} else {
- if ((res = snd_pcm_prepare(driver->playback_handle))
+ if ((res = snd_pcm_prepare (driver->playback_handle))
< 0) {
- jack_error("error preparing after suspend: %s", snd_strerror(res));
+ jack_error ("error preparing after suspend: %s", snd_strerror (res));
}
}
}
- if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN
+ if (snd_pcm_status_get_state (status) == SND_PCM_STATE_XRUN
&& driver->process_count > XRUN_REPORT_DELAY) {
struct timeval now, diff, tstamp;
driver->xrun_count++;
- snd_pcm_status_get_tstamp(status,&now);
- snd_pcm_status_get_trigger_tstamp(status, &tstamp);
- timersub(&now, &tstamp, &diff);
+ snd_pcm_status_get_tstamp (status, &now);
+ snd_pcm_status_get_trigger_tstamp (status, &tstamp);
+ timersub (&now, &tstamp, &diff);
*delayed_usecs = diff.tv_sec * 1000000.0 + diff.tv_usec;
- MESSAGE("\n\n**** alsa_pcm: xrun of at least %.3f "
- "msecs\n\n",
- *delayed_usecs / 1000.0);
+ MESSAGE ("\n\n**** alsa_pcm: xrun of at least %.3f "
+ "msecs\n\n",
+ *delayed_usecs / 1000.0);
}
if (alsa_driver_restart (driver)) {
@@ -1275,7 +1280,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
need_playback = driver->playback_handle ? 1 : 0;
}
- again:
+again:
while (need_playback || need_capture) {
@@ -1303,14 +1308,13 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
/* ALSA doesn't set POLLERR in some versions of 0.9.X */
- for (i = 0; i < nfds; i++) {
+ for (i = 0; i < nfds; i++)
driver->pfd[i].events |= POLLERR;
- }
if (extra_fd >= 0) {
driver->pfd[nfds].fd = extra_fd;
driver->pfd[nfds].events =
- POLLIN|POLLERR|POLLHUP|POLLNVAL;
+ POLLIN | POLLERR | POLLHUP | POLLNVAL;
nfds++;
}
@@ -1370,7 +1374,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
if (extra_fd >= 0) {
- if (driver->pfd[nfds-1].revents == 0) {
+ if (driver->pfd[nfds - 1].revents == 0) {
/* we timed out on the extra fd */
*status = -4;
@@ -1380,13 +1384,13 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
/* if POLLIN was the only bit set, we're OK */
*status = 0;
- return (driver->pfd[nfds-1].revents == POLLIN) ? 0 : -1;
+ return (driver->pfd[nfds - 1].revents == POLLIN) ? 0 : -1;
}
if (need_playback) {
if (snd_pcm_poll_descriptors_revents
- (driver->playback_handle, &driver->pfd[0],
- driver->playback_nfds, &revents) < 0) {
+ (driver->playback_handle, &driver->pfd[0],
+ driver->playback_nfds, &revents) < 0) {
jack_error ("ALSA: playback revents failed");
*status = -6;
return 0;
@@ -1408,8 +1412,8 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
if (need_capture) {
if (snd_pcm_poll_descriptors_revents
- (driver->capture_handle, &driver->pfd[ci],
- driver->capture_nfds, &revents) < 0) {
+ (driver->capture_handle, &driver->pfd[ci],
+ driver->capture_nfds, &revents) < 0) {
jack_error ("ALSA: capture revents failed");
*status = -6;
return 0;
@@ -1491,7 +1495,7 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
/* constrain the available count to the nearest (round down) number of
periods.
- */
+ */
return avail - (avail % driver->frames_per_cycle);
}
@@ -1508,16 +1512,16 @@ alsa_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
return -1;
}
- if (driver->capture_handle) {
+ if (driver->capture_handle) {
nf = nframes;
offset = 0;
while (nf) {
contiguous = nf;
- if (alsa_driver_get_channel_addresses (driver,
- &contiguous, 0, &offset, 0)) {
- return -1;
- }
+ if (alsa_driver_get_channel_addresses (driver,
+ &contiguous, 0, &offset, 0)) {
+ return -1;
+ }
if (snd_pcm_mmap_commit (driver->capture_handle,
offset, contiguous) < 0) {
@@ -1534,15 +1538,14 @@ alsa_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
while (nf) {
contiguous = nf;
- if (alsa_driver_get_channel_addresses (driver,
- 0, &contiguous, 0, &offset)) {
- return -1;
- }
+ if (alsa_driver_get_channel_addresses (driver,
+ 0, &contiguous, 0, &offset)) {
+ return -1;
+ }
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
alsa_driver_silence_on_channel (driver, chn,
contiguous);
- }
if (snd_pcm_mmap_commit (driver->playback_handle,
offset, contiguous) < 0) {
@@ -1570,7 +1573,7 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
snd_pcm_sframes_t contiguous;
snd_pcm_sframes_t nread;
snd_pcm_uframes_t offset;
- jack_nframes_t orig_nframes;
+ jack_nframes_t orig_nframes;
jack_default_audio_sample_t* buf;
channel_t chn;
JSList *node;
@@ -1599,8 +1602,8 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
if (alsa_driver_get_channel_addresses (
driver,
- (snd_pcm_uframes_t *) &contiguous,
- (snd_pcm_uframes_t *) 0,
+ (snd_pcm_uframes_t*)&contiguous,
+ (snd_pcm_uframes_t*)0,
&offset, 0) < 0) {
return -1;
}
@@ -1608,7 +1611,7 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
for (chn = 0, node = driver->capture_ports; node;
node = jack_slist_next (node), chn++) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
if (!jack_port_connected (port)) {
/* no-copy optimization */
@@ -1616,13 +1619,13 @@ alsa_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
}
buf = jack_port_get_buffer (port, orig_nframes);
alsa_driver_read_from_channel (driver, chn,
- buf + nread, contiguous);
+ buf + nread, contiguous);
}
if ((err = snd_pcm_mmap_commit (driver->capture_handle,
- offset, contiguous)) < 0) {
+ offset, contiguous)) < 0) {
jack_error ("ALSA: could not complete read of %"
- PRIu32 " frames: error = %d", contiguous, err);
+ PRIu32 " frames: error = %d", contiguous, err);
return -1;
}
@@ -1667,8 +1670,8 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
for (chn = 0, node = driver->capture_ports; node;
node = jack_slist_next (node), chn++) {
- if (((jack_port_t *) node->data)->shared->monitor_requests) {
- driver->input_monitor_mask |= (1<<chn);
+ if (((jack_port_t*)node->data)->shared->monitor_requests) {
+ driver->input_monitor_mask |= (1 << chn);
}
}
@@ -1687,27 +1690,27 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
if (alsa_driver_get_channel_addresses (
driver,
- (snd_pcm_uframes_t *) 0,
- (snd_pcm_uframes_t *) &contiguous,
+ (snd_pcm_uframes_t*)0,
+ (snd_pcm_uframes_t*)&contiguous,
0, &offset) < 0) {
return -1;
}
- for (chn = 0, node = driver->playback_ports, mon_node=driver->monitor_ports;
+ for (chn = 0, node = driver->playback_ports, mon_node = driver->monitor_ports;
node;
node = jack_slist_next (node), chn++) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
if (!jack_port_connected (port)) {
continue;
}
buf = jack_port_get_buffer (port, orig_nframes);
alsa_driver_write_to_channel (driver, chn,
- buf + nwritten, contiguous);
+ buf + nwritten, contiguous);
if (mon_node) {
- port = (jack_port_t *) mon_node->data;
+ port = (jack_port_t*)mon_node->data;
if (!jack_port_connected (port)) {
continue;
}
@@ -1724,11 +1727,12 @@ alsa_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
}
if ((err = snd_pcm_mmap_commit (driver->playback_handle,
- offset, contiguous)) < 0) {
+ offset, contiguous)) < 0) {
jack_error ("ALSA: could not complete playback of %"
- PRIu32 " frames: error = %d", contiguous, err);
- if (err != -EPIPE && err != -ESTRPIPE)
+ PRIu32 " frames: error = %d", contiguous, err);
+ if (err != -EPIPE && err != -ESTRPIPE) {
return -1;
+ }
}
nframes -= contiguous;
@@ -1752,10 +1756,11 @@ alsa_driver_run_cycle (alsa_driver_t *driver)
DEBUG ("alsaback from wait, nframes = %lu", nframes);
- if (unlikely(wait_status < 0))
- return -1; /* driver failed */
+ if (unlikely (wait_status < 0)) {
+ return -1; /* driver failed */
- if (unlikely(nframes == 0)) {
+ }
+ if (unlikely (nframes == 0)) {
/* we detected an xrun and restarted: notify
* clients about the delay.
@@ -1770,20 +1775,19 @@ alsa_driver_run_cycle (alsa_driver_t *driver)
static void
alsa_driver_latency_callback (jack_latency_callback_mode_t mode, void* arg)
{
- alsa_driver_t* driver = (alsa_driver_t*) arg;
- jack_client_t* client = driver->client;
- jack_latency_range_t range;
- JSList* node;
-
- if (mode == JackPlaybackLatency) {
- range.min = range.max = driver->frames_per_cycle + driver->playback_frame_latency;
- } else {
- range.min = range.max = driver->frames_per_cycle + driver->capture_frame_latency;
- }
+ alsa_driver_t* driver = (alsa_driver_t*)arg;
+ jack_client_t* client = driver->client;
+ jack_latency_range_t range;
+ JSList* node;
- for (node = client->ports; node; node = jack_slist_next (node)) {
- jack_port_set_latency_range ((jack_port_t*) node->data, mode, &range);
+ if (mode == JackPlaybackLatency) {
+ range.min = range.max = driver->frames_per_cycle + driver->playback_frame_latency;
+ } else {
+ range.min = range.max = driver->frames_per_cycle + driver->capture_frame_latency;
}
+
+ for (node = client->ports; node; node = jack_slist_next (node))
+ jack_port_set_latency_range ((jack_port_t*)node->data, mode, &range);
}
static int
@@ -1801,7 +1805,7 @@ alsa_driver_attach (alsa_driver_t *driver)
}
driver->engine->set_sample_rate (driver->engine, driver->frame_rate);
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
if (driver->has_hw_monitoring) {
port_flags |= JackPortCanMonitor;
@@ -1809,7 +1813,7 @@ alsa_driver_attach (alsa_driver_t *driver)
for (chn = 0; chn < driver->capture_nchannels; chn++) {
- snprintf (buf, sizeof(buf), "capture_%lu", chn+1);
+ snprintf (buf, sizeof(buf), "capture_%lu", chn + 1);
if ((port = jack_port_register (driver->client, buf,
JACK_DEFAULT_AUDIO_TYPE,
@@ -1825,12 +1829,12 @@ alsa_driver_attach (alsa_driver_t *driver)
jack_slist_append (driver->capture_ports, port);
}
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
for (chn = 0; chn < driver->playback_nchannels; chn++) {
jack_port_t *monitor_port;
- snprintf (buf, sizeof(buf) - 1, "playback_%lu", chn+1);
+ snprintf (buf, sizeof(buf) - 1, "playback_%lu", chn + 1);
if ((port = jack_port_register (driver->client, buf,
JACK_DEFAULT_AUDIO_TYPE,
@@ -1846,7 +1850,7 @@ alsa_driver_attach (alsa_driver_t *driver)
jack_slist_append (driver->playback_ports, port);
if (driver->with_monitor_ports) {
- snprintf (buf, sizeof(buf) - 1, "monitor_%lu", chn+1);
+ snprintf (buf, sizeof(buf) - 1, "monitor_%lu", chn + 1);
if ((monitor_port = jack_port_register (
driver->client, buf,
@@ -1878,307 +1882,302 @@ alsa_driver_detach (alsa_driver_t *driver)
return 0;
}
- for (node = driver->capture_ports; node;
- node = jack_slist_next (node)) {
- jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
- }
+ for (node = driver->capture_ports; node;
+ node = jack_slist_next (node))
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
- jack_slist_free (driver->capture_ports);
- driver->capture_ports = 0;
+ jack_slist_free (driver->capture_ports);
+ driver->capture_ports = 0;
- for (node = driver->playback_ports; node;
- node = jack_slist_next (node)) {
- jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
- }
+ for (node = driver->playback_ports; node;
+ node = jack_slist_next (node))
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
- jack_slist_free (driver->playback_ports);
- driver->playback_ports = 0;
+ jack_slist_free (driver->playback_ports);
+ driver->playback_ports = 0;
- if (driver->monitor_ports) {
- for (node = driver->monitor_ports; node;
- node = jack_slist_next (node)) {
- jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
- }
+ if (driver->monitor_ports) {
+ for (node = driver->monitor_ports; node;
+ node = jack_slist_next (node))
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
- jack_slist_free (driver->monitor_ports);
- driver->monitor_ports = 0;
- }
+ jack_slist_free (driver->monitor_ports);
+ driver->monitor_ports = 0;
+ }
- return 0;
- }
+ return 0;
+}
#if 0
- static int /* UNUSED */
- alsa_driver_change_sample_clock (alsa_driver_t *driver, SampleClockMode mode)
-
- {
- return driver->hw->change_sample_clock (driver->hw, mode);
- }
-
- static void /* UNUSED */
- alsa_driver_request_all_monitor_input (alsa_driver_t *driver, int yn)
-
- {
- if (driver->hw_monitoring) {
- if (yn) {
- driver->hw->set_input_monitor_mask (driver->hw, ~0U);
- } else {
- driver->hw->set_input_monitor_mask (
- driver->hw, driver->input_monitor_mask);
- }
- }
-
- driver->all_monitor_in = yn;
- }
-
- static void /* UNUSED */
- alsa_driver_set_hw_monitoring (alsa_driver_t *driver, int yn)
- {
- if (yn) {
- driver->hw_monitoring = TRUE;
-
- if (driver->all_monitor_in) {
- driver->hw->set_input_monitor_mask (driver->hw, ~0U);
- } else {
- driver->hw->set_input_monitor_mask (
- driver->hw, driver->input_monitor_mask);
- }
- } else {
- driver->hw_monitoring = FALSE;
- driver->hw->set_input_monitor_mask (driver->hw, 0);
- }
- }
-
- static ClockSyncStatus /* UNUSED */
- alsa_driver_clock_sync_status (channel_t chn)
- {
- return Lock;
- }
+static int /* UNUSED */
+alsa_driver_change_sample_clock (alsa_driver_t *driver, SampleClockMode mode)
+
+{
+ return driver->hw->change_sample_clock (driver->hw, mode);
+}
+
+static void /* UNUSED */
+alsa_driver_request_all_monitor_input (alsa_driver_t *driver, int yn)
+
+{
+ if (driver->hw_monitoring) {
+ if (yn) {
+ driver->hw->set_input_monitor_mask (driver->hw, ~0U);
+ } else {
+ driver->hw->set_input_monitor_mask (
+ driver->hw, driver->input_monitor_mask);
+ }
+ }
+
+ driver->all_monitor_in = yn;
+}
+
+static void /* UNUSED */
+alsa_driver_set_hw_monitoring (alsa_driver_t *driver, int yn)
+{
+ if (yn) {
+ driver->hw_monitoring = TRUE;
+
+ if (driver->all_monitor_in) {
+ driver->hw->set_input_monitor_mask (driver->hw, ~0U);
+ } else {
+ driver->hw->set_input_monitor_mask (
+ driver->hw, driver->input_monitor_mask);
+ }
+ } else {
+ driver->hw_monitoring = FALSE;
+ driver->hw->set_input_monitor_mask (driver->hw, 0);
+ }
+}
+
+static ClockSyncStatus /* UNUSED */
+alsa_driver_clock_sync_status (channel_t chn)
+{
+ return Lock;
+}
#endif
- static void
- alsa_driver_delete (alsa_driver_t *driver)
- {
- JSList *node;
+static void
+alsa_driver_delete (alsa_driver_t *driver)
+{
+ JSList *node;
- /*
- if (driver->midi)
- (driver->midi->destroy)((jack_driver_t*) driver->midi);
- */
+ /*
+ if (driver->midi)
+ (driver->midi->destroy)((jack_driver_t*) driver->midi);
+ */
- for (node = driver->clock_sync_listeners; node;
- node = jack_slist_next (node)) {
- free (node->data);
- }
- jack_slist_free (driver->clock_sync_listeners);
-
- if (driver->ctl_handle) {
- snd_ctl_close (driver->ctl_handle);
- driver->ctl_handle = 0;
- }
-
- if (driver->capture_handle) {
- snd_pcm_close (driver->capture_handle);
- driver->capture_handle = 0;
- }
-
- if (driver->playback_handle) {
- snd_pcm_close (driver->playback_handle);
- driver->capture_handle = 0;
- }
-
- if (driver->capture_hw_params) {
- snd_pcm_hw_params_free (driver->capture_hw_params);
- driver->capture_hw_params = 0;
- }
-
- if (driver->playback_hw_params) {
- snd_pcm_hw_params_free (driver->playback_hw_params);
- driver->playback_hw_params = 0;
- }
-
- if (driver->capture_sw_params) {
- snd_pcm_sw_params_free (driver->capture_sw_params);
- driver->capture_sw_params = 0;
- }
-
- if (driver->playback_sw_params) {
- snd_pcm_sw_params_free (driver->playback_sw_params);
- driver->playback_sw_params = 0;
- }
-
- if (driver->pfd) {
- free (driver->pfd);
- }
-
- if (driver->hw) {
- driver->hw->release (driver->hw);
- driver->hw = 0;
- }
- free(driver->alsa_name_playback);
- free(driver->alsa_name_capture);
- free(driver->alsa_driver);
-
- alsa_driver_release_channel_dependent_memory (driver);
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
- free (driver);
- }
-
- static char*
- discover_alsa_using_apps ()
- {
- char found[2048];
- char command[5192];
- char* path = getenv ("PATH");
- char* dir;
- size_t flen = 0;
- int card;
- int device;
- size_t cmdlen = 0;
-
- if (!path) {
- return NULL;
- }
-
- /* look for lsof and give up if its not in PATH */
-
- path = strdup (path);
- dir = strtok (path, ":");
- while (dir) {
- char maybe[PATH_MAX+1];
- snprintf (maybe, sizeof(maybe), "%s/lsof", dir);
- if (access (maybe, X_OK) == 0) {
- break;
- }
- dir = strtok (NULL, ":");
- }
- free (path);
-
- if (!dir) {
- return NULL;
- }
-
- snprintf (command, sizeof (command), "lsof -Fc0 ");
- cmdlen = strlen (command);
-
- for (card = 0; card < 8; ++card) {
- for (device = 0; device < 8; ++device) {
- char buf[32];
-
- snprintf (buf, sizeof (buf), "/dev/snd/pcmC%dD%dp", card, device);
- if (access (buf, F_OK) == 0) {
- snprintf (command+cmdlen, sizeof(command)-cmdlen, "%s ", buf);
- }
- cmdlen = strlen (command);
-
- snprintf (buf, sizeof (buf), "/dev/snd/pcmC%dD%dc", card, device);
- if (access (buf, F_OK) == 0) {
- snprintf (command+cmdlen, sizeof(command)-cmdlen, "%s ", buf);
- }
- cmdlen = strlen (command);
- }
- }
-
- FILE* f = popen (command, "r");
-
- if (!f) {
- return NULL;
- }
-
- while (!feof (f)) {
- char buf[1024]; /* lsof doesn't output much */
-
- if (!fgets (buf, sizeof (buf), f)) {
- break;
- }
-
- if (*buf != 'p') {
- return NULL;
- }
-
- /* buf contains NULL as a separator between the process field and the command field */
- char *pid = buf;
- ++pid; /* skip leading 'p' */
- char *cmd = pid;
-
- /* skip to NULL */
- while (*cmd) {
- ++cmd;
- }
- ++cmd; /* skip to 'c' */
- ++cmd; /* skip to first character of command */
-
- snprintf (found+flen, sizeof (found)-flen, "%s (process ID %s)\n", cmd, pid);
- flen = strlen (found);
-
- if (flen >= sizeof (found)) {
- break;
- }
- }
-
- pclose (f);
-
- if (flen) {
- return strdup (found);
- } else {
- return NULL;
- }
- }
-
-
- static jack_driver_t *
- alsa_driver_new (char *name, char *playback_alsa_device,
- char *capture_alsa_device,
- jack_client_t *client,
- jack_nframes_t frames_per_cycle,
- jack_nframes_t user_nperiods,
- jack_nframes_t rate,
- int hw_monitoring,
- int hw_metering,
- int capturing,
- int playing,
- DitherAlgorithm dither,
- int soft_mode,
- int monitor,
- int user_capture_nchnls,
- int user_playback_nchnls,
- int shorts_first,
- jack_nframes_t capture_latency,
- jack_nframes_t playback_latency
+ for (node = driver->clock_sync_listeners; node;
+ node = jack_slist_next (node))
+ free (node->data);
+ jack_slist_free (driver->clock_sync_listeners);
+
+ if (driver->ctl_handle) {
+ snd_ctl_close (driver->ctl_handle);
+ driver->ctl_handle = 0;
+ }
+
+ if (driver->capture_handle) {
+ snd_pcm_close (driver->capture_handle);
+ driver->capture_handle = 0;
+ }
+
+ if (driver->playback_handle) {
+ snd_pcm_close (driver->playback_handle);
+ driver->capture_handle = 0;
+ }
+
+ if (driver->capture_hw_params) {
+ snd_pcm_hw_params_free (driver->capture_hw_params);
+ driver->capture_hw_params = 0;
+ }
+
+ if (driver->playback_hw_params) {
+ snd_pcm_hw_params_free (driver->playback_hw_params);
+ driver->playback_hw_params = 0;
+ }
+
+ if (driver->capture_sw_params) {
+ snd_pcm_sw_params_free (driver->capture_sw_params);
+ driver->capture_sw_params = 0;
+ }
+
+ if (driver->playback_sw_params) {
+ snd_pcm_sw_params_free (driver->playback_sw_params);
+ driver->playback_sw_params = 0;
+ }
+
+ if (driver->pfd) {
+ free (driver->pfd);
+ }
+
+ if (driver->hw) {
+ driver->hw->release (driver->hw);
+ driver->hw = 0;
+ }
+ free (driver->alsa_name_playback);
+ free (driver->alsa_name_capture);
+ free (driver->alsa_driver);
+
+ alsa_driver_release_channel_dependent_memory (driver);
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
+ free (driver);
+}
+
+static char*
+discover_alsa_using_apps ()
+{
+ char found[2048];
+ char command[5192];
+ char* path = getenv ("PATH");
+ char* dir;
+ size_t flen = 0;
+ int card;
+ int device;
+ size_t cmdlen = 0;
+
+ if (!path) {
+ return NULL;
+ }
+
+ /* look for lsof and give up if its not in PATH */
+
+ path = strdup (path);
+ dir = strtok (path, ":");
+ while (dir) {
+ char maybe[PATH_MAX + 1];
+ snprintf (maybe, sizeof(maybe), "%s/lsof", dir);
+ if (access (maybe, X_OK) == 0) {
+ break;
+ }
+ dir = strtok (NULL, ":");
+ }
+ free (path);
+
+ if (!dir) {
+ return NULL;
+ }
+
+ snprintf (command, sizeof(command), "lsof -Fc0 ");
+ cmdlen = strlen (command);
+
+ for (card = 0; card < 8; ++card) {
+ for (device = 0; device < 8; ++device) {
+ char buf[32];
+
+ snprintf (buf, sizeof(buf), "/dev/snd/pcmC%dD%dp", card, device);
+ if (access (buf, F_OK) == 0) {
+ snprintf (command + cmdlen, sizeof(command) - cmdlen, "%s ", buf);
+ }
+ cmdlen = strlen (command);
+
+ snprintf (buf, sizeof(buf), "/dev/snd/pcmC%dD%dc", card, device);
+ if (access (buf, F_OK) == 0) {
+ snprintf (command + cmdlen, sizeof(command) - cmdlen, "%s ", buf);
+ }
+ cmdlen = strlen (command);
+ }
+ }
+
+ FILE* f = popen (command, "r");
+
+ if (!f) {
+ return NULL;
+ }
+
+ while (!feof (f)) {
+ char buf[1024]; /* lsof doesn't output much */
+
+ if (!fgets (buf, sizeof(buf), f)) {
+ break;
+ }
+
+ if (*buf != 'p') {
+ return NULL;
+ }
+
+ /* buf contains NULL as a separator between the process field and the command field */
+ char *pid = buf;
+ ++pid; /* skip leading 'p' */
+ char *cmd = pid;
+
+ /* skip to NULL */
+ while (*cmd)
+ ++cmd;
+ ++cmd; /* skip to 'c' */
+ ++cmd; /* skip to first character of command */
+
+ snprintf (found + flen, sizeof(found) - flen, "%s (process ID %s)\n", cmd, pid);
+ flen = strlen (found);
+
+ if (flen >= sizeof(found)) {
+ break;
+ }
+ }
+
+ pclose (f);
+
+ if (flen) {
+ return strdup (found);
+ } else {
+ return NULL;
+ }
+}
+
+
+static jack_driver_t *
+alsa_driver_new (char *name, char *playback_alsa_device,
+ char *capture_alsa_device,
+ jack_client_t *client,
+ jack_nframes_t frames_per_cycle,
+ jack_nframes_t user_nperiods,
+ jack_nframes_t rate,
+ int hw_monitoring,
+ int hw_metering,
+ int capturing,
+ int playing,
+ DitherAlgorithm dither,
+ int soft_mode,
+ int monitor,
+ int user_capture_nchnls,
+ int user_playback_nchnls,
+ int shorts_first,
+ jack_nframes_t capture_latency,
+ jack_nframes_t playback_latency
)
{
int err;
- char* current_apps;
+ char* current_apps;
alsa_driver_t *driver;
jack_info ("creating alsa driver ... %s|%s|%" PRIu32 "|%" PRIu32
- "|%" PRIu32"|%" PRIu32"|%" PRIu32 "|%s|%s|%s|%s",
- playing ? playback_alsa_device : "-",
- capturing ? capture_alsa_device : "-",
- frames_per_cycle, user_nperiods, rate,
- user_capture_nchnls,user_playback_nchnls,
- hw_monitoring ? "hwmon": "nomon",
- hw_metering ? "hwmeter":"swmeter",
- soft_mode ? "soft-mode":"-",
- shorts_first ? "16bit":"32bit");
-
- driver = (alsa_driver_t *) calloc (1, sizeof (alsa_driver_t));
-
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
-
- driver->nt_attach = (JackDriverNTAttachFunction) alsa_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) alsa_driver_detach;
- driver->read = (JackDriverReadFunction) alsa_driver_read;
- driver->write = (JackDriverReadFunction) alsa_driver_write;
+ "|%" PRIu32 "|%" PRIu32 "|%" PRIu32 "|%s|%s|%s|%s",
+ playing ? playback_alsa_device : "-",
+ capturing ? capture_alsa_device : "-",
+ frames_per_cycle, user_nperiods, rate,
+ user_capture_nchnls, user_playback_nchnls,
+ hw_monitoring ? "hwmon" : "nomon",
+ hw_metering ? "hwmeter" : "swmeter",
+ soft_mode ? "soft-mode" : "-",
+ shorts_first ? "16bit" : "32bit");
+
+ driver = (alsa_driver_t*)calloc (1, sizeof(alsa_driver_t));
+
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->nt_attach = (JackDriverNTAttachFunction)alsa_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)alsa_driver_detach;
+ driver->read = (JackDriverReadFunction)alsa_driver_read;
+ driver->write = (JackDriverReadFunction)alsa_driver_write;
driver->null_cycle =
- (JackDriverNullCycleFunction) alsa_driver_null_cycle;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) alsa_driver_bufsize;
- driver->nt_start = (JackDriverNTStartFunction) alsa_driver_start;
- driver->nt_stop = (JackDriverNTStopFunction) alsa_driver_stop;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) alsa_driver_run_cycle;
+ (JackDriverNullCycleFunction)alsa_driver_null_cycle;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)alsa_driver_bufsize;
+ driver->nt_start = (JackDriverNTStartFunction)alsa_driver_start;
+ driver->nt_stop = (JackDriverNTStopFunction)alsa_driver_stop;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)alsa_driver_run_cycle;
driver->playback_handle = NULL;
driver->capture_handle = NULL;
@@ -2189,8 +2188,8 @@ alsa_driver_detach (alsa_driver_t *driver)
driver->user_nchannels = 0;
driver->playback_nchannels = user_playback_nchnls;
driver->capture_nchannels = user_capture_nchnls;
- driver->playback_sample_bytes = (shorts_first ? 2:4);
- driver->capture_sample_bytes = (shorts_first ? 2:4);
+ driver->playback_sample_bytes = (shorts_first ? 2 : 4);
+ driver->capture_sample_bytes = (shorts_first ? 2 : 4);
driver->capture_frame_latency = capture_latency;
driver->playback_frame_latency = playback_latency;
@@ -2198,14 +2197,14 @@ alsa_driver_detach (alsa_driver_t *driver)
driver->capture_addr = 0;
driver->playback_interleave_skip = NULL;
driver->capture_interleave_skip = NULL;
- driver->previously_successfully_configured = FALSE;
+ driver->previously_successfully_configured = FALSE;
driver->silent = 0;
driver->all_monitor_in = FALSE;
driver->with_monitor_ports = monitor;
- driver->clock_mode = ClockMaster; /* XXX is it? */
- driver->input_monitor_mask = 0; /* XXX is it? */
+ driver->clock_mode = ClockMaster; /* XXX is it? */
+ driver->input_monitor_mask = 0; /* XXX is it? */
driver->capture_ports = 0;
driver->playback_ports = 0;
@@ -2246,23 +2245,23 @@ alsa_driver_detach (alsa_driver_t *driver)
SND_PCM_NONBLOCK) < 0) {
switch (errno) {
case EBUSY:
- current_apps = discover_alsa_using_apps ();
- if (current_apps) {
- jack_error ("\n\nATTENTION: The playback device \"%s\" is "
- "already in use. The following applications "
- " are using your soundcard(s) so you should "
- " check them and stop them as necessary before "
- " trying to start JACK again:\n\n%s",
- playback_alsa_device,
- current_apps);
- free (current_apps);
- } else {
- jack_error ("\n\nATTENTION: The playback device \"%s\" is "
- "already in use. Please stop the"
- " application using it and "
- "run JACK again",
- playback_alsa_device);
- }
+ current_apps = discover_alsa_using_apps ();
+ if (current_apps) {
+ jack_error ("\n\nATTENTION: The playback device \"%s\" is "
+ "already in use. The following applications "
+ " are using your soundcard(s) so you should "
+ " check them and stop them as necessary before "
+ " trying to start JACK again:\n\n%s",
+ playback_alsa_device,
+ current_apps);
+ free (current_apps);
+ } else {
+ jack_error ("\n\nATTENTION: The playback device \"%s\" is "
+ "already in use. Please stop the"
+ " application using it and "
+ "run JACK again",
+ playback_alsa_device);
+ }
alsa_driver_delete (driver);
return NULL;
break;
@@ -2291,23 +2290,23 @@ alsa_driver_detach (alsa_driver_t *driver)
SND_PCM_NONBLOCK) < 0) {
switch (errno) {
case EBUSY:
- current_apps = discover_alsa_using_apps ();
- if (current_apps) {
- jack_error ("\n\nATTENTION: The capture device \"%s\" is "
- "already in use. The following applications "
- " are using your soundcard(s) so you should "
- " check them and stop them as necessary before "
- " trying to start JACK again:\n\n%s",
- capture_alsa_device,
- current_apps);
- free (current_apps);
- } else {
- jack_error ("\n\nATTENTION: The capture (recording) device \"%s\" is "
- "already in use. Please stop the"
- " application using it and "
- "run JACK again",
- capture_alsa_device);
- }
+ current_apps = discover_alsa_using_apps ();
+ if (current_apps) {
+ jack_error ("\n\nATTENTION: The capture device \"%s\" is "
+ "already in use. The following applications "
+ " are using your soundcard(s) so you should "
+ " check them and stop them as necessary before "
+ " trying to start JACK again:\n\n%s",
+ capture_alsa_device,
+ current_apps);
+ free (current_apps);
+ } else {
+ jack_error ("\n\nATTENTION: The capture (recording) device \"%s\" is "
+ "already in use. Please stop the"
+ " application using it and "
+ "run JACK again",
+ capture_alsa_device);
+ }
alsa_driver_delete (driver);
return NULL;
break;
@@ -2423,11 +2422,11 @@ alsa_driver_detach (alsa_driver_t *driver)
}
}
- jack_set_latency_callback (client, alsa_driver_latency_callback, driver);
+ jack_set_latency_callback (client, alsa_driver_latency_callback, driver);
driver->client = client;
- return (jack_driver_t *) driver;
+ return (jack_driver_t*)driver;
}
int
@@ -2437,7 +2436,7 @@ alsa_driver_listen_for_clock_sync_status (alsa_driver_t *driver,
{
ClockSyncListener *csl;
- csl = (ClockSyncListener *) malloc (sizeof (ClockSyncListener));
+ csl = (ClockSyncListener*)malloc (sizeof(ClockSyncListener));
csl->function = func;
csl->arg = arg;
csl->id = driver->next_clock_sync_listener_id++;
@@ -2456,10 +2455,11 @@ alsa_driver_stop_listening_to_clock_sync_status (alsa_driver_t *driver,
{
JSList *node;
int ret = -1;
+
pthread_mutex_lock (&driver->clock_sync_lock);
for (node = driver->clock_sync_listeners; node;
node = jack_slist_next (node)) {
- if (((ClockSyncListener *) node->data)->id == which) {
+ if (((ClockSyncListener*)node->data)->id == which) {
driver->clock_sync_listeners =
jack_slist_remove_link (
driver->clock_sync_listeners, node);
@@ -2482,7 +2482,7 @@ alsa_driver_clock_sync_notify (alsa_driver_t *driver, channel_t chn,
pthread_mutex_lock (&driver->clock_sync_lock);
for (node = driver->clock_sync_listeners; node;
node = jack_slist_next (node)) {
- ClockSyncListener *csl = (ClockSyncListener *) node->data;
+ ClockSyncListener *csl = (ClockSyncListener*)node->data;
csl->function (chn, status, csl->arg);
}
pthread_mutex_unlock (&driver->clock_sync_lock);
@@ -2529,12 +2529,12 @@ driver_get_descriptor ()
jack_driver_param_desc_t * params;
unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
- strcpy (desc->name,"alsa");
+ strcpy (desc->name, "alsa");
desc->nparams = 18;
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
i = 0;
strcpy (params[i].name, "capture");
@@ -2591,7 +2591,7 @@ driver_get_descriptor ()
params[i].character = 'H';
params[i].type = JackDriverParamBool;
params[i].value.i = 0;
- strcpy (params[i].short_desc,"Hardware monitoring, if available");
+ strcpy (params[i].short_desc, "Hardware monitoring, if available");
strcpy (params[i].long_desc, params[i].short_desc);
i++;
@@ -2614,7 +2614,7 @@ driver_get_descriptor ()
i++;
strcpy (params[i].name, "softmode");
params[i].character = 's';
- params[i].type = JackDriverParamBool;
+ params[i].type = JackDriverParamBool;
params[i].value.i = 0;
strcpy (params[i].short_desc, "Soft-mode, no xrun handling");
strcpy (params[i].long_desc, params[i].short_desc);
@@ -2699,7 +2699,7 @@ driver_get_descriptor ()
jack_driver_t *
driver_initialize (jack_client_t *client, const JSList * params)
{
- jack_nframes_t srate = 48000;
+ jack_nframes_t srate = 48000;
jack_nframes_t frames_per_interrupt = 1024;
unsigned long user_nperiods = 2;
char *playback_pcm_name = "hw:0";
@@ -2720,7 +2720,7 @@ driver_initialize (jack_client_t *client, const JSList * params)
const jack_driver_param_t * param;
for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
+ param = (const jack_driver_param_t*)node->data;
switch (param->character) {
@@ -2761,9 +2761,9 @@ driver_initialize (jack_client_t *client, const JSList * params)
break;
case 'r':
- srate = param->value.ui;
+ srate = param->value.ui;
jack_info ("apparent rate = %d", srate);
- break;
+ break;
case 'p':
frames_per_interrupt = param->value.ui;
@@ -2771,8 +2771,9 @@ driver_initialize (jack_client_t *client, const JSList * params)
case 'n':
user_nperiods = param->value.ui;
- if (user_nperiods < 2) /* enforce minimum value */
+ if (user_nperiods < 2) { /* enforce minimum value */
user_nperiods = 2;
+ }
break;
case 's':
@@ -2781,7 +2782,7 @@ driver_initialize (jack_client_t *client, const JSList * params)
case 'z':
if (dither_opt (param->value.c, &dither)) {
- return NULL;
+ return NULL;
}
break;
@@ -2789,7 +2790,7 @@ driver_initialize (jack_client_t *client, const JSList * params)
user_capture_nchnls = param->value.ui;
break;
case 'o':
- user_playback_nchnls = param->value.ui;
+ user_playback_nchnls = param->value.ui;
break;
case 'S':
@@ -2805,7 +2806,7 @@ driver_initialize (jack_client_t *client, const JSList * params)
break;
case 'X':
- /* ignored, legacy option */
+ /* ignored, legacy option */
break;
}
@@ -2832,5 +2833,5 @@ driver_initialize (jack_client_t *client, const JSList * params)
void
driver_finish (jack_driver_t *driver)
{
- alsa_driver_delete ((alsa_driver_t *) driver);
+ alsa_driver_delete ((alsa_driver_t*)driver);
}
diff --git a/drivers/alsa/alsa_driver.h b/drivers/alsa/alsa_driver.h
index 074ac69..5066bcc 100644
--- a/drivers/alsa/alsa_driver.h
+++ b/drivers/alsa/alsa_driver.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2001 Paul Davis
+ Copyright (C) 2001 Paul Davis
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
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#ifndef __jack_alsa_driver_h__
#define __jack_alsa_driver_h__
@@ -38,180 +38,183 @@
#include "driver.h"
#include "memops.h"
-typedef void (*ReadCopyFunction) (jack_default_audio_sample_t *dst, char *src,
- unsigned long src_bytes,
- unsigned long src_skip_bytes);
-typedef void (*WriteCopyFunction) (char *dst, jack_default_audio_sample_t *src,
- unsigned long src_bytes,
- unsigned long dst_skip_bytes,
- dither_state_t *state);
+typedef void (*ReadCopyFunction)(jack_default_audio_sample_t *dst, char *src,
+ unsigned long src_bytes,
+ unsigned long src_skip_bytes);
+typedef void (*WriteCopyFunction)(char *dst, jack_default_audio_sample_t *src,
+ unsigned long src_bytes,
+ unsigned long dst_skip_bytes,
+ dither_state_t *state);
typedef struct _alsa_driver {
- JACK_DRIVER_NT_DECL
-
- int poll_timeout;
- jack_time_t poll_last;
- jack_time_t poll_next;
- char **playback_addr;
- char **capture_addr;
- const snd_pcm_channel_area_t *capture_areas;
- const snd_pcm_channel_area_t *playback_areas;
- struct pollfd *pfd;
- unsigned int playback_nfds;
- unsigned int capture_nfds;
- unsigned long interleave_unit;
- unsigned long *capture_interleave_skip;
- unsigned long *playback_interleave_skip;
- channel_t max_nchannels;
- channel_t user_nchannels;
- channel_t playback_nchannels;
- channel_t capture_nchannels;
- unsigned long playback_sample_bytes;
- unsigned long capture_sample_bytes;
-
- jack_nframes_t frame_rate;
- jack_nframes_t frames_per_cycle;
- jack_nframes_t capture_frame_latency;
- jack_nframes_t playback_frame_latency;
-
- unsigned long *silent;
- char *alsa_name_playback;
- char *alsa_name_capture;
- char *alsa_driver;
- bitset_t channels_not_done;
- bitset_t channels_done;
- snd_pcm_format_t playback_sample_format;
- snd_pcm_format_t capture_sample_format;
- float max_sample_val;
- unsigned long user_nperiods;
- unsigned int playback_nperiods;
- unsigned int capture_nperiods;
- unsigned long last_mask;
- snd_ctl_t *ctl_handle;
- snd_pcm_t *playback_handle;
- snd_pcm_t *capture_handle;
- snd_pcm_hw_params_t *playback_hw_params;
- snd_pcm_sw_params_t *playback_sw_params;
- snd_pcm_hw_params_t *capture_hw_params;
- snd_pcm_sw_params_t *capture_sw_params;
- jack_hardware_t *hw;
- ClockSyncStatus *clock_sync_data;
- jack_client_t *client;
- JSList *capture_ports;
- JSList *playback_ports;
- JSList *monitor_ports;
-
- unsigned long input_monitor_mask;
-
- char soft_mode;
- char hw_monitoring;
- char hw_metering;
- char all_monitor_in;
- char capture_and_playback_not_synced;
- char playback_interleaved;
- char capture_interleaved;
- char with_monitor_ports;
- char has_clock_sync_reporting;
- char has_hw_monitoring;
- char has_hw_metering;
- char quirk_bswap;
-
- ReadCopyFunction read_via_copy;
- WriteCopyFunction write_via_copy;
-
- int dither;
- dither_state_t *dither_state;
-
- SampleClockMode clock_mode;
- JSList *clock_sync_listeners;
- pthread_mutex_t clock_sync_lock;
- unsigned long next_clock_sync_listener_id;
-
- int running;
- int run;
-
- int poll_late;
- int xrun_count;
- int process_count;
-
- int xrun_recovery;
- int previously_successfully_configured;
+ JACK_DRIVER_NT_DECL
+
+ int poll_timeout;
+ jack_time_t poll_last;
+ jack_time_t poll_next;
+ char **playback_addr;
+ char **capture_addr;
+ const snd_pcm_channel_area_t *capture_areas;
+ const snd_pcm_channel_area_t *playback_areas;
+ struct pollfd *pfd;
+ unsigned int playback_nfds;
+ unsigned int capture_nfds;
+ unsigned long interleave_unit;
+ unsigned long *capture_interleave_skip;
+ unsigned long *playback_interleave_skip;
+ channel_t max_nchannels;
+ channel_t user_nchannels;
+ channel_t playback_nchannels;
+ channel_t capture_nchannels;
+ unsigned long playback_sample_bytes;
+ unsigned long capture_sample_bytes;
+
+ jack_nframes_t frame_rate;
+ jack_nframes_t frames_per_cycle;
+ jack_nframes_t capture_frame_latency;
+ jack_nframes_t playback_frame_latency;
+
+ unsigned long *silent;
+ char *alsa_name_playback;
+ char *alsa_name_capture;
+ char *alsa_driver;
+ bitset_t channels_not_done;
+ bitset_t channels_done;
+ snd_pcm_format_t playback_sample_format;
+ snd_pcm_format_t capture_sample_format;
+ float max_sample_val;
+ unsigned long user_nperiods;
+ unsigned int playback_nperiods;
+ unsigned int capture_nperiods;
+ unsigned long last_mask;
+ snd_ctl_t *ctl_handle;
+ snd_pcm_t *playback_handle;
+ snd_pcm_t *capture_handle;
+ snd_pcm_hw_params_t *playback_hw_params;
+ snd_pcm_sw_params_t *playback_sw_params;
+ snd_pcm_hw_params_t *capture_hw_params;
+ snd_pcm_sw_params_t *capture_sw_params;
+ jack_hardware_t *hw;
+ ClockSyncStatus *clock_sync_data;
+ jack_client_t *client;
+ JSList *capture_ports;
+ JSList *playback_ports;
+ JSList *monitor_ports;
+
+ unsigned long input_monitor_mask;
+
+ char soft_mode;
+ char hw_monitoring;
+ char hw_metering;
+ char all_monitor_in;
+ char capture_and_playback_not_synced;
+ char playback_interleaved;
+ char capture_interleaved;
+ char with_monitor_ports;
+ char has_clock_sync_reporting;
+ char has_hw_monitoring;
+ char has_hw_metering;
+ char quirk_bswap;
+
+ ReadCopyFunction read_via_copy;
+ WriteCopyFunction write_via_copy;
+
+ int dither;
+ dither_state_t *dither_state;
+
+ SampleClockMode clock_mode;
+ JSList *clock_sync_listeners;
+ pthread_mutex_t clock_sync_lock;
+ unsigned long next_clock_sync_listener_id;
+
+ int running;
+ int run;
+
+ int poll_late;
+ int xrun_count;
+ int process_count;
+
+ int xrun_recovery;
+ int previously_successfully_configured;
} alsa_driver_t;
-static inline void
-alsa_driver_mark_channel_done (alsa_driver_t *driver, channel_t chn) {
+static inline void
+alsa_driver_mark_channel_done (alsa_driver_t *driver, channel_t chn)
+{
bitset_remove (driver->channels_not_done, chn);
driver->silent[chn] = 0;
}
-static inline void
+static inline void
alsa_driver_silence_on_channel (alsa_driver_t *driver, channel_t chn,
- jack_nframes_t nframes) {
+ jack_nframes_t nframes)
+{
if (driver->playback_interleaved) {
- memset_interleave
+ memset_interleave
(driver->playback_addr[chn],
- 0, nframes * driver->playback_sample_bytes,
- driver->interleave_unit,
- driver->playback_interleave_skip[chn]);
+ 0, nframes * driver->playback_sample_bytes,
+ driver->interleave_unit,
+ driver->playback_interleave_skip[chn]);
} else {
memset (driver->playback_addr[chn], 0,
nframes * driver->playback_sample_bytes);
}
- alsa_driver_mark_channel_done (driver,chn);
+ alsa_driver_mark_channel_done (driver, chn);
}
-static inline void
+static inline void
alsa_driver_silence_on_channel_no_mark (alsa_driver_t *driver, channel_t chn,
- jack_nframes_t nframes) {
+ jack_nframes_t nframes)
+{
if (driver->playback_interleaved) {
- memset_interleave
+ memset_interleave
(driver->playback_addr[chn],
- 0, nframes * driver->playback_sample_bytes,
- driver->interleave_unit,
- driver->playback_interleave_skip[chn]);
+ 0, nframes * driver->playback_sample_bytes,
+ driver->interleave_unit,
+ driver->playback_interleave_skip[chn]);
} else {
memset (driver->playback_addr[chn], 0,
nframes * driver->playback_sample_bytes);
}
}
-static inline void
+static inline void
alsa_driver_read_from_channel (alsa_driver_t *driver,
channel_t channel,
jack_default_audio_sample_t *buf,
jack_nframes_t nsamples)
{
- driver->read_via_copy (buf,
+ driver->read_via_copy (buf,
driver->capture_addr[channel],
- nsamples,
+ nsamples,
driver->capture_interleave_skip[channel]);
}
-static inline void
+static inline void
alsa_driver_write_to_channel (alsa_driver_t *driver,
- channel_t channel,
- jack_default_audio_sample_t *buf,
+ channel_t channel,
+ jack_default_audio_sample_t *buf,
jack_nframes_t nsamples)
{
driver->write_via_copy (driver->playback_addr[channel],
- buf,
- nsamples,
+ buf,
+ nsamples,
driver->playback_interleave_skip[channel],
- driver->dither_state+channel);
+ driver->dither_state + channel);
alsa_driver_mark_channel_done (driver, channel);
}
-void alsa_driver_silence_untouched_channels (alsa_driver_t *driver,
- jack_nframes_t nframes);
-void alsa_driver_set_clock_sync_status (alsa_driver_t *driver, channel_t chn,
- ClockSyncStatus status);
-int alsa_driver_listen_for_clock_sync_status (alsa_driver_t *,
- ClockSyncListenerFunction,
- void *arg);
-int alsa_driver_stop_listen_for_clock_sync_status (alsa_driver_t *,
- unsigned int);
-void alsa_driver_clock_sync_notify (alsa_driver_t *, channel_t chn,
- ClockSyncStatus);
+void alsa_driver_silence_untouched_channels(alsa_driver_t *driver,
+ jack_nframes_t nframes);
+void alsa_driver_set_clock_sync_status(alsa_driver_t *driver, channel_t chn,
+ ClockSyncStatus status);
+int alsa_driver_listen_for_clock_sync_status (alsa_driver_t *,
+ ClockSyncListenerFunction,
+ void *arg);
+int alsa_driver_stop_listen_for_clock_sync_status(alsa_driver_t *,
+ unsigned int);
+void alsa_driver_clock_sync_notify (alsa_driver_t *, channel_t chn,
+ ClockSyncStatus);
#endif /* __jack_alsa_driver_h__ */
diff --git a/drivers/alsa/generic.h b/drivers/alsa/generic.h
index 73dc593..434e610 100644
--- a/drivers/alsa/generic.h
+++ b/drivers/alsa/generic.h
@@ -1,6 +1,6 @@
/*
Copyright (C) 2001 Paul Davis
-
+
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
@@ -15,12 +15,12 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#ifndef __jack_generic_h__
#define __jack_generic_h__
jack_hardware_t *
-jack_alsa_generic_hw_new (alsa_driver_t *driver);
+jack_alsa_generic_hw_new(alsa_driver_t *driver);
#endif /* __jack_generic_h__*/
diff --git a/drivers/alsa/generic_hw.c b/drivers/alsa/generic_hw.c
index 69457e2..f65f00d 100644
--- a/drivers/alsa/generic_hw.c
+++ b/drivers/alsa/generic_hw.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2001 Paul Davis
+ Copyright (C) 2001 Paul Davis
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
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#include "hardware.h"
#include "alsa_driver.h"
@@ -25,7 +25,7 @@ static int generic_set_input_monitor_mask (jack_hardware_t *hw, unsigned long ma
return -1;
}
-static int generic_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
+static int generic_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
{
return -1;
}
@@ -42,11 +42,11 @@ jack_alsa_generic_hw_new (alsa_driver_t *driver)
{
jack_hardware_t *hw;
- hw = (jack_hardware_t *) malloc (sizeof (jack_hardware_t));
+ hw = (jack_hardware_t*)malloc (sizeof(jack_hardware_t));
hw->capabilities = 0;
hw->input_monitor_mask = 0;
-
+
hw->set_input_monitor_mask = generic_set_input_monitor_mask;
hw->change_sample_clock = generic_change_sample_clock;
hw->release = generic_release;
diff --git a/drivers/alsa/hammerfall.c b/drivers/alsa/hammerfall.c
index fcb9add..531d73a 100644
--- a/drivers/alsa/hammerfall.c
+++ b/drivers/alsa/hammerfall.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2001 Paul Davis
+ Copyright (C) 2001 Paul Davis
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
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#include "hardware.h"
#include "alsa_driver.h"
@@ -26,7 +26,7 @@
* warning: `hammerfall_monitor_controls' defined but not used */
#define HAMMERFALL_MONITOR_CONTROLS 0
-static void
+static void
set_control_id (snd_ctl_elem_id_t *ctl, const char *name)
{
snd_ctl_elem_id_set_name (ctl, name);
@@ -57,9 +57,8 @@ hammerfall_broadcast_channel_status_change (hammerfall_t *h, int lock, int sync,
status |= NoSync;
}
- for (chn = lowchn; chn < highchn; chn++) {
+ for (chn = lowchn; chn < highchn; chn++)
alsa_driver_set_clock_sync_status (h->driver, chn, status);
- }
}
static void
@@ -74,12 +73,12 @@ hammerfall_check_sync_state (hammerfall_t *h, int val, int adat_id)
XXX - maybe need to make sure that the rate matches our
idea of the current rate ?
- */
+ */
if (!h->said_that_spdif_is_fine) {
ClockSyncStatus status;
-
- status = Lock|Sync;
+
+ status = Lock | Sync;
/* XXX broken! fix for hammerfall light ! */
@@ -91,10 +90,10 @@ hammerfall_check_sync_state (hammerfall_t *h, int val, int adat_id)
lock = (val & 0x1) ? TRUE : FALSE;
sync = (val & 0x2) ? TRUE : FALSE;
-
+
if (h->lock_status[adat_id] != lock ||
h->sync_status[adat_id] != sync) {
- hammerfall_broadcast_channel_status_change (h, lock, sync, adat_id*8, (adat_id*8)+8);
+ hammerfall_broadcast_channel_status_change (h, lock, sync, adat_id * 8, (adat_id * 8) + 8);
}
h->lock_status[adat_id] = lock;
@@ -108,7 +107,7 @@ hammerfall_check_sync (hammerfall_t *h, snd_ctl_elem_value_t *ctl)
const char *name;
int val;
snd_ctl_elem_id_t *ctl_id;
-
+
jack_info ("check sync");
snd_ctl_elem_id_alloca (&ctl_id);
@@ -131,38 +130,37 @@ hammerfall_check_sync (hammerfall_t *h, snd_ctl_elem_value_t *ctl)
}
#endif /* HAMMERFALL_MONITOR_CONTROLS */
-static int
+static int
hammerfall_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
{
- hammerfall_t *h = (hammerfall_t *) hw->private;
+ hammerfall_t *h = (hammerfall_t*)hw->private;
snd_ctl_elem_value_t *ctl;
snd_ctl_elem_id_t *ctl_id;
int err;
int i;
-
+
snd_ctl_elem_value_alloca (&ctl);
snd_ctl_elem_id_alloca (&ctl_id);
set_control_id (ctl_id, "Channels Thru");
snd_ctl_elem_value_set_id (ctl, ctl_id);
-
- for (i = 0; i < 26; i++) {
- snd_ctl_elem_value_set_integer (ctl, i, (mask & (1<<i)) ? 1 : 0);
- }
-
+
+ for (i = 0; i < 26; i++)
+ snd_ctl_elem_value_set_integer (ctl, i, (mask & (1 << i)) ? 1 : 0);
+
if ((err = snd_ctl_elem_write (h->driver->ctl_handle, ctl)) != 0) {
jack_error ("ALSA/Hammerfall: cannot set input monitoring (%s)", snd_strerror (err));
return -1;
}
-
+
hw->input_monitor_mask = mask;
return 0;
}
-static int
-hammerfall_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
+static int
+hammerfall_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
{
- hammerfall_t *h = (hammerfall_t *) hw->private;
+ hammerfall_t *h = (hammerfall_t*)hw->private;
snd_ctl_elem_value_t *ctl;
snd_ctl_elem_id_t *ctl_id;
int err;
@@ -195,7 +193,7 @@ static void
hammerfall_release (jack_hardware_t *hw)
{
- hammerfall_t *h = (hammerfall_t *) hw->private;
+ hammerfall_t *h = (hammerfall_t*)hw->private;
void *status;
if (h == 0) {
@@ -212,8 +210,8 @@ hammerfall_release (jack_hardware_t *hw)
static void *
hammerfall_monitor_controls (void *arg)
{
- jack_hardware_t *hw = (jack_hardware_t *) arg;
- hammerfall_t *h = (hammerfall_t *) hw->private;
+ jack_hardware_t *hw = (jack_hardware_t*)arg;
+ hammerfall_t *h = (hammerfall_t*)hw->private;
snd_ctl_elem_id_t *switch_id[3];
snd_ctl_elem_value_t *sw[3];
@@ -250,7 +248,7 @@ hammerfall_monitor_controls (void *arg)
jack_error ("cannot read control switch 0 ...");
}
hammerfall_check_sync (h, sw[2]);
-
+
if (nanosleep (&h->monitor_interval, 0)) {
break;
}
@@ -267,9 +265,9 @@ jack_alsa_hammerfall_hw_new (alsa_driver_t *driver)
jack_hardware_t *hw;
hammerfall_t *h;
- hw = (jack_hardware_t *) malloc (sizeof (jack_hardware_t));
+ hw = (jack_hardware_t*)malloc (sizeof(jack_hardware_t));
- hw->capabilities = Cap_HardwareMonitoring|Cap_AutoSync|Cap_WordClock|Cap_ClockMaster|Cap_ClockLockReporting;
+ hw->capabilities = Cap_HardwareMonitoring | Cap_AutoSync | Cap_WordClock | Cap_ClockMaster | Cap_ClockLockReporting;
hw->input_monitor_mask = 0;
hw->private = 0;
@@ -277,7 +275,7 @@ jack_alsa_hammerfall_hw_new (alsa_driver_t *driver)
hw->change_sample_clock = hammerfall_change_sample_clock;
hw->release = hammerfall_release;
- h = (hammerfall_t *) malloc (sizeof (hammerfall_t));
+ h = (hammerfall_t*)malloc (sizeof(hammerfall_t));
h->lock_status[0] = FALSE;
h->sync_status[0] = FALSE;
diff --git a/drivers/alsa/hammerfall.h b/drivers/alsa/hammerfall.h
index b10ce6a..9077114 100644
--- a/drivers/alsa/hammerfall.h
+++ b/drivers/alsa/hammerfall.h
@@ -1,6 +1,6 @@
/*
Copyright (C) 2001 Paul Davis
-
+
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
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#ifndef __jack_hammerfall_h__
#define __jack_hammerfall_h__
@@ -23,14 +23,14 @@
#include <sys/time.h>
typedef struct {
- int lock_status[3];
- int sync_status[3];
- int said_that_spdif_is_fine;
- pthread_t monitor_thread;
- alsa_driver_t *driver;
- struct timespec monitor_interval;
+ int lock_status[3];
+ int sync_status[3];
+ int said_that_spdif_is_fine;
+ pthread_t monitor_thread;
+ alsa_driver_t *driver;
+ struct timespec monitor_interval;
} hammerfall_t;
-jack_hardware_t *jack_alsa_hammerfall_hw_new (alsa_driver_t *driver);
+jack_hardware_t *jack_alsa_hammerfall_hw_new(alsa_driver_t *driver);
#endif /* __jack_hammerfall_h__*/
diff --git a/drivers/alsa/hdsp.c b/drivers/alsa/hdsp.c
index cf28a91..bea357b 100644
--- a/drivers/alsa/hdsp.c
+++ b/drivers/alsa/hdsp.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2001 Paul Davis
+ Copyright (C) 2001 Paul Davis
Copyright (C) 2002 Dave LaRose
This program is free software; you can redistribute it and/or modify
@@ -16,7 +16,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#include "hardware.h"
#include "alsa_driver.h"
@@ -29,45 +29,48 @@ static const int HDSP_UNITY_GAIN = 32768;
static const int HDSP_MAX_GAIN = 65535;
/*
- * Use these two arrays to choose the value of the input_channel
- * argument to hsdp_set_mixer_gain(). hdsp_physical_input_index[n]
- * selects the nth optical/analog input. audio_stream_index[n]
+ * Use these two arrays to choose the value of the input_channel
+ * argument to hsdp_set_mixer_gain(). hdsp_physical_input_index[n]
+ * selects the nth optical/analog input. audio_stream_index[n]
* selects the nth channel being received from the host via pci/pccard.
*/
static const int hdsp_num_input_channels = 52;
static const int hdsp_physical_input_index[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,24, 25
+};
static const int hdsp_audio_stream_index[] = {
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51};
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,50, 51
+};
/*
- * Use this array to choose the value of the output_channel
+ * Use this array to choose the value of the output_channel
* argument to hsdp_set_mixer_gain(). hdsp_physical_output_index[26]
* and hdsp_physical_output_index[27] refer to the two "line out"
* channels (1/4" phone jack on the front of digiface/multiface).
*/
static const int hdsp_num_output_channels = 28;
static const int hdsp_physical_output_index[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27};
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,24, 25, 26, 27
+};
/* Function for checking argument values */
-static int clamp_int(int value, int lower_bound, int upper_bound)
+static int clamp_int (int value, int lower_bound, int upper_bound)
{
- if(value < lower_bound) {
- return lower_bound;
- }
- if(value > upper_bound) {
- return upper_bound;
- }
- return value;
+ if (value < lower_bound) {
+ return lower_bound;
+ }
+ if (value > upper_bound) {
+ return upper_bound;
+ }
+ return value;
}
/* Note(XXX): Maybe should share this code with hammerfall.c? */
-static void
+static void
set_control_id (snd_ctl_elem_id_t *ctl, const char *name)
{
snd_ctl_elem_id_set_name (ctl, name);
@@ -86,18 +89,18 @@ set_control_id (snd_ctl_elem_id_t *ctl, const char *name)
/* gain is an int from 0 to 65535, with 0 being -inf gain, and */
/* 65535 being about +2dB. */
-static int hdsp_set_mixer_gain(jack_hardware_t *hw, int input_channel,
- int output_channel, int gain)
+static int hdsp_set_mixer_gain (jack_hardware_t *hw, int input_channel,
+ int output_channel, int gain)
{
- hdsp_t *h = (hdsp_t *) hw->private;
+ hdsp_t *h = (hdsp_t*)hw->private;
snd_ctl_elem_value_t *ctl;
snd_ctl_elem_id_t *ctl_id;
int err;
/* Check args */
- input_channel = clamp_int(input_channel, 0, hdsp_num_input_channels);
- output_channel = clamp_int(output_channel, 0, hdsp_num_output_channels);
- gain = clamp_int(gain, HDSP_MINUS_INFINITY_GAIN, HDSP_MAX_GAIN);
+ input_channel = clamp_int (input_channel, 0, hdsp_num_input_channels);
+ output_channel = clamp_int (output_channel, 0, hdsp_num_output_channels);
+ gain = clamp_int (gain, HDSP_MINUS_INFINITY_GAIN, HDSP_MAX_GAIN);
/* Allocate control element and select "Mixer" control */
snd_ctl_elem_value_alloca (&ctl);
@@ -106,15 +109,15 @@ static int hdsp_set_mixer_gain(jack_hardware_t *hw, int input_channel,
snd_ctl_elem_value_set_id (ctl, ctl_id);
/* Apparently non-standard and unstable interface for the */
- /* mixer control. */
+ /* mixer control. */
snd_ctl_elem_value_set_integer (ctl, 0, input_channel);
snd_ctl_elem_value_set_integer (ctl, 1, output_channel);
snd_ctl_elem_value_set_integer (ctl, 2, gain);
/* Commit the mixer value and check for errors */
if ((err = snd_ctl_elem_write (h->driver->ctl_handle, ctl)) != 0) {
- jack_error ("ALSA/HDSP: cannot set mixer gain (%s)", snd_strerror (err));
- return -1;
+ jack_error ("ALSA/HDSP: cannot set mixer gain (%s)", snd_strerror (err));
+ return -1;
}
/* Note (XXX): Perhaps we should maintain a cache of the current */
@@ -122,7 +125,7 @@ static int hdsp_set_mixer_gain(jack_hardware_t *hw, int input_channel,
/* hdsp hardware. We'll leave this out until a little later. */
return 0;
}
-
+
static int hdsp_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
{
int i;
@@ -130,40 +133,40 @@ static int hdsp_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
/* For each input channel */
for (i = 0; i < 26; i++) {
/* Monitoring requested for this channel? */
- if(mask & (1<<i)) {
+ if (mask & (1 << i)) {
/* Yes. Connect physical input to output */
- if(hdsp_set_mixer_gain (hw, hdsp_physical_input_index[i],
- hdsp_physical_output_index[i],
- HDSP_UNITY_GAIN) != 0) {
- return -1;
+ if (hdsp_set_mixer_gain (hw, hdsp_physical_input_index[i],
+ hdsp_physical_output_index[i],
+ HDSP_UNITY_GAIN) != 0) {
+ return -1;
}
#ifdef CANNOT_HEAR_SOFTWARE_STREAM_WHEN_MONITORING
/* ...and disconnect the corresponding software */
/* channel */
- if(hdsp_set_mixer_gain (hw, hdsp_audio_stream_index[i],
- hdsp_physical_output_index[i],
- HDSP_MINUS_INFINITY_GAIN) != 0) {
- return -1;
+ if (hdsp_set_mixer_gain (hw, hdsp_audio_stream_index[i],
+ hdsp_physical_output_index[i],
+ HDSP_MINUS_INFINITY_GAIN) != 0) {
+ return -1;
}
#endif
} else {
/* No. Disconnect physical input from output */
- if(hdsp_set_mixer_gain (hw, hdsp_physical_input_index[i],
- hdsp_physical_output_index[i],
- HDSP_MINUS_INFINITY_GAIN) != 0) {
- return -1;
+ if (hdsp_set_mixer_gain (hw, hdsp_physical_input_index[i],
+ hdsp_physical_output_index[i],
+ HDSP_MINUS_INFINITY_GAIN) != 0) {
+ return -1;
}
#ifdef CANNOT_HEAR_SOFTWARE_STREAM_WHEN_MONITORING
/* ...and connect the corresponding software */
/* channel */
- if(hdsp_set_mixer_gain (hw, hdsp_audio_stream_index[i],
- hdsp_physical_output_index[i],
- HDSP_UNITY_GAIN) != 0) {
- return -1;
+ if (hdsp_set_mixer_gain (hw, hdsp_audio_stream_index[i],
+ hdsp_physical_output_index[i],
+ HDSP_UNITY_GAIN) != 0) {
+ return -1;
}
#endif
}
@@ -174,11 +177,11 @@ static int hdsp_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
}
-static int hdsp_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
+static int hdsp_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
{
- // Empty for now, until Dave understands more about clock sync so
- // he can test.
- return -1;
+ // Empty for now, until Dave understands more about clock sync so
+ // he can test.
+ return -1;
}
static double hdsp_get_hardware_peak (jack_port_t *port, jack_nframes_t frame)
@@ -194,10 +197,10 @@ static double hdsp_get_hardware_power (jack_port_t *port, jack_nframes_t frame)
static void
hdsp_release (jack_hardware_t *hw)
{
- hdsp_t *h = (hdsp_t *) hw->private;
+ hdsp_t *h = (hdsp_t*)hw->private;
if (h != 0) {
- free (h);
+ free (h);
}
}
@@ -209,7 +212,7 @@ jack_alsa_hdsp_hw_new (alsa_driver_t *driver)
jack_hardware_t *hw;
hdsp_t *h;
- hw = (jack_hardware_t *) malloc (sizeof (jack_hardware_t));
+ hw = (jack_hardware_t*)malloc (sizeof(jack_hardware_t));
/* Not using clock lock-sync-whatever in home hardware setup */
/* yet. Will write this code when can test it. */
@@ -223,8 +226,8 @@ jack_alsa_hdsp_hw_new (alsa_driver_t *driver)
hw->release = hdsp_release;
hw->get_hardware_peak = hdsp_get_hardware_peak;
hw->get_hardware_power = hdsp_get_hardware_power;
-
- h = (hdsp_t *) malloc (sizeof (hdsp_t));
+
+ h = (hdsp_t*)malloc (sizeof(hdsp_t));
h->driver = driver;
hw->private = h;
diff --git a/drivers/alsa/hdsp.h b/drivers/alsa/hdsp.h
index cc2ad04..f62ac7d 100644
--- a/drivers/alsa/hdsp.h
+++ b/drivers/alsa/hdsp.h
@@ -1,6 +1,6 @@
/*
Copyright (C) 2001 Paul Davis
-
+
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
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#ifndef __jack_hdsp_h__
#define __jack_hdsp_h__
@@ -23,10 +23,10 @@
#include <sys/time.h>
typedef struct {
- alsa_driver_t *driver;
+ alsa_driver_t *driver;
} hdsp_t;
jack_hardware_t *
-jack_alsa_hdsp_hw_new (alsa_driver_t *driver);
+jack_alsa_hdsp_hw_new(alsa_driver_t *driver);
#endif /* __jack_hdsp_h__*/
diff --git a/drivers/alsa/ice1712.c b/drivers/alsa/ice1712.c
index 6c38364..9c96f96 100644
--- a/drivers/alsa/ice1712.c
+++ b/drivers/alsa/ice1712.c
@@ -1,7 +1,7 @@
/*
Copyright (C) 2002 Anthony Van Groningen
- Parts based on source code taken from the
+ Parts based on source code taken from the
"Env24 chipset (ICE1712) control utility" that is
Copyright (C) 2000 by Jaroslav Kysela <perex@suse.cz>
@@ -19,7 +19,7 @@
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.
-*/
+ */
#include "hardware.h"
#include "alsa_driver.h"
@@ -27,13 +27,13 @@
#include "internal.h"
static int
-ice1712_hw_monitor_toggle(jack_hardware_t *hw, int idx, int onoff)
+ice1712_hw_monitor_toggle (jack_hardware_t *hw, int idx, int onoff)
{
- ice1712_t *h = (ice1712_t *) hw->private;
+ ice1712_t *h = (ice1712_t*)hw->private;
snd_ctl_elem_value_t *val;
int err;
-
+
snd_ctl_elem_value_alloca (&val);
snd_ctl_elem_value_set_interface (val, SND_CTL_ELEM_IFACE_MIXER);
if (idx >= 8) {
@@ -50,33 +50,33 @@ ice1712_hw_monitor_toggle(jack_hardware_t *hw, int idx, int onoff)
}
if ((err = snd_ctl_elem_write (h->driver->ctl_handle, val)) != 0) {
jack_error ("ALSA/ICE1712: (%d) cannot set input monitoring (%s)",
- idx,snd_strerror (err));
+ idx, snd_strerror (err));
return -1;
}
return 0;
}
-static int
+static int
ice1712_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
-
+
{
int idx;
- ice1712_t *h = (ice1712_t *) hw->private;
-
+ ice1712_t *h = (ice1712_t*)hw->private;
+
for (idx = 0; idx < 10; idx++) {
- if (h->active_channels & (1<<idx)) {
- ice1712_hw_monitor_toggle (hw, idx, mask & (1<<idx) ? 1 : 0);
+ if (h->active_channels & (1 << idx)) {
+ ice1712_hw_monitor_toggle (hw, idx, mask & (1 << idx) ? 1 : 0);
}
}
hw->input_monitor_mask = mask;
-
+
return 0;
}
-static int
-ice1712_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
-
+static int
+ice1712_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
+
{
return -1;
}
@@ -84,15 +84,17 @@ ice1712_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
static void
ice1712_release (jack_hardware_t *hw)
{
- ice1712_t *h = (ice1712_t *) hw->private;
-
- if (h == 0)
- return;
+ ice1712_t *h = (ice1712_t*)hw->private;
- if (h->eeprom)
- free(h->eeprom);
+ if (h == 0) {
+ return;
+ }
+
+ if (h->eeprom) {
+ free (h->eeprom);
+ }
- free(h);
+ free (h);
}
@@ -102,10 +104,10 @@ jack_alsa_ice1712_hw_new (alsa_driver_t *driver)
{
jack_hardware_t *hw;
ice1712_t *h;
- snd_ctl_elem_value_t *val;
+ snd_ctl_elem_value_t *val;
int err;
- hw = (jack_hardware_t *) malloc (sizeof (jack_hardware_t));
+ hw = (jack_hardware_t*)malloc (sizeof(jack_hardware_t));
hw->capabilities = Cap_HardwareMonitoring;
hw->input_monitor_mask = 0;
@@ -115,42 +117,42 @@ jack_alsa_ice1712_hw_new (alsa_driver_t *driver)
hw->change_sample_clock = ice1712_change_sample_clock;
hw->release = ice1712_release;
- h = (ice1712_t *) malloc (sizeof (ice1712_t));
+ h = (ice1712_t*)malloc (sizeof(ice1712_t));
h->driver = driver;
/* Get the EEPROM (adopted from envy24control) */
- h->eeprom = (ice1712_eeprom_t *) malloc (sizeof (ice1712_eeprom_t));
+ h->eeprom = (ice1712_eeprom_t*)malloc (sizeof(ice1712_eeprom_t));
snd_ctl_elem_value_alloca (&val);
snd_ctl_elem_value_set_interface (val, SND_CTL_ELEM_IFACE_CARD);
- snd_ctl_elem_value_set_name (val, "ICE1712 EEPROM");
- if ((err = snd_ctl_elem_read (driver->ctl_handle, val)) < 0) {
- jack_error( "ALSA/ICE1712: Unable to read EEPROM contents (%s)\n", snd_strerror (err));
- /* Recover? */
- }
- memcpy(h->eeprom, snd_ctl_elem_value_get_bytes(val), 32);
-
- /* determine number of pro ADC's. We're asumming that there is at least one stereo pair.
+ snd_ctl_elem_value_set_name (val, "ICE1712 EEPROM");
+ if ((err = snd_ctl_elem_read (driver->ctl_handle, val)) < 0) {
+ jack_error ( "ALSA/ICE1712: Unable to read EEPROM contents (%s)\n", snd_strerror (err));
+ /* Recover? */
+ }
+ memcpy (h->eeprom, snd_ctl_elem_value_get_bytes (val), 32);
+
+ /* determine number of pro ADC's. We're asumming that there is at least one stereo pair.
Should check this first, but how? */
- switch((h->eeprom->codec & 0xCU) >> 2) {
+ switch ((h->eeprom->codec & 0xCU) >> 2) {
case 0:
- h->active_channels = 0x3U;
- break;
+ h->active_channels = 0x3U;
+ break;
case 1:
- h->active_channels = 0xfU;
- break;
+ h->active_channels = 0xfU;
+ break;
case 2:
- h->active_channels = 0x3fU;
- break;
+ h->active_channels = 0x3fU;
+ break;
case 3:
- h->active_channels = 0xffU;
- break;
+ h->active_channels = 0xffU;
+ break;
}
/* check for SPDIF In's */
if (h->eeprom->spdif & 0x1U) {
- h->active_channels |= 0x300U;
+ h->active_channels |= 0x300U;
}
-
+
hw->private = h;
return hw;
diff --git a/drivers/alsa/ice1712.h b/drivers/alsa/ice1712.h
index 8dab29f..f68df57 100644
--- a/drivers/alsa/ice1712.h
+++ b/drivers/alsa/ice1712.h
@@ -1,11 +1,11 @@
/*
Copyright (C) 2002 Anthony Van Groningen
- Parts based on source code taken from the
+ Parts based on source code taken from the
"Env24 chipset (ICE1712) control utility" that is
Copyright (C) 2000 by Jaroslav Kysela <perex@suse.cz>
-
+
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
@@ -20,7 +20,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#ifndef __jack_ice1712_h__
#define __jack_ice1712_h__
@@ -36,31 +36,31 @@
#define MULTITRACK_PEAK_NAME "Multi Track Peak"
typedef struct {
- unsigned int subvendor; /* PCI[2c-2f] */
- unsigned char size; /* size of EEPROM image in bytes */
- unsigned char version; /* must be 1 */
- unsigned char codec; /* codec configuration PCI[60] */
- unsigned char aclink; /* ACLink configuration PCI[61] */
- unsigned char i2sID; /* PCI[62] */
- unsigned char spdif; /* S/PDIF configuration PCI[63] */
- unsigned char gpiomask; /* GPIO initial mask, 0 = write, 1 = don't */
- unsigned char gpiostate; /* GPIO initial state */
- unsigned char gpiodir; /* GPIO direction state */
- unsigned short ac97main;
- unsigned short ac97pcm;
- unsigned short ac97rec;
- unsigned char ac97recsrc;
- unsigned char dacID[4]; /* I2S IDs for DACs */
- unsigned char adcID[4]; /* I2S IDs for ADCs */
- unsigned char extra[4];
+ unsigned int subvendor; /* PCI[2c-2f] */
+ unsigned char size; /* size of EEPROM image in bytes */
+ unsigned char version; /* must be 1 */
+ unsigned char codec; /* codec configuration PCI[60] */
+ unsigned char aclink; /* ACLink configuration PCI[61] */
+ unsigned char i2sID; /* PCI[62] */
+ unsigned char spdif; /* S/PDIF configuration PCI[63] */
+ unsigned char gpiomask; /* GPIO initial mask, 0 = write, 1 = don't */
+ unsigned char gpiostate; /* GPIO initial state */
+ unsigned char gpiodir; /* GPIO direction state */
+ unsigned short ac97main;
+ unsigned short ac97pcm;
+ unsigned short ac97rec;
+ unsigned char ac97recsrc;
+ unsigned char dacID[4]; /* I2S IDs for DACs */
+ unsigned char adcID[4]; /* I2S IDs for ADCs */
+ unsigned char extra[4];
} ice1712_eeprom_t;
typedef struct {
- alsa_driver_t *driver;
- ice1712_eeprom_t *eeprom;
- unsigned long active_channels;
+ alsa_driver_t *driver;
+ ice1712_eeprom_t *eeprom;
+ unsigned long active_channels;
} ice1712_t;
-jack_hardware_t *jack_alsa_ice1712_hw_new (alsa_driver_t *driver);
+jack_hardware_t *jack_alsa_ice1712_hw_new(alsa_driver_t *driver);
#endif /* __jack_ice1712_h__*/
diff --git a/drivers/alsa/memops.c b/drivers/alsa/memops.c
index 090d7f4..24fd67b 100644
--- a/drivers/alsa/memops.c
+++ b/drivers/alsa/memops.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2000 Paul Davis
+ Copyright (C) 2000 Paul Davis
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
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#define _ISOC9X_SOURCE 1
#define _ISOC99_SOURCE 1
@@ -39,7 +39,7 @@
the MAX_<N>BIT values are floating point. when multiplied by
a full-scale normalized floating point sample value (-1.0..+1.0)
they should give the maxium value representable with an integer
- sample type of N bits. Note that this is asymmetric. Sample ranges
+ sample type of N bits. Note that this is asymmetric. Sample ranges
for signed integer, 2's complement values are -(2^(N-1) to +(2^(N-1)-1)
Complications
@@ -59,20 +59,20 @@
use the right factor).
So, for now (October 2008) we use 2^(N-1)-1 as the scaling factor.
-*/
+ */
#define SAMPLE_24BIT_SCALING 8388607.0f
#define SAMPLE_16BIT_SCALING 32767.0f
/* these are just values to use if the floating point value was out of range
-
+
advice from Fons Adriaensen: make the limits symmetrical
*/
-#define SAMPLE_24BIT_MAX 8388607
-#define SAMPLE_24BIT_MIN -8388607
-#define SAMPLE_24BIT_MAX_F 8388607.0f
-#define SAMPLE_24BIT_MIN_F -8388607.0f
+#define SAMPLE_24BIT_MAX 8388607
+#define SAMPLE_24BIT_MIN -8388607
+#define SAMPLE_24BIT_MAX_F 8388607.0f
+#define SAMPLE_24BIT_MIN_F -8388607.0f
#define SAMPLE_16BIT_MAX 32767
#define SAMPLE_16BIT_MIN -32767
@@ -80,91 +80,93 @@
#define SAMPLE_16BIT_MIN_F -32767.0f
/* these mark the outer edges of the range considered "within" range
- for a floating point sample value. values outside (and on the boundaries)
- of this range will be clipped before conversion; values within this
+ for a floating point sample value. values outside (and on the boundaries)
+ of this range will be clipped before conversion; values within this
range will be scaled to appropriate values for the target sample
type.
-*/
+ */
#define NORMALIZED_FLOAT_MIN -1.0f
#define NORMALIZED_FLOAT_MAX 1.0f
/* define this in case we end up on a platform that is missing
the real lrintf functions
-*/
+ */
-#define f_round(f) lrintf(f)
+#define f_round(f) lrintf (f)
-#define float_16(s, d)\
- if ((s) <= NORMALIZED_FLOAT_MIN) {\
- (d) = SAMPLE_16BIT_MIN;\
- } else if ((s) >= NORMALIZED_FLOAT_MAX) {\
- (d) = SAMPLE_16BIT_MAX;\
- } else {\
- (d) = f_round ((s) * SAMPLE_16BIT_SCALING);\
+#define float_16(s, d) \
+ if ((s) <= NORMALIZED_FLOAT_MIN) { \
+ (d) = SAMPLE_16BIT_MIN; \
+ } else if ((s) >= NORMALIZED_FLOAT_MAX) { \
+ (d) = SAMPLE_16BIT_MAX; \
+ } else { \
+ (d) = f_round ((s) * SAMPLE_16BIT_SCALING); \
}
/* call this when "s" has already been scaled (e.g. when dithering)
*/
-#define float_16_scaled(s, d)\
- if ((s) <= SAMPLE_16BIT_MIN_F) {\
- (d) = SAMPLE_16BIT_MIN_F;\
+#define float_16_scaled(s, d) \
+ if ((s) <= SAMPLE_16BIT_MIN_F) { \
+ (d) = SAMPLE_16BIT_MIN_F; \
} else if ((s) >= SAMPLE_16BIT_MAX_F) { \
- (d) = SAMPLE_16BIT_MAX;\
- } else {\
- (d) = f_round ((s));\
+ (d) = SAMPLE_16BIT_MAX; \
+ } else { \
+ (d) = f_round ((s)); \
}
#define float_24u32(s, d) \
- if ((s) <= NORMALIZED_FLOAT_MIN) {\
- (d) = SAMPLE_24BIT_MIN << 8;\
- } else if ((s) >= NORMALIZED_FLOAT_MAX) {\
- (d) = SAMPLE_24BIT_MAX << 8;\
- } else {\
- (d) = f_round ((s) * SAMPLE_24BIT_SCALING) << 8;\
+ if ((s) <= NORMALIZED_FLOAT_MIN) { \
+ (d) = SAMPLE_24BIT_MIN << 8; \
+ } else if ((s) >= NORMALIZED_FLOAT_MAX) { \
+ (d) = SAMPLE_24BIT_MAX << 8; \
+ } else { \
+ (d) = f_round ((s) * SAMPLE_24BIT_SCALING) << 8; \
}
/* call this when "s" has already been scaled (e.g. when dithering)
*/
-#define float_24u32_scaled(s, d)\
- if ((s) <= SAMPLE_24BIT_MIN_F) {\
- (d) = SAMPLE_24BIT_MIN << 8;\
+#define float_24u32_scaled(s, d) \
+ if ((s) <= SAMPLE_24BIT_MIN_F) { \
+ (d) = SAMPLE_24BIT_MIN << 8; \
} else if ((s) >= SAMPLE_24BIT_MAX_F) { \
(d) = SAMPLE_24BIT_MAX << 8; \
- } else {\
+ } else { \
(d) = f_round ((s)) << 8; \
}
#define float_24(s, d) \
- if ((s) <= NORMALIZED_FLOAT_MIN) {\
- (d) = SAMPLE_24BIT_MIN;\
- } else if ((s) >= NORMALIZED_FLOAT_MAX) {\
- (d) = SAMPLE_24BIT_MAX;\
- } else {\
- (d) = f_round ((s) * SAMPLE_24BIT_SCALING);\
+ if ((s) <= NORMALIZED_FLOAT_MIN) { \
+ (d) = SAMPLE_24BIT_MIN; \
+ } else if ((s) >= NORMALIZED_FLOAT_MAX) { \
+ (d) = SAMPLE_24BIT_MAX; \
+ } else { \
+ (d) = f_round ((s) * SAMPLE_24BIT_SCALING); \
}
/* call this when "s" has already been scaled (e.g. when dithering)
*/
-#define float_24_scaled(s, d)\
- if ((s) <= SAMPLE_24BIT_MIN_F) {\
- (d) = SAMPLE_24BIT_MIN;\
+#define float_24_scaled(s, d) \
+ if ((s) <= SAMPLE_24BIT_MIN_F) { \
+ (d) = SAMPLE_24BIT_MIN; \
} else if ((s) >= SAMPLE_24BIT_MAX_F) { \
(d) = SAMPLE_24BIT_MAX; \
- } else {\
+ } else { \
(d) = f_round ((s)); \
}
/* Linear Congruential noise generator. From the music-dsp list
- * less random than rand(), but good enough and 10x faster
+ * less random than rand(), but good enough and 10x faster
*/
-static inline unsigned int fast_rand() {
+static inline unsigned int fast_rand ()
+{
static unsigned int seed = 22222;
+
seed = (seed * 96314165) + 907633515;
return seed;
@@ -173,17 +175,19 @@ static inline unsigned int fast_rand() {
/* functions for native float sample data */
-void sample_move_floatLE_sSs (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) {
+void sample_move_floatLE_sSs (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
+{
while (nsamples--) {
- *dst = *((float *) src);
+ *dst = *((float*)src);
dst++;
src += src_skip;
}
}
-void sample_move_dS_floatLE (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) {
+void sample_move_dS_floatLE (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+{
while (nsamples--) {
- *((float *) dst) = *src;
+ *((float*)dst) = *src;
dst += dst_skip;
src++;
}
@@ -197,7 +201,7 @@ void sample_move_dS_floatLE (char *dst, jack_default_audio_sample_t *src, unsign
the "s<TYPE>" component defines the source type for the operation
TYPE can be one of:
-
+
S - sample is a jack_default_audio_sample_t, currently (October 2008) a 32 bit floating point value
Ss - like S but reverse endian from the host CPU
32u24 - sample is an signed 32 bit integer value, but data is in upper 24 bits only
@@ -210,7 +214,7 @@ void sample_move_dS_floatLE (char *dst, jack_default_audio_sample_t *src, unsign
For obvious reasons, the reverse endian versions only show as source types.
This covers all known sample formats at 16 bits or larger.
-*/
+ */
/* functions for native integer sample data */
@@ -224,29 +228,29 @@ void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsign
#if __BYTE_ORDER == __LITTLE_ENDIAN
- dst[0]=(char)(z>>24);
- dst[1]=(char)(z>>16);
- dst[2]=(char)(z>>8);
- dst[3]=(char)(z);
+ dst[0] = (char)(z >> 24);
+ dst[1] = (char)(z >> 16);
+ dst[2] = (char)(z >> 8);
+ dst[3] = (char)(z);
#elif __BYTE_ORDER == __BIG_ENDIAN
- dst[0]=(char)(z);
- dst[1]=(char)(z>>8);
- dst[2]=(char)(z>>16);
- dst[3]=(char)(z>>24);
+ dst[0] = (char)(z);
+ dst[1] = (char)(z >> 8);
+ dst[2] = (char)(z >> 16);
+ dst[3] = (char)(z >> 24);
#endif
dst += dst_skip;
src++;
}
-}
+}
void sample_move_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
while (nsamples--) {
- float_24u32 (*src, *((int32_t*) dst));
+ float_24u32 (*src, *((int32_t*)dst));
dst += dst_skip;
src++;
}
-}
+}
void sample_move_dS_s32u24s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
{
@@ -275,18 +279,18 @@ void sample_move_dS_s32u24s (jack_default_audio_sample_t *dst, char *src, unsign
dst++;
src += src_skip;
}
-}
+}
void sample_move_dS_s32u24 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
{
/* ALERT: signed sign-extension portability !!! */
while (nsamples--) {
- *dst = (*((int *) src) >> 8) / SAMPLE_24BIT_SCALING;
+ *dst = (*((int*)src) >> 8) / SAMPLE_24BIT_SCALING;
dst++;
src += src_skip;
}
-}
+}
void sample_move_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
@@ -295,34 +299,34 @@ void sample_move_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned
while (nsamples--) {
float_24 (*src, z);
#if __BYTE_ORDER == __LITTLE_ENDIAN
- dst[0]=(char)(z>>16);
- dst[1]=(char)(z>>8);
- dst[2]=(char)(z);
+ dst[0] = (char)(z >> 16);
+ dst[1] = (char)(z >> 8);
+ dst[2] = (char)(z);
#elif __BYTE_ORDER == __BIG_ENDIAN
- dst[0]=(char)(z);
- dst[1]=(char)(z>>8);
- dst[2]=(char)(z>>16);
+ dst[0] = (char)(z);
+ dst[1] = (char)(z >> 8);
+ dst[2] = (char)(z >> 16);
#endif
dst += dst_skip;
src++;
}
-}
+}
void sample_move_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
- int32_t z;
-
+ int32_t z;
+
while (nsamples--) {
float_24 (*src, z);
#if __BYTE_ORDER == __LITTLE_ENDIAN
memcpy (dst, &z, 3);
#elif __BYTE_ORDER == __BIG_ENDIAN
- memcpy (dst, (char *)&z + 1, 3);
+ memcpy (dst, (char*)&z + 1, 3);
#endif
dst += dst_skip;
src++;
}
-}
+}
void sample_move_dS_s24s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
{
@@ -355,7 +359,7 @@ void sample_move_dS_s24s (jack_default_audio_sample_t *dst, char *src, unsigned
dst++;
src += src_skip;
}
-}
+}
void sample_move_dS_s24 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
{
@@ -364,19 +368,19 @@ void sample_move_dS_s24 (jack_default_audio_sample_t *dst, char *src, unsigned l
while (nsamples--) {
int x;
#if __BYTE_ORDER == __LITTLE_ENDIAN
- memcpy((char*)&x + 1, src, 3);
+ memcpy ((char*)&x + 1, src, 3);
#elif __BYTE_ORDER == __BIG_ENDIAN
- memcpy(&x, src, 3);
+ memcpy (&x, src, 3);
#endif
x >>= 8;
*dst = x / SAMPLE_24BIT_SCALING;
dst++;
src += src_skip;
}
-}
+}
-void sample_move_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
int16_t tmp;
@@ -388,108 +392,108 @@ void sample_move_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned
} else if (*src >= NORMALIZED_FLOAT_MAX) {
tmp = SAMPLE_16BIT_MAX;
} else {
- tmp = (int16_t) f_round (*src * SAMPLE_16BIT_SCALING);
+ tmp = (int16_t)f_round (*src * SAMPLE_16BIT_SCALING);
}
#if __BYTE_ORDER == __LITTLE_ENDIAN
- dst[0]=(char)(tmp>>8);
- dst[1]=(char)(tmp);
+ dst[0] = (char)(tmp >> 8);
+ dst[1] = (char)(tmp);
#elif __BYTE_ORDER == __BIG_ENDIAN
- dst[0]=(char)(tmp);
- dst[1]=(char)(tmp>>8);
+ dst[0] = (char)(tmp);
+ dst[1] = (char)(tmp >> 8);
#endif
dst += dst_skip;
src++;
}
}
-void sample_move_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
while (nsamples--) {
- float_16 (*src, *((int16_t*) dst));
+ float_16 (*src, *((int16_t*)dst));
dst += dst_skip;
src++;
}
}
-void sample_move_dither_rect_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_dither_rect_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
jack_default_audio_sample_t val;
- int16_t tmp;
+ int16_t tmp;
while (nsamples--) {
- val = (*src * SAMPLE_16BIT_SCALING) + fast_rand() / (float) UINT_MAX - 0.5f;
+ val = (*src * SAMPLE_16BIT_SCALING) + fast_rand () / (float)UINT_MAX - 0.5f;
float_16_scaled (val, tmp);
#if __BYTE_ORDER == __LITTLE_ENDIAN
- dst[0]=(char)(tmp>>8);
- dst[1]=(char)(tmp);
+ dst[0] = (char)(tmp >> 8);
+ dst[1] = (char)(tmp);
#elif __BYTE_ORDER == __BIG_ENDIAN
- dst[0]=(char)(tmp);
- dst[1]=(char)(tmp>>8);
+ dst[0] = (char)(tmp);
+ dst[1] = (char)(tmp >> 8);
#endif
dst += dst_skip;
src++;
}
}
-void sample_move_dither_rect_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_dither_rect_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
jack_default_audio_sample_t val;
while (nsamples--) {
- val = (*src * SAMPLE_16BIT_SCALING) + fast_rand() / (float)UINT_MAX - 0.5f;
- float_16_scaled (val, *((int16_t*) dst));
+ val = (*src * SAMPLE_16BIT_SCALING) + fast_rand () / (float)UINT_MAX - 0.5f;
+ float_16_scaled (val, *((int16_t*)dst));
dst += dst_skip;
src++;
}
}
-void sample_move_dither_tri_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_dither_tri_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
jack_default_audio_sample_t val;
- int16_t tmp;
+ int16_t tmp;
while (nsamples--) {
- val = (*src * SAMPLE_16BIT_SCALING) + ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f;
+ val = (*src * SAMPLE_16BIT_SCALING) + ((float)fast_rand () + (float)fast_rand ()) / (float)UINT_MAX - 1.0f;
float_16_scaled (val, tmp);
#if __BYTE_ORDER == __LITTLE_ENDIAN
- dst[0]=(char)(tmp>>8);
- dst[1]=(char)(tmp);
+ dst[0] = (char)(tmp >> 8);
+ dst[1] = (char)(tmp);
#elif __BYTE_ORDER == __BIG_ENDIAN
- dst[0]=(char)(tmp);
- dst[1]=(char)(tmp>>8);
+ dst[0] = (char)(tmp);
+ dst[1] = (char)(tmp >> 8);
#endif
dst += dst_skip;
src++;
}
}
-void sample_move_dither_tri_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_dither_tri_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
jack_default_audio_sample_t val;
while (nsamples--) {
- val = (*src * SAMPLE_16BIT_SCALING) + ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f;
- float_16_scaled (val, *((int16_t*) dst));
+ val = (*src * SAMPLE_16BIT_SCALING) + ((float)fast_rand () + (float)fast_rand ()) / (float)UINT_MAX - 1.0f;
+ float_16_scaled (val, *((int16_t*)dst));
dst += dst_skip;
src++;
}
}
-void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
- jack_default_audio_sample_t x;
- jack_default_audio_sample_t xe; /* the innput sample - filtered error */
- jack_default_audio_sample_t xp; /* x' */
- float r;
- float rm1 = state->rm1;
+ jack_default_audio_sample_t x;
+ jack_default_audio_sample_t xe; /* the innput sample - filtered error */
+ jack_default_audio_sample_t xp; /* x' */
+ float r;
+ float rm1 = state->rm1;
unsigned int idx = state->idx;
- int16_t tmp;
+ int16_t tmp;
while (nsamples--) {
x = *src * SAMPLE_16BIT_SCALING;
- r = ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f;
+ r = ((float)fast_rand () + (float)fast_rand ()) / (float)UINT_MAX - 1.0f;
/* Filter the error with Lipshitz's minimally audible FIR:
[2.033 -2.165 1.959 -1.590 0.6149] */
xe = x
@@ -508,11 +512,11 @@ void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t
state->e[idx] = xp - xe;
#if __BYTE_ORDER == __LITTLE_ENDIAN
- dst[0]=(char)(tmp>>8);
- dst[1]=(char)(tmp);
+ dst[0] = (char)(tmp >> 8);
+ dst[1] = (char)(tmp);
#elif __BYTE_ORDER == __BIG_ENDIAN
- dst[0]=(char)(tmp);
- dst[1]=(char)(tmp>>8);
+ dst[0] = (char)(tmp);
+ dst[1] = (char)(tmp >> 8);
#endif
dst += dst_skip;
src++;
@@ -521,18 +525,18 @@ void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t
state->idx = idx;
}
-void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
+void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state)
{
- jack_default_audio_sample_t x;
- jack_default_audio_sample_t xe; /* the innput sample - filtered error */
- jack_default_audio_sample_t xp; /* x' */
- float r;
- float rm1 = state->rm1;
+ jack_default_audio_sample_t x;
+ jack_default_audio_sample_t xe; /* the innput sample - filtered error */
+ jack_default_audio_sample_t xp; /* x' */
+ float r;
+ float rm1 = state->rm1;
unsigned int idx = state->idx;
while (nsamples--) {
x = *src * SAMPLE_16BIT_SCALING;
- r = ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f;
+ r = ((float)fast_rand () + (float)fast_rand ()) / (float)UINT_MAX - 1.0f;
/* Filter the error with Lipshitz's minimally audible FIR:
[2.033 -2.165 1.959 -1.590 0.6149] */
xe = x
@@ -544,11 +548,11 @@ void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t *
xp = xe + r - rm1;
rm1 = r;
- float_16_scaled (xp, *((int16_t*) dst));
+ float_16_scaled (xp, *((int16_t*)dst));
/* Intrinsic z^-1 delay */
idx = (idx + 1) & DITHER_BUF_MASK;
- state->e[idx] = *((int16_t*) dst) - xe;
+ state->e[idx] = *((int16_t*)dst) - xe;
dst += dst_skip;
src++;
@@ -557,7 +561,7 @@ void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t *
state->idx = idx;
}
-void sample_move_dS_s16s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
+void sample_move_dS_s16s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
{
short z;
@@ -576,22 +580,22 @@ void sample_move_dS_s16s (jack_default_audio_sample_t *dst, char *src, unsigned
dst++;
src += src_skip;
}
-}
+}
+
+void sample_move_dS_s16 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
-void sample_move_dS_s16 (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip)
-
{
/* ALERT: signed sign-extension portability !!! */
while (nsamples--) {
- *dst = (*((short *) src)) / SAMPLE_16BIT_SCALING;
+ *dst = (*((short*)src)) / SAMPLE_16BIT_SCALING;
dst++;
src += src_skip;
}
-}
+}
-void memset_interleave (char *dst, char val, unsigned long bytes,
- unsigned long unit_bytes,
- unsigned long skip_bytes)
+void memset_interleave (char *dst, char val, unsigned long bytes,
+ unsigned long unit_bytes,
+ unsigned long skip_bytes)
{
switch (unit_bytes) {
case 1:
@@ -602,21 +606,21 @@ void memset_interleave (char *dst, char val, unsigned long bytes,
break;
case 2:
while (bytes) {
- *((short *) dst) = (short) val;
+ *((short*)dst) = (short)val;
dst += skip_bytes;
bytes -= 2;
}
break;
- case 4:
+ case 4:
while (bytes) {
- *((int *) dst) = (int) val;
+ *((int*)dst) = (int)val;
dst += skip_bytes;
bytes -= 4;
}
break;
default:
while (bytes) {
- memset(dst, val, unit_bytes);
+ memset (dst, val, unit_bytes);
dst += skip_bytes;
bytes -= unit_bytes;
}
@@ -629,46 +633,46 @@ void memset_interleave (char *dst, char val, unsigned long bytes,
is the same for both channels. This is completely fine
unless the input and output were on different audio interfaces that
were interleaved differently. We don't try to handle that.
-*/
+ */
-void
+void
memcpy_fake (char *dst, char *src, unsigned long src_bytes, unsigned long foo, unsigned long bar)
{
memcpy (dst, src, src_bytes);
}
-void
+void
memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes,
unsigned long dst_skip_bytes, unsigned long src_skip_bytes)
{
while (src_bytes) {
- *((short *) dst) = *((short *) src);
+ *((short*)dst) = *((short*)src);
dst += dst_skip_bytes;
src += src_skip_bytes;
src_bytes -= 2;
}
}
-void
+void
memcpy_interleave_d24_s24 (char *dst, char *src, unsigned long src_bytes,
unsigned long dst_skip_bytes, unsigned long src_skip_bytes)
{
while (src_bytes) {
- memcpy(dst, src, 3);
+ memcpy (dst, src, 3);
dst += dst_skip_bytes;
src += src_skip_bytes;
src_bytes -= 3;
}
}
-void
+void
memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes,
unsigned long dst_skip_bytes, unsigned long src_skip_bytes)
{
while (src_bytes) {
- *((int *) dst) = *((int *) src);
+ *((int*)dst) = *((int*)src);
dst += dst_skip_bytes;
src += src_skip_bytes;
src_bytes -= 4;
diff --git a/drivers/alsa/usx2y.c b/drivers/alsa/usx2y.c
index 23efeb3..b0a6d12 100644
--- a/drivers/alsa/usx2y.c
+++ b/drivers/alsa/usx2y.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2001 Paul Davis
+ Copyright (C) 2001 Paul Davis
Copyright (C) 2005 Karsten Wiese, Rui Nuno Capela
This program is free software; you can redistribute it and/or modify
@@ -16,7 +16,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#include "hardware.h"
#include "alsa_driver.h"
@@ -36,14 +36,14 @@
int dbg_offset;
char dbg_buffer[8096];
#endif
-static
+static
int usx2y_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask)
{
return -1;
}
static
-int usx2y_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
+int usx2y_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
{
return -1;
}
@@ -51,78 +51,85 @@ int usx2y_change_sample_clock (jack_hardware_t *hw, SampleClockMode mode)
static void
usx2y_release (jack_hardware_t *hw)
{
- usx2y_t *h = (usx2y_t *) hw->private;
+ usx2y_t *h = (usx2y_t*)hw->private;
- if (h == 0)
+ if (h == 0) {
return;
-
- if (h->hwdep_handle)
- snd_hwdep_close(h->hwdep_handle);
+ }
+
+ if (h->hwdep_handle) {
+ snd_hwdep_close (h->hwdep_handle);
+ }
- free(h);
+ free (h);
}
static int
usx2y_driver_get_channel_addresses_playback (alsa_driver_t *driver,
- snd_pcm_uframes_t *playback_avail)
+ snd_pcm_uframes_t *playback_avail)
{
channel_t chn;
int iso;
snd_pcm_uframes_t playback_iso_avail;
char *playback;
- usx2y_t *h = (usx2y_t *) driver->hw->private;
+ usx2y_t *h = (usx2y_t*)driver->hw->private;
if (0 > h->playback_iso_start) {
int bytes = driver->playback_sample_bytes * 2 * driver->frames_per_cycle *
- driver->user_nperiods;
+ driver->user_nperiods;
iso = h->hwdep_pcm_shm->playback_iso_start;
- if (0 > iso)
+ if (0 > iso) {
return 0; /* FIXME: return -1; */
- if (++iso >= ARRAY_SIZE(h->hwdep_pcm_shm->captured_iso))
+ }
+ if (++iso >= ARRAY_SIZE (h->hwdep_pcm_shm->captured_iso)) {
iso = 0;
- while((bytes -= h->hwdep_pcm_shm->captured_iso[iso].length) > 0)
- if (++iso >= ARRAY_SIZE(h->hwdep_pcm_shm->captured_iso))
+ }
+ while ((bytes -= h->hwdep_pcm_shm->captured_iso[iso].length) > 0)
+ if (++iso >= ARRAY_SIZE (h->hwdep_pcm_shm->captured_iso)) {
iso = 0;
+ }
h->playback_iso_bytes_done = h->hwdep_pcm_shm->captured_iso[iso].length + bytes;
#ifdef DBGHWDEP
- dbg_offset = sprintf(dbg_buffer, "first iso = %i %i@%p:%i\n",
- iso, h->hwdep_pcm_shm->captured_iso[iso].length,
- h->hwdep_pcm_shm->playback,
- h->hwdep_pcm_shm->captured_iso[iso].offset);
+ dbg_offset = sprintf (dbg_buffer, "first iso = %i %i@%p:%i\n",
+ iso, h->hwdep_pcm_shm->captured_iso[iso].length,
+ h->hwdep_pcm_shm->playback,
+ h->hwdep_pcm_shm->captured_iso[iso].offset);
#endif
} else {
iso = h->playback_iso_start;
}
#ifdef DBGHWDEP
- dbg_offset += sprintf(dbg_buffer + dbg_offset, "iso = %i(%i;%i); ", iso,
- h->hwdep_pcm_shm->captured_iso[iso].offset,
- h->hwdep_pcm_shm->captured_iso[iso].frame);
+ dbg_offset += sprintf (dbg_buffer + dbg_offset, "iso = %i(%i;%i); ", iso,
+ h->hwdep_pcm_shm->captured_iso[iso].offset,
+ h->hwdep_pcm_shm->captured_iso[iso].frame);
#endif
playback = h->hwdep_pcm_shm->playback +
- h->hwdep_pcm_shm->captured_iso[iso].offset +
- h->playback_iso_bytes_done;
+ h->hwdep_pcm_shm->captured_iso[iso].offset +
+ h->playback_iso_bytes_done;
playback_iso_avail = (h->hwdep_pcm_shm->captured_iso[iso].length -
- h->playback_iso_bytes_done) /
- (driver->playback_sample_bytes * 2);
+ h->playback_iso_bytes_done) /
+ (driver->playback_sample_bytes * 2);
if (*playback_avail >= playback_iso_avail) {
*playback_avail = playback_iso_avail;
- if (++iso >= ARRAY_SIZE(h->hwdep_pcm_shm->captured_iso))
+ if (++iso >= ARRAY_SIZE (h->hwdep_pcm_shm->captured_iso)) {
iso = 0;
+ }
h->playback_iso_bytes_done = 0;
- } else
+ } else {
h->playback_iso_bytes_done =
*playback_avail * (driver->playback_sample_bytes * 2);
+ }
h->playback_iso_start = iso;
for (chn = 0; chn < driver->playback_nchannels; chn++) {
const snd_pcm_channel_area_t *a = &driver->playback_areas[chn];
driver->playback_addr[chn] = playback + a->first / 8;
}
#ifdef DBGHWDEP
- if (dbg_offset < (sizeof(dbg_buffer) - 256))
- dbg_offset += sprintf(dbg_buffer + dbg_offset, "avail %li@%p\n", *playback_avail, driver->playback_addr[0]);
- else {
- printf(dbg_buffer);
+ if (dbg_offset < (sizeof(dbg_buffer) - 256)) {
+ dbg_offset += sprintf (dbg_buffer + dbg_offset, "avail %li@%p\n", *playback_avail, driver->playback_addr[0]);
+ } else {
+ printf (dbg_buffer);
return -1;
}
#endif
@@ -132,48 +139,51 @@ usx2y_driver_get_channel_addresses_playback (alsa_driver_t *driver,
static int
usx2y_driver_get_channel_addresses_capture (alsa_driver_t *driver,
- snd_pcm_uframes_t *capture_avail)
+ snd_pcm_uframes_t *capture_avail)
{
channel_t chn;
int iso;
snd_pcm_uframes_t capture_iso_avail;
int capture_offset;
- usx2y_t *h = (usx2y_t *) driver->hw->private;
+ usx2y_t *h = (usx2y_t*)driver->hw->private;
if (0 > h->capture_iso_start) {
iso = h->hwdep_pcm_shm->capture_iso_start;
- if (0 > iso)
+ if (0 > iso) {
return 0; /* FIXME: return -1; */
+ }
h->capture_iso_bytes_done = 0;
#ifdef DBGHWDEP
- dbg_offset = sprintf(dbg_buffer, "cfirst iso = %i %i@%p:%i\n",
- iso, h->hwdep_pcm_shm->captured_iso[iso].length,
- h->hwdep_pcm_shm->capture0x8,
- h->hwdep_pcm_shm->captured_iso[iso].offset);
+ dbg_offset = sprintf (dbg_buffer, "cfirst iso = %i %i@%p:%i\n",
+ iso, h->hwdep_pcm_shm->captured_iso[iso].length,
+ h->hwdep_pcm_shm->capture0x8,
+ h->hwdep_pcm_shm->captured_iso[iso].offset);
#endif
} else {
iso = h->capture_iso_start;
}
#ifdef DBGHWDEP
- dbg_offset += sprintf(dbg_buffer + dbg_offset, "ciso = %i(%i;%i); ", iso,
- h->hwdep_pcm_shm->captured_iso[iso].offset,
- h->hwdep_pcm_shm->captured_iso[iso].frame);
+ dbg_offset += sprintf (dbg_buffer + dbg_offset, "ciso = %i(%i;%i); ", iso,
+ h->hwdep_pcm_shm->captured_iso[iso].offset,
+ h->hwdep_pcm_shm->captured_iso[iso].frame);
#endif
capture_offset =
h->hwdep_pcm_shm->captured_iso[iso].offset +
- h->capture_iso_bytes_done;
+ h->capture_iso_bytes_done;
capture_iso_avail = (h->hwdep_pcm_shm->captured_iso[iso].length -
- h->capture_iso_bytes_done) /
- (driver->capture_sample_bytes * 2);
+ h->capture_iso_bytes_done) /
+ (driver->capture_sample_bytes * 2);
if (*capture_avail >= capture_iso_avail) {
*capture_avail = capture_iso_avail;
- if (++iso >= ARRAY_SIZE(h->hwdep_pcm_shm->captured_iso))
+ if (++iso >= ARRAY_SIZE (h->hwdep_pcm_shm->captured_iso)) {
iso = 0;
+ }
h->capture_iso_bytes_done = 0;
- } else
+ } else {
h->capture_iso_bytes_done =
*capture_avail * (driver->capture_sample_bytes * 2);
+ }
h->capture_iso_start = iso;
for (chn = 0; chn < driver->capture_nchannels; chn++) {
driver->capture_addr[chn] =
@@ -182,21 +192,22 @@ usx2y_driver_get_channel_addresses_capture (alsa_driver_t *driver,
((chn & 1) ? driver->capture_sample_bytes : 0);
}
#ifdef DBGHWDEP
- {
- int f = 0;
- unsigned *u = driver->capture_addr[0];
- static unsigned last;
- dbg_offset += sprintf(dbg_buffer + dbg_offset, "\nvon %6u bis %6u\n", last, u[0]);
- while (f < *capture_avail && dbg_offset < (sizeof(dbg_buffer) - 256)) {
- if (u[f] != last + 1)
- dbg_offset += sprintf(dbg_buffer + dbg_offset, "\nooops %6u %6u\n", last, u[f]);
- last = u[f++];
- }
- }
- if (dbg_offset < (sizeof(dbg_buffer) - 256))
- dbg_offset += sprintf(dbg_buffer + dbg_offset, "avail %li@%p\n", *capture_avail, driver->capture_addr[0]);
- else {
- printf(dbg_buffer);
+ {
+ int f = 0;
+ unsigned *u = driver->capture_addr[0];
+ static unsigned last;
+ dbg_offset += sprintf (dbg_buffer + dbg_offset, "\nvon %6u bis %6u\n", last, u[0]);
+ while (f < *capture_avail && dbg_offset < (sizeof(dbg_buffer) - 256)) {
+ if (u[f] != last + 1) {
+ dbg_offset += sprintf (dbg_buffer + dbg_offset, "\nooops %6u %6u\n", last, u[f]);
+ }
+ last = u[f++];
+ }
+ }
+ if (dbg_offset < (sizeof(dbg_buffer) - 256)) {
+ dbg_offset += sprintf (dbg_buffer + dbg_offset, "avail %li@%p\n", *capture_avail, driver->capture_addr[0]);
+ } else {
+ printf (dbg_buffer);
return -1;
}
#endif
@@ -210,7 +221,7 @@ usx2y_driver_start (alsa_driver_t *driver)
int err, i;
snd_pcm_uframes_t poffset, pavail;
- usx2y_t *h = (usx2y_t *) driver->hw->private;
+ usx2y_t *h = (usx2y_t*)driver->hw->private;
for (i = 0; i < driver->capture_nchannels; i++)
// US428 channels 3+4 are on a seperate 2 channel stream.
@@ -225,40 +236,40 @@ usx2y_driver_start (alsa_driver_t *driver)
driver->poll_next = 0;
if ((err = snd_pcm_prepare (driver->playback_handle)) < 0) {
- jack_error ("ALSA/USX2Y: prepare error for playback: %s", snd_strerror(err));
+ jack_error ("ALSA/USX2Y: prepare error for playback: %s", snd_strerror (err));
return -1;
}
if (driver->playback_handle) {
-/* int i, j; */
-/* char buffer[2000]; */
+/* int i, j; */
+/* char buffer[2000]; */
h->playback_iso_start =
h->capture_iso_start = -1;
- snd_hwdep_poll_descriptors(h->hwdep_handle, &h->pfds, 1);
+ snd_hwdep_poll_descriptors (h->hwdep_handle, &h->pfds, 1);
h->hwdep_pcm_shm = (snd_usX2Y_hwdep_pcm_shm_t*)
- mmap(NULL, sizeof(snd_usX2Y_hwdep_pcm_shm_t),
- PROT_READ,
- MAP_SHARED, h->pfds.fd,
- 0);
+ mmap (NULL, sizeof(snd_usX2Y_hwdep_pcm_shm_t),
+ PROT_READ,
+ MAP_SHARED, h->pfds.fd,
+ 0);
if (MAP_FAILED == h->hwdep_pcm_shm) {
- perror("ALSA/USX2Y: mmap");
+ perror ("ALSA/USX2Y: mmap");
return -1;
}
- if (mprotect(h->hwdep_pcm_shm->playback,
- sizeof(h->hwdep_pcm_shm->playback),
- PROT_READ|PROT_WRITE)) {
- perror("ALSA/USX2Y: mprotect");
+ if (mprotect (h->hwdep_pcm_shm->playback,
+ sizeof(h->hwdep_pcm_shm->playback),
+ PROT_READ | PROT_WRITE)) {
+ perror ("ALSA/USX2Y: mprotect");
return -1;
}
- memset(h->hwdep_pcm_shm->playback, 0, sizeof(h->hwdep_pcm_shm->playback));
-/* for (i = 0, j = 0; i < 2000;) { */
-/* j += sprintf(buffer + j, "%04hX ", */
-/* *(unsigned short*)(h->hwdep_pcm_shm->capture + i)); */
-/* if (((i += 2) % 32) == 0) { */
-/* jack_error(buffer); */
-/* j = 0; */
-/* } */
-/* } */
+ memset (h->hwdep_pcm_shm->playback, 0, sizeof(h->hwdep_pcm_shm->playback));
+/* for (i = 0, j = 0; i < 2000;) { */
+/* j += sprintf(buffer + j, "%04hX ", */
+/* *(unsigned short*)(h->hwdep_pcm_shm->capture + i)); */
+/* if (((i += 2) % 32) == 0) { */
+/* jack_error(buffer); */
+/* j = 0; */
+/* } */
+/* } */
}
if (driver->hw_monitoring) {
@@ -269,7 +280,7 @@ usx2y_driver_start (alsa_driver_t *driver)
if (driver->playback_handle) {
/* fill playback buffer with zeroes, and mark
all fragments as having data.
- */
+ */
pavail = snd_pcm_avail_update (driver->playback_handle);
@@ -278,10 +289,10 @@ usx2y_driver_start (alsa_driver_t *driver)
return -1;
}
- if (snd_pcm_mmap_begin(
- driver->playback_handle,
- &driver->playback_areas,
- &poffset, &pavail) < 0) {
+ if (snd_pcm_mmap_begin (
+ driver->playback_handle,
+ &driver->playback_areas,
+ &poffset, &pavail) < 0) {
return -1;
}
@@ -292,22 +303,22 @@ usx2y_driver_start (alsa_driver_t *driver)
alsa-lib may have a better function for doing this
here, where the goal is to silence the entire
buffer.
- */
+ */
{
-/* snd_pcm_uframes_t frag, nframes = driver->buffer_frames; */
-/* while (nframes) { */
-/* frag = nframes; */
-/* if (usx2y_driver_get_channel_addresses_playback(driver, &frag) < 0) */
-/* return -1; */
-
-/* for (chn = 0; chn < driver->playback_nchannels; chn++) */
-/* alsa_driver_silence_on_channel (driver, chn, frag); */
-/* nframes -= frag; */
-/* } */
+/* snd_pcm_uframes_t frag, nframes = driver->buffer_frames; */
+/* while (nframes) { */
+/* frag = nframes; */
+/* if (usx2y_driver_get_channel_addresses_playback(driver, &frag) < 0) */
+/* return -1; */
+
+/* for (chn = 0; chn < driver->playback_nchannels; chn++) */
+/* alsa_driver_silence_on_channel (driver, chn, frag); */
+/* nframes -= frag; */
+/* } */
}
snd_pcm_mmap_commit (driver->playback_handle, poffset,
- driver->user_nperiods * driver->frames_per_cycle);
+ driver->user_nperiods * driver->frames_per_cycle);
if ((err = snd_pcm_start (driver->playback_handle)) < 0) {
jack_error ("ALSA/USX2Y: could not start playback (%s)",
@@ -326,16 +337,16 @@ usx2y_driver_start (alsa_driver_t *driver)
}
}
- driver->playback_nfds = snd_pcm_poll_descriptors_count (driver->playback_handle);
+ driver->playback_nfds = snd_pcm_poll_descriptors_count (driver->playback_handle);
driver->capture_nfds = snd_pcm_poll_descriptors_count (driver->capture_handle);
if (driver->pfd) {
free (driver->pfd);
}
- driver->pfd = (struct pollfd *)
- malloc (sizeof (struct pollfd) *
- (driver->playback_nfds + driver->capture_nfds + 2));
+ driver->pfd = (struct pollfd*)
+ malloc (sizeof(struct pollfd) *
+ (driver->playback_nfds + driver->capture_nfds + 2));
return 0;
}
@@ -347,28 +358,28 @@ usx2y_driver_stop (alsa_driver_t *driver)
JSList* node;
int chn;
- usx2y_t *h = (usx2y_t *) driver->hw->private;
+ usx2y_t *h = (usx2y_t*)driver->hw->private;
/* silence all capture port buffers, because we might
be entering offline mode.
- */
+ */
for (chn = 0, node = driver->capture_ports; node;
- node = jack_slist_next (node), chn++) {
+ node = jack_slist_next (node), chn++) {
jack_port_t* port;
char* buf;
jack_nframes_t nframes = driver->engine->control->buffer_size;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- memset (buf, 0, sizeof (jack_default_audio_sample_t) * nframes);
+ memset (buf, 0, sizeof(jack_default_audio_sample_t) * nframes);
}
if (driver->playback_handle) {
if ((err = snd_pcm_drop (driver->playback_handle)) < 0) {
jack_error ("ALSA/USX2Y: channel flush for playback "
- "failed (%s)", snd_strerror (err));
+ "failed (%s)", snd_strerror (err));
return -1;
}
}
@@ -377,7 +388,7 @@ usx2y_driver_stop (alsa_driver_t *driver)
driver->hw->set_input_monitor_mask (driver->hw, 0);
}
- munmap(h->hwdep_pcm_shm, sizeof(snd_usX2Y_hwdep_pcm_shm_t));
+ munmap (h->hwdep_pcm_shm, sizeof(snd_usX2Y_hwdep_pcm_shm_t));
return 0;
}
@@ -390,8 +401,8 @@ usx2y_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
snd_pcm_uframes_t contiguous, contiguous_;
int chn;
- VERBOSE(driver->engine,
- "usx2y_driver_null_cycle (%p, %i)", driver, nframes);
+ VERBOSE (driver->engine,
+ "usx2y_driver_null_cycle (%p, %i)", driver, nframes);
if (driver->capture_handle) {
nf = nframes;
@@ -399,25 +410,26 @@ usx2y_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
while (nf) {
contiguous = (nf > driver->frames_per_cycle) ?
- driver->frames_per_cycle : nf;
+ driver->frames_per_cycle : nf;
if (snd_pcm_mmap_begin (
- driver->capture_handle,
- &driver->capture_areas,
- (snd_pcm_uframes_t *) &offset,
- (snd_pcm_uframes_t *) &contiguous)) {
+ driver->capture_handle,
+ &driver->capture_areas,
+ (snd_pcm_uframes_t*)&offset,
+ (snd_pcm_uframes_t*)&contiguous)) {
return -1;
}
contiguous_ = contiguous;
while (contiguous_) {
snd_pcm_uframes_t frag = contiguous_;
- if (usx2y_driver_get_channel_addresses_capture(driver, &frag) < 0)
+ if (usx2y_driver_get_channel_addresses_capture (driver, &frag) < 0) {
return -1;
+ }
contiguous_ -= frag;
}
if (snd_pcm_mmap_commit (driver->capture_handle,
- offset, contiguous) < 0) {
+ offset, contiguous) < 0) {
return -1;
}
@@ -430,13 +442,13 @@ usx2y_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
offset = 0;
while (nf) {
contiguous = (nf > driver->frames_per_cycle) ?
- driver->frames_per_cycle : nf;
+ driver->frames_per_cycle : nf;
if (snd_pcm_mmap_begin (
driver->playback_handle,
&driver->playback_areas,
- (snd_pcm_uframes_t *) &offset,
- (snd_pcm_uframes_t *) &contiguous)) {
+ (snd_pcm_uframes_t*)&offset,
+ (snd_pcm_uframes_t*)&contiguous)) {
return -1;
}
@@ -444,8 +456,9 @@ usx2y_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
snd_pcm_uframes_t frag, nframes = contiguous;
while (nframes) {
frag = nframes;
- if (usx2y_driver_get_channel_addresses_playback(driver, &frag) < 0)
+ if (usx2y_driver_get_channel_addresses_playback (driver, &frag) < 0) {
return -1;
+ }
for (chn = 0; chn < driver->playback_nchannels; chn++)
alsa_driver_silence_on_channel (driver, chn, frag);
nframes -= frag;
@@ -453,7 +466,7 @@ usx2y_driver_null_cycle (alsa_driver_t* driver, jack_nframes_t nframes)
}
if (snd_pcm_mmap_commit (driver->playback_handle,
- offset, contiguous) < 0) {
+ offset, contiguous) < 0) {
return -1;
}
@@ -493,7 +506,7 @@ usx2y_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
for (chn = 0, node = driver->capture_ports;
node; node = jack_slist_next (node), chn++) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
if (!jack_port_connected (port)) {
continue;
}
@@ -509,7 +522,7 @@ usx2y_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
}
for (chn = 0, node = driver->capture_ports;
node; node = jack_slist_next (node), chn++) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
if (!jack_port_connected (port)) {
/* no-copy optimization */
continue;
@@ -517,10 +530,10 @@ usx2y_driver_read (alsa_driver_t *driver, jack_nframes_t nframes)
alsa_driver_read_from_channel (driver, chn,
buf[chn] + nread,
contiguous);
-/* sample_move_dS_s24(buf[chn] + nread, */
-/* driver->capture_addr[chn], */
-/* contiguous, */
-/* driver->capture_interleave_skip); */
+/* sample_move_dS_s24(buf[chn] + nread, */
+/* driver->capture_addr[chn], */
+/* contiguous, */
+/* driver->capture_interleave_skip); */
}
nread += contiguous;
nframes -= contiguous;
@@ -562,24 +575,24 @@ usx2y_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
driver->input_monitor_mask = 0;
for (chn = 0, node = driver->capture_ports; node;
- node = jack_slist_next (node), chn++) {
- if (((jack_port_t *) node->data)->shared->monitor_requests) {
- driver->input_monitor_mask |= (1<<chn);
+ node = jack_slist_next (node), chn++) {
+ if (((jack_port_t*)node->data)->shared->monitor_requests) {
+ driver->input_monitor_mask |= (1 << chn);
}
}
if (driver->hw_monitoring) {
if ((driver->hw->input_monitor_mask
- != driver->input_monitor_mask)
- && !driver->all_monitor_in) {
+ != driver->input_monitor_mask)
+ && !driver->all_monitor_in) {
driver->hw->set_input_monitor_mask (
driver->hw, driver->input_monitor_mask);
}
}
- if (snd_pcm_mmap_begin(driver->playback_handle,
- &driver->playback_areas,
- &offset, &nframes_) < 0) {
+ if (snd_pcm_mmap_begin (driver->playback_handle,
+ &driver->playback_areas,
+ &offset, &nframes_) < 0) {
jack_error ("ALSA/USX2Y: %s: mmap areas info error",
driver->alsa_name_capture);
return -1;
@@ -587,7 +600,7 @@ usx2y_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
for (chn = 0, node = driver->playback_ports;
node; node = jack_slist_next (node), chn++) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf[chn] = jack_port_get_buffer (port, nframes_);
}
@@ -600,7 +613,7 @@ usx2y_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
}
for (chn = 0, node = driver->playback_ports;
node; node = jack_slist_next (node), chn++) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
alsa_driver_write_to_channel (driver, chn,
buf[chn] + nwritten,
contiguous);
@@ -613,8 +626,9 @@ usx2y_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
offset, nframes_)) < 0) {
jack_error ("ALSA/USX2Y: could not complete playback of %"
PRIu32 " frames: error = %d", nframes_, err);
- if (err != EPIPE && err != ESTRPIPE)
+ if (err != EPIPE && err != ESTRPIPE) {
return -1;
+ }
}
return 0;
@@ -623,12 +637,12 @@ usx2y_driver_write (alsa_driver_t* driver, jack_nframes_t nframes)
static void
usx2y_driver_setup (alsa_driver_t *driver)
{
- driver->nt_start = (JackDriverNTStartFunction) usx2y_driver_start;
- driver->nt_stop = (JackDriverNTStopFunction) usx2y_driver_stop;
- driver->read = (JackDriverReadFunction) usx2y_driver_read;
- driver->write = (JackDriverReadFunction) usx2y_driver_write;
+ driver->nt_start = (JackDriverNTStartFunction)usx2y_driver_start;
+ driver->nt_stop = (JackDriverNTStopFunction)usx2y_driver_stop;
+ driver->read = (JackDriverReadFunction)usx2y_driver_read;
+ driver->write = (JackDriverReadFunction)usx2y_driver_write;
driver->null_cycle =
- (JackDriverNullCycleFunction) usx2y_driver_null_cycle;
+ (JackDriverNullCycleFunction)usx2y_driver_null_cycle;
}
@@ -638,13 +652,13 @@ jack_alsa_usx2y_hw_new (alsa_driver_t *driver)
jack_hardware_t *hw;
usx2y_t *h;
- int hwdep_cardno;
- int hwdep_devno;
+ int hwdep_cardno;
+ int hwdep_devno;
char *hwdep_colon;
- char hwdep_name[9];
+ char hwdep_name[9];
snd_hwdep_t *hwdep_handle;
- hw = (jack_hardware_t *) malloc (sizeof (jack_hardware_t));
+ hw = (jack_hardware_t*)malloc (sizeof(jack_hardware_t));
hw->capabilities = 0;
hw->input_monitor_mask = 0;
@@ -661,22 +675,23 @@ jack_alsa_usx2y_hw_new (alsa_driver_t *driver)
*/
hwdep_handle = NULL;
hwdep_cardno = hwdep_devno = 0;
- if ((hwdep_colon = strrchr(driver->alsa_name_playback, ':')) != NULL)
- sscanf(hwdep_colon, ":%d,%d", &hwdep_cardno, &hwdep_devno);
+ if ((hwdep_colon = strrchr (driver->alsa_name_playback, ':')) != NULL) {
+ sscanf (hwdep_colon, ":%d,%d", &hwdep_cardno, &hwdep_devno);
+ }
if (hwdep_devno == 2) {
- snprintf(hwdep_name, sizeof(hwdep_name), "hw:%d,1", hwdep_cardno);
+ snprintf (hwdep_name, sizeof(hwdep_name), "hw:%d,1", hwdep_cardno);
if (snd_hwdep_open (&hwdep_handle, hwdep_name, O_RDWR) < 0) {
jack_error ("ALSA/USX2Y: Cannot open hwdep device \"%s\"", hwdep_name);
} else {
/* Allocate specific USX2Y hwdep pcm struct. */
- h = (usx2y_t *) malloc (sizeof (usx2y_t));
+ h = (usx2y_t*)malloc (sizeof(usx2y_t));
h->driver = driver;
h->hwdep_handle = hwdep_handle;
hw->private = h;
/* Set our own operational function pointers. */
- usx2y_driver_setup(driver);
- jack_info("ALSA/USX2Y: EXPERIMENTAL hwdep pcm device %s"
- " (aka \"rawusb\")", driver->alsa_name_playback);
+ usx2y_driver_setup (driver);
+ jack_info ("ALSA/USX2Y: EXPERIMENTAL hwdep pcm device %s"
+ " (aka \"rawusb\")", driver->alsa_name_playback);
}
}
diff --git a/drivers/alsa/usx2y.h b/drivers/alsa/usx2y.h
index 8876d94..853f307 100644
--- a/drivers/alsa/usx2y.h
+++ b/drivers/alsa/usx2y.h
@@ -1,7 +1,7 @@
/*
Copyright (C) 2001 Paul Davis
Copyright (C) 2004 Karsten Wiese, Rui Nuno Capela
-
+
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
@@ -16,14 +16,14 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#ifndef __jack_usx2y_h__
#define __jack_usx2y_h__
-#define USX2Y_MAXPACK 50
-#define USX2Y_MAXBUFFERMS 100
-#define USX2Y_MAXSTRIDE 3
+#define USX2Y_MAXPACK 50
+#define USX2Y_MAXBUFFERMS 100
+#define USX2Y_MAXSTRIDE 3
#define USX2Y_SSS (((USX2Y_MAXPACK * USX2Y_MAXBUFFERMS * USX2Y_MAXSTRIDE + 4096) / 4096) * 4096)
@@ -34,9 +34,9 @@ struct snd_usX2Y_hwdep_pcm_shm {
volatile int playback_iso_head;
int playback_iso_start;
struct {
- int frame,
- offset,
- length;
+ int frame,
+ offset,
+ length;
} captured_iso[128];
volatile int captured_iso_head;
volatile unsigned captured_iso_frames;
@@ -56,6 +56,6 @@ typedef struct {
} usx2y_t;
jack_hardware_t *
-jack_alsa_usx2y_hw_new (alsa_driver_t *driver);
+jack_alsa_usx2y_hw_new(alsa_driver_t *driver);
#endif /* __jack_usx2y_h__*/
diff --git a/drivers/alsa_midi/a2j.h b/drivers/alsa_midi/a2j.h
index e8145b3..c536448 100644
--- a/drivers/alsa_midi/a2j.h
+++ b/drivers/alsa_midi/a2j.h
@@ -39,100 +39,95 @@
#define PORT_HASH_SIZE (1 << PORT_HASH_BITS)
/* Beside enum use, these are indeces for (struct a2j).stream array */
-#define A2J_PORT_CAPTURE 0 // ALSA playback port -> JACK capture port
-#define A2J_PORT_PLAYBACK 1 // JACK playback port -> ALSA capture port
+#define A2J_PORT_CAPTURE 0 // ALSA playback port -> JACK capture port
+#define A2J_PORT_PLAYBACK 1 // JACK playback port -> ALSA capture port
typedef struct a2j_port * a2j_port_hash_t[PORT_HASH_SIZE];
struct alsa_midi_driver;
-struct a2j_port
-{
- struct a2j_port * next; /* hash - jack */
- struct list_head siblings; /* list - main loop */
- struct alsa_midi_driver * driver_ptr;
- bool is_dead;
- char name[64];
- snd_seq_addr_t remote;
- jack_port_t * jack_port;
-
- jack_ringbuffer_t * inbound_events; // alsa_midi_event_t + data
- int64_t last_out_time;
-
- void * jack_buf;
+struct a2j_port {
+ struct a2j_port * next; /* hash - jack */
+ struct list_head siblings; /* list - main loop */
+ struct alsa_midi_driver * driver_ptr;
+ bool is_dead;
+ char name[64];
+ snd_seq_addr_t remote;
+ jack_port_t * jack_port;
+
+ jack_ringbuffer_t * inbound_events; // alsa_midi_event_t + data
+ int64_t last_out_time;
+
+ void * jack_buf;
};
-struct a2j_stream
-{
- snd_midi_event_t *codec;
-
- jack_ringbuffer_t *new_ports;
-
- a2j_port_hash_t port_hash;
- struct list_head list;
+struct a2j_stream {
+ snd_midi_event_t *codec;
+
+ jack_ringbuffer_t *new_ports;
+
+ a2j_port_hash_t port_hash;
+ struct list_head list;
};
-typedef struct alsa_midi_driver
-{
- JACK_DRIVER_DECL;
-
- jack_client_t * jack_client;
-
- snd_seq_t *seq;
- pthread_t alsa_input_thread;
- pthread_t alsa_output_thread;
- int client_id;
- int port_id;
- int queue;
- bool freewheeling;
- bool running;
- bool finishing;
-
- jack_ringbuffer_t* port_del; // struct a2j_port*
- jack_ringbuffer_t* outbound_events; // struct a2j_delivery_event
- jack_nframes_t cycle_start;
-
- sem_t output_semaphore;
-
- struct a2j_stream stream[2];
+typedef struct alsa_midi_driver {
+ JACK_DRIVER_DECL;
+
+ jack_client_t * jack_client;
+
+ snd_seq_t *seq;
+ pthread_t alsa_input_thread;
+ pthread_t alsa_output_thread;
+ int client_id;
+ int port_id;
+ int queue;
+ bool freewheeling;
+ bool running;
+ bool finishing;
+
+ jack_ringbuffer_t* port_del; // struct a2j_port*
+ jack_ringbuffer_t* outbound_events; // struct a2j_delivery_event
+ jack_nframes_t cycle_start;
+
+ sem_t output_semaphore;
+
+ struct a2j_stream stream[2];
} alsa_midi_driver_t;
-#define NSEC_PER_SEC ((int64_t)1000*1000*1000)
+#define NSEC_PER_SEC ((int64_t)1000 * 1000 * 1000)
-struct a2j_alsa_midi_event
-{
- int64_t time;
- int size;
+struct a2j_alsa_midi_event {
+ int64_t time;
+ int size;
};
#define MAX_JACKMIDI_EV_SIZE 64
-struct a2j_delivery_event
-{
- struct list_head siblings;
-
- /* a jack MIDI event, plus the port its destined for: everything
- the ALSA output thread needs to deliver the event. time is
- part of the jack_event.
- */
- jack_midi_event_t jack_event;
- jack_nframes_t time; /* realtime, not offset time */
- struct a2j_port* port;
- char midistring[MAX_JACKMIDI_EV_SIZE];
+struct a2j_delivery_event {
+ struct list_head siblings;
+
+ /* a jack MIDI event, plus the port its destined for: everything
+ the ALSA output thread needs to deliver the event. time is
+ part of the jack_event.
+ */
+ jack_midi_event_t jack_event;
+ jack_nframes_t time; /* realtime, not offset time */
+ struct a2j_port* port;
+ char midistring[MAX_JACKMIDI_EV_SIZE];
};
-void a2j_error (const char* fmt, ...);
+void a2j_error(const char* fmt, ...);
#define A2J_DEBUG
/*#undef A2J_DEBUG*/
#ifdef A2J_DEBUG
extern bool a2j_do_debug;
-extern void _a2j_debug (const char* fmt, ...);
-#define a2j_debug(fmt, ...) if (a2j_do_debug) { _a2j_debug ((fmt), ##__VA_ARGS__); }
+extern void _a2j_debug(const char* fmt, ...);
+#define a2j_debug(fmt, ...) if (a2j_do_debug) { _a2j_debug ((fmt), ## __VA_ARGS__); }
#else
-#define a2j_debug(fmt,...)
+#define a2j_debug(fmt, ...)
#endif
#endif /* __jack_alsa_midi_h__ */
diff --git a/drivers/alsa_midi/alsa_midi.c b/drivers/alsa_midi/alsa_midi.c
index a4542b4..28a00cd 100644
--- a/drivers/alsa_midi/alsa_midi.c
+++ b/drivers/alsa_midi/alsa_midi.c
@@ -42,6 +42,7 @@ void
_a2j_debug (const char* fmt, ...)
{
va_list ap;
+
va_start (ap, fmt);
vfprintf (stderr, fmt, ap);
fputc ('\n', stderr);
@@ -52,25 +53,26 @@ void
a2j_error (const char* fmt, ...)
{
va_list ap;
+
va_start (ap, fmt);
vfprintf (stdout, fmt, ap);
fputc ('\n', stdout);
}
static bool
-a2j_stream_init(alsa_midi_driver_t* driver, int which)
+a2j_stream_init (alsa_midi_driver_t* driver, int which)
{
- struct a2j_stream *str = &driver->stream[which];
-
- str->new_ports = jack_ringbuffer_create (MAX_PORTS * sizeof(struct a2j_port *));
- if (str->new_ports == NULL) {
- return false;
- }
-
- snd_midi_event_new (MAX_EVENT_SIZE, &str->codec);
- INIT_LIST_HEAD (&str->list);
-
- return true;
+ struct a2j_stream *str = &driver->stream[which];
+
+ str->new_ports = jack_ringbuffer_create (MAX_PORTS * sizeof(struct a2j_port *));
+ if (str->new_ports == NULL) {
+ return false;
+ }
+
+ snd_midi_event_new (MAX_EVENT_SIZE, &str->codec);
+ INIT_LIST_HEAD (&str->list);
+
+ return true;
}
static void
@@ -78,10 +80,10 @@ a2j_stream_detach (struct a2j_stream * stream_ptr)
{
struct a2j_port * port_ptr;
struct list_head * node_ptr;
-
- if (!stream_ptr) {
- return;
- }
+
+ if (!stream_ptr) {
+ return;
+ }
while (!list_empty (&stream_ptr->list)) {
node_ptr = stream_ptr->list.next;
@@ -98,34 +100,36 @@ a2j_stream_close (alsa_midi_driver_t* driver, int which)
{
struct a2j_stream *str = &driver->stream[which];
- if (!str) {
- return;
- }
+ if (!str) {
+ return;
+ }
- if (str->codec)
+ if (str->codec) {
snd_midi_event_free (str->codec);
- if (str->new_ports)
+ }
+ if (str->new_ports) {
jack_ringbuffer_free (str->new_ports);
+ }
}
static void
stop_threads (alsa_midi_driver_t* driver)
{
- if (driver->running) {
- void* thread_status;
-
- driver->running = false; /* tell alsa io thread to stop, whenever they wake up */
- /* do something that we need to do anyway and will wake the io thread, then join */
- snd_seq_disconnect_from (driver->seq, driver->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE);
- a2j_debug ("wait for ALSA input thread\n");
- pthread_join (driver->alsa_input_thread, &thread_status);
- a2j_debug ("input thread done\n");
-
- /* wake output thread and join */
- sem_post (&driver->output_semaphore);
- pthread_join (driver->alsa_output_thread, &thread_status);
- a2j_debug ("output thread done\n");
- }
+ if (driver->running) {
+ void* thread_status;
+
+ driver->running = false; /* tell alsa io thread to stop, whenever they wake up */
+ /* do something that we need to do anyway and will wake the io thread, then join */
+ snd_seq_disconnect_from (driver->seq, driver->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE);
+ a2j_debug ("wait for ALSA input thread\n");
+ pthread_join (driver->alsa_input_thread, &thread_status);
+ a2j_debug ("input thread done\n");
+
+ /* wake output thread and join */
+ sem_post (&driver->output_semaphore);
+ pthread_join (driver->alsa_output_thread, &thread_status);
+ a2j_debug ("output thread done\n");
+ }
}
/*
@@ -135,8 +139,9 @@ stop_threads (alsa_midi_driver_t* driver)
void a2j_add_ports (struct a2j_stream * str)
{
struct a2j_port * port_ptr;
- while (jack_ringbuffer_read (str->new_ports, (char *)&port_ptr, sizeof(port_ptr))) {
- a2j_debug("jack: inserted port %s", port_ptr->name);
+
+ while (jack_ringbuffer_read (str->new_ports, (char*)&port_ptr, sizeof(port_ptr))) {
+ a2j_debug ("jack: inserted port %s", port_ptr->name);
a2j_port_insert (str->port_hash, port_ptr);
}
}
@@ -147,19 +152,20 @@ a2j_port_event (alsa_midi_driver_t* driver, snd_seq_event_t * ev)
{
const snd_seq_addr_t addr = ev->data.addr;
- if (addr.client == driver->client_id)
+ if (addr.client == driver->client_id) {
return;
+ }
if (ev->type == SND_SEQ_EVENT_PORT_START) {
- a2j_debug("port_event: add %d:%d", addr.client, addr.port);
+ a2j_debug ("port_event: add %d:%d", addr.client, addr.port);
a2j_new_ports (driver, addr);
} else if (ev->type == SND_SEQ_EVENT_PORT_CHANGE) {
- a2j_debug("port_event: change %d:%d", addr.client, addr.port);
+ a2j_debug ("port_event: change %d:%d", addr.client, addr.port);
a2j_update_ports (driver, addr);
} else if (ev->type == SND_SEQ_EVENT_PORT_EXIT) {
- a2j_debug("port_event: del %d:%d", addr.client, addr.port);
- a2j_port_setdead(driver->stream[A2J_PORT_CAPTURE].port_hash, addr);
- a2j_port_setdead(driver->stream[A2J_PORT_PLAYBACK].port_hash, addr);
+ a2j_debug ("port_event: del %d:%d", addr.client, addr.port);
+ a2j_port_setdead (driver->stream[A2J_PORT_CAPTURE].port_hash, addr);
+ a2j_port_setdead (driver->stream[A2J_PORT_PLAYBACK].port_hash, addr);
}
}
@@ -175,8 +181,8 @@ a2j_input_event (alsa_midi_driver_t* driver, snd_seq_event_t * alsa_event)
jack_nframes_t now;
now = jack_frame_time (driver->jack_client);
-
- if ((port = a2j_port_get(str->port_hash, alsa_event->source)) == NULL) {
+
+ if ((port = a2j_port_get (str->port_hash, alsa_event->source)) == NULL) {
return;
}
@@ -184,8 +190,8 @@ a2j_input_event (alsa_midi_driver_t* driver, snd_seq_event_t * alsa_event)
* RPNs, NRPNs, Bank Change, etc. need special handling
* but seems, ALSA does it for us already.
*/
- snd_midi_event_reset_decode(str->codec);
- if ((size = snd_midi_event_decode(str->codec, data, sizeof(data), alsa_event))<0) {
+ snd_midi_event_reset_decode (str->codec);
+ if ((size = snd_midi_event_decode (str->codec, data, sizeof(data), alsa_event)) < 0) {
return;
}
@@ -195,47 +201,47 @@ a2j_input_event (alsa_midi_driver_t* driver, snd_seq_event_t * alsa_event)
data[2] = 0x40;
}
- a2j_debug("input: %d bytes at event_frame=%u", (int)size, now);
+ a2j_debug ("input: %d bytes at event_frame=%u", (int)size, now);
- if (jack_ringbuffer_write_space(port->inbound_events) >= (sizeof(struct a2j_alsa_midi_event) + size)) {
+ if (jack_ringbuffer_write_space (port->inbound_events) >= (sizeof(struct a2j_alsa_midi_event) + size)) {
struct a2j_alsa_midi_event ev;
- char *ev_charp = (char*) &ev;
+ char *ev_charp = (char*)&ev;
size_t limit;
size_t to_write = sizeof(ev);
jack_ringbuffer_data_t vec[2];
- jack_ringbuffer_get_write_vector( port->inbound_events, vec );
+ jack_ringbuffer_get_write_vector ( port->inbound_events, vec );
ev.time = now;
ev.size = size;
-
+
limit = (to_write > vec[0].len ? vec[0].len : to_write);
if (limit) {
- memcpy( vec[0].buf, ev_charp, limit );
- to_write -= limit;
- ev_charp += limit;
- vec[0].buf += limit;
- vec[0].len -= limit;
+ memcpy ( vec[0].buf, ev_charp, limit );
+ to_write -= limit;
+ ev_charp += limit;
+ vec[0].buf += limit;
+ vec[0].len -= limit;
}
if (to_write) {
- memcpy( vec[1].buf, ev_charp, to_write );
- vec[1].buf += to_write;
- vec[1].len -= to_write;
+ memcpy ( vec[1].buf, ev_charp, to_write );
+ vec[1].buf += to_write;
+ vec[1].len -= to_write;
}
to_write = size;
- ev_charp = (char *)data;
+ ev_charp = (char*)data;
limit = (to_write > vec[0].len ? vec[0].len : to_write);
if (limit) {
memcpy (vec[0].buf, ev_charp, limit);
- }
+ }
to_write -= limit;
ev_charp += limit;
if (to_write) {
memcpy (vec[1].buf, ev_charp, to_write);
- }
+ }
- jack_ringbuffer_write_advance( port->inbound_events, sizeof(ev) + size );
+ jack_ringbuffer_write_advance ( port->inbound_events, sizeof(ev) + size );
} else {
a2j_error ("MIDI data lost (incoming event buffer full): %ld bytes lost", size);
}
@@ -245,74 +251,74 @@ a2j_input_event (alsa_midi_driver_t* driver, snd_seq_event_t * alsa_event)
static int
a2j_process_incoming (alsa_midi_driver_t* driver, struct a2j_port* port, jack_nframes_t nframes)
{
- jack_nframes_t one_period;
- struct a2j_alsa_midi_event ev;
- char *ev_buf;
-
- /* grab data queued by the ALSA input thread and write it into the JACK
- port buffer. it will delivered during the JACK period that this
- function is called from.
- */
-
- /* first clear the JACK port buffer in preparation for new data
- */
-
- a2j_debug ("PORT: %s process input", jack_port_name (port->jack_port));
-
- jack_midi_clear_buffer (port->jack_buf);
-
- one_period = jack_get_buffer_size (driver->jack_client);
-
- while (jack_ringbuffer_peek (port->inbound_events, (char*)&ev, sizeof(ev) ) == sizeof(ev) ) {
-
- jack_midi_data_t* buf;
- jack_nframes_t offset;
-
- a2j_debug ("Seen inbound event from read callback\n");
-
- if (ev.time >= driver->cycle_start) {
- a2j_debug ("event is too late\n");
- break;
- }
-
- //jack_ringbuffer_read_advance (port->inbound_events, sizeof (ev));
- ev_buf = (char *) alloca( sizeof(ev) + ev.size );
-
- if (jack_ringbuffer_peek (port->inbound_events, ev_buf, sizeof(ev) + ev.size ) != sizeof(ev) + ev.size) {
- break;
- }
-
- offset = driver->cycle_start - ev.time;
- if (offset > one_period) {
- /* from a previous cycle, somehow. cram it in at the front */
- offset = 0;
- } else {
- /* offset from start of the current cycle */
- offset = one_period - offset;
- }
-
- a2j_debug ("event at %d offset %d", ev.time, offset);
-
- /* make sure there is space for it */
-
- buf = jack_midi_event_reserve (port->jack_buf, offset, ev.size);
-
- if (buf) {
- /* grab the event */
- memcpy( buf, ev_buf + sizeof(ev), ev.size );
- } else {
- /* throw it away (no space) */
- a2j_error ("threw away MIDI event - not reserved at time %d", ev.time);
- }
- jack_ringbuffer_read_advance (port->inbound_events, sizeof(ev) + ev.size);
-
- a2j_debug("input on %s: sucked %d bytes from inbound at %d", jack_port_name (port->jack_port), ev.size, ev.time);
- }
-
- return 0;
+ jack_nframes_t one_period;
+ struct a2j_alsa_midi_event ev;
+ char *ev_buf;
+
+ /* grab data queued by the ALSA input thread and write it into the JACK
+ port buffer. it will delivered during the JACK period that this
+ function is called from.
+ */
+
+ /* first clear the JACK port buffer in preparation for new data
+ */
+
+ a2j_debug ("PORT: %s process input", jack_port_name (port->jack_port));
+
+ jack_midi_clear_buffer (port->jack_buf);
+
+ one_period = jack_get_buffer_size (driver->jack_client);
+
+ while (jack_ringbuffer_peek (port->inbound_events, (char*)&ev, sizeof(ev) ) == sizeof(ev) ) {
+
+ jack_midi_data_t* buf;
+ jack_nframes_t offset;
+
+ a2j_debug ("Seen inbound event from read callback\n");
+
+ if (ev.time >= driver->cycle_start) {
+ a2j_debug ("event is too late\n");
+ break;
+ }
+
+ //jack_ringbuffer_read_advance (port->inbound_events, sizeof (ev));
+ ev_buf = (char*)alloca ( sizeof(ev) + ev.size );
+
+ if (jack_ringbuffer_peek (port->inbound_events, ev_buf, sizeof(ev) + ev.size ) != sizeof(ev) + ev.size) {
+ break;
+ }
+
+ offset = driver->cycle_start - ev.time;
+ if (offset > one_period) {
+ /* from a previous cycle, somehow. cram it in at the front */
+ offset = 0;
+ } else {
+ /* offset from start of the current cycle */
+ offset = one_period - offset;
+ }
+
+ a2j_debug ("event at %d offset %d", ev.time, offset);
+
+ /* make sure there is space for it */
+
+ buf = jack_midi_event_reserve (port->jack_buf, offset, ev.size);
+
+ if (buf) {
+ /* grab the event */
+ memcpy ( buf, ev_buf + sizeof(ev), ev.size );
+ } else {
+ /* throw it away (no space) */
+ a2j_error ("threw away MIDI event - not reserved at time %d", ev.time);
+ }
+ jack_ringbuffer_read_advance (port->inbound_events, sizeof(ev) + ev.size);
+
+ a2j_debug ("input on %s: sucked %d bytes from inbound at %d", jack_port_name (port->jack_port), ev.size, ev.time);
+ }
+
+ return 0;
}
-void*
+void*
alsa_input_thread (void* arg)
{
alsa_midi_driver_t* driver = arg;
@@ -324,25 +330,25 @@ alsa_input_thread (void* arg)
snd_seq_event_t * event;
int ret;
- npfd = snd_seq_poll_descriptors_count(driver->seq, POLLIN);
- pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
- snd_seq_poll_descriptors(driver->seq, pfd, npfd, POLLIN);
+ npfd = snd_seq_poll_descriptors_count (driver->seq, POLLIN);
+ pfd = (struct pollfd*)alloca (npfd * sizeof(struct pollfd));
+ snd_seq_poll_descriptors (driver->seq, pfd, npfd, POLLIN);
initial = true;
while (driver->running) {
- if ((ret = poll(pfd, npfd, 1000)) > 0) {
+ if ((ret = poll (pfd, npfd, 1000)) > 0) {
while (snd_seq_event_input (driver->seq, &event) > 0) {
if (initial) {
- snd_seq_client_info_alloca(&client_info);
- snd_seq_client_info_set_client(client_info, -1);
- while (snd_seq_query_next_client(driver->seq, client_info) >= 0) {
- addr.client = snd_seq_client_info_get_client(client_info);
+ snd_seq_client_info_alloca (&client_info);
+ snd_seq_client_info_set_client (client_info, -1);
+ while (snd_seq_query_next_client (driver->seq, client_info) >= 0) {
+ addr.client = snd_seq_client_info_get_client (client_info);
if (addr.client == SND_SEQ_CLIENT_SYSTEM || addr.client == driver->client_id) {
continue;
}
-
+
a2j_new_ports (driver, addr);
}
@@ -350,9 +356,9 @@ alsa_input_thread (void* arg)
}
if (event->source.client == SND_SEQ_CLIENT_SYSTEM) {
- a2j_port_event(driver, event);
+ a2j_port_event (driver, event);
} else {
- a2j_input_event(driver, event);
+ a2j_input_event (driver, event);
}
snd_seq_free_event (event);
@@ -360,214 +366,207 @@ alsa_input_thread (void* arg)
}
}
- return (void*) 0;
+ return (void*)0;
}
/* --- OUTBOUND FROM JACK TO ALSA ---- */
int
a2j_process_outgoing (
- alsa_midi_driver_t* driver,
- struct a2j_port * port)
+ alsa_midi_driver_t* driver,
+ struct a2j_port * port)
{
- /* collect data from JACK port buffer and queue it for delivery by ALSA output thread */
-
- int nevents;
- jack_ringbuffer_data_t vec[2];
- int i;
- int written = 0;
- size_t limit;
- struct a2j_delivery_event* dev;
- size_t gap = 0;
-
- jack_ringbuffer_get_write_vector (driver->outbound_events, vec);
-
- dev = (struct a2j_delivery_event*) vec[0].buf;
- limit = vec[0].len / sizeof (struct a2j_delivery_event);
- nevents = jack_midi_get_event_count (port->jack_buf);
-
- a2j_debug ("alsa_out: port has %d events for delivery\n", nevents);
-
- for (i = 0; (i < nevents) && (written < limit); ++i) {
-
- jack_midi_event_get (&dev->jack_event, port->jack_buf, i);
- if (dev->jack_event.size <= MAX_JACKMIDI_EV_SIZE)
- {
- dev->time = dev->jack_event.time;
- dev->port = port;
- memcpy( dev->midistring, dev->jack_event.buffer, dev->jack_event.size );
- written++;
- ++dev;
- }
- }
-
- /* anything left? use the second part of the vector, as much as possible */
-
- if (i < nevents)
- {
- if (vec[0].len)
- {
- gap = vec[0].len - written * sizeof(struct a2j_delivery_event);
- }
-
- dev = (struct a2j_delivery_event*) vec[1].buf;
-
- limit += (vec[1].len / sizeof (struct a2j_delivery_event));
-
- while ((i < nevents) && (written < limit))
- {
- jack_midi_event_get(&dev->jack_event, port->jack_buf, i);
- if (dev->jack_event.size <= MAX_JACKMIDI_EV_SIZE)
- {
- dev->time = dev->jack_event.time;
- dev->port = port;
- memcpy(dev->midistring, dev->jack_event.buffer, dev->jack_event.size);
- written++;
- ++dev;
- }
- ++i;
- }
- }
-
- a2j_debug( "done pushing events: %d ... gap: %d ", (int)written, (int)gap );
- /* clear JACK port buffer; advance ring buffer ptr */
-
- jack_ringbuffer_write_advance (driver->outbound_events, written * sizeof (struct a2j_delivery_event) + gap);
-
- return nevents;
+ /* collect data from JACK port buffer and queue it for delivery by ALSA output thread */
+
+ int nevents;
+ jack_ringbuffer_data_t vec[2];
+ int i;
+ int written = 0;
+ size_t limit;
+ struct a2j_delivery_event* dev;
+ size_t gap = 0;
+
+ jack_ringbuffer_get_write_vector (driver->outbound_events, vec);
+
+ dev = (struct a2j_delivery_event*)vec[0].buf;
+ limit = vec[0].len / sizeof(struct a2j_delivery_event);
+ nevents = jack_midi_get_event_count (port->jack_buf);
+
+ a2j_debug ("alsa_out: port has %d events for delivery\n", nevents);
+
+ for (i = 0; (i < nevents) && (written < limit); ++i) {
+
+ jack_midi_event_get (&dev->jack_event, port->jack_buf, i);
+ if (dev->jack_event.size <= MAX_JACKMIDI_EV_SIZE) {
+ dev->time = dev->jack_event.time;
+ dev->port = port;
+ memcpy ( dev->midistring, dev->jack_event.buffer, dev->jack_event.size );
+ written++;
+ ++dev;
+ }
+ }
+
+ /* anything left? use the second part of the vector, as much as possible */
+
+ if (i < nevents) {
+ if (vec[0].len) {
+ gap = vec[0].len - written * sizeof(struct a2j_delivery_event);
+ }
+
+ dev = (struct a2j_delivery_event*)vec[1].buf;
+
+ limit += (vec[1].len / sizeof(struct a2j_delivery_event));
+
+ while ((i < nevents) && (written < limit)) {
+ jack_midi_event_get (&dev->jack_event, port->jack_buf, i);
+ if (dev->jack_event.size <= MAX_JACKMIDI_EV_SIZE) {
+ dev->time = dev->jack_event.time;
+ dev->port = port;
+ memcpy (dev->midistring, dev->jack_event.buffer, dev->jack_event.size);
+ written++;
+ ++dev;
+ }
+ ++i;
+ }
+ }
+
+ a2j_debug ( "done pushing events: %d ... gap: %d ", (int)written, (int)gap );
+ /* clear JACK port buffer; advance ring buffer ptr */
+
+ jack_ringbuffer_write_advance (driver->outbound_events, written * sizeof(struct a2j_delivery_event) + gap);
+
+ return nevents;
}
static int
time_sorter (struct a2j_delivery_event * a, struct a2j_delivery_event * b)
{
- if (a->time < b->time) {
- return -1;
- } else if (a->time > b->time) {
- return 1;
- }
- return 0;
+ if (a->time < b->time) {
+ return -1;
+ } else if (a->time > b->time) {
+ return 1;
+ }
+ return 0;
}
-static void*
-alsa_output_thread(void * arg)
+static void*
+alsa_output_thread (void * arg)
{
- alsa_midi_driver_t * driver = (alsa_midi_driver_t*) arg;
- struct a2j_stream *str = &driver->stream[A2J_PORT_PLAYBACK];
- int i;
- struct list_head evlist;
- struct list_head * node_ptr;
- jack_ringbuffer_data_t vec[2];
- snd_seq_event_t alsa_event;
- struct a2j_delivery_event* ev;
- float sr;
- jack_nframes_t now;
- int limit;
-
- while (driver->running) {
- /* pre-first, handle port deletion requests */
-
- a2j_free_ports(driver);
-
- /* first, make a list of all events in the outbound_events FIFO */
-
- INIT_LIST_HEAD(&evlist);
-
- jack_ringbuffer_get_read_vector (driver->outbound_events, vec);
-
- a2j_debug ("alsa_out: output thread: got %d+%d events",
- (vec[0].len / sizeof (struct a2j_delivery_event)),
- (vec[1].len / sizeof (struct a2j_delivery_event)));
-
- ev = (struct a2j_delivery_event*) vec[0].buf;
- limit = vec[0].len / sizeof (struct a2j_delivery_event);
- for (i = 0; i < limit; ++i) {
- list_add_tail(&ev->siblings, &evlist);
- ev++;
- }
-
- ev = (struct a2j_delivery_event*) vec[1].buf;
- limit = vec[1].len / sizeof (struct a2j_delivery_event);
- for (i = 0; i < limit; ++i) {
- list_add_tail(&ev->siblings, &evlist);
- ev++;
- }
-
- if (vec[0].len < sizeof(struct a2j_delivery_event) && (vec[1].len == 0)) {
- /* no events: wait for some */
- a2j_debug ("alsa_out: output thread: wait for events");
- sem_wait (&driver->output_semaphore);
- a2j_debug ("alsa_out: output thread: AWAKE ... loop back for events");
- continue;
- }
-
- /* now sort this list by time */
-
- list_sort(&evlist, struct a2j_delivery_event, siblings, time_sorter);
-
- /* now deliver */
-
- sr = jack_get_sample_rate (driver->jack_client);
-
- list_for_each(node_ptr, &evlist)
- {
- ev = list_entry(node_ptr, struct a2j_delivery_event, siblings);
-
- snd_seq_ev_clear(&alsa_event);
- snd_midi_event_reset_encode(str->codec);
- if (!snd_midi_event_encode(str->codec, (const unsigned char *)ev->midistring, ev->jack_event.size, &alsa_event))
- {
- a2j_debug ("alsa_out: invalid event of size %d, ignored\n", ev->jack_event.size);
- continue; // invalid event
- }
-
- snd_seq_ev_set_source(&alsa_event, driver->port_id);
- snd_seq_ev_set_dest(&alsa_event, ev->port->remote.client, ev->port->remote.port);
- snd_seq_ev_set_direct (&alsa_event);
-
- now = jack_frame_time (driver->jack_client);
-
- ev->time += driver->cycle_start;
-
- a2j_debug ("alsa_out:@ %d, next event @ %d", now, ev->time);
-
- /* do we need to wait a while before delivering? */
-
- if (ev->time > now) {
- struct timespec nanoseconds;
- jack_nframes_t sleep_frames = ev->time - now;
- float seconds = sleep_frames / sr;
-
- /* if the gap is long enough, sleep */
-
- if (seconds > 0.001) {
- nanoseconds.tv_sec = (time_t) seconds;
- nanoseconds.tv_nsec = (long) NSEC_PER_SEC * (seconds - nanoseconds.tv_sec);
-
- a2j_debug ("alsa_out: output thread sleeps for %.2f msec", ((double) nanoseconds.tv_nsec / NSEC_PER_SEC) * 1000.0);
-
- if (nanosleep (&nanoseconds, NULL) < 0) {
- fprintf (stderr, "BAD SLEEP\n");
- /* do something ? */
- }
- }
- }
-
- /* its time to deliver */
- snd_seq_event_output(driver->seq, &alsa_event);
- snd_seq_drain_output (driver->seq);
- now = jack_frame_time (driver->jack_client);
- a2j_debug("alsa_out: written %d bytes to %s at %d, DELTA = %d", ev->jack_event.size, ev->port->name, now,
- (int32_t) (now - ev->time));
- }
-
- /* free up space in the FIFO */
-
- jack_ringbuffer_read_advance (driver->outbound_events, vec[0].len + vec[1].len);
-
- /* and head back for more */
- }
-
- return (void*) 0;
+ alsa_midi_driver_t * driver = (alsa_midi_driver_t*)arg;
+ struct a2j_stream *str = &driver->stream[A2J_PORT_PLAYBACK];
+ int i;
+ struct list_head evlist;
+ struct list_head * node_ptr;
+ jack_ringbuffer_data_t vec[2];
+ snd_seq_event_t alsa_event;
+ struct a2j_delivery_event* ev;
+ float sr;
+ jack_nframes_t now;
+ int limit;
+
+ while (driver->running) {
+ /* pre-first, handle port deletion requests */
+
+ a2j_free_ports (driver);
+
+ /* first, make a list of all events in the outbound_events FIFO */
+
+ INIT_LIST_HEAD (&evlist);
+
+ jack_ringbuffer_get_read_vector (driver->outbound_events, vec);
+
+ a2j_debug ("alsa_out: output thread: got %d+%d events",
+ (vec[0].len / sizeof(struct a2j_delivery_event)),
+ (vec[1].len / sizeof(struct a2j_delivery_event)));
+
+ ev = (struct a2j_delivery_event*)vec[0].buf;
+ limit = vec[0].len / sizeof(struct a2j_delivery_event);
+ for (i = 0; i < limit; ++i) {
+ list_add_tail (&ev->siblings, &evlist);
+ ev++;
+ }
+
+ ev = (struct a2j_delivery_event*)vec[1].buf;
+ limit = vec[1].len / sizeof(struct a2j_delivery_event);
+ for (i = 0; i < limit; ++i) {
+ list_add_tail (&ev->siblings, &evlist);
+ ev++;
+ }
+
+ if (vec[0].len < sizeof(struct a2j_delivery_event) && (vec[1].len == 0)) {
+ /* no events: wait for some */
+ a2j_debug ("alsa_out: output thread: wait for events");
+ sem_wait (&driver->output_semaphore);
+ a2j_debug ("alsa_out: output thread: AWAKE ... loop back for events");
+ continue;
+ }
+
+ /* now sort this list by time */
+
+ list_sort (&evlist, struct a2j_delivery_event, siblings, time_sorter);
+
+ /* now deliver */
+
+ sr = jack_get_sample_rate (driver->jack_client);
+
+ list_for_each (node_ptr, &evlist){
+ ev = list_entry (node_ptr, struct a2j_delivery_event, siblings);
+
+ snd_seq_ev_clear (&alsa_event);
+ snd_midi_event_reset_encode (str->codec);
+ if (!snd_midi_event_encode (str->codec, (const unsigned char*)ev->midistring, ev->jack_event.size, &alsa_event)) {
+ a2j_debug ("alsa_out: invalid event of size %d, ignored\n", ev->jack_event.size);
+ continue; // invalid event
+ }
+
+ snd_seq_ev_set_source (&alsa_event, driver->port_id);
+ snd_seq_ev_set_dest (&alsa_event, ev->port->remote.client, ev->port->remote.port);
+ snd_seq_ev_set_direct (&alsa_event);
+
+ now = jack_frame_time (driver->jack_client);
+
+ ev->time += driver->cycle_start;
+
+ a2j_debug ("alsa_out:@ %d, next event @ %d", now, ev->time);
+
+ /* do we need to wait a while before delivering? */
+
+ if (ev->time > now) {
+ struct timespec nanoseconds;
+ jack_nframes_t sleep_frames = ev->time - now;
+ float seconds = sleep_frames / sr;
+
+ /* if the gap is long enough, sleep */
+
+ if (seconds > 0.001) {
+ nanoseconds.tv_sec = (time_t)seconds;
+ nanoseconds.tv_nsec = (long)NSEC_PER_SEC * (seconds - nanoseconds.tv_sec);
+
+ a2j_debug ("alsa_out: output thread sleeps for %.2f msec", ((double)nanoseconds.tv_nsec / NSEC_PER_SEC) * 1000.0);
+
+ if (nanosleep (&nanoseconds, NULL) < 0) {
+ fprintf (stderr, "BAD SLEEP\n");
+ /* do something ? */
+ }
+ }
+ }
+
+ /* its time to deliver */
+ snd_seq_event_output (driver->seq, &alsa_event);
+ snd_seq_drain_output (driver->seq);
+ now = jack_frame_time (driver->jack_client);
+ a2j_debug ("alsa_out: written %d bytes to %s at %d, DELTA = %d", ev->jack_event.size, ev->port->name, now,
+ (int32_t)(now - ev->time));
+ }
+
+ /* free up space in the FIFO */
+
+ jack_ringbuffer_read_advance (driver->outbound_events, vec[0].len + vec[1].len);
+
+ /* and head back for more */
+ }
+
+ return (void*)0;
}
/** CORE JACK PROCESSING */
@@ -578,56 +577,54 @@ alsa_output_thread(void * arg)
static void
a2j_jack_process_internal (alsa_midi_driver_t* driver, int dir, jack_nframes_t nframes)
{
- struct a2j_stream * stream_ptr;
- int i;
- struct a2j_port ** port_ptr_ptr;
- struct a2j_port * port_ptr;
- int nevents = 0;
-
- stream_ptr = &driver->stream[dir];
- a2j_add_ports(stream_ptr);
-
- // process ports
- for (i = 0 ; i < PORT_HASH_SIZE ; i++)
- {
- port_ptr_ptr = &stream_ptr->port_hash[i];
- while (*port_ptr_ptr != NULL)
- {
- port_ptr = *port_ptr_ptr;
-
- if (!port_ptr->is_dead) {
- port_ptr->jack_buf = jack_port_get_buffer(port_ptr->jack_port, nframes);
-
- if (dir == A2J_PORT_CAPTURE) {
- a2j_process_incoming (driver, port_ptr, nframes);
- } else {
- nevents += a2j_process_outgoing (driver, port_ptr);
- }
-
- } else if (jack_ringbuffer_write_space (driver->port_del) >= sizeof(port_ptr)) {
-
- a2j_debug("jack: removed port %s", port_ptr->name);
- *port_ptr_ptr = port_ptr->next;
- jack_ringbuffer_write(driver->port_del, (char*)&port_ptr, sizeof(port_ptr));
- nevents += 1; /* wake up output thread, see: a2j_free_ports */
- continue;
-
- }
-
- port_ptr_ptr = &port_ptr->next;
- }
- }
-
- if (dir == A2J_PORT_PLAYBACK && nevents > 0) {
- int sv;
-
- /* if we queued up anything for output, tell the output thread in
- case its waiting for us.
- */
-
- sem_getvalue (&driver->output_semaphore, &sv);
- sem_post (&driver->output_semaphore);
- }
+ struct a2j_stream * stream_ptr;
+ int i;
+ struct a2j_port ** port_ptr_ptr;
+ struct a2j_port * port_ptr;
+ int nevents = 0;
+
+ stream_ptr = &driver->stream[dir];
+ a2j_add_ports (stream_ptr);
+
+ // process ports
+ for (i = 0; i < PORT_HASH_SIZE; i++) {
+ port_ptr_ptr = &stream_ptr->port_hash[i];
+ while (*port_ptr_ptr != NULL) {
+ port_ptr = *port_ptr_ptr;
+
+ if (!port_ptr->is_dead) {
+ port_ptr->jack_buf = jack_port_get_buffer (port_ptr->jack_port, nframes);
+
+ if (dir == A2J_PORT_CAPTURE) {
+ a2j_process_incoming (driver, port_ptr, nframes);
+ } else {
+ nevents += a2j_process_outgoing (driver, port_ptr);
+ }
+
+ } else if (jack_ringbuffer_write_space (driver->port_del) >= sizeof(port_ptr)) {
+
+ a2j_debug ("jack: removed port %s", port_ptr->name);
+ *port_ptr_ptr = port_ptr->next;
+ jack_ringbuffer_write (driver->port_del, (char*)&port_ptr, sizeof(port_ptr));
+ nevents += 1; /* wake up output thread, see: a2j_free_ports */
+ continue;
+
+ }
+
+ port_ptr_ptr = &port_ptr->next;
+ }
+ }
+
+ if (dir == A2J_PORT_PLAYBACK && nevents > 0) {
+ int sv;
+
+ /* if we queued up anything for output, tell the output thread in
+ case its waiting for us.
+ */
+
+ sem_getvalue (&driver->output_semaphore, &sv);
+ sem_post (&driver->output_semaphore);
+ }
}
/* JACK DRIVER FUNCTIONS */
@@ -635,178 +632,178 @@ a2j_jack_process_internal (alsa_midi_driver_t* driver, int dir, jack_nframes_t n
static int
alsa_midi_read (alsa_midi_driver_t* driver, jack_nframes_t nframes)
{
- driver->cycle_start = jack_last_frame_time (driver->jack_client);
- a2j_jack_process_internal (driver, A2J_PORT_CAPTURE, nframes);
- return 0;
+ driver->cycle_start = jack_last_frame_time (driver->jack_client);
+ a2j_jack_process_internal (driver, A2J_PORT_CAPTURE, nframes);
+ return 0;
}
static int
alsa_midi_write (alsa_midi_driver_t* driver, jack_nframes_t nframes)
{
- driver->cycle_start = jack_last_frame_time (driver->jack_client);
- a2j_jack_process_internal (driver, A2J_PORT_PLAYBACK, nframes);
- return 0;
+ driver->cycle_start = jack_last_frame_time (driver->jack_client);
+ a2j_jack_process_internal (driver, A2J_PORT_PLAYBACK, nframes);
+ return 0;
}
-static int
+static int
alsa_midi_start (alsa_midi_driver_t* driver)
{
- int error;
-
- snd_seq_start_queue (driver->seq, driver->queue, 0);
- snd_seq_drop_input (driver->seq);
-
- a2j_add_ports(&driver->stream[A2J_PORT_CAPTURE]);
- a2j_add_ports(&driver->stream[A2J_PORT_PLAYBACK]);
-
- driver->running = true;
-
- if (pthread_create(&driver->alsa_input_thread, NULL, alsa_input_thread, driver) < 0) {
- a2j_error("cannot start ALSA input thread");
- return -1;
- }
-
- /* wake the poll loop in the alsa input thread so initial ports are fetched */
- if ((error = snd_seq_connect_from (driver->seq, driver->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE)) < 0) {
- a2j_error("snd_seq_connect_from() failed");
- return -1;
- }
-
- if (pthread_create(&driver->alsa_output_thread, NULL, alsa_output_thread, driver) < 0) {
- a2j_error("cannot start ALSA output thread");
- return -1;
- }
-
- return 0;
+ int error;
+
+ snd_seq_start_queue (driver->seq, driver->queue, 0);
+ snd_seq_drop_input (driver->seq);
+
+ a2j_add_ports (&driver->stream[A2J_PORT_CAPTURE]);
+ a2j_add_ports (&driver->stream[A2J_PORT_PLAYBACK]);
+
+ driver->running = true;
+
+ if (pthread_create (&driver->alsa_input_thread, NULL, alsa_input_thread, driver) < 0) {
+ a2j_error ("cannot start ALSA input thread");
+ return -1;
+ }
+
+ /* wake the poll loop in the alsa input thread so initial ports are fetched */
+ if ((error = snd_seq_connect_from (driver->seq, driver->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE)) < 0) {
+ a2j_error ("snd_seq_connect_from() failed");
+ return -1;
+ }
+
+ if (pthread_create (&driver->alsa_output_thread, NULL, alsa_output_thread, driver) < 0) {
+ a2j_error ("cannot start ALSA output thread");
+ return -1;
+ }
+
+ return 0;
}
static int
alsa_midi_stop (alsa_midi_driver_t* driver)
{
- stop_threads (driver);
+ stop_threads (driver);
- (void) snd_seq_stop_queue (driver->seq, driver->queue, 0);
- return 0;
+ (void)snd_seq_stop_queue (driver->seq, driver->queue, 0);
+ return 0;
}
static int
alsa_midi_attach (alsa_midi_driver_t* driver, jack_engine_t* engine)
{
- int error;
-
- driver->port_del = jack_ringbuffer_create(2 * MAX_PORTS * sizeof(struct a2j_port *));
- if (driver->port_del == NULL) {
- return -1;
- }
-
- driver->outbound_events = jack_ringbuffer_create (MAX_EVENT_SIZE * 16 * sizeof(struct a2j_delivery_event));
- if (driver->outbound_events == NULL) {
- return -1;
- }
-
- if (!a2j_stream_init (driver, A2J_PORT_CAPTURE)) {
- return -1;
- }
-
- if (!a2j_stream_init (driver, A2J_PORT_PLAYBACK)) {
- return -1;
- }
-
- if ((error = snd_seq_open(&driver->seq, "hw", SND_SEQ_OPEN_DUPLEX, 0)) < 0) {
- a2j_error("failed to open alsa seq");
- return -1;
- }
-
- if ((error = snd_seq_set_client_name(driver->seq, "jackmidi")) < 0) {
- a2j_error("snd_seq_set_client_name() failed");
- return -1;
- }
-
- if ((driver->port_id = snd_seq_create_simple_port(
- driver->seq,
- "port",
- SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_WRITE
+ int error;
+
+ driver->port_del = jack_ringbuffer_create (2 * MAX_PORTS * sizeof(struct a2j_port *));
+ if (driver->port_del == NULL) {
+ return -1;
+ }
+
+ driver->outbound_events = jack_ringbuffer_create (MAX_EVENT_SIZE * 16 * sizeof(struct a2j_delivery_event));
+ if (driver->outbound_events == NULL) {
+ return -1;
+ }
+
+ if (!a2j_stream_init (driver, A2J_PORT_CAPTURE)) {
+ return -1;
+ }
+
+ if (!a2j_stream_init (driver, A2J_PORT_PLAYBACK)) {
+ return -1;
+ }
+
+ if ((error = snd_seq_open (&driver->seq, "hw", SND_SEQ_OPEN_DUPLEX, 0)) < 0) {
+ a2j_error ("failed to open alsa seq");
+ return -1;
+ }
+
+ if ((error = snd_seq_set_client_name (driver->seq, "jackmidi")) < 0) {
+ a2j_error ("snd_seq_set_client_name() failed");
+ return -1;
+ }
+
+ if ((driver->port_id = snd_seq_create_simple_port (
+ driver->seq,
+ "port",
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_WRITE
#ifndef DEBUG
- |SND_SEQ_PORT_CAP_NO_EXPORT
+ | SND_SEQ_PORT_CAP_NO_EXPORT
#endif
- ,SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
-
- a2j_error("snd_seq_create_simple_port() failed");
- return -1;
- }
-
- if ((driver->client_id = snd_seq_client_id(driver->seq)) < 0) {
- a2j_error("snd_seq_client_id() failed");
- return -1;
- }
-
- if ((driver->queue = snd_seq_alloc_queue(driver->seq)) < 0) {
- a2j_error("snd_seq_alloc_queue() failed");
- return -1;
- }
-
- if ((error = snd_seq_nonblock(driver->seq, 1)) < 0) {
- a2j_error("snd_seq_nonblock() failed");
- return -1;
- }
-
- return jack_activate (driver->jack_client);
+ , SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
+
+ a2j_error ("snd_seq_create_simple_port() failed");
+ return -1;
+ }
+
+ if ((driver->client_id = snd_seq_client_id (driver->seq)) < 0) {
+ a2j_error ("snd_seq_client_id() failed");
+ return -1;
+ }
+
+ if ((driver->queue = snd_seq_alloc_queue (driver->seq)) < 0) {
+ a2j_error ("snd_seq_alloc_queue() failed");
+ return -1;
+ }
+
+ if ((error = snd_seq_nonblock (driver->seq, 1)) < 0) {
+ a2j_error ("snd_seq_nonblock() failed");
+ return -1;
+ }
+
+ return jack_activate (driver->jack_client);
}
static int
alsa_midi_detach (alsa_midi_driver_t* driver, jack_engine_t* engine)
{
- driver->finishing = true;
-
- snd_seq_close (driver->seq);
- driver->seq = NULL;
- return 0;
+ driver->finishing = true;
+
+ snd_seq_close (driver->seq);
+ driver->seq = NULL;
+ return 0;
}
static jack_driver_t *
alsa_midi_driver_new (jack_client_t *client, const char *name)
{
- alsa_midi_driver_t* driver = calloc(1, sizeof(alsa_midi_driver_t));
+ alsa_midi_driver_t* driver = calloc (1, sizeof(alsa_midi_driver_t));
- jack_info ("creating alsa_midi driver ...");
+ jack_info ("creating alsa_midi driver ...");
if (!driver) {
return NULL;
}
- jack_driver_init ((jack_driver_t *) driver);
+ jack_driver_init ((jack_driver_t*)driver);
- driver->attach = (JackDriverAttachFunction) alsa_midi_attach;
- driver->detach = (JackDriverDetachFunction) alsa_midi_detach;
- driver->read = (JackDriverReadFunction) alsa_midi_read;
- driver->write = (JackDriverWriteFunction) alsa_midi_write;
- driver->start = (JackDriverStartFunction) alsa_midi_start;
- driver->stop = (JackDriverStartFunction) alsa_midi_stop;
+ driver->attach = (JackDriverAttachFunction)alsa_midi_attach;
+ driver->detach = (JackDriverDetachFunction)alsa_midi_detach;
+ driver->read = (JackDriverReadFunction)alsa_midi_read;
+ driver->write = (JackDriverWriteFunction)alsa_midi_write;
+ driver->start = (JackDriverStartFunction)alsa_midi_start;
+ driver->stop = (JackDriverStartFunction)alsa_midi_stop;
driver->jack_client = client;
- if (sem_init(&driver->output_semaphore, 0, 0) < 0) {
- a2j_error ("can't create IO semaphore");
- free (driver);
- return NULL;
- }
+ if (sem_init (&driver->output_semaphore, 0, 0) < 0) {
+ a2j_error ("can't create IO semaphore");
+ free (driver);
+ return NULL;
+ }
- return (jack_driver_t *) driver;
+ return (jack_driver_t*)driver;
}
static void
alsa_midi_driver_delete (alsa_midi_driver_t* driver)
{
- a2j_stream_detach (&driver->stream[A2J_PORT_CAPTURE]);
- a2j_stream_detach (&driver->stream[A2J_PORT_PLAYBACK]);
- a2j_stream_close (driver, A2J_PORT_CAPTURE);
- a2j_stream_close (driver, A2J_PORT_PLAYBACK);
-
- sem_destroy (&driver->output_semaphore);
-
- jack_ringbuffer_free (driver->outbound_events);
- jack_ringbuffer_free (driver->port_del);
+ a2j_stream_detach (&driver->stream[A2J_PORT_CAPTURE]);
+ a2j_stream_detach (&driver->stream[A2J_PORT_PLAYBACK]);
+ a2j_stream_close (driver, A2J_PORT_CAPTURE);
+ a2j_stream_close (driver, A2J_PORT_PLAYBACK);
+
+ sem_destroy (&driver->output_semaphore);
+
+ jack_ringbuffer_free (driver->outbound_events);
+ jack_ringbuffer_free (driver->port_del);
}
/* DRIVER "PLUGIN" INTERFACE */
@@ -818,14 +815,15 @@ driver_get_descriptor ()
{
jack_driver_desc_t * desc;
jack_driver_param_desc_t * params;
+
//unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
- strcpy (desc->name,"alsa_midi");
+ strcpy (desc->name, "alsa_midi");
desc->nparams = 0;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
desc->params = params;
@@ -839,19 +837,19 @@ driver_initialize (jack_client_t *client, const JSList * params)
const jack_driver_param_t * param;
for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
+ param = (const jack_driver_param_t*)node->data;
switch (param->character) {
- default:
- break;
+ default:
+ break;
}
}
-
+
return alsa_midi_driver_new (client, NULL);
}
void
driver_finish (jack_driver_t *driver)
{
- alsa_midi_driver_delete ((alsa_midi_driver_t *) driver);
+ alsa_midi_driver_delete ((alsa_midi_driver_t*)driver);
}
diff --git a/drivers/alsa_midi/alsa_midi_driver.c b/drivers/alsa_midi/alsa_midi_driver.c
index e25479f..92aaccd 100644
--- a/drivers/alsa_midi/alsa_midi_driver.c
+++ b/drivers/alsa_midi/alsa_midi_driver.c
@@ -3,45 +3,45 @@
#include <string.h>
static int
-alsa_midi_driver_attach( alsa_midi_driver_t *driver, jack_engine_t *engine )
+alsa_midi_driver_attach ( alsa_midi_driver_t *driver, jack_engine_t *engine )
{
- return driver->midi->attach(driver->midi);
+ return driver->midi->attach (driver->midi);
}
static int
-alsa_midi_driver_detach( alsa_midi_driver_t *driver, jack_engine_t *engine )
+alsa_midi_driver_detach ( alsa_midi_driver_t *driver, jack_engine_t *engine )
{
- return driver->midi->detach(driver->midi);
+ return driver->midi->detach (driver->midi);
}
static int
-alsa_midi_driver_read( alsa_midi_driver_t *driver, jack_nframes_t nframes )
+alsa_midi_driver_read ( alsa_midi_driver_t *driver, jack_nframes_t nframes )
{
- driver->midi->read(driver->midi, nframes);
+ driver->midi->read (driver->midi, nframes);
return 0;
}
static int
-alsa_midi_driver_write( alsa_midi_driver_t *driver, jack_nframes_t nframes )
+alsa_midi_driver_write ( alsa_midi_driver_t *driver, jack_nframes_t nframes )
{
- driver->midi->write(driver->midi, nframes);
+ driver->midi->write (driver->midi, nframes);
return 0;
}
static int
-alsa_midi_driver_start( alsa_midi_driver_t *driver )
+alsa_midi_driver_start ( alsa_midi_driver_t *driver )
{
- return driver->midi->start(driver->midi);
+ return driver->midi->start (driver->midi);
}
static int
-alsa_midi_driver_stop( alsa_midi_driver_t *driver )
+alsa_midi_driver_stop ( alsa_midi_driver_t *driver )
{
- return driver->midi->stop(driver->midi);
+ return driver->midi->stop (driver->midi);
}
static void
-alsa_midi_driver_delete( alsa_midi_driver_t *driver )
+alsa_midi_driver_delete ( alsa_midi_driver_t *driver )
{
}
diff --git a/drivers/alsa_midi/list.c b/drivers/alsa_midi/list.c
index 438066c..d646878 100644
--- a/drivers/alsa_midi/list.c
+++ b/drivers/alsa_midi/list.c
@@ -1,22 +1,22 @@
/* -*- Mode: C ; c-basic-offset: 2 -*- */
/*****************************************************************************
- *
- * list_sort() adapted from linux kernel.
- *
- * 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; version 2 of the License
- *
- * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- *****************************************************************************/
+*
+* list_sort() adapted from linux kernel.
+*
+* 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; version 2 of the License
+*
+* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+*****************************************************************************/
#include <assert.h>
@@ -24,124 +24,131 @@
/* list sort from Mark J Roberts (mjr@znex.org) */
void
-__list_sort(
- struct list_head *head,
- int member_offset,
- int (*cmp)(void * a, void * b))
+__list_sort (
+ struct list_head *head,
+ int member_offset,
+ int (*cmp)(void * a, void * b))
{
- struct list_head *p, *q, *e, *list, *tail, *oldhead;
- int insize, nmerges, psize, qsize, i;
-
- list = head->next;
- list_del(head);
- insize = 1;
- for (;;) {
- p = oldhead = list;
- list = tail = NULL;
- nmerges = 0;
-
- while (p) {
- nmerges++;
- q = p;
- psize = 0;
- for (i = 0; i < insize; i++) {
- psize++;
- q = q->next == oldhead ? NULL : q->next;
- if (!q)
- break;
- }
-
- qsize = insize;
- while (psize > 0 || (qsize > 0 && q)) {
- if (!psize) {
- e = q;
- q = q->next;
- qsize--;
- if (q == oldhead)
- q = NULL;
- } else if (!qsize || !q) {
- e = p;
- p = p->next;
- psize--;
- if (p == oldhead)
- p = NULL;
- } else if (cmp((void *)p - member_offset, (void *)q - member_offset) <= 0) {
- e = p;
- p = p->next;
- psize--;
- if (p == oldhead)
- p = NULL;
- } else {
- e = q;
- q = q->next;
- qsize--;
- if (q == oldhead)
- q = NULL;
- }
- if (tail)
- tail->next = e;
- else
- list = e;
- e->prev = tail;
- tail = e;
- }
- p = q;
- }
-
- tail->next = list;
- list->prev = tail;
-
- if (nmerges <= 1)
- break;
-
- insize *= 2;
- }
-
- head->next = list;
- head->prev = list->prev;
- list->prev->next = head;
- list->prev = head;
+ struct list_head *p, *q, *e, *list, *tail, *oldhead;
+ int insize, nmerges, psize, qsize, i;
+
+ list = head->next;
+ list_del (head);
+ insize = 1;
+ for (;; ) {
+ p = oldhead = list;
+ list = tail = NULL;
+ nmerges = 0;
+
+ while (p) {
+ nmerges++;
+ q = p;
+ psize = 0;
+ for (i = 0; i < insize; i++) {
+ psize++;
+ q = q->next == oldhead ? NULL : q->next;
+ if (!q) {
+ break;
+ }
+ }
+
+ qsize = insize;
+ while (psize > 0 || (qsize > 0 && q)) {
+ if (!psize) {
+ e = q;
+ q = q->next;
+ qsize--;
+ if (q == oldhead) {
+ q = NULL;
+ }
+ } else if (!qsize || !q) {
+ e = p;
+ p = p->next;
+ psize--;
+ if (p == oldhead) {
+ p = NULL;
+ }
+ } else if (cmp ((void*)p - member_offset, (void*)q - member_offset) <= 0) {
+ e = p;
+ p = p->next;
+ psize--;
+ if (p == oldhead) {
+ p = NULL;
+ }
+ } else {
+ e = q;
+ q = q->next;
+ qsize--;
+ if (q == oldhead) {
+ q = NULL;
+ }
+ }
+ if (tail) {
+ tail->next = e;
+ } else {
+ list = e;
+ }
+ e->prev = tail;
+ tail = e;
+ }
+ p = q;
+ }
+
+ tail->next = list;
+ list->prev = tail;
+
+ if (nmerges <= 1) {
+ break;
+ }
+
+ insize *= 2;
+ }
+
+ head->next = list;
+ head->prev = list->prev;
+ list->prev->next = head;
+ list->prev = head;
}
struct test_list_el {
- int value;
- struct list_head test_list_node;
+ int value;
+ struct list_head test_list_node;
};
-int test_list_sort_comparator(struct test_list_el * e1, struct test_list_el * e2)
+int test_list_sort_comparator (struct test_list_el * e1, struct test_list_el * e2)
{
- return e1->value - e2->value;
+ return e1->value - e2->value;
}
-void test_list_sort(void)
+void test_list_sort (void)
{
- struct list_head test_list;
- struct test_list_el *el, *next;
- struct test_list_el te1 = {.value = 1};
- struct test_list_el te2 = {.value = 2};
- struct test_list_el te3 = {.value = 3};
- struct test_list_el te4 = {.value = 4};
- struct test_list_el te5 = {.value = 5};
- struct test_list_el te6 = {.value = 6};
- struct test_list_el te7 = {.value = 7};
-
- const int expected[] = {1, 2, 3, 4, 5, 6, 7};
- int i;
-
- INIT_LIST_HEAD(&test_list);
- list_add_tail(&te2.test_list_node, &test_list);
- list_add_tail(&te6.test_list_node, &test_list);
- list_add_tail(&te4.test_list_node, &test_list);
- list_add_tail(&te5.test_list_node, &test_list);
- list_add_tail(&te7.test_list_node, &test_list);
- list_add_tail(&te1.test_list_node, &test_list);
- list_add_tail(&te3.test_list_node, &test_list);
-
- list_sort(&test_list, struct test_list_el, test_list_node, test_list_sort_comparator);
-
- i = 0;
- list_for_each_entry_safe(el, next, &test_list, test_list_node) {
- assert(el->value == expected[i]);
- i++;
- }
+ struct list_head test_list;
+ struct test_list_el *el, *next;
+ struct test_list_el te1 = { .value = 1 };
+ struct test_list_el te2 = { .value = 2 };
+ struct test_list_el te3 = { .value = 3 };
+ struct test_list_el te4 = { .value = 4 };
+ struct test_list_el te5 = { .value = 5 };
+ struct test_list_el te6 = { .value = 6 };
+ struct test_list_el te7 = { .value = 7 };
+
+ const int expected[] = { 1, 2, 3, 4, 5, 6, 7 };
+ int i;
+
+ INIT_LIST_HEAD (&test_list);
+ list_add_tail (&te2.test_list_node, &test_list);
+ list_add_tail (&te6.test_list_node, &test_list);
+ list_add_tail (&te4.test_list_node, &test_list);
+ list_add_tail (&te5.test_list_node, &test_list);
+ list_add_tail (&te7.test_list_node, &test_list);
+ list_add_tail (&te1.test_list_node, &test_list);
+ list_add_tail (&te3.test_list_node, &test_list);
+
+ list_sort (&test_list, struct test_list_el, test_list_node, test_list_sort_comparator);
+
+ i = 0;
+ list_for_each_entry_safe (el, next, &test_list, test_list_node) {
+ assert (el->value == expected[i]);
+ i++;
+ }
}
diff --git a/drivers/alsa_midi/list.h b/drivers/alsa_midi/list.h
index 5b7f4d4..6e933b9 100644
--- a/drivers/alsa_midi/list.h
+++ b/drivers/alsa_midi/list.h
@@ -1,26 +1,26 @@
/* -*- Mode: C ; c-basic-offset: 2 -*- */
/*****************************************************************************
- *
- * Linux kernel header adapted for user-mode
- * The 2.6.17-rt1 version was used.
- *
- * Original copyright holders of this code are unknown, they were not
- * mentioned in the original file.
- *
- * 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; version 2 of the License
- *
- * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- *****************************************************************************/
+*
+* Linux kernel header adapted for user-mode
+* The 2.6.17-rt1 version was used.
+*
+* Original copyright holders of this code are unknown, they were not
+* mentioned in the original file.
+*
+* 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; version 2 of the License
+*
+* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+*****************************************************************************/
#ifndef _LINUX_LIST_H
#define _LINUX_LIST_H
@@ -28,7 +28,7 @@
#include <stddef.h>
#if !defined(offsetof)
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)
#endif
/**
@@ -39,8 +39,8 @@
*
*/
#define container_of(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
+ const typeof( ((type*)0)->member ) * __mptr = (ptr); \
+ (type*)( (char*)__mptr - offsetof (type, member) ); })
#define prefetch(x) (x = x)
@@ -49,8 +49,8 @@
* under normal circumstances, used to verify that nobody uses
* non-initialized list entries.
*/
-#define LIST_POISON1 ((void *) 0x00100100)
-#define LIST_POISON2 ((void *) 0x00200200)
+#define LIST_POISON1 ((void*)0x00100100)
+#define LIST_POISON2 ((void*)0x00200200)
/*
* Simple doubly linked list implementation.
@@ -63,18 +63,18 @@
*/
struct list_head {
- struct list_head *next, *prev;
+ struct list_head *next, *prev;
};
#define LIST_HEAD_INIT(name) { &(name), &(name) }
-#define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
+#define LIST_HEAD(name) \
+ struct list_head name = LIST_HEAD_INIT (name)
-static inline void INIT_LIST_HEAD(struct list_head *list)
+static inline void INIT_LIST_HEAD (struct list_head *list)
{
- list->next = list;
- list->prev = list;
+ list->next = list;
+ list->prev = list;
}
/*
@@ -83,14 +83,14 @@ static inline void INIT_LIST_HEAD(struct list_head *list)
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
-static inline void __list_add(struct list_head *new,
- struct list_head *prev,
- struct list_head *next)
+static inline void __list_add (struct list_head *new,
+ struct list_head *prev,
+ struct list_head *next)
{
- next->prev = new;
- new->next = next;
- new->prev = prev;
- prev->next = new;
+ next->prev = new;
+ new->next = next;
+ new->prev = prev;
+ prev->next = new;
}
/**
@@ -101,9 +101,9 @@ static inline void __list_add(struct list_head *new,
* Insert a new entry after the specified head.
* This is good for implementing stacks.
*/
-static inline void list_add(struct list_head *new, struct list_head *head)
+static inline void list_add (struct list_head *new, struct list_head *head)
{
- __list_add(new, head, head->next);
+ __list_add (new, head, head->next);
}
/**
@@ -114,9 +114,9 @@ static inline void list_add(struct list_head *new, struct list_head *head)
* Insert a new entry before the specified head.
* This is useful for implementing queues.
*/
-static inline void list_add_tail(struct list_head *new, struct list_head *head)
+static inline void list_add_tail (struct list_head *new, struct list_head *head)
{
- __list_add(new, head->prev, head);
+ __list_add (new, head->prev, head);
}
/*
@@ -125,14 +125,14 @@ static inline void list_add_tail(struct list_head *new, struct list_head *head)
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
-static inline void __list_add_rcu(struct list_head * new,
- struct list_head * prev, struct list_head * next)
+static inline void __list_add_rcu (struct list_head * new,
+ struct list_head * prev, struct list_head * next)
{
- new->next = next;
- new->prev = prev;
+ new->next = next;
+ new->prev = prev;
// smp_wmb();
- next->prev = new;
- prev->next = new;
+ next->prev = new;
+ prev->next = new;
}
/**
@@ -151,9 +151,9 @@ static inline void __list_add_rcu(struct list_head * new,
* the _rcu list-traversal primitives, such as
* list_for_each_entry_rcu().
*/
-static inline void list_add_rcu(struct list_head *new, struct list_head *head)
+static inline void list_add_rcu (struct list_head *new, struct list_head *head)
{
- __list_add_rcu(new, head, head->next);
+ __list_add_rcu (new, head, head->next);
}
/**
@@ -172,10 +172,10 @@ static inline void list_add_rcu(struct list_head *new, struct list_head *head)
* the _rcu list-traversal primitives, such as
* list_for_each_entry_rcu().
*/
-static inline void list_add_tail_rcu(struct list_head *new,
- struct list_head *head)
+static inline void list_add_tail_rcu (struct list_head *new,
+ struct list_head *head)
{
- __list_add_rcu(new, head->prev, head);
+ __list_add_rcu (new, head->prev, head);
}
/*
@@ -185,10 +185,10 @@ static inline void list_add_tail_rcu(struct list_head *new,
* This is only for internal list manipulation where we know
* the prev/next entries already!
*/
-static inline void __list_del(struct list_head * prev, struct list_head * next)
+static inline void __list_del (struct list_head * prev, struct list_head * next)
{
- next->prev = prev;
- prev->next = next;
+ next->prev = prev;
+ prev->next = next;
}
/**
@@ -197,11 +197,11 @@ static inline void __list_del(struct list_head * prev, struct list_head * next)
* Note: list_empty on entry does not return true after this, the entry is
* in an undefined state.
*/
-static inline void list_del(struct list_head *entry)
+static inline void list_del (struct list_head *entry)
{
- __list_del(entry->prev, entry->next);
- entry->next = LIST_POISON1;
- entry->prev = LIST_POISON2;
+ __list_del (entry->prev, entry->next);
+ entry->next = LIST_POISON1;
+ entry->prev = LIST_POISON2;
}
/**
@@ -228,10 +228,10 @@ static inline void list_del(struct list_head *entry)
* or call_rcu() must be used to defer freeing until an RCU
* grace period has elapsed.
*/
-static inline void list_del_rcu(struct list_head *entry)
+static inline void list_del_rcu (struct list_head *entry)
{
- __list_del(entry->prev, entry->next);
- entry->prev = LIST_POISON2;
+ __list_del (entry->prev, entry->next);
+ entry->prev = LIST_POISON2;
}
/*
@@ -241,25 +241,25 @@ static inline void list_del_rcu(struct list_head *entry)
*
* The old entry will be replaced with the new entry atomically.
*/
-static inline void list_replace_rcu(struct list_head *old,
- struct list_head *new)
+static inline void list_replace_rcu (struct list_head *old,
+ struct list_head *new)
{
- new->next = old->next;
- new->prev = old->prev;
+ new->next = old->next;
+ new->prev = old->prev;
// smp_wmb();
- new->next->prev = new;
- new->prev->next = new;
- old->prev = LIST_POISON2;
+ new->next->prev = new;
+ new->prev->next = new;
+ old->prev = LIST_POISON2;
}
/**
* list_del_init - deletes entry from list and reinitialize it.
* @entry: the element to delete from the list.
*/
-static inline void list_del_init(struct list_head *entry)
+static inline void list_del_init (struct list_head *entry)
{
- __list_del(entry->prev, entry->next);
- INIT_LIST_HEAD(entry);
+ __list_del (entry->prev, entry->next);
+ INIT_LIST_HEAD (entry);
}
/**
@@ -267,10 +267,10 @@ static inline void list_del_init(struct list_head *entry)
* @list: the entry to move
* @head: the head that will precede our entry
*/
-static inline void list_move(struct list_head *list, struct list_head *head)
+static inline void list_move (struct list_head *list, struct list_head *head)
{
- __list_del(list->prev, list->next);
- list_add(list, head);
+ __list_del (list->prev, list->next);
+ list_add (list, head);
}
/**
@@ -278,20 +278,20 @@ static inline void list_move(struct list_head *list, struct list_head *head)
* @list: the entry to move
* @head: the head that will follow our entry
*/
-static inline void list_move_tail(struct list_head *list,
- struct list_head *head)
+static inline void list_move_tail (struct list_head *list,
+ struct list_head *head)
{
- __list_del(list->prev, list->next);
- list_add_tail(list, head);
+ __list_del (list->prev, list->next);
+ list_add_tail (list, head);
}
/**
* list_empty - tests whether a list is empty
* @head: the list to test.
*/
-static inline int list_empty(const struct list_head *head)
+static inline int list_empty (const struct list_head *head)
{
- return head->next == head;
+ return head->next == head;
}
/**
@@ -306,24 +306,25 @@ static inline int list_empty(const struct list_head *head)
*
* @head: the list to test.
*/
-static inline int list_empty_careful(const struct list_head *head)
+static inline int list_empty_careful (const struct list_head *head)
{
- struct list_head *next = head->next;
- return (next == head) && (next == head->prev);
+ struct list_head *next = head->next;
+
+ return (next == head) && (next == head->prev);
}
-static inline void __list_splice(struct list_head *list,
- struct list_head *head)
+static inline void __list_splice (struct list_head *list,
+ struct list_head *head)
{
- struct list_head *first = list->next;
- struct list_head *last = list->prev;
- struct list_head *at = head->next;
+ struct list_head *first = list->next;
+ struct list_head *last = list->prev;
+ struct list_head *at = head->next;
- first->prev = head;
- head->next = first;
+ first->prev = head;
+ head->next = first;
- last->next = at;
- at->prev = last;
+ last->next = at;
+ at->prev = last;
}
/**
@@ -331,10 +332,11 @@ static inline void __list_splice(struct list_head *list,
* @list: the new list to add.
* @head: the place to add it in the first list.
*/
-static inline void list_splice(struct list_head *list, struct list_head *head)
+static inline void list_splice (struct list_head *list, struct list_head *head)
{
- if (!list_empty(list))
- __list_splice(list, head);
+ if (!list_empty (list)) {
+ __list_splice (list, head);
+ }
}
/**
@@ -344,13 +346,13 @@ static inline void list_splice(struct list_head *list, struct list_head *head)
*
* The list at @list is reinitialised
*/
-static inline void list_splice_init(struct list_head *list,
- struct list_head *head)
+static inline void list_splice_init (struct list_head *list,
+ struct list_head *head)
{
- if (!list_empty(list)) {
- __list_splice(list, head);
- INIT_LIST_HEAD(list);
- }
+ if (!list_empty (list)) {
+ __list_splice (list, head);
+ INIT_LIST_HEAD (list);
+ }
}
/**
@@ -360,7 +362,7 @@ static inline void list_splice_init(struct list_head *list,
* @member: the name of the list_struct within the struct.
*/
#define list_entry(ptr, type, member) \
- container_of(ptr, type, member)
+ container_of (ptr, type, member)
/**
* list_for_each - iterate over a list
@@ -368,8 +370,8 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
*/
#define list_for_each(pos, head) \
- for (pos = (head)->next; prefetch(pos->next), pos != (head); \
- pos = pos->next)
+ for (pos = (head)->next; prefetch (pos->next), pos != (head); \
+ pos = pos->next)
/**
* __list_for_each - iterate over a list
@@ -382,7 +384,7 @@ static inline void list_splice_init(struct list_head *list,
* or 1 entry) most of the time.
*/
#define __list_for_each(pos, head) \
- for (pos = (head)->next; pos != (head); pos = pos->next)
+ for (pos = (head)->next; pos != (head); pos = pos->next)
/**
* list_for_each_prev - iterate over a list backwards
@@ -390,8 +392,8 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
*/
#define list_for_each_prev(pos, head) \
- for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
- pos = pos->prev)
+ for (pos = (head)->prev; prefetch (pos->prev), pos != (head); \
+ pos = pos->prev)
/**
* list_for_each_safe - iterate over a list safe against removal of list entry
@@ -400,8 +402,8 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
*/
#define list_for_each_safe(pos, n, head) \
- for (pos = (head)->next, n = pos->next; pos != (head); \
- pos = n, n = pos->next)
+ for (pos = (head)->next, n = pos->next; pos != (head); \
+ pos = n, n = pos->next)
/**
* list_for_each_entry - iterate over list of given type
@@ -409,10 +411,10 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry(pos, head, member) \
- for (pos = list_entry((head)->next, typeof(*pos), member); \
- prefetch(pos->member.next), &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
+#define list_for_each_entry(pos, head, member) \
+ for (pos = list_entry ((head)->next, typeof(*pos), member); \
+ prefetch (pos->member.next), &pos->member != (head); \
+ pos = list_entry (pos->member.next, typeof(*pos), member))
/**
* list_for_each_entry_reverse - iterate backwards over list of given type.
@@ -420,10 +422,10 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_reverse(pos, head, member) \
- for (pos = list_entry((head)->prev, typeof(*pos), member); \
- prefetch(pos->member.prev), &pos->member != (head); \
- pos = list_entry(pos->member.prev, typeof(*pos), member))
+#define list_for_each_entry_reverse(pos, head, member) \
+ for (pos = list_entry ((head)->prev, typeof(*pos), member); \
+ prefetch (pos->member.prev), &pos->member != (head); \
+ pos = list_entry (pos->member.prev, typeof(*pos), member))
/**
* list_prepare_entry - prepare a pos entry for use as a start point in
@@ -433,7 +435,7 @@ static inline void list_splice_init(struct list_head *list,
* @member: the name of the list_struct within the struct.
*/
#define list_prepare_entry(pos, head, member) \
- ((pos) ? : list_entry(head, typeof(*pos), member))
+ ((pos) ? : list_entry (head, typeof(*pos), member))
/**
* list_for_each_entry_continue - iterate over list of given type
@@ -442,10 +444,10 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_continue(pos, head, member) \
- for (pos = list_entry(pos->member.next, typeof(*pos), member); \
- prefetch(pos->member.next), &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
+#define list_for_each_entry_continue(pos, head, member) \
+ for (pos = list_entry (pos->member.next, typeof(*pos), member); \
+ prefetch (pos->member.next), &pos->member != (head); \
+ pos = list_entry (pos->member.next, typeof(*pos), member))
/**
* list_for_each_entry_from - iterate over list of given type
@@ -454,9 +456,9 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_from(pos, head, member) \
- for (; prefetch(pos->member.next), &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
+#define list_for_each_entry_from(pos, head, member) \
+ for (; prefetch (pos->member.next), &pos->member != (head); \
+ pos = list_entry (pos->member.next, typeof(*pos), member))
/**
* list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
@@ -465,11 +467,11 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_safe(pos, n, head, member) \
- for (pos = list_entry((head)->next, typeof(*pos), member), \
- n = list_entry(pos->member.next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.next, typeof(*n), member))
+#define list_for_each_entry_safe(pos, n, head, member) \
+ for (pos = list_entry ((head)->next, typeof(*pos), member), \
+ n = list_entry (pos->member.next, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = n, n = list_entry (n->member.next, typeof(*n), member))
/**
* list_for_each_entry_safe_continue - iterate over list of given type
@@ -479,11 +481,11 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_safe_continue(pos, n, head, member) \
- for (pos = list_entry(pos->member.next, typeof(*pos), member), \
- n = list_entry(pos->member.next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.next, typeof(*n), member))
+#define list_for_each_entry_safe_continue(pos, n, head, member) \
+ for (pos = list_entry (pos->member.next, typeof(*pos), member), \
+ n = list_entry (pos->member.next, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = n, n = list_entry (n->member.next, typeof(*n), member))
/**
* list_for_each_entry_safe_from - iterate over list of given type
@@ -493,10 +495,10 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_safe_from(pos, n, head, member) \
- for (n = list_entry(pos->member.next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.next, typeof(*n), member))
+#define list_for_each_entry_safe_from(pos, n, head, member) \
+ for (n = list_entry (pos->member.next, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = n, n = list_entry (n->member.next, typeof(*n), member))
/**
* list_for_each_entry_safe_reverse - iterate backwards over list of given type safe against
@@ -506,11 +508,11 @@ static inline void list_splice_init(struct list_head *list,
* @head: the head for your list.
* @member: the name of the list_struct within the struct.
*/
-#define list_for_each_entry_safe_reverse(pos, n, head, member) \
- for (pos = list_entry((head)->prev, typeof(*pos), member), \
- n = list_entry(pos->member.prev, typeof(*pos), member); \
- &pos->member != (head); \
- pos = n, n = list_entry(n->member.prev, typeof(*n), member))
+#define list_for_each_entry_safe_reverse(pos, n, head, member) \
+ for (pos = list_entry ((head)->prev, typeof(*pos), member), \
+ n = list_entry (pos->member.prev, typeof(*pos), member); \
+ &pos->member != (head); \
+ pos = n, n = list_entry (n->member.prev, typeof(*n), member))
/**
* list_for_each_rcu - iterate over an rcu-protected list
@@ -522,14 +524,14 @@ static inline void list_splice_init(struct list_head *list,
* as long as the traversal is guarded by rcu_read_lock().
*/
#define list_for_each_rcu(pos, head) \
- for (pos = (head)->next; \
- prefetch(rcu_dereference(pos)->next), pos != (head); \
- pos = pos->next)
+ for (pos = (head)->next; \
+ prefetch (rcu_dereference (pos)->next), pos != (head); \
+ pos = pos->next)
#define __list_for_each_rcu(pos, head) \
- for (pos = (head)->next; \
- rcu_dereference(pos) != (head); \
- pos = pos->next)
+ for (pos = (head)->next; \
+ rcu_dereference (pos) != (head); \
+ pos = pos->next)
/**
* list_for_each_safe_rcu - iterate over an rcu-protected list safe
@@ -543,9 +545,9 @@ static inline void list_splice_init(struct list_head *list,
* as long as the traversal is guarded by rcu_read_lock().
*/
#define list_for_each_safe_rcu(pos, n, head) \
- for (pos = (head)->next; \
- n = rcu_dereference(pos)->next, pos != (head); \
- pos = n)
+ for (pos = (head)->next; \
+ n = rcu_dereference (pos)->next, pos != (head); \
+ pos = n)
/**
* list_for_each_entry_rcu - iterate over rcu list of given type
@@ -558,10 +560,10 @@ static inline void list_splice_init(struct list_head *list,
* as long as the traversal is guarded by rcu_read_lock().
*/
#define list_for_each_entry_rcu(pos, head, member) \
- for (pos = list_entry((head)->next, typeof(*pos), member); \
- prefetch(rcu_dereference(pos)->member.next), \
- &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
+ for (pos = list_entry ((head)->next, typeof(*pos), member); \
+ prefetch (rcu_dereference (pos)->member.next), \
+ &pos->member != (head); \
+ pos = list_entry (pos->member.next, typeof(*pos), member))
/**
@@ -575,9 +577,9 @@ static inline void list_splice_init(struct list_head *list,
* as long as the traversal is guarded by rcu_read_lock().
*/
#define list_for_each_continue_rcu(pos, head) \
- for ((pos) = (pos)->next; \
- prefetch(rcu_dereference((pos))->next), (pos) != (head); \
- (pos) = (pos)->next)
+ for ((pos) = (pos)->next; \
+ prefetch (rcu_dereference ((pos))->next), (pos) != (head); \
+ (pos) = (pos)->next)
/*
* Double linked lists with a single pointer list head.
@@ -587,46 +589,48 @@ static inline void list_splice_init(struct list_head *list,
*/
struct hlist_head {
- struct hlist_node *first;
+ struct hlist_node *first;
};
struct hlist_node {
- struct hlist_node *next, **pprev;
+ struct hlist_node *next, **pprev;
};
#define HLIST_HEAD_INIT { .first = NULL }
-#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
+#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
-static inline void INIT_HLIST_NODE(struct hlist_node *h)
+static inline void INIT_HLIST_NODE (struct hlist_node *h)
{
- h->next = NULL;
- h->pprev = NULL;
+ h->next = NULL;
+ h->pprev = NULL;
}
-static inline int hlist_unhashed(const struct hlist_node *h)
+static inline int hlist_unhashed (const struct hlist_node *h)
{
- return !h->pprev;
+ return !h->pprev;
}
-static inline int hlist_empty(const struct hlist_head *h)
+static inline int hlist_empty (const struct hlist_head *h)
{
- return !h->first;
+ return !h->first;
}
-static inline void __hlist_del(struct hlist_node *n)
+static inline void __hlist_del (struct hlist_node *n)
{
- struct hlist_node *next = n->next;
- struct hlist_node **pprev = n->pprev;
- *pprev = next;
- if (next)
- next->pprev = pprev;
+ struct hlist_node *next = n->next;
+ struct hlist_node **pprev = n->pprev;
+
+ *pprev = next;
+ if (next) {
+ next->pprev = pprev;
+ }
}
-static inline void hlist_del(struct hlist_node *n)
+static inline void hlist_del (struct hlist_node *n)
{
- __hlist_del(n);
- n->next = LIST_POISON1;
- n->pprev = LIST_POISON2;
+ __hlist_del (n);
+ n->next = LIST_POISON1;
+ n->pprev = LIST_POISON2;
}
/**
@@ -648,18 +652,18 @@ static inline void hlist_del(struct hlist_node *n)
* the _rcu list-traversal primitives, such as
* hlist_for_each_entry().
*/
-static inline void hlist_del_rcu(struct hlist_node *n)
+static inline void hlist_del_rcu (struct hlist_node *n)
{
- __hlist_del(n);
- n->pprev = LIST_POISON2;
+ __hlist_del (n);
+ n->pprev = LIST_POISON2;
}
-static inline void hlist_del_init(struct hlist_node *n)
+static inline void hlist_del_init (struct hlist_node *n)
{
- if (!hlist_unhashed(n)) {
- __hlist_del(n);
- INIT_HLIST_NODE(n);
- }
+ if (!hlist_unhashed (n)) {
+ __hlist_del (n);
+ INIT_HLIST_NODE (n);
+ }
}
/*
@@ -669,28 +673,31 @@ static inline void hlist_del_init(struct hlist_node *n)
*
* The old entry will be replaced with the new entry atomically.
*/
-static inline void hlist_replace_rcu(struct hlist_node *old,
- struct hlist_node *new)
+static inline void hlist_replace_rcu (struct hlist_node *old,
+ struct hlist_node *new)
{
- struct hlist_node *next = old->next;
+ struct hlist_node *next = old->next;
- new->next = next;
- new->pprev = old->pprev;
+ new->next = next;
+ new->pprev = old->pprev;
// smp_wmb();
- if (next)
- new->next->pprev = &new->next;
- *new->pprev = new;
- old->pprev = LIST_POISON2;
+ if (next) {
+ new->next->pprev = &new->next;
+ }
+ *new->pprev = new;
+ old->pprev = LIST_POISON2;
}
-static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
+static inline void hlist_add_head (struct hlist_node *n, struct hlist_head *h)
{
- struct hlist_node *first = h->first;
- n->next = first;
- if (first)
- first->pprev = &n->next;
- h->first = n;
- n->pprev = &h->first;
+ struct hlist_node *first = h->first;
+
+ n->next = first;
+ if (first) {
+ first->pprev = &n->next;
+ }
+ h->first = n;
+ n->pprev = &h->first;
}
@@ -710,37 +717,40 @@ static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
* problems on Alpha CPUs. Regardless of the type of CPU, the
* list-traversal primitive must be guarded by rcu_read_lock().
*/
-static inline void hlist_add_head_rcu(struct hlist_node *n,
- struct hlist_head *h)
+static inline void hlist_add_head_rcu (struct hlist_node *n,
+ struct hlist_head *h)
{
- struct hlist_node *first = h->first;
- n->next = first;
- n->pprev = &h->first;
+ struct hlist_node *first = h->first;
+
+ n->next = first;
+ n->pprev = &h->first;
// smp_wmb();
- if (first)
- first->pprev = &n->next;
- h->first = n;
+ if (first) {
+ first->pprev = &n->next;
+ }
+ h->first = n;
}
/* next must be != NULL */
-static inline void hlist_add_before(struct hlist_node *n,
- struct hlist_node *next)
+static inline void hlist_add_before (struct hlist_node *n,
+ struct hlist_node *next)
{
- n->pprev = next->pprev;
- n->next = next;
- next->pprev = &n->next;
- *(n->pprev) = n;
+ n->pprev = next->pprev;
+ n->next = next;
+ next->pprev = &n->next;
+ *(n->pprev) = n;
}
-static inline void hlist_add_after(struct hlist_node *n,
- struct hlist_node *next)
+static inline void hlist_add_after (struct hlist_node *n,
+ struct hlist_node *next)
{
- next->next = n->next;
- n->next = next;
- next->pprev = &n->next;
+ next->next = n->next;
+ n->next = next;
+ next->pprev = &n->next;
- if(next->next)
- next->next->pprev = &next->next;
+ if (next->next) {
+ next->next->pprev = &next->next;
+ }
}
/**
@@ -758,14 +768,14 @@ static inline void hlist_add_after(struct hlist_node *n,
* hlist_for_each_entry_rcu(), used to prevent memory-consistency
* problems on Alpha CPUs.
*/
-static inline void hlist_add_before_rcu(struct hlist_node *n,
- struct hlist_node *next)
+static inline void hlist_add_before_rcu (struct hlist_node *n,
+ struct hlist_node *next)
{
- n->pprev = next->pprev;
- n->next = next;
+ n->pprev = next->pprev;
+ n->next = next;
// smp_wmb();
- next->pprev = &n->next;
- *(n->pprev) = n;
+ next->pprev = &n->next;
+ *(n->pprev) = n;
}
/**
@@ -783,26 +793,27 @@ static inline void hlist_add_before_rcu(struct hlist_node *n,
* hlist_for_each_entry_rcu(), used to prevent memory-consistency
* problems on Alpha CPUs.
*/
-static inline void hlist_add_after_rcu(struct hlist_node *prev,
- struct hlist_node *n)
+static inline void hlist_add_after_rcu (struct hlist_node *prev,
+ struct hlist_node *n)
{
- n->next = prev->next;
- n->pprev = &prev->next;
+ n->next = prev->next;
+ n->pprev = &prev->next;
// smp_wmb();
- prev->next = n;
- if (n->next)
- n->next->pprev = &n->next;
+ prev->next = n;
+ if (n->next) {
+ n->next->pprev = &n->next;
+ }
}
-#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
+#define hlist_entry(ptr, type, member) container_of (ptr, type, member)
#define hlist_for_each(pos, head) \
- for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
- pos = pos->next)
+ for (pos = (head)->first; pos && ({ prefetch (pos->next); 1; }); \
+ pos = pos->next)
#define hlist_for_each_safe(pos, n, head) \
- for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
- pos = n)
+ for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
+ pos = n)
/**
* hlist_for_each_entry - iterate over list of given type
@@ -811,11 +822,11 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
* @head: the head for your list.
* @member: the name of the hlist_node within the struct.
*/
-#define hlist_for_each_entry(tpos, pos, head, member) \
- for (pos = (head)->first; \
- pos && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
+#define hlist_for_each_entry(tpos, pos, head, member) \
+ for (pos = (head)->first; \
+ pos && ({ prefetch (pos->next); 1; }) && \
+ ({ tpos = hlist_entry (pos, typeof(*tpos), member); 1; }); \
+ pos = pos->next)
/**
* hlist_for_each_entry_continue - iterate over a hlist continuing after existing point
@@ -824,10 +835,10 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
* @member: the name of the hlist_node within the struct.
*/
#define hlist_for_each_entry_continue(tpos, pos, member) \
- for (pos = (pos)->next; \
- pos && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
+ for (pos = (pos)->next; \
+ pos && ({ prefetch (pos->next); 1; }) && \
+ ({ tpos = hlist_entry (pos, typeof(*tpos), member); 1; }); \
+ pos = pos->next)
/**
* hlist_for_each_entry_from - iterate over a hlist continuing from existing point
@@ -835,10 +846,10 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
* @pos: the &struct hlist_node to use as a loop counter.
* @member: the name of the hlist_node within the struct.
*/
-#define hlist_for_each_entry_from(tpos, pos, member) \
- for (; pos && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
+#define hlist_for_each_entry_from(tpos, pos, member) \
+ for (; pos && ({ prefetch (pos->next); 1; }) && \
+ ({ tpos = hlist_entry (pos, typeof(*tpos), member); 1; }); \
+ pos = pos->next)
/**
* hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
@@ -848,11 +859,11 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
* @head: the head for your list.
* @member: the name of the hlist_node within the struct.
*/
-#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \
- for (pos = (head)->first; \
- pos && ({ n = pos->next; 1; }) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = n)
+#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \
+ for (pos = (head)->first; \
+ pos && ({ n = pos->next; 1; }) && \
+ ({ tpos = hlist_entry (pos, typeof(*tpos), member); 1; }); \
+ pos = n)
/**
* hlist_for_each_entry_rcu - iterate over rcu list of given type
@@ -866,10 +877,10 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
* as long as the traversal is guarded by rcu_read_lock().
*/
#define hlist_for_each_entry_rcu(tpos, pos, head, member) \
- for (pos = (head)->first; \
- rcu_dereference(pos) && ({ prefetch(pos->next); 1;}) && \
- ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
- pos = pos->next)
+ for (pos = (head)->first; \
+ rcu_dereference (pos) && ({ prefetch (pos->next); 1; }) && \
+ ({ tpos = hlist_entry (pos, typeof(*tpos), member); 1; }); \
+ pos = pos->next)
#endif
@@ -881,8 +892,8 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,
* the list.
*/
extern void __list_sort(struct list_head * head,
- int member_offset,
- int (*comparator)(void*,void*));
+ int member_offset,
+ int (*comparator)(void*, void*));
/**
* list_sort - wrapper for __list_sort
@@ -893,11 +904,11 @@ extern void __list_sort(struct list_head * head,
* @comaprator: function comparing two entries, should return value lesser
* than 0 when the first argument is lesser than the second one.
*/
-#define list_sort(head,type,member,comparator) \
- ({ \
- __list_sort(head, \
- offsetof(type, member), \
- (int (*)(void*, void*)) comparator); \
- })
+#define list_sort(head, type, member, comparator) \
+ ({ \
+ __list_sort (head, \
+ offsetof (type, member), \
+ (int (*)(void*, void*))comparator); \
+ })
void test_list_sort(void);
diff --git a/drivers/alsa_midi/midi_pack.h b/drivers/alsa_midi/midi_pack.h
index 6fb704b..d75c18e 100644
--- a/drivers/alsa_midi/midi_pack.h
+++ b/drivers/alsa_midi/midi_pack.h
@@ -27,20 +27,21 @@ typedef struct {
} midi_pack_t;
static inline
-void midi_pack_reset(midi_pack_t *p)
+void midi_pack_reset (midi_pack_t *p)
{
p->running_status = 0;
}
static
-void midi_pack_event(midi_pack_t *p, jack_midi_event_t *e)
+void midi_pack_event (midi_pack_t *p, jack_midi_event_t *e)
{
if (e->buffer[0] >= 0x80 && e->buffer[0] < 0xF0) { // Voice Message
if (e->buffer[0] == p->running_status) {
e->buffer++;
e->size--;
- } else
+ } else {
p->running_status = e->buffer[0];
+ }
} else if (e->buffer[0] < 0xF8) { // not System Realtime
p->running_status = 0;
}
diff --git a/drivers/alsa_midi/midi_unpack.h b/drivers/alsa_midi/midi_unpack.h
index c917f4d..7573a54 100644
--- a/drivers/alsa_midi/midi_unpack.h
+++ b/drivers/alsa_midi/midi_unpack.h
@@ -32,7 +32,7 @@ typedef struct {
} midi_unpack_t;
static inline
-void midi_unpack_init(midi_unpack_t *u)
+void midi_unpack_init (midi_unpack_t *u)
{
u->pos = 0;
u->size = sizeof(u->data);
@@ -40,102 +40,93 @@ void midi_unpack_init(midi_unpack_t *u)
}
static inline
-void midi_unpack_reset(midi_unpack_t *u)
+void midi_unpack_reset (midi_unpack_t *u)
{
u->pos = 0;
u->need = u->size;
}
static const unsigned char midi_voice_len[] = {
- 3, /*0x80 Note Off*/
- 3, /*0x90 Note On*/
- 3, /*0xA0 Aftertouch*/
- 3, /*0xB0 Control Change*/
- 2, /*0xC0 Program Change*/
- 2, /*0xD0 Channel Pressure*/
- 3, /*0xE0 Pitch Wheel*/
- 1 /*0xF0 System*/
+ 3, /*0x80 Note Off*/
+ 3, /*0x90 Note On*/
+ 3, /*0xA0 Aftertouch*/
+ 3, /*0xB0 Control Change*/
+ 2, /*0xC0 Program Change*/
+ 2, /*0xD0 Channel Pressure*/
+ 3, /*0xE0 Pitch Wheel*/
+ 1 /*0xF0 System*/
};
static const unsigned char midi_system_len[] = {
- 0, /*0xF0 System Exclusive Start*/
- 2, /*0xF1 MTC Quarter Frame*/
- 3, /*0xF2 Song Postion*/
- 2, /*0xF3 Song Select*/
- 0, /*0xF4 undefined*/
- 0, /*0xF5 undefined*/
- 1, /*0xF6 Tune Request*/
- 1 /*0xF7 System Exlusive End*/
+ 0, /*0xF0 System Exclusive Start*/
+ 2, /*0xF1 MTC Quarter Frame*/
+ 3, /*0xF2 Song Postion*/
+ 2, /*0xF3 Song Select*/
+ 0, /*0xF4 undefined*/
+ 0, /*0xF5 undefined*/
+ 1, /*0xF6 Tune Request*/
+ 1 /*0xF7 System Exlusive End*/
};
static
-int midi_unpack_buf(midi_unpack_t *buf, const unsigned char *data, int len, void *jack_port_buf, jack_nframes_t time)
+int midi_unpack_buf (midi_unpack_t *buf, const unsigned char *data, int len, void *jack_port_buf, jack_nframes_t time)
{
int i;
- for (i=0; i<len; ++i)
- {
+
+ for (i = 0; i < len; ++i) {
const unsigned char byte = data[i];
- if (byte >= 0xF8) // system realtime
- {
- jack_midi_event_write(jack_port_buf, time, &data[i], 1);
+ if (byte >= 0xF8) { // system realtime
+ jack_midi_event_write (jack_port_buf, time, &data[i], 1);
//jack_error("midi_unpack: written system relatime event\n");
//midi_input_write(in, &data[i], 1);
- }
- else if (byte < 0x80) // data
- {
+ } else if (byte < 0x80) { // data
assert (buf->pos < buf->size);
buf->data[buf->pos++] = byte;
- }
- else if (byte < 0xF0) // voice
- {
+ } else if (byte < 0xF0) { // voice
assert (byte >= 0x80 && byte < 0xF0);
//buf->need = ((byte|0x0F) == 0xCF || (byte|0x0F)==0xDF) ? 2 : 3;
- buf->need = midi_voice_len[(byte-0x80)>>4];
+ buf->need = midi_voice_len[(byte - 0x80) >> 4];
buf->data[0] = byte;
buf->pos = 1;
- }
- else if (byte == 0xF7) // sysex end
- {
+ } else if (byte == 0xF7) { // sysex end
assert (buf->pos < buf->size);
buf->data[buf->pos++] = byte;
buf->need = buf->pos;
- }
- else
- {
+ } else {
assert (byte >= 0xF0 && byte < 0xF8);
buf->pos = 1;
buf->data[0] = byte;
buf->need = midi_system_len[byte - 0xF0];
- if (!buf->need)
+ if (!buf->need) {
buf->need = buf->size;
+ }
}
- if (buf->pos == buf->need)
- {
+ if (buf->pos == buf->need) {
// TODO: deal with big sysex'es (they are silently dropped for now)
- if (buf->data[0] >= 0x80 || (buf->data[0]==0xF0 && buf->data[buf->pos-1] == 0xF7)) {
+ if (buf->data[0] >= 0x80 || (buf->data[0] == 0xF0 && buf->data[buf->pos - 1] == 0xF7)) {
/* convert Note On with velocity 0 to Note Off */
if ((buf->data[0] & 0xF0) == 0x90 && buf->data[2] == 0) {
// we use temp array here to keep running status in sync
jack_midi_data_t temp[3] = { 0x80, 0, 0x40 };
temp[0] |= buf->data[0] & 0x0F;
temp[1] = buf->data[1];
- jack_midi_event_write(jack_port_buf, time, temp, 3);
- } else
- jack_midi_event_write(jack_port_buf, time, &buf->data[0], buf->pos);
+ jack_midi_event_write (jack_port_buf, time, temp, 3);
+ } else {
+ jack_midi_event_write (jack_port_buf, time, &buf->data[0], buf->pos);
+ }
//jack_error("midi_unpack: written %d-byte event\n", buf->pos);
//midi_input_write(in, &buf->data[0], buf->pos);
}
/* keep running status */
- if (buf->data[0] >= 0x80 && buf->data[0] < 0xF0)
+ if (buf->data[0] >= 0x80 && buf->data[0] < 0xF0) {
buf->pos = 1;
- else
- {
+ } else {
buf->pos = 0;
buf->need = buf->size;
}
}
}
- assert (i==len);
+ assert (i == len);
return i;
}
diff --git a/drivers/alsa_midi/port.c b/drivers/alsa_midi/port.c
index fac5eee..ee88273 100644
--- a/drivers/alsa_midi/port.c
+++ b/drivers/alsa_midi/port.c
@@ -32,8 +32,8 @@
#include "port.h"
/* This should be part of JACK API */
-#define JACK_IS_VALID_PORT_NAME_CHAR(c) \
- (isalnum(c) || \
+#define JACK_IS_VALID_PORT_NAME_CHAR(c) \
+ (isalnum (c) || \
(c) == '/' || \
(c) == '_' || \
(c) == '(' || \
@@ -63,7 +63,7 @@ a2j_alsa_connect_from (alsa_midi_driver_t * driver, int client, int port)
snd_seq_port_subscribe_set_time_real (sub, 1);
if ((err = snd_seq_subscribe_port (driver->seq, sub))) {
- a2j_error ("can't subscribe to %d:%d - %s", client, port, snd_strerror(err));
+ a2j_error ("can't subscribe to %d:%d - %s", client, port, snd_strerror (err));
}
return err;
@@ -72,12 +72,12 @@ a2j_alsa_connect_from (alsa_midi_driver_t * driver, int client, int port)
void
a2j_port_setdead (a2j_port_hash_t hash, snd_seq_addr_t addr)
{
- struct a2j_port *port = a2j_port_get(hash, addr);
+ struct a2j_port *port = a2j_port_get (hash, addr);
if (port) {
port->is_dead = true; // see jack_process_internal
} else {
- a2j_debug("port_setdead: not found (%d:%d)", addr.client, addr.port);
+ a2j_debug ("port_setdead: not found (%d:%d)", addr.client, addr.port);
}
}
@@ -108,22 +108,22 @@ a2j_port_fill_name (struct a2j_port * port_ptr, int dir, snd_seq_client_info_t *
snprintf (port_ptr->name,
sizeof(port_ptr->name),
"%s [%d] %s %s",
- snd_seq_client_info_get_name(client_info_ptr),
- snd_seq_client_info_get_client(client_info_ptr),
- snd_seq_port_info_get_name(port_info_ptr),
- (dir == A2J_PORT_CAPTURE ? "in" : "out"));
+ snd_seq_client_info_get_name (client_info_ptr),
+ snd_seq_client_info_get_client (client_info_ptr),
+ snd_seq_port_info_get_name (port_info_ptr),
+ (dir == A2J_PORT_CAPTURE ? "in" : "out"));
} else {
snprintf (port_ptr->name,
sizeof(port_ptr->name),
"%s %s %s",
- snd_seq_client_info_get_name(client_info_ptr),
- snd_seq_port_info_get_name(port_info_ptr),
- (dir == A2J_PORT_CAPTURE ? "in" : "out"));
+ snd_seq_client_info_get_name (client_info_ptr),
+ snd_seq_port_info_get_name (port_info_ptr),
+ (dir == A2J_PORT_CAPTURE ? "in" : "out"));
}
-
+
// replace all offending characters with ' '
for (c = port_ptr->name; *c; ++c) {
- if (!JACK_IS_VALID_PORT_NAME_CHAR(*c)) {
+ if (!JACK_IS_VALID_PORT_NAME_CHAR (*c)) {
*c = ' ';
}
}
@@ -142,7 +142,7 @@ a2j_port_create (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr, cons
stream_ptr = &driver->stream[dir];
if ((err = snd_seq_client_info_malloc (&client_info_ptr)) != 0) {
- a2j_error("Failed to allocate client info");
+ a2j_error ("Failed to allocate client info");
goto fail;
}
@@ -150,12 +150,12 @@ a2j_port_create (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr, cons
err = snd_seq_get_any_client_info (driver->seq, client, client_info_ptr);
if (err != 0) {
- a2j_error("Failed to get client info");
+ a2j_error ("Failed to get client info");
goto fail_free_client_info;
}
- a2j_debug ("client name: '%s'", snd_seq_client_info_get_name(client_info_ptr));
- a2j_debug ("port name: '%s'", snd_seq_port_info_get_name(info));
+ a2j_debug ("client name: '%s'", snd_seq_client_info_get_name (client_info_ptr));
+ a2j_debug ("port name: '%s'", snd_seq_port_info_get_name (info));
port = calloc (1, sizeof(struct a2j_port));
if (!port) {
@@ -170,7 +170,7 @@ a2j_port_create (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr, cons
/* Add port to list early, before registering to JACK, so map functionality is guaranteed to work during port registration */
list_add_tail (&port->siblings, &stream_ptr->list);
-
+
if (dir == A2J_PORT_CAPTURE) {
jack_caps = JackPortIsOutput;
} else {
@@ -178,13 +178,13 @@ a2j_port_create (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr, cons
}
/* mark anything that looks like a hardware port as physical&terminal */
- if (snd_seq_port_info_get_type (info) & (SND_SEQ_PORT_TYPE_HARDWARE|SND_SEQ_PORT_TYPE_PORT|SND_SEQ_PORT_TYPE_SPECIFIC)) {
- jack_caps |= JackPortIsPhysical|JackPortIsTerminal;
+ if (snd_seq_port_info_get_type (info) & (SND_SEQ_PORT_TYPE_HARDWARE | SND_SEQ_PORT_TYPE_PORT | SND_SEQ_PORT_TYPE_SPECIFIC)) {
+ jack_caps |= JackPortIsPhysical | JackPortIsTerminal;
}
port->jack_port = jack_port_register (driver->jack_client, port->name, JACK_DEFAULT_MIDI_TYPE, jack_caps, 0);
if (port->jack_port == JACK_INVALID_PORT) {
- a2j_error("jack_port_register() failed for '%s'", port->name);
+ a2j_error ("jack_port_register() failed for '%s'", port->name);
goto fail_free_port;
}
@@ -195,23 +195,23 @@ a2j_port_create (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr, cons
}
if (err) {
- a2j_debug("port skipped: %s", port->name);
+ a2j_debug ("port skipped: %s", port->name);
goto fail_free_port;
}
- port->inbound_events = jack_ringbuffer_create(MAX_EVENT_SIZE*16);
+ port->inbound_events = jack_ringbuffer_create (MAX_EVENT_SIZE * 16);
- a2j_debug("port created: %s", port->name);
+ a2j_debug ("port created: %s", port->name);
return port;
- fail_free_port:
+fail_free_port:
list_del (&port->siblings);
a2j_port_free (port);
- fail_free_client_info:
+fail_free_client_info:
snd_seq_client_info_free (client_info_ptr);
- fail:
+fail:
return NULL;
}
diff --git a/drivers/alsa_midi/port.h b/drivers/alsa_midi/port.h
index 2c8daf4..8be9ac6 100644
--- a/drivers/alsa_midi/port.h
+++ b/drivers/alsa_midi/port.h
@@ -22,8 +22,8 @@
#ifndef PORT_H__757ADD0F_5E53_41F7_8B7F_8119C5E8A9F1__INCLUDED
#define PORT_H__757ADD0F_5E53_41F7_8B7F_8119C5E8A9F1__INCLUDED
-struct a2j_port* a2j_port_create (alsa_midi_driver_t* driver, int dir, snd_seq_addr_t addr, const snd_seq_port_info_t * info);
-void a2j_port_setdead (a2j_port_hash_t hash, snd_seq_addr_t addr);
-void a2j_port_free (struct a2j_port * port);
+struct a2j_port* a2j_port_create(alsa_midi_driver_t* driver, int dir, snd_seq_addr_t addr, const snd_seq_port_info_t * info);
+void a2j_port_setdead(a2j_port_hash_t hash, snd_seq_addr_t addr);
+void a2j_port_free(struct a2j_port * port);
#endif /* #ifndef PORT_H__757ADD0F_5E53_41F7_8B7F_8119C5E8A9F1__INCLUDED */
diff --git a/drivers/alsa_midi/port_hash.c b/drivers/alsa_midi/port_hash.c
index cc9c5c6..1a3dec2 100644
--- a/drivers/alsa_midi/port_hash.c
+++ b/drivers/alsa_midi/port_hash.c
@@ -31,33 +31,36 @@
static inline
int
-a2j_port_hash(
- snd_seq_addr_t addr)
+a2j_port_hash (
+ snd_seq_addr_t addr)
{
- return (addr.client + addr.port) % PORT_HASH_SIZE;
+ return (addr.client + addr.port) % PORT_HASH_SIZE;
}
struct a2j_port *
-a2j_port_get(
- a2j_port_hash_t hash,
- snd_seq_addr_t addr)
+a2j_port_get (
+ a2j_port_hash_t hash,
+ snd_seq_addr_t addr)
{
- struct a2j_port **pport = &hash[a2j_port_hash(addr)];
- while (*pport) {
- struct a2j_port *port = *pport;
- if (port->remote.client == addr.client && port->remote.port == addr.port)
- return port;
- pport = &port->next;
- }
- return NULL;
+ struct a2j_port **pport = &hash[a2j_port_hash (addr)];
+
+ while (*pport) {
+ struct a2j_port *port = *pport;
+ if (port->remote.client == addr.client && port->remote.port == addr.port) {
+ return port;
+ }
+ pport = &port->next;
+ }
+ return NULL;
}
void
-a2j_port_insert(
- a2j_port_hash_t hash,
- struct a2j_port * port)
+a2j_port_insert (
+ a2j_port_hash_t hash,
+ struct a2j_port * port)
{
- struct a2j_port **pport = &hash[a2j_port_hash(port->remote)];
- port->next = *pport;
- *pport = port;
+ struct a2j_port **pport = &hash[a2j_port_hash (port->remote)];
+
+ port->next = *pport;
+ *pport = port;
}
diff --git a/drivers/alsa_midi/port_hash.h b/drivers/alsa_midi/port_hash.h
index ec21f11..ebd86e1 100644
--- a/drivers/alsa_midi/port_hash.h
+++ b/drivers/alsa_midi/port_hash.h
@@ -24,12 +24,12 @@
void
a2j_port_insert(
- a2j_port_hash_t hash,
- struct a2j_port * port);
+ a2j_port_hash_t hash,
+ struct a2j_port * port);
struct a2j_port *
a2j_port_get(
- a2j_port_hash_t hash,
- snd_seq_addr_t addr);
+ a2j_port_hash_t hash,
+ snd_seq_addr_t addr);
#endif /* #ifndef PORT_HASH_H__A44CBCD6_E075_49CB_8F73_DF9772511D55__INCLUDED */
diff --git a/drivers/alsa_midi/port_thread.c b/drivers/alsa_midi/port_thread.c
index c6741fd..a8ced8d 100644
--- a/drivers/alsa_midi/port_thread.c
+++ b/drivers/alsa_midi/port_thread.c
@@ -32,18 +32,16 @@
#include "port_thread.h"
struct a2j_port *
-a2j_find_port_by_addr(
+a2j_find_port_by_addr (
struct a2j_stream * stream_ptr,
snd_seq_addr_t addr)
{
struct list_head * node_ptr;
struct a2j_port * port_ptr;
- list_for_each(node_ptr, &stream_ptr->list)
- {
- port_ptr = list_entry(node_ptr, struct a2j_port, siblings);
- if (port_ptr->remote.client == addr.client && port_ptr->remote.port == addr.port)
- {
+ list_for_each (node_ptr, &stream_ptr->list){
+ port_ptr = list_entry (node_ptr, struct a2j_port, siblings);
+ if (port_ptr->remote.client == addr.client && port_ptr->remote.port == addr.port) {
return port_ptr;
}
}
@@ -52,18 +50,16 @@ a2j_find_port_by_addr(
}
struct a2j_port *
-a2j_find_port_by_jack_port_name(
+a2j_find_port_by_jack_port_name (
struct a2j_stream * stream_ptr,
const char * jack_port)
{
struct list_head * node_ptr;
struct a2j_port * port_ptr;
- list_for_each(node_ptr, &stream_ptr->list)
- {
- port_ptr = list_entry(node_ptr, struct a2j_port, siblings);
- if (strcmp(port_ptr->name, jack_port) == 0)
- {
+ list_for_each (node_ptr, &stream_ptr->list){
+ port_ptr = list_entry (node_ptr, struct a2j_port, siblings);
+ if (strcmp (port_ptr->name, jack_port) == 0) {
return port_ptr;
}
}
@@ -83,10 +79,10 @@ a2j_update_port_type (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr,
int alsa_mask;
struct a2j_port * port_ptr;
- a2j_debug("update_port_type(%d:%d)", addr.client, addr.port);
+ a2j_debug ("update_port_type(%d:%d)", addr.client, addr.port);
stream_ptr = &driver->stream[dir];
- port_ptr = a2j_find_port_by_addr(stream_ptr, addr);
+ port_ptr = a2j_find_port_by_addr (stream_ptr, addr);
if (dir == A2J_PORT_CAPTURE) {
alsa_mask = SND_SEQ_PORT_CAP_SUBS_READ;
@@ -95,18 +91,18 @@ a2j_update_port_type (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr,
}
if (port_ptr != NULL && (caps & alsa_mask) != alsa_mask) {
- a2j_debug("setdead: %s", port_ptr->name);
+ a2j_debug ("setdead: %s", port_ptr->name);
port_ptr->is_dead = true;
}
if (port_ptr == NULL && (caps & alsa_mask) == alsa_mask) {
- if(jack_ringbuffer_write_space(stream_ptr->new_ports) >= sizeof(port_ptr)) {
- port_ptr = a2j_port_create (driver, dir, addr, info);
+ if (jack_ringbuffer_write_space (stream_ptr->new_ports) >= sizeof(port_ptr)) {
+ port_ptr = a2j_port_create (driver, dir, addr, info);
if (port_ptr != NULL) {
- jack_ringbuffer_write(stream_ptr->new_ports, (char *)&port_ptr, sizeof(port_ptr));
+ jack_ringbuffer_write (stream_ptr->new_ports, (char*)&port_ptr, sizeof(port_ptr));
}
} else {
- a2j_error( "dropping new port event... increase MAX_PORTS" );
+ a2j_error ( "dropping new port event... increase MAX_PORTS" );
}
}
}
@@ -114,85 +110,85 @@ a2j_update_port_type (alsa_midi_driver_t * driver, int dir, snd_seq_addr_t addr,
void
a2j_update_port (alsa_midi_driver_t * driver, snd_seq_addr_t addr, const snd_seq_port_info_t * info)
{
- unsigned int port_caps = snd_seq_port_info_get_capability(info);
- unsigned int port_type = snd_seq_port_info_get_type(info);
+ unsigned int port_caps = snd_seq_port_info_get_capability (info);
+ unsigned int port_type = snd_seq_port_info_get_type (info);
- a2j_debug("port %u:%u", addr.client, addr.port);
- a2j_debug("port type: 0x%08X", port_type);
- a2j_debug("port caps: 0x%08X", port_caps);
+ a2j_debug ("port %u:%u", addr.client, addr.port);
+ a2j_debug ("port type: 0x%08X", port_type);
+ a2j_debug ("port caps: 0x%08X", port_caps);
if (port_type & SND_SEQ_PORT_TYPE_SPECIFIC) {
- a2j_debug("SPECIFIC");
+ a2j_debug ("SPECIFIC");
}
if (port_type & SND_SEQ_PORT_TYPE_MIDI_GENERIC) {
- a2j_debug("MIDI_GENERIC");
+ a2j_debug ("MIDI_GENERIC");
}
if (port_type & SND_SEQ_PORT_TYPE_MIDI_GM) {
- a2j_debug("MIDI_GM");
+ a2j_debug ("MIDI_GM");
}
if (port_type & SND_SEQ_PORT_TYPE_MIDI_GS) {
- a2j_debug("MIDI_GS");
+ a2j_debug ("MIDI_GS");
}
if (port_type & SND_SEQ_PORT_TYPE_MIDI_XG) {
- a2j_debug("MIDI_XG");
+ a2j_debug ("MIDI_XG");
}
if (port_type & SND_SEQ_PORT_TYPE_MIDI_MT32) {
- a2j_debug("MIDI_MT32");
+ a2j_debug ("MIDI_MT32");
}
if (port_type & SND_SEQ_PORT_TYPE_MIDI_GM2) {
- a2j_debug("MIDI_GM2");
+ a2j_debug ("MIDI_GM2");
}
if (port_type & SND_SEQ_PORT_TYPE_SYNTH) {
- a2j_debug("SYNTH");
+ a2j_debug ("SYNTH");
}
if (port_type & SND_SEQ_PORT_TYPE_DIRECT_SAMPLE) {
- a2j_debug("DIRECT_SAMPLE");
+ a2j_debug ("DIRECT_SAMPLE");
}
if (port_type & SND_SEQ_PORT_TYPE_SAMPLE) {
- a2j_debug("SAMPLE");
+ a2j_debug ("SAMPLE");
}
if (port_type & SND_SEQ_PORT_TYPE_HARDWARE) {
- a2j_debug("HARDWARE");
+ a2j_debug ("HARDWARE");
}
if (port_type & SND_SEQ_PORT_TYPE_SOFTWARE) {
- a2j_debug("SOFTWARE");
+ a2j_debug ("SOFTWARE");
}
if (port_type & SND_SEQ_PORT_TYPE_SYNTHESIZER) {
- a2j_debug("SYNTHESIZER");
+ a2j_debug ("SYNTHESIZER");
}
if (port_type & SND_SEQ_PORT_TYPE_PORT) {
- a2j_debug("PORT");
+ a2j_debug ("PORT");
}
if (port_type & SND_SEQ_PORT_TYPE_APPLICATION) {
- a2j_debug("APPLICATION");
+ a2j_debug ("APPLICATION");
}
if (port_type == 0) {
- a2j_debug("Ignoring port of type 0");
+ a2j_debug ("Ignoring port of type 0");
return;
}
if (port_caps & SND_SEQ_PORT_CAP_NO_EXPORT) {
- a2j_debug("Ignoring no-export port");
+ a2j_debug ("Ignoring no-export port");
return;
}
- a2j_update_port_type (driver, A2J_PORT_CAPTURE, addr, port_caps, info);
- a2j_update_port_type (driver, A2J_PORT_PLAYBACK, addr, port_caps, info);
+ a2j_update_port_type (driver, A2J_PORT_CAPTURE, addr, port_caps, info);
+ a2j_update_port_type (driver, A2J_PORT_PLAYBACK, addr, port_caps, info);
}
void
@@ -202,47 +198,47 @@ a2j_free_ports (alsa_midi_driver_t * driver)
int sz;
while ((sz = jack_ringbuffer_read (driver->port_del, (char*)&port, sizeof(port)))) {
- assert (sz == sizeof(port));
- a2j_debug("port deleted: %s", port->name);
- list_del (&port->siblings);
- a2j_port_free(port);
+ assert (sz == sizeof(port));
+ a2j_debug ("port deleted: %s", port->name);
+ list_del (&port->siblings);
+ a2j_port_free (port);
}
}
void
a2j_update_ports (alsa_midi_driver_t * driver, snd_seq_addr_t addr)
{
- snd_seq_port_info_t * info;
- int err;
-
- assert (addr.client != driver->client_id);
-
- snd_seq_port_info_alloca(&info);
-
- if ((err = snd_seq_get_any_port_info(driver->seq, addr.client, addr.port, info)) >= 0) {
- a2j_debug("updating: %d:%d", addr.client, addr.port);
- a2j_update_port(driver, addr, info);
- } else {
- a2j_debug("setting dead: %d:%d", addr.client, addr.port);
- a2j_port_setdead(driver->stream[A2J_PORT_CAPTURE].port_hash, addr);
- a2j_port_setdead(driver->stream[A2J_PORT_PLAYBACK].port_hash, addr);
- }
+ snd_seq_port_info_t * info;
+ int err;
+
+ assert (addr.client != driver->client_id);
+
+ snd_seq_port_info_alloca (&info);
+
+ if ((err = snd_seq_get_any_port_info (driver->seq, addr.client, addr.port, info)) >= 0) {
+ a2j_debug ("updating: %d:%d", addr.client, addr.port);
+ a2j_update_port (driver, addr, info);
+ } else {
+ a2j_debug ("setting dead: %d:%d", addr.client, addr.port);
+ a2j_port_setdead (driver->stream[A2J_PORT_CAPTURE].port_hash, addr);
+ a2j_port_setdead (driver->stream[A2J_PORT_PLAYBACK].port_hash, addr);
+ }
}
void
a2j_new_ports (alsa_midi_driver_t * driver, snd_seq_addr_t addr)
{
- snd_seq_port_info_t * port_info;
+ snd_seq_port_info_t * port_info;
assert (addr.client != driver->client_id);
- snd_seq_port_info_alloca(&port_info);
+ snd_seq_port_info_alloca (&port_info);
- a2j_debug("adding new port: %d:%d", addr.client, addr.port);
- snd_seq_port_info_set_client(port_info, addr.client);
- snd_seq_port_info_set_port(port_info, -1);
- while (snd_seq_query_next_port(driver->seq, port_info) >= 0) {
- addr.port = snd_seq_port_info_get_port(port_info);
- a2j_update_port(driver, addr, port_info);
- }
+ a2j_debug ("adding new port: %d:%d", addr.client, addr.port);
+ snd_seq_port_info_set_client (port_info, addr.client);
+ snd_seq_port_info_set_port (port_info, -1);
+ while (snd_seq_query_next_port (driver->seq, port_info) >= 0) {
+ addr.port = snd_seq_port_info_get_port (port_info);
+ a2j_update_port (driver, addr, port_info);
+ }
}
diff --git a/drivers/alsa_midi/port_thread.h b/drivers/alsa_midi/port_thread.h
index 51b5fc2..1ce33ae 100644
--- a/drivers/alsa_midi/port_thread.h
+++ b/drivers/alsa_midi/port_thread.h
@@ -22,11 +22,11 @@
#ifndef PORT_THREAD_H__1C6B5065_5556_4AC6_AA9F_44C32A9648C6__INCLUDED
#define PORT_THREAD_H__1C6B5065_5556_4AC6_AA9F_44C32A9648C6__INCLUDED
-void a2j_update_port (alsa_midi_driver_t* driver, snd_seq_addr_t addr, const snd_seq_port_info_t* info);
-void a2j_update_ports (alsa_midi_driver_t* driver, snd_seq_addr_t addr);
-void a2j_new_ports (alsa_midi_driver_t* driver, snd_seq_addr_t addr);
-void a2j_free_ports (alsa_midi_driver_t* driver);
-struct a2j_port * a2j_find_port_by_addr (struct a2j_stream * stream_ptr, snd_seq_addr_t addr);
-struct a2j_port * a2j_find_port_by_jack_port_name (struct a2j_stream * stream_ptr, const char * jack_port);
+void a2j_update_port(alsa_midi_driver_t* driver, snd_seq_addr_t addr, const snd_seq_port_info_t* info);
+void a2j_update_ports(alsa_midi_driver_t* driver, snd_seq_addr_t addr);
+void a2j_new_ports(alsa_midi_driver_t* driver, snd_seq_addr_t addr);
+void a2j_free_ports(alsa_midi_driver_t* driver);
+struct a2j_port * a2j_find_port_by_addr(struct a2j_stream * stream_ptr, snd_seq_addr_t addr);
+struct a2j_port * a2j_find_port_by_jack_port_name(struct a2j_stream * stream_ptr, const char * jack_port);
#endif /* #ifndef PORT_THREAD_H__1C6B5065_5556_4AC6_AA9F_44C32A9648C6__INCLUDED */
diff --git a/drivers/am/alsa_midi.h b/drivers/am/alsa_midi.h
index b49228a..d0cf258 100644
--- a/drivers/am/alsa_midi.h
+++ b/drivers/am/alsa_midi.h
@@ -38,10 +38,10 @@ alsa_midi_t* alsa_seqmidi_new(jack_client_t *jack, const char* alsa_name);
typedef struct _alsa_midi_driver {
- JACK_DRIVER_DECL;
+ JACK_DRIVER_DECL;
- alsa_midi_t *midi;
- jack_client_t *client;
+ alsa_midi_t *midi;
+ jack_client_t *client;
} alsa_midi_driver_t;
diff --git a/drivers/am/alsa_midi_driver.c b/drivers/am/alsa_midi_driver.c
index b27f03c..4da85ed 100644
--- a/drivers/am/alsa_midi_driver.c
+++ b/drivers/am/alsa_midi_driver.c
@@ -3,48 +3,49 @@
#include <string.h>
static int
-alsa_midi_driver_attach( alsa_midi_driver_t *driver, jack_engine_t *engine )
+alsa_midi_driver_attach ( alsa_midi_driver_t *driver, jack_engine_t *engine )
{
- return driver->midi->attach(driver->midi);
+ return driver->midi->attach (driver->midi);
}
static int
-alsa_midi_driver_detach( alsa_midi_driver_t *driver, jack_engine_t *engine )
+alsa_midi_driver_detach ( alsa_midi_driver_t *driver, jack_engine_t *engine )
{
- return driver->midi->detach(driver->midi);
+ return driver->midi->detach (driver->midi);
}
static int
-alsa_midi_driver_read( alsa_midi_driver_t *driver, jack_nframes_t nframes )
+alsa_midi_driver_read ( alsa_midi_driver_t *driver, jack_nframes_t nframes )
{
- driver->midi->read(driver->midi, nframes);
+ driver->midi->read (driver->midi, nframes);
return 0;
}
static int
-alsa_midi_driver_write( alsa_midi_driver_t *driver, jack_nframes_t nframes )
+alsa_midi_driver_write ( alsa_midi_driver_t *driver, jack_nframes_t nframes )
{
- driver->midi->write(driver->midi, nframes);
+ driver->midi->write (driver->midi, nframes);
return 0;
}
static int
-alsa_midi_driver_start( alsa_midi_driver_t *driver )
+alsa_midi_driver_start ( alsa_midi_driver_t *driver )
{
- return driver->midi->start(driver->midi);
+ return driver->midi->start (driver->midi);
}
static int
-alsa_midi_driver_stop( alsa_midi_driver_t *driver )
+alsa_midi_driver_stop ( alsa_midi_driver_t *driver )
{
- return driver->midi->stop(driver->midi);
+ return driver->midi->stop (driver->midi);
}
static void
-alsa_midi_driver_delete( alsa_midi_driver_t *driver )
+alsa_midi_driver_delete ( alsa_midi_driver_t *driver )
{
- if (driver->midi)
+ if (driver->midi) {
(driver->midi->destroy)(driver->midi);
+ }
free (driver);
}
@@ -54,24 +55,24 @@ alsa_midi_driver_new (jack_client_t *client, const char *name)
{
alsa_midi_driver_t *driver;
- jack_info ("creating alsa_midi driver ...");
+ jack_info ("creating alsa_midi driver ...");
- driver = (alsa_midi_driver_t *) calloc (1, sizeof (alsa_midi_driver_t));
+ driver = (alsa_midi_driver_t*)calloc (1, sizeof(alsa_midi_driver_t));
- jack_driver_init ((jack_driver_t *) driver);
+ jack_driver_init ((jack_driver_t*)driver);
- driver->attach = (JackDriverAttachFunction) alsa_midi_driver_attach;
- driver->detach = (JackDriverDetachFunction) alsa_midi_driver_detach;
- driver->read = (JackDriverReadFunction) alsa_midi_driver_read;
- driver->write = (JackDriverWriteFunction) alsa_midi_driver_write;
- driver->start = (JackDriverStartFunction) alsa_midi_driver_start;
- driver->stop = (JackDriverStartFunction) alsa_midi_driver_stop;
+ driver->attach = (JackDriverAttachFunction)alsa_midi_driver_attach;
+ driver->detach = (JackDriverDetachFunction)alsa_midi_driver_detach;
+ driver->read = (JackDriverReadFunction)alsa_midi_driver_read;
+ driver->write = (JackDriverWriteFunction)alsa_midi_driver_write;
+ driver->start = (JackDriverStartFunction)alsa_midi_driver_start;
+ driver->stop = (JackDriverStartFunction)alsa_midi_driver_stop;
- driver->midi = alsa_seqmidi_new(client, NULL);
+ driver->midi = alsa_seqmidi_new (client, NULL);
driver->client = client;
- return (jack_driver_t *) driver;
+ return (jack_driver_t*)driver;
}
/* DRIVER "PLUGIN" INTERFACE */
@@ -83,14 +84,15 @@ driver_get_descriptor ()
{
jack_driver_desc_t * desc;
jack_driver_param_desc_t * params;
+
//unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
- strcpy (desc->name,"alsa_midi");
+ strcpy (desc->name, "alsa_midi");
desc->nparams = 0;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
desc->params = params;
@@ -104,19 +106,19 @@ driver_initialize (jack_client_t *client, const JSList * params)
const jack_driver_param_t * param;
for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
+ param = (const jack_driver_param_t*)node->data;
switch (param->character) {
- default:
- break;
+ default:
+ break;
}
}
-
+
return alsa_midi_driver_new (client, NULL);
}
void
driver_finish (jack_driver_t *driver)
{
- alsa_midi_driver_delete ((alsa_midi_driver_t *) driver);
+ alsa_midi_driver_delete ((alsa_midi_driver_t*)driver);
}
diff --git a/drivers/am/alsa_rawmidi.c b/drivers/am/alsa_rawmidi.c
index 9db97fb..ba73561 100644
--- a/drivers/am/alsa_rawmidi.c
+++ b/drivers/am/alsa_rawmidi.c
@@ -38,16 +38,16 @@
#ifdef STANDALONE
-#define MESSAGE(...) fprintf(stderr, __VA_ARGS__)
+#define MESSAGE(...) fprintf (stderr, __VA_ARGS__)
#else
#include "messagebuffer.h"
#endif
-#define info_log(...) MESSAGE(__VA_ARGS__)
-#define error_log(...) MESSAGE(__VA_ARGS__)
+#define info_log(...) MESSAGE (__VA_ARGS__)
+#define error_log(...) MESSAGE (__VA_ARGS__)
#ifdef JACK_MIDI_DEBUG
-#define debug_log(...) MESSAGE(__VA_ARGS__)
+#define debug_log(...) MESSAGE (__VA_ARGS__)
#else
#define debug_log(...)
#endif
@@ -62,13 +62,13 @@ enum {
enum {
#ifndef JACK_MIDI_DEBUG
MAX_PFDS = 64,
- MAX_PORTS = MAX_PFDS-1,
+ MAX_PORTS = MAX_PFDS - 1,
MAX_EVENTS = 4096,
- MAX_DATA = 64*1024,
+ MAX_DATA = 64 * 1024,
MIDI_THREAD_PRIO = 80
#else
MAX_PFDS = 6,
- MAX_PORTS = MAX_PFDS-1,
+ MAX_PORTS = MAX_PFDS - 1,
MAX_EVENTS = 16,
MAX_DATA = 64,
MIDI_THREAD_PRIO = 80
@@ -122,7 +122,7 @@ typedef struct input_port_t {
// jack
midi_unpack_t unpack;
-
+
// midi
int overruns;
} input_port_t;
@@ -132,7 +132,7 @@ typedef struct output_port_t {
// jack
midi_pack_t packer;
-
+
// midi
event_head_t next_event;
int todo;
@@ -212,33 +212,36 @@ static int do_midi_output(process_midi_t *m);
static
-int stream_init(midi_stream_t *s, alsa_rawmidi_t *midi, const char *name)
+int stream_init (midi_stream_t *s, alsa_rawmidi_t *midi, const char *name)
{
s->owner = midi;
s->name = name;
- if (pipe(s->wake_pipe)==-1) {
+ if (pipe (s->wake_pipe) == -1) {
s->wake_pipe[0] = -1;
- error_log("pipe() in stream_init(%s) failed: %s", name, strerror(errno));
+ error_log ("pipe() in stream_init(%s) failed: %s", name, strerror (errno));
return -errno;
}
- s->jack.new_ports = jack_ringbuffer_create(sizeof(midi_port_t*)*MAX_PORTS);
- s->midi.new_ports = jack_ringbuffer_create(sizeof(midi_port_t*)*MAX_PORTS);
- if (!s->jack.new_ports || !s->midi.new_ports)
+ s->jack.new_ports = jack_ringbuffer_create (sizeof(midi_port_t*) * MAX_PORTS);
+ s->midi.new_ports = jack_ringbuffer_create (sizeof(midi_port_t*) * MAX_PORTS);
+ if (!s->jack.new_ports || !s->midi.new_ports) {
return -ENOMEM;
+ }
return 0;
}
static
-void stream_close(midi_stream_t *s)
+void stream_close (midi_stream_t *s)
{
if (s->wake_pipe[0] != -1) {
- close(s->wake_pipe[0]);
- close(s->wake_pipe[1]);
+ close (s->wake_pipe[0]);
+ close (s->wake_pipe[1]);
+ }
+ if (s->jack.new_ports) {
+ jack_ringbuffer_free (s->jack.new_ports);
+ }
+ if (s->midi.new_ports) {
+ jack_ringbuffer_free (s->midi.new_ports);
}
- if (s->jack.new_ports)
- jack_ringbuffer_free(s->jack.new_ports);
- if (s->midi.new_ports)
- jack_ringbuffer_free(s->midi.new_ports);
}
static void alsa_rawmidi_delete(alsa_midi_t *m);
@@ -249,19 +252,22 @@ static int alsa_rawmidi_stop(alsa_midi_t *m);
static void alsa_rawmidi_read(alsa_midi_t *m, jack_nframes_t nframes);
static void alsa_rawmidi_write(alsa_midi_t *m, jack_nframes_t nframes);
-alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
+alsa_midi_t* alsa_rawmidi_new (jack_client_t *jack)
{
- alsa_rawmidi_t *midi = calloc(1, sizeof(alsa_rawmidi_t));
- if (!midi)
+ alsa_rawmidi_t *midi = calloc (1, sizeof(alsa_rawmidi_t));
+
+ if (!midi) {
goto fail_0;
+ }
midi->client = jack;
- if (pipe(midi->scan.wake_pipe)==-1) {
- error_log("pipe() in alsa_midi_new failed: %s", strerror(errno));
+ if (pipe (midi->scan.wake_pipe) == -1) {
+ error_log ("pipe() in alsa_midi_new failed: %s", strerror (errno));
goto fail_1;
}
- if (stream_init(&midi->in, midi, "in"))
+ if (stream_init (&midi->in, midi, "in")) {
goto fail_2;
+ }
midi->in.mode = POLLIN;
midi->in.port_size = sizeof(input_port_t);
midi->in.port_init = input_port_init;
@@ -269,8 +275,9 @@ alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
midi->in.process_jack = do_jack_input;
midi->in.process_midi = do_midi_input;
- if (stream_init(&midi->out, midi, "out"))
+ if (stream_init (&midi->out, midi, "out")) {
goto fail_3;
+ }
midi->out.mode = POLLOUT;
midi->out.port_size = sizeof(output_port_t);
midi->out.port_init = output_port_init;
@@ -287,15 +294,15 @@ alsa_midi_t* alsa_rawmidi_new(jack_client_t *jack)
midi->ops.write = alsa_rawmidi_write;
return &midi->ops;
- fail_3:
- stream_close(&midi->out);
- fail_2:
- stream_close(&midi->in);
- close(midi->scan.wake_pipe[1]);
- close(midi->scan.wake_pipe[0]);
- fail_1:
- free(midi);
- fail_0:
+fail_3:
+ stream_close (&midi->out);
+fail_2:
+ stream_close (&midi->in);
+ close (midi->scan.wake_pipe[1]);
+ close (midi->scan.wake_pipe[0]);
+fail_1:
+ free (midi);
+fail_0:
return NULL;
}
@@ -303,90 +310,94 @@ static
midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list);
static
-void alsa_rawmidi_delete(alsa_midi_t *m)
+void alsa_rawmidi_delete (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
- alsa_rawmidi_detach(m);
+ alsa_rawmidi_detach (m);
- stream_close(&midi->out);
- stream_close(&midi->in);
- close(midi->scan.wake_pipe[0]);
- close(midi->scan.wake_pipe[1]);
+ stream_close (&midi->out);
+ stream_close (&midi->in);
+ close (midi->scan.wake_pipe[0]);
+ close (midi->scan.wake_pipe[1]);
- free(midi);
+ free (midi);
}
static void* scan_thread(void *);
static void *midi_thread(void *arg);
static
-int alsa_rawmidi_attach(alsa_midi_t *m)
+int alsa_rawmidi_attach (alsa_midi_t *m)
{
return 0;
}
static
-int alsa_rawmidi_detach(alsa_midi_t *m)
+int alsa_rawmidi_detach (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
midi_port_t **list;
- alsa_rawmidi_stop(m);
+ alsa_rawmidi_stop (m);
list = &midi->scan.ports;
while (*list) {
(*list)->state = PORT_REMOVED_FROM_JACK;
- list = scan_port_del(midi, list);
+ list = scan_port_del (midi, list);
}
return 0;
}
static
-int alsa_rawmidi_start(alsa_midi_t *m)
+int alsa_rawmidi_start (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
int err;
char c = 'q';
- if (midi->keep_walking == 1)
+
+ if (midi->keep_walking == 1) {
return -EALREADY;
+ }
midi->keep_walking = 1;
- if ((err = jack_client_create_thread(midi->client, &midi->in.thread, MIDI_THREAD_PRIO, jack_is_realtime(midi->client), midi_thread, &midi->in))) {
+ if ((err = jack_client_create_thread (midi->client, &midi->in.thread, MIDI_THREAD_PRIO, jack_is_realtime (midi->client), midi_thread, &midi->in))) {
midi->keep_walking = 0;
return err;
}
- if ((err = jack_client_create_thread(midi->client, &midi->out.thread, MIDI_THREAD_PRIO, jack_is_realtime(midi->client), midi_thread, &midi->out))) {
+ if ((err = jack_client_create_thread (midi->client, &midi->out.thread, MIDI_THREAD_PRIO, jack_is_realtime (midi->client), midi_thread, &midi->out))) {
midi->keep_walking = 0;
- write(midi->in.wake_pipe[1], &c, 1);
- pthread_join(midi->in.thread, NULL);
+ write (midi->in.wake_pipe[1], &c, 1);
+ pthread_join (midi->in.thread, NULL);
return err;
}
- if ((err = jack_client_create_thread(midi->client, &midi->scan.thread, 0, 0, scan_thread, midi))) {
+ if ((err = jack_client_create_thread (midi->client, &midi->scan.thread, 0, 0, scan_thread, midi))) {
midi->keep_walking = 0;
- write(midi->in.wake_pipe[1], &c, 1);
- write(midi->out.wake_pipe[1], &c, 1);
- pthread_join(midi->in.thread, NULL);
- pthread_join(midi->out.thread, NULL);
+ write (midi->in.wake_pipe[1], &c, 1);
+ write (midi->out.wake_pipe[1], &c, 1);
+ pthread_join (midi->in.thread, NULL);
+ pthread_join (midi->out.thread, NULL);
return err;
}
return 0;
}
static
-int alsa_rawmidi_stop(alsa_midi_t *m)
+int alsa_rawmidi_stop (alsa_midi_t *m)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
char c = 'q';
- if (midi->keep_walking == 0)
+
+ if (midi->keep_walking == 0) {
return -EALREADY;
+ }
midi->keep_walking = 0;
- write(midi->in.wake_pipe[1], &c, 1);
- write(midi->out.wake_pipe[1], &c, 1);
- write(midi->scan.wake_pipe[1], &c, 1);
- pthread_join(midi->in.thread, NULL);
- pthread_join(midi->out.thread, NULL);
- pthread_join(midi->scan.thread, NULL);
+ write (midi->in.wake_pipe[1], &c, 1);
+ write (midi->out.wake_pipe[1], &c, 1);
+ write (midi->scan.wake_pipe[1], &c, 1);
+ pthread_join (midi->in.thread, NULL);
+ pthread_join (midi->out.thread, NULL);
+ pthread_join (midi->scan.thread, NULL);
// ports are freed in alsa_midi_detach()
return 0;
}
@@ -394,59 +405,63 @@ int alsa_rawmidi_stop(alsa_midi_t *m)
static void jack_process(midi_stream_t *str, jack_nframes_t nframes);
static
-void alsa_rawmidi_read(alsa_midi_t *m, jack_nframes_t nframes)
+void alsa_rawmidi_read (alsa_midi_t *m, jack_nframes_t nframes)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
- jack_process(&midi->in, nframes);
+
+ jack_process (&midi->in, nframes);
}
static
-void alsa_rawmidi_write(alsa_midi_t *m, jack_nframes_t nframes)
+void alsa_rawmidi_write (alsa_midi_t *m, jack_nframes_t nframes)
{
alsa_rawmidi_t *midi = (alsa_rawmidi_t*)m;
- jack_process(&midi->out, nframes);
+
+ jack_process (&midi->out, nframes);
}
/*
* -----------------------------------------------------------------------------
*/
static inline
-int can_pass(size_t sz, jack_ringbuffer_t *in, jack_ringbuffer_t *out)
+int can_pass (size_t sz, jack_ringbuffer_t *in, jack_ringbuffer_t *out)
{
- return jack_ringbuffer_read_space(in) >= sz && jack_ringbuffer_write_space(out) >= sz;
+ return jack_ringbuffer_read_space (in) >= sz && jack_ringbuffer_write_space (out) >= sz;
}
static
-void midi_port_init(const alsa_rawmidi_t *midi, midi_port_t *port, snd_rawmidi_info_t *info, const alsa_id_t *id)
+void midi_port_init (const alsa_rawmidi_t *midi, midi_port_t *port, snd_rawmidi_info_t *info, const alsa_id_t *id)
{
const char *name;
char *c;
port->id = *id;
- snprintf(port->dev, sizeof(port->dev), "hw:%d,%d,%d", id->id[0], id->id[1], id->id[3]);
- name = snd_rawmidi_info_get_subdevice_name(info);
- if (!strlen(name))
- name = snd_rawmidi_info_get_name(info);
- snprintf(port->name, sizeof(port->name), "%s %s %s", port->id.id[2] ? "out":"in", port->dev, name);
+ snprintf (port->dev, sizeof(port->dev), "hw:%d,%d,%d", id->id[0], id->id[1], id->id[3]);
+ name = snd_rawmidi_info_get_subdevice_name (info);
+ if (!strlen (name)) {
+ name = snd_rawmidi_info_get_name (info);
+ }
+ snprintf (port->name, sizeof(port->name), "%s %s %s", port->id.id[2] ? "out" : "in", port->dev, name);
// replace all offending characters with '-'
- for (c=port->name; *c; ++c)
- if (!isalnum(*c))
+ for (c = port->name; *c; ++c)
+ if (!isalnum (*c)) {
*c = '-';
+ }
port->state = PORT_CREATED;
}
static
-inline int midi_port_open_jack(const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *name)
+inline int midi_port_open_jack (const alsa_rawmidi_t *midi, midi_port_t *port, int type, const char *name)
{
- port->jack = jack_port_register(midi->client, name, JACK_DEFAULT_MIDI_TYPE,
- type | JackPortIsPhysical|JackPortIsTerminal, 0);
+ port->jack = jack_port_register (midi->client, name, JACK_DEFAULT_MIDI_TYPE,
+ type | JackPortIsPhysical | JackPortIsTerminal, 0);
return port->jack == NULL;
}
static
-int midi_port_open(const alsa_rawmidi_t *midi, midi_port_t *port)
+int midi_port_open (const alsa_rawmidi_t *midi, midi_port_t *port)
{
int err;
int type;
@@ -461,45 +476,49 @@ int midi_port_open(const alsa_rawmidi_t *midi, midi_port_t *port)
out = &port->rawmidi;
type = JackPortIsInput;
}
-
- if ((err = snd_rawmidi_open(in, out, port->dev, SND_RAWMIDI_NONBLOCK))<0)
+
+ if ((err = snd_rawmidi_open (in, out, port->dev, SND_RAWMIDI_NONBLOCK)) < 0) {
return err;
+ }
/* Some devices (emu10k1) have subdevs with the same name,
* and we need to generate unique port name for jack */
- snprintf(name, sizeof(name), "%s", port->name);
- if (midi_port_open_jack(midi, port, type, name)) {
+ snprintf (name, sizeof(name), "%s", port->name);
+ if (midi_port_open_jack (midi, port, type, name)) {
int num;
num = port->id.id[3] ? port->id.id[3] : port->id.id[1];
- snprintf(name, sizeof(name), "%s %d", port->name, num);
- if (midi_port_open_jack(midi, port, type, name))
+ snprintf (name, sizeof(name), "%s %d", port->name, num);
+ if (midi_port_open_jack (midi, port, type, name)) {
return 2;
+ }
}
- if ((port->event_ring = jack_ringbuffer_create(MAX_EVENTS*sizeof(event_head_t)))==NULL)
+ if ((port->event_ring = jack_ringbuffer_create (MAX_EVENTS * sizeof(event_head_t))) == NULL) {
return 3;
- if ((port->data_ring = jack_ringbuffer_create(MAX_DATA))==NULL)
+ }
+ if ((port->data_ring = jack_ringbuffer_create (MAX_DATA)) == NULL) {
return 4;
+ }
return 0;
}
static
-void midi_port_close(const alsa_rawmidi_t *midi, midi_port_t *port)
+void midi_port_close (const alsa_rawmidi_t *midi, midi_port_t *port)
{
if (port->data_ring) {
- jack_ringbuffer_free(port->data_ring);
+ jack_ringbuffer_free (port->data_ring);
port->data_ring = NULL;
}
if (port->event_ring) {
- jack_ringbuffer_free(port->event_ring);
+ jack_ringbuffer_free (port->event_ring);
port->event_ring = NULL;
}
if (port->jack) {
- jack_port_unregister(midi->client, port->jack);
+ jack_port_unregister (midi->client, port->jack);
port->jack = NULL;
}
if (port->rawmidi) {
- snd_rawmidi_close(port->rawmidi);
+ snd_rawmidi_close (port->rawmidi);
port->rawmidi = NULL;
}
}
@@ -509,31 +528,33 @@ void midi_port_close(const alsa_rawmidi_t *midi, midi_port_t *port)
*/
static
-int alsa_id_before(const alsa_id_t *p1, const alsa_id_t *p2)
+int alsa_id_before (const alsa_id_t *p1, const alsa_id_t *p2)
{
int i;
- for (i=0; i<4; ++i) {
- if (p1->id[i] < p2->id[i])
+
+ for (i = 0; i < 4; ++i) {
+ if (p1->id[i] < p2->id[i]) {
return 1;
- else if (p1->id[i] > p2->id[i])
+ } else if (p1->id[i] > p2->id[i]) {
return 0;
+ }
}
return 0;
}
static
-void alsa_get_id(alsa_id_t *id, snd_rawmidi_info_t *info)
+void alsa_get_id (alsa_id_t *id, snd_rawmidi_info_t *info)
{
- id->id[0] = snd_rawmidi_info_get_card(info);
- id->id[1] = snd_rawmidi_info_get_device(info);
- id->id[2] = snd_rawmidi_info_get_stream(info) == SND_RAWMIDI_STREAM_OUTPUT ? 1 : 0;
- id->id[3] = snd_rawmidi_info_get_subdevice(info);
+ id->id[0] = snd_rawmidi_info_get_card (info);
+ id->id[1] = snd_rawmidi_info_get_device (info);
+ id->id[2] = snd_rawmidi_info_get_stream (info) == SND_RAWMIDI_STREAM_OUTPUT ? 1 : 0;
+ id->id[3] = snd_rawmidi_info_get_subdevice (info);
}
static inline
-void alsa_error(const char *func, int err)
+void alsa_error (const char *func, int err)
{
- error_log("%s() failed", snd_strerror(err));
+ error_log ("%s() failed", snd_strerror (err));
}
typedef struct {
@@ -546,136 +567,145 @@ typedef struct {
static midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list);
static
-void scan_cleanup(alsa_rawmidi_t *midi)
+void scan_cleanup (alsa_rawmidi_t *midi)
{
midi_port_t **list = &midi->scan.ports;
+
while (*list)
- list = scan_port_del(midi, list);
+ list = scan_port_del (midi, list);
}
static void scan_card(scan_t *scan);
static midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list);
-void scan_cycle(alsa_rawmidi_t *midi)
+void scan_cycle (alsa_rawmidi_t *midi)
{
int card = -1, err;
scan_t scan;
midi_port_t **ports;
//debug_log("scan: cleanup");
- scan_cleanup(midi);
+ scan_cleanup (midi);
scan.midi = midi;
scan.iterator = &midi->scan.ports;
- snd_rawmidi_info_alloca(&scan.info);
+ snd_rawmidi_info_alloca (&scan.info);
//debug_log("scan: rescan");
- while ((err = snd_card_next(&card))>=0 && card>=0) {
+ while ((err = snd_card_next (&card)) >= 0 && card >= 0) {
char name[32];
- snprintf(name, sizeof(name), "hw:%d", card);
- if ((err = snd_ctl_open(&scan.ctl, name, SND_CTL_NONBLOCK))>=0) {
- scan_card(&scan);
- snd_ctl_close(scan.ctl);
- } else
- alsa_error("scan: snd_ctl_open", err);
+ snprintf (name, sizeof(name), "hw:%d", card);
+ if ((err = snd_ctl_open (&scan.ctl, name, SND_CTL_NONBLOCK)) >= 0) {
+ scan_card (&scan);
+ snd_ctl_close (scan.ctl);
+ } else {
+ alsa_error ("scan: snd_ctl_open", err);
+ }
}
// delayed open to workaround alsa<1.0.14 bug (can't open more than 1 subdevice if ctl is opened).
ports = &midi->scan.ports;
while (*ports) {
midi_port_t *port = *ports;
- if (port->state == PORT_CREATED)
- ports = scan_port_open(midi, ports);
- else
+ if (port->state == PORT_CREATED) {
+ ports = scan_port_open (midi, ports);
+ } else {
ports = &port->next;
+ }
}
}
static void scan_device(scan_t *scan);
static
-void scan_card(scan_t *scan)
+void scan_card (scan_t *scan)
{
int device = -1;
int err;
- while ((err = snd_ctl_rawmidi_next_device(scan->ctl, &device))>=0 && device >=0) {
- snd_rawmidi_info_set_device(scan->info, device);
-
- snd_rawmidi_info_set_stream(scan->info, SND_RAWMIDI_STREAM_INPUT);
- snd_rawmidi_info_set_subdevice(scan->info, 0);
- if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info))>=0)
- scan_device(scan);
- else if (err != -ENOENT)
- alsa_error("scan: snd_ctl_rawmidi_info on device", err);
-
- snd_rawmidi_info_set_stream(scan->info, SND_RAWMIDI_STREAM_OUTPUT);
- snd_rawmidi_info_set_subdevice(scan->info, 0);
- if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info))>=0)
- scan_device(scan);
- else if (err != -ENOENT)
- alsa_error("scan: snd_ctl_rawmidi_info on device", err);
+ while ((err = snd_ctl_rawmidi_next_device (scan->ctl, &device)) >= 0 && device >= 0) {
+ snd_rawmidi_info_set_device (scan->info, device);
+
+ snd_rawmidi_info_set_stream (scan->info, SND_RAWMIDI_STREAM_INPUT);
+ snd_rawmidi_info_set_subdevice (scan->info, 0);
+ if ((err = snd_ctl_rawmidi_info (scan->ctl, scan->info)) >= 0) {
+ scan_device (scan);
+ } else if (err != -ENOENT) {
+ alsa_error ("scan: snd_ctl_rawmidi_info on device", err);
+ }
+
+ snd_rawmidi_info_set_stream (scan->info, SND_RAWMIDI_STREAM_OUTPUT);
+ snd_rawmidi_info_set_subdevice (scan->info, 0);
+ if ((err = snd_ctl_rawmidi_info (scan->ctl, scan->info)) >= 0) {
+ scan_device (scan);
+ } else if (err != -ENOENT) {
+ alsa_error ("scan: snd_ctl_rawmidi_info on device", err);
+ }
}
}
static void scan_port_update(scan_t *scan);
static
-void scan_device(scan_t *scan)
+void scan_device (scan_t *scan)
{
int err;
int sub, nsubs = 0;
- nsubs = snd_rawmidi_info_get_subdevices_count(scan->info);
- for (sub=0; sub<nsubs; ++sub) {
- snd_rawmidi_info_set_subdevice(scan->info, sub);
- if ((err = snd_ctl_rawmidi_info(scan->ctl, scan->info)) < 0) {
- alsa_error("scan: snd_ctl_rawmidi_info on subdevice", err);
+ nsubs = snd_rawmidi_info_get_subdevices_count (scan->info);
+
+ for (sub = 0; sub < nsubs; ++sub) {
+ snd_rawmidi_info_set_subdevice (scan->info, sub);
+ if ((err = snd_ctl_rawmidi_info (scan->ctl, scan->info)) < 0) {
+ alsa_error ("scan: snd_ctl_rawmidi_info on subdevice", err);
continue;
}
- scan_port_update(scan);
+ scan_port_update (scan);
}
}
static midi_port_t** scan_port_add(scan_t *scan, const alsa_id_t *id, midi_port_t **list);
static
-void scan_port_update(scan_t *scan)
+void scan_port_update (scan_t *scan)
{
midi_port_t **list = scan->iterator;
alsa_id_t id;
- alsa_get_id(&id, scan->info);
- while (*list && alsa_id_before(&(*list)->id, &id))
- list = scan_port_del(scan->midi, list);
+ alsa_get_id (&id, scan->info);
- if (!*list || alsa_id_before(&id, &(*list)->id))
- list = scan_port_add(scan, &id, list);
- else if (*list)
+ while (*list && alsa_id_before (&(*list)->id, &id))
+ list = scan_port_del (scan->midi, list);
+
+ if (!*list || alsa_id_before (&id, &(*list)->id)) {
+ list = scan_port_add (scan, &id, list);
+ } else if (*list) {
list = &(*list)->next;
+ }
scan->iterator = list;
}
static
-midi_port_t** scan_port_add(scan_t *scan, const alsa_id_t *id, midi_port_t **list)
+midi_port_t** scan_port_add (scan_t *scan, const alsa_id_t *id, midi_port_t **list)
{
midi_port_t *port;
midi_stream_t *str = id->id[2] ? &scan->midi->out : &scan->midi->in;
- port = calloc(1, str->port_size);
- if (!port)
+ port = calloc (1, str->port_size);
+ if (!port) {
return list;
- midi_port_init(scan->midi, port, scan->info, id);
+ }
+ midi_port_init (scan->midi, port, scan->info, id);
port->next = *list;
*list = port;
- error_log("scan: added port %s %s", port->dev, port->name);
+ error_log ("scan: added port %s %s", port->dev, port->name);
return &port->next;
}
static
-midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list)
+midi_port_t** scan_port_open (alsa_rawmidi_t *midi, midi_port_t **list)
{
midi_stream_t *str;
midi_port_t *port;
@@ -683,43 +713,48 @@ midi_port_t** scan_port_open(alsa_rawmidi_t *midi, midi_port_t **list)
port = *list;
str = port->id.id[2] ? &midi->out : &midi->in;
- if (jack_ringbuffer_write_space(str->jack.new_ports) < sizeof(port))
+ if (jack_ringbuffer_write_space (str->jack.new_ports) < sizeof(port)) {
goto fail_0;
+ }
- if (midi_port_open(midi, port))
+ if (midi_port_open (midi, port)) {
goto fail_1;
- if ((str->port_init)(midi, port))
+ }
+ if ((str->port_init)(midi, port)) {
goto fail_2;
+ }
port->state = PORT_ADDED_TO_JACK;
- jack_ringbuffer_write(str->jack.new_ports, (char*) &port, sizeof(port));
+ jack_ringbuffer_write (str->jack.new_ports, (char*)&port, sizeof(port));
- error_log("scan: opened port %s %s", port->dev, port->name);
+ error_log ("scan: opened port %s %s", port->dev, port->name);
return &port->next;
- fail_2:
- (str->port_close)(midi, port);
- fail_1:
- midi_port_close(midi, port);
+fail_2:
+ (str->port_close)(midi, port);
+fail_1:
+ midi_port_close (midi, port);
port->state = PORT_ZOMBIFIED;
- fail_0:
- error_log("scan: can't open port %s %s", port->dev, port->name);
+fail_0:
+ error_log ("scan: can't open port %s %s", port->dev, port->name);
return &port->next;
}
static
-midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list)
+midi_port_t** scan_port_del (alsa_rawmidi_t *midi, midi_port_t **list)
{
midi_port_t *port = *list;
+
if (port->state == PORT_REMOVED_FROM_JACK) {
- error_log("scan: deleted port %s %s", port->dev, port->name);
+ error_log ("scan: deleted port %s %s", port->dev, port->name);
*list = port->next;
- if (port->id.id[2] )
+ if (port->id.id[2] ) {
(midi->out.port_close)(midi, port);
- else
+ } else {
(midi->in.port_close)(midi, port);
- midi_port_close(midi, port);
- free(port);
+ }
+ midi_port_close (midi, port);
+ free (port);
return list;
} else {
//debug_log("can't delete port %s, wrong state: %d", port->name, (int)port->state);
@@ -727,111 +762,117 @@ midi_port_t** scan_port_del(alsa_rawmidi_t *midi, midi_port_t **list)
}
}
-void* scan_thread(void *arg)
+void* scan_thread (void *arg)
{
alsa_rawmidi_t *midi = arg;
struct pollfd wakeup;
wakeup.fd = midi->scan.wake_pipe[0];
- wakeup.events = POLLIN|POLLERR|POLLNVAL;
+ wakeup.events = POLLIN | POLLERR | POLLNVAL;
while (midi->keep_walking) {
int res;
//error_log("scanning....");
- scan_cycle(midi);
- res = poll(&wakeup, 1, 2000);
- if (res>0) {
+ scan_cycle (midi);
+ res = poll (&wakeup, 1, 2000);
+ if (res > 0) {
char c;
- read(wakeup.fd, &c, 1);
- } else if (res<0 && errno != EINTR)
+ read (wakeup.fd, &c, 1);
+ } else if (res < 0 && errno != EINTR) {
break;
+ }
}
return NULL;
}
-/*
+/*
* ------------------------------- Input/Output ------------------------------
*/
static
-void jack_add_ports(midi_stream_t *str)
+void jack_add_ports (midi_stream_t *str)
{
midi_port_t *port;
- while (can_pass(sizeof(port), str->jack.new_ports, str->midi.new_ports) && str->jack.nports < MAX_PORTS) {
- jack_ringbuffer_read(str->jack.new_ports, (char*)&port, sizeof(port));
+
+ while (can_pass (sizeof(port), str->jack.new_ports, str->midi.new_ports) && str->jack.nports < MAX_PORTS) {
+ jack_ringbuffer_read (str->jack.new_ports, (char*)&port, sizeof(port));
str->jack.ports[str->jack.nports++] = port;
port->state = PORT_ADDED_TO_MIDI;
- jack_ringbuffer_write(str->midi.new_ports, (char*)&port, sizeof(port));
+ jack_ringbuffer_write (str->midi.new_ports, (char*)&port, sizeof(port));
}
}
static
-void jack_process(midi_stream_t *str, jack_nframes_t nframes)
+void jack_process (midi_stream_t *str, jack_nframes_t nframes)
{
int r, w;
process_jack_t proc;
jack_nframes_t cur_frames;
- if (!str->owner->keep_walking)
+ if (!str->owner->keep_walking) {
return;
+ }
proc.midi = str->owner;
proc.nframes = nframes;
- proc.frame_time = jack_last_frame_time(proc.midi->client);
- cur_frames = jack_frame_time(proc.midi->client);
+ proc.frame_time = jack_last_frame_time (proc.midi->client);
+ cur_frames = jack_frame_time (proc.midi->client);
if (proc.frame_time + proc.nframes < cur_frames) {
int periods_lost = (cur_frames - proc.frame_time) / proc.nframes;
proc.frame_time += periods_lost * proc.nframes;
- debug_log("xrun detected: %d periods lost", periods_lost);
+ debug_log ("xrun detected: %d periods lost", periods_lost);
}
// process existing ports
- for (r=0, w=0; r<str->jack.nports; ++r) {
+ for (r = 0, w = 0; r < str->jack.nports; ++r) {
midi_port_t *port = str->jack.ports[r];
proc.port = port;
assert (port->state > PORT_ADDED_TO_JACK && port->state < PORT_REMOVED_FROM_JACK);
- proc.buffer = jack_port_get_buffer(port->jack, nframes);
- if (str->mode == POLLIN)
- jack_midi_clear_buffer(proc.buffer);
+ proc.buffer = jack_port_get_buffer (port->jack, nframes);
+ if (str->mode == POLLIN) {
+ jack_midi_clear_buffer (proc.buffer);
+ }
if (port->state == PORT_REMOVED_FROM_MIDI) {
- port->state = PORT_REMOVED_FROM_JACK; // this signals to scan thread
- continue; // this effectively removes port from the midi->in.jack.ports[]
+ port->state = PORT_REMOVED_FROM_JACK; // this signals to scan thread
+ continue; // this effectively removes port from the midi->in.jack.ports[]
}
(str->process_jack)(&proc);
- if (r != w)
+ if (r != w) {
str->jack.ports[w] = port;
+ }
++w;
}
- if (str->jack.nports != w)
- debug_log("jack_%s: nports %d -> %d", str->name, str->jack.nports, w);
+ if (str->jack.nports != w) {
+ debug_log ("jack_%s: nports %d -> %d", str->name, str->jack.nports, w);
+ }
str->jack.nports = w;
- jack_add_ports(str); // it makes no sense to add them earlier since they have no data yet
+ jack_add_ports (str); // it makes no sense to add them earlier since they have no data yet
// wake midi thread
- write(str->wake_pipe[1], &r, 1);
+ write (str->wake_pipe[1], &r, 1);
}
static
-void *midi_thread(void *arg)
+void *midi_thread (void *arg)
{
midi_stream_t *str = arg;
alsa_rawmidi_t *midi = str->owner;
struct pollfd pfds[MAX_PFDS];
int npfds;
- jack_time_t wait_nsec = 1000*1000*1000; // 1 sec
+ jack_time_t wait_nsec = 1000 * 1000 * 1000; // 1 sec
process_midi_t proc;
proc.midi = midi;
proc.mode = str->mode;
pfds[0].fd = str->wake_pipe[0];
- pfds[0].events = POLLIN|POLLERR|POLLNVAL;
+ pfds[0].events = POLLIN | POLLERR | POLLNVAL;
npfds = 1;
//debug_log("midi_thread(%s): enter", str->name);
@@ -839,47 +880,50 @@ void *midi_thread(void *arg)
while (midi->keep_walking) {
int poll_timeout;
int wait_nanosleep;
- int r=1, w=1; // read,write pos in pfds
- int rp=0, wp=0; // read, write pos in ports
+ int r = 1, w = 1; // read,write pos in pfds
+ int rp = 0, wp = 0; // read, write pos in ports
// sleep
//if (wait_nsec != 1000*1000*1000) {
// debug_log("midi_thread(%s): ", str->name);
// assert (wait_nsec == 1000*1000*1000);
//}
- poll_timeout = wait_nsec / (1000*1000);
- wait_nanosleep = wait_nsec % (1000*1000);
+ poll_timeout = wait_nsec / (1000 * 1000);
+ wait_nanosleep = wait_nsec % (1000 * 1000);
if (wait_nanosleep > NANOSLEEP_RESOLUTION) {
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = wait_nanosleep;
- clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
+ clock_nanosleep (CLOCK_MONOTONIC, 0, &ts, NULL);
}
- int res = poll((struct pollfd*)&pfds, npfds, poll_timeout);
+ int res = poll ((struct pollfd*)&pfds, npfds, poll_timeout);
//debug_log("midi_thread(%s): poll exit: %d", str->name, res);
- if (!midi->keep_walking)
+ if (!midi->keep_walking) {
break;
+ }
if (res < 0) {
- if (errno == EINTR)
+ if (errno == EINTR) {
continue;
- error_log("midi_thread(%s) poll failed: %s", str->name, strerror(errno));
+ }
+ error_log ("midi_thread(%s) poll failed: %s", str->name, strerror (errno));
break;
}
// check wakeup pipe
- if (pfds[0].revents & ~POLLIN)
+ if (pfds[0].revents & ~POLLIN) {
break;
+ }
if (pfds[0].revents & POLLIN) {
char c;
- read(pfds[0].fd, &c, 1);
+ read (pfds[0].fd, &c, 1);
}
// add new ports
- while (jack_ringbuffer_read_space(str->midi.new_ports) >= sizeof(midi_port_t*) && str->midi.nports < MAX_PORTS) {
+ while (jack_ringbuffer_read_space (str->midi.new_ports) >= sizeof(midi_port_t*) && str->midi.nports < MAX_PORTS) {
midi_port_t *port;
- jack_ringbuffer_read(str->midi.new_ports, (char*)&port, sizeof(port));
+ jack_ringbuffer_read (str->midi.new_ports, (char*)&port, sizeof(port));
str->midi.ports[str->midi.nports++] = port;
- debug_log("midi_thread(%s): added port %s", str->name, port->name);
+ debug_log ("midi_thread(%s): added port %s", str->name, port->name);
}
// if (res == 0)
@@ -891,26 +935,29 @@ void *midi_thread(void *arg)
for (rp = 0; rp < str->midi.nports; ++rp) {
midi_port_t *port = str->midi.ports[rp];
- proc.cur_time = jack_frame_time(midi->client);
+ proc.cur_time = jack_frame_time (midi->client);
proc.port = port;
proc.rpfds = &pfds[r];
proc.wpfds = &pfds[w];
proc.max_pfds = MAX_PFDS - w;
r += port->npfds;
if (!(str->process_midi)(&proc)) {
- port->state = PORT_REMOVED_FROM_MIDI; // this signals to jack thread
- continue; // this effectively removes port from array
+ port->state = PORT_REMOVED_FROM_MIDI; // this signals to jack thread
+ continue; // this effectively removes port from array
}
w += port->npfds;
- if (rp != wp)
+ if (rp != wp) {
str->midi.ports[wp] = port;
+ }
++wp;
}
- if (str->midi.nports != wp)
- debug_log("midi_%s: nports %d -> %d", str->name, str->midi.nports, wp);
+ if (str->midi.nports != wp) {
+ debug_log ("midi_%s: nports %d -> %d", str->name, str->midi.nports, wp);
+ }
str->midi.nports = wp;
- if (npfds != w)
- debug_log("midi_%s: npfds %d -> %d", str->name, npfds, w);
+ if (npfds != w) {
+ debug_log ("midi_%s: npfds %d -> %d", str->name, npfds, w);
+ }
npfds = w;
/*
@@ -919,75 +966,79 @@ void *midi_thread(void *arg)
* So, zero timeout will not cause busy-looping.
*/
if (proc.next_time < proc.cur_time) {
- debug_log("%s: late: next_time = %d, cur_time = %d", str->name, (int)proc.next_time, (int)proc.cur_time);
+ debug_log ("%s: late: next_time = %d, cur_time = %d", str->name, (int)proc.next_time, (int)proc.cur_time);
wait_nsec = 0; // we are late
} else if (proc.next_time != NFRAMES_INF) {
jack_time_t wait_frames = proc.next_time - proc.cur_time;
- jack_nframes_t rate = jack_get_sample_rate(midi->client);
- wait_nsec = (wait_frames * (1000*1000*1000)) / rate;
- debug_log("midi_%s: timeout = %d", str->name, (int)wait_frames);
- } else
- wait_nsec = 1000*1000*1000;
+ jack_nframes_t rate = jack_get_sample_rate (midi->client);
+ wait_nsec = (wait_frames * (1000 * 1000 * 1000)) / rate;
+ debug_log ("midi_%s: timeout = %d", str->name, (int)wait_frames);
+ } else {
+ wait_nsec = 1000 * 1000 * 1000;
+ }
//debug_log("midi_thread(%s): wait_nsec = %lld", str->name, wait_nsec);
}
return NULL;
}
static
-int midi_is_ready(process_midi_t *proc)
+int midi_is_ready (process_midi_t *proc)
{
midi_port_t *port = proc->port;
+
if (port->npfds) {
unsigned short revents = 0;
- int res = snd_rawmidi_poll_descriptors_revents(port->rawmidi, proc->rpfds, port->npfds, &revents);
+ int res = snd_rawmidi_poll_descriptors_revents (port->rawmidi, proc->rpfds, port->npfds, &revents);
if (res) {
- error_log("snd_rawmidi_poll_descriptors_revents failed on port %s with: %s", port->name, snd_strerror(res));
+ error_log ("snd_rawmidi_poll_descriptors_revents failed on port %s with: %s", port->name, snd_strerror (res));
return 0;
}
if (revents & ~proc->mode) {
- debug_log("midi: port %s failed", port->name);
+ debug_log ("midi: port %s failed", port->name);
return 0;
}
if (revents & proc->mode) {
port->is_ready = 1;
- debug_log("midi: is_ready %s", port->name);
+ debug_log ("midi: is_ready %s", port->name);
}
}
return 1;
}
static
-int midi_update_pfds(process_midi_t *proc)
+int midi_update_pfds (process_midi_t *proc)
{
midi_port_t *port = proc->port;
+
if (port->npfds == 0) {
- port->npfds = snd_rawmidi_poll_descriptors_count(port->rawmidi);
+ port->npfds = snd_rawmidi_poll_descriptors_count (port->rawmidi);
if (port->npfds > proc->max_pfds) {
- debug_log("midi: not enough pfds for port %s", port->name);
+ debug_log ("midi: not enough pfds for port %s", port->name);
return 0;
}
- snd_rawmidi_poll_descriptors(port->rawmidi, proc->wpfds, port->npfds);
+ snd_rawmidi_poll_descriptors (port->rawmidi, proc->wpfds, port->npfds);
} else if (proc->rpfds != proc->wpfds) {
- memmove(proc->wpfds, proc->rpfds, sizeof(struct pollfd) * port->npfds);
+ memmove (proc->wpfds, proc->rpfds, sizeof(struct pollfd) * port->npfds);
}
return 1;
}
-/*
+/*
* ------------------------------------ Input ------------------------------
*/
static
-int input_port_init(alsa_rawmidi_t *midi, midi_port_t *port)
+int input_port_init (alsa_rawmidi_t *midi, midi_port_t *port)
{
input_port_t *in = (input_port_t*)port;
- midi_unpack_init(&in->unpack);
+
+ midi_unpack_init (&in->unpack);
return 0;
}
static
-void input_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
+void input_port_close (alsa_rawmidi_t *midi, midi_port_t *port)
{
}
@@ -996,41 +1047,44 @@ void input_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
*/
static
-void do_jack_input(process_jack_t *p)
+void do_jack_input (process_jack_t *p)
{
- input_port_t *port = (input_port_t*) p->port;
+ input_port_t *port = (input_port_t*)p->port;
event_head_t event;
- while (jack_ringbuffer_read_space(port->base.event_ring) >= sizeof(event)) {
+
+ while (jack_ringbuffer_read_space (port->base.event_ring) >= sizeof(event)) {
jack_ringbuffer_data_t vec[2];
jack_nframes_t time;
int i, todo;
- jack_ringbuffer_read(port->base.event_ring, (char*)&event, sizeof(event));
+ jack_ringbuffer_read (port->base.event_ring, (char*)&event, sizeof(event));
// TODO: take into account possible warping
- if ((event.time + p->nframes) < p->frame_time)
+ if ((event.time + p->nframes) < p->frame_time) {
time = 0;
- else if (event.time >= p->frame_time)
- time = p->nframes -1;
- else
+ } else if (event.time >= p->frame_time) {
+ time = p->nframes - 1;
+ } else {
time = event.time + p->nframes - p->frame_time;
+ }
- jack_ringbuffer_get_read_vector(port->base.data_ring, vec);
+ jack_ringbuffer_get_read_vector (port->base.data_ring, vec);
assert ((vec[0].len + vec[1].len) >= event.size);
- if (event.overruns)
- midi_unpack_reset(&port->unpack);
+ if (event.overruns) {
+ midi_unpack_reset (&port->unpack);
+ }
todo = event.size;
- for (i=0; i<2 && todo>0; ++i) {
+ for (i = 0; i < 2 && todo > 0; ++i) {
int avail = todo < vec[i].len ? todo : vec[i].len;
- int done = midi_unpack_buf(&port->unpack, (unsigned char*)vec[i].buf, avail, p->buffer, time);
+ int done = midi_unpack_buf (&port->unpack, (unsigned char*)vec[i].buf, avail, p->buffer, time);
if (done != avail) {
- debug_log("jack_in: buffer overflow in port %s", port->base.name);
+ debug_log ("jack_in: buffer overflow in port %s", port->base.name);
break;
}
todo -= done;
}
- jack_ringbuffer_read_advance(port->base.data_ring, event.size);
+ jack_ringbuffer_read_advance (port->base.data_ring, event.size);
}
}
@@ -1038,28 +1092,31 @@ void do_jack_input(process_jack_t *p)
* Low level input.
*/
static
-int do_midi_input(process_midi_t *proc)
+int do_midi_input (process_midi_t *proc)
{
- input_port_t *port = (input_port_t*) proc->port;
- if (!midi_is_ready(proc))
+ input_port_t *port = (input_port_t*)proc->port;
+
+ if (!midi_is_ready (proc)) {
return 0;
+ }
if (port->base.is_ready) {
jack_ringbuffer_data_t vec[2];
int res;
- jack_ringbuffer_get_write_vector(port->base.data_ring, vec);
- if (jack_ringbuffer_write_space(port->base.event_ring) < sizeof(event_head_t) || vec[0].len < 1) {
+ jack_ringbuffer_get_write_vector (port->base.data_ring, vec);
+ if (jack_ringbuffer_write_space (port->base.event_ring) < sizeof(event_head_t) || vec[0].len < 1) {
port->overruns++;
- if (port->base.npfds)
- debug_log("midi_in: internal overflow on %s", port->base.name);
+ if (port->base.npfds) {
+ debug_log ("midi_in: internal overflow on %s", port->base.name);
+ }
// remove from poll to prevent busy-looping
port->base.npfds = 0;
return 1;
}
- res = snd_rawmidi_read(port->base.rawmidi, vec[0].buf, vec[0].len);
+ res = snd_rawmidi_read (port->base.rawmidi, vec[0].buf, vec[0].len);
if (res < 0 && res != -EWOULDBLOCK) {
- error_log("midi_in: reading from port %s failed: %s", port->base.name, snd_strerror(res));
+ error_log ("midi_in: reading from port %s failed: %s", port->base.name, snd_strerror (res));
return 0;
} else if (res > 0) {
event_head_t event;
@@ -1067,94 +1124,101 @@ int do_midi_input(process_midi_t *proc)
event.size = res;
event.overruns = port->overruns;
port->overruns = 0;
- debug_log("midi_in: read %d bytes at %d", (int)event.size, (int)event.time);
- jack_ringbuffer_write_advance(port->base.data_ring, event.size);
- jack_ringbuffer_write(port->base.event_ring, (char*)&event, sizeof(event));
+ debug_log ("midi_in: read %d bytes at %d", (int)event.size, (int)event.time);
+ jack_ringbuffer_write_advance (port->base.data_ring, event.size);
+ jack_ringbuffer_write (port->base.event_ring, (char*)&event, sizeof(event));
}
port->base.is_ready = 0;
}
- if (!midi_update_pfds(proc))
+ if (!midi_update_pfds (proc)) {
return 0;
+ }
return 1;
}
-/*
+/*
* ------------------------------------ Output ------------------------------
*/
-static int output_port_init(alsa_rawmidi_t *midi, midi_port_t *port)
+static int output_port_init (alsa_rawmidi_t *midi, midi_port_t *port)
{
output_port_t *out = (output_port_t*)port;
- midi_pack_reset(&out->packer);
+
+ midi_pack_reset (&out->packer);
out->next_event.time = 0;
out->next_event.size = 0;
out->todo = 0;
return 0;
}
-static void output_port_close(alsa_rawmidi_t *midi, midi_port_t *port)
+static void output_port_close (alsa_rawmidi_t *midi, midi_port_t *port)
{
}
static
-void do_jack_output(process_jack_t *proc)
+void do_jack_output (process_jack_t *proc)
{
- output_port_t *port = (output_port_t*) proc->port;
- int nevents = jack_midi_get_event_count(proc->buffer);
+ output_port_t *port = (output_port_t*)proc->port;
+ int nevents = jack_midi_get_event_count (proc->buffer);
int i;
- if (nevents)
- debug_log("jack_out: %d events in %s", nevents, port->base.name);
- for (i=0; i<nevents; ++i) {
+
+ if (nevents) {
+ debug_log ("jack_out: %d events in %s", nevents, port->base.name);
+ }
+ for (i = 0; i < nevents; ++i) {
jack_midi_event_t event;
event_head_t hdr;
- jack_midi_event_get(&event, proc->buffer, i);
+ jack_midi_event_get (&event, proc->buffer, i);
- if (jack_ringbuffer_write_space(port->base.data_ring) < event.size || jack_ringbuffer_write_space(port->base.event_ring) < sizeof(hdr)) {
- debug_log("jack_out: output buffer overflow on %s", port->base.name);
+ if (jack_ringbuffer_write_space (port->base.data_ring) < event.size || jack_ringbuffer_write_space (port->base.event_ring) < sizeof(hdr)) {
+ debug_log ("jack_out: output buffer overflow on %s", port->base.name);
break;
}
- midi_pack_event(&port->packer, &event);
+ midi_pack_event (&port->packer, &event);
- jack_ringbuffer_write(port->base.data_ring, (char*)event.buffer, event.size);
+ jack_ringbuffer_write (port->base.data_ring, (char*)event.buffer, event.size);
hdr.time = proc->frame_time + event.time + proc->nframes;
hdr.size = event.size;
- jack_ringbuffer_write(port->base.event_ring, (char*)&hdr, sizeof(hdr));
- debug_log("jack_out: sent %d-byte event at %ld", (int)event.size, (long)event.time);
+ jack_ringbuffer_write (port->base.event_ring, (char*)&hdr, sizeof(hdr));
+ debug_log ("jack_out: sent %d-byte event at %ld", (int)event.size, (long)event.time);
}
}
static
-int do_midi_output(process_midi_t *proc)
+int do_midi_output (process_midi_t *proc)
{
int worked = 0;
- output_port_t *port = (output_port_t*) proc->port;
+ output_port_t *port = (output_port_t*)proc->port;
- if (!midi_is_ready(proc))
+ if (!midi_is_ready (proc)) {
return 0;
+ }
// eat events
while (port->next_event.time <= proc->cur_time) {
port->todo += port->next_event.size;
- if (jack_ringbuffer_read(port->base.event_ring, (char*)&port->next_event, sizeof(port->next_event))!=sizeof(port->next_event)) {
+ if (jack_ringbuffer_read (port->base.event_ring, (char*)&port->next_event, sizeof(port->next_event)) != sizeof(port->next_event)) {
port->next_event.time = 0;
port->next_event.size = 0;
break;
- } else
- debug_log("midi_out: at %ld got %d bytes for %ld", (long)proc->cur_time, (int)port->next_event.size, (long)port->next_event.time);
+ } else {
+ debug_log ("midi_out: at %ld got %d bytes for %ld", (long)proc->cur_time, (int)port->next_event.size, (long)port->next_event.time);
+ }
+ }
+
+ if (port->todo) {
+ debug_log ("midi_out: todo = %d at %ld", (int)port->todo, (long)proc->cur_time);
}
-
- if (port->todo)
- debug_log("midi_out: todo = %d at %ld", (int)port->todo, (long)proc->cur_time);
// calc next wakeup time
if (!port->todo && port->next_event.time && port->next_event.time < proc->next_time) {
proc->next_time = port->next_event.time;
- debug_log("midi_out: next_time = %ld", (long)proc->next_time);
+ debug_log ("midi_out: next_time = %ld", (long)proc->next_time);
}
if (port->todo && port->base.is_ready) {
@@ -1163,41 +1227,43 @@ int do_midi_output(process_midi_t *proc)
int res;
jack_ringbuffer_data_t vec[2];
- jack_ringbuffer_get_read_vector(port->base.data_ring, vec);
+ jack_ringbuffer_get_read_vector (port->base.data_ring, vec);
if (size > vec[0].len) {
size = vec[0].len;
assert (size > 0);
}
- res = snd_rawmidi_write(port->base.rawmidi, vec[0].buf, size);
+ res = snd_rawmidi_write (port->base.rawmidi, vec[0].buf, size);
if (res > 0) {
- jack_ringbuffer_read_advance(port->base.data_ring, res);
- debug_log("midi_out: written %d bytes to %s", res, port->base.name);
+ jack_ringbuffer_read_advance (port->base.data_ring, res);
+ debug_log ("midi_out: written %d bytes to %s", res, port->base.name);
port->todo -= res;
worked = 1;
} else if (res == -EWOULDBLOCK) {
port->base.is_ready = 0;
- debug_log("midi_out: -EWOULDBLOCK on %s", port->base.name);
+ debug_log ("midi_out: -EWOULDBLOCK on %s", port->base.name);
return 1;
} else {
- error_log("midi_out: writing to port %s failed: %s", port->base.name, snd_strerror(res));
+ error_log ("midi_out: writing to port %s failed: %s", port->base.name, snd_strerror (res));
return 0;
}
- snd_rawmidi_drain(port->base.rawmidi);
+ snd_rawmidi_drain (port->base.rawmidi);
}
// update pfds for this port
- if (!midi_update_pfds(proc))
+ if (!midi_update_pfds (proc)) {
return 0;
+ }
if (!port->todo) {
int i;
- if (worked)
- debug_log("midi_out: relaxing on %s", port->base.name);
- for (i=0; i<port->base.npfds; ++i)
+ if (worked) {
+ debug_log ("midi_out: relaxing on %s", port->base.name);
+ }
+ for (i = 0; i < port->base.npfds; ++i)
proc->wpfds[i].events &= ~POLLOUT;
} else {
int i;
- for (i=0; i<port->base.npfds; ++i)
+ for (i = 0; i < port->base.npfds; ++i)
proc->wpfds[i].events |= POLLOUT;
}
return 1;
diff --git a/drivers/am/alsa_seqmidi.c b/drivers/am/alsa_seqmidi.c
index 3351b36..58db4b2 100644
--- a/drivers/am/alsa_seqmidi.c
+++ b/drivers/am/alsa_seqmidi.c
@@ -21,21 +21,21 @@
/*
* alsa_seqmidi_read:
* add new ports
- * reads queued snd_seq_event's
- * if PORT_EXIT: mark port as dead
- * if PORT_ADD, PORT_CHANGE: send addr to port_thread (it also may mark port as dead)
- * else process input event
- * remove dead ports and send them to port_thread
+ * reads queued snd_seq_event's
+ * if PORT_EXIT: mark port as dead
+ * if PORT_ADD, PORT_CHANGE: send addr to port_thread (it also may mark port as dead)
+ * else process input event
+ * remove dead ports and send them to port_thread
*
* alsa_seqmidi_write:
- * remove dead ports and send them to port_thread
- * add new ports
- * queue output events
+ * remove dead ports and send them to port_thread
+ * add new ports
+ * queue output events
*
* port_thread:
- * wait for port_sem
- * free deleted ports
- * create new ports or mark existing as dead
+ * wait for port_sem
+ * free deleted ports
+ * create new ports or mark existing as dead
*/
#include <alsa/asoundlib.h>
#include <jack/jack.h>
@@ -52,29 +52,29 @@
#include "alsa_midi.h"
#ifndef SND_SEQ_PORT_TYPE_PORT
-#define SND_SEQ_PORT_TYPE_PORT (1<<19) /* Appears in version 1.0.12rc1 */
+#define SND_SEQ_PORT_TYPE_PORT (1 << 19) /* Appears in version 1.0.12rc1 */
#endif
#ifndef SND_SEQ_PORT_TYPE_HARDWARE
-#define SND_SEQ_PORT_TYPE_HARDWARE (1<<16) /* Appears in version 1.0.12rc1 */
+#define SND_SEQ_PORT_TYPE_HARDWARE (1 << 16) /* Appears in version 1.0.12rc1 */
#endif
#ifdef STANDALONE
-#define MESSAGE(...) fprintf(stderr, __VA_ARGS__)
+#define MESSAGE(...) fprintf (stderr, __VA_ARGS__)
#else
#include "messagebuffer.h"
#endif
-#define info_log(...) MESSAGE(__VA_ARGS__)
-#define error_log(...) MESSAGE(__VA_ARGS__)
+#define info_log(...) MESSAGE (__VA_ARGS__)
+#define error_log(...) MESSAGE (__VA_ARGS__)
#ifdef JACK_MIDI_DEBUG
-#define debug_log(...) MESSAGE(__VA_ARGS__)
+#define debug_log(...) MESSAGE (__VA_ARGS__)
#else
#define debug_log(...)
#endif
-#define NSEC_PER_SEC ((int64_t)1000*1000*1000)
+#define NSEC_PER_SEC ((int64_t)1000 * 1000 * 1000)
enum {
MAX_PORTS = 64,
@@ -124,8 +124,8 @@ typedef struct alsa_seqmidi {
pthread_t port_thread;
sem_t port_sem;
- jack_ringbuffer_t *port_add; // snd_seq_addr_t
- jack_ringbuffer_t *port_del; // port_t*
+ jack_ringbuffer_t *port_add; // snd_seq_addr_t
+ jack_ringbuffer_t *port_del; // port_t*
stream_t stream[2];
@@ -150,7 +150,7 @@ struct process_info {
enum PortType { PORT_INPUT = 0, PORT_OUTPUT = 1 };
-typedef void (*port_jack_func)(alsa_seqmidi_t *self, port_t *port,struct process_info* info);
+typedef void (*port_jack_func)(alsa_seqmidi_t *self, port_t *port, struct process_info* info);
static void do_jack_input(alsa_seqmidi_t *self, port_t *port, struct process_info* info);
static void do_jack_output(alsa_seqmidi_t *self, port_t *port, struct process_info* info);
@@ -186,36 +186,36 @@ static void alsa_seqmidi_read(alsa_midi_t *m, jack_nframes_t nframes);
static void alsa_seqmidi_write(alsa_midi_t *m, jack_nframes_t nframes);
static
-void stream_init(alsa_seqmidi_t *self, int dir)
+void stream_init (alsa_seqmidi_t *self, int dir)
{
stream_t *str = &self->stream[dir];
- str->new_ports = jack_ringbuffer_create(MAX_PORTS*sizeof(port_t*));
- snd_midi_event_new(MAX_EVENT_SIZE, &str->codec);
+ str->new_ports = jack_ringbuffer_create (MAX_PORTS * sizeof(port_t*));
+ snd_midi_event_new (MAX_EVENT_SIZE, &str->codec);
}
static void port_free(alsa_seqmidi_t *self, port_t *port);
static void free_ports(alsa_seqmidi_t *self, jack_ringbuffer_t *ports);
static
-void stream_attach(alsa_seqmidi_t *self, int dir)
+void stream_attach (alsa_seqmidi_t *self, int dir)
{
}
static
-void stream_detach(alsa_seqmidi_t *self, int dir)
+void stream_detach (alsa_seqmidi_t *self, int dir)
{
stream_t *str = &self->stream[dir];
int i;
- free_ports(self, str->new_ports);
+ free_ports (self, str->new_ports);
// delete all ports from hash
- for (i=0; i<PORT_HASH_SIZE; ++i) {
+ for (i = 0; i < PORT_HASH_SIZE; ++i) {
port_t *port = str->ports[i];
while (port) {
port_t *next = port->next;
- port_free(self, port);
+ port_free (self, port);
port = next;
}
str->ports[i] = NULL;
@@ -223,33 +223,38 @@ void stream_detach(alsa_seqmidi_t *self, int dir)
}
static
-void stream_close(alsa_seqmidi_t *self, int dir)
+void stream_close (alsa_seqmidi_t *self, int dir)
{
stream_t *str = &self->stream[dir];
- if (str->codec)
- snd_midi_event_free(str->codec);
- if (str->new_ports)
- jack_ringbuffer_free(str->new_ports);
+ if (str->codec) {
+ snd_midi_event_free (str->codec);
+ }
+ if (str->new_ports) {
+ jack_ringbuffer_free (str->new_ports);
+ }
}
-alsa_midi_t* alsa_seqmidi_new(jack_client_t *client, const char* alsa_name)
+alsa_midi_t* alsa_seqmidi_new (jack_client_t *client, const char* alsa_name)
{
- alsa_seqmidi_t *self = calloc(1, sizeof(alsa_seqmidi_t));
- debug_log("midi: new\n");
- if (!self)
+ alsa_seqmidi_t *self = calloc (1, sizeof(alsa_seqmidi_t));
+
+ debug_log ("midi: new\n");
+ if (!self) {
return NULL;
+ }
self->jack = client;
- if (!alsa_name)
+ if (!alsa_name) {
alsa_name = "jack_midi";
- snprintf(self->alsa_name, sizeof(self->alsa_name), "%s", alsa_name);
+ }
+ snprintf (self->alsa_name, sizeof(self->alsa_name), "%s", alsa_name);
- self->port_add = jack_ringbuffer_create(2*MAX_PORTS*sizeof(snd_seq_addr_t));
- self->port_del = jack_ringbuffer_create(2*MAX_PORTS*sizeof(port_t*));
- sem_init(&self->port_sem, 0, 0);
+ self->port_add = jack_ringbuffer_create (2 * MAX_PORTS * sizeof(snd_seq_addr_t));
+ self->port_del = jack_ringbuffer_create (2 * MAX_PORTS * sizeof(port_t*));
+ sem_init (&self->port_sem, 0, 0);
- stream_init(self, PORT_INPUT);
- stream_init(self, PORT_OUTPUT);
+ stream_init (self, PORT_INPUT);
+ stream_init (self, PORT_OUTPUT);
self->ops.destroy = alsa_seqmidi_delete;
self->ops.attach = alsa_seqmidi_attach;
@@ -262,77 +267,79 @@ alsa_midi_t* alsa_seqmidi_new(jack_client_t *client, const char* alsa_name)
}
static
-void alsa_seqmidi_delete(alsa_midi_t *m)
+void alsa_seqmidi_delete (alsa_midi_t *m)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
- debug_log("midi: delete\n");
- alsa_seqmidi_detach(m);
+ debug_log ("midi: delete\n");
+ alsa_seqmidi_detach (m);
- stream_close(self, PORT_OUTPUT);
- stream_close(self, PORT_INPUT);
+ stream_close (self, PORT_OUTPUT);
+ stream_close (self, PORT_INPUT);
- jack_ringbuffer_free(self->port_add);
- jack_ringbuffer_free(self->port_del);
- sem_close(&self->port_sem);
+ jack_ringbuffer_free (self->port_add);
+ jack_ringbuffer_free (self->port_del);
+ sem_close (&self->port_sem);
- free(self);
+ free (self);
}
static
-int alsa_seqmidi_attach(alsa_midi_t *m)
+int alsa_seqmidi_attach (alsa_midi_t *m)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
int err;
- debug_log("midi: attach\n");
+ debug_log ("midi: attach\n");
- if (self->seq)
+ if (self->seq) {
return -EALREADY;
+ }
- if ((err = snd_seq_open(&self->seq, "hw", SND_SEQ_OPEN_DUPLEX, 0)) < 0) {
- error_log("failed to open alsa seq");
+ if ((err = snd_seq_open (&self->seq, "hw", SND_SEQ_OPEN_DUPLEX, 0)) < 0) {
+ error_log ("failed to open alsa seq");
return err;
}
- snd_seq_set_client_name(self->seq, self->alsa_name);
- self->port_id = snd_seq_create_simple_port(self->seq, "port",
- SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_WRITE
+ snd_seq_set_client_name (self->seq, self->alsa_name);
+ self->port_id = snd_seq_create_simple_port (self->seq, "port",
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_WRITE
#ifndef JACK_MIDI_DEBUG
- |SND_SEQ_PORT_CAP_NO_EXPORT
+ | SND_SEQ_PORT_CAP_NO_EXPORT
#endif
- ,SND_SEQ_PORT_TYPE_APPLICATION);
- self->client_id = snd_seq_client_id(self->seq);
+ , SND_SEQ_PORT_TYPE_APPLICATION);
+ self->client_id = snd_seq_client_id (self->seq);
- self->queue = snd_seq_alloc_queue(self->seq);
- snd_seq_start_queue(self->seq, self->queue, 0);
+ self->queue = snd_seq_alloc_queue (self->seq);
+ snd_seq_start_queue (self->seq, self->queue, 0);
- stream_attach(self, PORT_INPUT);
- stream_attach(self, PORT_OUTPUT);
+ stream_attach (self, PORT_INPUT);
+ stream_attach (self, PORT_OUTPUT);
- snd_seq_nonblock(self->seq, 1);
+ snd_seq_nonblock (self->seq, 1);
return 0;
}
static
-int alsa_seqmidi_detach(alsa_midi_t *m)
+int alsa_seqmidi_detach (alsa_midi_t *m)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
- debug_log("midi: detach\n");
+ debug_log ("midi: detach\n");
- if (!self->seq)
+ if (!self->seq) {
return -EALREADY;
+ }
- alsa_seqmidi_stop(m);
+ alsa_seqmidi_stop (m);
- jack_ringbuffer_reset(self->port_add);
- free_ports(self, self->port_del);
+ jack_ringbuffer_reset (self->port_add);
+ free_ports (self, self->port_del);
- stream_detach(self, PORT_INPUT);
- stream_detach(self, PORT_OUTPUT);
+ stream_detach (self, PORT_INPUT);
+ stream_detach (self, PORT_OUTPUT);
- snd_seq_close(self->seq);
+ snd_seq_close (self->seq);
self->seq = NULL;
return 0;
@@ -345,30 +352,32 @@ static void update_ports(alsa_seqmidi_t *self);
static void add_ports(stream_t *str);
static
-int alsa_seqmidi_start(alsa_midi_t *m)
+int alsa_seqmidi_start (alsa_midi_t *m)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
int err;
- debug_log("midi: start\n");
+ debug_log ("midi: start\n");
- if (!self->seq)
+ if (!self->seq) {
return -EBADF;
+ }
- if (self->keep_walking)
+ if (self->keep_walking) {
return -EALREADY;
+ }
- snd_seq_connect_from(self->seq, self->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE);
- snd_seq_drop_input(self->seq);
+ snd_seq_connect_from (self->seq, self->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE);
+ snd_seq_drop_input (self->seq);
- add_existing_ports(self);
- update_ports(self);
- add_ports(&self->stream[PORT_INPUT]);
- add_ports(&self->stream[PORT_OUTPUT]);
+ add_existing_ports (self);
+ update_ports (self);
+ add_ports (&self->stream[PORT_INPUT]);
+ add_ports (&self->stream[PORT_OUTPUT]);
self->keep_walking = 1;
- if ((err = pthread_create(&self->port_thread, NULL, port_thread, self))) {
+ if ((err = pthread_create (&self->port_thread, NULL, port_thread, self))) {
self->keep_walking = 0;
return -errno;
}
@@ -377,47 +386,49 @@ int alsa_seqmidi_start(alsa_midi_t *m)
}
static
-int alsa_seqmidi_stop(alsa_midi_t *m)
+int alsa_seqmidi_stop (alsa_midi_t *m)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
- debug_log("midi: stop\n");
+ debug_log ("midi: stop\n");
- if (!self->keep_walking)
+ if (!self->keep_walking) {
return -EALREADY;
+ }
- snd_seq_disconnect_from(self->seq, self->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE);
+ snd_seq_disconnect_from (self->seq, self->port_id, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE);
self->keep_walking = 0;
- sem_post(&self->port_sem);
- pthread_join(self->port_thread, NULL);
+ sem_post (&self->port_sem);
+ pthread_join (self->port_thread, NULL);
self->port_thread = 0;
return 0;
}
static
-int alsa_connect_from(alsa_seqmidi_t *self, int client, int port)
+int alsa_connect_from (alsa_seqmidi_t *self, int client, int port)
{
snd_seq_port_subscribe_t* sub;
snd_seq_addr_t seq_addr;
int err;
- snd_seq_port_subscribe_alloca(&sub);
+ snd_seq_port_subscribe_alloca (&sub);
seq_addr.client = client;
seq_addr.port = port;
- snd_seq_port_subscribe_set_sender(sub, &seq_addr);
+ snd_seq_port_subscribe_set_sender (sub, &seq_addr);
seq_addr.client = self->client_id;
seq_addr.port = self->port_id;
- snd_seq_port_subscribe_set_dest(sub, &seq_addr);
+ snd_seq_port_subscribe_set_dest (sub, &seq_addr);
- snd_seq_port_subscribe_set_time_update(sub, 1);
- snd_seq_port_subscribe_set_queue(sub, self->queue);
- snd_seq_port_subscribe_set_time_real(sub, 1);
+ snd_seq_port_subscribe_set_time_update (sub, 1);
+ snd_seq_port_subscribe_set_queue (sub, self->queue);
+ snd_seq_port_subscribe_set_time_real (sub, 1);
- if ((err=snd_seq_subscribe_port(self->seq, sub)))
- error_log("can't subscribe to %d:%d - %s\n", client, port, snd_strerror(err));
+ if ((err = snd_seq_subscribe_port (self->seq, sub))) {
+ error_log ("can't subscribe to %d:%d - %s\n", client, port, snd_strerror (err));
+ }
return err;
}
@@ -425,58 +436,65 @@ int alsa_connect_from(alsa_seqmidi_t *self, int client, int port)
* ==================== Port routines =============================
*/
static inline
-int port_hash(snd_seq_addr_t addr)
+int port_hash (snd_seq_addr_t addr)
{
return (addr.client + addr.port) % PORT_HASH_SIZE;
}
static
-port_t* port_get(port_hash_t hash, snd_seq_addr_t addr)
+port_t* port_get (port_hash_t hash, snd_seq_addr_t addr)
{
- port_t **pport = &hash[port_hash(addr)];
+ port_t **pport = &hash[port_hash (addr)];
+
while (*pport) {
port_t *port = *pport;
- if (port->remote.client == addr.client && port->remote.port == addr.port)
+ if (port->remote.client == addr.client && port->remote.port == addr.port) {
return port;
+ }
pport = &port->next;
}
return NULL;
}
static
-void port_insert(port_hash_t hash, port_t *port)
+void port_insert (port_hash_t hash, port_t *port)
{
- port_t **pport = &hash[port_hash(port->remote)];
+ port_t **pport = &hash[port_hash (port->remote)];
+
port->next = *pport;
*pport = port;
}
static
-void port_setdead(port_hash_t hash, snd_seq_addr_t addr)
+void port_setdead (port_hash_t hash, snd_seq_addr_t addr)
{
- port_t *port = port_get(hash, addr);
- if (port)
+ port_t *port = port_get (hash, addr);
+
+ if (port) {
port->is_dead = 1; // see jack_process
- else
- debug_log("port_setdead: not found (%d:%d)\n", addr.client, addr.port);
+ } else {
+ debug_log ("port_setdead: not found (%d:%d)\n", addr.client, addr.port);
+ }
}
static
-void port_free(alsa_seqmidi_t *self, port_t *port)
+void port_free (alsa_seqmidi_t *self, port_t *port)
{
//snd_seq_disconnect_from(self->seq, self->port_id, port->remote.client, port->remote.port);
//snd_seq_disconnect_to(self->seq, self->port_id, port->remote.client, port->remote.port);
- if (port->early_events)
- jack_ringbuffer_free(port->early_events);
- if (port->jack_port)
- jack_port_unregister(self->jack, port->jack_port);
+ if (port->early_events) {
+ jack_ringbuffer_free (port->early_events);
+ }
+ if (port->jack_port) {
+ jack_port_unregister (self->jack, port->jack_port);
+ }
// info_log("port deleted: %s\n", port->name);
- free(port);
+ free (port);
}
static
-port_t* port_create(alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, const snd_seq_port_info_t *info)
+port_t* port_create (alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, const snd_seq_port_info_t *info)
{
snd_seq_client_info_t* client_info;
port_t *port;
@@ -484,62 +502,68 @@ port_t* port_create(alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, const s
int err;
int jack_caps;
- port = calloc(1, sizeof(port_t));
- if (!port)
+ port = calloc (1, sizeof(port_t));
+ if (!port) {
return NULL;
+ }
port->remote = addr;
snd_seq_client_info_alloca (&client_info);
snd_seq_get_any_client_info (self->seq, addr.client, client_info);
- snprintf(port->name, sizeof(port->name), "%s/midi_%s_%d",
- snd_seq_client_info_get_name(client_info), port_type[type].name, addr.port+1);
+ snprintf (port->name, sizeof(port->name), "%s/midi_%s_%d",
+ snd_seq_client_info_get_name (client_info), port_type[type].name, addr.port + 1);
// replace all offending characters by -
for (c = port->name; *c; ++c)
- if (!isalnum(*c) && *c != '/' && *c != '_' && *c != ':' && *c != '(' && *c != ')')
+ if (!isalnum (*c) && *c != '/' && *c != '_' && *c != ':' && *c != '(' && *c != ')') {
*c = '-';
+ }
jack_caps = port_type[type].jack_caps;
/* mark anything that looks like a hardware port as physical&terminal */
- if (snd_seq_port_info_get_type (info) & (SND_SEQ_PORT_TYPE_HARDWARE|SND_SEQ_PORT_TYPE_PORT|SND_SEQ_PORT_TYPE_SPECIFIC)) {
- jack_caps |= (JackPortIsPhysical|JackPortIsTerminal);
+ if (snd_seq_port_info_get_type (info) & (SND_SEQ_PORT_TYPE_HARDWARE | SND_SEQ_PORT_TYPE_PORT | SND_SEQ_PORT_TYPE_SPECIFIC)) {
+ jack_caps |= (JackPortIsPhysical | JackPortIsTerminal);
}
-
- port->jack_port = jack_port_register(self->jack,
- port->name, JACK_DEFAULT_MIDI_TYPE, jack_caps, 0);
- if (!port->jack_port)
+
+ port->jack_port = jack_port_register (self->jack,
+ port->name, JACK_DEFAULT_MIDI_TYPE, jack_caps, 0);
+ if (!port->jack_port) {
goto failed;
+ }
/* generate an alias */
- snprintf(port->name, sizeof(port->name), "%s:midi/%s_%d",
- snd_seq_client_info_get_name (client_info), port_type[type].name, addr.port+1);
+ snprintf (port->name, sizeof(port->name), "%s:midi/%s_%d",
+ snd_seq_client_info_get_name (client_info), port_type[type].name, addr.port + 1);
// replace all offending characters by -
for (c = port->name; *c; ++c)
- if (!isalnum(*c) && *c != '/' && *c != '_' && *c != ':' && *c != '(' && *c != ')')
+ if (!isalnum (*c) && *c != '/' && *c != '_' && *c != ':' && *c != '(' && *c != ')') {
*c = '-';
+ }
jack_port_set_alias (port->jack_port, port->name);
- if (type == PORT_INPUT)
- err = alsa_connect_from(self, port->remote.client, port->remote.port);
- else
- err = snd_seq_connect_to(self->seq, self->port_id, port->remote.client, port->remote.port);
- if (err)
+ if (type == PORT_INPUT) {
+ err = alsa_connect_from (self, port->remote.client, port->remote.port);
+ } else {
+ err = snd_seq_connect_to (self->seq, self->port_id, port->remote.client, port->remote.port);
+ }
+ if (err) {
goto failed;
+ }
- port->early_events = jack_ringbuffer_create(MAX_EVENT_SIZE*16);
+ port->early_events = jack_ringbuffer_create (MAX_EVENT_SIZE * 16);
// info_log("port created: %s\n", port->name);
return port;
- failed:
- port_free(self, port);
+failed:
+ port_free (self, port);
return NULL;
}
@@ -547,65 +571,69 @@ port_t* port_create(alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, const s
* ==================== Port add/del handling thread ==============================
*/
static
-void update_port_type(alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, int caps, const snd_seq_port_info_t *info)
+void update_port_type (alsa_seqmidi_t *self, int type, snd_seq_addr_t addr, int caps, const snd_seq_port_info_t *info)
{
stream_t *str = &self->stream[type];
int alsa_mask = port_type[type].alsa_mask;
- port_t *port = port_get(str->ports, addr);
+ port_t *port = port_get (str->ports, addr);
- debug_log("update_port_type(%d:%d)\n", addr.client, addr.port);
+ debug_log ("update_port_type(%d:%d)\n", addr.client, addr.port);
- if (port && (caps & alsa_mask)!=alsa_mask) {
- debug_log("setdead: %s\n", port->name);
+ if (port && (caps & alsa_mask) != alsa_mask) {
+ debug_log ("setdead: %s\n", port->name);
port->is_dead = 1;
}
- if (!port && (caps & alsa_mask)==alsa_mask) {
- assert (jack_ringbuffer_write_space(str->new_ports) >= sizeof(port));
- port = port_create(self, type, addr, info);
- if (port)
- jack_ringbuffer_write(str->new_ports, (char*)&port, sizeof(port));
+ if (!port && (caps & alsa_mask) == alsa_mask) {
+ assert (jack_ringbuffer_write_space (str->new_ports) >= sizeof(port));
+ port = port_create (self, type, addr, info);
+ if (port) {
+ jack_ringbuffer_write (str->new_ports, (char*)&port, sizeof(port));
+ }
}
}
static
-void update_port(alsa_seqmidi_t *self, snd_seq_addr_t addr, const snd_seq_port_info_t *info)
+void update_port (alsa_seqmidi_t *self, snd_seq_addr_t addr, const snd_seq_port_info_t *info)
{
- unsigned int port_caps = snd_seq_port_info_get_capability(info);
- if (port_caps & SND_SEQ_PORT_CAP_NO_EXPORT)
+ unsigned int port_caps = snd_seq_port_info_get_capability (info);
+
+ if (port_caps & SND_SEQ_PORT_CAP_NO_EXPORT) {
return;
- update_port_type(self, PORT_INPUT, addr, port_caps, info);
- update_port_type(self, PORT_OUTPUT,addr, port_caps, info);
+ }
+ update_port_type (self, PORT_INPUT, addr, port_caps, info);
+ update_port_type (self, PORT_OUTPUT, addr, port_caps, info);
}
static
-void free_ports(alsa_seqmidi_t *self, jack_ringbuffer_t *ports)
+void free_ports (alsa_seqmidi_t *self, jack_ringbuffer_t *ports)
{
port_t *port;
int sz;
- while ((sz = jack_ringbuffer_read(ports, (char*)&port, sizeof(port)))) {
+
+ while ((sz = jack_ringbuffer_read (ports, (char*)&port, sizeof(port)))) {
assert (sz == sizeof(port));
- port_free(self, port);
+ port_free (self, port);
}
}
static
-void update_ports(alsa_seqmidi_t *self)
+void update_ports (alsa_seqmidi_t *self)
{
snd_seq_addr_t addr;
snd_seq_port_info_t *info;
int size;
- snd_seq_port_info_alloca(&info);
+ snd_seq_port_info_alloca (&info);
+
+ while ((size = jack_ringbuffer_read (self->port_add, (char*)&addr, sizeof(addr)))) {
- while ((size = jack_ringbuffer_read(self->port_add, (char*)&addr, sizeof(addr)))) {
-
int err;
assert (size == sizeof(addr));
assert (addr.client != self->client_id);
- if ((err=snd_seq_get_any_port_info(self->seq, addr.client, addr.port, info))>=0) {
- update_port(self, addr, info);
+ if ((err = snd_seq_get_any_port_info (self->seq, addr.client, addr.port, info)) >= 0) {
+ update_port (self, addr, info);
} else {
//port_setdead(self->stream[PORT_INPUT].ports, addr);
//port_setdead(self->stream[PORT_OUTPUT].ports, addr);
@@ -614,40 +642,39 @@ void update_ports(alsa_seqmidi_t *self)
}
static
-void* port_thread(void *arg)
+void* port_thread (void *arg)
{
alsa_seqmidi_t *self = arg;
while (self->keep_walking) {
- sem_wait(&self->port_sem);
- free_ports(self, self->port_del);
- update_ports(self);
+ sem_wait (&self->port_sem);
+ free_ports (self, self->port_del);
+ update_ports (self);
}
- debug_log("port_thread exited\n");
+ debug_log ("port_thread exited\n");
return NULL;
}
static
-void add_existing_ports(alsa_seqmidi_t *self)
+void add_existing_ports (alsa_seqmidi_t *self)
{
snd_seq_addr_t addr;
snd_seq_client_info_t *client_info;
snd_seq_port_info_t *port_info;
- snd_seq_client_info_alloca(&client_info);
- snd_seq_port_info_alloca(&port_info);
- snd_seq_client_info_set_client(client_info, -1);
- while (snd_seq_query_next_client(self->seq, client_info) >= 0)
- {
- addr.client = snd_seq_client_info_get_client(client_info);
- if (addr.client == SND_SEQ_CLIENT_SYSTEM || addr.client == self->client_id)
+ snd_seq_client_info_alloca (&client_info);
+ snd_seq_port_info_alloca (&port_info);
+ snd_seq_client_info_set_client (client_info, -1);
+ while (snd_seq_query_next_client (self->seq, client_info) >= 0) {
+ addr.client = snd_seq_client_info_get_client (client_info);
+ if (addr.client == SND_SEQ_CLIENT_SYSTEM || addr.client == self->client_id) {
continue;
- snd_seq_port_info_set_client(port_info, addr.client);
- snd_seq_port_info_set_port(port_info, -1);
- while (snd_seq_query_next_port(self->seq, port_info) >= 0)
- {
- addr.port = snd_seq_port_info_get_port(port_info);
- update_port(self, addr, port_info);
+ }
+ snd_seq_port_info_set_client (port_info, addr.client);
+ snd_seq_port_info_set_port (port_info, -1);
+ while (snd_seq_query_next_port (self->seq, port_info) >= 0) {
+ addr.port = snd_seq_port_info_get_port (port_info);
+ update_port (self, addr, port_info);
}
}
}
@@ -656,67 +683,69 @@ void add_existing_ports(alsa_seqmidi_t *self)
* =================== Input/output port handling =========================
*/
static
-void set_process_info(struct process_info *info, alsa_seqmidi_t *self, int dir, jack_nframes_t nframes)
+void set_process_info (struct process_info *info, alsa_seqmidi_t *self, int dir, jack_nframes_t nframes)
{
const snd_seq_real_time_t* alsa_time;
snd_seq_queue_status_t *status;
- snd_seq_queue_status_alloca(&status);
+ snd_seq_queue_status_alloca (&status);
info->dir = dir;
- info->period_start = jack_last_frame_time(self->jack);
+ info->period_start = jack_last_frame_time (self->jack);
info->nframes = nframes;
- info->sample_rate = jack_get_sample_rate(self->jack);
+ info->sample_rate = jack_get_sample_rate (self->jack);
- info->cur_frames = jack_frame_time(self->jack);
+ info->cur_frames = jack_frame_time (self->jack);
// immediately get alsa'a real time (uhh, why everybody has their on 'real' time)
- snd_seq_get_queue_status(self->seq, self->queue, status);
- alsa_time = snd_seq_queue_status_get_real_time(status);
+ snd_seq_get_queue_status (self->seq, self->queue, status);
+ alsa_time = snd_seq_queue_status_get_real_time (status);
info->alsa_time = alsa_time->tv_sec * NSEC_PER_SEC + alsa_time->tv_nsec;
if (info->period_start + info->nframes < info->cur_frames) {
- int periods_lost = (info->cur_frames - info->period_start) / info->nframes;
+ int periods_lost = (info->cur_frames - info->period_start) / info->nframes;
info->period_start += periods_lost * info->nframes;
- debug_log("xrun detected: %d periods lost\n", periods_lost);
+ debug_log ("xrun detected: %d periods lost\n", periods_lost);
}
}
static
-void add_ports(stream_t *str)
+void add_ports (stream_t *str)
{
port_t *port;
- while (jack_ringbuffer_read(str->new_ports, (char*)&port, sizeof(port))) {
- debug_log("jack: inserted port %s\n", port->name);
- port_insert(str->ports, port);
+
+ while (jack_ringbuffer_read (str->new_ports, (char*)&port, sizeof(port))) {
+ debug_log ("jack: inserted port %s\n", port->name);
+ port_insert (str->ports, port);
}
}
static
-void jack_process(alsa_seqmidi_t *self, struct process_info *info)
+void jack_process (alsa_seqmidi_t *self, struct process_info *info)
{
stream_t *str = &self->stream[info->dir];
port_jack_func process = port_type[info->dir].jack_func;
- int i, del=0;
+ int i, del = 0;
- add_ports(str);
+ add_ports (str);
// process ports
- for (i=0; i<PORT_HASH_SIZE; ++i) {
+ for (i = 0; i < PORT_HASH_SIZE; ++i) {
port_t **pport = &str->ports[i];
while (*pport) {
port_t *port = *pport;
- port->jack_buf = jack_port_get_buffer(port->jack_port, info->nframes);
- if (info->dir == PORT_INPUT)
- jack_midi_clear_buffer(port->jack_buf);
+ port->jack_buf = jack_port_get_buffer (port->jack_port, info->nframes);
+ if (info->dir == PORT_INPUT) {
+ jack_midi_clear_buffer (port->jack_buf);
+ }
- if (!port->is_dead)
+ if (!port->is_dead) {
(*process)(self, port, info);
- else if (jack_ringbuffer_write_space(self->port_del) >= sizeof(port)) {
- debug_log("jack: removed port %s\n", port->name);
+ } else if (jack_ringbuffer_write_space (self->port_del) >= sizeof(port)) {
+ debug_log ("jack: removed port %s\n", port->name);
*pport = port->next;
- jack_ringbuffer_write(self->port_del, (char*)&port, sizeof(port));
+ jack_ringbuffer_write (self->port_del, (char*)&port, sizeof(port));
del++;
continue;
}
@@ -725,57 +754,62 @@ void jack_process(alsa_seqmidi_t *self, struct process_info *info)
}
}
- if (del)
- sem_post(&self->port_sem);
+ if (del) {
+ sem_post (&self->port_sem);
+ }
}
/*
* ============================ Input ==============================
*/
static
-void do_jack_input(alsa_seqmidi_t *self, port_t *port, struct process_info *info)
+void do_jack_input (alsa_seqmidi_t *self, port_t *port, struct process_info *info)
{
// process port->early_events
alsa_midi_event_t ev;
- while (jack_ringbuffer_read(port->early_events, (char*)&ev, sizeof(ev))) {
+
+ while (jack_ringbuffer_read (port->early_events, (char*)&ev, sizeof(ev))) {
jack_midi_data_t* buf;
jack_nframes_t time = ev.time - info->period_start;
- if (time < 0)
+ if (time < 0) {
time = 0;
- else if (time >= info->nframes)
+ } else if (time >= info->nframes) {
time = info->nframes - 1;
- buf = jack_midi_event_reserve(port->jack_buf, time, ev.size);
- if (buf)
- jack_ringbuffer_read(port->early_events, (char*)buf, ev.size);
- else
- jack_ringbuffer_read_advance(port->early_events, ev.size);
- debug_log("input: it's time for %d bytes at %d\n", ev.size, time);
+ }
+ buf = jack_midi_event_reserve (port->jack_buf, time, ev.size);
+ if (buf) {
+ jack_ringbuffer_read (port->early_events, (char*)buf, ev.size);
+ } else {
+ jack_ringbuffer_read_advance (port->early_events, ev.size);
+ }
+ debug_log ("input: it's time for %d bytes at %d\n", ev.size, time);
}
}
static
-void port_event(alsa_seqmidi_t *self, snd_seq_event_t *ev)
+void port_event (alsa_seqmidi_t *self, snd_seq_event_t *ev)
{
const snd_seq_addr_t addr = ev->data.addr;
- if (addr.client == self->client_id)
+ if (addr.client == self->client_id) {
return;
+ }
if (ev->type == SND_SEQ_EVENT_PORT_START || ev->type == SND_SEQ_EVENT_PORT_CHANGE) {
- assert (jack_ringbuffer_write_space(self->port_add) >= sizeof(addr));
+ assert (jack_ringbuffer_write_space (self->port_add) >= sizeof(addr));
- debug_log("port_event: add/change %d:%d\n", addr.client, addr.port);
- jack_ringbuffer_write(self->port_add, (char*)&addr, sizeof(addr));
- sem_post(&self->port_sem);
+ debug_log ("port_event: add/change %d:%d\n", addr.client, addr.port);
+ jack_ringbuffer_write (self->port_add, (char*)&addr, sizeof(addr));
+ sem_post (&self->port_sem);
} else if (ev->type == SND_SEQ_EVENT_PORT_EXIT) {
- debug_log("port_event: del %d:%d\n", addr.client, addr.port);
- port_setdead(self->stream[PORT_INPUT].ports, addr);
- port_setdead(self->stream[PORT_OUTPUT].ports, addr);
+ debug_log ("port_event: del %d:%d\n", addr.client, addr.port);
+ port_setdead (self->stream[PORT_INPUT].ports, addr);
+ port_setdead (self->stream[PORT_OUTPUT].ports, addr);
}
}
static
-void input_event(alsa_seqmidi_t *self, snd_seq_event_t *alsa_event, struct process_info* info)
+void input_event (alsa_seqmidi_t *self, snd_seq_event_t *alsa_event, struct process_info* info)
{
jack_midi_data_t data[MAX_EVENT_SIZE];
stream_t *str = &self->stream[PORT_INPUT];
@@ -784,17 +818,19 @@ void input_event(alsa_seqmidi_t *self, snd_seq_event_t *alsa_event, struct proce
int64_t frame_offset, event_frame;
port_t *port;
- port = port_get(str->ports, alsa_event->source);
- if (!port)
+ port = port_get (str->ports, alsa_event->source);
+ if (!port) {
return;
+ }
/*
* RPNs, NRPNs, Bank Change, etc. need special handling
* but seems, ALSA does it for us already.
*/
- snd_midi_event_reset_decode(str->codec);
- if ((size = snd_midi_event_decode(str->codec, data, sizeof(data), alsa_event))<0)
+ snd_midi_event_reset_decode (str->codec);
+ if ((size = snd_midi_event_decode (str->codec, data, sizeof(data), alsa_event)) < 0) {
return;
+ }
// fixup NoteOn with vel 0
if ((data[0] & 0xF0) == 0x90 && data[2] == 0x00) {
@@ -807,46 +843,49 @@ void input_event(alsa_seqmidi_t *self, snd_seq_event_t *alsa_event, struct proce
frame_offset = (info->sample_rate * time_offset) / NSEC_PER_SEC;
event_frame = (int64_t)info->cur_frames - info->period_start - frame_offset + info->nframes;
- debug_log("input: %d bytes at event_frame=%d\n", (int)size, (int)event_frame);
+ debug_log ("input: %d bytes at event_frame=%d\n", (int)size, (int)event_frame);
if (event_frame >= info->nframes &&
- jack_ringbuffer_write_space(port->early_events) >= (sizeof(alsa_midi_event_t) + size)) {
+ jack_ringbuffer_write_space (port->early_events) >= (sizeof(alsa_midi_event_t) + size)) {
alsa_midi_event_t ev;
ev.time = event_frame + info->period_start;
ev.size = size;
- jack_ringbuffer_write(port->early_events, (char*)&ev, sizeof(ev));
- jack_ringbuffer_write(port->early_events, (char*)data, size);
- debug_log("postponed to next frame +%d\n", (int) (event_frame - info->nframes));
+ jack_ringbuffer_write (port->early_events, (char*)&ev, sizeof(ev));
+ jack_ringbuffer_write (port->early_events, (char*)data, size);
+ debug_log ("postponed to next frame +%d\n", (int)(event_frame - info->nframes));
return;
}
- if (event_frame < 0)
+ if (event_frame < 0) {
event_frame = 0;
- else if (event_frame >= info->nframes)
+ } else if (event_frame >= info->nframes) {
event_frame = info->nframes - 1;
+ }
- jack_midi_event_write(port->jack_buf, event_frame, data, size);
+ jack_midi_event_write (port->jack_buf, event_frame, data, size);
}
static
-void alsa_seqmidi_read(alsa_midi_t *m, jack_nframes_t nframes)
+void alsa_seqmidi_read (alsa_midi_t *m, jack_nframes_t nframes)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
int res;
snd_seq_event_t *event;
struct process_info info;
- if (!self->keep_walking)
+ if (!self->keep_walking) {
return;
+ }
- set_process_info(&info, self, PORT_INPUT, nframes);
- jack_process(self, &info);
+ set_process_info (&info, self, PORT_INPUT, nframes);
+ jack_process (self, &info);
- while ((res = snd_seq_event_input(self->seq, &event))>0) {
- if (event->source.client == SND_SEQ_CLIENT_SYSTEM)
- port_event(self, event);
- else
- input_event(self, event, &info);
+ while ((res = snd_seq_event_input (self->seq, &event)) > 0) {
+ if (event->source.client == SND_SEQ_CLIENT_SYSTEM) {
+ port_event (self, event);
+ } else {
+ input_event (self, event, &info);
+ }
}
}
@@ -855,12 +894,13 @@ void alsa_seqmidi_read(alsa_midi_t *m, jack_nframes_t nframes)
*/
static
-void do_jack_output(alsa_seqmidi_t *self, port_t *port, struct process_info* info)
+void do_jack_output (alsa_seqmidi_t *self, port_t *port, struct process_info* info)
{
stream_t *str = &self->stream[info->dir];
- int nevents = jack_midi_get_event_count(port->jack_buf);
+ int nevents = jack_midi_get_event_count (port->jack_buf);
int i;
- for (i=0; i<nevents; ++i) {
+
+ for (i = 0; i < nevents; ++i) {
jack_midi_event_t jack_event;
snd_seq_event_t alsa_event;
int64_t frame_offset;
@@ -868,21 +908,22 @@ void do_jack_output(alsa_seqmidi_t *self, port_t *port, struct process_info* inf
snd_seq_real_time_t out_rt;
int err;
- jack_midi_event_get(&jack_event, port->jack_buf, i);
+ jack_midi_event_get (&jack_event, port->jack_buf, i);
- snd_seq_ev_clear(&alsa_event);
- snd_midi_event_reset_encode(str->codec);
- if (!snd_midi_event_encode(str->codec, jack_event.buffer, jack_event.size, &alsa_event))
+ snd_seq_ev_clear (&alsa_event);
+ snd_midi_event_reset_encode (str->codec);
+ if (!snd_midi_event_encode (str->codec, jack_event.buffer, jack_event.size, &alsa_event)) {
continue; // invalid event
- snd_seq_ev_set_source(&alsa_event, self->port_id);
- snd_seq_ev_set_dest(&alsa_event, port->remote.client, port->remote.port);
+ }
+ snd_seq_ev_set_source (&alsa_event, self->port_id);
+ snd_seq_ev_set_dest (&alsa_event, port->remote.client, port->remote.port);
/* NOTE: in case of xrun it could become negative, so it is essential to use signed type! */
frame_offset = (int64_t)jack_event.time + info->period_start + info->nframes - info->cur_frames;
if (frame_offset < 0) {
frame_offset = info->nframes + jack_event.time;
- error_log("internal xrun detected: frame_offset = %"PRId64"\n", frame_offset);
+ error_log ("internal xrun detected: frame_offset = %" PRId64 "\n", frame_offset);
}
/* Ken Ellinwood reported problems with this assert.
* Seems, magic 2 should be replaced with nperiods. */
@@ -894,32 +935,34 @@ void do_jack_output(alsa_seqmidi_t *self, port_t *port, struct process_info* inf
// we should use absolute time to prevent reordering caused by rounding errors
if (out_time < port->last_out_time) {
- debug_log("alsa_out: limiting out_time %lld at %lld\n", out_time, port->last_out_time);
+ debug_log ("alsa_out: limiting out_time %lld at %lld\n", out_time, port->last_out_time);
out_time = port->last_out_time;
- } else
+ } else {
port->last_out_time = out_time;
+ }
out_rt.tv_nsec = out_time % NSEC_PER_SEC;
out_rt.tv_sec = out_time / NSEC_PER_SEC;
- snd_seq_ev_schedule_real(&alsa_event, self->queue, 0, &out_rt);
+ snd_seq_ev_schedule_real (&alsa_event, self->queue, 0, &out_rt);
- err = snd_seq_event_output(self->seq, &alsa_event);
+ err = snd_seq_event_output (self->seq, &alsa_event);
- debug_log("alsa_out: written %d bytes to %s at %d (%lld): %d %s\n",
- jack_event.size, port->name, (int)frame_offset, out_time - info->alsa_time, err, err < 0 ? snd_strerror(err) : "bytes queued");
+ debug_log ("alsa_out: written %d bytes to %s at %d (%lld): %d %s\n",
+ jack_event.size, port->name, (int)frame_offset, out_time - info->alsa_time, err, err < 0 ? snd_strerror (err) : "bytes queued");
}
}
static
-void alsa_seqmidi_write(alsa_midi_t *m, jack_nframes_t nframes)
+void alsa_seqmidi_write (alsa_midi_t *m, jack_nframes_t nframes)
{
- alsa_seqmidi_t *self = (alsa_seqmidi_t*) m;
+ alsa_seqmidi_t *self = (alsa_seqmidi_t*)m;
struct process_info info;
- if (!self->keep_walking)
+ if (!self->keep_walking) {
return;
+ }
- set_process_info(&info, self, PORT_OUTPUT, nframes);
- jack_process(self, &info);
- snd_seq_drain_output(self->seq);
+ set_process_info (&info, self, PORT_OUTPUT, nframes);
+ jack_process (self, &info);
+ snd_seq_drain_output (self->seq);
}
diff --git a/drivers/am/midi_pack.h b/drivers/am/midi_pack.h
index 6fb704b..d75c18e 100644
--- a/drivers/am/midi_pack.h
+++ b/drivers/am/midi_pack.h
@@ -27,20 +27,21 @@ typedef struct {
} midi_pack_t;
static inline
-void midi_pack_reset(midi_pack_t *p)
+void midi_pack_reset (midi_pack_t *p)
{
p->running_status = 0;
}
static
-void midi_pack_event(midi_pack_t *p, jack_midi_event_t *e)
+void midi_pack_event (midi_pack_t *p, jack_midi_event_t *e)
{
if (e->buffer[0] >= 0x80 && e->buffer[0] < 0xF0) { // Voice Message
if (e->buffer[0] == p->running_status) {
e->buffer++;
e->size--;
- } else
+ } else {
p->running_status = e->buffer[0];
+ }
} else if (e->buffer[0] < 0xF8) { // not System Realtime
p->running_status = 0;
}
diff --git a/drivers/am/midi_unpack.h b/drivers/am/midi_unpack.h
index c917f4d..7573a54 100644
--- a/drivers/am/midi_unpack.h
+++ b/drivers/am/midi_unpack.h
@@ -32,7 +32,7 @@ typedef struct {
} midi_unpack_t;
static inline
-void midi_unpack_init(midi_unpack_t *u)
+void midi_unpack_init (midi_unpack_t *u)
{
u->pos = 0;
u->size = sizeof(u->data);
@@ -40,102 +40,93 @@ void midi_unpack_init(midi_unpack_t *u)
}
static inline
-void midi_unpack_reset(midi_unpack_t *u)
+void midi_unpack_reset (midi_unpack_t *u)
{
u->pos = 0;
u->need = u->size;
}
static const unsigned char midi_voice_len[] = {
- 3, /*0x80 Note Off*/
- 3, /*0x90 Note On*/
- 3, /*0xA0 Aftertouch*/
- 3, /*0xB0 Control Change*/
- 2, /*0xC0 Program Change*/
- 2, /*0xD0 Channel Pressure*/
- 3, /*0xE0 Pitch Wheel*/
- 1 /*0xF0 System*/
+ 3, /*0x80 Note Off*/
+ 3, /*0x90 Note On*/
+ 3, /*0xA0 Aftertouch*/
+ 3, /*0xB0 Control Change*/
+ 2, /*0xC0 Program Change*/
+ 2, /*0xD0 Channel Pressure*/
+ 3, /*0xE0 Pitch Wheel*/
+ 1 /*0xF0 System*/
};
static const unsigned char midi_system_len[] = {
- 0, /*0xF0 System Exclusive Start*/
- 2, /*0xF1 MTC Quarter Frame*/
- 3, /*0xF2 Song Postion*/
- 2, /*0xF3 Song Select*/
- 0, /*0xF4 undefined*/
- 0, /*0xF5 undefined*/
- 1, /*0xF6 Tune Request*/
- 1 /*0xF7 System Exlusive End*/
+ 0, /*0xF0 System Exclusive Start*/
+ 2, /*0xF1 MTC Quarter Frame*/
+ 3, /*0xF2 Song Postion*/
+ 2, /*0xF3 Song Select*/
+ 0, /*0xF4 undefined*/
+ 0, /*0xF5 undefined*/
+ 1, /*0xF6 Tune Request*/
+ 1 /*0xF7 System Exlusive End*/
};
static
-int midi_unpack_buf(midi_unpack_t *buf, const unsigned char *data, int len, void *jack_port_buf, jack_nframes_t time)
+int midi_unpack_buf (midi_unpack_t *buf, const unsigned char *data, int len, void *jack_port_buf, jack_nframes_t time)
{
int i;
- for (i=0; i<len; ++i)
- {
+
+ for (i = 0; i < len; ++i) {
const unsigned char byte = data[i];
- if (byte >= 0xF8) // system realtime
- {
- jack_midi_event_write(jack_port_buf, time, &data[i], 1);
+ if (byte >= 0xF8) { // system realtime
+ jack_midi_event_write (jack_port_buf, time, &data[i], 1);
//jack_error("midi_unpack: written system relatime event\n");
//midi_input_write(in, &data[i], 1);
- }
- else if (byte < 0x80) // data
- {
+ } else if (byte < 0x80) { // data
assert (buf->pos < buf->size);
buf->data[buf->pos++] = byte;
- }
- else if (byte < 0xF0) // voice
- {
+ } else if (byte < 0xF0) { // voice
assert (byte >= 0x80 && byte < 0xF0);
//buf->need = ((byte|0x0F) == 0xCF || (byte|0x0F)==0xDF) ? 2 : 3;
- buf->need = midi_voice_len[(byte-0x80)>>4];
+ buf->need = midi_voice_len[(byte - 0x80) >> 4];
buf->data[0] = byte;
buf->pos = 1;
- }
- else if (byte == 0xF7) // sysex end
- {
+ } else if (byte == 0xF7) { // sysex end
assert (buf->pos < buf->size);
buf->data[buf->pos++] = byte;
buf->need = buf->pos;
- }
- else
- {
+ } else {
assert (byte >= 0xF0 && byte < 0xF8);
buf->pos = 1;
buf->data[0] = byte;
buf->need = midi_system_len[byte - 0xF0];
- if (!buf->need)
+ if (!buf->need) {
buf->need = buf->size;
+ }
}
- if (buf->pos == buf->need)
- {
+ if (buf->pos == buf->need) {
// TODO: deal with big sysex'es (they are silently dropped for now)
- if (buf->data[0] >= 0x80 || (buf->data[0]==0xF0 && buf->data[buf->pos-1] == 0xF7)) {
+ if (buf->data[0] >= 0x80 || (buf->data[0] == 0xF0 && buf->data[buf->pos - 1] == 0xF7)) {
/* convert Note On with velocity 0 to Note Off */
if ((buf->data[0] & 0xF0) == 0x90 && buf->data[2] == 0) {
// we use temp array here to keep running status in sync
jack_midi_data_t temp[3] = { 0x80, 0, 0x40 };
temp[0] |= buf->data[0] & 0x0F;
temp[1] = buf->data[1];
- jack_midi_event_write(jack_port_buf, time, temp, 3);
- } else
- jack_midi_event_write(jack_port_buf, time, &buf->data[0], buf->pos);
+ jack_midi_event_write (jack_port_buf, time, temp, 3);
+ } else {
+ jack_midi_event_write (jack_port_buf, time, &buf->data[0], buf->pos);
+ }
//jack_error("midi_unpack: written %d-byte event\n", buf->pos);
//midi_input_write(in, &buf->data[0], buf->pos);
}
/* keep running status */
- if (buf->data[0] >= 0x80 && buf->data[0] < 0xF0)
+ if (buf->data[0] >= 0x80 && buf->data[0] < 0xF0) {
buf->pos = 1;
- else
- {
+ } else {
buf->pos = 0;
buf->need = buf->size;
}
}
}
- assert (i==len);
+ assert (i == len);
return i;
}
diff --git a/drivers/coreaudio/coreaudio_driver.c b/drivers/coreaudio/coreaudio_driver.c
index f343c97..7f16304 100755..100644
--- a/drivers/coreaudio/coreaudio_driver.c
+++ b/drivers/coreaudio/coreaudio_driver.c
@@ -1,52 +1,52 @@
/*
- Copyright � Grame, 2003.
- Copyright � Johnny Petrantoni, 2003.
-
- 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.
-
- Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France
- grame@rd.grame.fr
-
- Johnny Petrantoni, johnny@lato-b.com - Italy, Rome.
-
- Jan 30, 2004: Johnny Petrantoni: first code of the coreaudio driver, based on portaudio driver by Stephane Letz.
- Feb 02, 2004: Johnny Petrantoni: fixed null cycle, removed double copy of buffers in AudioRender, the driver works fine (tested with Built-in Audio and Hammerfall RME), but no cpu load is displayed.
- Feb 03, 2004: Johnny Petrantoni: some little fix.
- Feb 03, 2004: Stephane Letz: some fix in AudioRender.cpp code.
- Feb 03, 2004: Johnny Petrantoni: removed the default device stuff (useless, in jackosx, because JackPilot manages this behavior), the device must be specified. and all parameter must be correct.
- Feb 04, 2004: Johnny Petrantoni: now the driver supports interfaces with multiple interleaved streams (such as the MOTU 828).
- Nov 05, 2004: S.Letz: correct management of -I option for use with JackPilot.
- Nov 15, 2004: S.Letz: Set a default value for deviceID.
- Nov 30, 2004: S.Letz: In coreaudio_driver_write : clear to avoid playing dirty buffers when the client does not produce output anymore.
- Dec 05, 2004: S.Letz: XRun detection
- Dec 09, 2004: S.Letz: Dynamic buffer size change
- Dec 23, 2004: S.Letz: Correct bug in dynamic buffer size change : update period_usecs
- Jan 20, 2005: S.Letz: Almost complete rewrite using AUHAL.
- May 20, 2005: S.Letz: Add "systemic" latencies management.
- Jun 06, 2005: S.Letz: Remove the "-I" parameter, change the semantic of "-n" parameter : -n (driver name) now correctly uses the PropertyDeviceUID
- (persistent accross reboot...) as the identifier for the used coreaudio driver.
- Jun 14, 2005: S.Letz: Since the "-I" parameter is not used anymore, rename the "systemic" latencies management parametes "-I" and "-O" like for the ALSA driver.
- Aug 16, 2005: S.Letz: Remove get_device_id_from_num, use get_default_device instead. If the -n option is not used or the device name cannot
- be found, the default device is used. Note: the default device can be used only if both default input and default output are the same.
- Dec 19, 2005: S.Letz: Add -d option (display_device_names).
- Apri 7, 2006: S.Letz: Synchronization with the jackdmp coreaudio driver version: improve half-duplex management.
- May 17, 2006: S.Letz: Minor fix in driver_initialize.
- May 18, 2006: S.Letz: Document sample rate default value.
- May 31, 2006: S.Letz: Apply Rui patch for more consistent driver parameter naming.
- Dec 04, 2007: S.Letz: Fix a bug in sample rate management (occuring in particular with "aggregate" devices).
- Dec 05, 2007: S.Letz: Correct sample_rate management in Open. Better handling in sample_rate change listener.
+ Copyright � Grame, 2003.
+ Copyright � Johnny Petrantoni, 2003.
+
+ 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.
+
+ Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France
+ grame@rd.grame.fr
+
+ Johnny Petrantoni, johnny@lato-b.com - Italy, Rome.
+
+ Jan 30, 2004: Johnny Petrantoni: first code of the coreaudio driver, based on portaudio driver by Stephane Letz.
+ Feb 02, 2004: Johnny Petrantoni: fixed null cycle, removed double copy of buffers in AudioRender, the driver works fine (tested with Built-in Audio and Hammerfall RME), but no cpu load is displayed.
+ Feb 03, 2004: Johnny Petrantoni: some little fix.
+ Feb 03, 2004: Stephane Letz: some fix in AudioRender.cpp code.
+ Feb 03, 2004: Johnny Petrantoni: removed the default device stuff (useless, in jackosx, because JackPilot manages this behavior), the device must be specified. and all parameter must be correct.
+ Feb 04, 2004: Johnny Petrantoni: now the driver supports interfaces with multiple interleaved streams (such as the MOTU 828).
+ Nov 05, 2004: S.Letz: correct management of -I option for use with JackPilot.
+ Nov 15, 2004: S.Letz: Set a default value for deviceID.
+ Nov 30, 2004: S.Letz: In coreaudio_driver_write : clear to avoid playing dirty buffers when the client does not produce output anymore.
+ Dec 05, 2004: S.Letz: XRun detection
+ Dec 09, 2004: S.Letz: Dynamic buffer size change
+ Dec 23, 2004: S.Letz: Correct bug in dynamic buffer size change : update period_usecs
+ Jan 20, 2005: S.Letz: Almost complete rewrite using AUHAL.
+ May 20, 2005: S.Letz: Add "systemic" latencies management.
+ Jun 06, 2005: S.Letz: Remove the "-I" parameter, change the semantic of "-n" parameter : -n (driver name) now correctly uses the PropertyDeviceUID
+ (persistent accross reboot...) as the identifier for the used coreaudio driver.
+ Jun 14, 2005: S.Letz: Since the "-I" parameter is not used anymore, rename the "systemic" latencies management parametes "-I" and "-O" like for the ALSA driver.
+ Aug 16, 2005: S.Letz: Remove get_device_id_from_num, use get_default_device instead. If the -n option is not used or the device name cannot
+ be found, the default device is used. Note: the default device can be used only if both default input and default output are the same.
+ Dec 19, 2005: S.Letz: Add -d option (display_device_names).
+ Apri 7, 2006: S.Letz: Synchronization with the jackdmp coreaudio driver version: improve half-duplex management.
+ May 17, 2006: S.Letz: Minor fix in driver_initialize.
+ May 18, 2006: S.Letz: Document sample rate default value.
+ May 31, 2006: S.Letz: Apply Rui patch for more consistent driver parameter naming.
+ Dec 04, 2007: S.Letz: Fix a bug in sample rate management (occuring in particular with "aggregate" devices).
+ Dec 05, 2007: S.Letz: Correct sample_rate management in Open. Better handling in sample_rate change listener.
*/
#include <stdio.h>
@@ -59,851 +59,864 @@ const int CAVersion = 3;
//#define PRINTDEBUG 1
-static void JCALog(char *fmt, ...)
+static void JCALog (char *fmt, ...)
{
#ifdef PRINTDEBUG
- va_list ap;
- va_start(ap, fmt);
- fprintf(stderr, "JCA: ");
- vfprintf(stderr, fmt, ap);
- va_end(ap);
+ va_list ap;
+ va_start (ap, fmt);
+ fprintf (stderr, "JCA: ");
+ vfprintf (stderr, fmt, ap);
+ va_end (ap);
#endif
}
-static void printError(OSStatus err)
+static void printError (OSStatus err)
{
#ifdef DEBUG
- switch (err) {
- case kAudioHardwareNoError:
- JCALog("error code : kAudioHardwareNoError\n");
- break;
- case kAudioHardwareNotRunningError:
- JCALog("error code : kAudioHardwareNotRunningError\n");
- break;
- case kAudioHardwareUnspecifiedError:
- JCALog("error code : kAudioHardwareUnspecifiedError\n");
- break;
- case kAudioHardwareUnknownPropertyError:
- JCALog("error code : kAudioHardwareUnknownPropertyError\n");
- break;
- case kAudioHardwareBadPropertySizeError:
- JCALog("error code : kAudioHardwareBadPropertySizeError\n");
- break;
- case kAudioHardwareIllegalOperationError:
- JCALog("error code : kAudioHardwareIllegalOperationError\n");
- break;
- case kAudioHardwareBadDeviceError:
- JCALog("error code : kAudioHardwareBadDeviceError\n");
- break;
- case kAudioHardwareBadStreamError:
- JCALog("error code : kAudioHardwareBadStreamError\n");
- break;
- case kAudioDeviceUnsupportedFormatError:
- JCALog("error code : kAudioDeviceUnsupportedFormatError\n");
- break;
- case kAudioDevicePermissionsError:
- JCALog("error code : kAudioDevicePermissionsError\n");
- break;
- default:
- JCALog("error code : unknown %ld\n", err);
- break;
- }
+ switch (err) {
+ case kAudioHardwareNoError:
+ JCALog ("error code : kAudioHardwareNoError\n");
+ break;
+ case kAudioHardwareNotRunningError:
+ JCALog ("error code : kAudioHardwareNotRunningError\n");
+ break;
+ case kAudioHardwareUnspecifiedError:
+ JCALog ("error code : kAudioHardwareUnspecifiedError\n");
+ break;
+ case kAudioHardwareUnknownPropertyError:
+ JCALog ("error code : kAudioHardwareUnknownPropertyError\n");
+ break;
+ case kAudioHardwareBadPropertySizeError:
+ JCALog ("error code : kAudioHardwareBadPropertySizeError\n");
+ break;
+ case kAudioHardwareIllegalOperationError:
+ JCALog ("error code : kAudioHardwareIllegalOperationError\n");
+ break;
+ case kAudioHardwareBadDeviceError:
+ JCALog ("error code : kAudioHardwareBadDeviceError\n");
+ break;
+ case kAudioHardwareBadStreamError:
+ JCALog ("error code : kAudioHardwareBadStreamError\n");
+ break;
+ case kAudioDeviceUnsupportedFormatError:
+ JCALog ("error code : kAudioDeviceUnsupportedFormatError\n");
+ break;
+ case kAudioDevicePermissionsError:
+ JCALog ("error code : kAudioDevicePermissionsError\n");
+ break;
+ default:
+ JCALog ("error code : unknown %ld\n", err);
+ break;
+ }
#endif
}
-static OSStatus get_device_name_from_id(AudioDeviceID id, char name[256])
+static OSStatus get_device_name_from_id (AudioDeviceID id, char name[256])
{
- UInt32 size = sizeof(char) * 256;
- OSStatus res = AudioDeviceGetProperty(id, 0, false,
- kAudioDevicePropertyDeviceName,
- &size,
- &name[0]);
- return res;
+ UInt32 size = sizeof(char) * 256;
+ OSStatus res = AudioDeviceGetProperty (id, 0, false,
+ kAudioDevicePropertyDeviceName,
+ &size,
+ &name[0]);
+
+ return res;
}
-static OSStatus get_device_id_from_uid(char* UID, AudioDeviceID* id)
+static OSStatus get_device_id_from_uid (char* UID, AudioDeviceID* id)
{
UInt32 size = sizeof(AudioValueTranslation);
- CFStringRef inIUD = CFStringCreateWithCString(NULL, UID, CFStringGetSystemEncoding());
+ CFStringRef inIUD = CFStringCreateWithCString (NULL, UID, CFStringGetSystemEncoding ());
AudioValueTranslation value = { &inIUD, sizeof(CFStringRef), id, sizeof(AudioDeviceID) };
+
if (inIUD == NULL) {
return kAudioHardwareUnspecifiedError;
} else {
- OSStatus res = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &size, &value);
- CFRelease(inIUD);
- JCALog("get_device_id_from_uid %s %ld \n", UID, *id);
+ OSStatus res = AudioHardwareGetProperty (kAudioHardwarePropertyDeviceForUID, &size, &value);
+ CFRelease (inIUD);
+ JCALog ("get_device_id_from_uid %s %ld \n", UID, *id);
return (*id == kAudioDeviceUnknown) ? kAudioHardwareBadDeviceError : res;
}
}
-static OSStatus get_default_device(AudioDeviceID * id)
+static OSStatus get_default_device (AudioDeviceID * id)
{
- OSStatus res;
- UInt32 theSize = sizeof(UInt32);
+ OSStatus res;
+ UInt32 theSize = sizeof(UInt32);
AudioDeviceID inDefault;
AudioDeviceID outDefault;
-
- if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice,
- &theSize, &inDefault)) != noErr)
+
+ if ((res = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultInputDevice,
+ &theSize, &inDefault)) != noErr) {
return res;
-
- if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
- &theSize, &outDefault)) != noErr)
+ }
+
+ if ((res = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice,
+ &theSize, &outDefault)) != noErr) {
return res;
-
- JCALog("get_default_device: input %ld output %ld\n", inDefault, outDefault);
-
+ }
+
+ JCALog ("get_default_device: input %ld output %ld\n", inDefault, outDefault);
+
// Get the device only if default input and ouput are the same
if (inDefault == outDefault) {
*id = inDefault;
return noErr;
} else {
- jack_error("Default input and output devices are not the same !!");
+ jack_error ("Default input and output devices are not the same !!");
return kAudioHardwareBadDeviceError;
}
}
-static OSStatus get_default_input_device(AudioDeviceID* id)
+static OSStatus get_default_input_device (AudioDeviceID* id)
{
- OSStatus res;
- UInt32 theSize = sizeof(UInt32);
- AudioDeviceID inDefault;
-
- if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice,
- &theSize, &inDefault)) != noErr)
- return res;
-
- JCALog("get_default_input_device: input = %ld \n", inDefault);
- *id = inDefault;
+ OSStatus res;
+ UInt32 theSize = sizeof(UInt32);
+ AudioDeviceID inDefault;
+
+ if ((res = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultInputDevice,
+ &theSize, &inDefault)) != noErr) {
+ return res;
+ }
+
+ JCALog ("get_default_input_device: input = %ld \n", inDefault);
+ *id = inDefault;
return noErr;
}
-static OSStatus get_default_output_device(AudioDeviceID* id)
+static OSStatus get_default_output_device (AudioDeviceID* id)
{
- OSStatus res;
- UInt32 theSize = sizeof(UInt32);
- AudioDeviceID outDefault;
+ OSStatus res;
+ UInt32 theSize = sizeof(UInt32);
+ AudioDeviceID outDefault;
- if ((res = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
- &theSize, &outDefault)) != noErr)
- return res;
+ if ((res = AudioHardwareGetProperty (kAudioHardwarePropertyDefaultOutputDevice,
+ &theSize, &outDefault)) != noErr) {
+ return res;
+ }
- JCALog("get_default_output_device: output = %ld\n", outDefault);
+ JCALog ("get_default_output_device: output = %ld\n", outDefault);
*id = outDefault;
return noErr;
}
-OSStatus get_total_channels(AudioDeviceID device, int* channelCount, bool isInput)
+OSStatus get_total_channels (AudioDeviceID device, int* channelCount, bool isInput)
{
- OSStatus err = noErr;
- UInt32 outSize;
- Boolean outWritable;
- AudioBufferList* bufferList = 0;
- AudioStreamID* streamList = 0;
- int i, numStream;
-
- err = AudioDeviceGetPropertyInfo(device, 0, isInput, kAudioDevicePropertyStreams, &outSize, &outWritable);
+ OSStatus err = noErr;
+ UInt32 outSize;
+ Boolean outWritable;
+ AudioBufferList* bufferList = 0;
+ AudioStreamID* streamList = 0;
+ int i, numStream;
+
+ err = AudioDeviceGetPropertyInfo (device, 0, isInput, kAudioDevicePropertyStreams, &outSize, &outWritable);
if (err == noErr) {
- streamList = (AudioStreamID*)malloc(outSize);
- numStream = outSize/sizeof(AudioStreamID);
- JCALog("get_total_channels device stream number = %ld numStream = %ld\n", device, numStream);
- err = AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyStreams, &outSize, streamList);
+ streamList = (AudioStreamID*)malloc (outSize);
+ numStream = outSize / sizeof(AudioStreamID);
+ JCALog ("get_total_channels device stream number = %ld numStream = %ld\n", device, numStream);
+ err = AudioDeviceGetProperty (device, 0, isInput, kAudioDevicePropertyStreams, &outSize, streamList);
if (err == noErr) {
AudioStreamBasicDescription streamDesc;
outSize = sizeof(AudioStreamBasicDescription);
for (i = 0; i < numStream; i++) {
- err = AudioStreamGetProperty(streamList[i], 0, kAudioDevicePropertyStreamFormat, &outSize, &streamDesc);
- JCALog("get_total_channels streamDesc mFormatFlags = %ld mChannelsPerFrame = %ld\n", streamDesc.mFormatFlags, streamDesc.mChannelsPerFrame);
+ err = AudioStreamGetProperty (streamList[i], 0, kAudioDevicePropertyStreamFormat, &outSize, &streamDesc);
+ JCALog ("get_total_channels streamDesc mFormatFlags = %ld mChannelsPerFrame = %ld\n", streamDesc.mFormatFlags, streamDesc.mChannelsPerFrame);
}
}
}
-
- *channelCount = 0;
- err = AudioDeviceGetPropertyInfo(device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, &outWritable);
- if (err == noErr) {
- bufferList = (AudioBufferList*)malloc(outSize);
- err = AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, bufferList);
- if (err == noErr) {
- for (i = 0; i < bufferList->mNumberBuffers; i++)
- *channelCount += bufferList->mBuffers[i].mNumberChannels;
- }
- }
-
- if (streamList)
- free(streamList);
- if (bufferList)
- free(bufferList);
-
- return err;
+
+ *channelCount = 0;
+ err = AudioDeviceGetPropertyInfo (device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, &outWritable);
+ if (err == noErr) {
+ bufferList = (AudioBufferList*)malloc (outSize);
+ err = AudioDeviceGetProperty (device, 0, isInput, kAudioDevicePropertyStreamConfiguration, &outSize, bufferList);
+ if (err == noErr) {
+ for (i = 0; i < bufferList->mNumberBuffers; i++)
+ *channelCount += bufferList->mBuffers[i].mNumberChannels;
+ }
+ }
+
+ if (streamList) {
+ free (streamList);
+ }
+ if (bufferList) {
+ free (bufferList);
+ }
+
+ return err;
}
-static OSStatus display_device_names()
+static OSStatus display_device_names ()
{
UInt32 size;
Boolean isWritable;
int i, deviceNum;
OSStatus err;
CFStringRef UIname;
-
- err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &size, &isWritable);
- if (err != noErr)
+
+ err = AudioHardwareGetPropertyInfo (kAudioHardwarePropertyDevices, &size, &isWritable);
+ if (err != noErr) {
return err;
-
- deviceNum = size/sizeof(AudioDeviceID);
+ }
+
+ deviceNum = size / sizeof(AudioDeviceID);
AudioDeviceID devices[deviceNum];
-
- err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &size, devices);
- if (err != noErr)
+
+ err = AudioHardwareGetProperty (kAudioHardwarePropertyDevices, &size, devices);
+ if (err != noErr) {
return err;
-
+ }
+
for (i = 0; i < deviceNum; i++) {
- char device_name[256];
+ char device_name[256];
char internal_name[256];
-
+
size = sizeof(CFStringRef);
UIname = NULL;
- err = AudioDeviceGetProperty(devices[i], 0, false, kAudioDevicePropertyDeviceUID, &size, &UIname);
+ err = AudioDeviceGetProperty (devices[i], 0, false, kAudioDevicePropertyDeviceUID, &size, &UIname);
if (err == noErr) {
- CFStringGetCString(UIname, internal_name, 256, CFStringGetSystemEncoding());
+ CFStringGetCString (UIname, internal_name, 256, CFStringGetSystemEncoding ());
} else {
goto error;
}
-
+
size = 256;
- err = AudioDeviceGetProperty(devices[i], 0, false, kAudioDevicePropertyDeviceName, &size, device_name);
- if (err != noErr)
- return err;
- jack_info("ICI");
- jack_info("Device name = \'%s\', internal_name = \'%s\' (to be used as -d parameter)", device_name, internal_name);
+ err = AudioDeviceGetProperty (devices[i], 0, false, kAudioDevicePropertyDeviceName, &size, device_name);
+ if (err != noErr) {
+ return err;
+ }
+ jack_info ("ICI");
+ jack_info ("Device name = \'%s\', internal_name = \'%s\' (to be used as -d parameter)", device_name, internal_name);
}
-
+
return noErr;
error:
- if (UIname != NULL)
- CFRelease(UIname);
+ if (UIname != NULL) {
+ CFRelease (UIname);
+ }
return err;
}
-static OSStatus render(void *inRefCon,
- AudioUnitRenderActionFlags *ioActionFlags,
- const AudioTimeStamp *inTimeStamp,
- UInt32 inBusNumber,
- UInt32 inNumberFrames,
- AudioBufferList *ioData)
+static OSStatus render (void *inRefCon,
+ AudioUnitRenderActionFlags *ioActionFlags,
+ const AudioTimeStamp *inTimeStamp,
+ UInt32 inBusNumber,
+ UInt32 inNumberFrames,
+ AudioBufferList *ioData)
{
int res, i;
JSList *node;
coreaudio_driver_t* ca_driver = (coreaudio_driver_t*)inRefCon;
- AudioUnitRender(ca_driver->au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, ca_driver->input_list);
-
+
+ AudioUnitRender (ca_driver->au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, ca_driver->input_list);
+
if (ca_driver->xrun_detected > 0) { /* XRun was detected */
- jack_time_t current_time = ca_driver->engine->get_microseconds();
- ca_driver->engine->delay(ca_driver->engine, current_time -
- (ca_driver->last_wait_ust + ca_driver->period_usecs));
+ jack_time_t current_time = ca_driver->engine->get_microseconds ();
+ ca_driver->engine->delay (ca_driver->engine, current_time -
+ (ca_driver->last_wait_ust + ca_driver->period_usecs));
ca_driver->last_wait_ust = current_time;
ca_driver->xrun_detected = 0;
return 0;
- } else {
- ca_driver->last_wait_ust = ca_driver->engine->get_microseconds();
- ca_driver->engine->transport_cycle_start(ca_driver->engine,
- ca_driver->engine->get_microseconds());
- res = ca_driver->engine->run_cycle(ca_driver->engine, inNumberFrames, 0);
+ } else {
+ ca_driver->last_wait_ust = ca_driver->engine->get_microseconds ();
+ ca_driver->engine->transport_cycle_start (ca_driver->engine,
+ ca_driver->engine->get_microseconds ());
+ res = ca_driver->engine->run_cycle (ca_driver->engine, inNumberFrames, 0);
}
-
+
if (ca_driver->null_cycle_occured) {
ca_driver->null_cycle_occured = 0;
- for (i = 0; i < ca_driver->playback_nchannels; i++) {
- memset((float*)ioData->mBuffers[i].mData, 0, sizeof(float) * inNumberFrames);
- }
+ for (i = 0; i < ca_driver->playback_nchannels; i++)
+ memset ((float*)ioData->mBuffers[i].mData, 0, sizeof(float) * inNumberFrames);
} else {
- for (i = 0, node = ca_driver->playback_ports; i < ca_driver->playback_nchannels; i++, node = jack_slist_next(node)) {
- memcpy((float*)ioData->mBuffers[i].mData,
- (jack_default_audio_sample_t*)jack_port_get_buffer(((jack_port_t *) node->data), inNumberFrames),
- sizeof(float) * inNumberFrames);
+ for (i = 0, node = ca_driver->playback_ports; i < ca_driver->playback_nchannels; i++, node = jack_slist_next (node)) {
+ memcpy ((float*)ioData->mBuffers[i].mData,
+ (jack_default_audio_sample_t*)jack_port_get_buffer (((jack_port_t*)node->data), inNumberFrames),
+ sizeof(float) * inNumberFrames);
}
}
-
+
return res;
}
-static OSStatus render_input(void *inRefCon,
- AudioUnitRenderActionFlags *ioActionFlags,
- const AudioTimeStamp *inTimeStamp,
- UInt32 inBusNumber,
- UInt32 inNumberFrames,
- AudioBufferList *ioData)
+static OSStatus render_input (void *inRefCon,
+ AudioUnitRenderActionFlags *ioActionFlags,
+ const AudioTimeStamp *inTimeStamp,
+ UInt32 inBusNumber,
+ UInt32 inNumberFrames,
+ AudioBufferList *ioData)
{
coreaudio_driver_t* ca_driver = (coreaudio_driver_t*)inRefCon;
- AudioUnitRender(ca_driver->au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, ca_driver->input_list);
+
+ AudioUnitRender (ca_driver->au_hal, ioActionFlags, inTimeStamp, 1, inNumberFrames, ca_driver->input_list);
if (ca_driver->xrun_detected > 0) { /* XRun was detected */
- jack_time_t current_time = ca_driver->engine->get_microseconds();
- ca_driver->engine->delay(ca_driver->engine, current_time -
- (ca_driver->last_wait_ust + ca_driver->period_usecs));
+ jack_time_t current_time = ca_driver->engine->get_microseconds ();
+ ca_driver->engine->delay (ca_driver->engine, current_time -
+ (ca_driver->last_wait_ust + ca_driver->period_usecs));
ca_driver->last_wait_ust = current_time;
ca_driver->xrun_detected = 0;
return 0;
- } else {
- ca_driver->last_wait_ust = ca_driver->engine->get_microseconds();
- ca_driver->engine->transport_cycle_start(ca_driver->engine,
- ca_driver->engine->get_microseconds());
- return ca_driver->engine->run_cycle(ca_driver->engine, inNumberFrames, 0);
+ } else {
+ ca_driver->last_wait_ust = ca_driver->engine->get_microseconds ();
+ ca_driver->engine->transport_cycle_start (ca_driver->engine,
+ ca_driver->engine->get_microseconds ());
+ return ca_driver->engine->run_cycle (ca_driver->engine, inNumberFrames, 0);
}
}
-static OSStatus sr_notification(AudioDeviceID inDevice,
- UInt32 inChannel,
- Boolean isInput,
- AudioDevicePropertyID inPropertyID,
- void* inClientData)
+static OSStatus sr_notification (AudioDeviceID inDevice,
+ UInt32 inChannel,
+ Boolean isInput,
+ AudioDevicePropertyID inPropertyID,
+ void* inClientData)
{
coreaudio_driver_t* driver = (coreaudio_driver_t*)inClientData;
-
+
switch (inPropertyID) {
- case kAudioDevicePropertyNominalSampleRate: {
- JCALog("JackCoreAudioDriver::SRNotificationCallback kAudioDevicePropertyNominalSampleRate \n");
- driver->state = 1;
- break;
- }
+ case kAudioDevicePropertyNominalSampleRate: {
+ JCALog ("JackCoreAudioDriver::SRNotificationCallback kAudioDevicePropertyNominalSampleRate \n");
+ driver->state = 1;
+ break;
+ }
}
-
+
return noErr;
}
-static OSStatus notification(AudioDeviceID inDevice,
- UInt32 inChannel,
- Boolean isInput,
- AudioDevicePropertyID inPropertyID,
- void* inClientData)
+static OSStatus notification (AudioDeviceID inDevice,
+ UInt32 inChannel,
+ Boolean isInput,
+ AudioDevicePropertyID inPropertyID,
+ void* inClientData)
{
- coreaudio_driver_t* driver = (coreaudio_driver_t*)inClientData;
- switch (inPropertyID) {
-
- case kAudioDeviceProcessorOverload:
- driver->xrun_detected = 1;
- break;
-
- case kAudioDevicePropertyNominalSampleRate: {
- UInt32 outSize = sizeof(Float64);
- Float64 sampleRate;
- AudioStreamBasicDescription srcFormat, dstFormat;
- OSStatus err = AudioDeviceGetProperty(driver->device_id, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate);
- if (err != noErr) {
- jack_error("Cannot get current sample rate");
- return kAudioHardwareUnsupportedOperationError;
- }
- JCALog("JackCoreAudioDriver::NotificationCallback kAudioDevicePropertyNominalSampleRate %ld\n", (long)sampleRate);
- outSize = sizeof(AudioStreamBasicDescription);
-
- // Update SR for input
- err = AudioUnitGetProperty(driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, &outSize);
- if (err != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
- }
- srcFormat.mSampleRate = sampleRate;
- err = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, outSize);
- if (err != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
- }
-
- // Update SR for output
- err = AudioUnitGetProperty(driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, &outSize);
- if (err != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
- }
- dstFormat.mSampleRate = sampleRate;
- err = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, outSize);
- if (err != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
- }
- break;
+ coreaudio_driver_t* driver = (coreaudio_driver_t*)inClientData;
+
+ switch (inPropertyID) {
+
+ case kAudioDeviceProcessorOverload:
+ driver->xrun_detected = 1;
+ break;
+
+ case kAudioDevicePropertyNominalSampleRate: {
+ UInt32 outSize = sizeof(Float64);
+ Float64 sampleRate;
+ AudioStreamBasicDescription srcFormat, dstFormat;
+ OSStatus err = AudioDeviceGetProperty (driver->device_id, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate);
+ if (err != noErr) {
+ jack_error ("Cannot get current sample rate");
+ return kAudioHardwareUnsupportedOperationError;
+ }
+ JCALog ("JackCoreAudioDriver::NotificationCallback kAudioDevicePropertyNominalSampleRate %ld\n", (long)sampleRate);
+ outSize = sizeof(AudioStreamBasicDescription);
+
+ // Update SR for input
+ err = AudioUnitGetProperty (driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, &outSize);
+ if (err != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
+ }
+ srcFormat.mSampleRate = sampleRate;
+ err = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, outSize);
+ if (err != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
}
- }
- return noErr;
+
+ // Update SR for output
+ err = AudioUnitGetProperty (driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, &outSize);
+ if (err != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
+ }
+ dstFormat.mSampleRate = sampleRate;
+ err = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, outSize);
+ if (err != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
+ }
+ break;
+ }
+ }
+ return noErr;
}
static int
-coreaudio_driver_attach(coreaudio_driver_t * driver, jack_engine_t * engine)
+coreaudio_driver_attach (coreaudio_driver_t * driver, jack_engine_t * engine)
{
- jack_port_t *port;
+ jack_port_t *port;
JSList *node;
- int port_flags;
- channel_t chn;
- char buf[JACK_PORT_NAME_SIZE];
+ int port_flags;
+ channel_t chn;
+ char buf[JACK_PORT_NAME_SIZE];
char channel_name[64];
OSStatus err;
UInt32 size;
- UInt32 value1,value2;
- Boolean isWritable;
- jack_latency_range_t range;
-
- driver->engine = engine;
-
- if (driver->engine->set_buffer_size(engine, driver->frames_per_cycle)) {
- jack_error ("coreaudio: cannot set engine buffer size to %d (check MIDI)", driver->frames_per_cycle);
- return -1;
- }
- driver->engine->set_sample_rate(engine, driver->frame_rate);
-
- port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
-
- /*
- if (driver->has_hw_monitoring) {
- port_flags |= JackPortCanMonitor;
- }
- */
-
- for (chn = 0; chn < driver->capture_nchannels; chn++) {
- err = AudioDeviceGetPropertyInfo(driver->device_id, chn + 1, true, kAudioDevicePropertyChannelName, &size, &isWritable);
- if (err == noErr && size > 0) {
- err = AudioDeviceGetProperty(driver->device_id, chn + 1, true, kAudioDevicePropertyChannelName, &size, channel_name);
- if (err != noErr)
- JCALog("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n");
- snprintf(buf, sizeof(buf) - 1, "%s:out_%s%lu", driver->capture_driver_name, channel_name, chn + 1);
+ UInt32 value1, value2;
+ Boolean isWritable;
+ jack_latency_range_t range;
+
+ driver->engine = engine;
+
+ if (driver->engine->set_buffer_size (engine, driver->frames_per_cycle)) {
+ jack_error ("coreaudio: cannot set engine buffer size to %d (check MIDI)", driver->frames_per_cycle);
+ return -1;
+ }
+ driver->engine->set_sample_rate (engine, driver->frame_rate);
+
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
+
+ /*
+ if (driver->has_hw_monitoring) {
+ port_flags |= JackPortCanMonitor;
+ }
+ */
+
+ for (chn = 0; chn < driver->capture_nchannels; chn++) {
+ err = AudioDeviceGetPropertyInfo (driver->device_id, chn + 1, true, kAudioDevicePropertyChannelName, &size, &isWritable);
+ if (err == noErr && size > 0) {
+ err = AudioDeviceGetProperty (driver->device_id, chn + 1, true, kAudioDevicePropertyChannelName, &size, channel_name);
+ if (err != noErr) {
+ JCALog ("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n");
+ }
+ snprintf (buf, sizeof(buf) - 1, "%s:out_%s%lu", driver->capture_driver_name, channel_name, chn + 1);
} else {
- snprintf(buf, sizeof(buf) - 1, "%s:out%lu", driver->capture_driver_name, chn + 1);
+ snprintf (buf, sizeof(buf) - 1, "%s:out%lu", driver->capture_driver_name, chn + 1);
}
-
- if ((port = jack_port_register(driver->client, buf,
- JACK_DEFAULT_AUDIO_TYPE, port_flags,
- 0)) == NULL) {
- jack_error("coreaudio: cannot register port for %s", buf);
+
+ if ((port = jack_port_register (driver->client, buf,
+ JACK_DEFAULT_AUDIO_TYPE, port_flags,
+ 0)) == NULL) {
+ jack_error ("coreaudio: cannot register port for %s", buf);
break;
}
size = sizeof(UInt32);
value1 = value2 = 0;
- err = AudioDeviceGetProperty(driver->device_id, 0, true, kAudioDevicePropertyLatency, &size, &value1);
- if (err != noErr)
- JCALog("AudioDeviceGetProperty kAudioDevicePropertyLatency error \n");
- err = AudioDeviceGetProperty(driver->device_id, 0, true, kAudioDevicePropertySafetyOffset, &size, &value2);
- if (err != noErr)
- JCALog("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n");
-
+ err = AudioDeviceGetProperty (driver->device_id, 0, true, kAudioDevicePropertyLatency, &size, &value1);
+ if (err != noErr) {
+ JCALog ("AudioDeviceGetProperty kAudioDevicePropertyLatency error \n");
+ }
+ err = AudioDeviceGetProperty (driver->device_id, 0, true, kAudioDevicePropertySafetyOffset, &size, &value2);
+ if (err != noErr) {
+ JCALog ("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n");
+ }
+
range.min = range.max = driver->frames_per_cycle + value1 + value2 + driver->capture_frame_latency;
- jack_port_set_latency_range(port, JackCaptureLatency, &range);
+ jack_port_set_latency_range (port, JackCaptureLatency, &range);
driver->capture_ports =
- jack_slist_append(driver->capture_ports, port);
- }
+ jack_slist_append (driver->capture_ports, port);
+ }
- port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
for (chn = 0; chn < driver->playback_nchannels; chn++) {
- err = AudioDeviceGetPropertyInfo(driver->device_id, chn + 1, false, kAudioDevicePropertyChannelName, &size, &isWritable);
- if (err == noErr && size > 0) {
- err = AudioDeviceGetProperty(driver->device_id, chn + 1, false, kAudioDevicePropertyChannelName, &size, channel_name);
- if (err != noErr)
- JCALog("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n");
- snprintf(buf, sizeof(buf) - 1, "%s:in_%s%lu", driver->playback_driver_name, channel_name, chn + 1);
+ err = AudioDeviceGetPropertyInfo (driver->device_id, chn + 1, false, kAudioDevicePropertyChannelName, &size, &isWritable);
+ if (err == noErr && size > 0) {
+ err = AudioDeviceGetProperty (driver->device_id, chn + 1, false, kAudioDevicePropertyChannelName, &size, channel_name);
+ if (err != noErr) {
+ JCALog ("AudioDeviceGetProperty kAudioDevicePropertyChannelName error \n");
+ }
+ snprintf (buf, sizeof(buf) - 1, "%s:in_%s%lu", driver->playback_driver_name, channel_name, chn + 1);
} else {
- snprintf(buf, sizeof(buf) - 1, "%s:in%lu", driver->playback_driver_name, chn + 1);
+ snprintf (buf, sizeof(buf) - 1, "%s:in%lu", driver->playback_driver_name, chn + 1);
}
- if ((port = jack_port_register(driver->client, buf,
- JACK_DEFAULT_AUDIO_TYPE, port_flags,
- 0)) == NULL) {
- jack_error("coreaudio: cannot register port for %s", buf);
+ if ((port = jack_port_register (driver->client, buf,
+ JACK_DEFAULT_AUDIO_TYPE, port_flags,
+ 0)) == NULL) {
+ jack_error ("coreaudio: cannot register port for %s", buf);
break;
}
size = sizeof(UInt32);
value1 = value2 = 0;
- err = AudioDeviceGetProperty(driver->device_id, 0, false, kAudioDevicePropertyLatency, &size, &value1);
- if (err != noErr)
- JCALog("AudioDeviceGetProperty kAudioDevicePropertyLatency error \n");
- err = AudioDeviceGetProperty(driver->device_id, 0, false, kAudioDevicePropertySafetyOffset, &size, &value2);
- if (err != noErr)
- JCALog("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n");
-
+ err = AudioDeviceGetProperty (driver->device_id, 0, false, kAudioDevicePropertyLatency, &size, &value1);
+ if (err != noErr) {
+ JCALog ("AudioDeviceGetProperty kAudioDevicePropertyLatency error \n");
+ }
+ err = AudioDeviceGetProperty (driver->device_id, 0, false, kAudioDevicePropertySafetyOffset, &size, &value2);
+ if (err != noErr) {
+ JCALog ("AudioDeviceGetProperty kAudioDevicePropertySafetyOffset error \n");
+ }
+
range.min = range.max = driver->frames_per_cycle + value1 + value2 + driver->playback_frame_latency;
- jack_port_set_latency_range(port, JackCaptureLatency, &range);
+ jack_port_set_latency_range (port, JackCaptureLatency, &range);
driver->playback_ports =
- jack_slist_append(driver->playback_ports, port);
+ jack_slist_append (driver->playback_ports, port);
}
-
+
// Input buffers do no change : prepare them only once
- for (chn = 0, node = driver->capture_ports; chn < driver->capture_nchannels; chn++, node = jack_slist_next(node)) {
- driver->input_list->mBuffers[chn].mData
- = (jack_default_audio_sample_t*)jack_port_get_buffer(((jack_port_t *) node->data), driver->frames_per_cycle);
- }
+ for (chn = 0, node = driver->capture_ports; chn < driver->capture_nchannels; chn++, node = jack_slist_next (node))
+ driver->input_list->mBuffers[chn].mData
+ = (jack_default_audio_sample_t*)jack_port_get_buffer (((jack_port_t*)node->data), driver->frames_per_cycle);
- jack_activate(driver->client);
- return 0;
+ jack_activate (driver->client);
+ return 0;
}
static int
-coreaudio_driver_detach(coreaudio_driver_t * driver, jack_engine_t * engine)
+coreaudio_driver_detach (coreaudio_driver_t * driver, jack_engine_t * engine)
{
- JSList *node;
+ JSList *node;
- if (driver->engine == 0) {
+ if (driver->engine == 0) {
return -1;
- }
+ }
- for (node = driver->capture_ports; node; node = jack_slist_next(node)) {
- jack_port_unregister(driver->client, ((jack_port_t *) node->data));
- }
+ for (node = driver->capture_ports; node; node = jack_slist_next (node))
+ jack_port_unregister (driver->client, ((jack_port_t*)node->data));
- jack_slist_free(driver->capture_ports);
- driver->capture_ports = 0;
+ jack_slist_free (driver->capture_ports);
+ driver->capture_ports = 0;
- for (node = driver->playback_ports; node; node = jack_slist_next(node)) {
- jack_port_unregister(driver->client, ((jack_port_t *) node->data));
- }
+ for (node = driver->playback_ports; node; node = jack_slist_next (node))
+ jack_port_unregister (driver->client, ((jack_port_t*)node->data));
- jack_slist_free(driver->playback_ports);
- driver->playback_ports = 0;
+ jack_slist_free (driver->playback_ports);
+ driver->playback_ports = 0;
- driver->engine = 0;
- return 0;
+ driver->engine = 0;
+ return 0;
}
static int
-coreaudio_driver_null_cycle(coreaudio_driver_t * driver, jack_nframes_t nframes)
+coreaudio_driver_null_cycle (coreaudio_driver_t * driver, jack_nframes_t nframes)
{
driver->null_cycle_occured = 1;
- return 0;
+ return 0;
}
static int
-coreaudio_driver_read(coreaudio_driver_t * driver, jack_nframes_t nframes)
+coreaudio_driver_read (coreaudio_driver_t * driver, jack_nframes_t nframes)
{
- return 0;
+ return 0;
}
static int
-coreaudio_driver_write(coreaudio_driver_t * driver, jack_nframes_t nframes)
+coreaudio_driver_write (coreaudio_driver_t * driver, jack_nframes_t nframes)
{
return 0;
}
-static int coreaudio_driver_audio_start(coreaudio_driver_t * driver)
+static int coreaudio_driver_audio_start (coreaudio_driver_t * driver)
{
- return (AudioOutputUnitStart(driver->au_hal) == noErr) ? 0 : -1;
+ return (AudioOutputUnitStart (driver->au_hal) == noErr) ? 0 : -1;
}
-static int coreaudio_driver_audio_stop(coreaudio_driver_t * driver)
+static int coreaudio_driver_audio_stop (coreaudio_driver_t * driver)
{
- return (AudioOutputUnitStop(driver->au_hal) == noErr) ? 0 : -1;
+ return (AudioOutputUnitStop (driver->au_hal) == noErr) ? 0 : -1;
}
static int
-coreaudio_driver_bufsize(coreaudio_driver_t * driver,
- jack_nframes_t nframes)
+coreaudio_driver_bufsize (coreaudio_driver_t * driver,
+ jack_nframes_t nframes)
{
- /* This gets called from the engine server thread, so it must
- * be serialized with the driver thread. Stopping the audio
- * also stops that thread. */
+ /* This gets called from the engine server thread, so it must
+ * be serialized with the driver thread. Stopping the audio
+ * also stops that thread. */
/*
- TO DO
- */
+ TO DO
+ */
return 0;
}
/** create a new driver instance
-*/
-static jack_driver_t *coreaudio_driver_new(char* name,
- jack_client_t* client,
- jack_nframes_t nframes,
- jack_nframes_t samplerate,
- int capturing,
- int playing,
- int inchannels,
- int outchannels,
- char* capture_driver_uid,
- char* playback_driver_uid,
- jack_nframes_t capture_latency,
- jack_nframes_t playback_latency)
+ */
+static jack_driver_t *coreaudio_driver_new (char* name,
+ jack_client_t* client,
+ jack_nframes_t nframes,
+ jack_nframes_t samplerate,
+ int capturing,
+ int playing,
+ int inchannels,
+ int outchannels,
+ char* capture_driver_uid,
+ char* playback_driver_uid,
+ jack_nframes_t capture_latency,
+ jack_nframes_t playback_latency)
{
- coreaudio_driver_t *driver;
+ coreaudio_driver_t *driver;
OSStatus err = noErr;
ComponentResult err1;
- UInt32 outSize;
+ UInt32 outSize;
UInt32 enableIO;
AudioStreamBasicDescription srcFormat, dstFormat;
Float64 sampleRate;
int in_nChannels = 0;
int out_nChannels = 0;
int i;
-
- driver = (coreaudio_driver_t *) calloc(1, sizeof(coreaudio_driver_t));
- jack_driver_init((jack_driver_t *) driver);
- if (!jack_power_of_two(nframes)) {
- jack_error("CA: -p must be a power of two.");
+ driver = (coreaudio_driver_t*)calloc (1, sizeof(coreaudio_driver_t));
+ jack_driver_init ((jack_driver_t*)driver);
+
+ if (!jack_power_of_two (nframes)) {
+ jack_error ("CA: -p must be a power of two.");
goto error;
- }
+ }
driver->state = 0;
- driver->frames_per_cycle = nframes;
- driver->frame_rate = samplerate;
- driver->capturing = capturing;
- driver->playing = playing;
+ driver->frames_per_cycle = nframes;
+ driver->frame_rate = samplerate;
+ driver->capturing = capturing;
+ driver->playing = playing;
driver->xrun_detected = 0;
driver->null_cycle = 0;
- driver->attach = (JackDriverAttachFunction) coreaudio_driver_attach;
- driver->detach = (JackDriverDetachFunction) coreaudio_driver_detach;
- driver->read = (JackDriverReadFunction) coreaudio_driver_read;
- driver->write = (JackDriverReadFunction) coreaudio_driver_write;
- driver->null_cycle =
- (JackDriverNullCycleFunction) coreaudio_driver_null_cycle;
- driver->bufsize = (JackDriverBufSizeFunction) coreaudio_driver_bufsize;
- driver->start = (JackDriverStartFunction) coreaudio_driver_audio_start;
- driver->stop = (JackDriverStopFunction) coreaudio_driver_audio_stop;
+ driver->attach = (JackDriverAttachFunction)coreaudio_driver_attach;
+ driver->detach = (JackDriverDetachFunction)coreaudio_driver_detach;
+ driver->read = (JackDriverReadFunction)coreaudio_driver_read;
+ driver->write = (JackDriverReadFunction)coreaudio_driver_write;
+ driver->null_cycle =
+ (JackDriverNullCycleFunction)coreaudio_driver_null_cycle;
+ driver->bufsize = (JackDriverBufSizeFunction)coreaudio_driver_bufsize;
+ driver->start = (JackDriverStartFunction)coreaudio_driver_audio_start;
+ driver->stop = (JackDriverStopFunction)coreaudio_driver_audio_stop;
driver->capture_frame_latency = capture_latency;
driver->playback_frame_latency = playback_latency;
-
+
// Duplex
- if (strcmp(capture_driver_uid, "") != 0 && strcmp(playback_driver_uid, "") != 0) {
- JCALog("Open duplex \n");
- if (get_device_id_from_uid(playback_driver_uid, &driver->device_id) != noErr) {
- if (get_default_device(&driver->device_id) != noErr) {
- jack_error("Cannot open default device");
+ if (strcmp (capture_driver_uid, "") != 0 && strcmp (playback_driver_uid, "") != 0) {
+ JCALog ("Open duplex \n");
+ if (get_device_id_from_uid (playback_driver_uid, &driver->device_id) != noErr) {
+ if (get_default_device (&driver->device_id) != noErr) {
+ jack_error ("Cannot open default device");
goto error;
}
}
- if (get_device_name_from_id(driver->device_id, driver->capture_driver_name) != noErr || get_device_name_from_id(driver->device_id, driver->playback_driver_name) != noErr) {
- jack_error("Cannot get device name from device ID");
+ if (get_device_name_from_id (driver->device_id, driver->capture_driver_name) != noErr || get_device_name_from_id (driver->device_id, driver->playback_driver_name) != noErr) {
+ jack_error ("Cannot get device name from device ID");
goto error;
}
-
- // Capture only
- } else if (strcmp(capture_driver_uid, "") != 0) {
- JCALog("Open capture only \n");
- if (get_device_id_from_uid(capture_driver_uid, &driver->device_id) != noErr) {
- if (get_default_input_device(&driver->device_id) != noErr) {
- jack_error("Cannot open default device");
- goto error;
+
+ // Capture only
+ } else if (strcmp (capture_driver_uid, "") != 0) {
+ JCALog ("Open capture only \n");
+ if (get_device_id_from_uid (capture_driver_uid, &driver->device_id) != noErr) {
+ if (get_default_input_device (&driver->device_id) != noErr) {
+ jack_error ("Cannot open default device");
+ goto error;
}
}
- if (get_device_name_from_id(driver->device_id, driver->capture_driver_name) != noErr) {
- jack_error("Cannot get device name from device ID");
+ if (get_device_name_from_id (driver->device_id, driver->capture_driver_name) != noErr) {
+ jack_error ("Cannot get device name from device ID");
goto error;
}
-
- // Playback only
+
+ // Playback only
} else if (playback_driver_uid != NULL) {
- JCALog("Open playback only \n");
- if (get_device_id_from_uid(playback_driver_uid, &driver->device_id) != noErr) {
- if (get_default_output_device(&driver->device_id) != noErr) {
- jack_error("Cannot open default device");
- goto error;
+ JCALog ("Open playback only \n");
+ if (get_device_id_from_uid (playback_driver_uid, &driver->device_id) != noErr) {
+ if (get_default_output_device (&driver->device_id) != noErr) {
+ jack_error ("Cannot open default device");
+ goto error;
}
- }
- if (get_device_name_from_id(driver->device_id, driver->playback_driver_name) != noErr) {
- jack_error("Cannot get device name from device ID");
+ }
+ if (get_device_name_from_id (driver->device_id, driver->playback_driver_name) != noErr) {
+ jack_error ("Cannot get device name from device ID");
goto error;
}
-
- // Use default driver in duplex mode
+
+ // Use default driver in duplex mode
} else {
- JCALog("Open default driver \n");
- if (get_default_device(&driver->device_id) != noErr) {
- jack_error("Cannot open default device");
+ JCALog ("Open default driver \n");
+ if (get_default_device (&driver->device_id) != noErr) {
+ jack_error ("Cannot open default device");
goto error;
}
- if (get_device_name_from_id(driver->device_id, driver->capture_driver_name) != noErr || get_device_name_from_id(driver->device_id, driver->playback_driver_name) != noErr) {
- jack_error("Cannot get device name from device ID");
+ if (get_device_name_from_id (driver->device_id, driver->capture_driver_name) != noErr || get_device_name_from_id (driver->device_id, driver->playback_driver_name) != noErr) {
+ jack_error ("Cannot get device name from device ID");
goto error;
}
}
-
+
driver->client = client;
- driver->period_usecs =
- (((float) driver->frames_per_cycle) / driver->frame_rate) *
+ driver->period_usecs =
+ (((float)driver->frames_per_cycle) / driver->frame_rate) *
1000000.0f;
-
+
if (capturing) {
- err = get_total_channels(driver->device_id, &in_nChannels, true);
- if (err != noErr) {
- jack_error("Cannot get input channel number");
- printError(err);
+ err = get_total_channels (driver->device_id, &in_nChannels, true);
+ if (err != noErr) {
+ jack_error ("Cannot get input channel number");
+ printError (err);
goto error;
- }
+ }
}
-
+
if (playing) {
- err = get_total_channels(driver->device_id, &out_nChannels, false);
- if (err != noErr) {
- jack_error("Cannot get output channel number");
- printError(err);
+ err = get_total_channels (driver->device_id, &out_nChannels, false);
+ if (err != noErr) {
+ jack_error ("Cannot get output channel number");
+ printError (err);
goto error;
- }
+ }
}
-
+
if (inchannels > in_nChannels) {
- jack_error("This device hasn't required input channels inchannels = %ld in_nChannels = %ld", inchannels, in_nChannels);
+ jack_error ("This device hasn't required input channels inchannels = %ld in_nChannels = %ld", inchannels, in_nChannels);
goto error;
- }
-
+ }
+
if (outchannels > out_nChannels) {
- jack_error("This device hasn't required output channels outchannels = %ld out_nChannels = %ld", outchannels, out_nChannels);
+ jack_error ("This device hasn't required output channels outchannels = %ld out_nChannels = %ld", outchannels, out_nChannels);
goto error;
- }
+ }
if (inchannels == 0) {
- JCALog("Setup max in channels = %ld\n", in_nChannels);
- inchannels = in_nChannels;
+ JCALog ("Setup max in channels = %ld\n", in_nChannels);
+ inchannels = in_nChannels;
}
-
+
if (outchannels == 0) {
- JCALog("Setup max out channels = %ld\n", out_nChannels);
- outchannels = out_nChannels;
+ JCALog ("Setup max out channels = %ld\n", out_nChannels);
+ outchannels = out_nChannels;
}
- // Setting buffer size
- outSize = sizeof(UInt32);
- err = AudioDeviceSetProperty(driver->device_id, NULL, 0, false, kAudioDevicePropertyBufferFrameSize, outSize, &nframes);
- if (err != noErr) {
- jack_error("Cannot set buffer size %ld", nframes);
- printError(err);
+ // Setting buffer size
+ outSize = sizeof(UInt32);
+ err = AudioDeviceSetProperty (driver->device_id, NULL, 0, false, kAudioDevicePropertyBufferFrameSize, outSize, &nframes);
+ if (err != noErr) {
+ jack_error ("Cannot set buffer size %ld", nframes);
+ printError (err);
goto error;
- }
+ }
// Set sample rate
outSize = sizeof(Float64);
- err = AudioDeviceGetProperty(driver->device_id, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate);
+ err = AudioDeviceGetProperty (driver->device_id, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, &outSize, &sampleRate);
if (err != noErr) {
- jack_error("Cannot get current sample rate");
- printError(err);
+ jack_error ("Cannot get current sample rate");
+ printError (err);
goto error;
}
if (samplerate != (jack_nframes_t)sampleRate) {
sampleRate = (Float64)samplerate;
-
+
// To get SR change notification
- err = AudioDeviceAddPropertyListener(driver->device_id, 0, true, kAudioDevicePropertyNominalSampleRate, sr_notification, driver);
+ err = AudioDeviceAddPropertyListener (driver->device_id, 0, true, kAudioDevicePropertyNominalSampleRate, sr_notification, driver);
if (err != noErr) {
- jack_error("Error calling AudioDeviceAddPropertyListener with kAudioDevicePropertyNominalSampleRate");
- printError(err);
+ jack_error ("Error calling AudioDeviceAddPropertyListener with kAudioDevicePropertyNominalSampleRate");
+ printError (err);
return -1;
}
- err = AudioDeviceSetProperty(driver->device_id, NULL, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, outSize, &sampleRate);
+ err = AudioDeviceSetProperty (driver->device_id, NULL, 0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, outSize, &sampleRate);
if (err != noErr) {
- jack_error("Cannot set sample rate = %ld", samplerate);
- printError(err);
+ jack_error ("Cannot set sample rate = %ld", samplerate);
+ printError (err);
return -1;
}
-
+
// Waiting for SR change notification
int count = 0;
while (!driver->state && count++ < 100) {
- usleep(100000);
- JCALog("Wait count = %ld\n", count);
+ usleep (100000);
+ JCALog ("Wait count = %ld\n", count);
}
-
+
// Remove SR change notification
- AudioDeviceRemovePropertyListener(driver->device_id, 0, true, kAudioDevicePropertyNominalSampleRate, sr_notification);
+ AudioDeviceRemovePropertyListener (driver->device_id, 0, true, kAudioDevicePropertyNominalSampleRate, sr_notification);
}
- // AUHAL
- ComponentDescription cd = {kAudioUnitType_Output, kAudioUnitSubType_HALOutput, kAudioUnitManufacturer_Apple, 0, 0};
- Component HALOutput = FindNextComponent(NULL, &cd);
+ // AUHAL
+ ComponentDescription cd = { kAudioUnitType_Output, kAudioUnitSubType_HALOutput, kAudioUnitManufacturer_Apple, 0, 0 };
+ Component HALOutput = FindNextComponent (NULL, &cd);
- err1 = OpenAComponent(HALOutput, &driver->au_hal);
- if (err1 != noErr) {
- jack_error("Error calling OpenAComponent");
- printError(err1);
- goto error;
+ err1 = OpenAComponent (HALOutput, &driver->au_hal);
+ if (err1 != noErr) {
+ jack_error ("Error calling OpenAComponent");
+ printError (err1);
+ goto error;
}
- err1 = AudioUnitInitialize(driver->au_hal);
- if (err1 != noErr) {
- jack_error("Cannot initialize AUHAL unit");
- printError(err1);
- goto error;
+ err1 = AudioUnitInitialize (driver->au_hal);
+ if (err1 != noErr) {
+ jack_error ("Cannot initialize AUHAL unit");
+ printError (err1);
+ goto error;
}
- // Start I/O
+ // Start I/O
enableIO = 1;
if (capturing && inchannels > 0) {
- JCALog("Setup AUHAL input\n");
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO, sizeof(enableIO));
- if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input");
- printError(err1);
- goto error;
- }
- }
-
+ JCALog ("Setup AUHAL input\n");
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO, sizeof(enableIO));
+ if (err1 != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input");
+ printError (err1);
+ goto error;
+ }
+ }
+
if (playing && outchannels > 0) {
- JCALog("Setup AUHAL output\n");
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO, sizeof(enableIO));
+ JCALog ("Setup AUHAL output\n");
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO, sizeof(enableIO));
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_EnableIO,kAudioUnitScope_Output");
- printError(err1);
+ jack_error ("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_EnableIO,kAudioUnitScope_Output");
+ printError (err1);
goto error;
}
}
-
+
// Setup up choosen device, in both input and output cases
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &driver->device_id, sizeof(AudioDeviceID));
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &driver->device_id, sizeof(AudioDeviceID));
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_CurrentDevice");
- printError(err1);
+ jack_error ("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_CurrentDevice");
+ printError (err1);
goto error;
}
// Set buffer size
if (capturing && inchannels > 0) {
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 1, (UInt32*)&nframes, sizeof(UInt32));
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 1, (UInt32*)&nframes, sizeof(UInt32));
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_MaximumFramesPerSlice");
- printError(err1);
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_MaximumFramesPerSlice");
+ printError (err1);
goto error;
}
}
-
+
if (playing && outchannels > 0) {
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, (UInt32*)&nframes, sizeof(UInt32));
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, (UInt32*)&nframes, sizeof(UInt32));
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_MaximumFramesPerSlice");
- printError(err1);
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_MaximumFramesPerSlice");
+ printError (err1);
goto error;
}
}
// Setup channel map
if (capturing && inchannels > 0 && inchannels < in_nChannels) {
- SInt32 chanArr[in_nChannels];
- for (i = 0; i < in_nChannels; i++) {
- chanArr[i] = -1;
- }
- for (i = 0; i < inchannels; i++) {
- chanArr[i] = i;
- }
- AudioUnitSetProperty(driver->au_hal, kAudioOutputUnitProperty_ChannelMap , kAudioUnitScope_Input, 1, chanArr, sizeof(SInt32) * in_nChannels);
- if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_ChannelMap 1");
- printError(err1);
- }
- }
-
- if (playing && outchannels > 0 && outchannels < out_nChannels) {
- SInt32 chanArr[out_nChannels];
- for (i = 0; i < out_nChannels; i++) {
- chanArr[i] = -1;
- }
- for (i = 0; i < outchannels; i++) {
- chanArr[i] = i;
- }
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Output, 0, chanArr, sizeof(SInt32) * out_nChannels);
- if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_ChannelMap 0");
- printError(err1);
- }
- }
+ SInt32 chanArr[in_nChannels];
+ for (i = 0; i < in_nChannels; i++)
+ chanArr[i] = -1;
+ for (i = 0; i < inchannels; i++)
+ chanArr[i] = i;
+ AudioUnitSetProperty (driver->au_hal, kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Input, 1, chanArr, sizeof(SInt32) * in_nChannels);
+ if (err1 != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_ChannelMap 1");
+ printError (err1);
+ }
+ }
+
+ if (playing && outchannels > 0 && outchannels < out_nChannels) {
+ SInt32 chanArr[out_nChannels];
+ for (i = 0; i < out_nChannels; i++)
+ chanArr[i] = -1;
+ for (i = 0; i < outchannels; i++)
+ chanArr[i] = i;
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Output, 0, chanArr, sizeof(SInt32) * out_nChannels);
+ if (err1 != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_ChannelMap 0");
+ printError (err1);
+ }
+ }
// Setup stream converters
- srcFormat.mSampleRate = samplerate;
+ srcFormat.mSampleRate = samplerate;
srcFormat.mFormatID = kAudioFormatLinearPCM;
srcFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kLinearPCMFormatFlagIsNonInterleaved;
srcFormat.mBytesPerPacket = sizeof(float);
@@ -912,10 +925,10 @@ static jack_driver_t *coreaudio_driver_new(char* name,
srcFormat.mChannelsPerFrame = outchannels;
srcFormat.mBitsPerChannel = 32;
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, sizeof(AudioStreamBasicDescription));
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &srcFormat, sizeof(AudioStreamBasicDescription));
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
- printError(err1);
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
+ printError (err1);
}
dstFormat.mSampleRate = samplerate;
@@ -927,41 +940,42 @@ static jack_driver_t *coreaudio_driver_new(char* name,
dstFormat.mChannelsPerFrame = inchannels;
dstFormat.mBitsPerChannel = 32;
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, sizeof(AudioStreamBasicDescription));
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &dstFormat, sizeof(AudioStreamBasicDescription));
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
- printError(err1);
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
+ printError (err1);
}
// Setup callbacks
- if (inchannels > 0 && outchannels == 0) {
- AURenderCallbackStruct output;
- output.inputProc = render_input;
- output.inputProcRefCon = driver;
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &output, sizeof(output));
- if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_SetRenderCallback 1");
- printError(err1);
- goto error;
- }
- } else {
- AURenderCallbackStruct output;
- output.inputProc = render;
- output.inputProcRefCon = driver;
- err1 = AudioUnitSetProperty(driver->au_hal, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &output, sizeof(output));
- if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_SetRenderCallback 0");
- printError(err1);
- goto error;
- }
- }
+ if (inchannels > 0 && outchannels == 0) {
+ AURenderCallbackStruct output;
+ output.inputProc = render_input;
+ output.inputProcRefCon = driver;
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &output, sizeof(output));
+ if (err1 != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_SetRenderCallback 1");
+ printError (err1);
+ goto error;
+ }
+ } else {
+ AURenderCallbackStruct output;
+ output.inputProc = render;
+ output.inputProcRefCon = driver;
+ err1 = AudioUnitSetProperty (driver->au_hal, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &output, sizeof(output));
+ if (err1 != noErr) {
+ jack_error ("Error calling AudioUnitSetProperty - kAudioUnitProperty_SetRenderCallback 0");
+ printError (err1);
+ goto error;
+ }
+ }
if (capturing && inchannels > 0) {
- driver->input_list = (AudioBufferList*)malloc(sizeof(UInt32) + inchannels * sizeof(AudioBuffer));
- if (driver->input_list == 0)
+ driver->input_list = (AudioBufferList*)malloc (sizeof(UInt32) + inchannels * sizeof(AudioBuffer));
+ if (driver->input_list == 0) {
goto error;
+ }
driver->input_list->mNumberBuffers = inchannels;
-
+
// Prepare buffers
for (i = 0; i < driver->capture_nchannels; i++) {
driver->input_list->mBuffers[i].mNumberChannels = 1;
@@ -969,39 +983,39 @@ static jack_driver_t *coreaudio_driver_new(char* name,
}
}
- err = AudioDeviceAddPropertyListener(driver->device_id, 0, true, kAudioDeviceProcessorOverload, notification, driver);
- if (err != noErr) {
- jack_error("Error calling AudioDeviceAddPropertyListener with kAudioDeviceProcessorOverload");
- goto error;
+ err = AudioDeviceAddPropertyListener (driver->device_id, 0, true, kAudioDeviceProcessorOverload, notification, driver);
+ if (err != noErr) {
+ jack_error ("Error calling AudioDeviceAddPropertyListener with kAudioDeviceProcessorOverload");
+ goto error;
+ }
+
+ err = AudioDeviceAddPropertyListener (driver->device_id, 0, true, kAudioDevicePropertyNominalSampleRate, notification, driver);
+ if (err != noErr) {
+ jack_error ("Error calling AudioDeviceAddPropertyListener with kAudioDevicePropertyNominalSampleRate");
+ goto error;
}
-
- err = AudioDeviceAddPropertyListener(driver->device_id, 0, true, kAudioDevicePropertyNominalSampleRate, notification, driver);
- if (err != noErr) {
- jack_error("Error calling AudioDeviceAddPropertyListener with kAudioDevicePropertyNominalSampleRate");
- goto error;
- }
-
+
driver->playback_nchannels = outchannels;
- driver->capture_nchannels = inchannels;
- return ((jack_driver_t *) driver);
-
- error:
- AudioUnitUninitialize(driver->au_hal);
- CloseComponent(driver->au_hal);
- jack_error("Cannot open the coreaudio driver");
- free(driver);
- return NULL;
+ driver->capture_nchannels = inchannels;
+ return (jack_driver_t*)driver;
+
+error:
+ AudioUnitUninitialize (driver->au_hal);
+ CloseComponent (driver->au_hal);
+ jack_error ("Cannot open the coreaudio driver");
+ free (driver);
+ return NULL;
}
/** free all memory allocated by a driver instance
-*/
-static void coreaudio_driver_delete(coreaudio_driver_t * driver)
+ */
+static void coreaudio_driver_delete (coreaudio_driver_t * driver)
{
- AudioDeviceRemovePropertyListener(driver->device_id, 0, true, kAudioDeviceProcessorOverload, notification);
- free(driver->input_list);
- AudioUnitUninitialize(driver->au_hal);
- CloseComponent(driver->au_hal);
- free(driver);
+ AudioDeviceRemovePropertyListener (driver->device_id, 0, true, kAudioDeviceProcessorOverload, notification);
+ free (driver->input_list);
+ AudioUnitUninitialize (driver->au_hal);
+ CloseComponent (driver->au_hal);
+ free (driver);
}
//== driver "plugin" interface =================================================
@@ -1010,140 +1024,141 @@ static void coreaudio_driver_delete(coreaudio_driver_t * driver)
const char driver_client_name[] = "coreaudio";
-jack_driver_desc_t *driver_get_descriptor()
+jack_driver_desc_t *driver_get_descriptor ()
{
- jack_driver_desc_t *desc;
- unsigned int i;
- desc = calloc(1, sizeof(jack_driver_desc_t));
-
- strcpy(desc->name, "coreaudio");
- desc->nparams = 12;
- desc->params = calloc(desc->nparams, sizeof(jack_driver_param_desc_t));
-
- i = 0;
- strcpy(desc->params[i].name, "channels");
- desc->params[i].character = 'c';
- desc->params[i].type = JackDriverParamInt;
- desc->params[i].value.ui = 2;
- strcpy(desc->params[i].short_desc, "Maximum number of channels");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "inchannels");
- desc->params[i].character = 'i';
- desc->params[i].type = JackDriverParamInt;
- desc->params[i].value.ui = 2;
- strcpy(desc->params[i].short_desc, "Maximum number of input channels");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "outchannels");
- desc->params[i].character = 'o';
- desc->params[i].type = JackDriverParamInt;
- desc->params[i].value.ui = 2;
- strcpy(desc->params[i].short_desc, "Maximum number of output channels");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "capture");
+ jack_driver_desc_t *desc;
+ unsigned int i;
+
+ desc = calloc (1, sizeof(jack_driver_desc_t));
+
+ strcpy (desc->name, "coreaudio");
+ desc->nparams = 12;
+ desc->params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
+
+ i = 0;
+ strcpy (desc->params[i].name, "channels");
+ desc->params[i].character = 'c';
+ desc->params[i].type = JackDriverParamInt;
+ desc->params[i].value.ui = 2;
+ strcpy (desc->params[i].short_desc, "Maximum number of channels");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "inchannels");
+ desc->params[i].character = 'i';
+ desc->params[i].type = JackDriverParamInt;
+ desc->params[i].value.ui = 2;
+ strcpy (desc->params[i].short_desc, "Maximum number of input channels");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "outchannels");
+ desc->params[i].character = 'o';
+ desc->params[i].type = JackDriverParamInt;
+ desc->params[i].value.ui = 2;
+ strcpy (desc->params[i].short_desc, "Maximum number of output channels");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "capture");
desc->params[i].character = 'C';
desc->params[i].type = JackDriverParamString;
- strcpy(desc->params[i].value.str, "will take default CoreAudio input device");
- strcpy(desc->params[i].short_desc, "Provide capture ports. Optionally set CoreAudio device name");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
+ strcpy (desc->params[i].value.str, "will take default CoreAudio input device");
+ strcpy (desc->params[i].short_desc, "Provide capture ports. Optionally set CoreAudio device name");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
i++;
- strcpy(desc->params[i].name, "playback");
+ strcpy (desc->params[i].name, "playback");
desc->params[i].character = 'P';
desc->params[i].type = JackDriverParamString;
- strcpy(desc->params[i].value.str, "will take default CoreAudio output device");
- strcpy(desc->params[i].short_desc, "Provide playback ports. Optionally set CoreAudio device name");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "duplex");
- desc->params[i].character = 'D';
- desc->params[i].type = JackDriverParamBool;
- desc->params[i].value.i = TRUE;
- strcpy(desc->params[i].short_desc, "Capture and playback");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "rate");
- desc->params[i].character = 'r';
- desc->params[i].type = JackDriverParamUInt;
- desc->params[i].value.ui = 44100U;
- strcpy(desc->params[i].short_desc, "Sample rate");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "period");
- desc->params[i].character = 'p';
- desc->params[i].type = JackDriverParamUInt;
- desc->params[i].value.ui = 128U;
- strcpy(desc->params[i].short_desc, "Frames per period");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- i++;
- strcpy(desc->params[i].name, "device");
+ strcpy (desc->params[i].value.str, "will take default CoreAudio output device");
+ strcpy (desc->params[i].short_desc, "Provide playback ports. Optionally set CoreAudio device name");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "duplex");
+ desc->params[i].character = 'D';
+ desc->params[i].type = JackDriverParamBool;
+ desc->params[i].value.i = TRUE;
+ strcpy (desc->params[i].short_desc, "Capture and playback");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "rate");
+ desc->params[i].character = 'r';
+ desc->params[i].type = JackDriverParamUInt;
+ desc->params[i].value.ui = 44100U;
+ strcpy (desc->params[i].short_desc, "Sample rate");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "period");
+ desc->params[i].character = 'p';
+ desc->params[i].type = JackDriverParamUInt;
+ desc->params[i].value.ui = 128U;
+ strcpy (desc->params[i].short_desc, "Frames per period");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ i++;
+ strcpy (desc->params[i].name, "device");
desc->params[i].character = 'd';
desc->params[i].type = JackDriverParamString;
desc->params[i].value.ui = 128U;
- strcpy(desc->params[i].value.str, "will take default CoreAudio device name");
- strcpy(desc->params[i].short_desc, "CoreAudio device name");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
+ strcpy (desc->params[i].value.str, "will take default CoreAudio device name");
+ strcpy (desc->params[i].short_desc, "CoreAudio device name");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
- i++;
- strcpy(desc->params[i].name, "input-latency");
+ i++;
+ strcpy (desc->params[i].name, "input-latency");
desc->params[i].character = 'I';
desc->params[i].type = JackDriverParamUInt;
desc->params[i].value.i = 0;
- strcpy(desc->params[i].short_desc, "Extra input latency");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
+ strcpy (desc->params[i].short_desc, "Extra input latency");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
i++;
- strcpy(desc->params[i].name, "output-latency");
+ strcpy (desc->params[i].name, "output-latency");
desc->params[i].character = 'O';
desc->params[i].type = JackDriverParamUInt;
desc->params[i].value.i = 0;
- strcpy(desc->params[i].short_desc, "Extra output latency");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
+ strcpy (desc->params[i].short_desc, "Extra output latency");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
i++;
- strcpy(desc->params[i].name, "list-devices");
+ strcpy (desc->params[i].name, "list-devices");
desc->params[i].character = 'l';
desc->params[i].type = JackDriverParamBool;
desc->params[i].value.i = FALSE;
- strcpy(desc->params[i].short_desc, "Display available CoreAudio devices");
- strcpy(desc->params[i].long_desc, desc->params[i].short_desc);
-
- return desc;
+ strcpy (desc->params[i].short_desc, "Display available CoreAudio devices");
+ strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
+
+ return desc;
}
-jack_driver_t *driver_initialize(jack_client_t * client,
- const JSList * params)
+jack_driver_t *driver_initialize (jack_client_t * client,
+ const JSList * params)
{
- jack_nframes_t srate = 44100; /* Some older Mac models only support this value */
- jack_nframes_t frames_per_interrupt = 128;
- int capture = FALSE;
- int playback = FALSE;
- int chan_in = 0;
- int chan_out = 0;
- char* capture_pcm_name = "";
+ jack_nframes_t srate = 44100; /* Some older Mac models only support this value */
+ jack_nframes_t frames_per_interrupt = 128;
+ int capture = FALSE;
+ int playback = FALSE;
+ int chan_in = 0;
+ int chan_out = 0;
+ char* capture_pcm_name = "";
char* playback_pcm_name = "";
- const JSList *node;
- const jack_driver_param_t *param;
+ const JSList *node;
+ const jack_driver_param_t *param;
jack_nframes_t systemic_input_latency = 0;
jack_nframes_t systemic_output_latency = 0;
- for (node = params; node; node = jack_slist_next(node)) {
- param = (const jack_driver_param_t *) node->data;
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (const jack_driver_param_t*)node->data;
- switch (param->character) {
+ switch (param->character) {
case 'd':
- capture_pcm_name = strdup(param->value.str);
- playback_pcm_name = strdup(param->value.str);
+ capture_pcm_name = strdup (param->value.str);
+ playback_pcm_name = strdup (param->value.str);
break;
case 'D':
@@ -1152,28 +1167,28 @@ jack_driver_t *driver_initialize(jack_client_t * client,
break;
case 'c':
- chan_in = chan_out = (int) param->value.ui;
+ chan_in = chan_out = (int)param->value.ui;
break;
case 'i':
- chan_in = (int) param->value.ui;
+ chan_in = (int)param->value.ui;
break;
case 'o':
- chan_out = (int) param->value.ui;
+ chan_out = (int)param->value.ui;
break;
case 'C':
capture = TRUE;
- if (strcmp(param->value.str, "none") != 0) {
- capture_pcm_name = strdup(param->value.str);
+ if (strcmp (param->value.str, "none") != 0) {
+ capture_pcm_name = strdup (param->value.str);
}
break;
case 'P':
playback = TRUE;
- if (strcmp(param->value.str, "none") != 0) {
- playback_pcm_name = strdup(param->value.str);
+ if (strcmp (param->value.str, "none") != 0) {
+ playback_pcm_name = strdup (param->value.str);
}
break;
@@ -1182,7 +1197,7 @@ jack_driver_t *driver_initialize(jack_client_t * client,
break;
case 'p':
- frames_per_interrupt = (unsigned int) param->value.ui;
+ frames_per_interrupt = (unsigned int)param->value.ui;
break;
case 'I':
@@ -1192,25 +1207,25 @@ jack_driver_t *driver_initialize(jack_client_t * client,
case 'O':
systemic_output_latency = param->value.ui;
break;
-
+
case 'l':
- display_device_names();
+ display_device_names ();
break;
}
- }
+ }
- /* duplex is the default */
- if (!capture && !playback) {
+ /* duplex is the default */
+ if (!capture && !playback) {
capture = TRUE;
playback = TRUE;
- }
-
- return coreaudio_driver_new("coreaudio", client, frames_per_interrupt,
- srate, capture, playback, chan_in,
- chan_out, capture_pcm_name, playback_pcm_name, systemic_input_latency, systemic_output_latency);
+ }
+
+ return coreaudio_driver_new ("coreaudio", client, frames_per_interrupt,
+ srate, capture, playback, chan_in,
+ chan_out, capture_pcm_name, playback_pcm_name, systemic_input_latency, systemic_output_latency);
}
-void driver_finish(jack_driver_t * driver)
+void driver_finish (jack_driver_t * driver)
{
- coreaudio_driver_delete((coreaudio_driver_t *) driver);
+ coreaudio_driver_delete ((coreaudio_driver_t*)driver);
}
diff --git a/drivers/coreaudio/coreaudio_driver.h b/drivers/coreaudio/coreaudio_driver.h
index b08a866..211549e 100755..100644
--- a/drivers/coreaudio/coreaudio_driver.h
+++ b/drivers/coreaudio/coreaudio_driver.h
@@ -18,12 +18,12 @@
Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France
grame@rd.grame.fr
-
- Johnny Petrantoni, johnny@lato-b.com - Italy, Rome.
-
- 30-01-04, Johnny Petrantoni: first code of the coreaudio driver.
-
-*/
+
+ Johnny Petrantoni, johnny@lato-b.com - Italy, Rome.
+
+ 30-01-04, Johnny Petrantoni: first code of the coreaudio driver.
+
+ */
#ifndef __jack_coreaudio_driver_h__
#define __jack_coreaudio_driver_h__
@@ -41,32 +41,32 @@
typedef struct {
- JACK_DRIVER_DECL struct _jack_engine *engine;
+ JACK_DRIVER_DECL struct _jack_engine *engine;
- jack_nframes_t frame_rate;
- jack_nframes_t frames_per_cycle;
- unsigned long user_nperiods;
- int capturing;
- int playing;
+ jack_nframes_t frame_rate;
+ jack_nframes_t frames_per_cycle;
+ unsigned long user_nperiods;
+ int capturing;
+ int playing;
- channel_t playback_nchannels;
- channel_t capture_nchannels;
+ channel_t playback_nchannels;
+ channel_t capture_nchannels;
- jack_client_t *client;
- JSList *capture_ports;
- JSList *playback_ports;
+ jack_client_t *client;
+ JSList *capture_ports;
+ JSList *playback_ports;
char capture_driver_name[256];
char playback_driver_name[256];
-
+
AudioUnit au_hal;
AudioBufferList* input_list;
AudioDeviceID device_id;
int state;
-
+
jack_nframes_t capture_frame_latency;
jack_nframes_t playback_frame_latency;
-
+
int xrun_detected;
int null_cycle_occured;
@@ -74,10 +74,10 @@ typedef struct {
#define kVersion 01
-typedef UInt8 CAAudioHardwareDeviceSectionID;
-#define kAudioDeviceSectionInput ((CAAudioHardwareDeviceSectionID)0x01)
-#define kAudioDeviceSectionOutput ((CAAudioHardwareDeviceSectionID)0x00)
-#define kAudioDeviceSectionGlobal ((CAAudioHardwareDeviceSectionID)0x00)
-#define kAudioDeviceSectionWildcard ((CAAudioHardwareDeviceSectionID)0xFF)
+typedef UInt8 CAAudioHardwareDeviceSectionID;
+#define kAudioDeviceSectionInput ((CAAudioHardwareDeviceSectionID)0x01)
+#define kAudioDeviceSectionOutput ((CAAudioHardwareDeviceSectionID)0x00)
+#define kAudioDeviceSectionGlobal ((CAAudioHardwareDeviceSectionID)0x00)
+#define kAudioDeviceSectionWildcard ((CAAudioHardwareDeviceSectionID)0xFF)
#endif /* __jack_coreaudio_driver_h__ */
diff --git a/drivers/dummy/dummy_driver.c b/drivers/dummy/dummy_driver.c
index 5eab915..d414cb1 100644
--- a/drivers/dummy/dummy_driver.c
+++ b/drivers/dummy/dummy_driver.c
@@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
+ */
#include <math.h>
#include <stdio.h>
@@ -41,69 +41,71 @@
#define PRETEND_BUFFER_SIZE 4096
void
-FakeVideoSync( dummy_driver_t *driver )
+FakeVideoSync ( dummy_driver_t *driver )
{
- #define VIDEO_SYNC_PERIOD (48000 / 30)
- static int vidCounter = VIDEO_SYNC_PERIOD;
-
- int period = driver->period_size;
- jack_position_t *position = &driver->engine->control->current_time;
-
- if ( period >= VIDEO_SYNC_PERIOD ) {
- jack_error("JACK driver period size too large for simple video sync emulation. Halting.");
- exit(0);
- }
-
- //enable video sync, whether it occurs in this period or not
- position->audio_frames_per_video_frame = VIDEO_SYNC_PERIOD;
- position->valid = (jack_position_bits_t) (position->valid | JackAudioVideoRatio);
-
- //no video pulse found in this period, just decrement the counter
- if ( vidCounter > period ) {
- vidCounter -= period;
- }
-
- //video pulse occurs in this period
- if ( vidCounter <= period ) {
- int remainder = period - vidCounter;
- vidCounter = VIDEO_SYNC_PERIOD - remainder;
-
- position->video_offset = vidCounter;
- position->valid = (jack_position_bits_t) (position->valid | JackVideoFrameOffset);
- }
+ #define VIDEO_SYNC_PERIOD (48000 / 30)
+ static int vidCounter = VIDEO_SYNC_PERIOD;
+
+ int period = driver->period_size;
+ jack_position_t *position = &driver->engine->control->current_time;
+
+ if ( period >= VIDEO_SYNC_PERIOD ) {
+ jack_error ("JACK driver period size too large for simple video sync emulation. Halting.");
+ exit (0);
+ }
+
+ //enable video sync, whether it occurs in this period or not
+ position->audio_frames_per_video_frame = VIDEO_SYNC_PERIOD;
+ position->valid = (jack_position_bits_t)(position->valid | JackAudioVideoRatio);
+
+ //no video pulse found in this period, just decrement the counter
+ if ( vidCounter > period ) {
+ vidCounter -= period;
+ }
+
+ //video pulse occurs in this period
+ if ( vidCounter <= period ) {
+ int remainder = period - vidCounter;
+ vidCounter = VIDEO_SYNC_PERIOD - remainder;
+
+ position->video_offset = vidCounter;
+ position->valid = (jack_position_bits_t)(position->valid | JackVideoFrameOffset);
+ }
}
#ifdef HAVE_CLOCK_GETTIME
-static inline unsigned long long ts_to_nsec(struct timespec ts)
+static inline unsigned long long ts_to_nsec (struct timespec ts)
{
- return ts.tv_sec * 1000000000LL + ts.tv_nsec;
+ return ts.tv_sec * 1000000000LL + ts.tv_nsec;
}
-static inline struct timespec nsec_to_ts(unsigned long long nsecs)
+static inline struct timespec nsec_to_ts (unsigned long long nsecs)
{
- struct timespec ts;
- ts.tv_sec = nsecs / (1000000000LL);
- ts.tv_nsec = nsecs % (1000000000LL);
- return ts;
+ struct timespec ts;
+
+ ts.tv_sec = nsecs / (1000000000LL);
+ ts.tv_nsec = nsecs % (1000000000LL);
+ return ts;
}
-static inline struct timespec add_ts(struct timespec ts, unsigned int usecs)
+static inline struct timespec add_ts (struct timespec ts, unsigned int usecs)
{
- unsigned long long nsecs = ts_to_nsec(ts);
- nsecs += usecs * 1000LL;
- return nsec_to_ts(nsecs);
+ unsigned long long nsecs = ts_to_nsec (ts);
+
+ nsecs += usecs * 1000LL;
+ return nsec_to_ts (nsecs);
}
-static inline int cmp_lt_ts(struct timespec ts1, struct timespec ts2)
+static inline int cmp_lt_ts (struct timespec ts1, struct timespec ts2)
{
- if(ts1.tv_sec < ts2.tv_sec) {
- return 1;
- } else if (ts1.tv_sec == ts2.tv_sec && ts1.tv_nsec < ts2.tv_nsec) {
- return 1;
- } else return 0;
+ if (ts1.tv_sec < ts2.tv_sec) {
+ return 1;
+ } else if (ts1.tv_sec == ts2.tv_sec && ts1.tv_nsec < ts2.tv_nsec) {
+ return 1;
+ } else { return 0; }
}
-static jack_nframes_t
+static jack_nframes_t
dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
float *delayed_usecs)
{
@@ -112,38 +114,38 @@ dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
*status = 0;
/* this driver doesn't work so well if we report a delay */
- *delayed_usecs = 0; /* lie about it */
+ *delayed_usecs = 0; /* lie about it */
+
+ clock_gettime (CLOCK_REALTIME, &now);
- clock_gettime(CLOCK_REALTIME, &now);
-
- if (cmp_lt_ts(driver->next_wakeup, now)) {
+ if (cmp_lt_ts (driver->next_wakeup, now)) {
if (driver->next_wakeup.tv_sec == 0) {
/* first time through */
- clock_gettime(CLOCK_REALTIME, &driver->next_wakeup);
- } else if ((ts_to_nsec(now) - ts_to_nsec(driver->next_wakeup))/1000LL
- > (PRETEND_BUFFER_SIZE * 1000000LL
- / driver->sample_rate)) {
+ clock_gettime (CLOCK_REALTIME, &driver->next_wakeup);
+ } else if ((ts_to_nsec (now) - ts_to_nsec (driver->next_wakeup)) / 1000LL
+ > (PRETEND_BUFFER_SIZE * 1000000LL
+ / driver->sample_rate)) {
/* xrun */
- jack_error("**** dummy: xrun of %ju usec",
- (uintmax_t)(ts_to_nsec(now) - ts_to_nsec(driver->next_wakeup))/1000LL);
+ jack_error ("**** dummy: xrun of %ju usec",
+ (uintmax_t)(ts_to_nsec (now) - ts_to_nsec (driver->next_wakeup)) / 1000LL);
nframes = 0;
driver->next_wakeup.tv_sec = 0;
} else {
/* late, but handled by our "buffer"; try to
* get back on track */
}
- driver->next_wakeup = add_ts(driver->next_wakeup, driver->wait_time);
+ driver->next_wakeup = add_ts (driver->next_wakeup, driver->wait_time);
} else {
- if(clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &driver->next_wakeup, NULL)) {
- jack_error("error while sleeping");
+ if (clock_nanosleep (CLOCK_REALTIME, TIMER_ABSTIME, &driver->next_wakeup, NULL)) {
+ jack_error ("error while sleeping");
*status = -1;
} else {
- clock_gettime(CLOCK_REALTIME, &now);
+ clock_gettime (CLOCK_REALTIME, &now);
// guaranteed to sleep long enough for this to be correct
- *delayed_usecs = (ts_to_nsec(now) - ts_to_nsec(driver->next_wakeup));
+ *delayed_usecs = (ts_to_nsec (now) - ts_to_nsec (driver->next_wakeup));
*delayed_usecs /= 1000.0;
}
- driver->next_wakeup = add_ts(driver->next_wakeup, driver->wait_time);
+ driver->next_wakeup = add_ts (driver->next_wakeup, driver->wait_time);
}
driver->last_wait_ust = driver->engine->get_microseconds ();
@@ -153,30 +155,30 @@ dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
return nframes;
}
-static int dummy_driver_nt_start (dummy_driver_t *drv)
+static int dummy_driver_nt_start (dummy_driver_t *drv)
{
drv->next_wakeup.tv_sec = 0;
- return 0;
+ return 0;
}
#else
-static jack_nframes_t
+static jack_nframes_t
dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
float *delayed_usecs)
{
- jack_time_t now = driver->engine->get_microseconds();
+ jack_time_t now = driver->engine->get_microseconds ();
if (driver->next_time < now) {
if (driver->next_time == 0) {
/* first time through */
driver->next_time = now + driver->wait_time;
- } else if (now - driver->next_time
- > (PRETEND_BUFFER_SIZE * 1000000LL
- / driver->sample_rate)) {
+ } else if (now - driver->next_time
+ > (PRETEND_BUFFER_SIZE * 1000000LL
+ / driver->sample_rate)) {
/* xrun */
- jack_error("**** dummy: xrun of %ju usec",
- (uintmax_t)now - driver->next_time);
+ jack_error ("**** dummy: xrun of %ju usec",
+ (uintmax_t)now - driver->next_time);
driver->next_time = now + driver->wait_time;
} else {
/* late, but handled by our "buffer"; try to
@@ -185,9 +187,9 @@ dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
}
} else {
jack_time_t wait = driver->next_time - now;
- struct timespec ts = { .tv_sec = wait / 1000000,
+ struct timespec ts = { .tv_sec = wait / 1000000,
.tv_nsec = (wait % 1000000) * 1000 };
- nanosleep(&ts,NULL);
+ nanosleep (&ts, NULL);
driver->next_time += driver->wait_time;
}
@@ -196,15 +198,15 @@ dummy_driver_wait (dummy_driver_t *driver, int extra_fd, int *status,
driver->last_wait_ust);
/* this driver doesn't work so well if we report a delay */
- *delayed_usecs = 0; /* lie about it */
+ *delayed_usecs = 0; /* lie about it */
*status = 0;
return driver->period_size;
}
-static int dummy_driver_nt_start (dummy_driver_t *drv)
+static int dummy_driver_nt_start (dummy_driver_t *drv)
{
drv->next_time = 0;
- return 0;
+ return 0;
}
#endif
@@ -216,23 +218,26 @@ dummy_driver_run_cycle (dummy_driver_t *driver)
float delayed_usecs;
jack_nframes_t nframes = dummy_driver_wait (driver, -1, &wait_status,
- &delayed_usecs);
+ &delayed_usecs);
+
if (nframes == 0) {
/* we detected an xrun and restarted: notify
* clients about the delay. */
engine->delay (engine, delayed_usecs);
return 0;
- }
+ }
// FakeVideoSync (driver);
- if (wait_status == 0)
+ if (wait_status == 0) {
return engine->run_cycle (engine, nframes, delayed_usecs);
+ }
- if (wait_status < 0)
+ if (wait_status < 0) {
return -1;
- else
+ } else {
return 0;
+ }
}
static int
@@ -244,10 +249,10 @@ dummy_driver_null_cycle (dummy_driver_t* driver, jack_nframes_t nframes)
static int
dummy_driver_bufsize (dummy_driver_t* driver, jack_nframes_t nframes)
{
- driver->period_size = nframes;
+ driver->period_size = nframes;
driver->period_usecs = driver->wait_time =
- (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
- * 1000000.0f);
+ (jack_time_t)floor ((((float)nframes) / driver->sample_rate)
+ * 1000000.0f);
/* tell the engine to change its buffer size */
if (driver->engine->set_buffer_size (driver->engine, nframes)) {
@@ -279,17 +284,15 @@ dummy_driver_attach (dummy_driver_t *driver)
}
driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
- for (chn = 0; chn < driver->capture_channels; chn++)
- {
- snprintf (buf, sizeof(buf) - 1, "capture_%u", chn+1);
+ for (chn = 0; chn < driver->capture_channels; chn++) {
+ snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
port = jack_port_register (driver->client, buf,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0);
- if (!port)
- {
+ if (!port) {
jack_error ("DUMMY: cannot register port for %s", buf);
break;
}
@@ -297,19 +300,17 @@ dummy_driver_attach (dummy_driver_t *driver)
driver->capture_ports =
jack_slist_append (driver->capture_ports, port);
}
-
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
- for (chn = 0; chn < driver->playback_channels; chn++)
- {
- snprintf (buf, sizeof(buf) - 1, "playback_%u", chn+1);
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+
+ for (chn = 0; chn < driver->playback_channels; chn++) {
+ snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
port = jack_port_register (driver->client, buf,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0);
- if (!port)
- {
+ if (!port) {
jack_error ("DUMMY: cannot register port for %s", buf);
break;
}
@@ -328,20 +329,21 @@ dummy_driver_detach (dummy_driver_t *driver)
{
JSList * node;
- if (driver->engine == 0)
+ if (driver->engine == 0) {
return 0;
+ }
for (node = driver->capture_ports; node; node = jack_slist_next (node))
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
jack_slist_free (driver->capture_ports);
driver->capture_ports = NULL;
-
+
for (node = driver->playback_ports; node; node = jack_slist_next (node))
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
jack_slist_free (driver->playback_ports);
driver->playback_ports = NULL;
@@ -353,7 +355,7 @@ dummy_driver_detach (dummy_driver_t *driver)
static void
dummy_driver_delete (dummy_driver_t *driver)
{
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
free (driver);
}
@@ -369,24 +371,24 @@ dummy_driver_new (jack_client_t * client,
dummy_driver_t * driver;
jack_info ("creating dummy driver ... %s|%" PRIu32 "|%" PRIu32
- "|%lu|%u|%u", name, sample_rate, period_size, wait_time,
- capture_ports, playback_ports);
+ "|%lu|%u|%u", name, sample_rate, period_size, wait_time,
+ capture_ports, playback_ports);
- driver = (dummy_driver_t *) calloc (1, sizeof (dummy_driver_t));
+ driver = (dummy_driver_t*)calloc (1, sizeof(dummy_driver_t));
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
- driver->write = (JackDriverReadFunction) dummy_driver_write;
- driver->null_cycle = (JackDriverNullCycleFunction) dummy_driver_null_cycle;
- driver->nt_attach = (JackDriverNTAttachFunction) dummy_driver_attach;
- driver->nt_start = (JackDriverNTStartFunction) dummy_driver_nt_start;
- driver->nt_detach = (JackDriverNTDetachFunction) dummy_driver_detach;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) dummy_driver_bufsize;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) dummy_driver_run_cycle;
+ driver->write = (JackDriverReadFunction)dummy_driver_write;
+ driver->null_cycle = (JackDriverNullCycleFunction)dummy_driver_null_cycle;
+ driver->nt_attach = (JackDriverNTAttachFunction)dummy_driver_attach;
+ driver->nt_start = (JackDriverNTStartFunction)dummy_driver_nt_start;
+ driver->nt_detach = (JackDriverNTDetachFunction)dummy_driver_detach;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)dummy_driver_bufsize;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)dummy_driver_run_cycle;
driver->period_usecs =
- (jack_time_t) floor ((((float) period_size) / sample_rate)
- * 1000000.0f);
+ (jack_time_t)floor ((((float)period_size) / sample_rate)
+ * 1000000.0f);
driver->sample_rate = sample_rate;
driver->period_size = period_size;
driver->wait_time = wait_time;
@@ -401,7 +403,7 @@ dummy_driver_new (jack_client_t * client,
driver->client = client;
driver->engine = NULL;
- return (jack_driver_t *) driver;
+ return (jack_driver_t*)driver;
}
@@ -414,11 +416,11 @@ driver_get_descriptor ()
jack_driver_param_desc_t * params;
unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
strcpy (desc->name, "dummy");
desc->nparams = 5;
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
i = 0;
strcpy (params[i].name, "capture");
@@ -481,36 +483,37 @@ driver_initialize (jack_client_t *client, const JSList * params)
const jack_driver_param_t * param;
for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
+ param = (const jack_driver_param_t*)node->data;
switch (param->character) {
case 'C':
- capture_ports = param->value.ui;
- break;
+ capture_ports = param->value.ui;
+ break;
case 'P':
- playback_ports = param->value.ui;
- break;
+ playback_ports = param->value.ui;
+ break;
case 'r':
- sample_rate = param->value.ui;
- break;
+ sample_rate = param->value.ui;
+ break;
case 'p':
- period_size = param->value.ui;
- break;
+ period_size = param->value.ui;
+ break;
case 'w':
- wait_time = param->value.ui;
- wait_time_set = 1;
- break;
-
+ wait_time = param->value.ui;
+ wait_time_set = 1;
+ break;
+
}
}
- if (!wait_time_set)
- wait_time = (((float)period_size) / ((float)sample_rate)) * 1000000.0;
+ if (!wait_time_set) {
+ wait_time = (((float)period_size) / ((float)sample_rate)) * 1000000.0;
+ }
return dummy_driver_new (client, "dummy_pcm", capture_ports,
playback_ports, sample_rate, period_size,
@@ -520,6 +523,6 @@ driver_initialize (jack_client_t *client, const JSList * params)
void
driver_finish (jack_driver_t *driver)
{
- dummy_driver_delete ((dummy_driver_t *) driver);
+ dummy_driver_delete ((dummy_driver_t*)driver);
}
diff --git a/drivers/dummy/dummy_driver.h b/drivers/dummy/dummy_driver.h
index 9d74cfe..296f027 100644
--- a/drivers/dummy/dummy_driver.h
+++ b/drivers/dummy/dummy_driver.h
@@ -14,7 +14,7 @@
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 __JACK_DUMMY_DRIVER_H__
@@ -36,27 +36,26 @@
typedef struct _dummy_driver dummy_driver_t;
-struct _dummy_driver
-{
- JACK_DRIVER_NT_DECL;
+struct _dummy_driver {
+ JACK_DRIVER_NT_DECL;
- jack_nframes_t sample_rate;
- jack_nframes_t period_size;
- unsigned long wait_time;
+ jack_nframes_t sample_rate;
+ jack_nframes_t period_size;
+ unsigned long wait_time;
#ifdef HAVE_CLOCK_GETTIME
- struct timespec next_wakeup;
+ struct timespec next_wakeup;
#else
- jack_time_t next_time;
+ jack_time_t next_time;
#endif
- unsigned int capture_channels;
- unsigned int playback_channels;
+ unsigned int capture_channels;
+ unsigned int playback_channels;
- JSList *capture_ports;
- JSList *playback_ports;
+ JSList *capture_ports;
+ JSList *playback_ports;
- jack_client_t *client;
+ jack_client_t *client;
};
#endif /* __JACK_DUMMY_DRIVER_H__ */
diff --git a/drivers/firewire/ffado_driver.c b/drivers/firewire/ffado_driver.c
index 54c091a..02ccdf5 100644
--- a/drivers/firewire/ffado_driver.c
+++ b/drivers/firewire/ffado_driver.c
@@ -24,10 +24,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/*
+/*
* Main Jack driver entry routines
*
- */
+ */
#include <math.h>
#include <stdio.h>
@@ -50,7 +50,7 @@
#define SAMPLE_MAX_24BIT 8388608.0f
#define SAMPLE_MAX_16BIT 32768.0f
-static int ffado_driver_stop (ffado_driver_t *driver);
+static int ffado_driver_stop(ffado_driver_t *driver);
// Basic functionality requires API version 8. If version 9 or later
// is present the buffers can be resized at runtime.
@@ -62,30 +62,29 @@ static int ffado_driver_stop (ffado_driver_t *driver);
*/
#ifndef FFADO_API_VERSION
extern int ffado_streaming_set_period_size(ffado_device_t *dev,
- unsigned int period) __attribute__((__weak__));
+ unsigned int period) __attribute__((__weak__));
#endif
// enable verbose messages
-static int g_verbose=0;
+static int g_verbose = 0;
-static void
+static void
ffado_latency_callback (jack_latency_callback_mode_t mode, void* arg)
{
- ffado_driver_t* driver = (ffado_driver_t*) arg;
- jack_client_t* client = driver->client;
- jack_latency_range_t range;
- JSList* node;
-
- if (mode == JackPlaybackLatency) {
- range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1));
- } else {
- range.min = range.max = driver->period_size + driver->capture_frame_latency;
- }
-
- for (node = client->ports; node; node = jack_slist_next (node)) {
- jack_port_set_latency_range ((jack_port_t*) node->data, mode, &range);
+ ffado_driver_t* driver = (ffado_driver_t*)arg;
+ jack_client_t* client = driver->client;
+ jack_latency_range_t range;
+ JSList* node;
+
+ if (mode == JackPlaybackLatency) {
+ range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1));
+ } else {
+ range.min = range.max = driver->period_size + driver->capture_frame_latency;
}
+
+ for (node = client->ports; node; node = jack_slist_next (node))
+ jack_port_set_latency_range ((jack_port_t*)node->data, mode, &range);
}
static int
@@ -94,10 +93,10 @@ ffado_driver_attach (ffado_driver_t *driver)
char buf[64];
char buf2[64];
channel_t chn;
- jack_port_t *port=NULL;
+ jack_port_t *port = NULL;
int port_flags;
- g_verbose=driver->engine->verbose;
+ g_verbose = driver->engine->verbose;
if (driver->engine->set_buffer_size (driver->engine, driver->period_size)) {
jack_error ("FFADO: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
@@ -109,24 +108,24 @@ ffado_driver_attach (ffado_driver_t *driver)
in RT context (or from the stack)
*/
/* the null buffer is a buffer that contains one period of silence */
- driver->nullbuffer = calloc(driver->period_size, sizeof(ffado_sample_t));
- if(driver->nullbuffer == NULL) {
- printError("could not allocate memory for null buffer");
+ driver->nullbuffer = calloc (driver->period_size, sizeof(ffado_sample_t));
+ if (driver->nullbuffer == NULL) {
+ printError ("could not allocate memory for null buffer");
return -1;
}
/* calloc should do this, but it can't hurt to be sure */
- memset(driver->nullbuffer, 0, driver->period_size*sizeof(ffado_sample_t));
-
+ memset (driver->nullbuffer, 0, driver->period_size * sizeof(ffado_sample_t));
+
/* the scratch buffer is a buffer of one period that can be used as dummy memory */
- driver->scratchbuffer = calloc(driver->period_size, sizeof(ffado_sample_t));
- if(driver->scratchbuffer == NULL) {
- printError("could not allocate memory for scratch buffer");
+ driver->scratchbuffer = calloc (driver->period_size, sizeof(ffado_sample_t));
+ if (driver->scratchbuffer == NULL) {
+ printError ("could not allocate memory for scratch buffer");
return -1;
}
-
+
/* packetizer thread options */
- driver->device_options.realtime=(driver->engine->control->real_time? 1 : 0);
-
+ driver->device_options.realtime = (driver->engine->control->real_time ? 1 : 0);
+
driver->device_options.packetizer_priority = driver->engine->rtpriority;
if (driver->device_options.packetizer_priority > 98) {
driver->device_options.packetizer_priority = 98;
@@ -135,38 +134,38 @@ ffado_driver_attach (ffado_driver_t *driver)
driver->device_options.packetizer_priority = 1;
}
- driver->dev = ffado_streaming_init(driver->device_info, driver->device_options);
+ driver->dev = ffado_streaming_init (driver->device_info, driver->device_options);
- if(!driver->dev) {
- printError("Error creating FFADO streaming device");
+ if (!driver->dev) {
+ printError ("Error creating FFADO streaming device");
return -1;
}
if (driver->device_options.realtime) {
- printMessage("Streaming thread running with Realtime scheduling, priority %d",
- driver->device_options.packetizer_priority);
+ printMessage ("Streaming thread running with Realtime scheduling, priority %d",
+ driver->device_options.packetizer_priority);
} else {
- printMessage("Streaming thread running without Realtime scheduling");
+ printMessage ("Streaming thread running without Realtime scheduling");
}
- ffado_streaming_set_audio_datatype(driver->dev, ffado_audio_datatype_float);
-
+ ffado_streaming_set_audio_datatype (driver->dev, ffado_audio_datatype_float);
+
/* ports */
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
- driver->capture_nchannels=ffado_streaming_get_nb_capture_streams(driver->dev);
- driver->capture_channels=calloc(driver->capture_nchannels, sizeof(ffado_capture_channel_t));
- if(driver->capture_channels==NULL) {
- printError("could not allocate memory for capture channel list");
+ driver->capture_nchannels = ffado_streaming_get_nb_capture_streams (driver->dev);
+ driver->capture_channels = calloc (driver->capture_nchannels, sizeof(ffado_capture_channel_t));
+ if (driver->capture_channels == NULL) {
+ printError ("could not allocate memory for capture channel list");
return -1;
}
-
+
for (chn = 0; chn < driver->capture_nchannels; chn++) {
- ffado_streaming_get_capture_stream_name(driver->dev, chn, buf, sizeof(buf) - 1);
- driver->capture_channels[chn].stream_type=ffado_streaming_get_capture_stream_type(driver->dev, chn);
+ ffado_streaming_get_capture_stream_name (driver->dev, chn, buf, sizeof(buf) - 1);
+ driver->capture_channels[chn].stream_type = ffado_streaming_get_capture_stream_type (driver->dev, chn);
- if(driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
- snprintf(buf2, 64, "C%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
+ snprintf (buf2, 64, "C%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering audio capture port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_AUDIO_TYPE,
@@ -177,14 +176,14 @@ ffado_driver_attach (ffado_driver_t *driver)
driver->capture_ports =
jack_slist_append (driver->capture_ports, port);
// setup port parameters
- if (ffado_streaming_set_capture_stream_buffer(driver->dev, chn, NULL)) {
- printError(" cannot configure initial port buffer for %s", buf2);
+ if (ffado_streaming_set_capture_stream_buffer (driver->dev, chn, NULL)) {
+ printError (" cannot configure initial port buffer for %s", buf2);
}
- if(ffado_streaming_capture_stream_onoff(driver->dev, chn, 1)) {
- printError(" cannot enable port %s", buf2);
+ if (ffado_streaming_capture_stream_onoff (driver->dev, chn, 1)) {
+ printError (" cannot enable port %s", buf2);
}
- } else if(driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
- snprintf(buf2, 64, "C%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
+ snprintf (buf2, 64, "C%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering midi capture port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_MIDI_TYPE,
@@ -195,17 +194,17 @@ ffado_driver_attach (ffado_driver_t *driver)
driver->capture_ports =
jack_slist_append (driver->capture_ports, port);
// setup port parameters
- if (ffado_streaming_set_capture_stream_buffer(driver->dev, chn, NULL)) {
- printError(" cannot configure initial port buffer for %s", buf2);
+ if (ffado_streaming_set_capture_stream_buffer (driver->dev, chn, NULL)) {
+ printError (" cannot configure initial port buffer for %s", buf2);
}
- if(ffado_streaming_capture_stream_onoff(driver->dev, chn, 1)) {
- printError(" cannot enable port %s", buf2);
+ if (ffado_streaming_capture_stream_onoff (driver->dev, chn, 1)) {
+ printError (" cannot enable port %s", buf2);
}
// setup midi unpacker
- midi_unpack_init(&driver->capture_channels[chn].midi_unpack);
- midi_unpack_reset(&driver->capture_channels[chn].midi_unpack);
+ midi_unpack_init (&driver->capture_channels[chn].midi_unpack);
+ midi_unpack_reset (&driver->capture_channels[chn].midi_unpack);
// setup the midi buffer
- driver->capture_channels[chn].midi_buffer = calloc(driver->period_size, sizeof(uint32_t));
+ driver->capture_channels[chn].midi_buffer = calloc (driver->period_size, sizeof(uint32_t));
} else {
printMessage ("Don't register capture port %s", buf);
@@ -214,62 +213,62 @@ ffado_driver_attach (ffado_driver_t *driver)
jack_slist_append (driver->capture_ports, NULL);
}
}
-
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
- driver->playback_nchannels=ffado_streaming_get_nb_playback_streams(driver->dev);
- driver->playback_channels=calloc(driver->playback_nchannels, sizeof(ffado_playback_channel_t));
- if(driver->playback_channels==NULL) {
- printError("could not allocate memory for playback channel list");
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+
+ driver->playback_nchannels = ffado_streaming_get_nb_playback_streams (driver->dev);
+ driver->playback_channels = calloc (driver->playback_nchannels, sizeof(ffado_playback_channel_t));
+ if (driver->playback_channels == NULL) {
+ printError ("could not allocate memory for playback channel list");
return -1;
}
for (chn = 0; chn < driver->playback_nchannels; chn++) {
- ffado_streaming_get_playback_stream_name(driver->dev, chn, buf, sizeof(buf) - 1);
- driver->playback_channels[chn].stream_type=ffado_streaming_get_playback_stream_type(driver->dev, chn);
-
- if(driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
- snprintf(buf2, 64, "P%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ ffado_streaming_get_playback_stream_name (driver->dev, chn, buf, sizeof(buf) - 1);
+ driver->playback_channels[chn].stream_type = ffado_streaming_get_playback_stream_type (driver->dev, chn);
+
+ if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
+ snprintf (buf2, 64, "P%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering audio playback port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0)) == NULL) {
- printError(" cannot register port for %s", buf2);
+ printError (" cannot register port for %s", buf2);
break;
}
driver->playback_ports =
jack_slist_append (driver->playback_ports, port);
// setup port parameters
- if (ffado_streaming_set_playback_stream_buffer(driver->dev, chn, NULL)) {
- printError(" cannot configure initial port buffer for %s", buf2);
+ if (ffado_streaming_set_playback_stream_buffer (driver->dev, chn, NULL)) {
+ printError (" cannot configure initial port buffer for %s", buf2);
}
- if(ffado_streaming_playback_stream_onoff(driver->dev, chn, 1)) {
- printError(" cannot enable port %s", buf2);
+ if (ffado_streaming_playback_stream_onoff (driver->dev, chn, 1)) {
+ printError (" cannot enable port %s", buf2);
}
- } else if(driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
- snprintf(buf2, 64, "P%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
+ snprintf (buf2, 64, "P%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering midi playback port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_MIDI_TYPE,
port_flags, 0)) == NULL) {
- printError(" cannot register port for %s", buf2);
+ printError (" cannot register port for %s", buf2);
break;
}
driver->playback_ports =
jack_slist_append (driver->playback_ports, port);
// setup port parameters
- if (ffado_streaming_set_playback_stream_buffer(driver->dev, chn, NULL)) {
- printError(" cannot configure initial port buffer for %s", buf2);
+ if (ffado_streaming_set_playback_stream_buffer (driver->dev, chn, NULL)) {
+ printError (" cannot configure initial port buffer for %s", buf2);
}
- if(ffado_streaming_playback_stream_onoff(driver->dev, chn, 1)) {
- printError(" cannot enable port %s", buf2);
+ if (ffado_streaming_playback_stream_onoff (driver->dev, chn, 1)) {
+ printError (" cannot enable port %s", buf2);
}
// setup midi packer
- midi_pack_reset(&driver->playback_channels[chn].midi_pack);
+ midi_pack_reset (&driver->playback_channels[chn].midi_pack);
// setup the midi buffer
- driver->playback_channels[chn].midi_buffer = calloc(driver->period_size, sizeof(uint32_t));
+ driver->playback_channels[chn].midi_buffer = calloc (driver->period_size, sizeof(uint32_t));
} else {
printMessage ("Don't register playback port %s", buf);
@@ -279,15 +278,15 @@ ffado_driver_attach (ffado_driver_t *driver)
}
}
- if(ffado_streaming_prepare(driver->dev)) {
- printError("Could not prepare streaming device!");
+ if (ffado_streaming_prepare (driver->dev)) {
+ printError ("Could not prepare streaming device!");
return -1;
}
return jack_activate (driver->client);
}
-static int
+static int
ffado_driver_detach (ffado_driver_t *driver)
{
JSList *node;
@@ -303,41 +302,41 @@ ffado_driver_detach (ffado_driver_t *driver)
// ffado ports by ffado_driver_attach().
if (node->data != NULL) {
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
}
}
jack_slist_free (driver->capture_ports);
driver->capture_ports = 0;
-
+
for (node = driver->playback_ports; node;
node = jack_slist_next (node)) {
- if (node->data != NULL) {
- jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
- }
+ if (node->data != NULL) {
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
+ }
}
jack_slist_free (driver->playback_ports);
driver->playback_ports = 0;
- ffado_streaming_finish(driver->dev);
- driver->dev=NULL;
+ ffado_streaming_finish (driver->dev);
+ driver->dev = NULL;
- for (chn = 0; chn < driver->capture_nchannels; chn++) {
- if(driver->capture_channels[chn].midi_buffer)
- free(driver->capture_channels[chn].midi_buffer);
- }
- free(driver->capture_channels);
-
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
- if(driver->playback_channels[chn].midi_buffer)
- free(driver->playback_channels[chn].midi_buffer);
- }
- free(driver->playback_channels);
-
- free(driver->nullbuffer);
- free(driver->scratchbuffer);
+ for (chn = 0; chn < driver->capture_nchannels; chn++)
+ if (driver->capture_channels[chn].midi_buffer) {
+ free (driver->capture_channels[chn].midi_buffer);
+ }
+ free (driver->capture_channels);
+
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
+ if (driver->playback_channels[chn].midi_buffer) {
+ free (driver->playback_channels[chn].midi_buffer);
+ }
+ free (driver->playback_channels);
+
+ free (driver->nullbuffer);
+ free (driver->scratchbuffer);
return 0;
}
@@ -348,40 +347,40 @@ ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes)
int nb_connections;
JSList *node;
jack_port_t* port;
-
- printEnter();
+
+ printEnter ();
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
- if(driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
- port = (jack_port_t *) node->data;
+ if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
+ port = (jack_port_t*)node->data;
nb_connections = jack_port_connected (port);
/* if there are no connections, use the dummy buffer and disable the stream */
- if(nb_connections) {
- ffado_streaming_capture_stream_onoff(driver->dev, chn, 1);
- ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(jack_port_get_buffer (port, nframes)));
+ if (nb_connections) {
+ ffado_streaming_capture_stream_onoff (driver->dev, chn, 1);
+ ffado_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(jack_port_get_buffer (port, nframes)));
} else {
- ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
- ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(driver->scratchbuffer));
+ ffado_streaming_capture_stream_onoff (driver->dev, chn, 0);
+ ffado_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(driver->scratchbuffer));
}
} else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
nb_connections = jack_port_connected (port);
- if(nb_connections) {
- ffado_streaming_capture_stream_onoff(driver->dev, chn, 1);
+ if (nb_connections) {
+ ffado_streaming_capture_stream_onoff (driver->dev, chn, 1);
} else {
- ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
+ ffado_streaming_capture_stream_onoff (driver->dev, chn, 0);
}
/* always set a buffer */
- ffado_streaming_set_capture_stream_buffer(driver->dev, chn,
- (char *)(driver->capture_channels[chn].midi_buffer));
+ ffado_streaming_set_capture_stream_buffer (driver->dev, chn,
+ (char*)(driver->capture_channels[chn].midi_buffer));
} else { /* ensure a valid buffer */
- ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(driver->scratchbuffer));
- ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
+ ffado_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(driver->scratchbuffer));
+ ffado_streaming_capture_stream_onoff (driver->dev, chn, 0);
}
}
/* now transfer the buffers */
- ffado_streaming_transfer_capture_buffers(driver->dev);
+ ffado_streaming_transfer_capture_buffers (driver->dev);
/* process the midi data */
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
@@ -391,23 +390,25 @@ ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes)
int done;
uint32_t *midi_buffer = driver->capture_channels[chn].midi_buffer;
midi_unpack_t *midi_unpack = &driver->capture_channels[chn].midi_unpack;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
nb_connections = jack_port_connected (port);
buf = jack_port_get_buffer (port, nframes);
/* if the returned buffer is invalid, discard the midi data */
- jack_midi_clear_buffer(buf);
+ jack_midi_clear_buffer (buf);
/* no connections means no processing */
- if(nb_connections == 0) continue;
+ if (nb_connections == 0) {
+ continue;
+ }
/* else unpack
note that libffado guarantees that midi bytes are on 8-byte aligned indexes */
- for(i = 0; i < nframes; i += 8) {
- if(midi_buffer[i] & 0xFF000000) {
- done = midi_unpack_buf(midi_unpack, (unsigned char *)(midi_buffer+i), 1, buf, i);
+ for (i = 0; i < nframes; i += 8) {
+ if (midi_buffer[i] & 0xFF000000) {
+ done = midi_unpack_buf (midi_unpack, (unsigned char*)(midi_buffer + i), 1, buf, i);
if (done != 1) {
- printError("MIDI buffer overflow in channel %d\n", chn);
+ printError ("MIDI buffer overflow in channel %d\n", chn);
break;
}
}
@@ -415,7 +416,7 @@ ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes)
}
}
- printExit();
+ printExit ();
return 0;
}
@@ -426,25 +427,26 @@ ffado_driver_write (ffado_driver_t * driver, jack_nframes_t nframes)
int nb_connections;
JSList *node;
jack_port_t *port;
- printEnter();
-
+
+ printEnter ();
+
driver->process_count++;
if (driver->engine->freewheeling) {
return 0;
}
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
- if(driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
- port = (jack_port_t *) node->data;
+ if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
+ port = (jack_port_t*)node->data;
nb_connections = jack_port_connected (port);
/* use the silent buffer + disable if there are no connections */
- if(nb_connections) {
- ffado_streaming_playback_stream_onoff(driver->dev, chn, 1);
- ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(jack_port_get_buffer (port, nframes)));
+ if (nb_connections) {
+ ffado_streaming_playback_stream_onoff (driver->dev, chn, 1);
+ ffado_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(jack_port_get_buffer (port, nframes)));
} else {
- ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
- ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(driver->nullbuffer));
+ ffado_streaming_playback_stream_onoff (driver->dev, chn, 0);
+ ffado_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(driver->nullbuffer));
}
} else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
jack_default_audio_sample_t* buf;
@@ -454,68 +456,66 @@ ffado_driver_write (ffado_driver_t * driver, jack_nframes_t nframes)
uint32_t *midi_buffer = driver->playback_channels[chn].midi_buffer;
int min_next_pos = 0;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
nb_connections = jack_port_connected (port);
/* skip if no connections */
- if(nb_connections == 0) {
- ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(driver->nullbuffer));
- ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
+ if (nb_connections == 0) {
+ ffado_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(driver->nullbuffer));
+ ffado_streaming_playback_stream_onoff (driver->dev, chn, 0);
continue;
}
- memset(midi_buffer, 0, nframes * sizeof(uint32_t));
- ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(midi_buffer));
- ffado_streaming_playback_stream_onoff(driver->dev, chn, 1);
+ memset (midi_buffer, 0, nframes * sizeof(uint32_t));
+ ffado_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(midi_buffer));
+ ffado_streaming_playback_stream_onoff (driver->dev, chn, 1);
/* check if we still have to process bytes from the previous period */
/*
- if(driver->playback_channels[chn].nb_overflow_bytes) {
- printMessage("have to process %d bytes from previous period", driver->playback_channels[chn].nb_overflow_bytes);
- }
- */
- for (i=0; i<driver->playback_channels[chn].nb_overflow_bytes; ++i) {
+ if(driver->playback_channels[chn].nb_overflow_bytes) {
+ printMessage("have to process %d bytes from previous period", driver->playback_channels[chn].nb_overflow_bytes);
+ }
+ */
+ for (i = 0; i < driver->playback_channels[chn].nb_overflow_bytes; ++i) {
midi_buffer[min_next_pos] = 0x01000000 | (driver->playback_channels[chn].overflow_buffer[i] & 0xFF);
min_next_pos += 8;
}
- driver->playback_channels[chn].nb_overflow_bytes=0;
-
+ driver->playback_channels[chn].nb_overflow_bytes = 0;
+
/* process the events in this period */
buf = jack_port_get_buffer (port, nframes);
- nevents = jack_midi_get_event_count(buf);
+ nevents = jack_midi_get_event_count (buf);
- for (i=0; i<nevents; ++i) {
+ for (i = 0; i < nevents; ++i) {
int j;
jack_midi_event_t event;
- jack_midi_event_get(&event, buf, i);
+ jack_midi_event_get (&event, buf, i);
- midi_pack_event(midi_pack, &event);
+ midi_pack_event (midi_pack, &event);
/* floor the initial position to be a multiple of 8 */
int pos = event.time & 0xFFFFFFF8;
- for(j = 0; j < event.size; j++) {
+ for (j = 0; j < event.size; j++) {
/* make sure we don't overwrite a previous byte */
- while(pos < min_next_pos && pos < nframes) {
+ while (pos < min_next_pos && pos < nframes)
/* printMessage("have to correct pos to %d", pos); */
pos += 8;
- }
- if(pos >= nframes) {
+ if (pos >= nframes) {
int f;
/* printMessage("midi message crosses period boundary"); */
driver->playback_channels[chn].nb_overflow_bytes = event.size - j;
- if(driver->playback_channels[chn].nb_overflow_bytes > MIDI_OVERFLOW_BUFFER_SIZE) {
- printError("too much midi bytes cross period boundary");
+ if (driver->playback_channels[chn].nb_overflow_bytes > MIDI_OVERFLOW_BUFFER_SIZE) {
+ printError ("too much midi bytes cross period boundary");
driver->playback_channels[chn].nb_overflow_bytes = MIDI_OVERFLOW_BUFFER_SIZE;
}
/* save the bytes that still have to be transmitted in the next period */
- for(f = 0; f < driver->playback_channels[chn].nb_overflow_bytes; f++) {
- driver->playback_channels[chn].overflow_buffer[f] = event.buffer[j+f];
- }
- /* exit since we can't transmit anything anymore.
- the rate should be controlled */
- if(i < nevents-1) {
- printError("%d midi events lost due to period crossing", nevents-i-1);
+ for (f = 0; f < driver->playback_channels[chn].nb_overflow_bytes; f++)
+ driver->playback_channels[chn].overflow_buffer[f] = event.buffer[j + f];
+ /* exit since we can't transmit anything anymore.
+ the rate should be controlled */
+ if (i < nevents - 1) {
+ printError ("%d midi events lost due to period crossing", nevents - i - 1);
}
break;
} else {
@@ -526,35 +526,35 @@ ffado_driver_write (ffado_driver_t * driver, jack_nframes_t nframes)
}
}
} else { /* ensure a valid buffer */
- ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(driver->nullbuffer));
- ffado_streaming_playback_stream_onoff(driver->dev, chn, 0);
+ ffado_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(driver->nullbuffer));
+ ffado_streaming_playback_stream_onoff (driver->dev, chn, 0);
}
}
- ffado_streaming_transfer_playback_buffers(driver->dev);
+ ffado_streaming_transfer_playback_buffers (driver->dev);
- printExit();
+ printExit ();
return 0;
}
-//static inline jack_nframes_t
-static jack_nframes_t
+//static inline jack_nframes_t
+static jack_nframes_t
ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
float *delayed_usecs)
{
- jack_time_t wait_enter;
- jack_time_t wait_ret;
- ffado_wait_response response;
-
- printEnter();
+ jack_time_t wait_enter;
+ jack_time_t wait_ret;
+ ffado_wait_response response;
+
+ printEnter ();
wait_enter = driver->engine->get_microseconds ();
if (wait_enter > driver->wait_next) {
/*
- * This processing cycle was delayed past the
- * next due interrupt! Do not account this as
- * a wakeup delay:
- */
+ * This processing cycle was delayed past the
+ * next due interrupt! Do not account this as
+ * a wakeup delay:
+ */
driver->wait_next = 0;
driver->wait_late++;
}
@@ -562,10 +562,10 @@ ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
// *status = -3; timeout
// *status = -4; extra FD
- response = ffado_streaming_wait(driver->dev);
-
+ response = ffado_streaming_wait (driver->dev);
+
wait_ret = driver->engine->get_microseconds ();
-
+
if (driver->wait_next && wait_ret > driver->wait_next) {
*delayed_usecs = wait_ret - driver->wait_next;
}
@@ -574,26 +574,26 @@ ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
driver->engine->transport_cycle_start (driver->engine, wait_ret);
if (response == ffado_wait_ok) {
// all good
- *status=0;
+ *status = 0;
} else if (response == ffado_wait_xrun) {
// xrun happened, but it's handled
- *status=0;
+ *status = 0;
return 0;
} else if (response == ffado_wait_error) {
// an error happened (unhandled xrun)
// this should be fatal
- *status=-1;
+ *status = -1;
return 0;
} else if (response == ffado_wait_shutdown) {
// we are to shutdown the ffado system
// this should be fatal
- *status=-1;
+ *status = -1;
return 0;
} else {
// we don't know about this response code
- printError("unknown wait response (%d) from ffado", response);
+ printError ("unknown wait response (%d) from ffado", response);
// this should be fatal
- *status=-1;
+ *status = -1;
return 0;
}
@@ -601,8 +601,8 @@ ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *status,
// FIXME: this should do something more useful
*delayed_usecs = 0;
-
- printExit();
+
+ printExit ();
return driver->period_size;
}
@@ -611,25 +611,25 @@ static int
ffado_driver_run_cycle (ffado_driver_t *driver)
{
jack_engine_t *engine = driver->engine;
- int wait_status=0;
- float delayed_usecs=0.0;
+ int wait_status = 0;
+ float delayed_usecs = 0.0;
jack_nframes_t nframes = ffado_driver_wait (driver, -1,
- &wait_status, &delayed_usecs);
-
+ &wait_status, &delayed_usecs);
+
if ((wait_status < 0)) {
- printError( "wait status < 0! (= %d)",wait_status);
+ printError ( "wait status < 0! (= %d)", wait_status);
return -1;
}
-
+
if ((nframes == 0)) {
/* we detected an xrun and restarted: notify
* clients about the delay. */
- printMessage("xrun detected");
+ printMessage ("xrun detected");
engine->delay (engine, delayed_usecs);
return 0;
- }
-
+ }
+
return engine->run_cycle (engine, nframes, delayed_usecs);
}
@@ -643,42 +643,42 @@ ffado_driver_null_cycle (ffado_driver_t* driver, jack_nframes_t nframes)
JSList *node;
ffado_streaming_stream_type stream_type;
- printEnter();
-
+ printEnter ();
+
if (driver->engine->freewheeling) {
return 0;
}
// write silence to buffer
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=ffado_streaming_get_playback_stream_type(driver->dev, chn);
+ stream_type = ffado_streaming_get_playback_stream_type (driver->dev, chn);
- if(stream_type == ffado_stream_type_audio) {
- ffado_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(driver->nullbuffer));
+ if (stream_type == ffado_stream_type_audio) {
+ ffado_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(driver->nullbuffer));
}
}
- ffado_streaming_transfer_playback_buffers(driver->dev);
-
+ ffado_streaming_transfer_playback_buffers (driver->dev);
+
// read & discard from input ports
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=ffado_streaming_get_capture_stream_type(driver->dev, chn);
- if(stream_type == ffado_stream_type_audio) {
- ffado_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(driver->scratchbuffer));
+ stream_type = ffado_streaming_get_capture_stream_type (driver->dev, chn);
+ if (stream_type == ffado_stream_type_audio) {
+ ffado_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(driver->scratchbuffer));
}
}
- ffado_streaming_transfer_capture_buffers(driver->dev);
+ ffado_streaming_transfer_capture_buffers (driver->dev);
- printExit();
+ printExit ();
return 0;
}
static int
ffado_driver_start (ffado_driver_t *driver)
{
- int retval=0;
+ int retval = 0;
- if((retval=ffado_streaming_start(driver->dev))) {
- printError("Could not start streaming threads: %d", retval);
+ if ((retval = ffado_streaming_start (driver->dev))) {
+ printError ("Could not start streaming threads: %d", retval);
return retval;
}
@@ -689,10 +689,10 @@ ffado_driver_start (ffado_driver_t *driver)
static int
ffado_driver_stop (ffado_driver_t *driver)
{
- int retval=0;
-
- if((retval=ffado_streaming_stop(driver->dev))) {
- printError("Could not stop streaming threads");
+ int retval = 0;
+
+ if ((retval = ffado_streaming_stop (driver->dev))) {
+ printError ("Could not stop streaming threads");
return retval;
}
@@ -706,55 +706,57 @@ ffado_driver_bufsize (ffado_driver_t* driver, jack_nframes_t nframes)
// The speed of this function isn't critical; we can afford the
// time to check the FFADO API version.
- if (ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE ||
- ffado_streaming_set_period_size == NULL) {
- printError("unsupported on current version of FFADO; please upgrade FFADO");
- return -1;
+ if (ffado_get_api_version () < FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE ||
+ ffado_streaming_set_period_size == NULL) {
+ printError ("unsupported on current version of FFADO; please upgrade FFADO");
+ return -1;
}
driver->period_size = nframes;
driver->period_usecs =
- (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
- * 1000000.0f);
+ (jack_time_t)floor ((((float)nframes) / driver->sample_rate)
+ * 1000000.0f);
// Reallocate the null and scratch buffers.
- driver->nullbuffer = calloc(driver->period_size, sizeof(ffado_sample_t));
- if(driver->nullbuffer == NULL) {
- printError("could not allocate memory for null buffer");
+ driver->nullbuffer = calloc (driver->period_size, sizeof(ffado_sample_t));
+ if (driver->nullbuffer == NULL) {
+ printError ("could not allocate memory for null buffer");
return -1;
}
- driver->scratchbuffer = calloc(driver->period_size, sizeof(ffado_sample_t));
- if(driver->scratchbuffer == NULL) {
- printError("could not allocate memory for scratch buffer");
+ driver->scratchbuffer = calloc (driver->period_size, sizeof(ffado_sample_t));
+ if (driver->scratchbuffer == NULL) {
+ printError ("could not allocate memory for scratch buffer");
return -1;
}
// MIDI buffers need reallocating
for (chn = 0; chn < driver->capture_nchannels; chn++) {
- if(driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
+ if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
// setup the midi buffer
- if (driver->capture_channels[chn].midi_buffer != NULL)
- free(driver->capture_channels[chn].midi_buffer);
- driver->capture_channels[chn].midi_buffer = calloc(driver->period_size, sizeof(uint32_t));
+ if (driver->capture_channels[chn].midi_buffer != NULL) {
+ free (driver->capture_channels[chn].midi_buffer);
+ }
+ driver->capture_channels[chn].midi_buffer = calloc (driver->period_size, sizeof(uint32_t));
}
}
for (chn = 0; chn < driver->playback_nchannels; chn++) {
- if(driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
- if (driver->playback_channels[chn].midi_buffer != NULL)
- free(driver->playback_channels[chn].midi_buffer);
- driver->playback_channels[chn].midi_buffer = calloc(driver->period_size, sizeof(uint32_t));
+ if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
+ if (driver->playback_channels[chn].midi_buffer != NULL) {
+ free (driver->playback_channels[chn].midi_buffer);
+ }
+ driver->playback_channels[chn].midi_buffer = calloc (driver->period_size, sizeof(uint32_t));
}
}
// Notify FFADO of the period size change
- if (ffado_streaming_set_period_size(driver->dev, nframes) != 0) {
- printError("could not alter FFADO device period size");
- return -1;
+ if (ffado_streaming_set_period_size (driver->dev, nframes) != 0) {
+ printError ("could not alter FFADO device period size");
+ return -1;
}
// This is needed to give the shadow variables a chance to
// properly update to the changes.
- sleep(1);
+ sleep (1);
/* tell the engine to change its buffer size */
if (driver->engine->set_buffer_size (driver->engine, nframes)) {
@@ -762,10 +764,10 @@ ffado_driver_bufsize (ffado_driver_t* driver, jack_nframes_t nframes)
return -1;
}
- return 0;
+ return 0;
}
-typedef void (*JackDriverFinishFunction) (jack_driver_t *);
+typedef void (*JackDriverFinishFunction)(jack_driver_t *);
ffado_driver_t *
ffado_driver_new (jack_client_t * client,
@@ -774,66 +776,66 @@ ffado_driver_new (jack_client_t * client,
{
ffado_driver_t *driver;
- if(ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION) {
- printError("Incompatible libffado version! (%s)", ffado_get_version());
+ if (ffado_get_api_version () < FIREWIRE_REQUIRED_FFADO_API_VERSION) {
+ printError ("Incompatible libffado version! (%s)", ffado_get_version ());
return NULL;
}
- printMessage("Starting firewire backend (%s)", ffado_get_version());
+ printMessage ("Starting firewire backend (%s)", ffado_get_version ());
- driver = calloc (1, sizeof (ffado_driver_t));
+ driver = calloc (1, sizeof(ffado_driver_t));
- /* Setup the jack interfaces */
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
+ /* Setup the jack interfaces */
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->nt_attach = (JackDriverNTAttachFunction)ffado_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)ffado_driver_detach;
+ driver->nt_start = (JackDriverNTStartFunction)ffado_driver_start;
+ driver->nt_stop = (JackDriverNTStopFunction)ffado_driver_stop;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)ffado_driver_run_cycle;
+ driver->null_cycle = (JackDriverNullCycleFunction)ffado_driver_null_cycle;
+ driver->write = (JackDriverReadFunction)ffado_driver_write;
+ driver->read = (JackDriverReadFunction)ffado_driver_read;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)ffado_driver_bufsize;
- driver->nt_attach = (JackDriverNTAttachFunction) ffado_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) ffado_driver_detach;
- driver->nt_start = (JackDriverNTStartFunction) ffado_driver_start;
- driver->nt_stop = (JackDriverNTStopFunction) ffado_driver_stop;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) ffado_driver_run_cycle;
- driver->null_cycle = (JackDriverNullCycleFunction) ffado_driver_null_cycle;
- driver->write = (JackDriverReadFunction) ffado_driver_write;
- driver->read = (JackDriverReadFunction) ffado_driver_read;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) ffado_driver_bufsize;
-
/* copy command line parameter contents to the driver structure */
- memcpy(&driver->settings,params,sizeof(ffado_jack_settings_t));
-
+ memcpy (&driver->settings, params, sizeof(ffado_jack_settings_t));
+
/* prepare all parameters */
driver->sample_rate = params->sample_rate;
driver->period_size = params->period_size;
driver->last_wait_ust = 0;
-
+
driver->period_usecs =
- (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate);
+ (jack_time_t)floor ((((float)driver->period_size) * 1000000.0f) / driver->sample_rate);
driver->client = client;
driver->engine = NULL;
- jack_set_latency_callback (client, ffado_latency_callback, driver);
+ jack_set_latency_callback (client, ffado_latency_callback, driver);
- memset(&driver->device_options,0,sizeof(driver->device_options));
- driver->device_options.sample_rate=params->sample_rate;
- driver->device_options.period_size=params->period_size;
- driver->device_options.nb_buffers=params->buffer_size;
+ memset (&driver->device_options, 0, sizeof(driver->device_options));
+ driver->device_options.sample_rate = params->sample_rate;
+ driver->device_options.period_size = params->period_size;
+ driver->device_options.nb_buffers = params->buffer_size;
driver->capture_frame_latency = params->capture_frame_latency;
driver->playback_frame_latency = params->playback_frame_latency;
- driver->device_options.slave_mode=params->slave_mode;
- driver->device_options.snoop_mode=params->snoop_mode;
- driver->device_options.verbose=params->verbose_level;
-
- driver->device_info.nb_device_spec_strings=1;
- driver->device_info.device_spec_strings=calloc(1, sizeof(char *));
- driver->device_info.device_spec_strings[0]=strdup(params->device_info);
-
- debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s for FFADO %s (API version %d)",
- __DATE__, __TIME__, ffado_get_version(), ffado_get_api_version());
- debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name);
- debugPrint(DEBUG_LEVEL_STARTUP, " period_size: %d", driver->period_size);
- debugPrint(DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
- debugPrint(DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->sample_rate);
-
- return (ffado_driver_t *) driver;
+ driver->device_options.slave_mode = params->slave_mode;
+ driver->device_options.snoop_mode = params->snoop_mode;
+ driver->device_options.verbose = params->verbose_level;
+
+ driver->device_info.nb_device_spec_strings = 1;
+ driver->device_info.device_spec_strings = calloc (1, sizeof(char *));
+ driver->device_info.device_spec_strings[0] = strdup (params->device_info);
+
+ debugPrint (DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s for FFADO %s (API version %d)",
+ __DATE__, __TIME__, ffado_get_version (), ffado_get_api_version ());
+ debugPrint (DEBUG_LEVEL_STARTUP, " Created driver %s", name);
+ debugPrint (DEBUG_LEVEL_STARTUP, " period_size: %d", driver->period_size);
+ debugPrint (DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
+ debugPrint (DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->sample_rate);
+
+ return (ffado_driver_t*)driver;
}
@@ -841,10 +843,10 @@ static void
ffado_driver_delete (ffado_driver_t *driver)
{
unsigned int i;
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
- for (i=0; i < driver->device_info.nb_device_spec_strings; i++) {
+
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
+ for (i = 0; i < driver->device_info.nb_device_spec_strings; i++)
free (driver->device_info.device_spec_strings[i]);
- }
free (driver->device_info.device_spec_strings);
free (driver);
}
@@ -862,12 +864,12 @@ driver_get_descriptor ()
jack_driver_param_desc_t * params;
unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
strcpy (desc->name, "firewire");
desc->nparams = 11;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
desc->params = params;
i = 0;
@@ -877,7 +879,7 @@ driver_get_descriptor ()
strcpy (params[i].value.str, "hw:0");
strcpy (params[i].short_desc, "The FireWire device to use.");
strcpy (params[i].long_desc, "The FireWire device to use. Please consult the FFADO documentation for more info.");
-
+
i++;
strcpy (params[i].name, "period");
params[i].character = 'p';
@@ -885,7 +887,7 @@ driver_get_descriptor ()
params[i].value.ui = 1024;
strcpy (params[i].short_desc, "Frames per period");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "nperiods");
params[i].character = 'n';
@@ -949,7 +951,7 @@ driver_get_descriptor ()
params[i].value.ui = 0U;
strcpy (params[i].short_desc, "Operate in snoop mode");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "verbose");
params[i].character = 'v';
@@ -972,30 +974,28 @@ driver_initialize (jack_client_t *client, JSList * params)
ffado_jack_settings_t cmlparams;
- char *device_name="hw:0";
+ char *device_name = "hw:0";
- cmlparams.period_size_set=0;
- cmlparams.sample_rate_set=0;
- cmlparams.buffer_size_set=0;
+ cmlparams.period_size_set = 0;
+ cmlparams.sample_rate_set = 0;
+ cmlparams.buffer_size_set = 0;
/* default values */
- cmlparams.period_size=1024;
- cmlparams.sample_rate=48000;
- cmlparams.buffer_size=3;
- cmlparams.playback_ports=1;
- cmlparams.capture_ports=1;
- cmlparams.playback_frame_latency=0;
- cmlparams.capture_frame_latency=0;
- cmlparams.slave_mode=0;
- cmlparams.snoop_mode=0;
- cmlparams.verbose_level=0;
-
- for (node = params; node; node = jack_slist_next (node))
- {
- param = (jack_driver_param_t *) node->data;
-
- switch (param->character)
- {
+ cmlparams.period_size = 1024;
+ cmlparams.sample_rate = 48000;
+ cmlparams.buffer_size = 3;
+ cmlparams.playback_ports = 1;
+ cmlparams.capture_ports = 1;
+ cmlparams.playback_frame_latency = 0;
+ cmlparams.capture_frame_latency = 0;
+ cmlparams.slave_mode = 0;
+ cmlparams.snoop_mode = 0;
+ cmlparams.verbose_level = 0;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (jack_driver_param_t*)node->data;
+
+ switch (param->character) {
case 'd':
device_name = strdup (param->value.str);
break;
@@ -1035,10 +1035,10 @@ driver_initialize (jack_client_t *client, JSList * params)
}
}
- // temporary
- cmlparams.device_info = device_name;
+ // temporary
+ cmlparams.device_info = device_name;
- driver=(jack_driver_t *)ffado_driver_new (client, "ffado_pcm", &cmlparams);
+ driver = (jack_driver_t*)ffado_driver_new (client, "ffado_pcm", &cmlparams);
return driver;
}
@@ -1046,11 +1046,13 @@ driver_initialize (jack_client_t *client, JSList * params)
void
driver_finish (jack_driver_t *driver)
{
- ffado_driver_t *drv=(ffado_driver_t *) driver;
+ ffado_driver_t *drv = (ffado_driver_t*)driver;
+
// If jack hasn't called the detach method, do it now. As of jack 0.101.1
- // the detach method was not being called explicitly on closedown, and
+ // the detach method was not being called explicitly on closedown, and
// we need it to at least deallocate the iso resources.
- if (drv->dev != NULL)
- ffado_driver_detach(drv);
+ if (drv->dev != NULL) {
+ ffado_driver_detach (drv);
+ }
ffado_driver_delete (drv);
}
diff --git a/drivers/firewire/ffado_driver.h b/drivers/firewire/ffado_driver.h
index f26234a..2201f9f 100644
--- a/drivers/firewire/ffado_driver.h
+++ b/drivers/firewire/ffado_driver.h
@@ -23,11 +23,11 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/*
+/*
* Main Jack driver entry routines
*
- */
-
+ */
+
#ifndef __JACK_FFADO_DRIVER_H__
#define __JACK_FFADO_DRIVER_H__
@@ -59,53 +59,53 @@
#include "../alsa_midi/midi_unpack.h"
// 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_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_RUN_CYCLE (1 << 8)
-#define DEBUG_LEVEL_PACKETCOUNTER (1<<16)
-#define DEBUG_LEVEL_STARTUP (1<<17)
-#define DEBUG_LEVEL_THREADS (1<<18)
+#define DEBUG_LEVEL_PACKETCOUNTER (1 << 16)
+#define DEBUG_LEVEL_STARTUP (1 << 17)
+#define DEBUG_LEVEL_THREADS (1 << 18)
//#define DEBUG_ENABLED
#ifdef DEBUG_ENABLED
- // default debug level
+// default debug level
#define DEBUG_LEVEL ( DEBUG_LEVEL_RUN_CYCLE | \
- (DEBUG_LEVEL_XRUN_RECOVERY)| DEBUG_LEVEL_STARTUP | DEBUG_LEVEL_WAIT | DEBUG_LEVEL_PACKETCOUNTER)
+ (DEBUG_LEVEL_XRUN_RECOVERY) | DEBUG_LEVEL_STARTUP | DEBUG_LEVEL_WAIT | DEBUG_LEVEL_PACKETCOUNTER)
#warning Building debug build!
- #define printMessage(format, args...) jack_error( "firewire MSG: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ##args )
- #define printError(format, args...) jack_error( "firewire ERR: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ##args )
-
- #define printEnter() jack_error( "FWDRV ENTERS: %s (%s)\n", __FUNCTION__, __FILE__)
- #define printExit() jack_error( "FWDRV EXITS: %s (%s)\n", __FUNCTION__, __FILE__)
- #define printEnter()
- #define printExit()
-
- #define debugError(format, args...) jack_error( "firewire 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;
+ #define printMessage(format, args ...) jack_error ( "firewire MSG: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ## args )
+ #define printError(format, args ...) jack_error ( "firewire ERR: %s:%d (%s): " format, __FILE__, __LINE__, __FUNCTION__, ## args )
+
+ #define printEnter() jack_error ( "FWDRV ENTERS: %s (%s)\n", __FUNCTION__, __FILE__)
+ #define printExit() jack_error ( "FWDRV EXITS: %s (%s)\n", __FUNCTION__, __FILE__)
+ #define printEnter()
+ #define printExit()
+
+ #define debugError(format, args ...) jack_error ( "firewire 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("firewire MSG: " format, ##args )
- #define printError(format, args...) jack_error("firewire 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...)
+
+ #define printMessage(format, args ...) if (g_verbose) \
+ jack_error ("firewire MSG: " format, ## args )
+ #define printError(format, args ...) jack_error ("firewire 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
typedef struct _ffado_driver ffado_driver_t;
@@ -116,39 +116,37 @@ typedef struct _ffado_driver ffado_driver_t;
typedef struct _ffado_jack_settings ffado_jack_settings_t;
struct _ffado_jack_settings {
- int verbose_level;
-
- 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 playback_ports;
- int capture_ports;
-
- jack_nframes_t capture_frame_latency;
- jack_nframes_t playback_frame_latency;
-
- int slave_mode;
- int snoop_mode;
-
- char *device_info;
+ int verbose_level;
+
+ 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 playback_ports;
+ int capture_ports;
+
+ jack_nframes_t capture_frame_latency;
+ jack_nframes_t playback_frame_latency;
+
+ int slave_mode;
+ int snoop_mode;
+
+ char *device_info;
};
-typedef struct _ffado_capture_channel
-{
+typedef struct _ffado_capture_channel {
ffado_streaming_stream_type stream_type;
midi_unpack_t midi_unpack;
uint32_t *midi_buffer;
} ffado_capture_channel_t;
#define MIDI_OVERFLOW_BUFFER_SIZE 4
-typedef struct _ffado_playback_channel
-{
+typedef struct _ffado_playback_channel {
ffado_streaming_stream_type stream_type;
midi_pack_t midi_pack;
uint32_t *midi_buffer;
@@ -161,50 +159,49 @@ typedef struct _ffado_playback_channel
/*
* JACK driver structure
*/
-struct _ffado_driver
-{
+struct _ffado_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;
+ 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 xrun_detected;
+ int xrun_count;
+
int process_count;
-
+
/* settings from the command line */
ffado_jack_settings_t settings;
-
+
/* the firewire virtual device */
ffado_device_t *dev;
ffado_sample_t *nullbuffer;
ffado_sample_t *scratchbuffer;
- JSList *capture_ports;
- JSList *playback_ports;
- JSList *monitor_ports;
- channel_t playback_nchannels;
- channel_t capture_nchannels;
+ JSList *capture_ports;
+ JSList *playback_ports;
+ JSList *monitor_ports;
+ channel_t playback_nchannels;
+ channel_t capture_nchannels;
ffado_playback_channel_t *playback_channels;
ffado_capture_channel_t *capture_channels;
- jack_nframes_t playback_frame_latency;
- jack_nframes_t capture_frame_latency;
-
+ jack_nframes_t playback_frame_latency;
+ jack_nframes_t capture_frame_latency;
+
ffado_device_info_t device_info;
ffado_options_t device_options;
-};
+};
diff --git a/drivers/freebob/freebob_driver.c b/drivers/freebob/freebob_driver.c
index 81ab446..d26e6dd 100644
--- a/drivers/freebob/freebob_driver.c
+++ b/drivers/freebob/freebob_driver.c
@@ -22,10 +22,10 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/*
+/*
* Main Jack driver entry routines
*
- */
+ */
#include <math.h>
#include <stdio.h>
@@ -49,17 +49,17 @@
#define SAMPLE_MAX_24BIT 8388608.0f
#define SAMPLE_MAX_16BIT 32768.0f
-static int freebob_driver_stop (freebob_driver_t *driver);
+static int freebob_driver_stop(freebob_driver_t *driver);
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver);
- static void freebob_driver_midi_finish (freebob_driver_midi_handle_t *m);
- static int freebob_driver_midi_start (freebob_driver_midi_handle_t *m);
- static int freebob_driver_midi_stop (freebob_driver_midi_handle_t *m);
+static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver);
+static void freebob_driver_midi_finish(freebob_driver_midi_handle_t *m);
+static int freebob_driver_midi_start(freebob_driver_midi_handle_t *m);
+static int freebob_driver_midi_stop(freebob_driver_midi_handle_t *m);
#endif
// enable verbose messages
-static int g_verbose=0;
+static int g_verbose = 0;
static int
freebob_driver_attach (freebob_driver_t *driver)
@@ -68,13 +68,13 @@ freebob_driver_attach (freebob_driver_t *driver)
char buf2[64];
channel_t chn;
- jack_port_t *port=NULL;
+ jack_port_t *port = NULL;
int port_flags;
- int error=0;
+ int error = 0;
jack_latency_range_t range;
- g_verbose=driver->engine->verbose;
- driver->device_options.verbose=g_verbose;
+ g_verbose = driver->engine->verbose;
+ driver->device_options.verbose = g_verbose;
if (driver->engine->set_buffer_size (driver->engine, driver->period_size)) {
jack_error ("FREEBOB: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
@@ -83,63 +83,65 @@ freebob_driver_attach (freebob_driver_t *driver)
driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
/* packetizer thread options */
- driver->device_options.realtime=(driver->engine->control->real_time? 1 : 0);
-
- driver->device_options.packetizer_priority=driver->engine->control->client_priority +
- FREEBOB_RT_PRIORITY_PACKETIZER_RELATIVE;
- if (driver->device_options.packetizer_priority>98) {
- driver->device_options.packetizer_priority=98;
+ driver->device_options.realtime = (driver->engine->control->real_time ? 1 : 0);
+
+ driver->device_options.packetizer_priority = driver->engine->control->client_priority +
+ FREEBOB_RT_PRIORITY_PACKETIZER_RELATIVE;
+ if (driver->device_options.packetizer_priority > 98) {
+ driver->device_options.packetizer_priority = 98;
}
- driver->dev=freebob_streaming_init(&driver->device_info,driver->device_options);
+ driver->dev = freebob_streaming_init (&driver->device_info, driver->device_options);
- if(!driver->dev) {
- printError("FREEBOB: Error creating virtual device");
+ if (!driver->dev) {
+ printError ("FREEBOB: Error creating virtual device");
return -1;
}
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- driver->midi_handle=freebob_driver_midi_init(driver);
- if(!driver->midi_handle) {
- printError("-----------------------------------------------------------");
- printError("Error creating midi device!");
- printError("FreeBob will run without MIDI support.");
- printError("Consult the above error messages to solve the problem. ");
- printError("-----------------------------------------------------------\n\n");
+ driver->midi_handle = freebob_driver_midi_init (driver);
+ if (!driver->midi_handle) {
+ printError ("-----------------------------------------------------------");
+ printError ("Error creating midi device!");
+ printError ("FreeBob will run without MIDI support.");
+ printError ("Consult the above error messages to solve the problem. ");
+ printError ("-----------------------------------------------------------\n\n");
}
#endif
if (driver->device_options.realtime) {
- printMessage("Streaming thread running with Realtime scheduling, priority %d",
- driver->device_options.packetizer_priority);
+ printMessage ("Streaming thread running with Realtime scheduling, priority %d",
+ driver->device_options.packetizer_priority);
} else {
- printMessage("Streaming thread running without Realtime scheduling");
+ printMessage ("Streaming thread running without Realtime scheduling");
}
/* ports */
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
- driver->capture_nchannels=freebob_streaming_get_nb_capture_streams(driver->dev);
+ driver->capture_nchannels = freebob_streaming_get_nb_capture_streams (driver->dev);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
// allocate midi structures
- driver->midi_in_ports=calloc(driver->capture_nchannels, sizeof(freebob_midi_input_port_t));
- if (driver->midi_in_ports == NULL) return -ENOMEM;
+ driver->midi_in_ports = calloc (driver->capture_nchannels, sizeof(freebob_midi_input_port_t));
+ if (driver->midi_in_ports == NULL) {
+ return -ENOMEM;
+ }
#endif
for (chn = 0; chn < driver->capture_nchannels; chn++) {
- error=0;
+ error = 0;
- freebob_streaming_get_capture_stream_name(driver->dev, chn, buf, sizeof(buf) - 1);
- switch(freebob_streaming_get_capture_stream_type(driver->dev, chn)) {
+ freebob_streaming_get_capture_stream_name (driver->dev, chn, buf, sizeof(buf) - 1);
+ switch (freebob_streaming_get_capture_stream_type (driver->dev, chn)) {
case freebob_stream_type_audio:
- snprintf(buf2, 64, "C%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "C%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering audio capture port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0)) == NULL) {
printError (" cannot register port for %s", buf2);
- error=1;
+ error = 1;
break;
}
driver->capture_ports =
@@ -148,18 +150,18 @@ freebob_driver_attach (freebob_driver_t *driver)
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
case freebob_stream_type_midi:
- snprintf(buf2, 64, "CM%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "CM%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering midi capture port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_MIDI_TYPE,
port_flags, 0)) == NULL) {
printError (" cannot register port for %s", buf2);
- error=1;
+ error = 1;
break;
}
// init the midi unpacker for this port
- midi_unpack_init(&driver->midi_in_ports[chn].unpack);
+ midi_unpack_init (&driver->midi_in_ports[chn].unpack);
driver->capture_ports =
jack_slist_append (driver->capture_ports, port);
@@ -174,36 +176,40 @@ freebob_driver_attach (freebob_driver_t *driver)
break;
}
- if(error) break;
+ if (error) {
+ break;
+ }
range.min = range.max = driver->period_size + driver->capture_frame_latency;
jack_port_set_latency_range (port, JackCaptureLatency, &range);
}
-
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
- driver->playback_nchannels=freebob_streaming_get_nb_playback_streams(driver->dev);
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+
+ driver->playback_nchannels = freebob_streaming_get_nb_playback_streams (driver->dev);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
// allocate midi structures
- driver->midi_out_ports=calloc(driver->playback_nchannels, sizeof(freebob_midi_output_port_t));
- if (driver->midi_out_ports == NULL) return -ENOMEM;
+ driver->midi_out_ports = calloc (driver->playback_nchannels, sizeof(freebob_midi_output_port_t));
+ if (driver->midi_out_ports == NULL) {
+ return -ENOMEM;
+ }
#endif
for (chn = 0; chn < driver->playback_nchannels; chn++) {
- error=0;
+ error = 0;
- freebob_streaming_get_playback_stream_name(driver->dev, chn, buf, sizeof(buf) - 1);
-
- switch(freebob_streaming_get_playback_stream_type(driver->dev, chn)){
+ freebob_streaming_get_playback_stream_name (driver->dev, chn, buf, sizeof(buf) - 1);
+
+ switch (freebob_streaming_get_playback_stream_type (driver->dev, chn)) {
case freebob_stream_type_audio:
- snprintf(buf2, 64, "P%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "P%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering playback audio port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_AUDIO_TYPE,
port_flags, 0)) == NULL) {
- printError(" cannot register port for %s", buf2);
- error=1;
+ printError (" cannot register port for %s", buf2);
+ error = 1;
break;
}
driver->playback_ports =
@@ -211,13 +217,13 @@ freebob_driver_attach (freebob_driver_t *driver)
break;
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
case freebob_stream_type_midi:
- snprintf(buf2, 64, "PM%d_%s",(int)chn,buf); // needed to avoid duplicate names
+ snprintf (buf2, 64, "PM%d_%s", (int)chn, buf); // needed to avoid duplicate names
printMessage ("Registering playback midi port %s", buf2);
if ((port = jack_port_register (driver->client, buf2,
JACK_DEFAULT_MIDI_TYPE,
port_flags, 0)) == NULL) {
- printError(" cannot register port for %s", buf2);
- error=1;
+ printError (" cannot register port for %s", buf2);
+ error = 1;
break;
}
@@ -232,7 +238,9 @@ freebob_driver_attach (freebob_driver_t *driver)
jack_slist_append (driver->playback_ports, NULL);
}
- if(error) break;
+ if (error) {
+ break;
+ }
range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + driver->playback_frame_latency;
jack_port_set_latency_range (port, JackPlaybackLatency, &range);
@@ -252,39 +260,39 @@ freebob_driver_detach (freebob_driver_t *driver)
for (node = driver->capture_ports; node && node->data;
node = jack_slist_next (node)) {
- if(node->data != NULL) {
+ if (node->data != NULL) {
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
}
}
jack_slist_free (driver->capture_ports);
driver->capture_ports = 0;
-
+
for (node = driver->playback_ports; node && node->data;
node = jack_slist_next (node)) {
- if(node->data != NULL) {
+ if (node->data != NULL) {
jack_port_unregister (driver->client,
- ((jack_port_t *) node->data));
+ ((jack_port_t*)node->data));
}
}
jack_slist_free (driver->playback_ports);
driver->playback_ports = 0;
- freebob_streaming_finish(driver->dev);
- driver->dev=NULL;
+ freebob_streaming_finish (driver->dev);
+ driver->dev = NULL;
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- freebob_driver_midi_finish(driver->midi_handle);
+ if (driver->midi_handle) {
+ freebob_driver_midi_finish (driver->midi_handle);
}
- driver->midi_handle=NULL;
+ driver->midi_handle = NULL;
#endif
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- free(driver->midi_in_ports);
- free(driver->midi_out_ports);
+ free (driver->midi_in_ports);
+ free (driver->midi_out_ports);
#endif
return 0;
}
@@ -296,66 +304,67 @@ freebob_driver_read (freebob_driver_t * driver, jack_nframes_t nframes)
channel_t chn;
JSList *node;
jack_port_t* port;
-
+
freebob_sample_t nullbuffer[nframes];
- void *addr_of_nullbuffer=(void *)nullbuffer;
+ void *addr_of_nullbuffer = (void*)nullbuffer;
freebob_streaming_stream_type stream_type;
-
- printEnter();
-
+
+ printEnter ();
+
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
- stream_type = freebob_streaming_get_capture_stream_type(driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- port = (jack_port_t *) node->data;
+ stream_type = freebob_streaming_get_capture_stream_type (driver->dev, chn);
+ if (stream_type == freebob_stream_type_audio) {
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- if(!buf) buf=(jack_default_audio_sample_t *)addr_of_nullbuffer;
-
- freebob_streaming_set_capture_stream_buffer(
- driver->dev, chn, (char *)(buf), freebob_buffer_type_float);
+ if (!buf) {
+ buf = (jack_default_audio_sample_t*)addr_of_nullbuffer;
+ }
+
+ freebob_streaming_set_capture_stream_buffer (
+ driver->dev, chn, (char*)(buf), freebob_buffer_type_float);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- } else if(stream_type == freebob_stream_type_midi) {
+ } else if (stream_type == freebob_stream_type_midi) {
unsigned int midibuff[64];
unsigned char midibuff2[64];
int samples_read;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- jack_midi_clear_buffer(buf);
+ jack_midi_clear_buffer (buf);
- samples_read=freebob_streaming_read(
+ samples_read = freebob_streaming_read (
driver->dev, chn, midibuff, 64);
- while(samples_read) {
+ while (samples_read) {
int idx;
int done;
//printMessage("MIDI: ");
- for (idx=0;idx<samples_read;idx++) {
- midibuff2[idx]=(unsigned char)(midibuff[idx] & 0xFF);
+ for (idx = 0; idx < samples_read; idx++)
+ midibuff2[idx] = (unsigned char)(midibuff[idx] & 0xFF);
//printMessage(" %02X", midibuff2[idx]);
- }
- done = midi_unpack_buf(
+ done = midi_unpack_buf (
&driver->midi_in_ports[chn].unpack,
midibuff2, samples_read, buf, 0 /* time */);
- samples_read=freebob_streaming_read(
+ samples_read = freebob_streaming_read (
driver->dev, chn, midibuff, 64);
}
#endif
} else { // empty other buffers without doing something with them
- freebob_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(nullbuffer), freebob_buffer_type_uint24);
+ freebob_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(nullbuffer), freebob_buffer_type_uint24);
}
}
// now transfer the buffers
- freebob_streaming_transfer_capture_buffers(driver->dev);
-
- printExit();
-
+ freebob_streaming_transfer_capture_buffers (driver->dev);
+
+ printExit ();
+
return 0;
}
@@ -373,93 +382,95 @@ freebob_driver_write (freebob_driver_t * driver, jack_nframes_t nframes)
freebob_sample_t nullbuffer[nframes];
void *addr_of_nullbuffer = (void*)nullbuffer;
- memset(&nullbuffer,0,nframes*sizeof(freebob_sample_t));
+ memset (&nullbuffer, 0, nframes * sizeof(freebob_sample_t));
- printEnter();
+ printEnter ();
driver->process_count++;
- assert(driver->dev);
+ assert (driver->dev);
- if (driver->engine->freewheeling) {
- return 0;
- }
+ if (driver->engine->freewheeling) {
+ return 0;
+ }
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=freebob_streaming_get_playback_stream_type(driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- port = (jack_port_t *) node->data;
+ stream_type = freebob_streaming_get_playback_stream_type (driver->dev, chn);
+ if (stream_type == freebob_stream_type_audio) {
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- if(!buf) buf=(jack_default_audio_sample_t*)addr_of_nullbuffer;
-
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buf), freebob_buffer_type_float);
+ if (!buf) {
+ buf = (jack_default_audio_sample_t*)addr_of_nullbuffer;
+ }
+
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(buf), freebob_buffer_type_float);
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- } else if(stream_type == freebob_stream_type_midi) {
- int i,idx;
+ } else if (stream_type == freebob_stream_type_midi) {
+ int i, idx;
int samples_written;
- port = (jack_port_t *) node->data;
+ port = (jack_port_t*)node->data;
buf = jack_port_get_buffer (port, nframes);
- int nevents = jack_midi_get_event_count(buf);
+ int nevents = jack_midi_get_event_count (buf);
- if (nevents)
- printMessage("jack_out: %d events\n", nevents);
- for (i=0; i<nevents; ++i) {
+ if (nevents) {
+ printMessage ("jack_out: %d events\n", nevents);
+ }
+ for (i = 0; i < nevents; ++i) {
jack_midi_event_t event;
-
- jack_midi_event_get(&event, buf, i);
-
- midi_pack_event(&driver->midi_out_ports[chn].packer, &event);
+
+ jack_midi_event_get (&event, buf, i);
+
+ midi_pack_event (&driver->midi_out_ports[chn].packer, &event);
freebob_sample_t midibuff[event.size];
- for (idx=0;idx<event.size;idx++) {
- midibuff[idx]=(freebob_sample_t)(event.buffer[idx]);
- }
+ for (idx = 0; idx < event.size; idx++)
+ midibuff[idx] = (freebob_sample_t)(event.buffer[idx]);
- samples_written=freebob_streaming_write(
+ samples_written = freebob_streaming_write (
driver->dev, chn, midibuff, event.size);
- if (samples_written!=event.size) {
- printMessage("midi out: buffer overrun\n");
+ if (samples_written != event.size) {
+ printMessage ("midi out: buffer overrun\n");
break;
} else {
- printMessage("midi out: sent %d-byte event at %ld\n", (int)event.size, (long)event.time);
+ printMessage ("midi out: sent %d-byte event at %ld\n", (int)event.size, (long)event.time);
}
}
#endif
} else { // empty other buffers without doing something with them
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(nullbuffer), freebob_buffer_type_uint24);
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(nullbuffer), freebob_buffer_type_uint24);
}
}
- freebob_streaming_transfer_playback_buffers(driver->dev);
+ freebob_streaming_transfer_playback_buffers (driver->dev);
+
+ printExit ();
- printExit();
-
return 0;
}
-//static inline jack_nframes_t
-static jack_nframes_t
+//static inline jack_nframes_t
+static jack_nframes_t
freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status,
- float *delayed_usecs)
+ float *delayed_usecs)
{
int nframes;
- jack_time_t wait_enter;
- jack_time_t wait_ret;
-
- printEnter();
+ jack_time_t wait_enter;
+ jack_time_t wait_ret;
+
+ printEnter ();
wait_enter = driver->engine->get_microseconds ();
if (wait_enter > driver->wait_next) {
/*
- * This processing cycle was delayed past the
- * next due interrupt! Do not account this as
- * a wakeup delay:
- */
+ * This processing cycle was delayed past the
+ * next due interrupt! Do not account this as
+ * a wakeup delay:
+ */
driver->wait_next = 0;
driver->wait_late++;
}
@@ -467,24 +478,24 @@ freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status,
// *status = -3; timeout
// *status = -4; extra FD
- nframes=freebob_streaming_wait(driver->dev);
-
+ nframes = freebob_streaming_wait (driver->dev);
+
wait_ret = driver->engine->get_microseconds ();
-
+
if (driver->wait_next && wait_ret > driver->wait_next) {
*delayed_usecs = wait_ret - driver->wait_next;
}
driver->wait_last = wait_ret;
driver->wait_next = wait_ret + driver->period_usecs;
driver->engine->transport_cycle_start (driver->engine, wait_ret);
-
+
// transfer the streaming buffers
// we now do this in the read/write functions
-// freebob_streaming_transfer_buffers(driver->dev);
-
+// freebob_streaming_transfer_buffers(driver->dev);
+
if (nframes < 0) {
- *status=0;
-
+ *status = 0;
+
return 0;
//nframes=driver->period_size; //debug
}
@@ -494,53 +505,52 @@ freebob_driver_wait (freebob_driver_t *driver, int extra_fd, int *status,
// FIXME: this should do something more usefull
*delayed_usecs = 0;
-
- printExit();
+
+ printExit ();
return nframes - nframes % driver->period_size;
-
+
}
static int
freebob_driver_run_cycle (freebob_driver_t *driver)
{
jack_engine_t *engine = driver->engine;
- int wait_status=0;
- float delayed_usecs=0.0;
+ int wait_status = 0;
+ float delayed_usecs = 0.0;
jack_nframes_t nframes = freebob_driver_wait (driver, -1, &wait_status,
- &delayed_usecs);
-
+ &delayed_usecs);
+
if ((wait_status < 0)) {
- printError( "wait status < 0! (= %d)",wait_status);
+ printError ( "wait status < 0! (= %d)", wait_status);
return -1;
}
-
+
if ((nframes == 0)) {
int chn;
- chn=0; // avoid unused variable warning when compiling without jack midi
+ chn = 0; // avoid unused variable warning when compiling without jack midi
/* we detected an xrun and restarted: notify
* clients about the delay. */
- printMessage("xrun detected");
+ printMessage ("xrun detected");
engine->delay (engine, delayed_usecs);
// reset the midi stuff
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- for (chn = 0; chn < driver->capture_nchannels; chn++) {
- // init the midi unpacker for this port
- midi_unpack_reset(&driver->midi_in_ports[chn].unpack);
- }
-
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
- // init the midi unpacker for this port
- midi_pack_reset(&driver->midi_out_ports[chn].packer);
- }
+ for (chn = 0; chn < driver->capture_nchannels; chn++)
+ // init the midi unpacker for this port
+ midi_unpack_reset (&driver->midi_in_ports[chn].unpack);
+
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
+ // init the midi unpacker for this port
+ midi_pack_reset (&driver->midi_out_ports[chn].packer);
+
#endif
return 0;
- }
-
+ }
+
return engine->run_cycle (engine, nframes, delayed_usecs);
}
@@ -557,90 +567,90 @@ freebob_driver_null_cycle (freebob_driver_t* driver, jack_nframes_t nframes)
freebob_streaming_stream_type stream_type;
jack_default_audio_sample_t buff[nframes];
- jack_default_audio_sample_t* buffer=(jack_default_audio_sample_t*)buff;
-
- printEnter();
+ jack_default_audio_sample_t* buffer = (jack_default_audio_sample_t*)buff;
- memset(buffer,0,nframes*sizeof(jack_default_audio_sample_t));
-
- assert(driver->dev);
+ printEnter ();
- if (driver->engine->freewheeling) {
- return 0;
- }
+ memset (buffer, 0, nframes * sizeof(jack_default_audio_sample_t));
+
+ assert (driver->dev);
+
+ if (driver->engine->freewheeling) {
+ return 0;
+ }
// write silence to buffer
nwritten = 0;
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=freebob_streaming_get_playback_stream_type(driver->dev, chn);
+ stream_type = freebob_streaming_get_playback_stream_type (driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buffer), freebob_buffer_type_float);
+ if (stream_type == freebob_stream_type_audio) {
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(buffer), freebob_buffer_type_float);
- } else if(stream_type == freebob_stream_type_midi) {
+ } else if (stream_type == freebob_stream_type_midi) {
// these should be read/written with the per-stream functions
} else { // empty other buffers without doing something with them
- freebob_streaming_set_playback_stream_buffer(driver->dev, chn, (char *)(buffer), freebob_buffer_type_uint24);
+ freebob_streaming_set_playback_stream_buffer (driver->dev, chn, (char*)(buffer), freebob_buffer_type_uint24);
}
}
- freebob_streaming_transfer_playback_buffers(driver->dev);
-
+ freebob_streaming_transfer_playback_buffers (driver->dev);
+
// read & discard from input ports
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
- stream_type=freebob_streaming_get_capture_stream_type(driver->dev, chn);
- if(stream_type == freebob_stream_type_audio) {
- freebob_streaming_set_capture_stream_buffer(driver->dev, chn, (char *)(buffer), freebob_buffer_type_float);
+ stream_type = freebob_streaming_get_capture_stream_type (driver->dev, chn);
+ if (stream_type == freebob_stream_type_audio) {
+ freebob_streaming_set_capture_stream_buffer (driver->dev, chn, (char*)(buffer), freebob_buffer_type_float);
- } else if(stream_type == freebob_stream_type_midi) {
+ } else if (stream_type == freebob_stream_type_midi) {
} else { // empty other buffers without doing something with them
}
}
// now transfer the buffers
- freebob_streaming_transfer_capture_buffers(driver->dev);
-
- printExit();
+ freebob_streaming_transfer_capture_buffers (driver->dev);
+
+ printExit ();
return 0;
}
static int
freebob_driver_start (freebob_driver_t *driver)
{
- int retval=0;
+ int retval = 0;
int chn;
- chn=0; // avoid unused variable warning when compiling without jack midi
+
+ chn = 0; // avoid unused variable warning when compiling without jack midi
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- if((retval=freebob_driver_midi_start(driver->midi_handle))) {
- printError("Could not start MIDI threads");
+ if (driver->midi_handle) {
+ if ((retval = freebob_driver_midi_start (driver->midi_handle))) {
+ printError ("Could not start MIDI threads");
return retval;
}
}
-#endif
+#endif
// reset the midi stuff
#ifdef FREEBOB_DRIVER_WITH_JACK_MIDI
- for (chn = 0; chn < driver->capture_nchannels; chn++) {
+ for (chn = 0; chn < driver->capture_nchannels; chn++)
// init the midi unpacker for this port
- midi_unpack_reset(&driver->midi_in_ports[chn].unpack);
- }
-
- for (chn = 0; chn < driver->playback_nchannels; chn++) {
+ midi_unpack_reset (&driver->midi_in_ports[chn].unpack);
+
+ for (chn = 0; chn < driver->playback_nchannels; chn++)
// init the midi unpacker for this port
- midi_pack_reset(&driver->midi_out_ports[chn].packer);
- }
+ midi_pack_reset (&driver->midi_out_ports[chn].packer);
+
#endif
- if((retval=freebob_streaming_start(driver->dev))) {
- printError("Could not start streaming threads");
+ if ((retval = freebob_streaming_start (driver->dev))) {
+ printError ("Could not start streaming threads");
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- freebob_driver_midi_stop(driver->midi_handle);
+ if (driver->midi_handle) {
+ freebob_driver_midi_stop (driver->midi_handle);
}
#endif
return retval;
@@ -653,18 +663,18 @@ freebob_driver_start (freebob_driver_t *driver)
static int
freebob_driver_stop (freebob_driver_t *driver)
{
- int retval=0;
-
+ int retval = 0;
+
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
- if(driver->midi_handle) {
- if((retval=freebob_driver_midi_stop(driver->midi_handle))) {
- printError("Could not stop MIDI threads");
+ if (driver->midi_handle) {
+ if ((retval = freebob_driver_midi_stop (driver->midi_handle))) {
+ printError ("Could not stop MIDI threads");
return retval;
}
}
-#endif
- if((retval=freebob_streaming_stop(driver->dev))) {
- printError("Could not stop streaming threads");
+#endif
+ if ((retval = freebob_streaming_stop (driver->dev))) {
+ printError ("Could not stop streaming threads");
return retval;
}
@@ -675,15 +685,15 @@ freebob_driver_stop (freebob_driver_t *driver)
static int
freebob_driver_bufsize (freebob_driver_t* driver, jack_nframes_t nframes)
{
- printError("Buffer size change requested but not supported!!!");
+ printError ("Buffer size change requested but not supported!!!");
/*
- driver->period_size = nframes;
- driver->period_usecs =
- (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
- * 1000000.0f);
- */
-
+ driver->period_size = nframes;
+ driver->period_usecs =
+ (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
+ * 1000000.0f);
+ */
+
/* tell the engine to change its buffer size */
#if 0
if (driver->engine->set_buffer_size (driver->engine, nframes)) {
@@ -694,275 +704,278 @@ freebob_driver_bufsize (freebob_driver_t* driver, jack_nframes_t nframes)
return -1; // unsupported
}
-typedef void (*JackDriverFinishFunction) (jack_driver_t *);
+typedef void (*JackDriverFinishFunction)(jack_driver_t *);
freebob_driver_t *
freebob_driver_new (jack_client_t * client,
- char *name,
- freebob_jack_settings_t *params)
+ char *name,
+ freebob_jack_settings_t *params)
{
freebob_driver_t *driver;
- assert(params);
+ assert (params);
- if(freebob_get_api_version() != 1) {
- printMessage("Incompatible libfreebob version! (%s)", freebob_get_version());
+ if (freebob_get_api_version () != 1) {
+ printMessage ("Incompatible libfreebob version! (%s)", freebob_get_version ());
return NULL;
}
- printMessage("Starting Freebob backend (%s)", freebob_get_version());
+ printMessage ("Starting Freebob backend (%s)", freebob_get_version ());
- driver = calloc (1, sizeof (freebob_driver_t));
+ driver = calloc (1, sizeof(freebob_driver_t));
- /* Setup the jack interfaces */
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
+ /* Setup the jack interfaces */
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->nt_attach = (JackDriverNTAttachFunction)freebob_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)freebob_driver_detach;
+ driver->nt_start = (JackDriverNTStartFunction)freebob_driver_start;
+ driver->nt_stop = (JackDriverNTStopFunction)freebob_driver_stop;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)freebob_driver_run_cycle;
+ driver->null_cycle = (JackDriverNullCycleFunction)freebob_driver_null_cycle;
+ driver->write = (JackDriverReadFunction)freebob_driver_write;
+ driver->read = (JackDriverReadFunction)freebob_driver_read;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)freebob_driver_bufsize;
- driver->nt_attach = (JackDriverNTAttachFunction) freebob_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) freebob_driver_detach;
- driver->nt_start = (JackDriverNTStartFunction) freebob_driver_start;
- driver->nt_stop = (JackDriverNTStopFunction) freebob_driver_stop;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) freebob_driver_run_cycle;
- driver->null_cycle = (JackDriverNullCycleFunction) freebob_driver_null_cycle;
- driver->write = (JackDriverReadFunction) freebob_driver_write;
- driver->read = (JackDriverReadFunction) freebob_driver_read;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) freebob_driver_bufsize;
-
/* copy command line parameter contents to the driver structure */
- memcpy(&driver->settings,params,sizeof(freebob_jack_settings_t));
-
+ memcpy (&driver->settings, params, sizeof(freebob_jack_settings_t));
+
/* prepare all parameters */
driver->sample_rate = params->sample_rate;
driver->period_size = params->period_size;
driver->last_wait_ust = 0;
-
+
driver->period_usecs =
- (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate);
+ (jack_time_t)floor ((((float)driver->period_size) * 1000000.0f) / driver->sample_rate);
driver->client = client;
driver->engine = NULL;
- memset(&driver->device_options,0,sizeof(driver->device_options));
- driver->device_options.sample_rate=params->sample_rate;
- driver->device_options.period_size=params->period_size;
- driver->device_options.nb_buffers=params->buffer_size;
- driver->device_options.node_id=params->node_id;
- driver->device_options.port=params->port;
+ memset (&driver->device_options, 0, sizeof(driver->device_options));
+ driver->device_options.sample_rate = params->sample_rate;
+ driver->device_options.period_size = params->period_size;
+ driver->device_options.nb_buffers = params->buffer_size;
+ driver->device_options.node_id = params->node_id;
+ driver->device_options.port = params->port;
driver->capture_frame_latency = params->capture_frame_latency;
driver->playback_frame_latency = params->playback_frame_latency;
- if(!params->capture_ports) {
+ if (!params->capture_ports) {
driver->device_options.directions |= FREEBOB_IGNORE_CAPTURE;
}
- if(!params->playback_ports) {
+ if (!params->playback_ports) {
driver->device_options.directions |= FREEBOB_IGNORE_PLAYBACK;
}
- debugPrint(DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
- debugPrint(DEBUG_LEVEL_STARTUP, " Created driver %s", name);
- debugPrint(DEBUG_LEVEL_STARTUP, " period_size: %d", driver->period_size);
- debugPrint(DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
- debugPrint(DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->sample_rate);
+ debugPrint (DEBUG_LEVEL_STARTUP, " Driver compiled on %s %s", __DATE__, __TIME__);
+ debugPrint (DEBUG_LEVEL_STARTUP, " Created driver %s", name);
+ debugPrint (DEBUG_LEVEL_STARTUP, " period_size: %d", driver->period_size);
+ debugPrint (DEBUG_LEVEL_STARTUP, " period_usecs: %d", driver->period_usecs);
+ debugPrint (DEBUG_LEVEL_STARTUP, " sample rate: %d", driver->sample_rate);
- return (freebob_driver_t *) driver;
+ return (freebob_driver_t*)driver;
}
static void
freebob_driver_delete (freebob_driver_t *driver)
{
- if(driver->dev) {
- freebob_driver_detach(driver);
+ if (driver->dev) {
+ freebob_driver_detach (driver);
}
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
free (driver);
}
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
/*
* MIDI support
- */
+ */
// the thread that will queue the midi events from the seq to the stream buffers
-void * freebob_driver_midi_queue_thread(void *arg)
+void * freebob_driver_midi_queue_thread (void *arg)
{
- freebob_driver_midi_handle_t *m=(freebob_driver_midi_handle_t *)arg;
- assert(m);
+ freebob_driver_midi_handle_t *m = (freebob_driver_midi_handle_t*)arg;
+
+ assert (m);
snd_seq_event_t *ev;
unsigned char work_buffer[MIDI_TRANSMIT_BUFFER_SIZE];
int bytes_to_send;
int b;
int i;
- printMessage("MIDI queue thread started");
+ printMessage ("MIDI queue thread started");
- while(1) {
+ while (1) {
// get next event, if one is present
- while ((snd_seq_event_input(m->seq_handle, &ev) > 0)) {
- if (ev->source.client == SND_SEQ_CLIENT_SYSTEM)
+ while ((snd_seq_event_input (m->seq_handle, &ev) > 0)) {
+ if (ev->source.client == SND_SEQ_CLIENT_SYSTEM) {
continue;
+ }
// get the port this event is originated from
- freebob_midi_port_t *port=NULL;
- for (i=0;i<m->nb_output_ports;i++) {
- if(m->output_ports[i]->seq_port_nr == ev->dest.port) {
- port=m->output_ports[i];
+ freebob_midi_port_t *port = NULL;
+ for (i = 0; i < m->nb_output_ports; i++) {
+ if (m->output_ports[i]->seq_port_nr == ev->dest.port) {
+ port = m->output_ports[i];
break;
}
}
-
- if(!port) {
- printError(" Could not find target port for event: dst=%d src=%d", ev->dest.port, ev->source.port);
+
+ if (!port) {
+ printError (" Could not find target port for event: dst=%d src=%d", ev->dest.port, ev->source.port);
break;
}
-
+
// decode it to the work buffer
- if((bytes_to_send = snd_midi_event_decode ( port->parser,
- work_buffer,
- MIDI_TRANSMIT_BUFFER_SIZE,
- ev))<0)
- { // failed
- printError(" Error decoding event for port %d (errcode=%d)", port->seq_port_nr,bytes_to_send);
- bytes_to_send=0;
+ if ((bytes_to_send = snd_midi_event_decode ( port->parser,
+ work_buffer,
+ MIDI_TRANSMIT_BUFFER_SIZE,
+ ev)) < 0) { // failed
+ printError (" Error decoding event for port %d (errcode=%d)", port->seq_port_nr, bytes_to_send);
+ bytes_to_send = 0;
//return -1;
}
-
- for(b=0;b<bytes_to_send;b++) {
- freebob_sample_t tmp_event=work_buffer[b];
- if(freebob_streaming_write(m->dev, port->stream_nr, &tmp_event, 1)<1) {
- printError(" Midi send buffer overrun");
+
+ for (b = 0; b < bytes_to_send; b++) {
+ freebob_sample_t tmp_event = work_buffer[b];
+ if (freebob_streaming_write (m->dev, port->stream_nr, &tmp_event, 1) < 1) {
+ printError (" Midi send buffer overrun");
}
}
-
+
}
// sleep for some time
- usleep(MIDI_THREAD_SLEEP_TIME_USECS);
+ usleep (MIDI_THREAD_SLEEP_TIME_USECS);
}
return NULL;
}
// the dequeue thread (maybe we need one thread per stream)
-void *freebob_driver_midi_dequeue_thread (void *arg) {
- freebob_driver_midi_handle_t *m=(freebob_driver_midi_handle_t *)arg;
+void *freebob_driver_midi_dequeue_thread (void *arg)
+{
+ freebob_driver_midi_handle_t *m = (freebob_driver_midi_handle_t*)arg;
int i;
int s;
-
+
int samples_read;
- assert(m);
+ assert (m);
- while(1) {
+ while (1) {
// read incoming events
-
- for (i=0;i<m->nb_input_ports;i++) {
+
+ for (i = 0; i < m->nb_input_ports; i++) {
unsigned int buff[64];
-
- freebob_midi_port_t *port=m->input_ports[i];
-
- if(!port) {
- printError(" something went wrong when setting up the midi input port map (%d)",i);
+
+ freebob_midi_port_t *port = m->input_ports[i];
+
+ if (!port) {
+ printError (" something went wrong when setting up the midi input port map (%d)", i);
}
-
+
do {
- samples_read=freebob_streaming_read(m->dev, port->stream_nr, buff, 64);
-
- for (s=0;s<samples_read;s++) {
- unsigned int *byte=(buff+s) ;
+ samples_read = freebob_streaming_read (m->dev, port->stream_nr, buff, 64);
+
+ for (s = 0; s < samples_read; s++) {
+ unsigned int *byte = (buff + s);
snd_seq_event_t ev;
- if ((snd_midi_event_encode_byte(port->parser,(*byte) & 0xFF, &ev)) > 0) {
+ if ((snd_midi_event_encode_byte (port->parser, (*byte) & 0xFF, &ev)) > 0) {
// a midi message is complete, send it out to ALSA
- snd_seq_ev_set_subs(&ev);
- snd_seq_ev_set_direct(&ev);
- snd_seq_ev_set_source(&ev, port->seq_port_nr);
- snd_seq_event_output_direct(port->seq_handle, &ev);
+ snd_seq_ev_set_subs (&ev);
+ snd_seq_ev_set_direct (&ev);
+ snd_seq_ev_set_source (&ev, port->seq_port_nr);
+ snd_seq_event_output_direct (port->seq_handle, &ev);
}
}
- } while (samples_read>0);
+ } while (samples_read > 0);
}
// sleep for some time
- usleep(MIDI_THREAD_SLEEP_TIME_USECS);
+ usleep (MIDI_THREAD_SLEEP_TIME_USECS);
}
return NULL;
}
-static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *driver) {
-// int err;
+static freebob_driver_midi_handle_t *freebob_driver_midi_init (freebob_driver_t *driver)
+{
+// int err;
char buf[256];
channel_t chn;
int nchannels;
- int i=0;
+ int i = 0;
- freebob_device_t *dev=driver->dev;
+ freebob_device_t *dev = driver->dev;
- assert(dev);
+ assert (dev);
- freebob_driver_midi_handle_t *m=calloc(1,sizeof(freebob_driver_midi_handle_t));
+ freebob_driver_midi_handle_t *m = calloc (1, sizeof(freebob_driver_midi_handle_t));
if (!m) {
- printError("not enough memory to create midi structure");
+ printError ("not enough memory to create midi structure");
return NULL;
}
- if (snd_seq_open(&m->seq_handle, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK) < 0) {
- printError("Error opening ALSA sequencer.");
- free(m);
+ if (snd_seq_open (&m->seq_handle, "default", SND_SEQ_OPEN_DUPLEX, SND_SEQ_NONBLOCK) < 0) {
+ printError ("Error opening ALSA sequencer.");
+ free (m);
return NULL;
}
- snd_seq_set_client_name(m->seq_handle, "FreeBoB Jack MIDI");
+ snd_seq_set_client_name (m->seq_handle, "FreeBoB Jack MIDI");
// find out the number of midi in/out ports we need to setup
- nchannels=freebob_streaming_get_nb_capture_streams(dev);
+ nchannels = freebob_streaming_get_nb_capture_streams (dev);
- m->nb_input_ports=0;
+ m->nb_input_ports = 0;
- for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_capture_stream_type(dev, chn) == freebob_stream_type_midi) {
+ for (chn = 0; chn < nchannels; chn++) {
+ if (freebob_streaming_get_capture_stream_type (dev, chn) == freebob_stream_type_midi) {
m->nb_input_ports++;
}
}
- m->input_ports=calloc(m->nb_input_ports,sizeof(freebob_midi_port_t *));
- if(!m->input_ports) {
- printError("not enough memory to create midi structure");
- free(m);
+ m->input_ports = calloc (m->nb_input_ports, sizeof(freebob_midi_port_t *));
+ if (!m->input_ports) {
+ printError ("not enough memory to create midi structure");
+ free (m);
return NULL;
}
- i=0;
+ i = 0;
for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_capture_stream_type(dev, chn) == freebob_stream_type_midi) {
- m->input_ports[i]=calloc(1,sizeof(freebob_midi_port_t));
- if(!m->input_ports[i]) {
+ if (freebob_streaming_get_capture_stream_type (dev, chn) == freebob_stream_type_midi) {
+ m->input_ports[i] = calloc (1, sizeof(freebob_midi_port_t));
+ if (!m->input_ports[i]) {
// fixme
- printError("Could not allocate memory for seq port");
+ printError ("Could not allocate memory for seq port");
continue;
}
- freebob_streaming_get_capture_stream_name(dev, chn, buf, sizeof(buf) - 1);
- printMessage("Register MIDI IN port %s", buf);
+ freebob_streaming_get_capture_stream_name (dev, chn, buf, sizeof(buf) - 1);
+ printMessage ("Register MIDI IN port %s", buf);
- m->input_ports[i]->seq_port_nr=snd_seq_create_simple_port(m->seq_handle, buf,
- SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ,
- SND_SEQ_PORT_TYPE_MIDI_GENERIC);
+ m->input_ports[i]->seq_port_nr = snd_seq_create_simple_port (m->seq_handle, buf,
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ,
+ SND_SEQ_PORT_TYPE_MIDI_GENERIC);
- if(m->input_ports[i]->seq_port_nr<0) {
- printError("Could not create seq port");
- m->input_ports[i]->stream_nr=-1;
- m->input_ports[i]->seq_port_nr=-1;
+ if (m->input_ports[i]->seq_port_nr < 0) {
+ printError ("Could not create seq port");
+ m->input_ports[i]->stream_nr = -1;
+ m->input_ports[i]->seq_port_nr = -1;
} else {
- m->input_ports[i]->stream_nr=chn;
- m->input_ports[i]->seq_handle=m->seq_handle;
- if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->input_ports[i]->parser)) < 0) {
- printError("could not init parser for MIDI IN port %d",i);
- m->input_ports[i]->stream_nr=-1;
- m->input_ports[i]->seq_port_nr=-1;
+ m->input_ports[i]->stream_nr = chn;
+ m->input_ports[i]->seq_handle = m->seq_handle;
+ if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->input_ports[i]->parser)) < 0) {
+ printError ("could not init parser for MIDI IN port %d", i);
+ m->input_ports[i]->stream_nr = -1;
+ m->input_ports[i]->seq_port_nr = -1;
}
}
@@ -971,56 +984,55 @@ static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *
}
// playback
- nchannels=freebob_streaming_get_nb_playback_streams(dev);
+ nchannels = freebob_streaming_get_nb_playback_streams (dev);
- m->nb_output_ports=0;
+ m->nb_output_ports = 0;
- for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_playback_stream_type(dev, chn) == freebob_stream_type_midi) {
+ for (chn = 0; chn < nchannels; chn++) {
+ if (freebob_streaming_get_playback_stream_type (dev, chn) == freebob_stream_type_midi) {
m->nb_output_ports++;
}
}
- m->output_ports=calloc(m->nb_output_ports,sizeof(freebob_midi_port_t *));
- if(!m->output_ports) {
- printError("not enough memory to create midi structure");
- for (i = 0; i < m->nb_input_ports; i++) {
- free(m->input_ports[i]);
- }
- free(m->input_ports);
- free(m);
+ m->output_ports = calloc (m->nb_output_ports, sizeof(freebob_midi_port_t *));
+ if (!m->output_ports) {
+ printError ("not enough memory to create midi structure");
+ for (i = 0; i < m->nb_input_ports; i++)
+ free (m->input_ports[i]);
+ free (m->input_ports);
+ free (m);
return NULL;
}
- i=0;
+ i = 0;
for (chn = 0; chn < nchannels; chn++) {
- if(freebob_streaming_get_playback_stream_type(dev, chn) == freebob_stream_type_midi) {
- m->output_ports[i]=calloc(1,sizeof(freebob_midi_port_t));
- if(!m->output_ports[i]) {
+ if (freebob_streaming_get_playback_stream_type (dev, chn) == freebob_stream_type_midi) {
+ m->output_ports[i] = calloc (1, sizeof(freebob_midi_port_t));
+ if (!m->output_ports[i]) {
// fixme
- printError("Could not allocate memory for seq port");
+ printError ("Could not allocate memory for seq port");
continue;
}
- freebob_streaming_get_playback_stream_name(dev, chn, buf, sizeof(buf) - 1);
- printMessage("Register MIDI OUT port %s", buf);
+ freebob_streaming_get_playback_stream_name (dev, chn, buf, sizeof(buf) - 1);
+ printMessage ("Register MIDI OUT port %s", buf);
- m->output_ports[i]->seq_port_nr=snd_seq_create_simple_port(m->seq_handle, buf,
- SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE,
- SND_SEQ_PORT_TYPE_MIDI_GENERIC);
+ m->output_ports[i]->seq_port_nr = snd_seq_create_simple_port (m->seq_handle, buf,
+ SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE,
+ SND_SEQ_PORT_TYPE_MIDI_GENERIC);
- if(m->output_ports[i]->seq_port_nr<0) {
- printError("Could not create seq port");
- m->output_ports[i]->stream_nr=-1;
- m->output_ports[i]->seq_port_nr=-1;
+ if (m->output_ports[i]->seq_port_nr < 0) {
+ printError ("Could not create seq port");
+ m->output_ports[i]->stream_nr = -1;
+ m->output_ports[i]->seq_port_nr = -1;
} else {
- m->output_ports[i]->stream_nr=chn;
- m->output_ports[i]->seq_handle=m->seq_handle;
- if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->output_ports[i]->parser)) < 0) {
- printError("could not init parser for MIDI OUT port %d",i);
- m->output_ports[i]->stream_nr=-1;
- m->output_ports[i]->seq_port_nr=-1;
+ m->output_ports[i]->stream_nr = chn;
+ m->output_ports[i]->seq_handle = m->seq_handle;
+ if (snd_midi_event_new ( ALSA_SEQ_BUFF_SIZE, &(m->output_ports[i]->parser)) < 0) {
+ printError ("could not init parser for MIDI OUT port %d", i);
+ m->output_ports[i]->stream_nr = -1;
+ m->output_ports[i]->seq_port_nr = -1;
}
}
@@ -1028,8 +1040,8 @@ static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *
}
}
- m->dev=dev;
- m->driver=driver;
+ m->dev = dev;
+ m->driver = driver;
return m;
}
@@ -1037,31 +1049,31 @@ static freebob_driver_midi_handle_t *freebob_driver_midi_init(freebob_driver_t *
static int
freebob_driver_midi_start (freebob_driver_midi_handle_t *m)
{
- assert(m);
+ assert (m);
// start threads
- m->queue_thread_realtime=(m->driver->engine->control->real_time? 1 : 0);
- m->queue_thread_priority=
+ m->queue_thread_realtime = (m->driver->engine->control->real_time ? 1 : 0);
+ m->queue_thread_priority =
m->driver->engine->control->client_priority +
FREEBOB_RT_PRIORITY_MIDI_RELATIVE;
- if (m->queue_thread_priority>98) {
- m->queue_thread_priority=98;
+ if (m->queue_thread_priority > 98) {
+ m->queue_thread_priority = 98;
}
if (m->queue_thread_realtime) {
- printMessage("MIDI threads running with Realtime scheduling, priority %d",
- m->queue_thread_priority);
+ printMessage ("MIDI threads running with Realtime scheduling, priority %d",
+ m->queue_thread_priority);
} else {
- printMessage("MIDI threads running without Realtime scheduling");
+ printMessage ("MIDI threads running without Realtime scheduling");
}
- if (jack_client_create_thread(NULL, &m->queue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_queue_thread, (void *)m)) {
- printError(" cannot create midi queueing thread");
+ if (jack_client_create_thread (NULL, &m->queue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_queue_thread, (void*)m)) {
+ printError (" cannot create midi queueing thread");
return -1;
}
- if (jack_client_create_thread(NULL, &m->dequeue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_dequeue_thread, (void *)m)) {
- printError(" cannot create midi dequeueing thread");
+ if (jack_client_create_thread (NULL, &m->dequeue_thread, m->queue_thread_priority, m->queue_thread_realtime, freebob_driver_midi_dequeue_thread, (void*)m)) {
+ printError (" cannot create midi dequeueing thread");
return -1;
}
return 0;
@@ -1070,7 +1082,7 @@ freebob_driver_midi_start (freebob_driver_midi_handle_t *m)
static int
freebob_driver_midi_stop (freebob_driver_midi_handle_t *m)
{
- assert(m);
+ assert (m);
pthread_cancel (m->queue_thread);
pthread_join (m->queue_thread, NULL);
@@ -1084,25 +1096,23 @@ freebob_driver_midi_stop (freebob_driver_midi_handle_t *m)
static void
freebob_driver_midi_finish (freebob_driver_midi_handle_t *m)
{
- assert(m);
+ assert (m);
int i;
// TODO: add state info here, if not stopped then stop
- for (i=0;i<m->nb_input_ports;i++) {
- free(m->input_ports[i]);
+ for (i = 0; i < m->nb_input_ports; i++)
+ free (m->input_ports[i]);
- }
- free(m->input_ports);
+ free (m->input_ports);
- for (i=0;i<m->nb_output_ports;i++) {
- free(m->output_ports[i]);
- }
- free(m->output_ports);
+ for (i = 0; i < m->nb_output_ports; i++)
+ free (m->output_ports[i]);
+ free (m->output_ports);
- free(m);
+ free (m);
}
-#endif
+#endif
/*
* dlopen plugin stuff
*/
@@ -1116,12 +1126,12 @@ driver_get_descriptor ()
jack_driver_param_desc_t * params;
unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+ desc = calloc (1, sizeof(jack_driver_desc_t));
strcpy (desc->name, "freebob");
desc->nparams = 11;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
desc->params = params;
i = 0;
@@ -1131,7 +1141,7 @@ driver_get_descriptor ()
strcpy (params[i].value.str, "hw:0");
strcpy (params[i].short_desc, "The FireWire device to use. Format is: 'hw:port[,node]'.");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "period");
params[i].character = 'p';
@@ -1139,7 +1149,7 @@ driver_get_descriptor ()
params[i].value.ui = 1024;
strcpy (params[i].short_desc, "Frames per period");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "nperiods");
params[i].character = 'n';
@@ -1187,7 +1197,7 @@ driver_get_descriptor ()
params[i].value.ui = 0;
strcpy (params[i].short_desc, "Extra input latency (frames)");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "output-latency");
params[i].character = 'O';
@@ -1203,14 +1213,14 @@ driver_get_descriptor ()
params[i].value.ui = 0;
strcpy (params[i].short_desc, "Number of input channels to provide (note: currently ignored)");
strcpy (params[i].long_desc, params[i].short_desc);
-
+
i++;
strcpy (params[i].name, "outchannels");
params[i].character = 'o';
params[i].type = JackDriverParamUInt;
params[i].value.ui = 0;
strcpy (params[i].short_desc, "Number of output channels to provide (note: currently ignored)");
- strcpy (params[i].long_desc, params[i].short_desc);
+ strcpy (params[i].long_desc, params[i].short_desc);
return desc;
}
@@ -1221,40 +1231,38 @@ driver_initialize (jack_client_t *client, JSList * params)
{
jack_driver_t *driver;
- unsigned int port=0;
- unsigned int node_id=-1;
- int nbitems;
-
+ unsigned int port = 0;
+ unsigned int node_id = -1;
+ int nbitems;
+
const JSList * node;
const jack_driver_param_t * param;
freebob_jack_settings_t cmlparams;
-
- char *device_name="hw:0";
-
- cmlparams.period_size_set=0;
- cmlparams.sample_rate_set=0;
- cmlparams.buffer_size_set=0;
- cmlparams.port_set=0;
- cmlparams.node_id_set=0;
+
+ char *device_name = "hw:0";
+
+ cmlparams.period_size_set = 0;
+ cmlparams.sample_rate_set = 0;
+ cmlparams.buffer_size_set = 0;
+ cmlparams.port_set = 0;
+ cmlparams.node_id_set = 0;
/* default values */
- cmlparams.period_size=1024;
- cmlparams.sample_rate=48000;
- cmlparams.buffer_size=3;
- cmlparams.port=0;
- cmlparams.node_id=-1;
- cmlparams.playback_ports=0;
- cmlparams.capture_ports=0;
- cmlparams.playback_frame_latency=0;
- cmlparams.capture_frame_latency=0;
-
- for (node = params; node; node = jack_slist_next (node))
- {
- param = (jack_driver_param_t *) node->data;
-
- switch (param->character)
- {
+ cmlparams.period_size = 1024;
+ cmlparams.sample_rate = 48000;
+ cmlparams.buffer_size = 3;
+ cmlparams.port = 0;
+ cmlparams.node_id = -1;
+ cmlparams.playback_ports = 0;
+ cmlparams.capture_ports = 0;
+ cmlparams.playback_frame_latency = 0;
+ cmlparams.capture_frame_latency = 0;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (jack_driver_param_t*)node->data;
+
+ switch (param->character) {
case 'd':
device_name = strdup (param->value.str);
break;
@@ -1265,7 +1273,7 @@ driver_initialize (jack_client_t *client, JSList * params)
case 'n':
cmlparams.buffer_size = param->value.ui;
cmlparams.buffer_size_set = 1;
- break;
+ break;
case 'r':
cmlparams.sample_rate = param->value.ui;
cmlparams.sample_rate_set = 1;
@@ -1300,32 +1308,32 @@ driver_initialize (jack_client_t *client, JSList * params)
cmlparams.capture_ports = TRUE;
}
- nbitems=sscanf(device_name,"hw:%u,%u",&port,&node_id);
- if (nbitems<2) {
- nbitems=sscanf(device_name,"hw:%u",&port);
-
- if(nbitems < 1) {
- free(device_name);
- printError("device (-d) argument not valid\n");
- return NULL;
- } else {
- cmlparams.port = port;
- cmlparams.port_set=1;
-
- cmlparams.node_id = -1;
- cmlparams.node_id_set=0;
- }
- } else {
- cmlparams.port = port;
- cmlparams.port_set=1;
-
- cmlparams.node_id = node_id;
- cmlparams.node_id_set=1;
- }
-
- jack_error("Freebob using Firewire port %d, node %d",cmlparams.port,cmlparams.node_id);
-
- driver=(jack_driver_t *)freebob_driver_new (client, "freebob_pcm", &cmlparams);
+ nbitems = sscanf (device_name, "hw:%u,%u", &port, &node_id);
+ if (nbitems < 2) {
+ nbitems = sscanf (device_name, "hw:%u", &port);
+
+ if (nbitems < 1) {
+ free (device_name);
+ printError ("device (-d) argument not valid\n");
+ return NULL;
+ } else {
+ cmlparams.port = port;
+ cmlparams.port_set = 1;
+
+ cmlparams.node_id = -1;
+ cmlparams.node_id_set = 0;
+ }
+ } else {
+ cmlparams.port = port;
+ cmlparams.port_set = 1;
+
+ cmlparams.node_id = node_id;
+ cmlparams.node_id_set = 1;
+ }
+
+ jack_error ("Freebob using Firewire port %d, node %d", cmlparams.port, cmlparams.node_id);
+
+ driver = (jack_driver_t*)freebob_driver_new (client, "freebob_pcm", &cmlparams);
return driver;
}
@@ -1333,8 +1341,8 @@ driver_initialize (jack_client_t *client, JSList * params)
void
driver_finish (jack_driver_t *driver)
{
- freebob_driver_t *drv=(freebob_driver_t *) driver;
-
+ freebob_driver_t *drv = (freebob_driver_t*)driver;
+
freebob_driver_delete (drv);
}
diff --git a/drivers/freebob/freebob_driver.h b/drivers/freebob/freebob_driver.h
index 337d841..4f638f0 100644
--- a/drivers/freebob/freebob_driver.h
+++ b/drivers/freebob/freebob_driver.h
@@ -23,11 +23,11 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/*
+/*
* Main Jack driver entry routines
*
- */
-
+ */
+
#ifndef __JACK_FREEBOB_DRIVER_H__
#define __JACK_FREEBOB_DRIVER_H__
@@ -66,59 +66,59 @@
#include "engine.h"
// 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_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_RUN_CYCLE (1 << 8)
-#define DEBUG_LEVEL_PACKETCOUNTER (1<<16)
-#define DEBUG_LEVEL_STARTUP (1<<17)
-#define DEBUG_LEVEL_THREADS (1<<18)
+#define DEBUG_LEVEL_PACKETCOUNTER (1 << 16)
+#define DEBUG_LEVEL_STARTUP (1 << 17)
+#define DEBUG_LEVEL_THREADS (1 << 18)
#ifdef DEBUG_ENABLED
- // default debug level
+// default debug level
#define DEBUG_LEVEL ( DEBUG_LEVEL_RUN_CYCLE | \
- (DEBUG_LEVEL_XRUN_RECOVERY)| DEBUG_LEVEL_STARTUP | DEBUG_LEVEL_WAIT | DEBUG_LEVEL_PACKETCOUNTER)
+ (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)\n", __FUNCTION__, __FILE__)
- //#define printExit() jack_error( "FBDRV EXITS: %s (%s)\n", __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;
+ #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)\n", __FUNCTION__, __FILE__)
+//#define printExit() jack_error( "FBDRV EXITS: %s (%s)\n", __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...)
+
+ #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
+#define FREEBOB_RT_PRIORITY_PACKETIZER_RELATIVE 5
-// MIDI
+// MIDI
#ifdef FREEBOB_DRIVER_WITH_ALSA_MIDI
@@ -130,9 +130,9 @@
#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
+// 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
+#define FREEBOB_RT_PRIORITY_MIDI_RELATIVE 4
#endif // FREEBOB_DRIVER_WITH_ALSA_MIDI
@@ -145,7 +145,7 @@
typedef struct freebob_midi_input_port_t {
// jack
midi_unpack_t unpack;
-
+
// midi
int overruns;
} freebob_midi_input_port_t;
@@ -168,22 +168,22 @@ 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;
@@ -205,7 +205,7 @@ typedef struct _freebob_driver_midi_handle {
freebob_driver_t *driver;
snd_seq_t *seq_handle;
-
+
pthread_t queue_thread;
pthread_t dequeue_thread;
int queue_thread_realtime;
@@ -227,41 +227,40 @@ typedef struct _freebob_driver_midi_handle {
/*
* JACK driver structure
*/
-
-struct _freebob_driver
-{
+
+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;
+ 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 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;
- channel_t playback_nchannels;
- channel_t capture_nchannels;
+ channel_t playback_nchannels;
+ channel_t capture_nchannels;
- jack_nframes_t playback_frame_latency;
- jack_nframes_t capture_frame_latency;
+ jack_nframes_t playback_frame_latency;
+ jack_nframes_t capture_frame_latency;
freebob_device_info_t device_info;
freebob_options_t device_options;
@@ -276,7 +275,7 @@ struct _freebob_driver
#endif
-};
+};
diff --git a/drivers/netjack/net_driver.c b/drivers/netjack/net_driver.c
index 7f7c1d5..ab3d447 100644
--- a/drivers/netjack/net_driver.c
+++ b/drivers/netjack/net_driver.c
@@ -1,28 +1,28 @@
/* -*- mode: c; c-file-style: "linux"; -*- */
/*
-NetJack Driver
+ NetJack Driver
-Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
-Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
-Copyright (C) 2003 Robert Ham <rah@bash.sh>
-Copyright (C) 2001 Paul Davis
+ Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
+ Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
+ Copyright (C) 2003 Robert Ham <rah@bash.sh>
+ Copyright (C) 2001 Paul Davis
-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 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.
+ 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.
+ 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.
-$Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
-*/
+ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
+ */
#include <math.h>
#include <stdio.h>
@@ -49,7 +49,7 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
#undef DEBUG_WAKEUP
-#define MIN(x,y) ((x)<(y) ? (x) : (y))
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
static jack_transport_state_t last_transport_state;
static int sync_state = TRUE;
@@ -57,276 +57,286 @@ static int sync_state = TRUE;
static jack_nframes_t
net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed_usecs)
{
- netjack_driver_state_t *netj = &( driver->netj );
- int delay;
-
- delay = netjack_wait( netj, driver->engine->get_microseconds );
- if( delay ) {
- //driver->engine->delay( driver->engine, (float)delay );
- jack_error( "netxruns amount: %dms", delay/1000 );
- }
-
-
- driver->last_wait_ust = driver->engine->get_microseconds ();
- driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
-
- /* this driver doesn't work so well if we report a delay */
- /* XXX: this might not be the case anymore */
- /* the delayed _usecs is a resync or something. */
- *delayed_usecs = 0; /* lie about it */
- *status = 0;
- return netj->period_size;
-}
+ netjack_driver_state_t *netj = &( driver->netj );
+ int delay;
-static int
-net_driver_run_cycle (net_driver_t *driver)
-{
- jack_engine_t *engine = driver->engine;
- //netjack_driver_state_t *netj = &(driver->netj);
- int wait_status = -1;
- float delayed_usecs;
+ delay = netjack_wait ( netj, driver->engine->get_microseconds );
+ if ( delay ) {
+ //driver->engine->delay( driver->engine, (float)delay );
+ jack_error ( "netxruns amount: %dms", delay / 1000 );
+ }
- jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
- &delayed_usecs);
- // XXX: xrun code removed.
- // especially with celt there are no real xruns anymore.
- // things are different on the net.
+ driver->last_wait_ust = driver->engine->get_microseconds ();
+ driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
- if (wait_status == 0)
- return engine->run_cycle (engine, nframes, delayed_usecs);
+ /* this driver doesn't work so well if we report a delay */
+ /* XXX: this might not be the case anymore */
+ /* the delayed _usecs is a resync or something. */
+ *delayed_usecs = 0; /* lie about it */
+ *status = 0;
+ return netj->period_size;
+}
- if (wait_status < 0)
- return -1;
- else
- return 0;
+static int
+net_driver_run_cycle (net_driver_t *driver)
+{
+ jack_engine_t *engine = driver->engine;
+ //netjack_driver_state_t *netj = &(driver->netj);
+ int wait_status = -1;
+ float delayed_usecs;
+
+ jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
+ &delayed_usecs);
+
+ // XXX: xrun code removed.
+ // especially with celt there are no real xruns anymore.
+ // things are different on the net.
+
+ if (wait_status == 0) {
+ return engine->run_cycle (engine, nframes, delayed_usecs);
+ }
+
+ if (wait_status < 0) {
+ return -1;
+ } else {
+ return 0;
+ }
}
static int
net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
{
- // TODO: talk to paul about this.
- // do i wait here ?
- // just sending out a packet marked with junk ?
+ // TODO: talk to paul about this.
+ // do i wait here ?
+ // just sending out a packet marked with junk ?
- netjack_driver_state_t *netj = &(driver->netj);
- int sync_state = (driver->engine->control->sync_remain <= 1);
- netjack_send_silence( netj, sync_state );
+ netjack_driver_state_t *netj = &(driver->netj);
+ int sync_state = (driver->engine->control->sync_remain <= 1);
- return 0;
+ netjack_send_silence ( netj, sync_state );
+
+ return 0;
}
static int
net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
{
- netjack_driver_state_t *netj = &(driver->netj);
- if (nframes != netj->period_size)
- return EINVAL;
+ netjack_driver_state_t *netj = &(driver->netj);
- return 0;
+ if (nframes != netj->period_size) {
+ return EINVAL;
+ }
+
+ return 0;
}
static int
net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
{
- netjack_driver_state_t *netj = &(driver->netj);
-
- jack_position_t local_trans_pos;
- jack_transport_state_t local_trans_state;
-
- unsigned int *packet_buf, *packet_bufX;
-
- if( ! netj->packet_data_valid ) {
- render_payload_to_jack_ports (netj->bitdepth, NULL, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
- return 0;
- }
- packet_buf = netj->rx_buf;
-
- jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
-
- packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
-
- netj->reply_port = pkthdr->reply_port;
- netj->latency = pkthdr->latency;
-
- // Special handling for latency=0
- if( netj->latency == 0 )
- netj->resync_threshold = 0;
- else
- netj->resync_threshold = MIN( 15, pkthdr->latency-1 );
-
- // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
- if (netj->handle_transport_sync) {
- int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * nframes) + netj->codec_latency);
-
- // read local transport info....
- local_trans_state = jack_transport_query(netj->client, &local_trans_pos);
-
- // Now check if we have to start or stop local transport to sync to remote...
- switch (pkthdr->transport_state) {
- case JackTransportStarting:
- // the master transport is starting... so we set our reply to the sync_callback;
- if (local_trans_state == JackTransportStopped) {
- jack_transport_start(netj->client);
- last_transport_state = JackTransportStopped;
- sync_state = FALSE;
- jack_info("locally stopped... starting...");
- }
-
- if (local_trans_pos.frame != compensated_tranport_pos)
- {
- jack_transport_locate(netj->client, compensated_tranport_pos);
- last_transport_state = JackTransportRolling;
- sync_state = FALSE;
- jack_info("starting locate to %d", compensated_tranport_pos );
- }
- break;
- case JackTransportStopped:
- sync_state = TRUE;
- if (local_trans_pos.frame != (pkthdr->transport_frame)) {
- jack_transport_locate(netj->client, (pkthdr->transport_frame));
- jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
- }
- if (local_trans_state != JackTransportStopped)
- jack_transport_stop(netj->client);
- break;
- case JackTransportRolling:
- sync_state = TRUE;
-// if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
+ netjack_driver_state_t *netj = &(driver->netj);
+
+ jack_position_t local_trans_pos;
+ jack_transport_state_t local_trans_state;
+
+ unsigned int *packet_buf, *packet_bufX;
+
+ if ( !netj->packet_data_valid ) {
+ render_payload_to_jack_ports (netj->bitdepth, NULL, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
+ return 0;
+ }
+ packet_buf = netj->rx_buf;
+
+ jacknet_packet_header *pkthdr = (jacknet_packet_header*)packet_buf;
+
+ packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
+
+ netj->reply_port = pkthdr->reply_port;
+ netj->latency = pkthdr->latency;
+
+ // Special handling for latency=0
+ if ( netj->latency == 0 ) {
+ netj->resync_threshold = 0;
+ } else {
+ netj->resync_threshold = MIN ( 15, pkthdr->latency - 1 );
+ }
+
+ // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
+ if (netj->handle_transport_sync) {
+ int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * nframes) + netj->codec_latency);
+
+ // read local transport info....
+ local_trans_state = jack_transport_query (netj->client, &local_trans_pos);
+
+ // Now check if we have to start or stop local transport to sync to remote...
+ switch (pkthdr->transport_state) {
+ case JackTransportStarting:
+ // the master transport is starting... so we set our reply to the sync_callback;
+ if (local_trans_state == JackTransportStopped) {
+ jack_transport_start (netj->client);
+ last_transport_state = JackTransportStopped;
+ sync_state = FALSE;
+ jack_info ("locally stopped... starting...");
+ }
+
+ if (local_trans_pos.frame != compensated_tranport_pos) {
+ jack_transport_locate (netj->client, compensated_tranport_pos);
+ last_transport_state = JackTransportRolling;
+ sync_state = FALSE;
+ jack_info ("starting locate to %d", compensated_tranport_pos );
+ }
+ break;
+ case JackTransportStopped:
+ sync_state = TRUE;
+ if (local_trans_pos.frame != (pkthdr->transport_frame)) {
+ jack_transport_locate (netj->client, (pkthdr->transport_frame));
+ jack_info ("transport is stopped locate to %d", pkthdr->transport_frame);
+ }
+ if (local_trans_state != JackTransportStopped) {
+ jack_transport_stop (netj->client);
+ }
+ break;
+ case JackTransportRolling:
+ sync_state = TRUE;
+// if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
// jack_transport_locate(netj->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes));
// jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
-// }
- if (local_trans_state != JackTransportRolling)
- jack_transport_start (netj->client);
- break;
+// }
+ if (local_trans_state != JackTransportRolling) {
+ jack_transport_start (netj->client);
+ }
+ break;
- case JackTransportLooping:
- break;
- }
- }
+ case JackTransportLooping:
+ break;
+ }
+ }
- render_payload_to_jack_ports (netj->bitdepth, packet_bufX, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
- packet_cache_release_packet(netj->packcache, netj->expected_framecnt );
+ render_payload_to_jack_ports (netj->bitdepth, packet_bufX, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
+ packet_cache_release_packet (netj->packcache, netj->expected_framecnt );
- return 0;
+ return 0;
}
static int
net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
{
- netjack_driver_state_t *netj = &(driver->netj);
+ netjack_driver_state_t *netj = &(driver->netj);
- int sync_state = (driver->engine->control->sync_remain <= 1);;
+ int sync_state = (driver->engine->control->sync_remain <= 1);;
- uint32_t *packet_buf, *packet_bufX;
+ uint32_t *packet_buf, *packet_bufX;
- int packet_size = get_sample_size(netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
- jacknet_packet_header *pkthdr;
+ int packet_size = get_sample_size (netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
+ jacknet_packet_header *pkthdr;
- packet_buf = alloca(packet_size);
- pkthdr = (jacknet_packet_header *)packet_buf;
+ packet_buf = alloca (packet_size);
+ pkthdr = (jacknet_packet_header*)packet_buf;
- if( netj->running_free ) {
- return 0;
- }
-
- // offset packet_bufX by the packetheader.
- packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
-
- // clear unused header fields
- pkthdr->capture_channels_audio = 0;
- pkthdr->playback_channels_audio = 0;
- pkthdr->capture_channels_midi = 0;
- pkthdr->playback_channels_midi = 0;
- pkthdr->period_size = 0;
- pkthdr->sample_rate = 0;
- pkthdr->transport_frame = 0;
- pkthdr->transport_state = 0;
- pkthdr->framecnt = 0;
- pkthdr->reply_port = 0;
- pkthdr->mtu = 0;
-
- // set used header fields
- pkthdr->sync_state = sync_state;
- pkthdr->latency = netj->time_to_deadline;
- //printf( "time to deadline = %d goodness=%d\n", (int)netj->time_to_deadline, netj->deadline_goodness );
- pkthdr->framecnt = netj->expected_framecnt;
-
-
- render_jack_ports_to_payload(netj->bitdepth, netj->playback_ports, netj->playback_srcs, nframes, packet_bufX, netj->net_period_up, netj->dont_htonl_floats );
-
- packet_header_hton(pkthdr);
- if (netj->srcaddress_valid)
- {
- int r;
+ if ( netj->running_free ) {
+ return 0;
+ }
+
+ // offset packet_bufX by the packetheader.
+ packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
+
+ // clear unused header fields
+ pkthdr->capture_channels_audio = 0;
+ pkthdr->playback_channels_audio = 0;
+ pkthdr->capture_channels_midi = 0;
+ pkthdr->playback_channels_midi = 0;
+ pkthdr->period_size = 0;
+ pkthdr->sample_rate = 0;
+ pkthdr->transport_frame = 0;
+ pkthdr->transport_state = 0;
+ pkthdr->framecnt = 0;
+ pkthdr->reply_port = 0;
+ pkthdr->mtu = 0;
+
+ // set used header fields
+ pkthdr->sync_state = sync_state;
+ pkthdr->latency = netj->time_to_deadline;
+ //printf( "time to deadline = %d goodness=%d\n", (int)netj->time_to_deadline, netj->deadline_goodness );
+ pkthdr->framecnt = netj->expected_framecnt;
+
+
+ render_jack_ports_to_payload (netj->bitdepth, netj->playback_ports, netj->playback_srcs, nframes, packet_bufX, netj->net_period_up, netj->dont_htonl_floats );
+
+ packet_header_hton (pkthdr);
+ if (netj->srcaddress_valid) {
+ int r;
#ifndef MSG_CONFIRM
- static const int flag = 0;
+ static const int flag = 0;
#else
- static const int flag = MSG_CONFIRM;
+ static const int flag = MSG_CONFIRM;
#endif
- if (netj->reply_port)
- netj->syncsource_address.sin_port = htons(netj->reply_port);
+ if (netj->reply_port) {
+ netj->syncsource_address.sin_port = htons (netj->reply_port);
+ }
- for( r=0; r<netj->redundancy; r++ )
- netjack_sendto(netj->sockfd, (char *)packet_buf, packet_size,
- flag, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
- }
+ for ( r = 0; r < netj->redundancy; r++ )
+ netjack_sendto (netj->sockfd, (char*)packet_buf, packet_size,
+ flag, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
+ }
- return 0;
+ return 0;
}
static int
net_driver_attach (net_driver_t *driver)
{
- netjack_driver_state_t *netj = &( driver->netj );
- if (driver->engine->set_buffer_size (driver->engine, netj->period_size)) {
- jack_error ("netjack: cannot set engine buffer size to %d (check MIDI)", netj->period_size);
- return -1;
- }
- driver->engine->set_sample_rate (driver->engine, netj->sample_rate);
-
- netjack_attach( netj );
- return 0;
+ netjack_driver_state_t *netj = &( driver->netj );
+
+ if (driver->engine->set_buffer_size (driver->engine, netj->period_size)) {
+ jack_error ("netjack: cannot set engine buffer size to %d (check MIDI)", netj->period_size);
+ return -1;
+ }
+ driver->engine->set_sample_rate (driver->engine, netj->sample_rate);
+
+ netjack_attach ( netj );
+ return 0;
}
static int
net_driver_detach (net_driver_t *driver)
{
- netjack_driver_state_t *netj = &( driver->netj );
+ netjack_driver_state_t *netj = &( driver->netj );
- if (driver->engine == 0)
- return 0;
+ if (driver->engine == 0) {
+ return 0;
+ }
- netjack_detach( netj );
- return 0;
+ netjack_detach ( netj );
+ return 0;
}
static void
net_driver_delete (net_driver_t *driver)
{
- netjack_driver_state_t *netj = &( driver->netj );
- netjack_release( netj );
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
- free (driver);
+ netjack_driver_state_t *netj = &( driver->netj );
+
+ netjack_release ( netj );
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
+ free (driver);
}
static jack_driver_t *
net_driver_new (jack_client_t * client,
- char *name,
- unsigned int capture_ports,
- unsigned int playback_ports,
- unsigned int capture_ports_midi,
- unsigned int playback_ports_midi,
- jack_nframes_t sample_rate,
- jack_nframes_t period_size,
- unsigned int listen_port,
- unsigned int transport_sync,
- unsigned int resample_factor,
- unsigned int resample_factor_up,
- unsigned int bitdepth,
+ char *name,
+ unsigned int capture_ports,
+ unsigned int playback_ports,
+ unsigned int capture_ports_midi,
+ unsigned int playback_ports_midi,
+ jack_nframes_t sample_rate,
+ jack_nframes_t period_size,
+ unsigned int listen_port,
+ unsigned int transport_sync,
+ unsigned int resample_factor,
+ unsigned int resample_factor_up,
+ unsigned int bitdepth,
unsigned int use_autoconfig,
unsigned int latency,
unsigned int redundancy,
@@ -334,60 +344,60 @@ net_driver_new (jack_client_t * client,
int always_deadline,
int jitter_val)
{
- net_driver_t * driver;
-
- jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
- "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
- capture_ports, playback_ports, transport_sync);
-
- driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
-
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
-
- driver->write = (JackDriverWriteFunction) net_driver_write;
- driver->read = (JackDriverReadFunction) net_driver_read;
- driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
- driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
-
- driver->last_wait_ust = 0;
- driver->engine = NULL;
-
- netjack_driver_state_t *netj = &(driver->netj);
-
- netjack_init ( netj,
- client,
- name,
- capture_ports,
- playback_ports,
- capture_ports_midi,
- playback_ports_midi,
- sample_rate,
- period_size,
- listen_port,
- transport_sync,
- resample_factor,
- resample_factor_up,
- bitdepth,
- use_autoconfig,
- latency,
- redundancy,
- dont_htonl_floats,
- always_deadline,
- jitter_val );
-
- netjack_startup( netj );
-
- jack_info ("netjack: period : up: %d / dn: %d", netj->net_period_up, netj->net_period_down);
- jack_info ("netjack: framerate: %d", netj->sample_rate);
- jack_info ("netjack: audio : cap: %d / pbk: %d)", netj->capture_channels_audio, netj->playback_channels_audio);
- jack_info ("netjack: midi : cap: %d / pbk: %d)", netj->capture_channels_midi, netj->playback_channels_midi);
- jack_info ("netjack: buffsize : rx: %d)", netj->rx_bufsize);
- driver->period_usecs = netj->period_usecs;
-
- return (jack_driver_t *) driver;
+ net_driver_t * driver;
+
+ jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
+ "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
+ capture_ports, playback_ports, transport_sync);
+
+ driver = (net_driver_t*)calloc (1, sizeof(net_driver_t));
+
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->write = (JackDriverWriteFunction)net_driver_write;
+ driver->read = (JackDriverReadFunction)net_driver_read;
+ driver->null_cycle = (JackDriverNullCycleFunction)net_driver_null_cycle;
+ driver->nt_attach = (JackDriverNTAttachFunction)net_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)net_driver_detach;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)net_driver_bufsize;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)net_driver_run_cycle;
+
+ driver->last_wait_ust = 0;
+ driver->engine = NULL;
+
+ netjack_driver_state_t *netj = &(driver->netj);
+
+ netjack_init ( netj,
+ client,
+ name,
+ capture_ports,
+ playback_ports,
+ capture_ports_midi,
+ playback_ports_midi,
+ sample_rate,
+ period_size,
+ listen_port,
+ transport_sync,
+ resample_factor,
+ resample_factor_up,
+ bitdepth,
+ use_autoconfig,
+ latency,
+ redundancy,
+ dont_htonl_floats,
+ always_deadline,
+ jitter_val );
+
+ netjack_startup ( netj );
+
+ jack_info ("netjack: period : up: %d / dn: %d", netj->net_period_up, netj->net_period_down);
+ jack_info ("netjack: framerate: %d", netj->sample_rate);
+ jack_info ("netjack: audio : cap: %d / pbk: %d)", netj->capture_channels_audio, netj->playback_channels_audio);
+ jack_info ("netjack: midi : cap: %d / pbk: %d)", netj->capture_channels_midi, netj->playback_channels_midi);
+ jack_info ("netjack: buffsize : rx: %d)", netj->rx_bufsize);
+ driver->period_usecs = netj->period_usecs;
+
+ return (jack_driver_t*)driver;
}
/* DRIVER "PLUGIN" INTERFACE */
@@ -395,173 +405,173 @@ net_driver_new (jack_client_t * client,
jack_driver_desc_t *
driver_get_descriptor ()
{
- jack_driver_desc_t * desc;
- jack_driver_param_desc_t * params;
- unsigned int i;
-
- desc = calloc (1, sizeof (jack_driver_desc_t));
- strcpy (desc->name, "net");
- desc->nparams = 18;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
-
- i = 0;
- strcpy (params[i].name, "audio-ins");
- params[i].character = 'i';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 2U;
- strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "audio-outs");
- params[i].character = 'o';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 2U;
- strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "midi-ins");
- params[i].character = 'I';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "midi-outs");
- params[i].character = 'O';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "rate");
- params[i].character = 'r';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 48000U;
- strcpy (params[i].short_desc, "Sample rate");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "period");
- params[i].character = 'p';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1024U;
- strcpy (params[i].short_desc, "Frames per period");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "num-periods");
- params[i].character = 'n';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 5U;
- strcpy (params[i].short_desc,
- "Network latency setting in no. of periods");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "listen-port");
- params[i].character = 'l';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 3000U;
- strcpy (params[i].short_desc,
- "The socket port we are listening on for sync packets");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "factor");
- params[i].character = 'f';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Factor for sample rate reduction (deprecated)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "upstream-factor");
- params[i].character = 'u';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Factor for sample rate reduction on the upstream (deprecated)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "celt");
- params[i].character = 'c';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "sets celt encoding and kbits value one channel is encoded at");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "bit-depth");
- params[i].character = 'b';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "transport-sync");
- params[i].character = 't';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Whether to slave the transport to the master transport");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "autoconf");
- params[i].character = 'a';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Whether to use Autoconfig, or just start.");
- strcpy (params[i].long_desc, params[i].short_desc);
- i++;
- strcpy (params[i].name, "redundancy");
- params[i].character = 'R';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Send packets N times");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "native-endian");
- params[i].character = 'e';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Don't convert samples to network byte order.");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "jitterval");
- params[i].character = 'J';
- params[i].type = JackDriverParamInt;
- params[i].value.i = 0;
- strcpy (params[i].short_desc,
- "attempted jitterbuffer microseconds on master");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "always-deadline");
- params[i].character = 'D';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Always wait until deadline");
- strcpy (params[i].long_desc, params[i].short_desc);
- desc->params = params;
-
- return desc;
+ jack_driver_desc_t * desc;
+ jack_driver_param_desc_t * params;
+ unsigned int i;
+
+ desc = calloc (1, sizeof(jack_driver_desc_t));
+ strcpy (desc->name, "net");
+ desc->nparams = 18;
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
+
+ i = 0;
+ strcpy (params[i].name, "audio-ins");
+ params[i].character = 'i';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 2U;
+ strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "audio-outs");
+ params[i].character = 'o';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 2U;
+ strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "midi-ins");
+ params[i].character = 'I';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "midi-outs");
+ params[i].character = 'O';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "rate");
+ params[i].character = 'r';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 48000U;
+ strcpy (params[i].short_desc, "Sample rate");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "period");
+ params[i].character = 'p';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1024U;
+ strcpy (params[i].short_desc, "Frames per period");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "num-periods");
+ params[i].character = 'n';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 5U;
+ strcpy (params[i].short_desc,
+ "Network latency setting in no. of periods");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "listen-port");
+ params[i].character = 'l';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 3000U;
+ strcpy (params[i].short_desc,
+ "The socket port we are listening on for sync packets");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "factor");
+ params[i].character = 'f';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Factor for sample rate reduction (deprecated)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "upstream-factor");
+ params[i].character = 'u';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Factor for sample rate reduction on the upstream (deprecated)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "celt");
+ params[i].character = 'c';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "sets celt encoding and kbits value one channel is encoded at");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "bit-depth");
+ params[i].character = 'b';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "transport-sync");
+ params[i].character = 't';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Whether to slave the transport to the master transport");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "autoconf");
+ params[i].character = 'a';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Whether to use Autoconfig, or just start.");
+ strcpy (params[i].long_desc, params[i].short_desc);
+ i++;
+ strcpy (params[i].name, "redundancy");
+ params[i].character = 'R';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Send packets N times");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "native-endian");
+ params[i].character = 'e';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Don't convert samples to network byte order.");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "jitterval");
+ params[i].character = 'J';
+ params[i].type = JackDriverParamInt;
+ params[i].value.i = 0;
+ strcpy (params[i].short_desc,
+ "attempted jitterbuffer microseconds on master");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "always-deadline");
+ params[i].character = 'D';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Always wait until deadline");
+ strcpy (params[i].long_desc, params[i].short_desc);
+ desc->params = params;
+
+ return desc;
}
const char driver_client_name[] = "net_pcm";
@@ -569,130 +579,130 @@ const char driver_client_name[] = "net_pcm";
jack_driver_t *
driver_initialize (jack_client_t *client, const JSList * params)
{
- jack_nframes_t sample_rate = 48000;
- jack_nframes_t resample_factor = 1;
- jack_nframes_t period_size = 1024;
- unsigned int capture_ports = 2;
- unsigned int playback_ports = 2;
- unsigned int capture_ports_midi = 1;
- unsigned int playback_ports_midi = 1;
- unsigned int listen_port = 3000;
- unsigned int resample_factor_up = 0;
- unsigned int bitdepth = 0;
- unsigned int handle_transport_sync = 1;
- unsigned int use_autoconfig = 1;
- unsigned int latency = 5;
- unsigned int redundancy = 1;
- int dont_htonl_floats = 0;
- int always_deadline = 0;
- int jitter_val = 0;
- const JSList * node;
- const jack_driver_param_t * param;
-
- for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
-
- switch (param->character) {
-
- case 'i':
- capture_ports = param->value.ui;
- break;
-
- case 'o':
- playback_ports = param->value.ui;
- break;
-
- case 'I':
- capture_ports_midi = param->value.ui;
- break;
-
- case 'O':
- playback_ports_midi = param->value.ui;
- break;
-
- case 'r':
- sample_rate = param->value.ui;
- break;
-
- case 'p':
- period_size = param->value.ui;
- break;
-
- case 'l':
- listen_port = param->value.ui;
- break;
-
- case 'f':
+ jack_nframes_t sample_rate = 48000;
+ jack_nframes_t resample_factor = 1;
+ jack_nframes_t period_size = 1024;
+ unsigned int capture_ports = 2;
+ unsigned int playback_ports = 2;
+ unsigned int capture_ports_midi = 1;
+ unsigned int playback_ports_midi = 1;
+ unsigned int listen_port = 3000;
+ unsigned int resample_factor_up = 0;
+ unsigned int bitdepth = 0;
+ unsigned int handle_transport_sync = 1;
+ unsigned int use_autoconfig = 1;
+ unsigned int latency = 5;
+ unsigned int redundancy = 1;
+ int dont_htonl_floats = 0;
+ int always_deadline = 0;
+ int jitter_val = 0;
+ const JSList * node;
+ const jack_driver_param_t * param;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (const jack_driver_param_t*)node->data;
+
+ switch (param->character) {
+
+ case 'i':
+ capture_ports = param->value.ui;
+ break;
+
+ case 'o':
+ playback_ports = param->value.ui;
+ break;
+
+ case 'I':
+ capture_ports_midi = param->value.ui;
+ break;
+
+ case 'O':
+ playback_ports_midi = param->value.ui;
+ break;
+
+ case 'r':
+ sample_rate = param->value.ui;
+ break;
+
+ case 'p':
+ period_size = param->value.ui;
+ break;
+
+ case 'l':
+ listen_port = param->value.ui;
+ break;
+
+ case 'f':
#if HAVE_SAMPLERATE
- resample_factor = param->value.ui;
+ resample_factor = param->value.ui;
#else
- printf( "not built with libsamplerate support\n" );
- exit(10);
+ printf ( "not built with libsamplerate support\n" );
+ exit (10);
#endif
- break;
+ break;
- case 'u':
+ case 'u':
#if HAVE_SAMPLERATE
- resample_factor_up = param->value.ui;
+ resample_factor_up = param->value.ui;
#else
- printf( "not built with libsamplerate support\n" );
- exit(10);
+ printf ( "not built with libsamplerate support\n" );
+ exit (10);
#endif
- break;
+ break;
- case 'b':
- bitdepth = param->value.ui;
- break;
+ case 'b':
+ bitdepth = param->value.ui;
+ break;
- case 'c':
+ case 'c':
#if HAVE_CELT
- bitdepth = 1000;
- resample_factor = param->value.ui;
+ bitdepth = 1000;
+ resample_factor = param->value.ui;
#else
- printf( "not built with celt support\n" );
- exit(10);
+ printf ( "not built with celt support\n" );
+ exit (10);
#endif
- break;
-
- case 't':
- handle_transport_sync = param->value.ui;
- break;
-
- case 'a':
- use_autoconfig = param->value.ui;
- break;
-
- case 'n':
- latency = param->value.ui;
- break;
-
- case 'R':
- redundancy = param->value.ui;
- break;
-
- case 'e':
- dont_htonl_floats = param->value.ui;
- break;
- case 'J':
- jitter_val = param->value.i;
- break;
- case 'D':
- always_deadline = param->value.ui;
- break;
- }
- }
-
- return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
- capture_ports_midi, playback_ports_midi,
- sample_rate, period_size,
- listen_port, handle_transport_sync,
- resample_factor, resample_factor_up, bitdepth,
- use_autoconfig, latency, redundancy,
- dont_htonl_floats, always_deadline, jitter_val);
+ break;
+
+ case 't':
+ handle_transport_sync = param->value.ui;
+ break;
+
+ case 'a':
+ use_autoconfig = param->value.ui;
+ break;
+
+ case 'n':
+ latency = param->value.ui;
+ break;
+
+ case 'R':
+ redundancy = param->value.ui;
+ break;
+
+ case 'e':
+ dont_htonl_floats = param->value.ui;
+ break;
+ case 'J':
+ jitter_val = param->value.i;
+ break;
+ case 'D':
+ always_deadline = param->value.ui;
+ break;
+ }
+ }
+
+ return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
+ capture_ports_midi, playback_ports_midi,
+ sample_rate, period_size,
+ listen_port, handle_transport_sync,
+ resample_factor, resample_factor_up, bitdepth,
+ use_autoconfig, latency, redundancy,
+ dont_htonl_floats, always_deadline, jitter_val);
}
void
driver_finish (jack_driver_t *driver)
{
- net_driver_delete ((net_driver_t *) driver);
+ net_driver_delete ((net_driver_t*)driver);
}
diff --git a/drivers/netjack/net_driver.h b/drivers/netjack/net_driver.h
index da4258d..0b73583 100644
--- a/drivers/netjack/net_driver.h
+++ b/drivers/netjack/net_driver.h
@@ -15,7 +15,7 @@
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 __JACK_NET_DRIVER_H__
@@ -35,11 +35,10 @@
typedef struct _net_driver net_driver_t;
-struct _net_driver
-{
- JACK_DRIVER_NT_DECL;
+struct _net_driver {
+ JACK_DRIVER_NT_DECL;
- netjack_driver_state_t netj;
+ netjack_driver_state_t netj;
};
#endif /* __JACK_NET_DRIVER_H__ */
diff --git a/drivers/netjack/netjack.c b/drivers/netjack/netjack.c
index f3afe4e..5d26e4b 100644
--- a/drivers/netjack/netjack.c
+++ b/drivers/netjack/netjack.c
@@ -1,29 +1,29 @@
/* -*- mode: c; c-file-style: "linux"; -*- */
/*
-NetJack Abstraction.
+ NetJack Abstraction.
-Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
-Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
-Copyright (C) 2003 Robert Ham <rah@bash.sh>
-Copyright (C) 2001 Paul Davis
+ Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
+ Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
+ Copyright (C) 2003 Robert Ham <rah@bash.sh>
+ Copyright (C) 2001 Paul Davis
-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 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.
+ 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.
+ 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.
-$Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
-*/
+ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
+ */
#include <math.h>
@@ -69,740 +69,736 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
// JACK2
//#include "jack/control.h"
-#define MIN(x,y) ((x)<(y) ? (x) : (y))
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
static int sync_state = 1;
static jack_transport_state_t last_transport_state;
static int
-net_driver_sync_cb(jack_transport_state_t state, jack_position_t *pos, void *data)
+net_driver_sync_cb (jack_transport_state_t state, jack_position_t *pos, void *data)
{
- int retval = sync_state;
+ int retval = sync_state;
- if (state == JackTransportStarting && last_transport_state != JackTransportStarting) {
- retval = 0;
- }
+ if (state == JackTransportStarting && last_transport_state != JackTransportStarting) {
+ retval = 0;
+ }
// if (state == JackTransportStarting)
// jack_info("Starting sync_state = %d", sync_state);
- last_transport_state = state;
- return retval;
+ last_transport_state = state;
+ return retval;
}
-int netjack_wait( netjack_driver_state_t *netj, jack_time_t (*get_microseconds)(void) )
+int netjack_wait ( netjack_driver_state_t *netj, jack_time_t (*get_microseconds)(void) )
{
- int we_have_the_expected_frame = 0;
- jack_nframes_t next_frame_avail;
- jack_time_t packet_recv_time_stamp;
- jacknet_packet_header *pkthdr;
-
- if( !netj->next_deadline_valid ) {
- netj->next_deadline = get_microseconds() + netj->period_usecs;
- netj->next_deadline_valid = 1;
- }
-
- // Increment expected frame here.
-
- if( netj->expected_framecnt_valid ) {
- netj->expected_framecnt += 1;
- } else {
- // starting up.... lets look into the packetcache, and fetch the highest packet.
- packet_cache_drain_socket( netj->packcache, netj->sockfd, get_microseconds );
- if( packet_cache_get_highest_available_framecnt( netj->packcache, &next_frame_avail ) ) {
- netj->expected_framecnt = next_frame_avail;
- netj->expected_framecnt_valid = 1;
+ int we_have_the_expected_frame = 0;
+ jack_nframes_t next_frame_avail;
+ jack_time_t packet_recv_time_stamp;
+ jacknet_packet_header *pkthdr;
+
+ if ( !netj->next_deadline_valid ) {
+ netj->next_deadline = get_microseconds () + netj->period_usecs;
+ netj->next_deadline_valid = 1;
+ }
+
+ // Increment expected frame here.
+
+ if ( netj->expected_framecnt_valid ) {
+ netj->expected_framecnt += 1;
} else {
- // no packets there... start normally.
- netj->expected_framecnt = 0;
- netj->expected_framecnt_valid = 1;
+ // starting up.... lets look into the packetcache, and fetch the highest packet.
+ packet_cache_drain_socket ( netj->packcache, netj->sockfd, get_microseconds );
+ if ( packet_cache_get_highest_available_framecnt ( netj->packcache, &next_frame_avail ) ) {
+ netj->expected_framecnt = next_frame_avail;
+ netj->expected_framecnt_valid = 1;
+ } else {
+ // no packets there... start normally.
+ netj->expected_framecnt = 0;
+ netj->expected_framecnt_valid = 1;
+ }
+
}
- }
-
- //jack_log( "expect %d", netj->expected_framecnt );
- // Now check if required packet is already in the cache.
- // then poll (have deadline calculated)
- // then drain socket, rinse and repeat.
- while(1) {
- if( packet_cache_get_next_available_framecnt( netj->packcache, netj->expected_framecnt, &next_frame_avail) ) {
- if( next_frame_avail == netj->expected_framecnt ) {
- we_have_the_expected_frame = 1;
- if( !netj->always_deadline )
+ //jack_log( "expect %d", netj->expected_framecnt );
+ // Now check if required packet is already in the cache.
+ // then poll (have deadline calculated)
+ // then drain socket, rinse and repeat.
+ while (1) {
+ if ( packet_cache_get_next_available_framecnt ( netj->packcache, netj->expected_framecnt, &next_frame_avail) ) {
+ if ( next_frame_avail == netj->expected_framecnt ) {
+ we_have_the_expected_frame = 1;
+ if ( !netj->always_deadline ) {
+ break;
+ }
+ }
+ }
+ if ( !netjack_poll_deadline ( netj->sockfd, netj->next_deadline, get_microseconds ) ) {
break;
- }
- }
- if( ! netjack_poll_deadline( netj->sockfd, netj->next_deadline, get_microseconds ) ) {
- break;
- }
+ }
- packet_cache_drain_socket( netj->packcache, netj->sockfd, get_microseconds );
- }
+ packet_cache_drain_socket ( netj->packcache, netj->sockfd, get_microseconds );
+ }
- // check if we know who to send our packets too.
- if (!netj->srcaddress_valid)
- if( netj->packcache->master_address_valid ) {
- memcpy (&(netj->syncsource_address), &(netj->packcache->master_address), sizeof( struct sockaddr_in ) );
- netj->srcaddress_valid = 1;
+ // check if we know who to send our packets too.
+ if (!netj->srcaddress_valid) {
+ if ( netj->packcache->master_address_valid ) {
+ memcpy (&(netj->syncsource_address), &(netj->packcache->master_address), sizeof( struct sockaddr_in ) );
+ netj->srcaddress_valid = 1;
+ }
}
- // XXX: switching mode unconditionally is stupid.
- // if we were running free perhaps we like to behave differently
- // ie. fastforward one packet etc.
- // well... this is the first packet we see. hmm.... dunno ;S
- // it works... so...
- netj->running_free = 0;
+ // XXX: switching mode unconditionally is stupid.
+ // if we were running free perhaps we like to behave differently
+ // ie. fastforward one packet etc.
+ // well... this is the first packet we see. hmm.... dunno ;S
+ // it works... so...
+ netj->running_free = 0;
- //if( !we_have_the_expected_frame )
- // jack_error( "netxrun... %d", netj->expected_framecnt );
+ //if( !we_have_the_expected_frame )
+ // jack_error( "netxrun... %d", netj->expected_framecnt );
- if( we_have_the_expected_frame ) {
+ if ( we_have_the_expected_frame ) {
- jack_time_t now = get_microseconds();
- if( now < netj->next_deadline )
- netj->time_to_deadline = netj->next_deadline - now;
- else
- netj->time_to_deadline = 0;
+ jack_time_t now = get_microseconds ();
+ if ( now < netj->next_deadline ) {
+ netj->time_to_deadline = netj->next_deadline - now;
+ } else {
+ netj->time_to_deadline = 0;
+ }
- packet_cache_retreive_packet_pointer( netj->packcache, netj->expected_framecnt, (char **) &(netj->rx_buf), netj->rx_bufsize , &packet_recv_time_stamp);
- pkthdr = (jacknet_packet_header *) netj->rx_buf;
- packet_header_ntoh(pkthdr);
- netj->deadline_goodness = (int)pkthdr->sync_state;
- netj->packet_data_valid = 1;
-
- int want_deadline;
- if( netj->jitter_val != 0 )
- want_deadline = netj->jitter_val;
- else if( netj->latency < 4 )
- want_deadline = -netj->period_usecs/2;
- else
- want_deadline = (netj->period_usecs/4+10*(int)netj->period_usecs*netj->latency/100);
-
- if( netj->deadline_goodness != MASTER_FREEWHEELS ) {
- if( netj->deadline_goodness < want_deadline ) {
- netj->next_deadline -= netj->period_usecs/100;
- //jack_log( "goodness: %d, Adjust deadline: --- %d\n", netj->deadline_goodness, (int) netj->period_usecs*netj->latency/100 );
+ packet_cache_retreive_packet_pointer ( netj->packcache, netj->expected_framecnt, (char**)&(netj->rx_buf), netj->rx_bufsize, &packet_recv_time_stamp);
+ pkthdr = (jacknet_packet_header*)netj->rx_buf;
+ packet_header_ntoh (pkthdr);
+ netj->deadline_goodness = (int)pkthdr->sync_state;
+ netj->packet_data_valid = 1;
+
+ int want_deadline;
+ if ( netj->jitter_val != 0 ) {
+ want_deadline = netj->jitter_val;
+ } else if ( netj->latency < 4 ) {
+ want_deadline = -netj->period_usecs / 2;
+ } else {
+ want_deadline = (netj->period_usecs / 4 + 10 * (int)netj->period_usecs * netj->latency / 100);
}
- if( netj->deadline_goodness > want_deadline ) {
- netj->next_deadline += netj->period_usecs/100;
- //jack_log( "goodness: %d, Adjust deadline: +++ %d\n", netj->deadline_goodness, (int) netj->period_usecs*netj->latency/100 );
+
+ if ( netj->deadline_goodness != MASTER_FREEWHEELS ) {
+ if ( netj->deadline_goodness < want_deadline ) {
+ netj->next_deadline -= netj->period_usecs / 100;
+ //jack_log( "goodness: %d, Adjust deadline: --- %d\n", netj->deadline_goodness, (int) netj->period_usecs*netj->latency/100 );
+ }
+ if ( netj->deadline_goodness > want_deadline ) {
+ netj->next_deadline += netj->period_usecs / 100;
+ //jack_log( "goodness: %d, Adjust deadline: +++ %d\n", netj->deadline_goodness, (int) netj->period_usecs*netj->latency/100 );
+ }
}
- }
// if( netj->next_deadline < (netj->period_usecs*70/100) ) {
// jack_error( "master is forcing deadline_offset to below 70%% of period_usecs... increase latency setting on master" );
// netj->deadline_offset = (netj->period_usecs*90/100);
// }
- netj->next_deadline += netj->period_usecs;
- } else {
- netj->time_to_deadline = 0;
- netj->next_deadline += netj->period_usecs;
- // bah... the packet is not there.
- // either
- // - it got lost.
- // - its late
- // - sync source is not sending anymore.
-
- // lets check if we have the next packets, we will just run a cycle without data.
- // in that case.
-
- if( packet_cache_get_next_available_framecnt( netj->packcache, netj->expected_framecnt, &next_frame_avail) )
- {
- jack_nframes_t offset = next_frame_avail - netj->expected_framecnt;
-
- //XXX: hmm... i need to remember why resync_threshold wasnt right.
- //if( offset < netj->resync_threshold )
- if( offset < 10 ) {
- // ok. dont do nothing. we will run without data.
- // this seems to be one or 2 lost packets.
- //
- // this can also be reordered packet jitter.
- // (maybe this is not happening in real live)
- // but it happens in netem.
-
- netj->packet_data_valid = 0;
-
- // I also found this happening, when the packet queue, is too full.
- // but wtf ? use a smaller latency. this link can handle that ;S
- if( packet_cache_get_fill( netj->packcache, netj->expected_framecnt ) > 80.0 )
- netj->next_deadline -= netj->period_usecs/2;
-
-
- } else {
- // the diff is too high. but we have a packet in the future.
- // lets resync.
- netj->expected_framecnt = next_frame_avail;
- packet_cache_retreive_packet_pointer( netj->packcache, netj->expected_framecnt, (char **) &(netj->rx_buf), netj->rx_bufsize, NULL );
- pkthdr = (jacknet_packet_header *) netj->rx_buf;
- packet_header_ntoh(pkthdr);
- //netj->deadline_goodness = 0;
- netj->deadline_goodness = (int)pkthdr->sync_state - (int)netj->period_usecs * offset;
- netj->next_deadline_valid = 0;
- netj->packet_data_valid = 1;
- }
-
+ netj->next_deadline += netj->period_usecs;
} else {
- // no packets in buffer.
- netj->packet_data_valid = 0;
-
- //printf( "frame %d No Packet in queue. num_lost_packets = %d \n", netj->expected_framecnt, netj->num_lost_packets );
- if( netj->num_lost_packets < 5 ) {
- // ok. No Packet in queue. The packet was either lost,
- // or we are running too fast.
- //
- // Adjusting the deadline unconditionally resulted in
- // too many xruns on master.
- // But we need to adjust for the case we are running too fast.
- // So lets check if the last packet is there now.
- //
- // It would not be in the queue anymore, if it had been
- // retrieved. This might break for redundancy, but
- // i will make the packet cache drop redundant packets,
- // that have already been retreived.
- //
- if( packet_cache_get_highest_available_framecnt( netj->packcache, &next_frame_avail) ) {
- if( next_frame_avail == (netj->expected_framecnt - 1) ) {
- // Ok. the last packet is there now.
- // and it had not been retrieved.
- //
- // TODO: We are still dropping 2 packets.
- // perhaps we can adjust the deadline
- // when (num_packets lost == 0)
-
- // This might still be too much.
- netj->next_deadline += netj->period_usecs;
- }
- }
- } else if( (netj->num_lost_packets <= 100) ) {
- // lets try adjusting the deadline harder, for some packets, we might have just ran 2 fast.
- netj->next_deadline += netj->period_usecs*netj->latency/8;
- } else {
-
- // But now we can check for any new frame available.
- //
- if( packet_cache_get_highest_available_framecnt( netj->packcache, &next_frame_avail) ) {
- netj->expected_framecnt = next_frame_avail;
- packet_cache_retreive_packet_pointer( netj->packcache, netj->expected_framecnt, (char **) &(netj->rx_buf), netj->rx_bufsize, NULL );
- pkthdr = (jacknet_packet_header *) netj->rx_buf;
- packet_header_ntoh(pkthdr);
- netj->deadline_goodness = pkthdr->sync_state;
- netj->next_deadline_valid = 0;
- netj->packet_data_valid = 1;
- netj->running_free = 0;
- jack_info( "resync after freerun... %d", netj->expected_framecnt );
+ netj->time_to_deadline = 0;
+ netj->next_deadline += netj->period_usecs;
+ // bah... the packet is not there.
+ // either
+ // - it got lost.
+ // - its late
+ // - sync source is not sending anymore.
+
+ // lets check if we have the next packets, we will just run a cycle without data.
+ // in that case.
+
+ if ( packet_cache_get_next_available_framecnt ( netj->packcache, netj->expected_framecnt, &next_frame_avail) ) {
+ jack_nframes_t offset = next_frame_avail - netj->expected_framecnt;
+
+ //XXX: hmm... i need to remember why resync_threshold wasnt right.
+ //if( offset < netj->resync_threshold )
+ if ( offset < 10 ) {
+ // ok. dont do nothing. we will run without data.
+ // this seems to be one or 2 lost packets.
+ //
+ // this can also be reordered packet jitter.
+ // (maybe this is not happening in real live)
+ // but it happens in netem.
+
+ netj->packet_data_valid = 0;
+
+ // I also found this happening, when the packet queue, is too full.
+ // but wtf ? use a smaller latency. this link can handle that ;S
+ if ( packet_cache_get_fill ( netj->packcache, netj->expected_framecnt ) > 80.0 ) {
+ netj->next_deadline -= netj->period_usecs / 2;
+ }
+
+
+ } else {
+ // the diff is too high. but we have a packet in the future.
+ // lets resync.
+ netj->expected_framecnt = next_frame_avail;
+ packet_cache_retreive_packet_pointer ( netj->packcache, netj->expected_framecnt, (char**)&(netj->rx_buf), netj->rx_bufsize, NULL );
+ pkthdr = (jacknet_packet_header*)netj->rx_buf;
+ packet_header_ntoh (pkthdr);
+ //netj->deadline_goodness = 0;
+ netj->deadline_goodness = (int)pkthdr->sync_state - (int)netj->period_usecs * offset;
+ netj->next_deadline_valid = 0;
+ netj->packet_data_valid = 1;
+ }
+
} else {
- if( netj->num_lost_packets == 101 ) {
- jack_info( "master seems gone... entering freerun mode", netj->expected_framecnt );
- }
-
- netj->running_free = 1;
-
- // when we really dont see packets.
- // reset source address. and open possibility for new master.
- // maybe dsl reconnect. Also restart of netsource without fix
- // reply address changes port.
- if (netj->num_lost_packets > 200 ) {
- netj->srcaddress_valid = 0;
- packet_cache_reset_master_address( netj->packcache );
- }
+ // no packets in buffer.
+ netj->packet_data_valid = 0;
+
+ //printf( "frame %d No Packet in queue. num_lost_packets = %d \n", netj->expected_framecnt, netj->num_lost_packets );
+ if ( netj->num_lost_packets < 5 ) {
+ // ok. No Packet in queue. The packet was either lost,
+ // or we are running too fast.
+ //
+ // Adjusting the deadline unconditionally resulted in
+ // too many xruns on master.
+ // But we need to adjust for the case we are running too fast.
+ // So lets check if the last packet is there now.
+ //
+ // It would not be in the queue anymore, if it had been
+ // retrieved. This might break for redundancy, but
+ // i will make the packet cache drop redundant packets,
+ // that have already been retreived.
+ //
+ if ( packet_cache_get_highest_available_framecnt ( netj->packcache, &next_frame_avail) ) {
+ if ( next_frame_avail == (netj->expected_framecnt - 1) ) {
+ // Ok. the last packet is there now.
+ // and it had not been retrieved.
+ //
+ // TODO: We are still dropping 2 packets.
+ // perhaps we can adjust the deadline
+ // when (num_packets lost == 0)
+
+ // This might still be too much.
+ netj->next_deadline += netj->period_usecs;
+ }
+ }
+ } else if ( (netj->num_lost_packets <= 100) ) {
+ // lets try adjusting the deadline harder, for some packets, we might have just ran 2 fast.
+ netj->next_deadline += netj->period_usecs * netj->latency / 8;
+ } else {
+
+ // But now we can check for any new frame available.
+ //
+ if ( packet_cache_get_highest_available_framecnt ( netj->packcache, &next_frame_avail) ) {
+ netj->expected_framecnt = next_frame_avail;
+ packet_cache_retreive_packet_pointer ( netj->packcache, netj->expected_framecnt, (char**)&(netj->rx_buf), netj->rx_bufsize, NULL );
+ pkthdr = (jacknet_packet_header*)netj->rx_buf;
+ packet_header_ntoh (pkthdr);
+ netj->deadline_goodness = pkthdr->sync_state;
+ netj->next_deadline_valid = 0;
+ netj->packet_data_valid = 1;
+ netj->running_free = 0;
+ jack_info ( "resync after freerun... %d", netj->expected_framecnt );
+ } else {
+ if ( netj->num_lost_packets == 101 ) {
+ jack_info ( "master seems gone... entering freerun mode", netj->expected_framecnt );
+ }
+
+ netj->running_free = 1;
+
+ // when we really dont see packets.
+ // reset source address. and open possibility for new master.
+ // maybe dsl reconnect. Also restart of netsource without fix
+ // reply address changes port.
+ if (netj->num_lost_packets > 200 ) {
+ netj->srcaddress_valid = 0;
+ packet_cache_reset_master_address ( netj->packcache );
+ }
+ }
+ }
}
- }
}
- }
- int retval = 0;
+ int retval = 0;
- if( !netj->packet_data_valid ) {
- netj->num_lost_packets += 1;
- if( netj->num_lost_packets == 1 )
- retval = netj->period_usecs;
- } else {
- if( (netj->num_lost_packets>1) && !netj->running_free )
- retval = (netj->num_lost_packets-1) * netj->period_usecs;
+ if ( !netj->packet_data_valid ) {
+ netj->num_lost_packets += 1;
+ if ( netj->num_lost_packets == 1 ) {
+ retval = netj->period_usecs;
+ }
+ } else {
+ if ( (netj->num_lost_packets > 1) && !netj->running_free ) {
+ retval = (netj->num_lost_packets - 1) * netj->period_usecs;
+ }
- netj->num_lost_packets = 0;
- }
+ netj->num_lost_packets = 0;
+ }
- return retval;
+ return retval;
}
-void netjack_send_silence( netjack_driver_state_t *netj, int syncstate )
+void netjack_send_silence ( netjack_driver_state_t *netj, int syncstate )
{
- int tx_size = get_sample_size(netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
- unsigned int *packet_buf, *packet_bufX;
+ int tx_size = get_sample_size (netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
+ unsigned int *packet_buf, *packet_bufX;
- packet_buf = alloca( tx_size);
- jacknet_packet_header *tx_pkthdr = (jacknet_packet_header *)packet_buf;
- jacknet_packet_header *rx_pkthdr = (jacknet_packet_header *)netj->rx_buf;
+ packet_buf = alloca ( tx_size);
+ jacknet_packet_header *tx_pkthdr = (jacknet_packet_header*)packet_buf;
+ jacknet_packet_header *rx_pkthdr = (jacknet_packet_header*)netj->rx_buf;
- //framecnt = rx_pkthdr->framecnt;
+ //framecnt = rx_pkthdr->framecnt;
- netj->reply_port = rx_pkthdr->reply_port;
+ netj->reply_port = rx_pkthdr->reply_port;
- // offset packet_bufX by the packetheader.
- packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
+ // offset packet_bufX by the packetheader.
+ packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
- tx_pkthdr->sync_state = syncstate;
- tx_pkthdr->framecnt = netj->expected_framecnt;
+ tx_pkthdr->sync_state = syncstate;
+ tx_pkthdr->framecnt = netj->expected_framecnt;
- // memset 0 the payload.
- int payload_size = get_sample_size(netj->bitdepth) * netj->playback_channels * netj->net_period_up;
- memset(packet_bufX, 0, payload_size);
+ // memset 0 the payload.
+ int payload_size = get_sample_size (netj->bitdepth) * netj->playback_channels * netj->net_period_up;
+ memset (packet_bufX, 0, payload_size);
- packet_header_hton(tx_pkthdr);
- if (netj->srcaddress_valid)
- {
- int r;
- if (netj->reply_port)
- netj->syncsource_address.sin_port = htons(netj->reply_port);
+ packet_header_hton (tx_pkthdr);
+ if (netj->srcaddress_valid) {
+ int r;
+ if (netj->reply_port) {
+ netj->syncsource_address.sin_port = htons (netj->reply_port);
+ }
- for( r=0; r<netj->redundancy; r++ )
- netjack_sendto(netj->outsockfd, (char *)packet_buf, tx_size,
- 0, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
- }
+ for ( r = 0; r < netj->redundancy; r++ )
+ netjack_sendto (netj->outsockfd, (char*)packet_buf, tx_size,
+ 0, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
+ }
}
-void netjack_attach( netjack_driver_state_t *netj )
+void netjack_attach ( netjack_driver_state_t *netj )
{
- //puts ("net_driver_attach");
- jack_port_t * port;
- char buf[32];
- unsigned int chn;
- int port_flags;
+ //puts ("net_driver_attach");
+ jack_port_t * port;
+ char buf[32];
+ unsigned int chn;
+ int port_flags;
- if( netj->bitdepth == CELT_MODE )
- {
+ if ( netj->bitdepth == CELT_MODE ) {
#if HAVE_CELT
#if HAVE_CELT_API_0_7 || HAVE_CELT_API_0_8
- celt_int32 lookahead;
- netj->celt_mode = celt_mode_create( netj->sample_rate, netj->period_size, NULL );
+ celt_int32 lookahead;
+ netj->celt_mode = celt_mode_create ( netj->sample_rate, netj->period_size, NULL );
#else
- celt_int32_t lookahead;
- netj->celt_mode = celt_mode_create( netj->sample_rate, 1, netj->period_size, NULL );
+ celt_int32_t lookahead;
+ netj->celt_mode = celt_mode_create ( netj->sample_rate, 1, netj->period_size, NULL );
#endif
- celt_mode_info( netj->celt_mode, CELT_GET_LOOKAHEAD, &lookahead );
- netj->codec_latency = 2*lookahead;
+ celt_mode_info ( netj->celt_mode, CELT_GET_LOOKAHEAD, &lookahead );
+ netj->codec_latency = 2 * lookahead;
#endif
- }
+ }
- if (netj->handle_transport_sync)
- jack_set_sync_callback(netj->client, (JackSyncCallback) net_driver_sync_cb, NULL);
+ if (netj->handle_transport_sync) {
+ jack_set_sync_callback (netj->client, (JackSyncCallback)net_driver_sync_cb, NULL);
+ }
- port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
- for (chn = 0; chn < netj->capture_channels_audio; chn++) {
- snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
+ for (chn = 0; chn < netj->capture_channels_audio; chn++) {
+ snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
- port = jack_port_register (netj->client, buf,
- JACK_DEFAULT_AUDIO_TYPE,
- port_flags, 0);
- if (!port) {
- jack_error ("NET: cannot register port for %s", buf);
- break;
- }
+ port = jack_port_register (netj->client, buf,
+ JACK_DEFAULT_AUDIO_TYPE,
+ port_flags, 0);
+ if (!port) {
+ jack_error ("NET: cannot register port for %s", buf);
+ break;
+ }
- netj->capture_ports =
- jack_slist_append (netj->capture_ports, port);
+ netj->capture_ports =
+ jack_slist_append (netj->capture_ports, port);
- if( netj->bitdepth == CELT_MODE ) {
+ if ( netj->bitdepth == CELT_MODE ) {
#if HAVE_CELT
#if HAVE_CELT_API_0_7 || HAVE_CELT_API_0_8
- netj->capture_srcs = jack_slist_append(netj->capture_srcs, celt_decoder_create( netj->celt_mode, 1, NULL ) );
+ netj->capture_srcs = jack_slist_append (netj->capture_srcs, celt_decoder_create ( netj->celt_mode, 1, NULL ) );
#else
- netj->capture_srcs = jack_slist_append(netj->capture_srcs, celt_decoder_create( netj->celt_mode ) );
+ netj->capture_srcs = jack_slist_append (netj->capture_srcs, celt_decoder_create ( netj->celt_mode ) );
#endif
#endif
- } else {
+ } else {
#if HAVE_SAMPLERATE
- netj->capture_srcs = jack_slist_append(netj->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
+ netj->capture_srcs = jack_slist_append (netj->capture_srcs, src_new (SRC_LINEAR, 1, NULL));
#endif
+ }
}
- }
- for (chn = netj->capture_channels_audio; chn < netj->capture_channels; chn++) {
- snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
+ for (chn = netj->capture_channels_audio; chn < netj->capture_channels; chn++) {
+ snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
- port = jack_port_register (netj->client, buf,
- JACK_DEFAULT_MIDI_TYPE,
- port_flags, 0);
- if (!port) {
- jack_error ("NET: cannot register port for %s", buf);
- break;
- }
+ port = jack_port_register (netj->client, buf,
+ JACK_DEFAULT_MIDI_TYPE,
+ port_flags, 0);
+ if (!port) {
+ jack_error ("NET: cannot register port for %s", buf);
+ break;
+ }
- netj->capture_ports =
- jack_slist_append (netj->capture_ports, port);
- }
+ netj->capture_ports =
+ jack_slist_append (netj->capture_ports, port);
+ }
- port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
- for (chn = 0; chn < netj->playback_channels_audio; chn++) {
- snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
+ for (chn = 0; chn < netj->playback_channels_audio; chn++) {
+ snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
- port = jack_port_register (netj->client, buf,
- JACK_DEFAULT_AUDIO_TYPE,
- port_flags, 0);
+ port = jack_port_register (netj->client, buf,
+ JACK_DEFAULT_AUDIO_TYPE,
+ port_flags, 0);
- if (!port) {
- jack_error ("NET: cannot register port for %s", buf);
- break;
- }
+ if (!port) {
+ jack_error ("NET: cannot register port for %s", buf);
+ break;
+ }
- netj->playback_ports =
- jack_slist_append (netj->playback_ports, port);
- if( netj->bitdepth == CELT_MODE ) {
+ netj->playback_ports =
+ jack_slist_append (netj->playback_ports, port);
+ if ( netj->bitdepth == CELT_MODE ) {
#if HAVE_CELT
#if HAVE_CELT_API_0_7 || HAVE_CELT_API_0_8
- CELTMode *celt_mode = celt_mode_create( netj->sample_rate, netj->period_size, NULL );
- netj->playback_srcs = jack_slist_append(netj->playback_srcs, celt_encoder_create( celt_mode, 1, NULL ) );
+ CELTMode *celt_mode = celt_mode_create ( netj->sample_rate, netj->period_size, NULL );
+ netj->playback_srcs = jack_slist_append (netj->playback_srcs, celt_encoder_create ( celt_mode, 1, NULL ) );
#else
- CELTMode *celt_mode = celt_mode_create( netj->sample_rate, 1, netj->period_size, NULL );
- netj->playback_srcs = jack_slist_append(netj->playback_srcs, celt_encoder_create( celt_mode ) );
+ CELTMode *celt_mode = celt_mode_create ( netj->sample_rate, 1, netj->period_size, NULL );
+ netj->playback_srcs = jack_slist_append (netj->playback_srcs, celt_encoder_create ( celt_mode ) );
#endif
#endif
- } else {
+ } else {
#if HAVE_SAMPLERATE
- netj->playback_srcs = jack_slist_append(netj->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
+ netj->playback_srcs = jack_slist_append (netj->playback_srcs, src_new (SRC_LINEAR, 1, NULL));
#endif
+ }
}
- }
- for (chn = netj->playback_channels_audio; chn < netj->playback_channels; chn++) {
- snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
+ for (chn = netj->playback_channels_audio; chn < netj->playback_channels; chn++) {
+ snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
- port = jack_port_register (netj->client, buf,
- JACK_DEFAULT_MIDI_TYPE,
- port_flags, 0);
+ port = jack_port_register (netj->client, buf,
+ JACK_DEFAULT_MIDI_TYPE,
+ port_flags, 0);
- if (!port) {
- jack_error ("NET: cannot register port for %s", buf);
- break;
- }
+ if (!port) {
+ jack_error ("NET: cannot register port for %s", buf);
+ break;
+ }
- netj->playback_ports =
- jack_slist_append (netj->playback_ports, port);
- }
+ netj->playback_ports =
+ jack_slist_append (netj->playback_ports, port);
+ }
- jack_activate (netj->client);
+ jack_activate (netj->client);
}
-void netjack_detach( netjack_driver_state_t *netj )
+void netjack_detach ( netjack_driver_state_t *netj )
{
- JSList * node;
+ JSList * node;
- for (node = netj->capture_ports; node; node = jack_slist_next (node))
- jack_port_unregister (netj->client,
- ((jack_port_t *) node->data));
+ for (node = netj->capture_ports; node; node = jack_slist_next (node))
+ jack_port_unregister (netj->client,
+ ((jack_port_t*)node->data));
- jack_slist_free (netj->capture_ports);
- netj->capture_ports = NULL;
+ jack_slist_free (netj->capture_ports);
+ netj->capture_ports = NULL;
- for (node = netj->capture_srcs; node; node = jack_slist_next (node))
- {
+ for (node = netj->capture_srcs; node; node = jack_slist_next (node)) {
#if HAVE_CELT
- if( netj->bitdepth == CELT_MODE )
- {
- CELTDecoder * decoder = node->data;
- celt_decoder_destroy(decoder);
- }
- else
+ if ( netj->bitdepth == CELT_MODE ) {
+ CELTDecoder * decoder = node->data;
+ celt_decoder_destroy (decoder);
+ } else
#endif
- {
+ {
#if HAVE_SAMPLERATE
- SRC_STATE * src = node->data;
- src_delete(src);
+ SRC_STATE * src = node->data;
+ src_delete (src);
#endif
- }
- }
- jack_slist_free (netj->capture_srcs);
- netj->playback_srcs = NULL;
+ }
+ }
+ jack_slist_free (netj->capture_srcs);
+ netj->playback_srcs = NULL;
- for (node = netj->playback_ports; node; node = jack_slist_next (node))
- jack_port_unregister (netj->client,
- ((jack_port_t *) node->data));
+ for (node = netj->playback_ports; node; node = jack_slist_next (node))
+ jack_port_unregister (netj->client,
+ ((jack_port_t*)node->data));
- jack_slist_free (netj->playback_ports);
- netj->playback_ports = NULL;
+ jack_slist_free (netj->playback_ports);
+ netj->playback_ports = NULL;
- for (node = netj->playback_srcs; node; node = jack_slist_next (node))
- {
+ for (node = netj->playback_srcs; node; node = jack_slist_next (node)) {
#if HAVE_CELT
- if( netj->bitdepth == CELT_MODE )
- {
- CELTEncoder * encoder = node->data;
- celt_encoder_destroy(encoder);
- }
- else
+ if ( netj->bitdepth == CELT_MODE ) {
+ CELTEncoder * encoder = node->data;
+ celt_encoder_destroy (encoder);
+ } else
#endif
- {
+ {
#if HAVE_SAMPLERATE
- SRC_STATE * src = node->data;
- src_delete(src);
+ SRC_STATE * src = node->data;
+ src_delete (src);
#endif
- }
- }
- jack_slist_free (netj->playback_srcs);
- netj->playback_srcs = NULL;
+ }
+ }
+ jack_slist_free (netj->playback_srcs);
+ netj->playback_srcs = NULL;
#if HAVE_CELT
- if( netj->bitdepth == CELT_MODE )
- celt_mode_destroy(netj->celt_mode);
+ if ( netj->bitdepth == CELT_MODE ) {
+ celt_mode_destroy (netj->celt_mode);
+ }
#endif
}
netjack_driver_state_t *netjack_init (netjack_driver_state_t *netj,
- jack_client_t * client,
- const char *name,
- unsigned int capture_ports,
- unsigned int playback_ports,
- unsigned int capture_ports_midi,
- unsigned int playback_ports_midi,
- jack_nframes_t sample_rate,
- jack_nframes_t period_size,
- unsigned int listen_port,
- unsigned int transport_sync,
- unsigned int resample_factor,
- unsigned int resample_factor_up,
- unsigned int bitdepth,
- unsigned int use_autoconfig,
- unsigned int latency,
- unsigned int redundancy,
- int dont_htonl_floats,
- int always_deadline,
- int jitter_val )
+ jack_client_t * client,
+ const char *name,
+ unsigned int capture_ports,
+ unsigned int playback_ports,
+ unsigned int capture_ports_midi,
+ unsigned int playback_ports_midi,
+ jack_nframes_t sample_rate,
+ jack_nframes_t period_size,
+ unsigned int listen_port,
+ unsigned int transport_sync,
+ unsigned int resample_factor,
+ unsigned int resample_factor_up,
+ unsigned int bitdepth,
+ unsigned int use_autoconfig,
+ unsigned int latency,
+ unsigned int redundancy,
+ int dont_htonl_floats,
+ int always_deadline,
+ int jitter_val )
{
- // Fill in netj values.
- // might be subject to autoconfig...
- // so dont calculate anything with them...
+ // Fill in netj values.
+ // might be subject to autoconfig...
+ // so dont calculate anything with them...
- netj->sample_rate = sample_rate;
- netj->period_size = period_size;
- netj->dont_htonl_floats = dont_htonl_floats;
+ netj->sample_rate = sample_rate;
+ netj->period_size = period_size;
+ netj->dont_htonl_floats = dont_htonl_floats;
- netj->listen_port = listen_port;
+ netj->listen_port = listen_port;
- netj->capture_channels = capture_ports + capture_ports_midi;
- netj->capture_channels_audio = capture_ports;
- netj->capture_channels_midi = capture_ports_midi;
- netj->capture_ports = NULL;
- netj->playback_channels = playback_ports + playback_ports_midi;
- netj->playback_channels_audio = playback_ports;
- netj->playback_channels_midi = playback_ports_midi;
- netj->playback_ports = NULL;
- netj->codec_latency = 0;
+ netj->capture_channels = capture_ports + capture_ports_midi;
+ netj->capture_channels_audio = capture_ports;
+ netj->capture_channels_midi = capture_ports_midi;
+ netj->capture_ports = NULL;
+ netj->playback_channels = playback_ports + playback_ports_midi;
+ netj->playback_channels_audio = playback_ports;
+ netj->playback_channels_midi = playback_ports_midi;
+ netj->playback_ports = NULL;
+ netj->codec_latency = 0;
- netj->handle_transport_sync = transport_sync;
- netj->mtu = 1400;
- netj->latency = latency;
- netj->redundancy = redundancy;
- netj->use_autoconfig = use_autoconfig;
- netj->always_deadline = always_deadline;
+ netj->handle_transport_sync = transport_sync;
+ netj->mtu = 1400;
+ netj->latency = latency;
+ netj->redundancy = redundancy;
+ netj->use_autoconfig = use_autoconfig;
+ netj->always_deadline = always_deadline;
- netj->client = client;
+ netj->client = client;
- if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16) && (bitdepth != CELT_MODE))
- {
- jack_info ("Invalid bitdepth: %d (8, 16 or 0 for float) !!!", bitdepth);
- return NULL;
- }
- netj->bitdepth = bitdepth;
+ if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16) && (bitdepth != CELT_MODE)) {
+ jack_info ("Invalid bitdepth: %d (8, 16 or 0 for float) !!!", bitdepth);
+ return NULL;
+ }
+ netj->bitdepth = bitdepth;
- if (resample_factor_up == 0)
- resample_factor_up = resample_factor;
+ if (resample_factor_up == 0) {
+ resample_factor_up = resample_factor;
+ }
- netj->resample_factor = resample_factor;
- netj->resample_factor_up = resample_factor_up;
+ netj->resample_factor = resample_factor;
+ netj->resample_factor_up = resample_factor_up;
- netj->jitter_val = jitter_val;
+ netj->jitter_val = jitter_val;
- return netj;
+ return netj;
}
-void netjack_release( netjack_driver_state_t *netj )
+void netjack_release ( netjack_driver_state_t *netj )
{
- close( netj->sockfd );
- close( netj->outsockfd );
+ close ( netj->sockfd );
+ close ( netj->outsockfd );
- packet_cache_free( netj->packcache );
- netj->packcache = NULL;
+ packet_cache_free ( netj->packcache );
+ netj->packcache = NULL;
}
int
-netjack_startup( netjack_driver_state_t *netj )
+netjack_startup ( netjack_driver_state_t *netj )
{
- int first_pack_len;
- struct sockaddr_in address;
- // Now open the socket, and wait for the first packet to arrive...
- netj->sockfd = socket (AF_INET, SOCK_DGRAM, 0);
+ int first_pack_len;
+ struct sockaddr_in address;
+
+ // Now open the socket, and wait for the first packet to arrive...
+ netj->sockfd = socket (AF_INET, SOCK_DGRAM, 0);
#ifdef WIN32
- if (netj->sockfd == INVALID_SOCKET)
+ if (netj->sockfd == INVALID_SOCKET)
#else
- if (netj->sockfd == -1)
+ if (netj->sockfd == -1)
#endif
- {
- jack_info ("socket error");
- return -1;
- }
- address.sin_family = AF_INET;
- address.sin_port = htons(netj->listen_port);
- address.sin_addr.s_addr = htonl(INADDR_ANY);
- if (bind (netj->sockfd, (struct sockaddr *) &address, sizeof (address)) < 0)
- {
- jack_info("bind error");
- return -1;
- }
-
- netj->outsockfd = socket (AF_INET, SOCK_DGRAM, 0);
+ {
+ jack_info ("socket error");
+ return -1;
+ }
+ address.sin_family = AF_INET;
+ address.sin_port = htons (netj->listen_port);
+ address.sin_addr.s_addr = htonl (INADDR_ANY);
+ if (bind (netj->sockfd, (struct sockaddr*)&address, sizeof(address)) < 0) {
+ jack_info ("bind error");
+ return -1;
+ }
+
+ netj->outsockfd = socket (AF_INET, SOCK_DGRAM, 0);
#ifdef WIN32
- if (netj->outsockfd == INVALID_SOCKET)
+ if (netj->outsockfd == INVALID_SOCKET)
#else
- if (netj->outsockfd == -1)
+ if (netj->outsockfd == -1)
#endif
- {
- jack_info ("socket error");
- return -1;
- }
- netj->srcaddress_valid = 0;
- if (netj->use_autoconfig)
- {
- jacknet_packet_header *first_packet = alloca (sizeof (jacknet_packet_header));
+ {
+ jack_info ("socket error");
+ return -1;
+ }
+ netj->srcaddress_valid = 0;
+ if (netj->use_autoconfig) {
+ jacknet_packet_header *first_packet = alloca (sizeof(jacknet_packet_header));
#ifdef WIN32
- int address_size = sizeof( struct sockaddr_in );
+ int address_size = sizeof( struct sockaddr_in );
#else
- socklen_t address_size = sizeof (struct sockaddr_in);
+ socklen_t address_size = sizeof(struct sockaddr_in);
#endif
- //jack_info ("Waiting for an incoming packet !!!");
- //jack_info ("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!");
-
- while(1) {
- if( ! netjack_poll( netj->sockfd, 1000 ) ) {
- jack_info ("Waiting aborted");
- return -1;
- }
- first_pack_len = recvfrom (netj->sockfd, (char *)first_packet, sizeof (jacknet_packet_header), 0, (struct sockaddr*) & netj->syncsource_address, &address_size);
+ //jack_info ("Waiting for an incoming packet !!!");
+ //jack_info ("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!");
+
+ while (1) {
+ if ( !netjack_poll ( netj->sockfd, 1000 ) ) {
+ jack_info ("Waiting aborted");
+ return -1;
+ }
+ first_pack_len = recvfrom (netj->sockfd, (char*)first_packet, sizeof(jacknet_packet_header), 0, (struct sockaddr*)&netj->syncsource_address, &address_size);
#ifdef WIN32
- if( first_pack_len == -1 ) {
- first_pack_len = sizeof(jacknet_packet_header);
- break;
- }
+ if ( first_pack_len == -1 ) {
+ first_pack_len = sizeof(jacknet_packet_header);
+ break;
+ }
#else
- if (first_pack_len == sizeof (jacknet_packet_header))
- break;
+ if (first_pack_len == sizeof(jacknet_packet_header)) {
+ break;
+ }
#endif
- }
- netj->srcaddress_valid = 1;
+ }
+ netj->srcaddress_valid = 1;
+
+ if (first_pack_len == sizeof(jacknet_packet_header)) {
+ packet_header_ntoh (first_packet);
+
+ jack_info ("AutoConfig Override !!!");
+ if (netj->sample_rate != first_packet->sample_rate) {
+ jack_info ("AutoConfig Override: Master JACK sample rate = %d", first_packet->sample_rate);
+ netj->sample_rate = first_packet->sample_rate;
+ }
+
+ if (netj->period_size != first_packet->period_size) {
+ jack_info ("AutoConfig Override: Master JACK period size is %d", first_packet->period_size);
+ netj->period_size = first_packet->period_size;
+ }
+ if (netj->capture_channels_audio != first_packet->capture_channels_audio) {
+ jack_info ("AutoConfig Override: capture_channels_audio = %d", first_packet->capture_channels_audio);
+ netj->capture_channels_audio = first_packet->capture_channels_audio;
+ }
+ if (netj->capture_channels_midi != first_packet->capture_channels_midi) {
+ jack_info ("AutoConfig Override: capture_channels_midi = %d", first_packet->capture_channels_midi);
+ netj->capture_channels_midi = first_packet->capture_channels_midi;
+ }
+ if (netj->playback_channels_audio != first_packet->playback_channels_audio) {
+ jack_info ("AutoConfig Override: playback_channels_audio = %d", first_packet->playback_channels_audio);
+ netj->playback_channels_audio = first_packet->playback_channels_audio;
+ }
+ if (netj->playback_channels_midi != first_packet->playback_channels_midi) {
+ jack_info ("AutoConfig Override: playback_channels_midi = %d", first_packet->playback_channels_midi);
+ netj->playback_channels_midi = first_packet->playback_channels_midi;
+ }
+
+ netj->mtu = first_packet->mtu;
+ jack_info ("MTU is set to %d bytes", first_packet->mtu);
+ netj->latency = first_packet->latency;
+ }
+ }
+ netj->capture_channels = netj->capture_channels_audio + netj->capture_channels_midi;
+ netj->playback_channels = netj->playback_channels_audio + netj->playback_channels_midi;
- if (first_pack_len == sizeof (jacknet_packet_header))
- {
- packet_header_ntoh (first_packet);
-
- jack_info ("AutoConfig Override !!!");
- if (netj->sample_rate != first_packet->sample_rate)
- {
- jack_info ("AutoConfig Override: Master JACK sample rate = %d", first_packet->sample_rate);
- netj->sample_rate = first_packet->sample_rate;
- }
-
- if (netj->period_size != first_packet->period_size)
- {
- jack_info ("AutoConfig Override: Master JACK period size is %d", first_packet->period_size);
- netj->period_size = first_packet->period_size;
- }
- if (netj->capture_channels_audio != first_packet->capture_channels_audio)
- {
- jack_info ("AutoConfig Override: capture_channels_audio = %d", first_packet->capture_channels_audio);
- netj->capture_channels_audio = first_packet->capture_channels_audio;
- }
- if (netj->capture_channels_midi != first_packet->capture_channels_midi)
- {
- jack_info ("AutoConfig Override: capture_channels_midi = %d", first_packet->capture_channels_midi);
- netj->capture_channels_midi = first_packet->capture_channels_midi;
- }
- if (netj->playback_channels_audio != first_packet->playback_channels_audio)
- {
- jack_info ("AutoConfig Override: playback_channels_audio = %d", first_packet->playback_channels_audio);
- netj->playback_channels_audio = first_packet->playback_channels_audio;
- }
- if (netj->playback_channels_midi != first_packet->playback_channels_midi)
- {
- jack_info ("AutoConfig Override: playback_channels_midi = %d", first_packet->playback_channels_midi);
- netj->playback_channels_midi = first_packet->playback_channels_midi;
- }
-
- netj->mtu = first_packet->mtu;
- jack_info ("MTU is set to %d bytes", first_packet->mtu);
- netj->latency = first_packet->latency;
+ if ( (netj->capture_channels * netj->period_size * netj->latency * 4) > 100000000 ) {
+ jack_error ( "autoconfig requests more than 100MB packet cache... bailing out" );
+ exit (1);
}
- }
- netj->capture_channels = netj->capture_channels_audio + netj->capture_channels_midi;
- netj->playback_channels = netj->playback_channels_audio + netj->playback_channels_midi;
-
- if( (netj->capture_channels * netj->period_size * netj->latency * 4) > 100000000 ) {
- jack_error( "autoconfig requests more than 100MB packet cache... bailing out" );
- exit(1);
- }
-
- if( netj->playback_channels > 1000 ) {
- jack_error( "autoconfig requests more than 1000 playback channels... bailing out" );
- exit(1);
- }
-
-
- if( netj->mtu < (2*sizeof( jacknet_packet_header )) ) {
- jack_error( "bullshit mtu requested by autoconfig" );
- exit(1);
- }
-
- if( netj->sample_rate == 0 ) {
- jack_error( "sample_rate 0 requested by autoconfig" );
- exit(1);
- }
-
- // After possible Autoconfig: do all calculations...
- netj->period_usecs =
- (jack_time_t) floor ((((float) netj->period_size) / (float)netj->sample_rate)
- * 1000000.0f);
-
- if( netj->latency == 0 )
- netj->deadline_offset = 50*netj->period_usecs;
- else
- netj->deadline_offset = netj->period_usecs + 10*netj->latency*netj->period_usecs/100;
-
- if( netj->bitdepth == CELT_MODE ) {
- // celt mode.
- // TODO: this is a hack. But i dont want to change the packet header.
- netj->resample_factor = (netj->resample_factor * netj->period_size * 1024 / netj->sample_rate / 8)&(~1);
- netj->resample_factor_up = (netj->resample_factor_up * netj->period_size * 1024 / netj->sample_rate / 8)&(~1);
-
- netj->net_period_down = netj->resample_factor;
- netj->net_period_up = netj->resample_factor_up;
- } else {
- netj->net_period_down = (float) netj->period_size / (float) netj->resample_factor;
- netj->net_period_up = (float) netj->period_size / (float) netj->resample_factor_up;
- }
-
- netj->rx_bufsize = sizeof (jacknet_packet_header) + netj->net_period_down * netj->capture_channels * get_sample_size (netj->bitdepth);
- netj->packcache = packet_cache_new (netj->latency + 50, netj->rx_bufsize, netj->mtu);
-
- netj->expected_framecnt_valid = 0;
- netj->num_lost_packets = 0;
- netj->next_deadline_valid = 0;
- netj->deadline_goodness = 0;
- netj->time_to_deadline = 0;
-
- // Special handling for latency=0
- if( netj->latency == 0 )
- netj->resync_threshold = 0;
- else
- netj->resync_threshold = MIN( 15, netj->latency-1 );
-
- netj->running_free = 0;
-
- return 0;
+
+ if ( netj->playback_channels > 1000 ) {
+ jack_error ( "autoconfig requests more than 1000 playback channels... bailing out" );
+ exit (1);
+ }
+
+
+ if ( netj->mtu < (2 * sizeof( jacknet_packet_header )) ) {
+ jack_error ( "bullshit mtu requested by autoconfig" );
+ exit (1);
+ }
+
+ if ( netj->sample_rate == 0 ) {
+ jack_error ( "sample_rate 0 requested by autoconfig" );
+ exit (1);
+ }
+
+ // After possible Autoconfig: do all calculations...
+ netj->period_usecs =
+ (jack_time_t)floor ((((float)netj->period_size) / (float)netj->sample_rate)
+ * 1000000.0f);
+
+ if ( netj->latency == 0 ) {
+ netj->deadline_offset = 50 * netj->period_usecs;
+ } else {
+ netj->deadline_offset = netj->period_usecs + 10 * netj->latency * netj->period_usecs / 100;
+ }
+
+ if ( netj->bitdepth == CELT_MODE ) {
+ // celt mode.
+ // TODO: this is a hack. But i dont want to change the packet header.
+ netj->resample_factor = (netj->resample_factor * netj->period_size * 1024 / netj->sample_rate / 8) & (~1);
+ netj->resample_factor_up = (netj->resample_factor_up * netj->period_size * 1024 / netj->sample_rate / 8) & (~1);
+
+ netj->net_period_down = netj->resample_factor;
+ netj->net_period_up = netj->resample_factor_up;
+ } else {
+ netj->net_period_down = (float)netj->period_size / (float)netj->resample_factor;
+ netj->net_period_up = (float)netj->period_size / (float)netj->resample_factor_up;
+ }
+
+ netj->rx_bufsize = sizeof(jacknet_packet_header) + netj->net_period_down * netj->capture_channels * get_sample_size(netj->bitdepth);
+ netj->packcache = packet_cache_new (netj->latency + 50, netj->rx_bufsize, netj->mtu);
+
+ netj->expected_framecnt_valid = 0;
+ netj->num_lost_packets = 0;
+ netj->next_deadline_valid = 0;
+ netj->deadline_goodness = 0;
+ netj->time_to_deadline = 0;
+
+ // Special handling for latency=0
+ if ( netj->latency == 0 ) {
+ netj->resync_threshold = 0;
+ } else {
+ netj->resync_threshold = MIN ( 15, netj->latency - 1 );
+ }
+
+ netj->running_free = 0;
+
+ return 0;
}
diff --git a/drivers/netjack/netjack.h b/drivers/netjack/netjack.h
index 3ca6c62..f6aa365 100644
--- a/drivers/netjack/netjack.h
+++ b/drivers/netjack/netjack.h
@@ -16,7 +16,7 @@
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 __NETJACK_H__
#define __NETJACK_H__
@@ -45,105 +45,105 @@ struct _packet_cache;
typedef struct _netjack_driver_state netjack_driver_state_t;
struct _netjack_driver_state {
- jack_nframes_t net_period_up;
- jack_nframes_t net_period_down;
+ jack_nframes_t net_period_up;
+ jack_nframes_t net_period_down;
- jack_nframes_t sample_rate;
- jack_nframes_t bitdepth;
- jack_nframes_t period_size;
- jack_time_t period_usecs;
- int dont_htonl_floats;
- int always_deadline;
+ jack_nframes_t sample_rate;
+ jack_nframes_t bitdepth;
+ jack_nframes_t period_size;
+ jack_time_t period_usecs;
+ int dont_htonl_floats;
+ int always_deadline;
- jack_nframes_t codec_latency;
+ jack_nframes_t codec_latency;
- unsigned int listen_port;
+ unsigned int listen_port;
- unsigned int capture_channels;
- unsigned int playback_channels;
- unsigned int capture_channels_audio;
- unsigned int playback_channels_audio;
- unsigned int capture_channels_midi;
- unsigned int playback_channels_midi;
+ unsigned int capture_channels;
+ unsigned int playback_channels;
+ unsigned int capture_channels_audio;
+ unsigned int playback_channels_audio;
+ unsigned int capture_channels_midi;
+ unsigned int playback_channels_midi;
- JSList *capture_ports;
- JSList *playback_ports;
- JSList *playback_srcs;
- JSList *capture_srcs;
+ JSList *capture_ports;
+ JSList *playback_ports;
+ JSList *playback_srcs;
+ JSList *capture_srcs;
- jack_client_t *client;
+ jack_client_t *client;
#ifdef WIN32
- SOCKET sockfd;
- SOCKET outsockfd;
+ SOCKET sockfd;
+ SOCKET outsockfd;
#else
- int sockfd;
- int outsockfd;
+ int sockfd;
+ int outsockfd;
#endif
- struct sockaddr_in syncsource_address;
-
- int reply_port;
- int srcaddress_valid;
-
- int sync_state;
- unsigned int handle_transport_sync;
-
- unsigned int *rx_buf;
- unsigned int rx_bufsize;
- //unsigned int tx_bufsize;
- unsigned int mtu;
- unsigned int latency;
- unsigned int redundancy;
-
- jack_nframes_t expected_framecnt;
- int expected_framecnt_valid;
- unsigned int num_lost_packets;
- jack_time_t next_deadline;
- jack_time_t deadline_offset;
- int next_deadline_valid;
- int packet_data_valid;
- int resync_threshold;
- int running_free;
- int deadline_goodness;
- jack_time_t time_to_deadline;
- unsigned int use_autoconfig;
- unsigned int resample_factor;
- unsigned int resample_factor_up;
- int jitter_val;
- struct _packet_cache * packcache;
+ struct sockaddr_in syncsource_address;
+
+ int reply_port;
+ int srcaddress_valid;
+
+ int sync_state;
+ unsigned int handle_transport_sync;
+
+ unsigned int *rx_buf;
+ unsigned int rx_bufsize;
+ //unsigned int tx_bufsize;
+ unsigned int mtu;
+ unsigned int latency;
+ unsigned int redundancy;
+
+ jack_nframes_t expected_framecnt;
+ int expected_framecnt_valid;
+ unsigned int num_lost_packets;
+ jack_time_t next_deadline;
+ jack_time_t deadline_offset;
+ int next_deadline_valid;
+ int packet_data_valid;
+ int resync_threshold;
+ int running_free;
+ int deadline_goodness;
+ jack_time_t time_to_deadline;
+ unsigned int use_autoconfig;
+ unsigned int resample_factor;
+ unsigned int resample_factor_up;
+ int jitter_val;
+ struct _packet_cache * packcache;
#if HAVE_CELT
- CELTMode *celt_mode;
+ CELTMode *celt_mode;
#endif
};
-int netjack_wait( netjack_driver_state_t *netj, jack_time_t (*get_microseconds)(void) );
+int netjack_wait ( netjack_driver_state_t * netj, jack_time_t (*get_microseconds)(void) );
void netjack_send_silence( netjack_driver_state_t *netj, int syncstate );
-void netjack_read( netjack_driver_state_t *netj, jack_nframes_t nframes ) ;
+void netjack_read( netjack_driver_state_t *netj, jack_nframes_t nframes );
void netjack_write( netjack_driver_state_t *netj, jack_nframes_t nframes, int syncstate );
void netjack_attach( netjack_driver_state_t *netj );
void netjack_detach( netjack_driver_state_t *netj );
-netjack_driver_state_t *netjack_init (netjack_driver_state_t *netj,
- jack_client_t * client,
- const char *name,
- unsigned int capture_ports,
- unsigned int playback_ports,
- unsigned int capture_ports_midi,
- unsigned int playback_ports_midi,
- jack_nframes_t sample_rate,
- jack_nframes_t period_size,
- unsigned int listen_port,
- unsigned int transport_sync,
- unsigned int resample_factor,
- unsigned int resample_factor_up,
- unsigned int bitdepth,
- unsigned int use_autoconfig,
- unsigned int latency,
- unsigned int redundancy,
- int dont_htonl_floats,
- int always_deadline,
- int jitter_val );
+netjack_driver_state_t *netjack_init(netjack_driver_state_t *netj,
+ jack_client_t * client,
+ const char *name,
+ unsigned int capture_ports,
+ unsigned int playback_ports,
+ unsigned int capture_ports_midi,
+ unsigned int playback_ports_midi,
+ jack_nframes_t sample_rate,
+ jack_nframes_t period_size,
+ unsigned int listen_port,
+ unsigned int transport_sync,
+ unsigned int resample_factor,
+ unsigned int resample_factor_up,
+ unsigned int bitdepth,
+ unsigned int use_autoconfig,
+ unsigned int latency,
+ unsigned int redundancy,
+ int dont_htonl_floats,
+ int always_deadline,
+ int jitter_val );
void netjack_release( netjack_driver_state_t *netj );
int netjack_startup( netjack_driver_state_t *netj );
diff --git a/drivers/netjack/netjack_packet.c b/drivers/netjack/netjack_packet.c
index 35b2520..dd541c3 100644
--- a/drivers/netjack/netjack_packet.c
+++ b/drivers/netjack/netjack_packet.c
@@ -85,62 +85,65 @@ int fraggo = 0;
void
packet_header_hton (jacknet_packet_header *pkthdr)
{
- pkthdr->capture_channels_audio = htonl(pkthdr->capture_channels_audio);
- pkthdr->playback_channels_audio = htonl(pkthdr->playback_channels_audio);
- pkthdr->capture_channels_midi = htonl(pkthdr->capture_channels_midi);
- pkthdr->playback_channels_midi = htonl(pkthdr->playback_channels_midi);
- pkthdr->period_size = htonl(pkthdr->period_size);
- pkthdr->sample_rate = htonl(pkthdr->sample_rate);
- pkthdr->sync_state = htonl(pkthdr->sync_state);
- pkthdr->transport_frame = htonl(pkthdr->transport_frame);
- pkthdr->transport_state = htonl(pkthdr->transport_state);
- pkthdr->framecnt = htonl(pkthdr->framecnt);
- pkthdr->latency = htonl(pkthdr->latency);
- pkthdr->reply_port = htonl(pkthdr->reply_port);
- pkthdr->mtu = htonl(pkthdr->mtu);
- pkthdr->fragment_nr = htonl(pkthdr->fragment_nr);
+ pkthdr->capture_channels_audio = htonl (pkthdr->capture_channels_audio);
+ pkthdr->playback_channels_audio = htonl (pkthdr->playback_channels_audio);
+ pkthdr->capture_channels_midi = htonl (pkthdr->capture_channels_midi);
+ pkthdr->playback_channels_midi = htonl (pkthdr->playback_channels_midi);
+ pkthdr->period_size = htonl (pkthdr->period_size);
+ pkthdr->sample_rate = htonl (pkthdr->sample_rate);
+ pkthdr->sync_state = htonl (pkthdr->sync_state);
+ pkthdr->transport_frame = htonl (pkthdr->transport_frame);
+ pkthdr->transport_state = htonl (pkthdr->transport_state);
+ pkthdr->framecnt = htonl (pkthdr->framecnt);
+ pkthdr->latency = htonl (pkthdr->latency);
+ pkthdr->reply_port = htonl (pkthdr->reply_port);
+ pkthdr->mtu = htonl (pkthdr->mtu);
+ pkthdr->fragment_nr = htonl (pkthdr->fragment_nr);
}
void
packet_header_ntoh (jacknet_packet_header *pkthdr)
{
- pkthdr->capture_channels_audio = ntohl(pkthdr->capture_channels_audio);
- pkthdr->playback_channels_audio = ntohl(pkthdr->playback_channels_audio);
- pkthdr->capture_channels_midi = ntohl(pkthdr->capture_channels_midi);
- pkthdr->playback_channels_midi = ntohl(pkthdr->playback_channels_midi);
- pkthdr->period_size = ntohl(pkthdr->period_size);
- pkthdr->sample_rate = ntohl(pkthdr->sample_rate);
- pkthdr->sync_state = ntohl(pkthdr->sync_state);
- pkthdr->transport_frame = ntohl(pkthdr->transport_frame);
- pkthdr->transport_state = ntohl(pkthdr->transport_state);
- pkthdr->framecnt = ntohl(pkthdr->framecnt);
- pkthdr->latency = ntohl(pkthdr->latency);
- pkthdr->reply_port = ntohl(pkthdr->reply_port);
- pkthdr->mtu = ntohl(pkthdr->mtu);
- pkthdr->fragment_nr = ntohl(pkthdr->fragment_nr);
+ pkthdr->capture_channels_audio = ntohl (pkthdr->capture_channels_audio);
+ pkthdr->playback_channels_audio = ntohl (pkthdr->playback_channels_audio);
+ pkthdr->capture_channels_midi = ntohl (pkthdr->capture_channels_midi);
+ pkthdr->playback_channels_midi = ntohl (pkthdr->playback_channels_midi);
+ pkthdr->period_size = ntohl (pkthdr->period_size);
+ pkthdr->sample_rate = ntohl (pkthdr->sample_rate);
+ pkthdr->sync_state = ntohl (pkthdr->sync_state);
+ pkthdr->transport_frame = ntohl (pkthdr->transport_frame);
+ pkthdr->transport_state = ntohl (pkthdr->transport_state);
+ pkthdr->framecnt = ntohl (pkthdr->framecnt);
+ pkthdr->latency = ntohl (pkthdr->latency);
+ pkthdr->reply_port = ntohl (pkthdr->reply_port);
+ pkthdr->mtu = ntohl (pkthdr->mtu);
+ pkthdr->fragment_nr = ntohl (pkthdr->fragment_nr);
}
int get_sample_size (int bitdepth)
{
- if (bitdepth == 8)
- return sizeof (int8_t);
- if (bitdepth == 16)
- return sizeof (int16_t);
- //JN: why? is this for buffer sizes before or after encoding?
- //JN: if the former, why not int16_t, if the latter, shouldn't it depend on -c N?
- if( bitdepth == CELT_MODE )
- return sizeof( unsigned char );
- return sizeof (int32_t);
+ if (bitdepth == 8) {
+ return sizeof(int8_t);
+ }
+ if (bitdepth == 16) {
+ return sizeof(int16_t);
+ }
+ //JN: why? is this for buffer sizes before or after encoding?
+ //JN: if the former, why not int16_t, if the latter, shouldn't it depend on -c N?
+ if ( bitdepth == CELT_MODE ) {
+ return sizeof( unsigned char );
+ }
+ return sizeof(int32_t);
}
-int jack_port_is_audio(const char *porttype)
+int jack_port_is_audio (const char *porttype)
{
- return (strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0);
+ return strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size ()) == 0;
}
-int jack_port_is_midi(const char *porttype)
+int jack_port_is_midi (const char *porttype)
{
- return (strncmp (porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0);
+ return strncmp (porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size ()) == 0;
}
@@ -149,101 +152,97 @@ int jack_port_is_midi(const char *porttype)
packet_cache
*packet_cache_new (int num_packets, int pkt_size, int mtu)
{
- int fragment_payload_size = mtu - sizeof (jacknet_packet_header);
- int i, fragment_number;
-
- if( pkt_size == sizeof(jacknet_packet_header) )
- fragment_number = 1;
- else
- fragment_number = (pkt_size - sizeof (jacknet_packet_header) - 1) / fragment_payload_size + 1;
-
- packet_cache *pcache = malloc (sizeof (packet_cache));
- if (pcache == NULL)
- {
- jack_error ("could not allocate packet cache (1)");
- return NULL;
- }
-
- pcache->size = num_packets;
- pcache->packets = malloc (sizeof (cache_packet) * num_packets);
- pcache->master_address_valid = 0;
- pcache->last_framecnt_retreived = 0;
- pcache->last_framecnt_retreived_valid = 0;
-
- if (pcache->packets == NULL)
- {
- jack_error ("could not allocate packet cache (2)");
- return NULL;
- }
-
- for (i = 0; i < num_packets; i++)
- {
- pcache->packets[i].valid = 0;
- pcache->packets[i].num_fragments = fragment_number;
- pcache->packets[i].packet_size = pkt_size;
- pcache->packets[i].mtu = mtu;
- pcache->packets[i].framecnt = 0;
- pcache->packets[i].fragment_array = malloc (sizeof (char) * fragment_number);
- pcache->packets[i].packet_buf = malloc (pkt_size);
- if ((pcache->packets[i].fragment_array == NULL) || (pcache->packets[i].packet_buf == NULL))
- {
- jack_error ("could not allocate packet cache (3)");
- return NULL;
- }
- }
- pcache->mtu = mtu;
-
- return pcache;
+ int fragment_payload_size = mtu - sizeof(jacknet_packet_header);
+ int i, fragment_number;
+
+ if ( pkt_size == sizeof(jacknet_packet_header) ) {
+ fragment_number = 1;
+ } else {
+ fragment_number = (pkt_size - sizeof(jacknet_packet_header) - 1) / fragment_payload_size + 1;
+ }
+
+ packet_cache *pcache = malloc (sizeof(packet_cache));
+ if (pcache == NULL) {
+ jack_error ("could not allocate packet cache (1)");
+ return NULL;
+ }
+
+ pcache->size = num_packets;
+ pcache->packets = malloc (sizeof(cache_packet) * num_packets);
+ pcache->master_address_valid = 0;
+ pcache->last_framecnt_retreived = 0;
+ pcache->last_framecnt_retreived_valid = 0;
+
+ if (pcache->packets == NULL) {
+ jack_error ("could not allocate packet cache (2)");
+ return NULL;
+ }
+
+ for (i = 0; i < num_packets; i++) {
+ pcache->packets[i].valid = 0;
+ pcache->packets[i].num_fragments = fragment_number;
+ pcache->packets[i].packet_size = pkt_size;
+ pcache->packets[i].mtu = mtu;
+ pcache->packets[i].framecnt = 0;
+ pcache->packets[i].fragment_array = malloc (sizeof(char) * fragment_number);
+ pcache->packets[i].packet_buf = malloc (pkt_size);
+ if ((pcache->packets[i].fragment_array == NULL) || (pcache->packets[i].packet_buf == NULL)) {
+ jack_error ("could not allocate packet cache (3)");
+ return NULL;
+ }
+ }
+ pcache->mtu = mtu;
+
+ return pcache;
}
void
packet_cache_free (packet_cache *pcache)
{
- int i;
- if( pcache == NULL )
- return;
-
- for (i = 0; i < pcache->size; i++)
- {
- free (pcache->packets[i].fragment_array);
- free (pcache->packets[i].packet_buf);
- }
-
- free (pcache->packets);
- free (pcache);
+ int i;
+
+ if ( pcache == NULL ) {
+ return;
+ }
+
+ for (i = 0; i < pcache->size; i++) {
+ free (pcache->packets[i].fragment_array);
+ free (pcache->packets[i].packet_buf);
+ }
+
+ free (pcache->packets);
+ free (pcache);
}
cache_packet
*packet_cache_get_packet (packet_cache *pcache, jack_nframes_t framecnt)
{
- int i;
- cache_packet *retval;
-
- for (i = 0; i < pcache->size; i++)
- {
- if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt))
- return &(pcache->packets[i]);
- }
-
- // The Packet is not in the packet cache.
- // find a free packet.
-
- retval = packet_cache_get_free_packet (pcache);
- if (retval != NULL)
- {
- cache_packet_set_framecnt (retval, framecnt);
- return retval;
- }
-
- // No Free Packet available
- // Get The Oldest packet and reset it.
-
- retval = packet_cache_get_oldest_packet (pcache);
- //printf( "Dropping %d from Cache :S\n", retval->framecnt );
- cache_packet_reset (retval);
- cache_packet_set_framecnt (retval, framecnt);
-
- return retval;
+ int i;
+ cache_packet *retval;
+
+ for (i = 0; i < pcache->size; i++)
+ if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt)) {
+ return &(pcache->packets[i]);
+ }
+
+ // The Packet is not in the packet cache.
+ // find a free packet.
+
+ retval = packet_cache_get_free_packet (pcache);
+ if (retval != NULL) {
+ cache_packet_set_framecnt (retval, framecnt);
+ return retval;
+ }
+
+ // No Free Packet available
+ // Get The Oldest packet and reset it.
+
+ retval = packet_cache_get_oldest_packet (pcache);
+ //printf( "Dropping %d from Cache :S\n", retval->framecnt );
+ cache_packet_reset (retval);
+ cache_packet_set_framecnt (retval, framecnt);
+
+ return retval;
}
// TODO: fix wrapping case... need to pass
@@ -254,109 +253,105 @@ cache_packet
cache_packet
*packet_cache_get_oldest_packet (packet_cache *pcache)
{
- jack_nframes_t minimal_frame = JACK_MAX_FRAMES;
- cache_packet *retval = &(pcache->packets[0]);
- int i;
-
- for (i = 0; i < pcache->size; i++)
- {
- if (pcache->packets[i].valid && (pcache->packets[i].framecnt < minimal_frame))
- {
- minimal_frame = pcache->packets[i].framecnt;
- retval = &(pcache->packets[i]);
- }
- }
-
- return retval;
+ jack_nframes_t minimal_frame = JACK_MAX_FRAMES;
+ cache_packet *retval = &(pcache->packets[0]);
+ int i;
+
+ for (i = 0; i < pcache->size; i++) {
+ if (pcache->packets[i].valid && (pcache->packets[i].framecnt < minimal_frame)) {
+ minimal_frame = pcache->packets[i].framecnt;
+ retval = &(pcache->packets[i]);
+ }
+ }
+
+ return retval;
}
cache_packet
*packet_cache_get_free_packet (packet_cache *pcache)
{
- int i;
+ int i;
- for (i = 0; i < pcache->size; i++)
- {
- if (pcache->packets[i].valid == 0)
- return &(pcache->packets[i]);
- }
+ for (i = 0; i < pcache->size; i++)
+ if (pcache->packets[i].valid == 0) {
+ return &(pcache->packets[i]);
+ }
- return NULL;
+ return NULL;
}
void
cache_packet_reset (cache_packet *pack)
{
- int i;
- pack->valid = 0;
+ int i;
+
+ pack->valid = 0;
- // XXX: i dont think this is necessary here...
- // fragement array is cleared in _set_framecnt()
+ // XXX: i dont think this is necessary here...
+ // fragement array is cleared in _set_framecnt()
- for (i = 0; i < pack->num_fragments; i++)
- pack->fragment_array[i] = 0;
+ for (i = 0; i < pack->num_fragments; i++)
+ pack->fragment_array[i] = 0;
}
void
cache_packet_set_framecnt (cache_packet *pack, jack_nframes_t framecnt)
{
- int i;
+ int i;
- pack->framecnt = framecnt;
+ pack->framecnt = framecnt;
- for (i = 0; i < pack->num_fragments; i++)
- pack->fragment_array[i] = 0;
+ for (i = 0; i < pack->num_fragments; i++)
+ pack->fragment_array[i] = 0;
- pack->valid = 1;
+ pack->valid = 1;
}
void
cache_packet_add_fragment (cache_packet *pack, char *packet_buf, int rcv_len)
{
- jacknet_packet_header *pkthdr = (jacknet_packet_header *) packet_buf;
- int fragment_payload_size = pack->mtu - sizeof (jacknet_packet_header);
- char *packet_bufX = pack->packet_buf + sizeof (jacknet_packet_header);
- char *dataX = packet_buf + sizeof (jacknet_packet_header);
-
- jack_nframes_t fragment_nr = ntohl (pkthdr->fragment_nr);
- jack_nframes_t framecnt = ntohl (pkthdr->framecnt);
-
- if (framecnt != pack->framecnt)
- {
- jack_error ("errror. framecnts dont match");
- return;
- }
-
-
- if (fragment_nr == 0)
- {
- memcpy (pack->packet_buf, packet_buf, rcv_len);
- pack->fragment_array[0] = 1;
-
- return;
- }
-
- if ((fragment_nr < pack->num_fragments) && (fragment_nr > 0))
- {
- if ((fragment_nr * fragment_payload_size + rcv_len - sizeof (jacknet_packet_header)) <= (pack->packet_size - sizeof (jacknet_packet_header)))
- {
- memcpy (packet_bufX + fragment_nr * fragment_payload_size, dataX, rcv_len - sizeof (jacknet_packet_header));
- pack->fragment_array[fragment_nr] = 1;
- }
- else
- jack_error ("too long packet received...");
- }
+ jacknet_packet_header *pkthdr = (jacknet_packet_header*)packet_buf;
+ int fragment_payload_size = pack->mtu - sizeof(jacknet_packet_header);
+ char *packet_bufX = pack->packet_buf + sizeof(jacknet_packet_header);
+ char *dataX = packet_buf + sizeof(jacknet_packet_header);
+
+ jack_nframes_t fragment_nr = ntohl (pkthdr->fragment_nr);
+ jack_nframes_t framecnt = ntohl (pkthdr->framecnt);
+
+ if (framecnt != pack->framecnt) {
+ jack_error ("errror. framecnts dont match");
+ return;
+ }
+
+
+ if (fragment_nr == 0) {
+ memcpy (pack->packet_buf, packet_buf, rcv_len);
+ pack->fragment_array[0] = 1;
+
+ return;
+ }
+
+ if ((fragment_nr < pack->num_fragments) && (fragment_nr > 0)) {
+ if ((fragment_nr * fragment_payload_size + rcv_len - sizeof(jacknet_packet_header)) <= (pack->packet_size - sizeof(jacknet_packet_header))) {
+ memcpy (packet_bufX + fragment_nr * fragment_payload_size, dataX, rcv_len - sizeof(jacknet_packet_header));
+ pack->fragment_array[fragment_nr] = 1;
+ } else {
+ jack_error ("too long packet received...");
+ }
+ }
}
int
cache_packet_is_complete (cache_packet *pack)
{
- int i;
- for (i = 0; i < pack->num_fragments; i++)
- if (pack->fragment_array[i] == 0)
- return 0;
+ int i;
- return 1;
+ for (i = 0; i < pack->num_fragments; i++)
+ if (pack->fragment_array[i] == 0) {
+ return 0;
+ }
+
+ return 1;
}
#ifndef WIN32
@@ -365,985 +360,941 @@ cache_packet_is_complete (cache_packet *pack)
int
netjack_poll_deadline (int sockfd, jack_time_t deadline, jack_time_t (*get_microseconds)(void))
{
- struct pollfd fds;
- int poll_err = 0;
+ struct pollfd fds;
+ int poll_err = 0;
+
#if HAVE_PPOLL
- struct timespec timeout_spec = { 0, 0 };
+ struct timespec timeout_spec = { 0, 0 };
#else
- int timeout;
+ int timeout;
#endif
- jack_time_t now = get_microseconds();
- if( now >= deadline )
- return 0;
+ jack_time_t now = get_microseconds ();
+ if ( now >= deadline ) {
+ return 0;
+ }
- if( (deadline-now) >= 1000000 ) {
- jack_error( "deadline more than 1 second in the future, trimming it." );
- deadline = now+500000;
- }
+ if ( (deadline - now) >= 1000000 ) {
+ jack_error ( "deadline more than 1 second in the future, trimming it." );
+ deadline = now + 500000;
+ }
#if HAVE_PPOLL
- timeout_spec.tv_nsec = (deadline - now) * 1000;
+ timeout_spec.tv_nsec = (deadline - now) * 1000;
#else
- timeout = lrintf( (float)(deadline - now) / 1000.0 );
+ timeout = lrintf ( (float)(deadline - now) / 1000.0 );
#endif
- fds.fd = sockfd;
- fds.events = POLLIN;
+ fds.fd = sockfd;
+ fds.events = POLLIN;
#if HAVE_PPOLL
- poll_err = ppoll (&fds, 1, &timeout_spec, NULL);
+ poll_err = ppoll (&fds, 1, &timeout_spec, NULL);
#else
- poll_err = poll (&fds, 1, timeout);
+ poll_err = poll (&fds, 1, timeout);
#endif
- if (poll_err == -1)
- {
- switch (errno)
- {
- case EBADF:
- jack_error ("Error %d: An invalid file descriptor was given in one of the sets", errno);
- break;
- case EFAULT:
- jack_error ("Error %d: The array given as argument was not contained in the calling program's address space", errno);
- break;
- case EINTR:
- jack_error ("Error %d: A signal occurred before any requested event", errno);
- break;
- case EINVAL:
- jack_error ("Error %d: The nfds value exceeds the RLIMIT_NOFILE value", errno);
- break;
- case ENOMEM:
- jack_error ("Error %d: There was no space to allocate file descriptor tables", errno);
- break;
- }
- }
- return poll_err;
+ if (poll_err == -1) {
+ switch (errno) {
+ case EBADF:
+ jack_error ("Error %d: An invalid file descriptor was given in one of the sets", errno);
+ break;
+ case EFAULT:
+ jack_error ("Error %d: The array given as argument was not contained in the calling program's address space", errno);
+ break;
+ case EINTR:
+ jack_error ("Error %d: A signal occurred before any requested event", errno);
+ break;
+ case EINVAL:
+ jack_error ("Error %d: The nfds value exceeds the RLIMIT_NOFILE value", errno);
+ break;
+ case ENOMEM:
+ jack_error ("Error %d: There was no space to allocate file descriptor tables", errno);
+ break;
+ }
+ }
+ return poll_err;
}
int
netjack_poll (int sockfd, int timeout)
{
- struct pollfd fds;
- int i, poll_err = 0;
- sigset_t sigmask, rsigmask;
- struct sigaction action;
-
- sigemptyset(&sigmask);
- sigaddset(&sigmask, SIGHUP);
- sigaddset(&sigmask, SIGINT);
- sigaddset(&sigmask, SIGQUIT);
- sigaddset(&sigmask, SIGPIPE);
- sigaddset(&sigmask, SIGTERM);
- sigaddset(&sigmask, SIGUSR1);
- sigaddset(&sigmask, SIGUSR2);
+ struct pollfd fds;
+ int i, poll_err = 0;
+ sigset_t sigmask, rsigmask;
+ struct sigaction action;
+
+ sigemptyset (&sigmask);
+ sigaddset (&sigmask, SIGHUP);
+ sigaddset (&sigmask, SIGINT);
+ sigaddset (&sigmask, SIGQUIT);
+ sigaddset (&sigmask, SIGPIPE);
+ sigaddset (&sigmask, SIGTERM);
+ sigaddset (&sigmask, SIGUSR1);
+ sigaddset (&sigmask, SIGUSR2);
action.sa_handler = SIG_DFL;
action.sa_mask = sigmask;
action.sa_flags = SA_RESTART;
- for (i = 1; i < NSIG; i++)
- if (sigismember (&sigmask, i))
- sigaction (i, &action, 0);
-
- fds.fd = sockfd;
- fds.events = POLLIN;
-
- sigprocmask(SIG_UNBLOCK, &sigmask, &rsigmask);
- while (poll_err == 0)
- {
- poll_err = poll (&fds, 1, timeout);
- }
- sigprocmask(SIG_SETMASK, &rsigmask, NULL);
-
- if (poll_err == -1)
- {
- switch (errno)
- {
- case EBADF:
- jack_error ("Error %d: An invalid file descriptor was given in one of the sets", errno);
- break;
- case EFAULT:
- jack_error ("Error %d: The array given as argument was not contained in the calling program's address space", errno);
- break;
- case EINTR:
- jack_error ("Error %d: A signal occurred before any requested event", errno);
- break;
- case EINVAL:
- jack_error ("Error %d: The nfds value exceeds the RLIMIT_NOFILE value", errno);
- break;
- case ENOMEM:
- jack_error ("Error %d: There was no space to allocate file descriptor tables", errno);
- break;
- }
- return 0;
- }
- return 1;
+ for (i = 1; i < NSIG; i++)
+ if (sigismember (&sigmask, i)) {
+ sigaction (i, &action, 0);
+ }
+
+ fds.fd = sockfd;
+ fds.events = POLLIN;
+
+ sigprocmask (SIG_UNBLOCK, &sigmask, &rsigmask);
+ while (poll_err == 0)
+ poll_err = poll (&fds, 1, timeout);
+ sigprocmask (SIG_SETMASK, &rsigmask, NULL);
+
+ if (poll_err == -1) {
+ switch (errno) {
+ case EBADF:
+ jack_error ("Error %d: An invalid file descriptor was given in one of the sets", errno);
+ break;
+ case EFAULT:
+ jack_error ("Error %d: The array given as argument was not contained in the calling program's address space", errno);
+ break;
+ case EINTR:
+ jack_error ("Error %d: A signal occurred before any requested event", errno);
+ break;
+ case EINVAL:
+ jack_error ("Error %d: The nfds value exceeds the RLIMIT_NOFILE value", errno);
+ break;
+ case ENOMEM:
+ jack_error ("Error %d: There was no space to allocate file descriptor tables", errno);
+ break;
+ }
+ return 0;
+ }
+ return 1;
}
#else
int
netjack_poll (int sockfd, int timeout)
{
- jack_error( "netjack_poll not implemented" );
- return 0;
+ jack_error ( "netjack_poll not implemented" );
+ return 0;
}
int
netjack_poll_deadline (int sockfd, jack_time_t deadline, jack_time_t (*get_microseconds)(void))
{
- fd_set fds;
- FD_ZERO( &fds );
- FD_SET( sockfd, &fds );
-
- struct timeval timeout;
- while( 1 ) {
- jack_time_t now = get_microseconds();
- if( now >= deadline )
- return 0;
-
- int timeout_usecs = (deadline - now);
- //jack_error( "timeout = %d", timeout_usecs );
- timeout.tv_sec = 0;
- timeout.tv_usec = (timeout_usecs < 500) ? 500 : timeout_usecs;
- timeout.tv_usec = (timeout_usecs > 1000000) ? 500000 : timeout_usecs;
-
- int poll_err = select (0, &fds, NULL, NULL, &timeout);
- if( poll_err != 0 )
- return poll_err;
- }
-
- return 0;
+ fd_set fds;
+
+ FD_ZERO ( &fds );
+ FD_SET ( sockfd, &fds );
+
+ struct timeval timeout;
+ while ( 1 ) {
+ jack_time_t now = get_microseconds ();
+ if ( now >= deadline ) {
+ return 0;
+ }
+
+ int timeout_usecs = (deadline - now);
+ //jack_error( "timeout = %d", timeout_usecs );
+ timeout.tv_sec = 0;
+ timeout.tv_usec = (timeout_usecs < 500) ? 500 : timeout_usecs;
+ timeout.tv_usec = (timeout_usecs > 1000000) ? 500000 : timeout_usecs;
+
+ int poll_err = select (0, &fds, NULL, NULL, &timeout);
+ if ( poll_err != 0 ) {
+ return poll_err;
+ }
+ }
+
+ return 0;
}
#endif
// This now reads all a socket has into the cache.
// replacing netjack_recv functions.
void
-packet_cache_drain_socket( packet_cache *pcache, int sockfd, jack_time_t (*get_microseconds)(void) )
+packet_cache_drain_socket ( packet_cache *pcache, int sockfd, jack_time_t (*get_microseconds)(void) )
{
- char *rx_packet = alloca (pcache->mtu);
- jacknet_packet_header *pkthdr = (jacknet_packet_header *) rx_packet;
- int rcv_len;
- jack_nframes_t framecnt;
- cache_packet *cpack;
- struct sockaddr_in sender_address;
+ char *rx_packet = alloca (pcache->mtu);
+ jacknet_packet_header *pkthdr = (jacknet_packet_header*)rx_packet;
+ int rcv_len;
+ jack_nframes_t framecnt;
+ cache_packet *cpack;
+ struct sockaddr_in sender_address;
+
#ifdef WIN32
- size_t senderlen = sizeof( struct sockaddr_in );
- u_long parm = 1;
- ioctlsocket( sockfd, FIONBIO, &parm );
+ size_t senderlen = sizeof( struct sockaddr_in );
+ u_long parm = 1;
+ ioctlsocket ( sockfd, FIONBIO, &parm );
#else
- socklen_t senderlen = sizeof( struct sockaddr_in );
+ socklen_t senderlen = sizeof( struct sockaddr_in );
#endif
- while (1)
- {
+ while (1) {
#ifdef WIN32
- rcv_len = recvfrom (sockfd, rx_packet, pcache->mtu, 0,
- (struct sockaddr*) &sender_address, &senderlen);
+ rcv_len = recvfrom (sockfd, rx_packet, pcache->mtu, 0,
+ (struct sockaddr*)&sender_address, &senderlen);
#else
- rcv_len = recvfrom (sockfd, rx_packet, pcache->mtu, MSG_DONTWAIT,
- (struct sockaddr*) &sender_address, &senderlen);
+ rcv_len = recvfrom (sockfd, rx_packet, pcache->mtu, MSG_DONTWAIT,
+ (struct sockaddr*)&sender_address, &senderlen);
#endif
- if (rcv_len < 0)
- return;
+ if (rcv_len < 0) {
+ return;
+ }
- if (pcache->master_address_valid) {
- // Verify its from our master.
- if (memcmp (&sender_address, &(pcache->master_address), senderlen) != 0)
- continue;
- } else {
- // Setup this one as master
- //printf( "setup master...\n" );
- memcpy ( &(pcache->master_address), &sender_address, senderlen );
- pcache->master_address_valid = 1;
- }
+ if (pcache->master_address_valid) {
+ // Verify its from our master.
+ if (memcmp (&sender_address, &(pcache->master_address), senderlen) != 0) {
+ continue;
+ }
+ } else {
+ // Setup this one as master
+ //printf( "setup master...\n" );
+ memcpy ( &(pcache->master_address), &sender_address, senderlen );
+ pcache->master_address_valid = 1;
+ }
- framecnt = ntohl (pkthdr->framecnt);
- if( pcache->last_framecnt_retreived_valid && (framecnt <= pcache->last_framecnt_retreived ))
- continue;
+ framecnt = ntohl (pkthdr->framecnt);
+ if ( pcache->last_framecnt_retreived_valid && (framecnt <= pcache->last_framecnt_retreived )) {
+ continue;
+ }
- cpack = packet_cache_get_packet (pcache, framecnt);
- cache_packet_add_fragment (cpack, rx_packet, rcv_len);
- cpack->recv_timestamp = get_microseconds();
- }
+ cpack = packet_cache_get_packet (pcache, framecnt);
+ cache_packet_add_fragment (cpack, rx_packet, rcv_len);
+ cpack->recv_timestamp = get_microseconds ();
+ }
}
void
-packet_cache_reset_master_address( packet_cache *pcache )
+packet_cache_reset_master_address ( packet_cache *pcache )
{
- pcache->master_address_valid = 0;
- pcache->last_framecnt_retreived = 0;
- pcache->last_framecnt_retreived_valid = 0;
+ pcache->master_address_valid = 0;
+ pcache->last_framecnt_retreived = 0;
+ pcache->last_framecnt_retreived_valid = 0;
}
void
packet_cache_clear_old_packets (packet_cache *pcache, jack_nframes_t framecnt )
{
- int i;
-
- for (i = 0; i < pcache->size; i++)
- {
- if (pcache->packets[i].valid && (pcache->packets[i].framecnt < framecnt))
- {
- cache_packet_reset (&(pcache->packets[i]));
- }
- }
+ int i;
+
+ for (i = 0; i < pcache->size; i++) {
+ if (pcache->packets[i].valid && (pcache->packets[i].framecnt < framecnt)) {
+ cache_packet_reset (&(pcache->packets[i]));
+ }
+ }
}
int
-packet_cache_retreive_packet_pointer( packet_cache *pcache, jack_nframes_t framecnt, char **packet_buf, int pkt_size, jack_time_t *timestamp )
+packet_cache_retreive_packet_pointer ( packet_cache *pcache, jack_nframes_t framecnt, char **packet_buf, int pkt_size, jack_time_t *timestamp )
{
- int i;
- cache_packet *cpack = NULL;
+ int i;
+ cache_packet *cpack = NULL;
- for (i = 0; i < pcache->size; i++) {
- if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt)) {
- cpack = &(pcache->packets[i]);
- break;
+ for (i = 0; i < pcache->size; i++) {
+ if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt)) {
+ cpack = &(pcache->packets[i]);
+ break;
+ }
}
- }
- if( cpack == NULL ) {
- //printf( "retreive packet: %d....not found\n", framecnt );
- return -1;
- }
+ if ( cpack == NULL ) {
+ //printf( "retreive packet: %d....not found\n", framecnt );
+ return -1;
+ }
- if( !cache_packet_is_complete( cpack ) ) {
- return -1;
- }
+ if ( !cache_packet_is_complete ( cpack ) ) {
+ return -1;
+ }
- // ok. cpack is the one we want and its complete.
- *packet_buf = cpack->packet_buf;
- if( timestamp )
- *timestamp = cpack->recv_timestamp;
+ // ok. cpack is the one we want and its complete.
+ *packet_buf = cpack->packet_buf;
+ if ( timestamp ) {
+ *timestamp = cpack->recv_timestamp;
+ }
- pcache->last_framecnt_retreived_valid = 1;
- pcache->last_framecnt_retreived = framecnt;
+ pcache->last_framecnt_retreived_valid = 1;
+ pcache->last_framecnt_retreived = framecnt;
- return pkt_size;
+ return pkt_size;
}
int
-packet_cache_release_packet( packet_cache *pcache, jack_nframes_t framecnt )
+packet_cache_release_packet ( packet_cache *pcache, jack_nframes_t framecnt )
{
- int i;
- cache_packet *cpack = NULL;
+ int i;
+ cache_packet *cpack = NULL;
- for (i = 0; i < pcache->size; i++) {
- if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt)) {
- cpack = &(pcache->packets[i]);
- break;
+ for (i = 0; i < pcache->size; i++) {
+ if (pcache->packets[i].valid && (pcache->packets[i].framecnt == framecnt)) {
+ cpack = &(pcache->packets[i]);
+ break;
+ }
}
- }
- if( cpack == NULL ) {
- //printf( "retreive packet: %d....not found\n", framecnt );
- return -1;
- }
+ if ( cpack == NULL ) {
+ //printf( "retreive packet: %d....not found\n", framecnt );
+ return -1;
+ }
- if( !cache_packet_is_complete( cpack ) ) {
- return -1;
- }
+ if ( !cache_packet_is_complete ( cpack ) ) {
+ return -1;
+ }
- cache_packet_reset (cpack);
- packet_cache_clear_old_packets( pcache, framecnt );
+ cache_packet_reset (cpack);
+ packet_cache_clear_old_packets ( pcache, framecnt );
- return 0;
+ return 0;
}
float
-packet_cache_get_fill( packet_cache *pcache, jack_nframes_t expected_framecnt )
+packet_cache_get_fill ( packet_cache *pcache, jack_nframes_t expected_framecnt )
{
- int num_packets_before_us = 0;
- int i;
-
- for (i = 0; i < pcache->size; i++)
- {
- cache_packet *cpack = &(pcache->packets[i]);
- if (cpack->valid && cache_packet_is_complete( cpack ))
- if( cpack->framecnt >= expected_framecnt )
- num_packets_before_us += 1;
- }
-
- return 100.0 * (float)num_packets_before_us / (float)( pcache->size ) ;
+ int num_packets_before_us = 0;
+ int i;
+
+ for (i = 0; i < pcache->size; i++) {
+ cache_packet *cpack = &(pcache->packets[i]);
+ if (cpack->valid && cache_packet_is_complete ( cpack )) {
+ if ( cpack->framecnt >= expected_framecnt ) {
+ num_packets_before_us += 1;
+ }
+ }
+ }
+
+ return 100.0 * (float)num_packets_before_us / (float)( pcache->size );
}
// Returns 0 when no valid packet is inside the cache.
int
-packet_cache_get_next_available_framecnt( packet_cache *pcache, jack_nframes_t expected_framecnt, jack_nframes_t *framecnt )
+packet_cache_get_next_available_framecnt ( packet_cache *pcache, jack_nframes_t expected_framecnt, jack_nframes_t *framecnt )
{
- int i;
- jack_nframes_t best_offset = JACK_MAX_FRAMES/2-1;
- int retval = 0;
-
- for (i = 0; i < pcache->size; i++)
- {
- cache_packet *cpack = &(pcache->packets[i]);
- //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
-
- if (!cpack->valid || !cache_packet_is_complete( cpack )) {
- //printf( "invalid\n" );
- continue;
- }
+ int i;
+ jack_nframes_t best_offset = JACK_MAX_FRAMES / 2 - 1;
+ int retval = 0;
- if( cpack->framecnt < expected_framecnt )
- continue;
+ for (i = 0; i < pcache->size; i++) {
+ cache_packet *cpack = &(pcache->packets[i]);
+ //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
- if( (cpack->framecnt - expected_framecnt) > best_offset ) {
- continue;
- }
+ if (!cpack->valid || !cache_packet_is_complete ( cpack )) {
+ //printf( "invalid\n" );
+ continue;
+ }
+
+ if ( cpack->framecnt < expected_framecnt ) {
+ continue;
+ }
- best_offset = cpack->framecnt - expected_framecnt;
- retval = 1;
+ if ( (cpack->framecnt - expected_framecnt) > best_offset ) {
+ continue;
+ }
- if( best_offset == 0 )
- break;
- }
- if( retval && framecnt )
- *framecnt = expected_framecnt + best_offset;
+ best_offset = cpack->framecnt - expected_framecnt;
+ retval = 1;
- return retval;
+ if ( best_offset == 0 ) {
+ break;
+ }
+ }
+ if ( retval && framecnt ) {
+ *framecnt = expected_framecnt + best_offset;
+ }
+
+ return retval;
}
int
-packet_cache_get_highest_available_framecnt( packet_cache *pcache, jack_nframes_t *framecnt )
+packet_cache_get_highest_available_framecnt ( packet_cache *pcache, jack_nframes_t *framecnt )
{
- int i;
- jack_nframes_t best_value = 0;
- int retval = 0;
-
- for (i = 0; i < pcache->size; i++)
- {
- cache_packet *cpack = &(pcache->packets[i]);
- //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
-
- if (!cpack->valid || !cache_packet_is_complete( cpack )) {
- //printf( "invalid\n" );
- continue;
- }
+ int i;
+ jack_nframes_t best_value = 0;
+ int retval = 0;
- if (cpack->framecnt < best_value) {
- continue;
- }
+ for (i = 0; i < pcache->size; i++) {
+ cache_packet *cpack = &(pcache->packets[i]);
+ //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
- best_value = cpack->framecnt;
- retval = 1;
+ if (!cpack->valid || !cache_packet_is_complete ( cpack )) {
+ //printf( "invalid\n" );
+ continue;
+ }
+
+ if (cpack->framecnt < best_value) {
+ continue;
+ }
- }
- if( retval && framecnt )
- *framecnt = best_value;
+ best_value = cpack->framecnt;
+ retval = 1;
+
+ }
+ if ( retval && framecnt ) {
+ *framecnt = best_value;
+ }
- return retval;
+ return retval;
}
// Returns 0 when no valid packet is inside the cache.
int
-packet_cache_find_latency( packet_cache *pcache, jack_nframes_t expected_framecnt, jack_nframes_t *framecnt )
+packet_cache_find_latency ( packet_cache *pcache, jack_nframes_t expected_framecnt, jack_nframes_t *framecnt )
{
- int i;
- jack_nframes_t best_offset = 0;
- int retval = 0;
-
- for (i = 0; i < pcache->size; i++)
- {
- cache_packet *cpack = &(pcache->packets[i]);
- //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
-
- if (!cpack->valid || !cache_packet_is_complete( cpack )) {
- //printf( "invalid\n" );
- continue;
- }
+ int i;
+ jack_nframes_t best_offset = 0;
+ int retval = 0;
- if( (cpack->framecnt - expected_framecnt) < best_offset ) {
- continue;
- }
+ for (i = 0; i < pcache->size; i++) {
+ cache_packet *cpack = &(pcache->packets[i]);
+ //printf( "p%d: valid=%d, frame %d\n", i, cpack->valid, cpack->framecnt );
+
+ if (!cpack->valid || !cache_packet_is_complete ( cpack )) {
+ //printf( "invalid\n" );
+ continue;
+ }
+
+ if ( (cpack->framecnt - expected_framecnt) < best_offset ) {
+ continue;
+ }
- best_offset = cpack->framecnt - expected_framecnt;
- retval = 1;
+ best_offset = cpack->framecnt - expected_framecnt;
+ retval = 1;
- if( best_offset == 0 )
- break;
- }
- if( retval && framecnt )
- *framecnt = JACK_MAX_FRAMES - best_offset;
+ if ( best_offset == 0 ) {
+ break;
+ }
+ }
+ if ( retval && framecnt ) {
+ *framecnt = JACK_MAX_FRAMES - best_offset;
+ }
- return retval;
+ return retval;
}
// fragmented packet IO
void
netjack_sendto (int sockfd, char *packet_buf, int pkt_size, int flags, struct sockaddr *addr, int addr_size, int mtu)
{
- int frag_cnt = 0;
- char *tx_packet, *dataX;
- jacknet_packet_header *pkthdr;
-
- tx_packet = alloca (mtu + 10);
- dataX = tx_packet + sizeof (jacknet_packet_header);
- pkthdr = (jacknet_packet_header *) tx_packet;
-
- int fragment_payload_size = mtu - sizeof (jacknet_packet_header);
-
- if (pkt_size <= mtu) {
- int err;
- pkthdr = (jacknet_packet_header *) packet_buf;
- pkthdr->fragment_nr = htonl (0);
- err = sendto(sockfd, packet_buf, pkt_size, flags, addr, addr_size);
- if( err<0 ) {
- //printf( "error in send\n" );
- perror( "send" );
- }
- }
- else
- {
- int err;
- // Copy the packet header to the tx pack first.
- memcpy(tx_packet, packet_buf, sizeof (jacknet_packet_header));
-
- // Now loop and send all
- char *packet_bufX = packet_buf + sizeof (jacknet_packet_header);
-
- while (packet_bufX < (packet_buf + pkt_size - fragment_payload_size))
- {
- pkthdr->fragment_nr = htonl (frag_cnt++);
- memcpy (dataX, packet_bufX, fragment_payload_size);
- sendto (sockfd, tx_packet, mtu, flags, addr, addr_size);
- packet_bufX += fragment_payload_size;
- }
-
- int last_payload_size = packet_buf + pkt_size - packet_bufX;
- memcpy (dataX, packet_bufX, last_payload_size);
- pkthdr->fragment_nr = htonl (frag_cnt);
- //jack_log("last fragment_count = %d, payload_size = %d\n", fragment_count, last_payload_size);
-
- // sendto(last_pack_size);
- err = sendto(sockfd, tx_packet, last_payload_size + sizeof(jacknet_packet_header), flags, addr, addr_size);
- if( err<0 ) {
- //printf( "error in send\n" );
- perror( "send" );
+ int frag_cnt = 0;
+ char *tx_packet, *dataX;
+ jacknet_packet_header *pkthdr;
+
+ tx_packet = alloca (mtu + 10);
+ dataX = tx_packet + sizeof(jacknet_packet_header);
+ pkthdr = (jacknet_packet_header*)tx_packet;
+
+ int fragment_payload_size = mtu - sizeof(jacknet_packet_header);
+
+ if (pkt_size <= mtu) {
+ int err;
+ pkthdr = (jacknet_packet_header*)packet_buf;
+ pkthdr->fragment_nr = htonl (0);
+ err = sendto (sockfd, packet_buf, pkt_size, flags, addr, addr_size);
+ if ( err < 0 ) {
+ //printf( "error in send\n" );
+ perror ( "send" );
+ }
+ } else {
+ int err;
+ // Copy the packet header to the tx pack first.
+ memcpy (tx_packet, packet_buf, sizeof(jacknet_packet_header));
+
+ // Now loop and send all
+ char *packet_bufX = packet_buf + sizeof(jacknet_packet_header);
+
+ while (packet_bufX < (packet_buf + pkt_size - fragment_payload_size)) {
+ pkthdr->fragment_nr = htonl (frag_cnt++);
+ memcpy (dataX, packet_bufX, fragment_payload_size);
+ sendto (sockfd, tx_packet, mtu, flags, addr, addr_size);
+ packet_bufX += fragment_payload_size;
+ }
+
+ int last_payload_size = packet_buf + pkt_size - packet_bufX;
+ memcpy (dataX, packet_bufX, last_payload_size);
+ pkthdr->fragment_nr = htonl (frag_cnt);
+ //jack_log("last fragment_count = %d, payload_size = %d\n", fragment_count, last_payload_size);
+
+ // sendto(last_pack_size);
+ err = sendto (sockfd, tx_packet, last_payload_size + sizeof(jacknet_packet_header), flags, addr, addr_size);
+ if ( err < 0 ) {
+ //printf( "error in send\n" );
+ perror ( "send" );
+ }
}
- }
}
void
decode_midi_buffer (uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf)
{
- int i;
- jack_midi_clear_buffer (buf);
- for (i = 0; i < buffer_size_uint32 - 3;)
- {
- uint32_t payload_size;
- payload_size = buffer_uint32[i];
- payload_size = ntohl (payload_size);
- if (payload_size)
- {
- jack_midi_event_t event;
- event.time = ntohl (buffer_uint32[i+1]);
- event.size = ntohl (buffer_uint32[i+2]);
- event.buffer = (jack_midi_data_t*) (&(buffer_uint32[i+3]));
- jack_midi_event_write (buf, event.time, event.buffer, event.size);
-
- // skip to the next event
- unsigned int nb_data_quads = (((event.size-1) & ~0x3) >> 2)+1;
- i += 3+nb_data_quads;
- }
- else
- break; // no events can follow an empty event, we're done
- }
+ int i;
+
+ jack_midi_clear_buffer (buf);
+ for (i = 0; i < buffer_size_uint32 - 3; ) {
+ uint32_t payload_size;
+ payload_size = buffer_uint32[i];
+ payload_size = ntohl (payload_size);
+ if (payload_size) {
+ jack_midi_event_t event;
+ event.time = ntohl (buffer_uint32[i + 1]);
+ event.size = ntohl (buffer_uint32[i + 2]);
+ event.buffer = (jack_midi_data_t*)(&(buffer_uint32[i + 3]));
+ jack_midi_event_write (buf, event.time, event.buffer, event.size);
+
+ // skip to the next event
+ unsigned int nb_data_quads = (((event.size - 1) & ~0x3) >> 2) + 1;
+ i += 3 + nb_data_quads;
+ } else {
+ break; // no events can follow an empty event, we're done
+ }
+ }
}
void
encode_midi_buffer (uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf)
{
- int i;
- unsigned int written = 0;
- // midi port, encode midi events
- unsigned int nevents = jack_midi_get_event_count (buf);
- for (i = 0; i < nevents; ++i)
- {
- jack_midi_event_t event;
- jack_midi_event_get (&event, buf, i);
- unsigned int nb_data_quads = (((event.size - 1) & ~0x3) >> 2) + 1;
- unsigned int payload_size = 3 + nb_data_quads;
- // only write if we have sufficient space for the event
- // otherwise drop it
- if (written + payload_size < buffer_size_uint32 - 1)
- {
- // write header
- buffer_uint32[written]=htonl (payload_size);
- written++;
- buffer_uint32[written]=htonl (event.time);
- written++;
- buffer_uint32[written]=htonl (event.size);
- written++;
-
- // write data
- jack_midi_data_t* tmpbuff = (jack_midi_data_t*)(&(buffer_uint32[written]));
- memcpy (tmpbuff, event.buffer, event.size);
- written += nb_data_quads;
- }
- else
- {
- // buffer overflow
- jack_error ("midi buffer overflow");
- break;
- }
- }
- // now put a netjack_midi 'no-payload' event, signaling EOF
- buffer_uint32[written]=0;
+ int i;
+ unsigned int written = 0;
+ // midi port, encode midi events
+ unsigned int nevents = jack_midi_get_event_count (buf);
+
+ for (i = 0; i < nevents; ++i) {
+ jack_midi_event_t event;
+ jack_midi_event_get (&event, buf, i);
+ unsigned int nb_data_quads = (((event.size - 1) & ~0x3) >> 2) + 1;
+ unsigned int payload_size = 3 + nb_data_quads;
+ // only write if we have sufficient space for the event
+ // otherwise drop it
+ if (written + payload_size < buffer_size_uint32 - 1) {
+ // write header
+ buffer_uint32[written] = htonl (payload_size);
+ written++;
+ buffer_uint32[written] = htonl (event.time);
+ written++;
+ buffer_uint32[written] = htonl (event.size);
+ written++;
+
+ // write data
+ jack_midi_data_t* tmpbuff = (jack_midi_data_t*)(&(buffer_uint32[written]));
+ memcpy (tmpbuff, event.buffer, event.size);
+ written += nb_data_quads;
+ } else {
+ // buffer overflow
+ jack_error ("midi buffer overflow");
+ break;
+ }
+ }
+ // now put a netjack_midi 'no-payload' event, signaling EOF
+ buffer_uint32[written] = 0;
}
// render functions for float
void
render_payload_to_jack_ports_float ( void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes, int dont_htonl_floats)
{
- int chn = 0;
- JSList *node = capture_ports;
+ int chn = 0;
+ JSList *node = capture_ports;
+
#if HAVE_SAMPLERATE
- JSList *src_node = capture_srcs;
+ JSList *src_node = capture_srcs;
#endif
- uint32_t *packet_bufX = (uint32_t *)packet_payload;
+ uint32_t *packet_bufX = (uint32_t*)packet_payload;
- if( !packet_payload )
- return;
+ if ( !packet_payload ) {
+ return;
+ }
- while (node != NULL)
- {
- int i;
- int_float_t val;
+ while (node != NULL) {
+ int i;
+ int_float_t val;
#if HAVE_SAMPLERATE
- SRC_DATA src;
+ SRC_DATA src;
#endif
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
- const char *porttype = jack_port_type (port);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio (porttype))
- {
+ if (jack_port_is_audio (porttype)) {
#if HAVE_SAMPLERATE
- // audio port, resample if necessary
- if (net_period_down != nframes)
- {
- SRC_STATE *src_state = src_node->data;
- for (i = 0; i < net_period_down; i++)
- {
- packet_bufX[i] = ntohl (packet_bufX[i]);
- }
-
- src.data_in = (float *) packet_bufX;
- src.input_frames = net_period_down;
-
- src.data_out = buf;
- src.output_frames = nframes;
-
- src.src_ratio = (float) nframes / (float) net_period_down;
- src.end_of_input = 0;
-
- src_set_ratio (src_state, src.src_ratio);
- src_process (src_state, &src);
- src_node = jack_slist_next (src_node);
- }
- else
+ // audio port, resample if necessary
+ if (net_period_down != nframes) {
+ SRC_STATE *src_state = src_node->data;
+ for (i = 0; i < net_period_down; i++)
+ packet_bufX[i] = ntohl (packet_bufX[i]);
+
+ src.data_in = (float*)packet_bufX;
+ src.input_frames = net_period_down;
+
+ src.data_out = buf;
+ src.output_frames = nframes;
+
+ src.src_ratio = (float)nframes / (float)net_period_down;
+ src.end_of_input = 0;
+
+ src_set_ratio (src_state, src.src_ratio);
+ src_process (src_state, &src);
+ src_node = jack_slist_next (src_node);
+ } else
#endif
- {
- if( dont_htonl_floats )
- {
- memcpy( buf, packet_bufX, net_period_down*sizeof(jack_default_audio_sample_t));
- }
- else
- {
- for (i = 0; i < net_period_down; i++)
- {
- val.i = packet_bufX[i];
- val.i = ntohl (val.i);
- buf[i] = val.f;
- }
+ {
+ if ( dont_htonl_floats ) {
+ memcpy ( buf, packet_bufX, net_period_down * sizeof(jack_default_audio_sample_t));
+ } else {
+ for (i = 0; i < net_period_down; i++) {
+ val.i = packet_bufX[i];
+ val.i = ntohl (val.i);
+ buf[i] = val.f;
+ }
+ }
+ }
+ } else if (jack_port_is_midi (porttype)) {
+ // midi port, decode midi events
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_down;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
}
- }
- }
- else if (jack_port_is_midi (porttype))
- {
- // midi port, decode midi events
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_down;
- uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
- decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_down);
- node = jack_slist_next (node);
- chn++;
- }
+ packet_bufX = (packet_bufX + net_period_down);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
void
render_jack_ports_to_payload_float (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up, int dont_htonl_floats )
{
- int chn = 0;
- JSList *node = playback_ports;
+ int chn = 0;
+ JSList *node = playback_ports;
+
#if HAVE_SAMPLERATE
- JSList *src_node = playback_srcs;
+ JSList *src_node = playback_srcs;
#endif
- uint32_t *packet_bufX = (uint32_t *) packet_payload;
+ uint32_t *packet_bufX = (uint32_t*)packet_payload;
- while (node != NULL)
- {
+ while (node != NULL) {
#if HAVE_SAMPLERATE
- SRC_DATA src;
+ SRC_DATA src;
#endif
- int i;
- int_float_t val;
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ int i;
+ int_float_t val;
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
- const char *porttype = jack_port_type (port);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio (porttype))
- {
- // audio port, resample if necessary
+ if (jack_port_is_audio (porttype)) {
+ // audio port, resample if necessary
#if HAVE_SAMPLERATE
- if (net_period_up != nframes) {
- SRC_STATE *src_state = src_node->data;
- src.data_in = buf;
- src.input_frames = nframes;
-
- src.data_out = (float *) packet_bufX;
- src.output_frames = net_period_up;
-
- src.src_ratio = (float) net_period_up / (float) nframes;
- src.end_of_input = 0;
-
- src_set_ratio (src_state, src.src_ratio);
- src_process (src_state, &src);
-
- for (i = 0; i < net_period_up; i++)
- {
- packet_bufX[i] = htonl (packet_bufX[i]);
- }
- src_node = jack_slist_next (src_node);
- }
- else
+ if (net_period_up != nframes) {
+ SRC_STATE *src_state = src_node->data;
+ src.data_in = buf;
+ src.input_frames = nframes;
+
+ src.data_out = (float*)packet_bufX;
+ src.output_frames = net_period_up;
+
+ src.src_ratio = (float)net_period_up / (float)nframes;
+ src.end_of_input = 0;
+
+ src_set_ratio (src_state, src.src_ratio);
+ src_process (src_state, &src);
+
+ for (i = 0; i < net_period_up; i++)
+ packet_bufX[i] = htonl (packet_bufX[i]);
+ src_node = jack_slist_next (src_node);
+ } else
#endif
- {
- if( dont_htonl_floats )
- {
- memcpy( packet_bufX, buf, net_period_up*sizeof(jack_default_audio_sample_t) );
+ {
+ if ( dont_htonl_floats ) {
+ memcpy ( packet_bufX, buf, net_period_up * sizeof(jack_default_audio_sample_t) );
+ } else {
+ for (i = 0; i < net_period_up; i++) {
+ val.f = buf[i];
+ val.i = htonl (val.i);
+ packet_bufX[i] = val.i;
+ }
+ }
+ }
+ } else if (jack_port_is_midi (porttype)) {
+ // encode midi events from port to packet
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_up;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
}
- else
- {
- for (i = 0; i < net_period_up; i++)
- {
- val.f = buf[i];
- val.i = htonl (val.i);
- packet_bufX[i] = val.i;
- }
- }
- }
- }
- else if (jack_port_is_midi (porttype))
- {
- // encode midi events from port to packet
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_up;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_up);
- node = jack_slist_next (node);
- chn++;
- }
+ packet_bufX = (packet_bufX + net_period_up);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
// render functions for 16bit
void
render_payload_to_jack_ports_16bit (void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
{
- int chn = 0;
- JSList *node = capture_ports;
+ int chn = 0;
+ JSList *node = capture_ports;
+
#if HAVE_SAMPLERATE
- JSList *src_node = capture_srcs;
+ JSList *src_node = capture_srcs;
#endif
- uint16_t *packet_bufX = (uint16_t *)packet_payload;
+ uint16_t *packet_bufX = (uint16_t*)packet_payload;
- if( !packet_payload )
- return;
+ if ( !packet_payload ) {
+ return;
+ }
- while (node != NULL)
- {
- int i;
- //uint32_t val;
+ while (node != NULL) {
+ int i;
+ //uint32_t val;
#if HAVE_SAMPLERATE
- SRC_DATA src;
+ SRC_DATA src;
#endif
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
#if HAVE_SAMPLERATE
- float *floatbuf = alloca (sizeof(float) * net_period_down);
+ float *floatbuf = alloca (sizeof(float) * net_period_down);
#endif
- const char *porttype = jack_port_type (port);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio (porttype))
- {
- // audio port, resample if necessary
+ if (jack_port_is_audio (porttype)) {
+ // audio port, resample if necessary
#if HAVE_SAMPLERATE
- if (net_period_down != nframes)
- {
- SRC_STATE *src_state = src_node->data;
- for (i = 0; i < net_period_down; i++)
- {
- floatbuf[i] = ((float) ntohs(packet_bufX[i])) / 32767.0 - 1.0;
- }
-
- src.data_in = floatbuf;
- src.input_frames = net_period_down;
-
- src.data_out = buf;
- src.output_frames = nframes;
-
- src.src_ratio = (float) nframes / (float) net_period_down;
- src.end_of_input = 0;
-
- src_set_ratio (src_state, src.src_ratio);
- src_process (src_state, &src);
- src_node = jack_slist_next (src_node);
- }
- else
+ if (net_period_down != nframes) {
+ SRC_STATE *src_state = src_node->data;
+ for (i = 0; i < net_period_down; i++)
+ floatbuf[i] = ((float)ntohs (packet_bufX[i])) / 32767.0 - 1.0;
+
+ src.data_in = floatbuf;
+ src.input_frames = net_period_down;
+
+ src.data_out = buf;
+ src.output_frames = nframes;
+
+ src.src_ratio = (float)nframes / (float)net_period_down;
+ src.end_of_input = 0;
+
+ src_set_ratio (src_state, src.src_ratio);
+ src_process (src_state, &src);
+ src_node = jack_slist_next (src_node);
+ } else
#endif
- for (i = 0; i < net_period_down; i++)
- buf[i] = ((float) ntohs (packet_bufX[i])) / 32768.0 - 1.0;
- }
- else if (jack_port_is_midi (porttype))
- {
- // midi port, decode midi events
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_down / 2;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_down);
- node = jack_slist_next (node);
- chn++;
- }
+ for (i = 0; i < net_period_down; i++)
+ buf[i] = ((float)ntohs (packet_bufX[i])) / 32768.0 - 1.0;
+ } else if (jack_port_is_midi (porttype)) {
+ // midi port, decode midi events
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_down / 2;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
+ }
+ packet_bufX = (packet_bufX + net_period_down);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
void
render_jack_ports_to_payload_16bit (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
{
- int chn = 0;
- JSList *node = playback_ports;
+ int chn = 0;
+ JSList *node = playback_ports;
+
#if HAVE_SAMPLERATE
- JSList *src_node = playback_srcs;
+ JSList *src_node = playback_srcs;
#endif
- uint16_t *packet_bufX = (uint16_t *)packet_payload;
+ uint16_t *packet_bufX = (uint16_t*)packet_payload;
- while (node != NULL)
- {
+ while (node != NULL) {
#if HAVE_SAMPLERATE
- SRC_DATA src;
+ SRC_DATA src;
#endif
- int i;
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
- const char *porttype = jack_port_type (port);
+ int i;
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio (porttype))
- {
- // audio port, resample if necessary
+ if (jack_port_is_audio (porttype)) {
+ // audio port, resample if necessary
#if HAVE_SAMPLERATE
- if (net_period_up != nframes)
- {
- SRC_STATE *src_state = src_node->data;
+ if (net_period_up != nframes) {
+ SRC_STATE *src_state = src_node->data;
- float *floatbuf = alloca (sizeof(float) * net_period_up);
+ float *floatbuf = alloca (sizeof(float) * net_period_up);
- src.data_in = buf;
- src.input_frames = nframes;
+ src.data_in = buf;
+ src.input_frames = nframes;
- src.data_out = floatbuf;
- src.output_frames = net_period_up;
+ src.data_out = floatbuf;
+ src.output_frames = net_period_up;
- src.src_ratio = (float) net_period_up / (float) nframes;
- src.end_of_input = 0;
+ src.src_ratio = (float)net_period_up / (float)nframes;
+ src.end_of_input = 0;
- src_set_ratio (src_state, src.src_ratio);
- src_process (src_state, &src);
+ src_set_ratio (src_state, src.src_ratio);
+ src_process (src_state, &src);
- for (i = 0; i < net_period_up; i++)
- {
- packet_bufX[i] = htons (((uint16_t)((floatbuf[i] + 1.0) * 32767.0)));
- }
- src_node = jack_slist_next (src_node);
- }
- else
+ for (i = 0; i < net_period_up; i++)
+ packet_bufX[i] = htons (((uint16_t)((floatbuf[i] + 1.0) * 32767.0)));
+ src_node = jack_slist_next (src_node);
+ } else
#endif
- for (i = 0; i < net_period_up; i++)
- packet_bufX[i] = htons(((uint16_t)((buf[i] + 1.0) * 32767.0)));
- }
- else if (jack_port_is_midi (porttype))
- {
- // encode midi events from port to packet
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_up / 2;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_up);
- node = jack_slist_next (node);
- chn++;
- }
+ for (i = 0; i < net_period_up; i++)
+ packet_bufX[i] = htons (((uint16_t)((buf[i] + 1.0) * 32767.0)));
+ } else if (jack_port_is_midi (porttype)) {
+ // encode midi events from port to packet
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_up / 2;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
+ }
+ packet_bufX = (packet_bufX + net_period_up);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
// render functions for 8bit
void
render_payload_to_jack_ports_8bit (void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
{
- int chn = 0;
- JSList *node = capture_ports;
+ int chn = 0;
+ JSList *node = capture_ports;
#if HAVE_SAMPLERATE
- JSList *src_node = capture_srcs;
+ JSList *src_node = capture_srcs;
#endif
- int8_t *packet_bufX = (int8_t *)packet_payload;
+ int8_t *packet_bufX = (int8_t*)packet_payload;
- if( !packet_payload )
- return;
+ if ( !packet_payload ) {
+ return;
+ }
- while (node != NULL)
- {
- int i;
- //uint32_t val;
+ while (node != NULL) {
+ int i;
+ //uint32_t val;
#if HAVE_SAMPLERATE
- SRC_DATA src;
+ SRC_DATA src;
#endif
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
#if HAVE_SAMPLERATE
- float *floatbuf = alloca (sizeof (float) * net_period_down);
+ float *floatbuf = alloca (sizeof(float) * net_period_down);
#endif
- const char *porttype = jack_port_type (port);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio(porttype))
- {
+ if (jack_port_is_audio (porttype)) {
#if HAVE_SAMPLERATE
- // audio port, resample if necessary
- if (net_period_down != nframes)
- {
- SRC_STATE *src_state = src_node->data;
- for (i = 0; i < net_period_down; i++)
- floatbuf[i] = ((float) packet_bufX[i]) / 127.0;
-
- src.data_in = floatbuf;
- src.input_frames = net_period_down;
-
- src.data_out = buf;
- src.output_frames = nframes;
-
- src.src_ratio = (float) nframes / (float) net_period_down;
- src.end_of_input = 0;
-
- src_set_ratio (src_state, src.src_ratio);
- src_process (src_state, &src);
- src_node = jack_slist_next (src_node);
- }
- else
+ // audio port, resample if necessary
+ if (net_period_down != nframes) {
+ SRC_STATE *src_state = src_node->data;
+ for (i = 0; i < net_period_down; i++)
+ floatbuf[i] = ((float)packet_bufX[i]) / 127.0;
+
+ src.data_in = floatbuf;
+ src.input_frames = net_period_down;
+
+ src.data_out = buf;
+ src.output_frames = nframes;
+
+ src.src_ratio = (float)nframes / (float)net_period_down;
+ src.end_of_input = 0;
+
+ src_set_ratio (src_state, src.src_ratio);
+ src_process (src_state, &src);
+ src_node = jack_slist_next (src_node);
+ } else
#endif
- for (i = 0; i < net_period_down; i++)
- buf[i] = ((float) packet_bufX[i]) / 127.0;
- }
- else if (jack_port_is_midi (porttype))
- {
- // midi port, decode midi events
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_down / 4;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_down);
- node = jack_slist_next (node);
- chn++;
- }
+ for (i = 0; i < net_period_down; i++)
+ buf[i] = ((float)packet_bufX[i]) / 127.0;
+ } else if (jack_port_is_midi (porttype)) {
+ // midi port, decode midi events
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_down / 4;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
+ }
+ packet_bufX = (packet_bufX + net_period_down);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
void
render_jack_ports_to_payload_8bit (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
{
- int chn = 0;
- JSList *node = playback_ports;
+ int chn = 0;
+ JSList *node = playback_ports;
+
#if HAVE_SAMPLERATE
- JSList *src_node = playback_srcs;
+ JSList *src_node = playback_srcs;
#endif
- int8_t *packet_bufX = (int8_t *)packet_payload;
+ int8_t *packet_bufX = (int8_t*)packet_payload;
- while (node != NULL)
- {
+ while (node != NULL) {
#if HAVE_SAMPLERATE
- SRC_DATA src;
+ SRC_DATA src;
#endif
- int i;
- jack_port_t *port = (jack_port_t *) node->data;
+ int i;
+ jack_port_t *port = (jack_port_t*)node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
- const char *porttype = jack_port_type (port);
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio (porttype))
- {
+ if (jack_port_is_audio (porttype)) {
#if HAVE_SAMPLERATE
- // audio port, resample if necessary
- if (net_period_up != nframes)
- {
+ // audio port, resample if necessary
+ if (net_period_up != nframes) {
- SRC_STATE *src_state = src_node->data;
+ SRC_STATE *src_state = src_node->data;
- float *floatbuf = alloca (sizeof (float) * net_period_up);
+ float *floatbuf = alloca (sizeof(float) * net_period_up);
- src.data_in = buf;
- src.input_frames = nframes;
+ src.data_in = buf;
+ src.input_frames = nframes;
- src.data_out = floatbuf;
- src.output_frames = net_period_up;
+ src.data_out = floatbuf;
+ src.output_frames = net_period_up;
- src.src_ratio = (float) net_period_up / (float) nframes;
- src.end_of_input = 0;
+ src.src_ratio = (float)net_period_up / (float)nframes;
+ src.end_of_input = 0;
- src_set_ratio (src_state, src.src_ratio);
- src_process (src_state, &src);
+ src_set_ratio (src_state, src.src_ratio);
+ src_process (src_state, &src);
- for (i = 0; i < net_period_up; i++)
- packet_bufX[i] = floatbuf[i] * 127.0;
- src_node = jack_slist_next (src_node);
- }
- else
+ for (i = 0; i < net_period_up; i++)
+ packet_bufX[i] = floatbuf[i] * 127.0;
+ src_node = jack_slist_next (src_node);
+ } else
#endif
- for (i = 0; i < net_period_up; i++)
- packet_bufX[i] = buf[i] * 127.0;
- }
- else if (jack_port_is_midi (porttype))
- {
- // encode midi events from port to packet
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_up / 4;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_up);
- node = jack_slist_next (node);
- chn++;
- }
+ for (i = 0; i < net_period_up; i++)
+ packet_bufX[i] = buf[i] * 127.0;
+ } else if (jack_port_is_midi (porttype)) {
+ // encode midi events from port to packet
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_up / 4;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
+ }
+ packet_bufX = (packet_bufX + net_period_up);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
#if HAVE_CELT
@@ -1351,97 +1302,93 @@ render_jack_ports_to_payload_8bit (JSList *playback_ports, JSList *playback_srcs
void
render_payload_to_jack_ports_celt (void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
{
- int chn = 0;
- JSList *node = capture_ports;
- JSList *src_node = capture_srcs;
+ int chn = 0;
+ JSList *node = capture_ports;
+ JSList *src_node = capture_srcs;
- unsigned char *packet_bufX = (unsigned char *)packet_payload;
+ unsigned char *packet_bufX = (unsigned char*)packet_payload;
- while (node != NULL)
- {
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ while (node != NULL) {
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
- const char *porttype = jack_port_type (port);
+ const char *porttype = jack_port_type (port);
- if (jack_port_is_audio (porttype))
- {
- // audio port, decode celt data.
+ if (jack_port_is_audio (porttype)) {
+ // audio port, decode celt data.
- CELTDecoder *decoder = src_node->data;
+ CELTDecoder *decoder = src_node->data;
#if HAVE_CELT_API_0_8
- if( !packet_payload )
- celt_decode_float( decoder, NULL, net_period_down, buf, nframes );
- else
- celt_decode_float( decoder, packet_bufX, net_period_down, buf, nframes );
+ if ( !packet_payload ) {
+ celt_decode_float ( decoder, NULL, net_period_down, buf, nframes );
+ } else {
+ celt_decode_float ( decoder, packet_bufX, net_period_down, buf, nframes );
+ }
#else
- if( !packet_payload )
- celt_decode_float( decoder, NULL, net_period_down, buf );
- else
- celt_decode_float( decoder, packet_bufX, net_period_down, buf );
+ if ( !packet_payload ) {
+ celt_decode_float ( decoder, NULL, net_period_down, buf );
+ } else {
+ celt_decode_float ( decoder, packet_bufX, net_period_down, buf );
+ }
#endif
- src_node = jack_slist_next (src_node);
- }
- else if (jack_port_is_midi (porttype))
- {
- // midi port, decode midi events
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_down / 2;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- if( packet_payload )
- decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_down);
- node = jack_slist_next (node);
- chn++;
- }
+ src_node = jack_slist_next (src_node);
+ } else if (jack_port_is_midi (porttype)) {
+ // midi port, decode midi events
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_down / 2;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ if ( packet_payload ) {
+ decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
+ }
+ }
+ packet_bufX = (packet_bufX + net_period_down);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
void
render_jack_ports_to_payload_celt (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
{
- int chn = 0;
- JSList *node = playback_ports;
- JSList *src_node = playback_srcs;
-
- unsigned char *packet_bufX = (unsigned char *)packet_payload;
-
- while (node != NULL)
- {
- jack_port_t *port = (jack_port_t *) node->data;
- jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
- const char *porttype = jack_port_type (port);
-
- if (jack_port_is_audio (porttype))
- {
- // audio port, encode celt data.
-
- int encoded_bytes;
- float *floatbuf = alloca (sizeof(float) * nframes );
- memcpy( floatbuf, buf, nframes*sizeof(float) );
- CELTEncoder *encoder = src_node->data;
+ int chn = 0;
+ JSList *node = playback_ports;
+ JSList *src_node = playback_srcs;
+
+ unsigned char *packet_bufX = (unsigned char*)packet_payload;
+
+ while (node != NULL) {
+ jack_port_t *port = (jack_port_t*)node->data;
+ jack_default_audio_sample_t* buf = jack_port_get_buffer (port, nframes);
+ const char *porttype = jack_port_type (port);
+
+ if (jack_port_is_audio (porttype)) {
+ // audio port, encode celt data.
+
+ int encoded_bytes;
+ float *floatbuf = alloca (sizeof(float) * nframes );
+ memcpy ( floatbuf, buf, nframes * sizeof(float) );
+ CELTEncoder *encoder = src_node->data;
#if HAVE_CELT_API_0_8
- encoded_bytes = celt_encode_float( encoder, floatbuf, nframes, packet_bufX, net_period_up );
+ encoded_bytes = celt_encode_float ( encoder, floatbuf, nframes, packet_bufX, net_period_up );
#else
- encoded_bytes = celt_encode_float( encoder, floatbuf, NULL, packet_bufX, net_period_up );
+ encoded_bytes = celt_encode_float ( encoder, floatbuf, NULL, packet_bufX, net_period_up );
#endif
- if( encoded_bytes != net_period_up )
- printf( "something in celt changed. netjack needs to be changed to handle this.\n" );
- src_node = jack_slist_next( src_node );
- }
- else if (jack_port_is_midi (porttype))
- {
- // encode midi events from port to packet
- // convert the data buffer to a standard format (uint32_t based)
- unsigned int buffer_size_uint32 = net_period_up / 2;
- uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
- encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
- }
- packet_bufX = (packet_bufX + net_period_up);
- node = jack_slist_next (node);
- chn++;
- }
+ if ( encoded_bytes != net_period_up ) {
+ printf ( "something in celt changed. netjack needs to be changed to handle this.\n" );
+ }
+ src_node = jack_slist_next ( src_node );
+ } else if (jack_port_is_midi (porttype)) {
+ // encode midi events from port to packet
+ // convert the data buffer to a standard format (uint32_t based)
+ unsigned int buffer_size_uint32 = net_period_up / 2;
+ uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
+ encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
+ }
+ packet_bufX = (packet_bufX + net_period_up);
+ node = jack_slist_next (node);
+ chn++;
+ }
}
#endif
@@ -1449,29 +1396,35 @@ render_jack_ports_to_payload_celt (JSList *playback_ports, JSList *playback_srcs
void
render_payload_to_jack_ports (int bitdepth, void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes, int dont_htonl_floats)
{
- if (bitdepth == 8)
- render_payload_to_jack_ports_8bit (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
- else if (bitdepth == 16)
- render_payload_to_jack_ports_16bit (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
+ if (bitdepth == 8) {
+ render_payload_to_jack_ports_8bit (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
+ } else if (bitdepth == 16) {
+ render_payload_to_jack_ports_16bit (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
+ }
#if HAVE_CELT
- else if (bitdepth == CELT_MODE)
- render_payload_to_jack_ports_celt (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
+ else if (bitdepth == CELT_MODE) {
+ render_payload_to_jack_ports_celt (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
+ }
#endif
- else
- render_payload_to_jack_ports_float (packet_payload, net_period_down, capture_ports, capture_srcs, nframes, dont_htonl_floats);
+ else {
+ render_payload_to_jack_ports_float (packet_payload, net_period_down, capture_ports, capture_srcs, nframes, dont_htonl_floats);
+ }
}
void
render_jack_ports_to_payload (int bitdepth, JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up, int dont_htonl_floats)
{
- if (bitdepth == 8)
- render_jack_ports_to_payload_8bit (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
- else if (bitdepth == 16)
- render_jack_ports_to_payload_16bit (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
+ if (bitdepth == 8) {
+ render_jack_ports_to_payload_8bit (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
+ } else if (bitdepth == 16) {
+ render_jack_ports_to_payload_16bit (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
+ }
#if HAVE_CELT
- else if (bitdepth == CELT_MODE)
- render_jack_ports_to_payload_celt (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
+ else if (bitdepth == CELT_MODE) {
+ render_jack_ports_to_payload_celt (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
+ }
#endif
- else
- render_jack_ports_to_payload_float (playback_ports, playback_srcs, nframes, packet_payload, net_period_up, dont_htonl_floats);
+ else {
+ render_jack_ports_to_payload_float (playback_ports, playback_srcs, nframes, packet_payload, net_period_up, dont_htonl_floats);
+ }
}
diff --git a/drivers/netjack/netjack_packet.h b/drivers/netjack/netjack_packet.h
index 97ac97d..2c0750f 100644
--- a/drivers/netjack/netjack_packet.h
+++ b/drivers/netjack/netjack_packet.h
@@ -28,8 +28,8 @@
#define __JACK_NET_PACKET_H__
#ifdef __cplusplus
- extern "C"
- {
+extern "C"
+{
#endif
#include <jack/jack.h>
@@ -46,81 +46,77 @@
typedef struct _jacknet_packet_header jacknet_packet_header;
-struct _jacknet_packet_header
-{
- // General AutoConf Data
- jack_nframes_t capture_channels_audio;
- jack_nframes_t playback_channels_audio;
- jack_nframes_t capture_channels_midi;
- jack_nframes_t playback_channels_midi;
- jack_nframes_t period_size;
- jack_nframes_t sample_rate;
-
- // Transport Sync
- jack_nframes_t sync_state;
- jack_nframes_t transport_frame;
- jack_nframes_t transport_state;
-
- // Packet loss Detection, and latency reduction
- jack_nframes_t framecnt;
- jack_nframes_t latency;
-
- jack_nframes_t reply_port;
- jack_nframes_t mtu;
- jack_nframes_t fragment_nr;
+struct _jacknet_packet_header {
+ // General AutoConf Data
+ jack_nframes_t capture_channels_audio;
+ jack_nframes_t playback_channels_audio;
+ jack_nframes_t capture_channels_midi;
+ jack_nframes_t playback_channels_midi;
+ jack_nframes_t period_size;
+ jack_nframes_t sample_rate;
+
+ // Transport Sync
+ jack_nframes_t sync_state;
+ jack_nframes_t transport_frame;
+ jack_nframes_t transport_state;
+
+ // Packet loss Detection, and latency reduction
+ jack_nframes_t framecnt;
+ jack_nframes_t latency;
+
+ jack_nframes_t reply_port;
+ jack_nframes_t mtu;
+ jack_nframes_t fragment_nr;
};
typedef union _int_float int_float_t;
-union _int_float
-{
- uint32_t i;
- float f;
+union _int_float {
+ uint32_t i;
+ float f;
};
// fragment reorder cache.
typedef struct _cache_packet cache_packet;
-struct _cache_packet
-{
- int valid;
- int num_fragments;
- int packet_size;
- int mtu;
- jack_time_t recv_timestamp;
- jack_nframes_t framecnt;
- char * fragment_array;
- char * packet_buf;
+struct _cache_packet {
+ int valid;
+ int num_fragments;
+ int packet_size;
+ int mtu;
+ jack_time_t recv_timestamp;
+ jack_nframes_t framecnt;
+ char * fragment_array;
+ char * packet_buf;
};
typedef struct _packet_cache packet_cache;
-struct _packet_cache
-{
- int size;
- cache_packet *packets;
- int mtu;
- struct sockaddr_in master_address;
- int master_address_valid;
- jack_nframes_t last_framecnt_retreived;
- int last_framecnt_retreived_valid;
+struct _packet_cache {
+ int size;
+ cache_packet *packets;
+ int mtu;
+ struct sockaddr_in master_address;
+ int master_address_valid;
+ jack_nframes_t last_framecnt_retreived;
+ int last_framecnt_retreived_valid;
};
// fragment cache function prototypes
// XXX: Some of these are private.
packet_cache *packet_cache_new(int num_packets, int pkt_size, int mtu);
-void packet_cache_free(packet_cache *pkt_cache);
+void packet_cache_free(packet_cache *pkt_cache);
cache_packet *packet_cache_get_packet(packet_cache *pkt_cache, jack_nframes_t framecnt);
cache_packet *packet_cache_get_oldest_packet(packet_cache *pkt_cache);
cache_packet *packet_cache_get_free_packet(packet_cache *pkt_cache);
-void cache_packet_reset(cache_packet *pack);
-void cache_packet_set_framecnt(cache_packet *pack, jack_nframes_t framecnt);
-void cache_packet_add_fragment(cache_packet *pack, char *packet_buf, int rcv_len);
-int cache_packet_is_complete(cache_packet *pack);
+void cache_packet_reset(cache_packet *pack);
+void cache_packet_set_framecnt(cache_packet *pack, jack_nframes_t framecnt);
+void cache_packet_add_fragment(cache_packet *pack, char *packet_buf, int rcv_len);
+int cache_packet_is_complete(cache_packet *pack);
-void packet_cache_drain_socket( packet_cache *pcache, int sockfd, jack_time_t (*get_microseconds)(void) );
+void packet_cache_drain_socket ( packet_cache * pcache, int sockfd, jack_time_t (*get_microseconds)(void) );
void packet_cache_reset_master_address( packet_cache *pcache );
float packet_cache_get_fill( packet_cache *pcache, jack_nframes_t expected_framecnt );
int packet_cache_retreive_packet_pointer( packet_cache *pcache, jack_nframes_t framecnt, char **packet_buf, int pkt_size, jack_time_t *timestamp );
@@ -149,10 +145,10 @@ void render_jack_ports_to_payload(int bitdepth, JSList *playback_ports, JSList *
// This one waits forever. an is not using ppoll
int netjack_poll(int sockfd, int timeout);
-void decode_midi_buffer (uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf);
-void encode_midi_buffer (uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf);
+void decode_midi_buffer(uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf);
+void encode_midi_buffer(uint32_t *buffer_uint32, unsigned int buffer_size_uint32, jack_default_audio_sample_t* buf);
#ifdef __cplusplus
- }
+}
#endif
#endif
diff --git a/drivers/oss/oss_driver.c b/drivers/oss/oss_driver.c
index 2289e49..f53a2dd 100644
--- a/drivers/oss/oss_driver.c
+++ b/drivers/oss/oss_driver.c
@@ -1,24 +1,24 @@
/*
- OSS driver for Jack
- Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.net>
+ OSS driver for Jack
+ Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.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 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.
+ 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
-*/
+ */
#include <config.h>
@@ -31,7 +31,7 @@
* defined as optional by the standard, so OS conformance to this level
* doesn't necessarily mean everything exists.
*/
-#define _XOPEN_SOURCE 600
+#define _XOPEN_SOURCE 600
#endif
#ifndef _REENTRANT
#define _REENTRANT
@@ -70,103 +70,92 @@
#ifndef SNDCTL_DSP_COOKEDMODE
#ifdef _SIOWR
-#define SNDCTL_DSP_COOKEDMODE _SIOWR('P', 30, int)
+#define SNDCTL_DSP_COOKEDMODE _SIOWR ('P', 30, int)
#else /* _SIOWR */
#warning "Unable to define cooked mode!"
#define OSS_NO_COOKED_MODE
#endif /* _SIOWR */
#endif /* SNDCTL_DSP_COOKEDMODE */
-#define OSS_DRIVER_N_PARAMS 11
+#define OSS_DRIVER_N_PARAMS 11
const static jack_driver_param_desc_t oss_params[OSS_DRIVER_N_PARAMS] = {
{ "rate",
- 'r',
- JackDriverParamUInt,
- { .ui = OSS_DRIVER_DEF_FS },
- NULL,
- "sample rate",
- "sample rate"
- },
+ 'r',
+ JackDriverParamUInt,
+ { .ui = OSS_DRIVER_DEF_FS },
+ NULL,
+ "sample rate",
+ "sample rate" },
{ "period",
- 'p',
- JackDriverParamUInt,
- { .ui = OSS_DRIVER_DEF_BLKSIZE },
- NULL,
- "period size",
- "period size"
- },
+ 'p',
+ JackDriverParamUInt,
+ { .ui = OSS_DRIVER_DEF_BLKSIZE },
+ NULL,
+ "period size",
+ "period size" },
{ "nperiods",
- 'n',
- JackDriverParamUInt,
- { .ui = OSS_DRIVER_DEF_NPERIODS },
- NULL,
- "number of periods in buffer",
- "number of periods in buffer"
- },
+ 'n',
+ JackDriverParamUInt,
+ { .ui = OSS_DRIVER_DEF_NPERIODS },
+ NULL,
+ "number of periods in buffer",
+ "number of periods in buffer" },
{ "wordlength",
- 'w',
- JackDriverParamInt,
- { .i = OSS_DRIVER_DEF_BITS },
- NULL,
- "word length",
- "word length"
- },
+ 'w',
+ JackDriverParamInt,
+ { .i = OSS_DRIVER_DEF_BITS },
+ NULL,
+ "word length",
+ "word length" },
{ "inchannels",
- 'i',
- JackDriverParamUInt,
- { .ui = OSS_DRIVER_DEF_INS },
- NULL,
- "capture channels",
- "capture channels"
- },
+ 'i',
+ JackDriverParamUInt,
+ { .ui = OSS_DRIVER_DEF_INS },
+ NULL,
+ "capture channels",
+ "capture channels" },
{ "outchannels",
- 'o',
- JackDriverParamUInt,
- { .ui = OSS_DRIVER_DEF_OUTS },
- NULL,
- "playback channels",
- "playback channels"
- },
+ 'o',
+ JackDriverParamUInt,
+ { .ui = OSS_DRIVER_DEF_OUTS },
+ NULL,
+ "playback channels",
+ "playback channels" },
{ "capture",
- 'C',
- JackDriverParamString,
- { .str = OSS_DRIVER_DEF_DEV },
- NULL,
- "input device",
- "input device"
- },
+ 'C',
+ JackDriverParamString,
+ { .str = OSS_DRIVER_DEF_DEV },
+ NULL,
+ "input device",
+ "input device" },
{ "playback",
- 'P',
- JackDriverParamString,
- { .str = OSS_DRIVER_DEF_DEV },
- NULL,
- "output device",
- "output device"
- },
+ 'P',
+ JackDriverParamString,
+ { .str = OSS_DRIVER_DEF_DEV },
+ NULL,
+ "output device",
+ "output device" },
{ "ignorehwbuf",
- 'b',
- JackDriverParamBool,
- { },
- NULL,
- "ignore hardware period size",
- "ignore hardware period size"
- },
+ 'b',
+ JackDriverParamBool,
+ { },
+ NULL,
+ "ignore hardware period size",
+ "ignore hardware period size" },
{ "input latency",
- 'I',
- JackDriverParamUInt,
- { .ui = 0 },
- NULL,
- "system input latency",
- "system input latency"
- },
+ 'I',
+ JackDriverParamUInt,
+ { .ui = 0 },
+ NULL,
+ "system input latency",
+ "system input latency" },
{ "output latency",
- 'O',
- JackDriverParamUInt,
- { .ui = 0 },
- NULL,
- "system output latency",
- "system output latency"
- }
+ 'O',
+ JackDriverParamUInt,
+ { .ui = 0 },
+ NULL,
+ "system output latency",
+ "system output latency" }
};
@@ -174,16 +163,16 @@ const static jack_driver_param_desc_t oss_params[OSS_DRIVER_N_PARAMS] = {
/* internal functions */
-static void set_period_size (oss_driver_t *driver,
- jack_nframes_t new_period_size)
+static void set_period_size (oss_driver_t *driver,
+ jack_nframes_t new_period_size)
{
driver->period_size = new_period_size;
- driver->period_usecs =
- ((double) driver->period_size /
- (double) driver->sample_rate) * 1e6;
+ driver->period_usecs =
+ ((double)driver->period_size /
+ (double)driver->sample_rate) * 1e6;
driver->last_wait_ust = 0;
- driver->last_periodtime = driver->engine->get_microseconds();
+ driver->last_periodtime = driver->engine->get_microseconds ();
driver->next_periodtime = 0;
driver->iodelay = 0.0F;
}
@@ -191,15 +180,13 @@ static void set_period_size (oss_driver_t *driver,
static inline void update_times (oss_driver_t *driver)
{
- driver->last_periodtime = driver->engine->get_microseconds();
- if (driver->next_periodtime > 0)
- {
+ driver->last_periodtime = driver->engine->get_microseconds ();
+ if (driver->next_periodtime > 0) {
driver->iodelay = (float)
- ((long double) driver->last_periodtime -
- (long double) driver->next_periodtime);
- }
- else driver->iodelay = 0.0F;
- driver->next_periodtime =
+ ((long double)driver->last_periodtime -
+ (long double)driver->next_periodtime);
+ } else { driver->iodelay = 0.0F; }
+ driver->next_periodtime =
driver->last_periodtime +
driver->period_usecs;
}
@@ -207,120 +194,110 @@ static inline void update_times (oss_driver_t *driver)
static inline void driver_cycle (oss_driver_t *driver)
{
- update_times(driver);
- driver->engine->transport_cycle_start(driver->engine,
- driver->last_periodtime);
+ update_times (driver);
+ driver->engine->transport_cycle_start (driver->engine,
+ driver->last_periodtime);
driver->last_wait_ust = driver->last_periodtime;
- driver->engine->run_cycle(driver->engine,
- driver->period_size, driver->iodelay);
+ driver->engine->run_cycle (driver->engine,
+ driver->period_size, driver->iodelay);
}
-static void copy_and_convert_in (jack_sample_t *dst, void *src,
- size_t nframes, int channel, int chcount, int bits)
+static void copy_and_convert_in (jack_sample_t *dst, void *src,
+ size_t nframes, int channel, int chcount, int bits)
{
int srcidx;
int dstidx;
- signed short *s16src = (signed short *) src;
- signed int *s32src = (signed int *) src;
- double *f64src = (double *) src;
+ signed short *s16src = (signed short*)src;
+ signed int *s32src = (signed int*)src;
+ double *f64src = (double*)src;
jack_sample_t scale;
srcidx = channel;
- switch (bits)
- {
- case 16:
- scale = 1.0f / 0x7fff;
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t)
- s16src[srcidx] * scale;
- srcidx += chcount;
- }
- break;
- case 24:
- scale = 1.0f / 0x7fffff;
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t)
- s32src[srcidx] * scale;
- srcidx += chcount;
- }
- break;
- case 32:
- scale = 1.0f / 0x7fffffff;
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t)
- s32src[srcidx] * scale;
- srcidx += chcount;
- }
- break;
- case 64:
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t) f64src[srcidx];
- srcidx += chcount;
- }
- break;
+ switch (bits) {
+ case 16:
+ scale = 1.0f / 0x7fff;
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)
+ s16src[srcidx] * scale;
+ srcidx += chcount;
+ }
+ break;
+ case 24:
+ scale = 1.0f / 0x7fffff;
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)
+ s32src[srcidx] * scale;
+ srcidx += chcount;
+ }
+ break;
+ case 32:
+ scale = 1.0f / 0x7fffffff;
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)
+ s32src[srcidx] * scale;
+ srcidx += chcount;
+ }
+ break;
+ case 64:
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)f64src[srcidx];
+ srcidx += chcount;
+ }
+ break;
}
}
-static void copy_and_convert_out (void *dst, jack_sample_t *src,
- size_t nframes, int channel, int chcount, int bits)
+static void copy_and_convert_out (void *dst, jack_sample_t *src,
+ size_t nframes, int channel, int chcount, int bits)
{
int srcidx;
int dstidx;
- signed short *s16dst = (signed short *) dst;
- signed int *s32dst = (signed int *) dst;
- double *f64dst = (double *) dst;
+ signed short *s16dst = (signed short*)dst;
+ signed int *s32dst = (signed int*)dst;
+ double *f64dst = (double*)dst;
jack_sample_t scale;
dstidx = channel;
- switch (bits)
- {
- case 16:
- scale = 0x7fff;
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- s16dst[dstidx] = (signed short)
- (src[srcidx] >= 0.0f) ?
- (src[srcidx] * scale + 0.5f) :
- (src[srcidx] * scale - 0.5f);
- dstidx += chcount;
- }
- break;
- case 24:
- scale = 0x7fffff;
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- s32dst[dstidx] = (signed int)
- (src[srcidx] >= 0.0f) ?
- (src[srcidx] * scale + 0.5f) :
- (src[srcidx] * scale - 0.5f);
- dstidx += chcount;
- }
- break;
- case 32:
- scale = 0x7fffffff;
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- s32dst[dstidx] = (signed int)
- (src[srcidx] >= 0.0f) ?
- (src[srcidx] * scale + 0.5f) :
- (src[srcidx] * scale - 0.5f);
- dstidx += chcount;
- }
- break;
- case 64:
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- f64dst[dstidx] = (double) src[srcidx];
- dstidx += chcount;
- }
- break;
+ switch (bits) {
+ case 16:
+ scale = 0x7fff;
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ s16dst[dstidx] = (signed short)
+ (src[srcidx] >= 0.0f) ?
+ (src[srcidx] * scale + 0.5f) :
+ (src[srcidx] * scale - 0.5f);
+ dstidx += chcount;
+ }
+ break;
+ case 24:
+ scale = 0x7fffff;
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ s32dst[dstidx] = (signed int)
+ (src[srcidx] >= 0.0f) ?
+ (src[srcidx] * scale + 0.5f) :
+ (src[srcidx] * scale - 0.5f);
+ dstidx += chcount;
+ }
+ break;
+ case 32:
+ scale = 0x7fffffff;
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ s32dst[dstidx] = (signed int)
+ (src[srcidx] >= 0.0f) ?
+ (src[srcidx] * scale + 0.5f) :
+ (src[srcidx] * scale - 0.5f);
+ dstidx += chcount;
+ }
+ break;
+ case 64:
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ f64dst[dstidx] = (double)src[srcidx];
+ dstidx += chcount;
+ }
+ break;
}
}
@@ -330,12 +307,11 @@ static void set_fragment (int fd, size_t fragsize, unsigned int fragcount)
int fragsize_2p;
int fragments;
- fragsize_2p = (int) (log(fragsize) / log(2.0) + 0.5);
+ fragsize_2p = (int)(log (fragsize) / log (2.0) + 0.5);
fragments = ((fragcount << 16) | (fragsize_2p & 0xffff));
- if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &fragments) < 0)
- {
- jack_error("OSS: failed to set fragment size: %s@%i, errno=%d",
- __FILE__, __LINE__, errno);
+ if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &fragments) < 0) {
+ jack_error ("OSS: failed to set fragment size: %s@%i, errno=%d",
+ __FILE__, __LINE__, errno);
}
}
@@ -344,17 +320,16 @@ static int get_fragment (int fd)
{
int fragsize;
- if (ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &fragsize) < 0)
- {
- jack_error("OSS: failed to get fragment size: %s@%i, errno=%d",
- __FILE__, __LINE__, errno);
+ if (ioctl (fd, SNDCTL_DSP_GETBLKSIZE, &fragsize) < 0) {
+ jack_error ("OSS: failed to get fragment size: %s@%i, errno=%d",
+ __FILE__, __LINE__, errno);
return 0;
}
return fragsize;
}
-static void *io_thread (void *);
+static void *io_thread(void *);
/* jack driver interface */
@@ -369,54 +344,50 @@ static int oss_driver_attach (oss_driver_t *driver, jack_engine_t *engine)
jack_latency_range_t range;
driver->engine = engine;
- set_period_size(driver, driver->period_size);
+ set_period_size (driver, driver->period_size);
- if (engine->set_buffer_size(engine, driver->period_size)) {
+ if (engine->set_buffer_size (engine, driver->period_size)) {
jack_error ("OSS: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
return -1;
}
- engine->set_sample_rate(engine, driver->sample_rate);
-
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
- for (channel = 0; channel < driver->capture_channels; channel++)
- {
- snprintf(channel_name, sizeof(channel_name),
- "capture_%u", channel + 1);
- port = jack_port_register(driver->client, channel_name,
- JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
- if (port == NULL)
- {
- jack_error("OSS: cannot register port for %s: %s@%i",
- channel_name, __FILE__, __LINE__);
+ engine->set_sample_rate (engine, driver->sample_rate);
+
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
+ for (channel = 0; channel < driver->capture_channels; channel++) {
+ snprintf (channel_name, sizeof(channel_name),
+ "capture_%u", channel + 1);
+ port = jack_port_register (driver->client, channel_name,
+ JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
+ if (port == NULL) {
+ jack_error ("OSS: cannot register port for %s: %s@%i",
+ channel_name, __FILE__, __LINE__);
break;
}
range.min = range.max = driver->period_size + driver->sys_in_latency;
- jack_port_set_latency_range(port, JackCaptureLatency, &range);
- driver->capture_ports =
- jack_slist_append(driver->capture_ports, port);
+ jack_port_set_latency_range (port, JackCaptureLatency, &range);
+ driver->capture_ports =
+ jack_slist_append (driver->capture_ports, port);
}
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
- for (channel = 0; channel < driver->playback_channels; channel++)
- {
- snprintf(channel_name, sizeof(channel_name),
- "playback_%u", channel + 1);
- port = jack_port_register(driver->client, channel_name,
- JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
- if (port == NULL)
- {
- jack_error("OSS: cannot register port for %s: %s@%i",
- channel_name, __FILE__, __LINE__);
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+ for (channel = 0; channel < driver->playback_channels; channel++) {
+ snprintf (channel_name, sizeof(channel_name),
+ "playback_%u", channel + 1);
+ port = jack_port_register (driver->client, channel_name,
+ JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
+ if (port == NULL) {
+ jack_error ("OSS: cannot register port for %s: %s@%i",
+ channel_name, __FILE__, __LINE__);
break;
}
range.min = range.max = driver->period_size + driver->sys_out_latency;
- jack_port_set_latency_range(port, JackPlaybackLatency, &range);
+ jack_port_set_latency_range (port, JackPlaybackLatency, &range);
driver->playback_ports =
- jack_slist_append(driver->playback_ports, port);
+ jack_slist_append (driver->playback_ports, port);
}
- jack_activate(driver->client);
+ jack_activate (driver->client);
return 0;
}
@@ -426,29 +397,28 @@ static int oss_driver_detach (oss_driver_t *driver, jack_engine_t *engine)
{
JSList *node;
- if (driver->engine == NULL)
+ if (driver->engine == NULL) {
return -1;
+ }
/*jack_deactivate(driver->client);*/ /* ? */
node = driver->capture_ports;
- while (node != NULL)
- {
- jack_port_unregister(driver->client,
- ((jack_port_t *) node->data));
- node = jack_slist_next(node);
+ while (node != NULL) {
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
+ node = jack_slist_next (node);
}
- jack_slist_free(driver->capture_ports);
+ jack_slist_free (driver->capture_ports);
driver->capture_ports = NULL;
node = driver->playback_ports;
- while (node != NULL)
- {
- jack_port_unregister(driver->client,
- ((jack_port_t *) node->data));
- node = jack_slist_next(node);
+ while (node != NULL) {
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
+ node = jack_slist_next (node);
}
- jack_slist_free(driver->playback_ports);
+ jack_slist_free (driver->playback_ports);
driver->playback_ports = NULL;
driver->engine = NULL;
@@ -471,298 +441,271 @@ static int oss_driver_start (oss_driver_t *driver)
const char *indev = driver->indev;
const char *outdev = driver->outdev;
- switch (driver->bits)
- {
- case 24:
- case 32:
- samplesize = sizeof(int);
- break;
- case 64:
- samplesize = sizeof(double);
- break;
- case 16:
- default:
- samplesize = sizeof(short);
- break;
+ switch (driver->bits) {
+ case 24:
+ case 32:
+ samplesize = sizeof(int);
+ break;
+ case 64:
+ samplesize = sizeof(double);
+ break;
+ case 16:
+ default:
+ samplesize = sizeof(short);
+ break;
}
driver->trigger = 0;
- if (strcmp(indev, outdev) != 0)
- {
- if (driver->capture_channels > 0)
- {
- infd = open(indev, O_RDONLY|O_EXCL);
- if (infd < 0)
- {
- jack_error(
+ if (strcmp (indev, outdev) != 0) {
+ if (driver->capture_channels > 0) {
+ infd = open (indev, O_RDONLY | O_EXCL);
+ if (infd < 0) {
+ jack_error (
"OSS: failed to open input device %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
}
#ifndef OSS_NO_COOKED_MODE
- ioctl(infd, SNDCTL_DSP_COOKEDMODE, &flags);
+ ioctl (infd, SNDCTL_DSP_COOKEDMODE, &flags);
#endif
- fragsize = driver->period_size *
- driver->capture_channels * samplesize;
- set_fragment(infd, fragsize, driver->nperiods);
- }
- else infd = -1;
-
- if (driver->playback_channels > 0)
- {
- outfd = open(outdev, O_WRONLY|O_EXCL);
- if (outfd < 0)
- {
- jack_error(
+ fragsize = driver->period_size *
+ driver->capture_channels * samplesize;
+ set_fragment (infd, fragsize, driver->nperiods);
+ } else { infd = -1; }
+
+ if (driver->playback_channels > 0) {
+ outfd = open (outdev, O_WRONLY | O_EXCL);
+ if (outfd < 0) {
+ jack_error (
"OSS: failed to open output device %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
}
#ifndef OSS_NO_COOKED_MODE
- ioctl(outfd, SNDCTL_DSP_COOKEDMODE, &flags);
+ ioctl (outfd, SNDCTL_DSP_COOKEDMODE, &flags);
#endif
- fragsize = driver->period_size *
- driver->playback_channels * samplesize;
- set_fragment(outfd, fragsize, driver->nperiods);
- }
- else outfd = -1;
- }
- else
- {
+ fragsize = driver->period_size *
+ driver->playback_channels * samplesize;
+ set_fragment (outfd, fragsize, driver->nperiods);
+ } else { outfd = -1; }
+ } else {
if (driver->capture_channels != 0 &&
- driver->playback_channels == 0)
- {
- infd = open(indev, O_RDWR|O_EXCL);
+ driver->playback_channels == 0) {
+ infd = open (indev, O_RDWR | O_EXCL);
outfd = -1;
- if (infd < 0)
- {
- jack_error(
+ if (infd < 0) {
+ jack_error (
"OSS: failed to open device %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
return -1;
}
#ifndef OSS_NO_COOKED_MODE
- ioctl(infd, SNDCTL_DSP_COOKEDMODE, &flags);
+ ioctl (infd, SNDCTL_DSP_COOKEDMODE, &flags);
#endif
- }
- else if (driver->capture_channels == 0 &&
- driver->playback_channels != 0)
- {
+ } else if (driver->capture_channels == 0 &&
+ driver->playback_channels != 0) {
infd = -1;
- outfd = open(outdev, O_RDWR|O_EXCL);
- if (outfd < 0)
- {
- jack_error(
+ outfd = open (outdev, O_RDWR | O_EXCL);
+ if (outfd < 0) {
+ jack_error (
"OSS: failed to open device %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
return -1;
}
#ifndef OSS_NO_COOKED_MODE
- ioctl(outfd, SNDCTL_DSP_COOKEDMODE, &flags);
+ ioctl (outfd, SNDCTL_DSP_COOKEDMODE, &flags);
#endif
- }
- else
- {
- infd = outfd = open(indev, O_RDWR|O_EXCL);
- if (infd < 0)
- {
- jack_error(
+ } else {
+ infd = outfd = open (indev, O_RDWR | O_EXCL);
+ if (infd < 0) {
+ jack_error (
"OSS: failed to open device %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
return -1;
}
#ifndef OSS_NO_COOKED_MODE
- ioctl(infd, SNDCTL_DSP_COOKEDMODE, &flags);
+ ioctl (infd, SNDCTL_DSP_COOKEDMODE, &flags);
#endif
}
- if (infd >= 0 && outfd >= 0)
- {
- ioctl(outfd, SNDCTL_DSP_SETTRIGGER, &driver->trigger);
- driver->trigger = (PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT);
- if (ioctl(infd, SNDCTL_DSP_SETDUPLEX, 0) < 0)
- {
- if (errno != EINVAL) /* Dont care */
- jack_error(
+ if (infd >= 0 && outfd >= 0) {
+ ioctl (outfd, SNDCTL_DSP_SETTRIGGER, &driver->trigger);
+ driver->trigger = (PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT);
+ if (ioctl (infd, SNDCTL_DSP_SETDUPLEX, 0) < 0) {
+ if (errno != EINVAL) { /* Dont care */
+ jack_error (
"OSS: failed to enable full duplex for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__,
errno);
+ }
}
}
- if (infd >= 0)
- {
- fragsize = driver->period_size *
- driver->capture_channels * samplesize;
- set_fragment(infd, fragsize, driver->nperiods);
+ if (infd >= 0) {
+ fragsize = driver->period_size *
+ driver->capture_channels * samplesize;
+ set_fragment (infd, fragsize, driver->nperiods);
}
- if (outfd >= 0 && infd < 0)
- {
- fragsize = driver->period_size *
- driver->playback_channels * samplesize;
- set_fragment(outfd, fragsize, driver->nperiods);
+ if (outfd >= 0 && infd < 0) {
+ fragsize = driver->period_size *
+ driver->playback_channels * samplesize;
+ set_fragment (outfd, fragsize, driver->nperiods);
}
}
driver->infd = infd;
driver->outfd = outfd;
-
- if (infd >= 0)
- {
+
+ if (infd >= 0) {
format = driver->format;
- if (ioctl(infd, SNDCTL_DSP_SETFMT, &format) < 0)
- jack_error(
- "OSS: failed to set format for %s: %s@%i, errno=%d",
+ if (ioctl (infd, SNDCTL_DSP_SETFMT, &format) < 0) {
+ jack_error (
+ "OSS: failed to set format for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
+ }
channels = driver->capture_channels;
- if (ioctl(infd, SNDCTL_DSP_CHANNELS, &channels) < 0)
- jack_error(
- "OSS: failed to set channels for %s: %s@%i, errno=%d",
+ if (ioctl (infd, SNDCTL_DSP_CHANNELS, &channels) < 0) {
+ jack_error (
+ "OSS: failed to set channels for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
+ }
samplerate = driver->sample_rate;
- if (ioctl(infd, SNDCTL_DSP_SPEED, &samplerate) < 0)
- jack_error(
- "OSS: failed to set samplerate for %s: %s@%i, errno=%d",
+ if (ioctl (infd, SNDCTL_DSP_SPEED, &samplerate) < 0) {
+ jack_error (
+ "OSS: failed to set samplerate for %s: %s@%i, errno=%d",
indev, __FILE__, __LINE__, errno);
- jack_info("oss_driver: %s : 0x%x/%i/%i (%i)", indev,
- format, channels, samplerate, get_fragment(infd));
-
- period_size = get_fragment(infd) / samplesize / channels;
- if (period_size != driver->period_size &&
- !driver->ignorehwbuf)
- {
- jack_info("oss_driver: period size update: %u",
- period_size);
+ }
+ jack_info ("oss_driver: %s : 0x%x/%i/%i (%i)", indev,
+ format, channels, samplerate, get_fragment (infd));
+
+ period_size = get_fragment (infd) / samplesize / channels;
+ if (period_size != driver->period_size &&
+ !driver->ignorehwbuf) {
+ jack_info ("oss_driver: period size update: %u",
+ period_size);
driver->period_size = period_size;
- driver->period_usecs =
- ((double) driver->period_size /
- (double) driver->sample_rate) * 1e6;
- if (driver->engine->set_buffer_size(driver->engine,
- driver->period_size)) {
+ driver->period_usecs =
+ ((double)driver->period_size /
+ (double)driver->sample_rate) * 1e6;
+ if (driver->engine->set_buffer_size (driver->engine,
+ driver->period_size)) {
jack_error ("OSS: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
return -1;
}
}
}
- if (outfd >= 0 && infd != outfd)
- {
+ if (outfd >= 0 && infd != outfd) {
format = driver->format;
- if (ioctl(outfd, SNDCTL_DSP_SETFMT, &format) < 0)
- jack_error(
- "OSS: failed to set format for %s: %s@%i, errno=%d",
+ if (ioctl (outfd, SNDCTL_DSP_SETFMT, &format) < 0) {
+ jack_error (
+ "OSS: failed to set format for %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
+ }
channels = driver->playback_channels;
- if (ioctl(outfd, SNDCTL_DSP_CHANNELS, &channels) < 0)
- jack_error(
- "OSS: failed to set channels for %s: %s@%i, errno=%d",
+ if (ioctl (outfd, SNDCTL_DSP_CHANNELS, &channels) < 0) {
+ jack_error (
+ "OSS: failed to set channels for %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
+ }
samplerate = driver->sample_rate;
- if (ioctl(outfd, SNDCTL_DSP_SPEED, &samplerate) < 0)
- jack_error(
- "OSS: failed to set samplerate for %s: %s@%i, errno=%d",
+ if (ioctl (outfd, SNDCTL_DSP_SPEED, &samplerate) < 0) {
+ jack_error (
+ "OSS: failed to set samplerate for %s: %s@%i, errno=%d",
outdev, __FILE__, __LINE__, errno);
- jack_info("oss_driver: %s : 0x%x/%i/%i (%i)", outdev,
- format, channels, samplerate,
- get_fragment(outfd));
+ }
+ jack_info ("oss_driver: %s : 0x%x/%i/%i (%i)", outdev,
+ format, channels, samplerate,
+ get_fragment (outfd));
- period_size = get_fragment(outfd) / samplesize / channels;
+ period_size = get_fragment (outfd) / samplesize / channels;
if (period_size != driver->period_size &&
- !driver->ignorehwbuf)
- {
- jack_info("oss_driver: period size update: %u",
- period_size);
+ !driver->ignorehwbuf) {
+ jack_info ("oss_driver: period size update: %u",
+ period_size);
driver->period_size = period_size;
- driver->period_usecs =
- ((double) driver->period_size /
- (double) driver->sample_rate) * 1e6;
- if (driver->engine->set_buffer_size(driver->engine,
- driver->period_size)) {
+ driver->period_usecs =
+ ((double)driver->period_size /
+ (double)driver->sample_rate) * 1e6;
+ if (driver->engine->set_buffer_size (driver->engine,
+ driver->period_size)) {
jack_error ("OSS: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
return -1;
}
}
}
- if (driver->capture_channels > 0)
- {
- driver->indevbufsize = driver->period_size *
- driver->capture_channels * samplesize;
- driver->indevbuf = malloc(driver->indevbufsize);
- if (driver->indevbuf == NULL)
- {
- jack_error( "OSS: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ if (driver->capture_channels > 0) {
+ driver->indevbufsize = driver->period_size *
+ driver->capture_channels * samplesize;
+ driver->indevbuf = malloc (driver->indevbufsize);
+ if (driver->indevbuf == NULL) {
+ jack_error ( "OSS: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
- memset(driver->indevbuf, 0x00, driver->indevbufsize);
- }
- else
- {
+ memset (driver->indevbuf, 0x00, driver->indevbufsize);
+ } else {
driver->indevbufsize = 0;
driver->indevbuf = NULL;
}
- if (driver->playback_channels > 0)
- {
- driver->outdevbufsize = driver->period_size *
- driver->playback_channels * samplesize;
- driver->outdevbuf = malloc(driver->outdevbufsize);
- if (driver->outdevbuf == NULL)
- {
- jack_error("OSS: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ if (driver->playback_channels > 0) {
+ driver->outdevbufsize = driver->period_size *
+ driver->playback_channels * samplesize;
+ driver->outdevbuf = malloc (driver->outdevbufsize);
+ if (driver->outdevbuf == NULL) {
+ jack_error ("OSS: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
- memset(driver->outdevbuf, 0x00, driver->outdevbufsize);
- }
- else
- {
+ memset (driver->outdevbuf, 0x00, driver->outdevbufsize);
+ } else {
driver->outdevbufsize = 0;
driver->outdevbuf = NULL;
}
- jack_info("oss_driver: indevbuf %zd B, outdevbuf %zd B",
- driver->indevbufsize, driver->outdevbufsize);
-
- pthread_mutex_init(&driver->mutex_in, NULL);
- pthread_mutex_init(&driver->mutex_out, NULL);
-# ifdef USE_BARRIER
- puts("oss_driver: using barrier mode, (dual thread)");
- pthread_barrier_init(&driver->barrier, NULL, 2);
-# else
- puts("oss_driver: not using barrier mode, (single thread)");
-# endif
- sem_init(&driver->sem_start, 0, 0);
+ jack_info ("oss_driver: indevbuf %zd B, outdevbuf %zd B",
+ driver->indevbufsize, driver->outdevbufsize);
+
+ pthread_mutex_init (&driver->mutex_in, NULL);
+ pthread_mutex_init (&driver->mutex_out, NULL);
+# ifdef USE_BARRIER
+ puts ("oss_driver: using barrier mode, (dual thread)");
+ pthread_barrier_init (&driver->barrier, NULL, 2);
+# else
+ puts ("oss_driver: not using barrier mode, (single thread)");
+# endif
+ sem_init (&driver->sem_start, 0, 0);
driver->run = 1;
driver->threads = 0;
- if (infd >= 0)
- {
- if (jack_client_create_thread(NULL, &driver->thread_in,
- driver->engine->rtpriority,
- driver->engine->control->real_time,
- io_thread, driver) < 0)
- {
- jack_error("OSS: jack_client_create_thread() failed: %s@%i",
- __FILE__, __LINE__);
+ if (infd >= 0) {
+ if (jack_client_create_thread (NULL, &driver->thread_in,
+ driver->engine->rtpriority,
+ driver->engine->control->real_time,
+ io_thread, driver) < 0) {
+ jack_error ("OSS: jack_client_create_thread() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
driver->threads |= 1;
}
-# ifdef USE_BARRIER
- if (outfd >= 0)
- {
- if (jack_client_create_thread(NULL, &driver->thread_out,
- driver->engine->rtpriority,
- driver->engine->control->real_time,
- io_thread, driver) < 0)
- {
- jack_error("OSS: jack_client_create_thread() failed: %s@%i",
- __FILE__, __LINE__);
+# ifdef USE_BARRIER
+ if (outfd >= 0) {
+ if (jack_client_create_thread (NULL, &driver->thread_out,
+ driver->engine->rtpriority,
+ driver->engine->control->real_time,
+ io_thread, driver) < 0) {
+ jack_error ("OSS: jack_client_create_thread() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
driver->threads |= 2;
}
-# endif
+# endif
- if (driver->threads & 1) sem_post(&driver->sem_start);
- if (driver->threads & 2) sem_post(&driver->sem_start);
+ if (driver->threads & 1) {
+ sem_post (&driver->sem_start);
+ }
+ if (driver->threads & 2) {
+ sem_post (&driver->sem_start);
+ }
- driver->last_periodtime = driver->engine->get_microseconds();
+ driver->last_periodtime = driver->engine->get_microseconds ();
driver->next_periodtime = 0;
driver->iodelay = 0.0F;
@@ -775,50 +718,42 @@ static int oss_driver_stop (oss_driver_t *driver)
void *retval;
driver->run = 0;
- if (driver->threads & 1)
- {
- if (pthread_join(driver->thread_in, &retval) < 0)
- {
- jack_error("OSS: pthread_join() failed: %s@%i",
- __FILE__, __LINE__);
+ if (driver->threads & 1) {
+ if (pthread_join (driver->thread_in, &retval) < 0) {
+ jack_error ("OSS: pthread_join() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
}
- if (driver->threads & 2)
- {
- if (pthread_join(driver->thread_out, &retval) < 0)
- {
- jack_error("OSS: pthread_join() failed: %s@%i",
- __FILE__, __LINE__);
+ if (driver->threads & 2) {
+ if (pthread_join (driver->thread_out, &retval) < 0) {
+ jack_error ("OSS: pthread_join() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
}
- sem_destroy(&driver->sem_start);
-# ifdef USE_BARRIER
- pthread_barrier_destroy(&driver->barrier);
-# endif
- pthread_mutex_destroy(&driver->mutex_in);
- pthread_mutex_destroy(&driver->mutex_out);
-
- if (driver->outfd >= 0 && driver->outfd != driver->infd)
- {
- close(driver->outfd);
+ sem_destroy (&driver->sem_start);
+# ifdef USE_BARRIER
+ pthread_barrier_destroy (&driver->barrier);
+# endif
+ pthread_mutex_destroy (&driver->mutex_in);
+ pthread_mutex_destroy (&driver->mutex_out);
+
+ if (driver->outfd >= 0 && driver->outfd != driver->infd) {
+ close (driver->outfd);
driver->outfd = -1;
}
- if (driver->infd >= 0)
- {
- close(driver->infd);
+ if (driver->infd >= 0) {
+ close (driver->infd);
driver->infd = -1;
}
- if (driver->indevbuf != NULL)
- {
- free(driver->indevbuf);
+ if (driver->indevbuf != NULL) {
+ free (driver->indevbuf);
driver->indevbuf = NULL;
}
- if (driver->outdevbuf != NULL)
- {
- free(driver->outdevbuf);
+ if (driver->outdevbuf != NULL) {
+ free (driver->outdevbuf);
driver->outdevbuf = NULL;
}
@@ -833,37 +768,36 @@ static int oss_driver_read (oss_driver_t *driver, jack_nframes_t nframes)
JSList *node;
jack_port_t *port;
- if (!driver->run) return 0;
- if (nframes != driver->period_size)
- {
- jack_error(
+ if (!driver->run) {
+ return 0;
+ }
+ if (nframes != driver->period_size) {
+ jack_error (
"OSS: read failed nframes != period_size (%u/%u): %s@%i",
nframes, driver->period_size, __FILE__, __LINE__);
return -1;
}
- pthread_mutex_lock(&driver->mutex_in);
+ pthread_mutex_lock (&driver->mutex_in);
node = driver->capture_ports;
channel = 0;
- while (node != NULL)
- {
- port = (jack_port_t *) node->data;
-
- if (jack_port_connected(port))
- {
- portbuf = jack_port_get_buffer(port, nframes);
- copy_and_convert_in(portbuf, driver->indevbuf,
- nframes, channel,
- driver->capture_channels,
- driver->bits);
+ while (node != NULL) {
+ port = (jack_port_t*)node->data;
+
+ if (jack_port_connected (port)) {
+ portbuf = jack_port_get_buffer (port, nframes);
+ copy_and_convert_in (portbuf, driver->indevbuf,
+ nframes, channel,
+ driver->capture_channels,
+ driver->bits);
}
- node = jack_slist_next(node);
+ node = jack_slist_next (node);
channel++;
}
- pthread_mutex_unlock(&driver->mutex_in);
+ pthread_mutex_unlock (&driver->mutex_in);
return 0;
}
@@ -876,37 +810,36 @@ static int oss_driver_write (oss_driver_t *driver, jack_nframes_t nframes)
JSList *node;
jack_port_t *port;
- if (!driver->run) return 0;
- if (nframes != driver->period_size)
- {
- jack_error(
+ if (!driver->run) {
+ return 0;
+ }
+ if (nframes != driver->period_size) {
+ jack_error (
"OSS: write failed nframes != period_size (%u/%u): %s@%i",
nframes, driver->period_size, __FILE__, __LINE__);
return -1;
}
- pthread_mutex_lock(&driver->mutex_out);
+ pthread_mutex_lock (&driver->mutex_out);
node = driver->playback_ports;
channel = 0;
- while (node != NULL)
- {
- port = (jack_port_t *) node->data;
-
- if (jack_port_connected(port))
- {
- portbuf = jack_port_get_buffer(port, nframes);
- copy_and_convert_out(driver->outdevbuf, portbuf,
- nframes, channel,
- driver->playback_channels,
- driver->bits);
+ while (node != NULL) {
+ port = (jack_port_t*)node->data;
+
+ if (jack_port_connected (port)) {
+ portbuf = jack_port_get_buffer (port, nframes);
+ copy_and_convert_out (driver->outdevbuf, portbuf,
+ nframes, channel,
+ driver->playback_channels,
+ driver->bits);
}
- node = jack_slist_next(node);
+ node = jack_slist_next (node);
channel++;
}
- pthread_mutex_unlock(&driver->mutex_out);
+ pthread_mutex_unlock (&driver->mutex_out);
return 0;
}
@@ -914,13 +847,13 @@ static int oss_driver_write (oss_driver_t *driver, jack_nframes_t nframes)
static int oss_driver_null_cycle (oss_driver_t *driver, jack_nframes_t nframes)
{
- pthread_mutex_lock(&driver->mutex_in);
- memset(driver->indevbuf, 0x00, driver->indevbufsize);
- pthread_mutex_unlock(&driver->mutex_in);
+ pthread_mutex_lock (&driver->mutex_in);
+ memset (driver->indevbuf, 0x00, driver->indevbufsize);
+ pthread_mutex_unlock (&driver->mutex_in);
- pthread_mutex_lock(&driver->mutex_out);
- memset(driver->outdevbuf, 0x00, driver->outdevbufsize);
- pthread_mutex_unlock(&driver->mutex_out);
+ pthread_mutex_lock (&driver->mutex_out);
+ memset (driver->outdevbuf, 0x00, driver->outdevbufsize);
+ pthread_mutex_unlock (&driver->mutex_out);
return 0;
}
@@ -928,16 +861,16 @@ static int oss_driver_null_cycle (oss_driver_t *driver, jack_nframes_t nframes)
static int oss_driver_bufsize (oss_driver_t *driver, jack_nframes_t nframes)
{
- oss_driver_stop(driver);
+ oss_driver_stop (driver);
- set_period_size(driver, nframes);
- if (driver->engine->set_buffer_size(driver->engine, driver->period_size)) {
+ set_period_size (driver, nframes);
+ if (driver->engine->set_buffer_size (driver->engine, driver->period_size)) {
jack_error ("OSS: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
return -1;
}
- jack_info("oss_driver: period size update: %u", nframes);
+ jack_info ("oss_driver: period size update: %u", nframes);
- oss_driver_start(driver);
+ oss_driver_start (driver);
return 0;
}
@@ -949,17 +882,13 @@ static int oss_driver_bufsize (oss_driver_t *driver, jack_nframes_t nframes)
#ifdef USE_BARRIER
static inline void synchronize (oss_driver_t *driver)
{
- if (driver->threads == 3)
- {
- if (pthread_barrier_wait(&driver->barrier) ==
- PTHREAD_BARRIER_SERIAL_THREAD)
- {
- driver_cycle(driver);
+ if (driver->threads == 3) {
+ if (pthread_barrier_wait (&driver->barrier) ==
+ PTHREAD_BARRIER_SERIAL_THREAD) {
+ driver_cycle (driver);
}
- }
- else
- {
- driver_cycle(driver);
+ } else {
+ driver_cycle (driver);
}
}
#endif
@@ -970,113 +899,98 @@ static void *io_thread (void *param)
size_t localsize;
ssize_t io_res;
void *localbuf;
- oss_driver_t *driver = (oss_driver_t *) param;
+ oss_driver_t *driver = (oss_driver_t*)param;
- sem_wait(&driver->sem_start);
+ sem_wait (&driver->sem_start);
-# ifdef USE_BARRIER
- if (pthread_self() == driver->thread_in)
- {
+# ifdef USE_BARRIER
+ if (pthread_self () == driver->thread_in) {
localsize = driver->indevbufsize;
- localbuf = malloc(localsize);
- if (localbuf == NULL)
- {
- jack_error("OSS: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ localbuf = malloc (localsize);
+ if (localbuf == NULL) {
+ jack_error ("OSS: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return NULL;
}
- while (driver->run)
- {
- io_res = read(driver->infd, localbuf, localsize);
- if (io_res < (ssize_t) localsize)
- {
- jack_error(
+ while (driver->run) {
+ io_res = read (driver->infd, localbuf, localsize);
+ if (io_res < (ssize_t)localsize) {
+ jack_error (
"OSS: read() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res, localsize,
errno);
break;
}
- pthread_mutex_lock(&driver->mutex_in);
- memcpy(driver->indevbuf, localbuf, localsize);
- pthread_mutex_unlock(&driver->mutex_in);
+ pthread_mutex_lock (&driver->mutex_in);
+ memcpy (driver->indevbuf, localbuf, localsize);
+ pthread_mutex_unlock (&driver->mutex_in);
- synchronize(driver);
+ synchronize (driver);
}
- free(localbuf);
- }
- else if (pthread_self() == driver->thread_out)
- {
+ free (localbuf);
+ } else if (pthread_self () == driver->thread_out) {
localsize = driver->outdevbufsize;
- localbuf = malloc(localsize);
- if (localbuf == NULL)
- {
- jack_error("OSS: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ localbuf = malloc (localsize);
+ if (localbuf == NULL) {
+ jack_error ("OSS: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return NULL;
}
- if (driver->trigger)
- {
+ if (driver->trigger) {
/* don't care too much if this fails */
- memset(localbuf, 0x00, localsize);
- write(driver->outfd, localbuf, localsize);
- ioctl(driver->outfd, SNDCTL_DSP_SETTRIGGER, &driver->trigger);
+ memset (localbuf, 0x00, localsize);
+ write (driver->outfd, localbuf, localsize);
+ ioctl (driver->outfd, SNDCTL_DSP_SETTRIGGER, &driver->trigger);
}
- while (driver->run)
- {
- pthread_mutex_lock(&driver->mutex_out);
- memcpy(localbuf, driver->outdevbuf, localsize);
- pthread_mutex_unlock(&driver->mutex_out);
+ while (driver->run) {
+ pthread_mutex_lock (&driver->mutex_out);
+ memcpy (localbuf, driver->outdevbuf, localsize);
+ pthread_mutex_unlock (&driver->mutex_out);
- io_res = write(driver->outfd, localbuf, localsize);
- if (io_res < (ssize_t) localsize)
- {
- jack_error(
+ io_res = write (driver->outfd, localbuf, localsize);
+ if (io_res < (ssize_t)localsize) {
+ jack_error (
"OSS: write() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res, localsize,
errno);
break;
}
- synchronize(driver);
+ synchronize (driver);
}
- free(localbuf);
+ free (localbuf);
}
-# else
+# else
localsize = (driver->indevbufsize >= driver->outdevbufsize) ?
- driver->indevbufsize : driver->outdevbufsize;
- localbuf = malloc(localsize);
- if (localbuf == NULL)
- {
- jack_error("OSS: malloc() failed: %s@%i", __FILE__, __LINE__);
+ driver->indevbufsize : driver->outdevbufsize;
+ localbuf = malloc (localsize);
+ if (localbuf == NULL) {
+ jack_error ("OSS: malloc() failed: %s@%i", __FILE__, __LINE__);
return NULL;
}
- if (driver->trigger)
- {
+ if (driver->trigger) {
/* don't care too much if this fails */
- memset(localbuf, 0x00, localsize);
- write(driver->outfd, localbuf, driver->outdevbufsize);
- ioctl(driver->outfd, SNDCTL_DSP_SETTRIGGER, &driver->trigger);
+ memset (localbuf, 0x00, localsize);
+ write (driver->outfd, localbuf, driver->outdevbufsize);
+ ioctl (driver->outfd, SNDCTL_DSP_SETTRIGGER, &driver->trigger);
}
- while (driver->run)
- {
- if (driver->playback_channels > 0)
- {
- pthread_mutex_lock(&driver->mutex_out);
- memcpy(localbuf, driver->outdevbuf,
+ while (driver->run) {
+ if (driver->playback_channels > 0) {
+ pthread_mutex_lock (&driver->mutex_out);
+ memcpy (localbuf, driver->outdevbuf,
driver->outdevbufsize);
- pthread_mutex_unlock(&driver->mutex_out);
+ pthread_mutex_unlock (&driver->mutex_out);
- io_res = write(driver->outfd, localbuf,
- driver->outdevbufsize);
- if (io_res < (ssize_t) driver->outdevbufsize)
- {
- jack_error(
+ io_res = write (driver->outfd, localbuf,
+ driver->outdevbufsize);
+ if (io_res < (ssize_t)driver->outdevbufsize) {
+ jack_error (
"OSS: write() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res,
driver->outdevbufsize, errno);
@@ -1084,30 +998,28 @@ static void *io_thread (void *param)
}
}
- if (driver->capture_channels > 0)
- {
- io_res = read(driver->infd, localbuf,
- driver->indevbufsize);
- if (io_res < (ssize_t) driver->indevbufsize)
- {
- jack_error(
+ if (driver->capture_channels > 0) {
+ io_res = read (driver->infd, localbuf,
+ driver->indevbufsize);
+ if (io_res < (ssize_t)driver->indevbufsize) {
+ jack_error (
"OSS: read() failed: %s@%i, count=%d/%d, errno=%d",
__FILE__, __LINE__, io_res,
driver->indevbufsize, errno);
break;
}
- pthread_mutex_lock(&driver->mutex_in);
- memcpy(driver->indevbuf, localbuf,
+ pthread_mutex_lock (&driver->mutex_in);
+ memcpy (driver->indevbuf, localbuf,
driver->indevbufsize);
- pthread_mutex_unlock(&driver->mutex_in);
+ pthread_mutex_unlock (&driver->mutex_in);
}
- driver_cycle(driver);
+ driver_cycle (driver);
}
- free(localbuf);
-# endif
+ free (localbuf);
+# endif
return NULL;
}
@@ -1119,7 +1031,7 @@ static void *io_thread (void *param)
const char driver_client_name[] = "oss";
-void driver_finish (jack_driver_t *);
+void driver_finish(jack_driver_t *);
jack_driver_desc_t * driver_get_descriptor ()
@@ -1127,24 +1039,22 @@ jack_driver_desc_t * driver_get_descriptor ()
jack_driver_desc_t *desc;
jack_driver_param_desc_t *params;
- desc = (jack_driver_desc_t *) calloc(1, sizeof(jack_driver_desc_t));
- if (desc == NULL)
- {
- jack_error("oss_driver: calloc() failed: %s@%i, errno=%d",
- __FILE__, __LINE__, errno);
+ desc = (jack_driver_desc_t*)calloc (1, sizeof(jack_driver_desc_t));
+ if (desc == NULL) {
+ jack_error ("oss_driver: calloc() failed: %s@%i, errno=%d",
+ __FILE__, __LINE__, errno);
return NULL;
}
- strcpy(desc->name, driver_client_name);
+ strcpy (desc->name, driver_client_name);
desc->nparams = OSS_DRIVER_N_PARAMS;
- params = calloc(desc->nparams, sizeof(jack_driver_param_desc_t));
- if (params == NULL)
- {
- jack_error("oss_driver: calloc() failed: %s@%i, errno=%d",
- __FILE__, __LINE__, errno);
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
+ if (params == NULL) {
+ jack_error ("oss_driver: calloc() failed: %s@%i, errno=%d",
+ __FILE__, __LINE__, errno);
return NULL;
}
- memcpy(params, oss_params,
+ memcpy (params, oss_params,
desc->nparams * sizeof(jack_driver_param_desc_t));
desc->params = params;
@@ -1152,8 +1062,8 @@ jack_driver_desc_t * driver_get_descriptor ()
}
-jack_driver_t * driver_initialize (jack_client_t *client,
- JSList * params)
+jack_driver_t * driver_initialize (jack_client_t *client,
+ JSList * params)
{
int bits = OSS_DRIVER_DEF_BITS;
jack_nframes_t sample_rate = OSS_DRIVER_DEF_FS;
@@ -1167,25 +1077,24 @@ jack_driver_t * driver_initialize (jack_client_t *client,
const jack_driver_param_t *param;
oss_driver_t *driver;
- driver = (oss_driver_t *) malloc(sizeof(oss_driver_t));
- if (driver == NULL)
- {
- jack_error("OSS: malloc() failed: %s@%i, errno=%d",
- __FILE__, __LINE__, errno);
+ driver = (oss_driver_t*)malloc (sizeof(oss_driver_t));
+ if (driver == NULL) {
+ jack_error ("OSS: malloc() failed: %s@%i, errno=%d",
+ __FILE__, __LINE__, errno);
return NULL;
}
- memset(driver, 0x00, sizeof(oss_driver_t));
- jack_driver_init((jack_driver_t *) driver);
-
- driver->attach = (JackDriverAttachFunction) oss_driver_attach;
- driver->detach = (JackDriverDetachFunction) oss_driver_detach;
- driver->start = (JackDriverStartFunction) oss_driver_start;
- driver->stop = (JackDriverStopFunction) oss_driver_stop;
- driver->read = (JackDriverReadFunction) oss_driver_read;
- driver->write = (JackDriverWriteFunction) oss_driver_write;
- driver->null_cycle = (JackDriverNullCycleFunction)
- oss_driver_null_cycle;
- driver->bufsize = (JackDriverBufSizeFunction) oss_driver_bufsize;
+ memset (driver, 0x00, sizeof(oss_driver_t));
+ jack_driver_init ((jack_driver_t*)driver);
+
+ driver->attach = (JackDriverAttachFunction)oss_driver_attach;
+ driver->detach = (JackDriverDetachFunction)oss_driver_detach;
+ driver->start = (JackDriverStartFunction)oss_driver_start;
+ driver->stop = (JackDriverStopFunction)oss_driver_stop;
+ driver->read = (JackDriverReadFunction)oss_driver_read;
+ driver->write = (JackDriverWriteFunction)oss_driver_write;
+ driver->null_cycle = (JackDriverNullCycleFunction)
+ oss_driver_null_cycle;
+ driver->bufsize = (JackDriverBufSizeFunction)oss_driver_bufsize;
driver->indev = NULL;
driver->outdev = NULL;
@@ -1193,49 +1102,47 @@ jack_driver_t * driver_initialize (jack_client_t *client,
driver->trigger = 0;
pnode = params;
- while (pnode != NULL)
- {
- param = (const jack_driver_param_t *) pnode->data;
-
- switch (param->character)
- {
- case 'r':
- sample_rate = param->value.ui;
- break;
- case 'p':
- period_size = param->value.ui;
- break;
- case 'n':
- nperiods = param->value.ui;
- break;
- case 'w':
- bits = param->value.i;
- break;
- case 'i':
- capture_channels = param->value.ui;
- break;
- case 'o':
- playback_channels = param->value.ui;
- break;
- case 'C':
- driver->indev = strdup(param->value.str);
- break;
- case 'P':
- driver->outdev = strdup(param->value.str);
- break;
- case 'b':
- driver->ignorehwbuf = 1;
- break;
- case 'I':
- in_latency = param->value.ui;
- break;
- case 'O':
- out_latency = param->value.ui;
- break;
+ while (pnode != NULL) {
+ param = (const jack_driver_param_t*)pnode->data;
+
+ switch (param->character) {
+ case 'r':
+ sample_rate = param->value.ui;
+ break;
+ case 'p':
+ period_size = param->value.ui;
+ break;
+ case 'n':
+ nperiods = param->value.ui;
+ break;
+ case 'w':
+ bits = param->value.i;
+ break;
+ case 'i':
+ capture_channels = param->value.ui;
+ break;
+ case 'o':
+ playback_channels = param->value.ui;
+ break;
+ case 'C':
+ driver->indev = strdup (param->value.str);
+ break;
+ case 'P':
+ driver->outdev = strdup (param->value.str);
+ break;
+ case 'b':
+ driver->ignorehwbuf = 1;
+ break;
+ case 'I':
+ in_latency = param->value.ui;
+ break;
+ case 'O':
+ out_latency = param->value.ui;
+ break;
}
- pnode = jack_slist_next(pnode);
+ pnode = jack_slist_next (pnode);
}
-
+
driver->sample_rate = sample_rate;
driver->period_size = period_size;
driver->nperiods = nperiods;
@@ -1248,63 +1155,64 @@ jack_driver_t * driver_initialize (jack_client_t *client,
driver->finish = driver_finish;
- if (driver->indev == NULL)
- driver->indev = strdup(OSS_DRIVER_DEF_DEV);
- if (driver->outdev == NULL)
- driver->outdev = strdup(OSS_DRIVER_DEF_DEV);
+ if (driver->indev == NULL) {
+ driver->indev = strdup (OSS_DRIVER_DEF_DEV);
+ }
+ if (driver->outdev == NULL) {
+ driver->outdev = strdup (OSS_DRIVER_DEF_DEV);
+ }
driver->infd = -1;
driver->outfd = -1;
- switch (driver->bits)
- {
-# ifndef OSS_ENDIAN
-# ifdef __GNUC__
-# if (defined(__i386__) || defined(__alpha__) || defined(__arm__) || defined(__x86_64__) || (defined(__sh__) && !defined(__LITTLE_ENDIAN__)))
-# define OSS_LITTLE_ENDIAN 1234
-# define OSS_ENDIAN OSS_LITTLE_ENDIAN
-# else
-# define OSS_BIG_ENDIAN 4321
-# define OSS_ENDIAN OSS_BIG_ENDIAN
-# endif
-# else /* __GNUC__ */
-# if (defined(_AIX) || defined(AIX) || defined(sparc) || defined(__hppa) || defined(PPC) || defined(__powerpc__) && !defined(i386) && !defined(__i386) && !defined(__i386__))
-# define OSS_BIG_ENDIAN 4321
-# define OSS_ENDIAN OSS_BIG_ENDIAN
-# else
-# define OSS_LITTLE_ENDIAN 1234
-# define OSS_ENDIAN OSS_LITTLE_ENDIAN
-# endif
-# endif /* __GNUC__ */
-# endif /* OSS_ENDIAN */
-# if (OSS_ENDIAN == 1234)
- /* little-endian architectures */
- case 24: /* little-endian LSB aligned 24-bits in 32-bits integer */
- driver->format = 0x00008000;
- break;
- case 32: /* little-endian 32-bit integer */
- driver->format = 0x00001000;
- break;
- case 64: /* native-endian 64-bit float */
- driver->format = 0x00004000;
- break;
- case 16: /* little-endian 16-bit integer */
- default:
- driver->format = 0x00000010;
- break;
+ switch (driver->bits) {
+# ifndef OSS_ENDIAN
+# ifdef __GNUC__
+# if (defined(__i386__) || defined(__alpha__) || defined(__arm__) || defined(__x86_64__) || (defined(__sh__) && !defined(__LITTLE_ENDIAN__)))
+# define OSS_LITTLE_ENDIAN 1234
+# define OSS_ENDIAN OSS_LITTLE_ENDIAN
+# else
+# define OSS_BIG_ENDIAN 4321
+# define OSS_ENDIAN OSS_BIG_ENDIAN
+# endif
+# else /* __GNUC__ */
+# if (defined(_AIX) || defined(AIX) || defined(sparc) || defined(__hppa) || defined(PPC) || defined(__powerpc__) && !defined(i386) && !defined(__i386) && !defined(__i386__))
+# define OSS_BIG_ENDIAN 4321
+# define OSS_ENDIAN OSS_BIG_ENDIAN
+# else
+# define OSS_LITTLE_ENDIAN 1234
+# define OSS_ENDIAN OSS_LITTLE_ENDIAN
+# endif
+# endif /* __GNUC__ */
+# endif /* OSS_ENDIAN */
+# if (OSS_ENDIAN == 1234)
+ /* little-endian architectures */
+ case 24: /* little-endian LSB aligned 24-bits in 32-bits integer */
+ driver->format = 0x00008000;
+ break;
+ case 32: /* little-endian 32-bit integer */
+ driver->format = 0x00001000;
+ break;
+ case 64: /* native-endian 64-bit float */
+ driver->format = 0x00004000;
+ break;
+ case 16: /* little-endian 16-bit integer */
+ default:
+ driver->format = 0x00000010;
+ break;
/* big-endian architectures */
-# else
- case 24: /* big-endian LSB aligned 24-bits in 32-bits integer */
- break;
- driver->format = 0x00010000;
- case 32: /* big-endian 32-bit integer */
- driver->format = 0x00002000;
- break;
- case 64: /* native-endian 64-bit float */
- driver->format = 0x00004000;
- break;
- case 16: /* big-endian 16-bit integer */
- default:
- driver->format = 0x00000020;
-# endif
+# else
+ case 24: /* big-endian LSB aligned 24-bits in 32-bits integer */
+ break;
+ driver->format = 0x00010000;
+ case 32: /* big-endian 32-bit integer */
+ driver->format = 0x00002000;
+ break;
+ case 64: /* native-endian 64-bit float */
+ driver->format = 0x00004000;
+ break;
+ case 16: /* big-endian 16-bit integer */
+ default:
+ driver->format = 0x00000020;
+# endif
}
driver->indevbuf = driver->outdevbuf = NULL;
@@ -1315,19 +1223,21 @@ jack_driver_t * driver_initialize (jack_client_t *client,
driver->engine = NULL;
driver->client = client;
- return ((jack_driver_t *) driver);
+ return (jack_driver_t*)driver;
}
void driver_finish (jack_driver_t *driver)
{
- oss_driver_t *oss_driver = (oss_driver_t *) driver;
-
- oss_driver = (oss_driver_t *) driver;
- if (oss_driver->indev != NULL)
- free(oss_driver->indev);
- if (oss_driver->outdev != NULL)
- free(oss_driver->outdev);
- free(driver);
+ oss_driver_t *oss_driver = (oss_driver_t*)driver;
+
+ oss_driver = (oss_driver_t*)driver;
+ if (oss_driver->indev != NULL) {
+ free (oss_driver->indev);
+ }
+ if (oss_driver->outdev != NULL) {
+ free (oss_driver->outdev);
+ }
+ free (driver);
}
diff --git a/drivers/oss/oss_driver.h b/drivers/oss/oss_driver.h
index 5bdf12d..ace932f 100644
--- a/drivers/oss/oss_driver.h
+++ b/drivers/oss/oss_driver.h
@@ -1,24 +1,24 @@
/*
- OSS driver for Jack
- Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.net>
+ OSS driver for Jack
+ Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.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 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.
+ 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
-*/
+ */
#ifndef __JACK_OSS_DRIVER_H__
@@ -35,19 +35,18 @@
#include "driver.h"
-#define OSS_DRIVER_DEF_DEV "/dev/dsp"
-#define OSS_DRIVER_DEF_FS 48000
-#define OSS_DRIVER_DEF_BLKSIZE 1024
-#define OSS_DRIVER_DEF_NPERIODS 2
-#define OSS_DRIVER_DEF_BITS 16
-#define OSS_DRIVER_DEF_INS 2
-#define OSS_DRIVER_DEF_OUTS 2
+#define OSS_DRIVER_DEF_DEV "/dev/dsp"
+#define OSS_DRIVER_DEF_FS 48000
+#define OSS_DRIVER_DEF_BLKSIZE 1024
+#define OSS_DRIVER_DEF_NPERIODS 2
+#define OSS_DRIVER_DEF_BITS 16
+#define OSS_DRIVER_DEF_INS 2
+#define OSS_DRIVER_DEF_OUTS 2
typedef jack_default_audio_sample_t jack_sample_t;
-typedef struct _oss_driver
-{
+typedef struct _oss_driver {
JACK_DRIVER_DECL
jack_nframes_t sample_rate;
@@ -89,9 +88,9 @@ typedef struct _oss_driver
pthread_t thread_out;
pthread_mutex_t mutex_in;
pthread_mutex_t mutex_out;
-# ifdef USE_BARRIER
+# ifdef USE_BARRIER
pthread_barrier_t barrier;
-# endif
+# endif
sem_t sem_start;
} oss_driver_t;
diff --git a/drivers/portaudio/portaudio_driver.c b/drivers/portaudio/portaudio_driver.c
index f7b78bf..5735bea 100644
--- a/drivers/portaudio/portaudio_driver.c
+++ b/drivers/portaudio/portaudio_driver.c
@@ -18,24 +18,24 @@
Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France
grame@rd.grame.fr
-
+
02-09-03 : Modify jack port naming : add the name of the used driver
Add the -n option to load a specific driver using it's name
04-09-03 : Correct bug in -n option management : input and ouput have to be treated separately
08-09-03 : More robust driver loading code : new portaudio_load_default and portaudio_load_driver functions.
24-09-03 : Does not tries to load default device if the required one is not found, returns and error.
14-10-03 : After jack port name size extension, does not use fixed length for CoreAudio driver name anymore
- 09-01-04 : Handle different value for channel in and channel out (using -i and -o)
- 12-01-04 : Connect port names (inverse "in" and "out")
- 13-01-04 : Correct the length of jack port : use JACK_PORT_NAME_SIZE
- 22-03-04 : Remove jack_init_time, rename input and ouput ports using "capture" and "playback"
+ 09-01-04 : Handle different value for channel in and channel out (using -i and -o)
+ 12-01-04 : Connect port names (inverse "in" and "out")
+ 13-01-04 : Correct the length of jack port : use JACK_PORT_NAME_SIZE
+ 22-03-04 : Remove jack_init_time, rename input and ouput ports using "capture" and "playback"
10-11-04 : S. Letz: Add management of -I option for use with JackPilot.
- 17-11-04 : S. Letz: Better debug code.
- 03-02-05 : S. Letz: fix several driver detection bugs on OSX.
- 06-08-05 : S.Letz: Remove the "-I" parameter, change the semantic of "-n" parameter on OSX : -n (driver name) now correctly uses the PropertyDeviceUID
- (persistent accross reboot...) as the identifier for the used coreaudio driver.
+ 17-11-04 : S. Letz: Better debug code.
+ 03-02-05 : S. Letz: fix several driver detection bugs on OSX.
+ 06-08-05 : S.Letz: Remove the "-I" parameter, change the semantic of "-n" parameter on OSX : -n (driver name) now correctly uses the PropertyDeviceUID
+ (persistent accross reboot...) as the identifier for the used coreaudio driver.
-*/
+ */
#include <stdio.h>
#include <errno.h>
@@ -50,47 +50,49 @@
#include <CoreAudio/CoreAudio.h>
#include <CoreFoundation/CFString.h>
-static OSStatus get_device_name_from_id(AudioDeviceID id, char name[60])
+static OSStatus get_device_name_from_id (AudioDeviceID id, char name[60])
{
- UInt32 size = sizeof(char) * 60;
- OSStatus stat = AudioDeviceGetProperty(id, 0, false,
- kAudioDevicePropertyDeviceName,
- &size,
- &name[0]);
- return stat;
+ UInt32 size = sizeof(char) * 60;
+ OSStatus stat = AudioDeviceGetProperty (id, 0, false,
+ kAudioDevicePropertyDeviceName,
+ &size,
+ &name[0]);
+
+ return stat;
}
-static OSStatus get_device_id_from_num(int i, AudioDeviceID * id)
+static OSStatus get_device_id_from_num (int i, AudioDeviceID * id)
{
- OSStatus theStatus;
- UInt32 theSize;
- int nDevices;
- AudioDeviceID *theDeviceList;
-
- theStatus =
- AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices,
- &theSize, NULL);
- nDevices = theSize / sizeof(AudioDeviceID);
- theDeviceList =
- (AudioDeviceID *) malloc(nDevices * sizeof(AudioDeviceID));
- theStatus =
- AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &theSize,
- theDeviceList);
-
- *id = theDeviceList[i];
- return theStatus;
+ OSStatus theStatus;
+ UInt32 theSize;
+ int nDevices;
+ AudioDeviceID *theDeviceList;
+
+ theStatus =
+ AudioHardwareGetPropertyInfo (kAudioHardwarePropertyDevices,
+ &theSize, NULL);
+ nDevices = theSize / sizeof(AudioDeviceID);
+ theDeviceList =
+ (AudioDeviceID*)malloc (nDevices * sizeof(AudioDeviceID));
+ theStatus =
+ AudioHardwareGetProperty (kAudioHardwarePropertyDevices, &theSize,
+ theDeviceList);
+
+ *id = theDeviceList[i];
+ return theStatus;
}
-static OSStatus get_device_id_from_uid(char* UID, AudioDeviceID* id)
+static OSStatus get_device_id_from_uid (char* UID, AudioDeviceID* id)
{
UInt32 size = sizeof(AudioValueTranslation);
- CFStringRef inIUD = CFStringCreateWithCString(NULL, UID, CFStringGetSystemEncoding());
+ CFStringRef inIUD = CFStringCreateWithCString (NULL, UID, CFStringGetSystemEncoding ());
AudioValueTranslation value = { &inIUD, sizeof(CFStringRef), id, sizeof(AudioDeviceID) };
+
if (inIUD == NULL) {
return kAudioHardwareUnspecifiedError;
} else {
- OSStatus res = AudioHardwareGetProperty(kAudioHardwarePropertyDeviceForUID, &size, &value);
- CFRelease(inIUD);
+ OSStatus res = AudioHardwareGetProperty (kAudioHardwarePropertyDeviceForUID, &size, &value);
+ CFRelease (inIUD);
return res;
}
}
@@ -101,28 +103,28 @@ typedef unsigned int AudioDeviceID;
#define PRINTDEBUG 1
-void PALog(char *fmt, ...)
+void PALog (char *fmt, ...)
{
#ifdef PRINTDEBUG
- va_list ap;
- va_start(ap, fmt);
- fprintf(stderr, "JCA: ");
- vfprintf(stderr, fmt, ap);
- va_end(ap);
+ va_list ap;
+ va_start (ap, fmt);
+ fprintf (stderr, "JCA: ");
+ vfprintf (stderr, fmt, ap);
+ va_end (ap);
#endif
}
static int
-paCallback(void *inputBuffer, void *outputBuffer,
- unsigned long framesPerBuffer,
- PaTimestamp outTime, void *userData)
+paCallback (void *inputBuffer, void *outputBuffer,
+ unsigned long framesPerBuffer,
+ PaTimestamp outTime, void *userData)
{
portaudio_driver_t * driver = (portaudio_driver_t*)userData;
driver->inPortAudio = (float*)inputBuffer;
driver->outPortAudio = (float*)outputBuffer;
- driver->last_wait_ust = driver->engine->get_microseconds();
- return driver->engine->run_cycle(driver->engine, framesPerBuffer, 0);
+ driver->last_wait_ust = driver->engine->get_microseconds ();
+ return driver->engine->run_cycle (driver->engine, framesPerBuffer, 0);
}
static int
@@ -133,61 +135,61 @@ portaudio_driver_attach (portaudio_driver_t *driver, jack_engine_t *engine)
channel_t chn;
char buf[JACK_PORT_NAME_SIZE];
jack_latency_range_t range;
-
+
driver->engine = engine;
-
+
if (driver->engine->set_buffer_size (engine, driver->frames_per_cycle)) {
jack_error ("portaudio: cannot set engine buffer size to %d (check MIDI)", driver->frames_per_cycle);
return -1;
}
driver->engine->set_sample_rate (engine, driver->frame_rate);
-
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
+
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
/*
- if (driver->has_hw_monitoring) {
- port_flags |= JackPortCanMonitor;
- }
- */
+ if (driver->has_hw_monitoring) {
+ port_flags |= JackPortCanMonitor;
+ }
+ */
for (chn = 0; chn < driver->capture_nchannels; chn++) {
- //snprintf (buf, sizeof(buf) - 1, "%s:capture%lu", driver->driver_name, chn+1);
- snprintf (buf, sizeof(buf) - 1, "%s:out%lu", driver->driver_name, chn+1);
+ //snprintf (buf, sizeof(buf) - 1, "%s:capture%lu", driver->driver_name, chn+1);
+ snprintf (buf, sizeof(buf) - 1, "%s:out%lu", driver->driver_name, chn + 1);
- if ((port = jack_port_register (driver->client, buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0)) == NULL) {
- jack_error ("portaudio: cannot register port for %s", buf);
- break;
- }
+ if ((port = jack_port_register (driver->client, buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0)) == NULL) {
+ jack_error ("portaudio: cannot register port for %s", buf);
+ break;
+ }
- /* XXX fix this so that it can handle: systemic (external) latency
- */
+ /* XXX fix this so that it can handle: systemic (external) latency
+ */
- range.min = range.max = driver->frames_per_cycle;
- jack_port_set_latency_range (port, JackCaptureLatency, &range);
- driver->capture_ports = jack_slist_append (driver->capture_ports, port);
+ range.min = range.max = driver->frames_per_cycle;
+ jack_port_set_latency_range (port, JackCaptureLatency, &range);
+ driver->capture_ports = jack_slist_append (driver->capture_ports, port);
}
-
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
+
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
for (chn = 0; chn < driver->playback_nchannels; chn++) {
- //snprintf (buf, sizeof(buf) - 1, "%s:playback%lu", driver->driver_name, chn+1);
- snprintf (buf, sizeof(buf) - 1, "%s:in%lu", driver->driver_name, chn+1);
+ //snprintf (buf, sizeof(buf) - 1, "%s:playback%lu", driver->driver_name, chn+1);
+ snprintf (buf, sizeof(buf) - 1, "%s:in%lu", driver->driver_name, chn + 1);
- if ((port = jack_port_register (driver->client, buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0)) == NULL) {
- jack_error ("portaudio: cannot register port for %s", buf);
- break;
- }
-
- /* XXX fix this so that it can handle: systemic (external) latency
- */
-
- range.min = range.max = driver->frames_per_cycle;
- jack_port_set_latency_range (port, JackPlaybackLatency, &range);
- driver->playback_ports = jack_slist_append (driver->playback_ports, port);
+ if ((port = jack_port_register (driver->client, buf, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0)) == NULL) {
+ jack_error ("portaudio: cannot register port for %s", buf);
+ break;
+ }
+
+ /* XXX fix this so that it can handle: systemic (external) latency
+ */
+
+ range.min = range.max = driver->frames_per_cycle;
+ jack_port_set_latency_range (port, JackPlaybackLatency, &range);
+ driver->playback_ports = jack_slist_append (driver->playback_ports, port);
}
jack_activate (driver->client);
- return 0;
+ return 0;
}
static int
@@ -196,31 +198,29 @@ portaudio_driver_detach (portaudio_driver_t *driver, jack_engine_t *engine)
JSList *node;
if (driver->engine == 0) {
- return -1;
+ return -1;
}
- for (node = driver->capture_ports; node; node = jack_slist_next (node)) {
- jack_port_unregister (driver->client, ((jack_port_t *) node->data));
- }
+ for (node = driver->capture_ports; node; node = jack_slist_next (node))
+ jack_port_unregister (driver->client, ((jack_port_t*)node->data));
jack_slist_free (driver->capture_ports);
driver->capture_ports = 0;
-
- for (node = driver->playback_ports; node; node = jack_slist_next (node)) {
- jack_port_unregister (driver->client, ((jack_port_t *) node->data));
- }
+
+ for (node = driver->playback_ports; node; node = jack_slist_next (node))
+ jack_port_unregister (driver->client, ((jack_port_t*)node->data));
jack_slist_free (driver->playback_ports);
driver->playback_ports = 0;
-
+
driver->engine = 0;
- return 0;
+ return 0;
}
static int
portaudio_driver_null_cycle (portaudio_driver_t* driver, jack_nframes_t nframes)
{
- memset(driver->outPortAudio, 0, (driver->playback_nchannels * nframes * sizeof(float)));
+ memset (driver->outPortAudio, 0, (driver->playback_nchannels * nframes * sizeof(float)));
return 0;
}
@@ -234,22 +234,22 @@ portaudio_driver_read (portaudio_driver_t *driver, jack_nframes_t nframes)
int i;
for (chn = 0, node = driver->capture_ports; node; node = jack_slist_next (node), chn++) {
-
- port = (jack_port_t *)node->data;
-
- if (jack_port_connected (port) && (driver->inPortAudio != NULL)) {
- int channels = driver->capture_nchannels;
- float* in = driver->inPortAudio;
- buf = jack_port_get_buffer (port, nframes);
- for (i = 0; i< nframes; i++) buf[i] = in[channels*i+chn];
- }
+
+ port = (jack_port_t*)node->data;
+
+ if (jack_port_connected (port) && (driver->inPortAudio != NULL)) {
+ int channels = driver->capture_nchannels;
+ float* in = driver->inPortAudio;
+ buf = jack_port_get_buffer (port, nframes);
+ for (i = 0; i < nframes; i++) buf[i] = in[channels * i + chn];
+ }
}
-
+
driver->engine->transport_cycle_start (driver->engine,
- driver->engine->get_microseconds ());
+ driver->engine->get_microseconds ());
return 0;
-}
+}
static int
@@ -259,70 +259,72 @@ portaudio_driver_write (portaudio_driver_t *driver, jack_nframes_t nframes)
channel_t chn;
jack_port_t *port;
JSList *node;
- int i,bytes = nframes*sizeof(float);
-
+ int i, bytes = nframes * sizeof(float);
+
/* Clear in case of nothing is connected */
- memset(driver->outPortAudio, 0, driver->playback_nchannels*bytes);
-
+ memset (driver->outPortAudio, 0, driver->playback_nchannels * bytes);
+
for (chn = 0, node = driver->playback_ports; node; node = jack_slist_next (node), chn++) {
-
- port = (jack_port_t *)node->data;
-
- if (jack_port_connected (port) && (driver->outPortAudio != NULL)) {
- int channels = driver->playback_nchannels;
- float* out = driver->outPortAudio;
- buf = jack_port_get_buffer (port, nframes);
- for (i = 0; i< nframes; i++) out[channels*i+chn] = buf[i];
- }
+
+ port = (jack_port_t*)node->data;
+
+ if (jack_port_connected (port) && (driver->outPortAudio != NULL)) {
+ int channels = driver->playback_nchannels;
+ float* out = driver->outPortAudio;
+ buf = jack_port_get_buffer (port, nframes);
+ for (i = 0; i < nframes; i++) out[channels * i + chn] = buf[i];
+ }
}
-
+
return 0;
}
static int
portaudio_driver_audio_start (portaudio_driver_t *driver)
{
- PaError err = Pa_StartStream(driver->stream);
+ PaError err = Pa_StartStream (driver->stream);
+
return (err != paNoError) ? -1 : 0;
}
static int
portaudio_driver_audio_stop (portaudio_driver_t *driver)
{
- PaError err = Pa_StopStream(driver->stream);
+ PaError err = Pa_StopStream (driver->stream);
+
return (err != paNoError) ? -1 : 0;
}
static int
portaudio_driver_set_parameters (portaudio_driver_t* driver,
- jack_nframes_t nframes,
- jack_nframes_t rate)
+ jack_nframes_t nframes,
+ jack_nframes_t rate)
{
int capturing = driver->capturing;
int playing = driver->playing;
- int err = Pa_OpenStream(
+ int err = Pa_OpenStream (
&driver->stream,
- ((capturing) ? Pa_GetDefaultInputDeviceID() : paNoDevice),
- ((capturing) ? driver->capture_nchannels : 0),
- paFloat32, /* 32-bit float input */
+ ((capturing) ? Pa_GetDefaultInputDeviceID () : paNoDevice),
+ ((capturing) ? driver->capture_nchannels : 0),
+ paFloat32, /* 32-bit float input */
NULL,
- ((playing) ? Pa_GetDefaultOutputDeviceID() : paNoDevice),
- ((playing) ? driver->playback_nchannels : 0),
- paFloat32, /* 32-bit float output */
+ ((playing) ? Pa_GetDefaultOutputDeviceID () : paNoDevice),
+ ((playing) ? driver->playback_nchannels : 0),
+ paFloat32, /* 32-bit float output */
NULL,
- rate, /* sample rate */
- nframes, /* frames per buffer */
- 0, /* number of buffers = default min */
- paClipOff, /* we won't output out of
- * range samples so don't
- * bother clipping them */
+ rate, /* sample rate */
+ nframes, /* frames per buffer */
+ 0, /* number of buffers = default min */
+ paClipOff, /* we won't output out of
+ * range samples so don't
+ * bother clipping them */
paCallback,
driver);
-
+
if (err == paNoError) {
-
- driver->period_usecs = (((float) driver->frames_per_cycle)
+
+ driver->period_usecs = (((float)driver->frames_per_cycle)
/ driver->frame_rate) * 1000000.0f;
driver->frame_rate = rate;
driver->frames_per_cycle = nframes;
@@ -334,17 +336,17 @@ portaudio_driver_set_parameters (portaudio_driver_t* driver,
jack_error ("portaudio: cannot set engine buffer size to %d (check MIDI)", driver->frames_per_cycle);
return -1;
}
-
+
}
return 0;
- } else {
+ } else {
// JOQ: this driver is dead. How do we terminate it?
- Pa_Terminate();
- jack_error("Unable to set portaudio parameters");
- jack_error("Error number: %d", err);
- jack_error("Error message: %s", Pa_GetErrorText(err));
+ Pa_Terminate ();
+ jack_error ("Unable to set portaudio parameters");
+ jack_error ("Error number: %d", err);
+ jack_error ("Error message: %s", Pa_GetErrorText (err));
return EIO;
}
}
@@ -354,13 +356,13 @@ portaudio_driver_reset_parameters (portaudio_driver_t* driver,
jack_nframes_t nframes,
jack_nframes_t rate)
{
- if (!jack_power_of_two(nframes)) {
- jack_error("PA: frames must be a power of two "
- "(64, 512, 1024, ...)");
+ if (!jack_power_of_two (nframes)) {
+ jack_error ("PA: frames must be a power of two "
+ "(64, 512, 1024, ...)");
return EINVAL;
}
- Pa_CloseStream(driver->stream);
+ Pa_CloseStream (driver->stream);
return portaudio_driver_set_parameters (driver, nframes, rate);
}
@@ -391,166 +393,190 @@ portaudio_driver_bufsize (portaudio_driver_t* driver, jack_nframes_t nframes)
//== instance creation/destruction =============================================
-static int portaudio_load_default (portaudio_driver_t *driver,
- int numDevices,
- int capturing,
- int playing,
- int* inputDeviceID,
- int* outputDeviceID)
+static int portaudio_load_default (portaudio_driver_t *driver,
+ int numDevices,
+ int capturing,
+ int playing,
+ int* inputDeviceID,
+ int* outputDeviceID)
{
- const PaDeviceInfo *pdi;
- int i,j;
- int found = 0;
-
- PALog("Look for default driver\n");
-
- *inputDeviceID = Pa_GetDefaultInputDeviceID();
- *outputDeviceID = Pa_GetDefaultOutputDeviceID();
-
- for(i=0; i<numDevices; i++)
- {
- pdi = Pa_GetDeviceInfo(i);
- PALog("---------------------------------------------- #%d\n", i);
-
- if (i == Pa_GetDefaultInputDeviceID()) {
- driver->capture_nchannels = (capturing) ? pdi->maxInputChannels : 0;
- strcpy (driver->driver_name,pdi->name);
- found = 1;
- }
-
- if (i == Pa_GetDefaultOutputDeviceID()){
- driver->playback_nchannels = (playing) ? pdi->maxOutputChannels : 0;
- strcpy (driver->driver_name,pdi->name);
- found = 1;
- }
-
- PALog("\nName = %s\n", pdi->name);
- PALog("Max Inputs = %d ", pdi->maxInputChannels);
- PALog("Max Outputs = %d\n", pdi->maxOutputChannels);
- if( pdi->numSampleRates == -1 ){
- PALog("Sample Rate Range = %f to %f\n", pdi->sampleRates[0], pdi->sampleRates[1]);
- }else{
- PALog("Sample Rates =");
- for(j=0; j<pdi->numSampleRates; j++){
- PALog(" %8.2f,", pdi->sampleRates[j]);
- }
- PALog("\n");
- }
-
- PALog("Native Sample Formats = ");
- if (pdi->nativeSampleFormats & paInt8) PALog("paInt8, ");
- if (pdi->nativeSampleFormats & paUInt8) PALog("paUInt8, ");
- if (pdi->nativeSampleFormats & paInt16) PALog("paInt16, ");
- if (pdi->nativeSampleFormats & paInt32) PALog("paInt32, ");
- if (pdi->nativeSampleFormats & paFloat32) PALog("paFloat32, ");
- if (pdi->nativeSampleFormats & paInt24) PALog("paInt24, ");
- if (pdi->nativeSampleFormats & paPackedInt24) PALog("paPackedInt24, ");
- PALog("\n");
- }
-
- return found;
+ const PaDeviceInfo *pdi;
+ int i, j;
+ int found = 0;
+
+ PALog ("Look for default driver\n");
+
+ *inputDeviceID = Pa_GetDefaultInputDeviceID ();
+ *outputDeviceID = Pa_GetDefaultOutputDeviceID ();
+
+ for (i = 0; i < numDevices; i++) {
+ pdi = Pa_GetDeviceInfo (i);
+ PALog ("---------------------------------------------- #%d\n", i);
+
+ if (i == Pa_GetDefaultInputDeviceID ()) {
+ driver->capture_nchannels = (capturing) ? pdi->maxInputChannels : 0;
+ strcpy (driver->driver_name, pdi->name);
+ found = 1;
+ }
+
+ if (i == Pa_GetDefaultOutputDeviceID ()) {
+ driver->playback_nchannels = (playing) ? pdi->maxOutputChannels : 0;
+ strcpy (driver->driver_name, pdi->name);
+ found = 1;
+ }
+
+ PALog ("\nName = %s\n", pdi->name);
+ PALog ("Max Inputs = %d ", pdi->maxInputChannels);
+ PALog ("Max Outputs = %d\n", pdi->maxOutputChannels);
+ if ( pdi->numSampleRates == -1 ) {
+ PALog ("Sample Rate Range = %f to %f\n", pdi->sampleRates[0], pdi->sampleRates[1]);
+ } else {
+ PALog ("Sample Rates =");
+ for (j = 0; j < pdi->numSampleRates; j++)
+ PALog (" %8.2f,", pdi->sampleRates[j]);
+ PALog ("\n");
+ }
+
+ PALog ("Native Sample Formats = ");
+ if (pdi->nativeSampleFormats & paInt8) {
+ PALog ("paInt8, ");
+ }
+ if (pdi->nativeSampleFormats & paUInt8) {
+ PALog ("paUInt8, ");
+ }
+ if (pdi->nativeSampleFormats & paInt16) {
+ PALog ("paInt16, ");
+ }
+ if (pdi->nativeSampleFormats & paInt32) {
+ PALog ("paInt32, ");
+ }
+ if (pdi->nativeSampleFormats & paFloat32) {
+ PALog ("paFloat32, ");
+ }
+ if (pdi->nativeSampleFormats & paInt24) {
+ PALog ("paInt24, ");
+ }
+ if (pdi->nativeSampleFormats & paPackedInt24) {
+ PALog ("paPackedInt24, ");
+ }
+ PALog ("\n");
+ }
+
+ return found;
}
-static int portaudio_load_driver (portaudio_driver_t *driver,
- int numDevices,
- int capturing,
- int playing,
- int* inputDeviceID,
- int* outputDeviceID,
- char* driver_name)
+static int portaudio_load_driver (portaudio_driver_t *driver,
+ int numDevices,
+ int capturing,
+ int playing,
+ int* inputDeviceID,
+ int* outputDeviceID,
+ char* driver_name)
{
- const PaDeviceInfo *pdi;
- int found = 0;
- int i,j;
-
- PALog("Look for %s driver\n",driver_name);
-
- for(i=0; i<numDevices; i++)
- {
- pdi = Pa_GetDeviceInfo(i);
- PALog("---------------------------------------------- #%d\n", i);
-
+ const PaDeviceInfo *pdi;
+ int found = 0;
+ int i, j;
+
+ PALog ("Look for %s driver\n", driver_name);
+
+ for (i = 0; i < numDevices; i++) {
+ pdi = Pa_GetDeviceInfo (i);
+ PALog ("---------------------------------------------- #%d\n", i);
+
// compare the first character
if (strncmp (driver_name, pdi->name,
- JACK_DRIVER_PARAM_STRING_MAX) == 0) {
- if (pdi->maxInputChannels > 0) {
- *inputDeviceID = i;
- driver->capture_nchannels =
- (capturing) ? pdi->maxInputChannels : 0;
- strcpy(driver->driver_name,pdi->name);
- PALog("Found input driver = %s\n", driver_name);
- found = 1;
+ JACK_DRIVER_PARAM_STRING_MAX) == 0) {
+ if (pdi->maxInputChannels > 0) {
+ *inputDeviceID = i;
+ driver->capture_nchannels =
+ (capturing) ? pdi->maxInputChannels : 0;
+ strcpy (driver->driver_name, pdi->name);
+ PALog ("Found input driver = %s\n", driver_name);
+ found = 1;
+ }
+ if (pdi->maxOutputChannels > 0) {
+ *outputDeviceID = i;
+ driver->playback_nchannels =
+ (playing) ? pdi->maxOutputChannels : 0;
+ strcpy (driver->driver_name, pdi->name);
+ PALog ("Found output driver = %s\n", driver_name);
+ found = 1;
+ } else {
+ PALog ("Found driver without input or ouput = %s\n",
+ driver_name);
+ }
}
- if (pdi->maxOutputChannels > 0) {
- *outputDeviceID = i;
- driver->playback_nchannels =
- (playing) ? pdi->maxOutputChannels : 0;
- strcpy (driver->driver_name,pdi->name);
- PALog("Found output driver = %s\n", driver_name);
- found = 1;
+
+ PALog ("\nName = %s\n", pdi->name);
+ PALog ("Max Inputs = %d ", pdi->maxInputChannels);
+ PALog ("Max Outputs = %d\n", pdi->maxOutputChannels);
+ if ( pdi->numSampleRates == -1 ) {
+ PALog ("Sample Rate Range = %f to %f\n", pdi->sampleRates[0],
+ pdi->sampleRates[1]);
} else {
- PALog("Found driver without input or ouput = %s\n",
- driver_name);
- }
- }
-
- PALog("\nName = %s\n", pdi->name);
- PALog("Max Inputs = %d ", pdi->maxInputChannels);
- PALog("Max Outputs = %d\n", pdi->maxOutputChannels);
- if( pdi->numSampleRates == -1 ){
- PALog("Sample Rate Range = %f to %f\n", pdi->sampleRates[0],
- pdi->sampleRates[1]);
- }else{
- PALog("Sample Rates =");
- for(j=0; j<pdi->numSampleRates; j++){
- PALog(" %8.2f,", pdi->sampleRates[j]);
- }
- PALog("\n");
- }
-
- PALog("Native Sample Formats = ");
- if (pdi->nativeSampleFormats & paInt8) PALog("paInt8, ");
- if (pdi->nativeSampleFormats & paUInt8) PALog("paUInt8, ");
- if (pdi->nativeSampleFormats & paInt16) PALog("paInt16, ");
- if (pdi->nativeSampleFormats & paInt32) PALog("paInt32, ");
- if (pdi->nativeSampleFormats & paFloat32) PALog("paFloat32, ");
- if (pdi->nativeSampleFormats & paInt24) PALog("paInt24, ");
- if (pdi->nativeSampleFormats & paPackedInt24) PALog("paPackedInt24, ");
- PALog("\n");
- }
-
- return found;
+ PALog ("Sample Rates =");
+ for (j = 0; j < pdi->numSampleRates; j++)
+ PALog (" %8.2f,", pdi->sampleRates[j]);
+ PALog ("\n");
+ }
+
+ PALog ("Native Sample Formats = ");
+ if (pdi->nativeSampleFormats & paInt8) {
+ PALog ("paInt8, ");
+ }
+ if (pdi->nativeSampleFormats & paUInt8) {
+ PALog ("paUInt8, ");
+ }
+ if (pdi->nativeSampleFormats & paInt16) {
+ PALog ("paInt16, ");
+ }
+ if (pdi->nativeSampleFormats & paInt32) {
+ PALog ("paInt32, ");
+ }
+ if (pdi->nativeSampleFormats & paFloat32) {
+ PALog ("paFloat32, ");
+ }
+ if (pdi->nativeSampleFormats & paInt24) {
+ PALog ("paInt24, ");
+ }
+ if (pdi->nativeSampleFormats & paPackedInt24) {
+ PALog ("paPackedInt24, ");
+ }
+ PALog ("\n");
+ }
+
+ return found;
}
/** create a new driver instance
*/
static jack_driver_t *
-portaudio_driver_new (char *name,
- jack_client_t* client,
- jack_nframes_t frames_per_cycle,
- jack_nframes_t rate,
- int capturing,
- int playing,
- int chan_in,
- int chan_out,
- DitherAlgorithm dither,
- char* driver_name)
+portaudio_driver_new (char *name,
+ jack_client_t* client,
+ jack_nframes_t frames_per_cycle,
+ jack_nframes_t rate,
+ int capturing,
+ int playing,
+ int chan_in,
+ int chan_out,
+ DitherAlgorithm dither,
+ char* driver_name)
{
portaudio_driver_t *driver;
PaError err = paNoError;
int numDevices;
- int inputDeviceID,outputDeviceID;
+ int inputDeviceID, outputDeviceID;
int found;
-
- PALog("portaudio driver version : %d\n", kVersion);
- PALog("creating portaudio driver ... %" PRIu32 "|%" PRIu32 "\n",
- frames_per_cycle, rate);
- driver = (portaudio_driver_t *) calloc (1, sizeof (portaudio_driver_t));
+ PALog ("portaudio driver version : %d\n", kVersion);
+ PALog ("creating portaudio driver ... %" PRIu32 "|%" PRIu32 "\n",
+ frames_per_cycle, rate);
+
+ driver = (portaudio_driver_t*)calloc (1, sizeof(portaudio_driver_t));
- jack_driver_init ((jack_driver_t *) driver);
+ jack_driver_init ((jack_driver_t*)driver);
- if (!jack_power_of_two(frames_per_cycle)) {
+ if (!jack_power_of_two (frames_per_cycle)) {
jack_error ("PA: -p must be a power of two.");
goto error;
}
@@ -560,113 +586,123 @@ portaudio_driver_new (char *name,
driver->capturing = capturing;
driver->playing = playing;
- driver->attach = (JackDriverAttachFunction) portaudio_driver_attach;
- driver->detach = (JackDriverDetachFunction) portaudio_driver_detach;
- driver->read = (JackDriverReadFunction) portaudio_driver_read;
- driver->write = (JackDriverReadFunction) portaudio_driver_write;
- driver->null_cycle = (JackDriverNullCycleFunction) portaudio_driver_null_cycle;
- driver->bufsize = (JackDriverBufSizeFunction) portaudio_driver_bufsize;
- driver->start = (JackDriverStartFunction) portaudio_driver_audio_start;
- driver->stop = (JackDriverStopFunction) portaudio_driver_audio_stop;
+ driver->attach = (JackDriverAttachFunction)portaudio_driver_attach;
+ driver->detach = (JackDriverDetachFunction)portaudio_driver_detach;
+ driver->read = (JackDriverReadFunction)portaudio_driver_read;
+ driver->write = (JackDriverReadFunction)portaudio_driver_write;
+ driver->null_cycle = (JackDriverNullCycleFunction)portaudio_driver_null_cycle;
+ driver->bufsize = (JackDriverBufSizeFunction)portaudio_driver_bufsize;
+ driver->start = (JackDriverStartFunction)portaudio_driver_audio_start;
+ driver->stop = (JackDriverStopFunction)portaudio_driver_audio_stop;
driver->stream = NULL;
-#ifdef JACK_USE_MACH_THREADS
+#ifdef JACK_USE_MACH_THREADS
AudioDeviceID device_id;
if (driver_name) {
- if (get_device_id_from_uid(driver_name, &device_id) != noErr)
+ if (get_device_id_from_uid (driver_name, &device_id) != noErr) {
goto error;
- if (get_device_name_from_id(device_id, driver->driver_name) != noErr)
+ }
+ if (get_device_name_from_id (device_id, driver->driver_name) != noErr) {
goto error;
+ }
} else {
- if (get_device_id_from_num(0, &device_id) != noErr)
- goto error;
- if (get_device_name_from_id(device_id, driver->driver_name) != noErr)
+ if (get_device_id_from_num (0, &device_id) != noErr) {
+ goto error;
+ }
+ if (get_device_name_from_id (device_id, driver->driver_name) != noErr) {
goto error;
+ }
}
#endif
-
- err = Pa_Initialize();
- PALog("Pa_Initialize OK \n");
-
- PALog("Driver name required %s\n",driver->driver_name);
- numDevices = Pa_CountDevices();
-
- if( numDevices < 0 ){
- PALog("ERROR: Pa_CountDevices returned 0x%x\n", numDevices);
+
+ err = Pa_Initialize ();
+ PALog ("Pa_Initialize OK \n");
+
+ PALog ("Driver name required %s\n", driver->driver_name);
+ numDevices = Pa_CountDevices ();
+
+ if ( numDevices < 0 ) {
+ PALog ("ERROR: Pa_CountDevices returned 0x%x\n", numDevices);
err = numDevices;
goto error;
}
-
- PALog("Number of devices = %d\n", numDevices);
- if (strcmp(driver->driver_name,"") == 0) {
- found = portaudio_load_default(driver,numDevices,capturing,playing,&inputDeviceID,&outputDeviceID);
+ PALog ("Number of devices = %d\n", numDevices);
+
+ if (strcmp (driver->driver_name, "") == 0) {
+ found = portaudio_load_default (driver, numDevices, capturing, playing, &inputDeviceID, &outputDeviceID);
if (!found) {
- PALog("ERROR : default driver has not been found\n");
+ PALog ("ERROR : default driver has not been found\n");
err = paHostError;
goto error;
}
- }else{
- found = portaudio_load_driver(driver,numDevices,capturing,playing,&inputDeviceID,&outputDeviceID,driver->driver_name);
+ } else {
+ found = portaudio_load_driver (driver, numDevices, capturing, playing, &inputDeviceID, &outputDeviceID, driver->driver_name);
if (!found) {
- PALog("ERROR : driver %s has not been found \n",driver->driver_name);
- err = paHostError;
- goto error;
+ PALog ("ERROR : driver %s has not been found \n", driver->driver_name);
+ err = paHostError;
+ goto error;
}
}
- if (err != paNoError) goto error;
-
- PALog("Pa_GetDefaultOutputDeviceID() %ld\n", (long)Pa_GetDefaultOutputDeviceID());
- PALog("Pa_GetDefaultInputDeviceID() %ld\n", (long)Pa_GetDefaultInputDeviceID());
-
- PALog("--------------------------------------------------\n");
- PALog("CoreAudio driver %s will be loaded\n", driver->driver_name);
- PALog("inputDeviceID %ld\n", (long)inputDeviceID);
- PALog("outputDeviceID %ld\n", (long)outputDeviceID);
- PALog("driver->capture_nchannels %ld\n", driver->capture_nchannels);
- PALog("driver->playback_nchannels %ld\n", driver->playback_nchannels);
-
- PALog("chan_in, chan_out %ld %ld\n", (long)chan_in, (long)chan_out);
-
- if (chan_in > 0)
+ if (err != paNoError) {
+ goto error;
+ }
+
+ PALog ("Pa_GetDefaultOutputDeviceID() %ld\n", (long)Pa_GetDefaultOutputDeviceID ());
+ PALog ("Pa_GetDefaultInputDeviceID() %ld\n", (long)Pa_GetDefaultInputDeviceID ());
+
+ PALog ("--------------------------------------------------\n");
+ PALog ("CoreAudio driver %s will be loaded\n", driver->driver_name);
+ PALog ("inputDeviceID %ld\n", (long)inputDeviceID);
+ PALog ("outputDeviceID %ld\n", (long)outputDeviceID);
+ PALog ("driver->capture_nchannels %ld\n", driver->capture_nchannels);
+ PALog ("driver->playback_nchannels %ld\n", driver->playback_nchannels);
+
+ PALog ("chan_in, chan_out %ld %ld\n", (long)chan_in, (long)chan_out);
+
+ if (chan_in > 0) {
driver->capture_nchannels = (driver->capture_nchannels < chan_in) ? driver->capture_nchannels : chan_in;
-
- if (chan_out > 0)
+ }
+
+ if (chan_out > 0) {
driver->playback_nchannels = (driver->playback_nchannels < chan_out) ? driver->playback_nchannels : chan_out;
-
- PALog("driver->capture_nchannels %ld\n", driver->capture_nchannels);
- PALog("driver->playback_nchannels %ld\n", driver->playback_nchannels);
-
- err = Pa_OpenStream(&driver->stream,
- ((capturing && (driver->capture_nchannels > 0)) ? inputDeviceID : paNoDevice),
- ((capturing) ? driver->capture_nchannels : 0),
- paFloat32, // 32 bit floating point input
- NULL,
- ((playing && (driver->playback_nchannels > 0)) ? outputDeviceID : paNoDevice),
- ((playing) ? driver->playback_nchannels : 0),
- paFloat32, // 32 bit floating point output
- NULL,
- rate,
- frames_per_cycle, // frames per buffer
- 0, // number of buffers, if zero then use default minimum
- paClipOff, // we won't output out of range samples so don't bother clipping them
- paCallback,
- driver);
-
- if (err != paNoError) goto error;
-
- driver->client = client;
- driver->period_usecs = (((float) driver->frames_per_cycle) / driver->frame_rate) * 1000000.0f;
- return((jack_driver_t *) driver);
+ }
+
+ PALog ("driver->capture_nchannels %ld\n", driver->capture_nchannels);
+ PALog ("driver->playback_nchannels %ld\n", driver->playback_nchannels);
+
+ err = Pa_OpenStream (&driver->stream,
+ ((capturing && (driver->capture_nchannels > 0)) ? inputDeviceID : paNoDevice),
+ ((capturing) ? driver->capture_nchannels : 0),
+ paFloat32, // 32 bit floating point input
+ NULL,
+ ((playing && (driver->playback_nchannels > 0)) ? outputDeviceID : paNoDevice),
+ ((playing) ? driver->playback_nchannels : 0),
+ paFloat32, // 32 bit floating point output
+ NULL,
+ rate,
+ frames_per_cycle, // frames per buffer
+ 0, // number of buffers, if zero then use default minimum
+ paClipOff, // we won't output out of range samples so don't bother clipping them
+ paCallback,
+ driver);
+
+ if (err != paNoError) {
+ goto error;
+ }
+
+ driver->client = client;
+ driver->period_usecs = (((float)driver->frames_per_cycle) / driver->frame_rate) * 1000000.0f;
+ return (jack_driver_t*)driver;
error:
- Pa_Terminate();
- jack_error("An error occured while using the portaudio stream");
- jack_error("Error number: %d", err);
- jack_error("Error message: %s", Pa_GetErrorText(err));
- free(driver);
+ Pa_Terminate ();
+ jack_error ("An error occured while using the portaudio stream");
+ jack_error ("Error number: %d", err);
+ jack_error ("Error message: %s", Pa_GetErrorText (err));
+ free (driver);
return NULL;
}
@@ -676,9 +712,9 @@ static void
portaudio_driver_delete (portaudio_driver_t *driver)
{
/* Close PortAudio stream and terminate */
- Pa_CloseStream(driver->stream);
- Pa_Terminate();
- free(driver);
+ Pa_CloseStream (driver->stream);
+ Pa_Terminate ();
+ free (driver);
}
//== driver "plugin" interface =================================================
@@ -690,12 +726,13 @@ driver_get_descriptor ()
{
jack_driver_desc_t * desc;
unsigned int i;
- desc = calloc (1, sizeof (jack_driver_desc_t));
+
+ desc = calloc (1, sizeof(jack_driver_desc_t));
strcpy (desc->name, "portaudio");
desc->nparams = 10;
desc->params = calloc (desc->nparams,
- sizeof (jack_driver_param_desc_t));
+ sizeof(jack_driver_param_desc_t));
i = 0;
strcpy (desc->params[i].name, "channel");
@@ -704,7 +741,7 @@ driver_get_descriptor ()
desc->params[i].value.ui = 0;
strcpy (desc->params[i].short_desc, "Maximum number of channels");
strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
-
+
i++;
strcpy (desc->params[i].name, "channelin");
desc->params[i].character = 'i';
@@ -760,7 +797,7 @@ driver_get_descriptor ()
desc->params[i].value.ui = 1024U;
strcpy (desc->params[i].short_desc, "Frames per period");
strcpy (desc->params[i].long_desc, desc->params[i].short_desc);
-
+
i++;
strcpy (desc->params[i].name, "name");
desc->params[i].character = 'n';
@@ -781,8 +818,8 @@ driver_get_descriptor ()
" t : triangular\n"
" s : shaped\n"
" - : no dithering");
-
- return desc;
+
+ return desc;
}
const char driver_client_name[] = "portaudio";
@@ -802,42 +839,42 @@ driver_initialize (jack_client_t *client, const JSList * params)
const jack_driver_param_t * param;
char *name = NULL;
-#ifdef JACK_USE_MACH_THREADS
- get_device_id_from_num(0,&deviceID); // takes a default value (first device)
+#ifdef JACK_USE_MACH_THREADS
+ get_device_id_from_num (0, &deviceID); // takes a default value (first device)
#endif
-
+
for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
+ param = (const jack_driver_param_t*)node->data;
switch (param->character) {
-
+
case 'n':
- name = (char *) param->value.str;
- PALog("Driver name found %s\n",name);
+ name = (char*)param->value.str;
+ PALog ("Driver name found %s\n", name);
break;
-
+
case 'D':
capture = TRUE;
playback = TRUE;
break;
-
+
case 'c':
- chan_in = (int) param->value.ui;
- chan_out = (int) param->value.ui;
+ chan_in = (int)param->value.ui;
+ chan_out = (int)param->value.ui;
break;
-
+
case 'i':
- chan_in = (int) param->value.ui;
+ chan_in = (int)param->value.ui;
break;
-
+
case 'o':
- chan_out = (int) param->value.ui;
+ chan_out = (int)param->value.ui;
break;
-
+
case 'C':
capture = param->value.i;
break;
-
+
case 'P':
playback = param->value.i;
break;
@@ -845,25 +882,25 @@ driver_initialize (jack_client_t *client, const JSList * params)
case 'r':
srate = param->value.ui;
break;
-
+
case 'p':
- frames_per_interrupt = (unsigned int) param->value.ui;
+ frames_per_interrupt = (unsigned int)param->value.ui;
break;
-
+
case 'z':
- switch ((int) param->value.c) {
+ switch ((int)param->value.c) {
case '-':
dither = None;
break;
-
+
case 'r':
dither = Rectangular;
break;
-
+
case 's':
dither = Shaped;
break;
-
+
case 't':
default:
dither = Triangular;
@@ -887,6 +924,6 @@ driver_initialize (jack_client_t *client, const JSList * params)
void
driver_finish (jack_driver_t *driver)
{
- portaudio_driver_delete ((portaudio_driver_t *) driver);
+ portaudio_driver_delete ((portaudio_driver_t*)driver);
}
diff --git a/drivers/portaudio/portaudio_driver.h b/drivers/portaudio/portaudio_driver.h
index 55df853..778f4f6 100644
--- a/drivers/portaudio/portaudio_driver.h
+++ b/drivers/portaudio/portaudio_driver.h
@@ -14,10 +14,10 @@
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.
-
+
Grame Research Laboratory, 9, rue du Garet 69001 Lyon - France
grame@rd.grame.fr
-*/
+ */
#ifndef __jack_portaudio_driver_h__
#define __jack_portaudio_driver_h__
@@ -35,27 +35,27 @@
typedef struct {
- JACK_DRIVER_DECL
+ JACK_DRIVER_DECL
- struct _jack_engine *engine;
+ struct _jack_engine *engine;
- jack_nframes_t frame_rate;
- jack_nframes_t frames_per_cycle;
- unsigned long user_nperiods;
- int capturing;
- int playing;
+ jack_nframes_t frame_rate;
+ jack_nframes_t frames_per_cycle;
+ unsigned long user_nperiods;
+ int capturing;
+ int playing;
- channel_t playback_nchannels;
- channel_t capture_nchannels;
+ channel_t playback_nchannels;
+ channel_t capture_nchannels;
- jack_client_t *client;
- JSList *capture_ports;
- JSList *playback_ports;
+ jack_client_t *client;
+ JSList *capture_ports;
+ JSList *playback_ports;
- float *inPortAudio;
- float *outPortAudio;
- char driver_name[256];
- PortAudioStream* stream;
+ float *inPortAudio;
+ float *outPortAudio;
+ char driver_name[256];
+ PortAudioStream* stream;
} portaudio_driver_t;
diff --git a/drivers/sun/sun_driver.c b/drivers/sun/sun_driver.c
index 1d1af3e..accb620 100644
--- a/drivers/sun/sun_driver.c
+++ b/drivers/sun/sun_driver.c
@@ -1,27 +1,27 @@
/*
- Sun Audio API driver for Jack
- Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
- Based heavily on oss_driver.c which came with the following
- copyright notice.
+ Sun Audio API driver for Jack
+ Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
+ Based heavily on oss_driver.c which came with the following
+ copyright notice.
- Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.net>
+ Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.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 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.
+ 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
-*/
+ */
#include <config.h>
@@ -60,85 +60,74 @@
#include "sun_driver.h"
-#define SUN_DRIVER_N_PARAMS 11
+#define SUN_DRIVER_N_PARAMS 11
const static jack_driver_param_desc_t sun_params[SUN_DRIVER_N_PARAMS] = {
{ "rate",
- 'r',
- JackDriverParamUInt,
- { .ui = SUN_DRIVER_DEF_FS },
- "sample rate",
- "sample rate"
- },
+ 'r',
+ JackDriverParamUInt,
+ { .ui = SUN_DRIVER_DEF_FS },
+ "sample rate",
+ "sample rate" },
{ "period",
- 'p',
- JackDriverParamUInt,
- { .ui = SUN_DRIVER_DEF_BLKSIZE },
- "period size",
- "period size"
- },
+ 'p',
+ JackDriverParamUInt,
+ { .ui = SUN_DRIVER_DEF_BLKSIZE },
+ "period size",
+ "period size" },
{ "nperiods",
- 'n',
- JackDriverParamUInt,
- { .ui = SUN_DRIVER_DEF_NPERIODS },
- "number of periods in buffer",
- "number of periods in buffer"
- },
+ 'n',
+ JackDriverParamUInt,
+ { .ui = SUN_DRIVER_DEF_NPERIODS },
+ "number of periods in buffer",
+ "number of periods in buffer" },
{ "wordlength",
- 'w',
- JackDriverParamInt,
- { .i = SUN_DRIVER_DEF_BITS },
- "word length",
- "word length"
- },
+ 'w',
+ JackDriverParamInt,
+ { .i = SUN_DRIVER_DEF_BITS },
+ "word length",
+ "word length" },
{ "inchannels",
- 'i',
- JackDriverParamUInt,
- { .ui = SUN_DRIVER_DEF_INS },
- "capture channels",
- "capture channels"
- },
+ 'i',
+ JackDriverParamUInt,
+ { .ui = SUN_DRIVER_DEF_INS },
+ "capture channels",
+ "capture channels" },
{ "outchannels",
- 'o',
- JackDriverParamUInt,
- { .ui = SUN_DRIVER_DEF_OUTS },
- "playback channels",
- "playback channels"
- },
+ 'o',
+ JackDriverParamUInt,
+ { .ui = SUN_DRIVER_DEF_OUTS },
+ "playback channels",
+ "playback channels" },
{ "capture",
- 'C',
- JackDriverParamString,
- { .str = SUN_DRIVER_DEF_DEV },
- "input device",
- "input device"
- },
+ 'C',
+ JackDriverParamString,
+ { .str = SUN_DRIVER_DEF_DEV },
+ "input device",
+ "input device" },
{ "playback",
- 'P',
- JackDriverParamString,
- { .str = SUN_DRIVER_DEF_DEV },
- "output device",
- "output device"
- },
+ 'P',
+ JackDriverParamString,
+ { .str = SUN_DRIVER_DEF_DEV },
+ "output device",
+ "output device" },
{ "ignorehwbuf",
- 'b',
- JackDriverParamBool,
- { },
- "ignore hardware period size",
- "ignore hardware period size"
- },
+ 'b',
+ JackDriverParamBool,
+ { },
+ "ignore hardware period size",
+ "ignore hardware period size" },
{ "input latency",
- 'I',
- JackDriverParamUInt,
- { .ui = 0 },
- "system input latency",
- "system input latency"
- },
+ 'I',
+ JackDriverParamUInt,
+ { .ui = 0 },
+ "system input latency",
+ "system input latency" },
{ "output latency",
- 'O',
- JackDriverParamUInt,
- { .ui = 0 },
- "system output latency",
- "system output latency"
- }
+ 'O',
+ JackDriverParamUInt,
+ { .ui = 0 },
+ "system output latency",
+ "system output latency" }
};
@@ -150,9 +139,9 @@ set_period_size (sun_driver_t *driver, jack_nframes_t new_period_size)
{
driver->period_size = new_period_size;
- driver->period_usecs =
- ((double) driver->period_size /
- (double) driver->sample_rate) * 1e6;
+ driver->period_usecs =
+ ((double)driver->period_size /
+ (double)driver->sample_rate) * 1e6;
driver->last_wait_ust = 0;
driver->iodelay = 0.0F;
driver->poll_timeout = (int)(driver->period_usecs / 666);
@@ -167,23 +156,21 @@ sun_driver_write_silence (sun_driver_t *driver, jack_nframes_t nframes)
void *localbuf;
localsize = nframes * driver->sample_bytes * driver->playback_channels;
- localbuf = malloc(localsize);
- if (localbuf == NULL)
- {
- jack_error("sun_driver: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ localbuf = malloc (localsize);
+ if (localbuf == NULL) {
+ jack_error ("sun_driver: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return;
}
- bzero(localbuf, localsize);
- io_res = write(driver->outfd, localbuf, localsize);
- if (io_res < (ssize_t) localsize)
- {
- jack_error("sun_driver: write() failed: %s: "
- "count=%d/%d: %s@%i", strerror(errno), io_res,
- localsize, __FILE__, __LINE__);
+ bzero (localbuf, localsize);
+ io_res = write (driver->outfd, localbuf, localsize);
+ if (io_res < (ssize_t)localsize) {
+ jack_error ("sun_driver: write() failed: %s: "
+ "count=%d/%d: %s@%i", strerror (errno), io_res,
+ localsize, __FILE__, __LINE__);
}
- free(localbuf);
+ free (localbuf);
}
@@ -195,22 +182,20 @@ sun_driver_read_silence (sun_driver_t *driver, jack_nframes_t nframes)
void *localbuf;
localsize = nframes * driver->sample_bytes * driver->capture_channels;
- localbuf = malloc(localsize);
- if (localbuf == NULL)
- {
- jack_error("sun_driver: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ localbuf = malloc (localsize);
+ if (localbuf == NULL) {
+ jack_error ("sun_driver: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return;
}
- io_res = read(driver->infd, localbuf, localsize);
- if (io_res < (ssize_t) localsize)
- {
- jack_error("sun_driver: read() failed: %s: "
- "count=%d/%d: %s@%i", strerror(errno), io_res,
- localsize, __FILE__, __LINE__);
+ io_res = read (driver->infd, localbuf, localsize);
+ if (io_res < (ssize_t)localsize) {
+ jack_error ("sun_driver: read() failed: %s: "
+ "count=%d/%d: %s@%i", strerror (errno), io_res,
+ localsize, __FILE__, __LINE__);
}
- free(localbuf);
+ free (localbuf);
}
@@ -235,63 +220,60 @@ sun_driver_wait (sun_driver_t *driver, int *status, float *iodelay)
pfd[0].fd = driver->infd;
pfd[0].events = POLLIN;
- if (driver->infd >= 0)
+ if (driver->infd >= 0) {
need_capture = 1;
+ }
pfd[1].fd = driver->outfd;
pfd[1].events = POLLOUT;
- if (driver->outfd >= 0)
+ if (driver->outfd >= 0) {
need_playback = 1;
+ }
- poll_enter = driver->engine->get_microseconds();
- if (poll_enter > driver->poll_next)
- {
+ poll_enter = driver->engine->get_microseconds ();
+ if (poll_enter > driver->poll_next) {
/* late. don't count as wakeup delay. */
driver->poll_next = 0;
}
- while (need_capture || need_playback)
- {
- nfds = poll(pfd, 2, driver->poll_timeout);
+ while (need_capture || need_playback) {
+ nfds = poll (pfd, 2, driver->poll_timeout);
if ( nfds == -1 ||
- ((pfd[0].revents | pfd[1].revents) &
- (POLLERR | POLLHUP | POLLNVAL)) )
- {
- jack_error("sun_driver: poll() error: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ ((pfd[0].revents | pfd[1].revents) &
+ (POLLERR | POLLHUP | POLLNVAL)) ) {
+ jack_error ("sun_driver: poll() error: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
*status = -3;
return 0;
}
- if (nfds == 0)
- {
- jack_error("sun_driver: poll() timeout: %s@%i",
- __FILE__, __LINE__);
+ if (nfds == 0) {
+ jack_error ("sun_driver: poll() timeout: %s@%i",
+ __FILE__, __LINE__);
*status = -5;
return 0;
}
- if (need_capture && (pfd[0].revents & POLLIN))
- {
+ if (need_capture && (pfd[0].revents & POLLIN)) {
need_capture = 0;
pfd[0].fd = -1;
}
- if (need_playback && (pfd[1].revents & POLLOUT))
- {
+ if (need_playback && (pfd[1].revents & POLLOUT)) {
need_playback = 0;
pfd[1].fd = -1;
}
}
- poll_ret = driver->engine->get_microseconds();
+ poll_ret = driver->engine->get_microseconds ();
- if (driver->poll_next && poll_ret > driver->poll_next)
+ if (driver->poll_next && poll_ret > driver->poll_next) {
*iodelay = poll_ret - driver->poll_next;
+ }
driver->poll_last = poll_ret;
driver->poll_next = poll_ret + driver->period_usecs;
- driver->engine->transport_cycle_start(driver->engine, poll_ret);
+ driver->engine->transport_cycle_start (driver->engine, poll_ret);
#if defined(AUDIO_RERROR) && defined(AUDIO_PERROR)
@@ -304,95 +286,82 @@ sun_driver_wait (sun_driver_t *driver, int *status, float *iodelay)
* before we can write enough playback data to catch up.
*/
- if (driver->infd >= 0)
- {
- if (ioctl(driver->infd, AUDIO_RERROR, &capture_errors) < 0)
- {
- jack_error("sun_driver: AUDIO_RERROR failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ if (driver->infd >= 0) {
+ if (ioctl (driver->infd, AUDIO_RERROR, &capture_errors) < 0) {
+ jack_error ("sun_driver: AUDIO_RERROR failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
return 0;
}
capture_errors -= driver->capture_drops;
driver->capture_drops += capture_errors;
}
- if (capture_errors > 0)
- {
+ if (capture_errors > 0) {
delay = (capture_errors * 1000.0) / driver->sample_rate;
- printf("sun_driver: capture xrun of %d frames (%f msec)\n",
+ printf ("sun_driver: capture xrun of %d frames (%f msec)\n",
capture_errors, delay);
}
- if (driver->outfd >= 0)
- {
- if (ioctl(driver->outfd, AUDIO_PERROR, &playback_errors) < 0)
- {
- jack_error("sun_driver: AUDIO_PERROR failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ if (driver->outfd >= 0) {
+ if (ioctl (driver->outfd, AUDIO_PERROR, &playback_errors) < 0) {
+ jack_error ("sun_driver: AUDIO_PERROR failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
return 0;
}
playback_errors -= driver->playback_drops;
driver->playback_drops += playback_errors;
}
- if (playback_errors > 0)
- {
+ if (playback_errors > 0) {
delay = (playback_errors * 1000.0) / driver->sample_rate;
- printf("sun_driver: playback xrun of %d frames (%f msec)\n",
+ printf ("sun_driver: playback xrun of %d frames (%f msec)\n",
playback_errors, delay);
}
if ((driver->outfd >= 0 && driver->infd >= 0) &&
- (capture_errors || playback_errors))
- {
- if (ioctl(driver->infd, AUDIO_GETINFO, &auinfo) < 0)
- {
- jack_error("sun_driver: AUDIO_GETINFO failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ (capture_errors || playback_errors)) {
+ if (ioctl (driver->infd, AUDIO_GETINFO, &auinfo) < 0) {
+ jack_error ("sun_driver: AUDIO_GETINFO failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return 0;
}
capture_seek = auinfo.record.seek;
- if (driver->infd == driver->outfd)
+ if (driver->infd == driver->outfd) {
playback_seek = auinfo.play.seek;
- else
- {
- if (ioctl(driver->outfd, AUDIO_GETINFO, &auinfo) < 0)
- {
- jack_error("sun_driver: AUDIO_GETINFO failed: "
- "%s: %s@%i", strerror(errno),
- __FILE__, __LINE__);
+ } else {
+ if (ioctl (driver->outfd, AUDIO_GETINFO, &auinfo) < 0) {
+ jack_error ("sun_driver: AUDIO_GETINFO failed: "
+ "%s: %s@%i", strerror (errno),
+ __FILE__, __LINE__);
return 0;
}
playback_seek = auinfo.play.seek;
}
capture_seek /= driver->capture_channels *
- driver->sample_bytes;
+ driver->sample_bytes;
playback_seek /= driver->playback_channels *
- driver->sample_bytes;
+ driver->sample_bytes;
if (playback_seek == driver->period_size &&
- capture_seek == driver->period_size &&
- playback_errors)
- {
+ capture_seek == driver->period_size &&
+ playback_errors) {
/* normally, 1 period in each buffer is exactly
* what we want, but if there was an error then
* we effectively have 0 periods in the playback
* buffer, because the period in the buffer will
* be used to catch up to realtime.
*/
- printf("sun_driver: writing %d frames of silence "
+ printf ("sun_driver: writing %d frames of silence "
"to correct I/O sync\n", driver->period_size);
- sun_driver_write_silence(driver, driver->period_size);
- }
- else if (capture_errors && playback_errors)
- {
+ sun_driver_write_silence (driver, driver->period_size);
+ } else if (capture_errors && playback_errors) {
/* serious delay. we've lost the ability to
* write capture_errors frames to catch up on
* playback.
*/
- printf("sun_driver: writing %d frames of silence "
+ printf ("sun_driver: writing %d frames of silence "
"to correct I/O sync\n", capture_errors);
- sun_driver_write_silence(driver, capture_errors);
+ sun_driver_write_silence (driver, capture_errors);
}
}
@@ -416,22 +385,19 @@ sun_driver_run_cycle (sun_driver_t *driver)
nframes = sun_driver_wait (driver, &wait_status, &iodelay);
- if (wait_status < 0)
- {
- switch (wait_status)
- {
+ if (wait_status < 0) {
+ switch (wait_status) {
case -3:
/* poll() error */
return -1;
case -5:
/* poll() timeout */
- now = driver->engine->get_microseconds();
- if (now > driver->poll_next)
- {
+ now = driver->engine->get_microseconds ();
+ if (now > driver->poll_next) {
iodelay = now - driver->poll_next;
driver->poll_next = now + driver->period_usecs;
- driver->engine->delay(driver->engine, iodelay);
- printf("sun_driver: iodelay = %f\n", iodelay);
+ driver->engine->delay (driver->engine, iodelay);
+ printf ("sun_driver: iodelay = %f\n", iodelay);
}
break;
default:
@@ -440,116 +406,106 @@ sun_driver_run_cycle (sun_driver_t *driver)
}
}
- return driver->engine->run_cycle(driver->engine, nframes, iodelay);
+ return driver->engine->run_cycle (driver->engine, nframes, iodelay);
}
static void
-copy_and_convert_in (jack_sample_t *dst, void *src,
- size_t nframes, int channel, int chcount, int bits)
+copy_and_convert_in (jack_sample_t *dst, void *src,
+ size_t nframes, int channel, int chcount, int bits)
{
int srcidx;
int dstidx;
- signed short *s16src = (signed short *) src;
- signed int *s32src = (signed int *) src;
- double *f64src = (double *) src;
+ signed short *s16src = (signed short*)src;
+ signed int *s32src = (signed int*)src;
+ double *f64src = (double*)src;
jack_sample_t scale;
srcidx = channel;
- switch (bits)
- {
- case 16:
- scale = 1.0f / 0x7fff;
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t)
- s16src[srcidx] * scale;
- srcidx += chcount;
- }
- break;
- case 24:
- scale = 1.0f / 0x7fffff;
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t)
- s32src[srcidx] * scale;
- srcidx += chcount;
- }
- break;
- case 32:
- scale = 1.0f / 0x7fffffff;
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t)
- s32src[srcidx] * scale;
- srcidx += chcount;
- }
- break;
- case 64:
- for (dstidx = 0; dstidx < nframes; dstidx++)
- {
- dst[dstidx] = (jack_sample_t) f64src[srcidx];
- srcidx += chcount;
- }
- break;
+ switch (bits) {
+ case 16:
+ scale = 1.0f / 0x7fff;
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)
+ s16src[srcidx] * scale;
+ srcidx += chcount;
+ }
+ break;
+ case 24:
+ scale = 1.0f / 0x7fffff;
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)
+ s32src[srcidx] * scale;
+ srcidx += chcount;
+ }
+ break;
+ case 32:
+ scale = 1.0f / 0x7fffffff;
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)
+ s32src[srcidx] * scale;
+ srcidx += chcount;
+ }
+ break;
+ case 64:
+ for (dstidx = 0; dstidx < nframes; dstidx++) {
+ dst[dstidx] = (jack_sample_t)f64src[srcidx];
+ srcidx += chcount;
+ }
+ break;
}
}
static void
-copy_and_convert_out (void *dst, jack_sample_t *src,
- size_t nframes, int channel, int chcount, int bits)
+copy_and_convert_out (void *dst, jack_sample_t *src,
+ size_t nframes, int channel, int chcount, int bits)
{
int srcidx;
int dstidx;
- signed short *s16dst = (signed short *) dst;
- signed int *s32dst = (signed int *) dst;
- double *f64dst = (double *) dst;
+ signed short *s16dst = (signed short*)dst;
+ signed int *s32dst = (signed int*)dst;
+ double *f64dst = (double*)dst;
jack_sample_t scale;
dstidx = channel;
- switch (bits)
- {
- case 16:
- scale = 0x7fff;
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- s16dst[dstidx] = (signed short)
- (src[srcidx] >= 0.0f) ?
- (src[srcidx] * scale + 0.5f) :
- (src[srcidx] * scale - 0.5f);
- dstidx += chcount;
- }
- break;
- case 24:
- scale = 0x7fffff;
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- s32dst[dstidx] = (signed int)
- (src[srcidx] >= 0.0f) ?
- (src[srcidx] * scale + 0.5f) :
- (src[srcidx] * scale - 0.5f);
- dstidx += chcount;
- }
- break;
- case 32:
- scale = 0x7fffffff;
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- s32dst[dstidx] = (signed int)
- (src[srcidx] >= 0.0f) ?
- (src[srcidx] * scale + 0.5f) :
- (src[srcidx] * scale - 0.5f);
- dstidx += chcount;
- }
- break;
- case 64:
- for (srcidx = 0; srcidx < nframes; srcidx++)
- {
- f64dst[dstidx] = (double) src[srcidx];
- dstidx += chcount;
- }
- break;
+ switch (bits) {
+ case 16:
+ scale = 0x7fff;
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ s16dst[dstidx] = (signed short)
+ (src[srcidx] >= 0.0f) ?
+ (src[srcidx] * scale + 0.5f) :
+ (src[srcidx] * scale - 0.5f);
+ dstidx += chcount;
+ }
+ break;
+ case 24:
+ scale = 0x7fffff;
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ s32dst[dstidx] = (signed int)
+ (src[srcidx] >= 0.0f) ?
+ (src[srcidx] * scale + 0.5f) :
+ (src[srcidx] * scale - 0.5f);
+ dstidx += chcount;
+ }
+ break;
+ case 32:
+ scale = 0x7fffffff;
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ s32dst[dstidx] = (signed int)
+ (src[srcidx] >= 0.0f) ?
+ (src[srcidx] * scale + 0.5f) :
+ (src[srcidx] * scale - 0.5f);
+ dstidx += chcount;
+ }
+ break;
+ case 64:
+ for (srcidx = 0; srcidx < nframes; srcidx++) {
+ f64dst[dstidx] = (double)src[srcidx];
+ dstidx += chcount;
+ }
+ break;
}
}
@@ -566,53 +522,49 @@ sun_driver_attach (sun_driver_t *driver)
jack_port_t *port;
jack_latency_range_t range;
- if (driver->engine->set_buffer_size(driver->engine, driver->period_size)) {
+ if (driver->engine->set_buffer_size (driver->engine, driver->period_size)) {
jack_error ("sun_driver: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
return -1;
}
- driver->engine->set_sample_rate(driver->engine, driver->sample_rate);
-
- port_flags = JackPortIsOutput|JackPortIsPhysical|JackPortIsTerminal;
-
- for (channel = 0; channel < driver->capture_channels; channel++)
- {
- snprintf(channel_name, sizeof(channel_name),
- "capture_%u", channel + 1);
- port = jack_port_register(driver->client, channel_name,
- JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
- if (port == NULL)
- {
- jack_error("sun_driver: cannot register port for %s: "
- "%s@%i", channel_name, __FILE__, __LINE__);
+ driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
+
+ port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
+
+ for (channel = 0; channel < driver->capture_channels; channel++) {
+ snprintf (channel_name, sizeof(channel_name),
+ "capture_%u", channel + 1);
+ port = jack_port_register (driver->client, channel_name,
+ JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
+ if (port == NULL) {
+ jack_error ("sun_driver: cannot register port for %s: "
+ "%s@%i", channel_name, __FILE__, __LINE__);
break;
}
range.min = range.max = driver->period_size + driver->sys_in_latency;
- jack_port_set_latency_range(port, JackCaptureLatency, &range);
- driver->capture_ports =
- jack_slist_append(driver->capture_ports, port);
- }
-
- port_flags = JackPortIsInput|JackPortIsPhysical|JackPortIsTerminal;
- for (channel = 0; channel < driver->playback_channels; channel++)
- {
- snprintf(channel_name, sizeof(channel_name),
- "playback_%u", channel + 1);
- port = jack_port_register(driver->client, channel_name,
- JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
- if (port == NULL)
- {
- jack_error("sun_driver: cannot register port for "
- "%s: %s@%i", channel_name, __FILE__, __LINE__);
+ jack_port_set_latency_range (port, JackCaptureLatency, &range);
+ driver->capture_ports =
+ jack_slist_append (driver->capture_ports, port);
+ }
+
+ port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
+ for (channel = 0; channel < driver->playback_channels; channel++) {
+ snprintf (channel_name, sizeof(channel_name),
+ "playback_%u", channel + 1);
+ port = jack_port_register (driver->client, channel_name,
+ JACK_DEFAULT_AUDIO_TYPE, port_flags, 0);
+ if (port == NULL) {
+ jack_error ("sun_driver: cannot register port for "
+ "%s: %s@%i", channel_name, __FILE__, __LINE__);
break;
}
range.min = range.max = driver->period_size + driver->sys_out_latency;
- jack_port_set_latency_range(port, JackPlaybackLatency, &range);
+ jack_port_set_latency_range (port, JackPlaybackLatency, &range);
driver->playback_ports =
- jack_slist_append(driver->playback_ports, port);
+ jack_slist_append (driver->playback_ports, port);
}
- return jack_activate(driver->client);
+ return jack_activate (driver->client);
}
@@ -621,27 +573,26 @@ sun_driver_detach (sun_driver_t *driver)
{
JSList *node;
- if (driver->engine == NULL)
+ if (driver->engine == NULL) {
return 0;
+ }
node = driver->capture_ports;
- while (node != NULL)
- {
- jack_port_unregister(driver->client,
- ((jack_port_t *) node->data));
- node = jack_slist_next(node);
+ while (node != NULL) {
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
+ node = jack_slist_next (node);
}
- jack_slist_free(driver->capture_ports);
+ jack_slist_free (driver->capture_ports);
driver->capture_ports = NULL;
node = driver->playback_ports;
- while (node != NULL)
- {
- jack_port_unregister(driver->client,
- ((jack_port_t *) node->data));
- node = jack_slist_next(node);
+ while (node != NULL) {
+ jack_port_unregister (driver->client,
+ ((jack_port_t*)node->data));
+ node = jack_slist_next (node);
}
- jack_slist_free(driver->playback_ports);
+ jack_slist_free (driver->playback_ports);
driver->playback_ports = NULL;
return 0;
@@ -653,43 +604,38 @@ sun_driver_start (sun_driver_t *driver)
{
audio_info_t audio_if;
- if (driver->infd >= 0)
- {
+ if (driver->infd >= 0) {
#if defined(AUDIO_FLUSH)
- if (ioctl(driver->infd, AUDIO_FLUSH, NULL) < 0)
- {
- jack_error("sun_driver: capture flush failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ if (ioctl (driver->infd, AUDIO_FLUSH, NULL) < 0) {
+ jack_error ("sun_driver: capture flush failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
#endif
- AUDIO_INITINFO(&audio_if);
+ AUDIO_INITINFO (&audio_if);
audio_if.record.pause = 1;
- if (driver->outfd == driver->infd)
+ if (driver->outfd == driver->infd) {
audio_if.play.pause = 1;
- if (ioctl(driver->infd, AUDIO_SETINFO, &audio_if) < 0)
- {
- jack_error("sun_driver: pause capture failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ }
+ if (ioctl (driver->infd, AUDIO_SETINFO, &audio_if) < 0) {
+ jack_error ("sun_driver: pause capture failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
}
- if ((driver->outfd >= 0) && (driver->outfd != driver->infd))
- {
+ if ((driver->outfd >= 0) && (driver->outfd != driver->infd)) {
#if defined(AUDIO_FLUSH)
- if (ioctl(driver->outfd, AUDIO_FLUSH, NULL) < 0)
- {
- jack_error("sun_driver: playback flush failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ if (ioctl (driver->outfd, AUDIO_FLUSH, NULL) < 0) {
+ jack_error ("sun_driver: playback flush failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
#endif
- AUDIO_INITINFO(&audio_if);
+ AUDIO_INITINFO (&audio_if);
audio_if.play.pause = 1;
- if (ioctl(driver->outfd, AUDIO_SETINFO, &audio_if) < 0)
- {
- jack_error("sun_driver: pause playback failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ if (ioctl (driver->outfd, AUDIO_SETINFO, &audio_if) < 0) {
+ jack_error ("sun_driver: pause playback failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
}
@@ -697,39 +643,35 @@ sun_driver_start (sun_driver_t *driver)
/* AUDIO_FLUSH resets the counters these work with */
driver->playback_drops = driver->capture_drops = 0;
- if (driver->outfd >= 0)
- {
+ if (driver->outfd >= 0) {
/* "prime" the playback buffer. if we don't do this, we'll
* end up underrunning. it would get really ugly in duplex
* mode, for example, where we have to wait for a period to
* be available to read before we can write. also helps to
* keep constant latency from the beginning.
*/
- sun_driver_write_silence(driver,
- driver->nperiods * driver->period_size);
+ sun_driver_write_silence (driver,
+ driver->nperiods * driver->period_size);
}
- if (driver->infd >= 0)
- {
- AUDIO_INITINFO(&audio_if);
+ if (driver->infd >= 0) {
+ AUDIO_INITINFO (&audio_if);
audio_if.record.pause = 0;
- if (driver->outfd == driver->infd)
+ if (driver->outfd == driver->infd) {
audio_if.play.pause = 0;
- if (ioctl(driver->infd, AUDIO_SETINFO, &audio_if) < 0)
- {
- jack_error("sun_driver: start capture failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ }
+ if (ioctl (driver->infd, AUDIO_SETINFO, &audio_if) < 0) {
+ jack_error ("sun_driver: start capture failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
}
- if ((driver->outfd >= 0) && (driver->outfd != driver->infd))
- {
- AUDIO_INITINFO(&audio_if);
+ if ((driver->outfd >= 0) && (driver->outfd != driver->infd)) {
+ AUDIO_INITINFO (&audio_if);
audio_if.play.pause = 0;
- if (ioctl(driver->outfd, AUDIO_SETINFO, &audio_if) < 0)
- {
- jack_error("sun_driver: trigger playback failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ if (ioctl (driver->outfd, AUDIO_SETINFO, &audio_if) < 0) {
+ jack_error ("sun_driver: trigger playback failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
}
@@ -739,24 +681,27 @@ sun_driver_start (sun_driver_t *driver)
static int
-enc_equal(int a, int b)
+enc_equal (int a, int b)
{
- if (a == b)
+ if (a == b) {
return 1;
+ }
-#if defined(AUDIO_ENCODING_SLINEAR)
+#if defined(AUDIO_ENCODING_SLINEAR)
#if BYTE_ORDER == LITTLE_ENDIAN
if ((a == AUDIO_ENCODING_SLINEAR && b == AUDIO_ENCODING_SLINEAR_LE) ||
(a == AUDIO_ENCODING_SLINEAR_LE && b == AUDIO_ENCODING_SLINEAR) ||
(a == AUDIO_ENCODING_ULINEAR && b == AUDIO_ENCODING_ULINEAR_LE) ||
- (a == AUDIO_ENCODING_ULINEAR_LE && b == AUDIO_ENCODING_ULINEAR))
+ (a == AUDIO_ENCODING_ULINEAR_LE && b == AUDIO_ENCODING_ULINEAR)) {
return 1;
+ }
#elif BYTE_ORDER == BIG_ENDIAN
if ((a == AUDIO_ENCODING_SLINEAR && b == AUDIO_ENCODING_SLINEAR_BE) ||
(a == AUDIO_ENCODING_SLINEAR_BE && b == AUDIO_ENCODING_SLINEAR) ||
(a == AUDIO_ENCODING_ULINEAR && b == AUDIO_ENCODING_ULINEAR_BE) ||
- (a == AUDIO_ENCODING_ULINEAR_BE && b == AUDIO_ENCODING_ULINEAR))
+ (a == AUDIO_ENCODING_ULINEAR_BE && b == AUDIO_ENCODING_ULINEAR)) {
return 1;
+ }
#endif
#endif // AUDIO_ENCODING_SLINEAR
return 0;
@@ -778,75 +723,63 @@ sun_driver_set_parameters (sun_driver_t *driver)
driver->outdevbuf = NULL;
driver->sample_bytes = driver->bits / 8;
- if ((strcmp(indev, outdev) == 0) &&
- ((driver->capture_channels > 0) && (driver->playback_channels > 0)))
- {
- infd = outfd = open(indev, O_RDWR);
- if (infd < 0)
- {
- jack_error("sun_driver: failed to open duplex device "
- "%s: %s: %s@%i", indev, strerror(errno),
- __FILE__, __LINE__);
+ if ((strcmp (indev, outdev) == 0) &&
+ ((driver->capture_channels > 0) && (driver->playback_channels > 0))) {
+ infd = outfd = open (indev, O_RDWR);
+ if (infd < 0) {
+ jack_error ("sun_driver: failed to open duplex device "
+ "%s: %s: %s@%i", indev, strerror (errno),
+ __FILE__, __LINE__);
return -1;
}
#if defined(AUDIO_SETFD)
- if (ioctl(infd, AUDIO_SETFD, &s) < 0)
- {
- jack_error("sun_driver: failed to enable full duplex: "
- "%s: %s@%i", strerror(errno),
- __FILE__, __LINE__);
+ if (ioctl (infd, AUDIO_SETFD, &s) < 0) {
+ jack_error ("sun_driver: failed to enable full duplex: "
+ "%s: %s@%i", strerror (errno),
+ __FILE__, __LINE__);
return -1;
}
#endif
- }
- else
- {
- if (driver->capture_channels > 0)
- {
- infd = open(indev, O_RDONLY);
- if (infd < 0)
- {
- jack_error("sun_driver: failed to open input "
- "device %s: %s: %s@%i", indev,
- strerror(errno), __FILE__, __LINE__);
+ } else {
+ if (driver->capture_channels > 0) {
+ infd = open (indev, O_RDONLY);
+ if (infd < 0) {
+ jack_error ("sun_driver: failed to open input "
+ "device %s: %s: %s@%i", indev,
+ strerror (errno), __FILE__, __LINE__);
return -1;
}
}
- if (driver->playback_channels > 0)
- {
- outfd = open(outdev, O_WRONLY);
- if (outfd < 0)
- {
- jack_error("sun_driver: failed to open output "
- "device %s: %s: %s@%i", outdev,
- strerror(errno), __FILE__, __LINE__);
+ if (driver->playback_channels > 0) {
+ outfd = open (outdev, O_WRONLY);
+ if (outfd < 0) {
+ jack_error ("sun_driver: failed to open output "
+ "device %s: %s: %s@%i", outdev,
+ strerror (errno), __FILE__, __LINE__);
return -1;
}
}
}
- if (infd == -1 && outfd == -1)
- {
- jack_error("sun_driver: no device was opened: %s@%i",
- __FILE__, __LINE__);
+ if (infd == -1 && outfd == -1) {
+ jack_error ("sun_driver: no device was opened: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
driver->infd = infd;
driver->outfd = outfd;
-
- AUDIO_INITINFO(&audio_if_in);
- AUDIO_INITINFO(&audio_if_out);
- if (infd >= 0)
- {
+ AUDIO_INITINFO (&audio_if_in);
+ AUDIO_INITINFO (&audio_if_out);
+
+ if (infd >= 0) {
audio_if_in.record.encoding = driver->format;
audio_if_in.record.precision = driver->bits;
audio_if_in.record.channels = driver->capture_channels;
audio_if_in.record.sample_rate = driver->sample_rate;
audio_if_in.record.pause = 1;
}
- if (outfd >= 0)
- {
+ if (outfd >= 0) {
audio_if_out.play.encoding = driver->format;
audio_if_out.play.precision = driver->bits;
audio_if_out.play.channels = driver->playback_channels;
@@ -856,22 +789,27 @@ sun_driver_set_parameters (sun_driver_t *driver)
#if defined(__OpenBSD__) || defined(__NetBSD__)
#if defined(__OpenBSD__)
- if (driver->infd >= 0)
+ if (driver->infd >= 0) {
audio_if_in.record.block_size = driver->capture_channels *
- driver->period_size * driver->sample_bytes;
- if (driver->outfd >= 0)
+ driver->period_size * driver->sample_bytes;
+ }
+ if (driver->outfd >= 0) {
audio_if_out.play.block_size = driver->playback_channels *
- driver->period_size * driver->sample_bytes;
+ driver->period_size * driver->sample_bytes;
+ }
#else
- if (driver->infd >= 0)
+ if (driver->infd >= 0) {
audio_if_in.blocksize = driver->capture_channels *
- driver->period_size * driver->sample_bytes;
- if (driver->outfd >= 0)
+ driver->period_size * driver->sample_bytes;
+ }
+ if (driver->outfd >= 0) {
audio_if_out.blocksize = driver->playback_channels *
- driver->period_size * driver->sample_bytes;
+ driver->period_size * driver->sample_bytes;
+ }
#endif
- if (infd == outfd)
+ if (infd == outfd) {
audio_if_in.play = audio_if_out.play;
+ }
/* this only affects playback. the capture buffer is
* always the max (64k on OpenBSD).
@@ -882,177 +820,155 @@ sun_driver_set_parameters (sun_driver_t *driver)
* playback. that means, if we are N frames late, the next
* N frames written will be discarded. this keeps playback
* time from expanding with each underrun.
- */
- if (infd == outfd)
- {
+ */
+ if (infd == outfd) {
audio_if_in.mode = AUMODE_PLAY | AUMODE_RECORD;
- }
- else
- {
- if (infd >= 0)
+ } else {
+ if (infd >= 0) {
audio_if_in.mode = AUMODE_RECORD;
+ }
- if (outfd >= 0)
+ if (outfd >= 0) {
audio_if_out.mode = AUMODE_PLAY;
+ }
}
#endif // OpenBSD || NetBSD
- if (infd >= 0)
- {
- if (ioctl(infd, AUDIO_SETINFO, &audio_if_in) < 0)
- {
- jack_error("sun_driver: failed to set parameters for "
- "%s: %s: %s@%i", indev, strerror(errno),
- __FILE__, __LINE__);
+ if (infd >= 0) {
+ if (ioctl (infd, AUDIO_SETINFO, &audio_if_in) < 0) {
+ jack_error ("sun_driver: failed to set parameters for "
+ "%s: %s: %s@%i", indev, strerror (errno),
+ __FILE__, __LINE__);
return -1;
}
}
- if (outfd >= 0 && outfd != infd)
- {
- if (ioctl(outfd, AUDIO_SETINFO, &audio_if_out) < 0)
- {
- jack_error("sun_driver: failed to set parameters for "
- "%s: %s: %s@%i", outdev, strerror(errno),
- __FILE__, __LINE__);
+ if (outfd >= 0 && outfd != infd) {
+ if (ioctl (outfd, AUDIO_SETINFO, &audio_if_out) < 0) {
+ jack_error ("sun_driver: failed to set parameters for "
+ "%s: %s: %s@%i", outdev, strerror (errno),
+ __FILE__, __LINE__);
return -1;
}
}
- if (infd >= 0)
- {
- if (ioctl(infd, AUDIO_GETINFO, &audio_if_in) < 0)
- {
- jack_error("sun_driver: AUDIO_GETINFO failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ if (infd >= 0) {
+ if (ioctl (infd, AUDIO_GETINFO, &audio_if_in) < 0) {
+ jack_error ("sun_driver: AUDIO_GETINFO failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
- if (!enc_equal(audio_if_in.record.encoding, driver->format) ||
+ if (!enc_equal (audio_if_in.record.encoding, driver->format) ||
audio_if_in.record.precision != driver->bits ||
audio_if_in.record.channels != driver->capture_channels ||
- audio_if_in.record.sample_rate != driver->sample_rate)
- {
- jack_error("sun_driver: setting capture parameters "
- "failed: %s@%i", __FILE__, __LINE__);
+ audio_if_in.record.sample_rate != driver->sample_rate) {
+ jack_error ("sun_driver: setting capture parameters "
+ "failed: %s@%i", __FILE__, __LINE__);
return -1;
}
#if defined(__OpenBSD__)
cap_period = audio_if_in.record.block_size /
- driver->capture_channels / driver->sample_bytes;
+ driver->capture_channels / driver->sample_bytes;
#elif defined(__NetBSD__)
cap_period = audio_if_in.blocksize /
- driver->capture_channels / driver->sample_bytes;
+ driver->capture_channels / driver->sample_bytes;
#else
/* how is this done on Solaris? */
cap_period = driver->period_size;
#endif
}
- if (outfd >= 0)
- {
- if (outfd == infd)
- {
+ if (outfd >= 0) {
+ if (outfd == infd) {
audio_if_out.play = audio_if_in.play;
- }
- else
- {
- if (ioctl(outfd, AUDIO_GETINFO, &audio_if_out) < 0)
- {
- jack_error("sun_driver: AUDIO_GETINFO failed: "
- "%s: %s@%i", strerror(errno),
- __FILE__, __LINE__);
+ } else {
+ if (ioctl (outfd, AUDIO_GETINFO, &audio_if_out) < 0) {
+ jack_error ("sun_driver: AUDIO_GETINFO failed: "
+ "%s: %s@%i", strerror (errno),
+ __FILE__, __LINE__);
return -1;
}
}
- if (!enc_equal(audio_if_out.play.encoding, driver->format) ||
+ if (!enc_equal (audio_if_out.play.encoding, driver->format) ||
audio_if_out.play.precision != driver->bits ||
audio_if_out.play.channels != driver->playback_channels ||
- audio_if_out.play.sample_rate != driver->sample_rate)
- {
- jack_error("sun_driver: playback settings failed: "
- "%s@%i", __FILE__, __LINE__);
+ audio_if_out.play.sample_rate != driver->sample_rate) {
+ jack_error ("sun_driver: playback settings failed: "
+ "%s@%i", __FILE__, __LINE__);
return -1;
}
#if defined(__OpenBSD__)
play_period = audio_if_out.play.block_size /
- driver->playback_channels / driver->sample_bytes;
+ driver->playback_channels / driver->sample_bytes;
#elif defined(__NetBSD__)
play_period = audio_if_out.blocksize /
- driver->playback_channels / driver->sample_bytes;
+ driver->playback_channels / driver->sample_bytes;
#else
/* how is this done on Solaris? */
play_period = driver->period_size;
#endif
}
- if (infd >= 0 && outfd >= 0 && play_period != cap_period)
- {
- jack_error("sun_driver: play and capture periods differ: "
- "%s@%i", __FILE__, __LINE__);
+ if (infd >= 0 && outfd >= 0 && play_period != cap_period) {
+ jack_error ("sun_driver: play and capture periods differ: "
+ "%s@%i", __FILE__, __LINE__);
return -1;
}
- if (infd >= 0)
+ if (infd >= 0) {
period_size = cap_period;
- else if (outfd >= 0)
+ } else if (outfd >= 0) {
period_size = play_period;
+ }
- if (period_size != 0 && period_size != driver->period_size &&
- !driver->ignorehwbuf)
- {
- printf("sun_driver: period size update: %u\n", period_size);
+ if (period_size != 0 && period_size != driver->period_size &&
+ !driver->ignorehwbuf) {
+ printf ("sun_driver: period size update: %u\n", period_size);
set_period_size (driver, period_size);
- if (driver->engine)
- if (driver->engine->set_buffer_size(driver->engine,
- driver->period_size)) {
+ if (driver->engine) {
+ if (driver->engine->set_buffer_size (driver->engine,
+ driver->period_size)) {
jack_error ("sun_driver: cannot set engine buffer size to %d (check MIDI)", driver->period_size);
return -1;
}
+ }
}
- if (driver->infd >= 0 && driver->capture_channels > 0)
- {
- driver->indevbufsize = driver->period_size *
- driver->capture_channels * driver->sample_bytes;
- driver->indevbuf = malloc(driver->indevbufsize);
- if (driver->indevbuf == NULL)
- {
- jack_error( "sun_driver: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ if (driver->infd >= 0 && driver->capture_channels > 0) {
+ driver->indevbufsize = driver->period_size *
+ driver->capture_channels * driver->sample_bytes;
+ driver->indevbuf = malloc (driver->indevbufsize);
+ if (driver->indevbuf == NULL) {
+ jack_error ( "sun_driver: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
- bzero(driver->indevbuf, driver->indevbufsize);
- }
- else
- {
+ bzero (driver->indevbuf, driver->indevbufsize);
+ } else {
driver->indevbufsize = 0;
driver->indevbuf = NULL;
}
- if (driver->outfd >= 0 && driver->playback_channels > 0)
- {
- driver->outdevbufsize = driver->period_size *
- driver->playback_channels * driver->sample_bytes;
- driver->outdevbuf = malloc(driver->outdevbufsize);
- if (driver->outdevbuf == NULL)
- {
- jack_error("sun_driver: malloc() failed: %s@%i",
- __FILE__, __LINE__);
+ if (driver->outfd >= 0 && driver->playback_channels > 0) {
+ driver->outdevbufsize = driver->period_size *
+ driver->playback_channels * driver->sample_bytes;
+ driver->outdevbuf = malloc (driver->outdevbufsize);
+ if (driver->outdevbuf == NULL) {
+ jack_error ("sun_driver: malloc() failed: %s@%i",
+ __FILE__, __LINE__);
return -1;
}
- bzero(driver->outdevbuf, driver->outdevbufsize);
- }
- else
- {
+ bzero (driver->outdevbuf, driver->outdevbufsize);
+ } else {
driver->outdevbufsize = 0;
driver->outdevbuf = NULL;
}
- printf("sun_driver: indevbuf %zd B, outdevbuf %zd B\n",
+ printf ("sun_driver: indevbuf %zd B, outdevbuf %zd B\n",
driver->indevbufsize, driver->outdevbufsize);
return 0;
@@ -1064,28 +980,25 @@ sun_driver_stop (sun_driver_t *driver)
{
audio_info_t audio_if;
- if (driver->infd >= 0)
- {
- AUDIO_INITINFO(&audio_if);
+ if (driver->infd >= 0) {
+ AUDIO_INITINFO (&audio_if);
audio_if.record.pause = 1;
- if (driver->outfd == driver->infd)
+ if (driver->outfd == driver->infd) {
audio_if.play.pause = 1;
- if (ioctl(driver->infd, AUDIO_SETINFO, &audio_if) < 0)
- {
- jack_error("sun_driver: capture pause failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ }
+ if (ioctl (driver->infd, AUDIO_SETINFO, &audio_if) < 0) {
+ jack_error ("sun_driver: capture pause failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
}
- if ((driver->outfd >= 0) && (driver->outfd != driver->infd))
- {
- AUDIO_INITINFO(&audio_if);
+ if ((driver->outfd >= 0) && (driver->outfd != driver->infd)) {
+ AUDIO_INITINFO (&audio_if);
audio_if.play.pause = 1;
- if (ioctl(driver->outfd, AUDIO_SETINFO, &audio_if) < 0)
- {
- jack_error("sun_driver: playback pause failed: %s: "
- "%s@%i", strerror(errno), __FILE__, __LINE__);
+ if (ioctl (driver->outfd, AUDIO_SETINFO, &audio_if) < 0) {
+ jack_error ("sun_driver: playback pause failed: %s: "
+ "%s@%i", strerror (errno), __FILE__, __LINE__);
return -1;
}
}
@@ -1104,49 +1017,45 @@ sun_driver_read (sun_driver_t *driver, jack_nframes_t nframes)
JSList *node;
jack_port_t *port;
- if (driver->engine->freewheeling || driver->infd < 0)
+ if (driver->engine->freewheeling || driver->infd < 0) {
return 0;
+ }
- if (nframes > driver->period_size)
- {
- jack_error("sun_driver: read failed: nframes > period_size: "
- "(%u/%u): %s@%i", nframes, driver->period_size,
- __FILE__, __LINE__);
+ if (nframes > driver->period_size) {
+ jack_error ("sun_driver: read failed: nframes > period_size: "
+ "(%u/%u): %s@%i", nframes, driver->period_size,
+ __FILE__, __LINE__);
return -1;
}
node = driver->capture_ports;
channel = 0;
- while (node != NULL)
- {
- port = (jack_port_t *) node->data;
-
- if (jack_port_connected(port))
- {
- portbuf = jack_port_get_buffer(port, nframes);
- copy_and_convert_in(portbuf, driver->indevbuf,
- nframes, channel,
- driver->capture_channels,
- driver->bits);
+ while (node != NULL) {
+ port = (jack_port_t*)node->data;
+
+ if (jack_port_connected (port)) {
+ portbuf = jack_port_get_buffer (port, nframes);
+ copy_and_convert_in (portbuf, driver->indevbuf,
+ nframes, channel,
+ driver->capture_channels,
+ driver->bits);
}
- node = jack_slist_next(node);
+ node = jack_slist_next (node);
channel++;
}
nbytes = nframes * driver->capture_channels * driver->sample_bytes;
io_res = 0;
- while (nbytes)
- {
- io_res = read(driver->infd, driver->indevbuf, nbytes);
- if (io_res < 0)
- {
- jack_error("sun_driver: read() failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ while (nbytes) {
+ io_res = read (driver->infd, driver->indevbuf, nbytes);
+ if (io_res < 0) {
+ jack_error ("sun_driver: read() failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
break;
- }
- else
+ } else {
nbytes -= io_res;
+ }
}
return 0;
@@ -1164,51 +1073,47 @@ sun_driver_write (sun_driver_t *driver, jack_nframes_t nframes)
jack_port_t *port;
- if (driver->engine->freewheeling || driver->outfd < 0)
+ if (driver->engine->freewheeling || driver->outfd < 0) {
return 0;
+ }
- if (nframes > driver->period_size)
- {
- jack_error("sun_driver: write failed: nframes > period_size "
- "(%u/%u): %s@%i", nframes, driver->period_size,
- __FILE__, __LINE__);
+ if (nframes > driver->period_size) {
+ jack_error ("sun_driver: write failed: nframes > period_size "
+ "(%u/%u): %s@%i", nframes, driver->period_size,
+ __FILE__, __LINE__);
return -1;
}
- bzero(driver->outdevbuf, driver->outdevbufsize);
+ bzero (driver->outdevbuf, driver->outdevbufsize);
node = driver->playback_ports;
channel = 0;
- while (node != NULL)
- {
- port = (jack_port_t *) node->data;
-
- if (jack_port_connected(port))
- {
- portbuf = jack_port_get_buffer(port, nframes);
- copy_and_convert_out(driver->outdevbuf, portbuf,
- nframes, channel,
- driver->playback_channels,
- driver->bits);
+ while (node != NULL) {
+ port = (jack_port_t*)node->data;
+
+ if (jack_port_connected (port)) {
+ portbuf = jack_port_get_buffer (port, nframes);
+ copy_and_convert_out (driver->outdevbuf, portbuf,
+ nframes, channel,
+ driver->playback_channels,
+ driver->bits);
}
- node = jack_slist_next(node);
+ node = jack_slist_next (node);
channel++;
}
nbytes = nframes * driver->playback_channels * driver->sample_bytes;
io_res = 0;
- while (nbytes)
- {
- io_res = write(driver->outfd, driver->outdevbuf, nbytes);
- if (io_res < 0)
- {
- jack_error("sun_driver: write() failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ while (nbytes) {
+ io_res = write (driver->outfd, driver->outdevbuf, nbytes);
+ if (io_res < 0) {
+ jack_error ("sun_driver: write() failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
break;
- }
- else
+ } else {
nbytes -= io_res;
+ }
}
return 0;
@@ -1218,21 +1123,22 @@ sun_driver_write (sun_driver_t *driver, jack_nframes_t nframes)
static int
sun_driver_null_cycle (sun_driver_t *driver, jack_nframes_t nframes)
{
- if (nframes > driver->period_size)
- {
- jack_error("sun_driver: null cycle failed: "
- "nframes > period_size (%u/%u): %s@%i", nframes,
- driver->period_size, __FILE__, __LINE__);
+ if (nframes > driver->period_size) {
+ jack_error ("sun_driver: null cycle failed: "
+ "nframes > period_size (%u/%u): %s@%i", nframes,
+ driver->period_size, __FILE__, __LINE__);
return -1;
}
- printf("sun_driver: running null cycle\n");
+ printf ("sun_driver: running null cycle\n");
- if (driver->outfd >= 0)
+ if (driver->outfd >= 0) {
sun_driver_write_silence (driver, nframes);
+ }
- if (driver->infd >= 0)
+ if (driver->infd >= 0) {
sun_driver_read_silence (driver, nframes);
+ }
return 0;
}
@@ -1241,89 +1147,88 @@ sun_driver_null_cycle (sun_driver_t *driver, jack_nframes_t nframes)
static int
sun_driver_bufsize (sun_driver_t *driver, jack_nframes_t nframes)
{
- return sun_driver_set_parameters(driver);
+ return sun_driver_set_parameters (driver);
}
static void
sun_driver_delete (sun_driver_t *driver)
{
- if (driver->outfd >= 0 && driver->outfd != driver->infd)
- {
- close(driver->outfd);
+ if (driver->outfd >= 0 && driver->outfd != driver->infd) {
+ close (driver->outfd);
driver->outfd = -1;
}
- if (driver->infd >= 0)
- {
- close(driver->infd);
+ if (driver->infd >= 0) {
+ close (driver->infd);
driver->infd = -1;
}
- if (driver->indevbuf != NULL)
- {
- free(driver->indevbuf);
+ if (driver->indevbuf != NULL) {
+ free (driver->indevbuf);
driver->indevbuf = NULL;
}
- if (driver->outdevbuf != NULL)
- {
- free(driver->outdevbuf);
+ if (driver->outdevbuf != NULL) {
+ free (driver->outdevbuf);
driver->outdevbuf = NULL;
}
- if (driver->indev != NULL)
- free(driver->indev);
+ if (driver->indev != NULL) {
+ free (driver->indev);
+ }
- if (driver->outdev != NULL)
- free(driver->outdev);
+ if (driver->outdev != NULL) {
+ free (driver->outdev);
+ }
- jack_driver_nt_finish((jack_driver_nt_t *) driver);
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
- free(driver);
+ free (driver);
}
void
driver_finish (jack_driver_t *driver)
{
- sun_driver_delete ((sun_driver_t *)driver);
+ sun_driver_delete ((sun_driver_t*)driver);
}
static jack_driver_t *
sun_driver_new (char *indev, char *outdev, jack_client_t *client,
- jack_nframes_t sample_rate, jack_nframes_t period_size,
- jack_nframes_t nperiods, int bits,
- int capture_channels, int playback_channels,
- jack_nframes_t in_latency, jack_nframes_t out_latency,
- int ignorehwbuf)
+ jack_nframes_t sample_rate, jack_nframes_t period_size,
+ jack_nframes_t nperiods, int bits,
+ int capture_channels, int playback_channels,
+ jack_nframes_t in_latency, jack_nframes_t out_latency,
+ int ignorehwbuf)
{
sun_driver_t *driver;
- driver = (sun_driver_t *) malloc(sizeof(sun_driver_t));
- if (driver == NULL)
- {
- jack_error("sun_driver: malloc() failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ driver = (sun_driver_t*)malloc (sizeof(sun_driver_t));
+ if (driver == NULL) {
+ jack_error ("sun_driver: malloc() failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
return NULL;
}
driver->engine = NULL;
- jack_driver_nt_init((jack_driver_nt_t *) driver);
-
- driver->nt_attach = (JackDriverNTAttachFunction) sun_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) sun_driver_detach;
- driver->read = (JackDriverReadFunction) sun_driver_read;
- driver->write = (JackDriverWriteFunction) sun_driver_write;
- driver->null_cycle = (JackDriverNullCycleFunction)
- sun_driver_null_cycle;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) sun_driver_bufsize;
- driver->nt_start = (JackDriverNTStartFunction) sun_driver_start;
- driver->nt_stop = (JackDriverNTStopFunction) sun_driver_stop;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) sun_driver_run_cycle;
-
- if (indev != NULL)
- driver->indev = strdup(indev);
- if (outdev != NULL)
- driver->outdev = strdup(outdev);
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->nt_attach = (JackDriverNTAttachFunction)sun_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)sun_driver_detach;
+ driver->read = (JackDriverReadFunction)sun_driver_read;
+ driver->write = (JackDriverWriteFunction)sun_driver_write;
+ driver->null_cycle = (JackDriverNullCycleFunction)
+ sun_driver_null_cycle;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)sun_driver_bufsize;
+ driver->nt_start = (JackDriverNTStartFunction)sun_driver_start;
+ driver->nt_stop = (JackDriverNTStopFunction)sun_driver_stop;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)sun_driver_run_cycle;
+
+ if (indev != NULL) {
+ driver->indev = strdup (indev);
+ }
+ if (outdev != NULL) {
+ driver->outdev = strdup (outdev);
+ }
driver->ignorehwbuf = ignorehwbuf;
@@ -1336,12 +1241,14 @@ sun_driver_new (char *indev, char *outdev, jack_client_t *client,
driver->sys_in_latency = in_latency;
driver->sys_out_latency = out_latency;
- set_period_size(driver, period_size);
-
- if (driver->indev == NULL)
- driver->indev = strdup(SUN_DRIVER_DEF_DEV);
- if (driver->outdev == NULL)
- driver->outdev = strdup(SUN_DRIVER_DEF_DEV);
+ set_period_size (driver, period_size);
+
+ if (driver->indev == NULL) {
+ driver->indev = strdup (SUN_DRIVER_DEF_DEV);
+ }
+ if (driver->outdev == NULL) {
+ driver->outdev = strdup (SUN_DRIVER_DEF_DEV);
+ }
driver->infd = -1;
driver->outfd = -1;
#if defined(AUDIO_ENCODING_SLINEAR)
@@ -1357,15 +1264,14 @@ sun_driver_new (char *indev, char *outdev, jack_client_t *client,
driver->iodelay = 0.0F;
driver->poll_last = driver->poll_next = 0;
- if (sun_driver_set_parameters (driver) < 0)
- {
- free(driver);
+ if (sun_driver_set_parameters (driver) < 0) {
+ free (driver);
return NULL;
}
driver->client = client;
- return (jack_driver_t *) driver;
+ return (jack_driver_t*)driver;
}
@@ -1381,24 +1287,22 @@ driver_get_descriptor ()
jack_driver_desc_t *desc;
jack_driver_param_desc_t *params;
- desc = (jack_driver_desc_t *) calloc(1, sizeof(jack_driver_desc_t));
- if (desc == NULL)
- {
- jack_error("sun_driver: calloc() failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ desc = (jack_driver_desc_t*)calloc (1, sizeof(jack_driver_desc_t));
+ if (desc == NULL) {
+ jack_error ("sun_driver: calloc() failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
return NULL;
}
- strcpy(desc->name, driver_client_name);
+ strcpy (desc->name, driver_client_name);
desc->nparams = SUN_DRIVER_N_PARAMS;
- params = calloc(desc->nparams, sizeof(jack_driver_param_desc_t));
- if (params == NULL)
- {
- jack_error("sun_driver: calloc() failed: %s: %s@%i",
- strerror(errno), __FILE__, __LINE__);
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
+ if (params == NULL) {
+ jack_error ("sun_driver: calloc() failed: %s: %s@%i",
+ strerror (errno), __FILE__, __LINE__);
return NULL;
}
- memcpy(params, sun_params,
+ memcpy (params, sun_params,
desc->nparams * sizeof(jack_driver_param_desc_t));
desc->params = params;
@@ -1423,54 +1327,52 @@ driver_initialize (jack_client_t *client, JSList * params)
char *outdev;
int ignorehwbuf = 0;
- indev = strdup(SUN_DRIVER_DEF_DEV);
- outdev = strdup(SUN_DRIVER_DEF_DEV);
+ indev = strdup (SUN_DRIVER_DEF_DEV);
+ outdev = strdup (SUN_DRIVER_DEF_DEV);
pnode = params;
- while (pnode != NULL)
- {
- param = (const jack_driver_param_t *) pnode->data;
-
- switch (param->character)
- {
- case 'r':
- sample_rate = param->value.ui;
- break;
- case 'p':
- period_size = param->value.ui;
- break;
- case 'n':
- nperiods = param->value.ui;
- break;
- case 'w':
- bits = param->value.i;
- break;
- case 'i':
- capture_channels = param->value.ui;
- break;
- case 'o':
- playback_channels = param->value.ui;
- break;
- case 'C':
- indev = strdup(param->value.str);
- break;
- case 'P':
- outdev = strdup(param->value.str);
- break;
- case 'b':
- ignorehwbuf = 1;
- break;
- case 'I':
- in_latency = param->value.ui;
- break;
- case 'O':
- out_latency = param->value.ui;
- break;
+ while (pnode != NULL) {
+ param = (const jack_driver_param_t*)pnode->data;
+
+ switch (param->character) {
+ case 'r':
+ sample_rate = param->value.ui;
+ break;
+ case 'p':
+ period_size = param->value.ui;
+ break;
+ case 'n':
+ nperiods = param->value.ui;
+ break;
+ case 'w':
+ bits = param->value.i;
+ break;
+ case 'i':
+ capture_channels = param->value.ui;
+ break;
+ case 'o':
+ playback_channels = param->value.ui;
+ break;
+ case 'C':
+ indev = strdup (param->value.str);
+ break;
+ case 'P':
+ outdev = strdup (param->value.str);
+ break;
+ case 'b':
+ ignorehwbuf = 1;
+ break;
+ case 'I':
+ in_latency = param->value.ui;
+ break;
+ case 'O':
+ out_latency = param->value.ui;
+ break;
}
- pnode = jack_slist_next(pnode);
+ pnode = jack_slist_next (pnode);
}
-
+
return sun_driver_new (indev, outdev, client, sample_rate, period_size,
- nperiods, bits, capture_channels, playback_channels, in_latency,
- out_latency, ignorehwbuf);
+ nperiods, bits, capture_channels, playback_channels, in_latency,
+ out_latency, ignorehwbuf);
}
diff --git a/drivers/sun/sun_driver.h b/drivers/sun/sun_driver.h
index bd96674..8ee6850 100644
--- a/drivers/sun/sun_driver.h
+++ b/drivers/sun/sun_driver.h
@@ -1,28 +1,28 @@
/*
- Sun Audio API driver for Jack
- Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
- Based heavily on oss_driver.h which came with the following
- copyright notice.
+ Sun Audio API driver for Jack
+ Copyright (C) 2008 Jacob Meuser <jakemsr@sdf.lonestar.org>
+ Based heavily on oss_driver.h which came with the following
+ copyright notice.
- Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.net>
+ Copyright (C) 2003-2007 Jussi Laako <jussi@sonarnerd.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 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.
+ 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., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
+ 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., 59 Temple Place, Suite 330, Boston,
+ MA 02111-1307 USA
-*/
+ */
#ifndef __JACK_SUN_DRIVER_H__
@@ -38,19 +38,18 @@
#include "driver.h"
-#define SUN_DRIVER_DEF_DEV "/dev/audio"
-#define SUN_DRIVER_DEF_FS 48000
-#define SUN_DRIVER_DEF_BLKSIZE 1024
-#define SUN_DRIVER_DEF_NPERIODS 2
-#define SUN_DRIVER_DEF_BITS 16
-#define SUN_DRIVER_DEF_INS 2
-#define SUN_DRIVER_DEF_OUTS 2
+#define SUN_DRIVER_DEF_DEV "/dev/audio"
+#define SUN_DRIVER_DEF_FS 48000
+#define SUN_DRIVER_DEF_BLKSIZE 1024
+#define SUN_DRIVER_DEF_NPERIODS 2
+#define SUN_DRIVER_DEF_BITS 16
+#define SUN_DRIVER_DEF_INS 2
+#define SUN_DRIVER_DEF_OUTS 2
typedef jack_default_audio_sample_t jack_sample_t;
-typedef struct _sun_driver
-{
+typedef struct _sun_driver {
JACK_DRIVER_NT_DECL
jack_nframes_t sample_rate;