I'm not sure if this is a issue in alsa, it seems to be slmodemd's fault. slmodemd requests a period size of 48 using snd_pcm_hw_params_set_period_size_near() in setup_stream() and aborts if alsa returns anything different. Newer alsa versions return 64, and this should be gracefully handled by slmodemd. The following quick-and-dirty patch to slmodemd allows it to start and communicate, but proper error handling must be implemented:
diff -rud slmodem-2.9.11-20060727-orig/modem/modem_main.c slmodem-2.9.11-20060727/modem/modem_main.c
--- slmodem-2.9.11-20060727-orig/modem/modem_main.c 2005-09-22 10:05:27.000000000 -0300
+++ slmodem-2.9.11-20060727/modem/modem_main.c 2007-07-09 16:26:15.000000000 -0300
@@ -379,11 +379,13 @@ ERR("cannot set periods for %s: %s\n", stream_name, snd_strerror(err)); return err;
}
+#if 0
if ( rsize != size ) { ERR("period size %ld is not supported by %s (%ld).\n", size, stream_name, rsize); return -1;
}
+#endif
rsize = size = use_short_buffer ? rsize * dev->buf_periods : rsize * 32;
err = snd_pcm_hw_params_set_buffer_size_near(handle, hw_params, &rsize);
if (err < 0) {
From ALSA bugtrack web site:
I'm not sure if this is a issue in alsa, it seems to be slmodemd's fault. slmodemd requests a period size of 48 using snd_pcm_ hw_params_ set_period_ size_near( ) in setup_stream() and aborts if alsa returns anything different. Newer alsa versions return 64, and this should be gracefully handled by slmodemd. The following quick-and-dirty patch to slmodemd allows it to start and communicate, but proper error handling must be implemented:
diff -rud slmodem- 2.9.11- 20060727- orig/modem/ modem_main. c slmodem- 2.9.11- 20060727/ modem/modem_ main.c 2.9.11- 20060727- orig/modem/ modem_main. c 2005-09-22 10:05:27.000000000 -0300 2.9.11- 20060727/ modem/modem_ main.c 2007-07-09 16:26:15.000000000 -0300
ERR(" cannot set periods for %s: %s\n", stream_name, snd_strerror(err));
return err;
ERR(" period size %ld is not supported by %s (%ld).\n",
size, stream_name, rsize);
return -1; hw_params_ set_buffer_ size_near( handle, hw_params, &rsize);
--- slmodem-
+++ slmodem-
@@ -379,11 +379,13 @@
}
+#if 0
if ( rsize != size ) {
}
+#endif
rsize = size = use_short_buffer ? rsize * dev->buf_periods : rsize * 32;
err = snd_pcm_
if (err < 0) {