> voyager:/usr/local/jack/bin# ./jackd
> creating alsa driver ... default|64|48000
> here
> ALSA: cannot set fragment count minimum to 2 for capture
> ALSA-MCD: cannot configure capture channel
> cannot load ALSA driver module
Ok, looks like snd_pcm_hw_params_get_channels_max() returns a ridiculous
value for my setup (16 million channels, not quite right :). Hardcoding
this to 2 for this case allows the jack server to load.
Attached is a small patch for jack CVS.
Andy
diff -u ./Makefile.am /usr/src/PLAYER/JACK/jack/Makefile.am
--- ./Makefile.am Mon Nov 12 05:08:38 2001
+++ /usr/src/PLAYER/JACK/jack/Makefile.am Tue Nov 13 01:20:59 2001
@@ -10,6 +10,10 @@
bin_PROGRAMS = jackd jack_simple_client jack_monitor_client @XTRA@
+EXTRA_CFLAGS = -DADDON_DIR=\"$(ADDON_DIR)\" @GLIB_CFLAGS@
+
+CFLAGS += $(EXTRA_CFLAGS)
+
jackd_SOURCES = jackd.c
jackd_LDFLAGS = -L. -ljack -lltdl -lpthread
diff -u ./alsa_driver.c /usr/src/PLAYER/JACK/jack/alsa_driver.c
--- ./alsa_driver.c Mon Nov 12 05:08:50 2001
+++ /usr/src/PLAYER/JACK/jack/alsa_driver.c Tue Nov 13 03:47:31 2001
@@ -209,7 +209,7 @@
return -1;
}
}
-
+
if ((err = snd_pcm_hw_params_set_format (handle, hw_params,
SND_PCM_FORMAT_S32_LE)) < 0) {
if ((err = snd_pcm_hw_params_set_format (handle, hw_params,
SND_PCM_FORMAT_S16_LE)) < 0) {
jack_error ("Sorry. The audio interface \"%s\""
@@ -225,22 +225,25 @@
}
*nchns = snd_pcm_hw_params_get_channels_max (hw_params);
-
+ if (*nchns > 1024) { /* Check for ridiculous results */
+ *nchns = 2; /* or ALSA trident driver bugs?!
+*/
+ }
+ printf("max channels = %u\n", *nchns);
if ((err = snd_pcm_hw_params_set_channels (handle, hw_params, *nchns)) < 0) {
jack_error ("ALSA: cannot set channel count to %u for %s", *nchns,
stream_name);
return -1;
}
-
- if ((err = snd_pcm_hw_params_set_periods (handle, hw_params, 2, 0)) < 0) {
- jack_error ("ALSA: cannot set fragment count minimum to 2 for %s",
stream_name);
+
+ if ((err = snd_pcm_hw_params_set_period_size (handle, hw_params,
+driver->frames_per_cycle, 0)) < 0) {
+ jack_error ("ALSA: cannot set fragment length to %u for %s",
+driver->frames_per_cycle, stream_name);
return -1;
}
- if ((err = snd_pcm_hw_params_set_period_size (handle, hw_params,
driver->frames_per_cycle, 0)) < 0) {
- jack_error ("ALSA: cannot set fragment length to %u for %s",
stream_name);
+ if ((err = snd_pcm_hw_params_set_periods (handle, hw_params, 2, 0)) < 0) {
+ jack_error ("ALSA: cannot set fragment count minimum to 2 for %s",
+stream_name);
return -1;
}
-
+
if ((err = snd_pcm_hw_params_set_buffer_size (handle, hw_params, 2 *
driver->frames_per_cycle)) < 0) {
jack_error ("ALSA: cannot set buffer length to %u for %s", 2 *
driver->frames_per_cycle, stream_name);
return -1;
@@ -300,7 +303,7 @@
driver->frame_rate = rate;
driver->frames_per_cycle = frames_per_cycle;
-
+
if (alsa_driver_configure_stream (driver, "capture",
driver->capture_handle,
driver->capture_hw_params,
@@ -309,7 +312,7 @@
jack_error ("ALSA-MCD: cannot configure capture channel");
return -1;
}
-
+
if (alsa_driver_configure_stream (driver, "playback",
driver->playback_handle,
driver->playback_hw_params,
diff -u ./configure.in /usr/src/PLAYER/JACK/jack/configure.in
--- ./configure.in Mon Nov 12 05:21:46 2001
+++ /usr/src/PLAYER/JACK/jack/configure.in Tue Nov 13 01:12:52 2001
@@ -54,6 +54,10 @@
AC_PROG_LD
AM_PROG_LIBTOOL
+ADDON_DIR=${libdir}
+
+AC_SUBST(ADDON_DIR)
+
dnl check for the libraries we need
AC_OUTPUT(Makefile
diff -u ./jackd.c /usr/src/PLAYER/JACK/jack/jackd.c
--- ./jackd.c Mon Nov 12 05:08:24 2001
+++ /usr/src/PLAYER/JACK/jack/jackd.c Tue Nov 13 01:27:50 2001
@@ -138,7 +138,7 @@
return 1;
}
- if ((driver = jack_driver_load ("/usr/local/lib/jack_alsa.so", alsa_pcm_name,
frames_per_interrupt, srate)) == 0) {
+ if ((driver = jack_driver_load (ADDON_DIR "/jack_alsa.so", alsa_pcm_name,
+frames_per_interrupt, srate)) == 0) {
fprintf (stderr, "cannot load ALSA driver module\n");
return 1;
}