Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax.h (14663 => 14664)
--- freeswitch/branches/gmaruzz/mod_celliax/celliax.h 2009-08-28 12:37:42 UTC (rev 14663)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax.h 2009-08-28 14:31:26 UTC (rev 14664)
@@ -544,4 +544,6 @@
int alsa_shutdown(private_t * tech_pvt);
snd_pcm_t *alsa_open_dev(private_t * tech_pvt, snd_pcm_stream_t stream);
int alsa_write(private_t * tech_pvt, short * data, int datalen);
+int alsa_read(private_t * tech_pvt, short * data, int datalen);
+
#endif /* CELLIAX_ALSA */
Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c (14663 => 14664)
--- freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c 2009-08-28 12:37:42 UTC (rev 14663)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c 2009-08-28 14:31:26 UTC (rev 14664)
@@ -4790,4 +4790,143 @@
return res;
}
+#define AST_FRIENDLY_OFFSET 0
+int alsa_read(private_t * tech_pvt, short * data, int datalen)
+{
+ //static struct ast_frame f;
+ static short __buf[SKYPIAX_FRAME_SIZE + AST_FRIENDLY_OFFSET / 2];
+ static short __buf2[(SKYPIAX_FRAME_SIZE + AST_FRIENDLY_OFFSET / 2) * 2];
+ short *buf;
+ short *buf2;
+ static int readpos = 0;
+ static int left = SKYPIAX_FRAME_SIZE;
+ snd_pcm_state_t state;
+ int r = 0;
+ int off = 0;
+ int error = 0;
+ //time_t now_timestamp;
+ //DEBUGA_SKYPE("buf=%p, datalen=%d, left=%d\n", SKYPIAX_P_LOG, (void *)buf, datalen, left);
+ //memset(&f, 0, sizeof(struct ast_frame)); //giova
+
+#ifdef NOTDEF
+ f.frametype = AST_FRAME_NULL;
+ f.subclass = 0;
+ f.samples = 0;
+ f.datalen = 0;
+ f.data = NULL;
+ f.offset = 0;
+ f.src = celliax_type;
+ f.mallocd = 0;
+ f.delivery.tv_sec = 0;
+ f.delivery.tv_usec = 0;
+#endif// NOTDEF
+
+ state = snd_pcm_state(tech_pvt->alsac);
+ if (state != SND_PCM_STATE_RUNNING) {
+ DEBUGA_SKYPE("ALSA read state is not SND_PCM_STATE_RUNNING\n", SKYPIAX_P_LOG);
+
+ if (state != SND_PCM_STATE_PREPARED) {
+ error = snd_pcm_prepare(tech_pvt->alsac);
+ if (error) {
+ ERRORA("snd_pcm_prepare failed, %s\n", SKYPIAX_P_LOG, snd_strerror(error));
+ return r;
+ }
+ DEBUGA_SKYPE("prepared!\n", SKYPIAX_P_LOG);
+ }
+ usleep(1000);
+ error = snd_pcm_start(tech_pvt->alsac);
+ if (error) {
+ ERRORA("snd_pcm_start failed, %s\n", SKYPIAX_P_LOG, snd_strerror(error));
+ return r;
+ }
+ DEBUGA_SKYPE("started!\n", SKYPIAX_P_LOG);
+ usleep(1000);
+ }
+
+ buf = __buf + AST_FRIENDLY_OFFSET / 2;
+ buf2 = __buf2 + ((AST_FRIENDLY_OFFSET / 2) * 2);
+
+ if (tech_pvt->alsa_capture_is_mono) {
+ //DEBUGA_SKYPE("buf=%p, datalen=%d, left=%d\n", SKYPIAX_P_LOG, (void *)buf, datalen, left);
+ r = snd_pcm_readi(tech_pvt->alsac, buf + readpos, left);
+ } else {
+ r = snd_pcm_readi(tech_pvt->alsac, buf2 + (readpos * 2), left);
+
+ int a = 0;
+ int i = 0;
+ for (i = 0; i < (SKYPIAX_FRAME_SIZE + AST_FRIENDLY_OFFSET / 2) * 2;) {
+ __buf[a] = (__buf2[i] + __buf2[i + 1]) / 2; //comment out this line to use only left
+ //__buf[a] = __buf2[i]; // enable this line to use only left
+ a++;
+ i++;
+ i++;
+ }
+ }
+
+ if (r == -EPIPE) {
+ ERRORA("XRUN read\n\n\n\n\n", SKYPIAX_P_LOG);
+ return r;
+ } else if (r == -ESTRPIPE) {
+ ERRORA("-ESTRPIPE\n", SKYPIAX_P_LOG);
+ return r;
+
+ } else if (r == -EAGAIN) {
+ DEBUGA_SKYPE("ALSA read -EAGAIN, the soundcard is not ready to be read by celliax\n",
+ SKYPIAX_P_LOG);
+ while (r == -EAGAIN) {
+ usleep(1000);
+
+ if (tech_pvt->alsa_capture_is_mono) {
+ r = snd_pcm_readi(tech_pvt->alsac, buf + readpos, left);
+ } else {
+ r = snd_pcm_readi(tech_pvt->alsac, buf2 + (readpos * 2), left);
+
+ int a = 0;
+ int i = 0;
+ for (i = 0; i < (SKYPIAX_FRAME_SIZE + AST_FRIENDLY_OFFSET / 2) * 2;) {
+ __buf[a] = (__buf2[i] + __buf2[i + 1]) / 2;
+ a++;
+ i++;
+ i++;
+ }
+ }
+
+ }
+ } else if (r < 0) {
+ WARNINGA("ALSA Read error: %s\n", SKYPIAX_P_LOG, snd_strerror(r));
+ } else if (r >= 0) {
+ //DEBUGA_SKYPE("read: r=%d, readpos=%d, left=%d, off=%d\n", SKYPIAX_P_LOG, r, readpos, left, off);
+ off -= r; //what is the meaning of this? a leftover, probably
+ }
+ /* Update positions */
+ readpos += r;
+ left -= r;
+
+ if (readpos >= SKYPIAX_FRAME_SIZE) {
+ /* A real frame */
+ readpos = 0;
+ left = SKYPIAX_FRAME_SIZE;
+int i;
+for(i=0; i<r; i++)
+data[i] = buf[i];
+
+#ifdef NOTDEF
+ f.frametype = AST_FRAME_VOICE;
+ f.subclass = AST_FORMAT_SLINEAR;
+ f.samples = SKYPIAX_FRAME_SIZE;
+ f.datalen = SKYPIAX_FRAME_SIZE * 2;
+ f.data = buf;
+ f.offset = AST_FRIENDLY_OFFSET;
+ f.src = celliax_type;
+ f.mallocd = 0;
+#ifdef ALSA_MONITOR
+ alsa_monitor_read((char *) buf, SKYPIAX_FRAME_SIZE * 2);
+#endif
+#endif //NOTDEF
+
+ }
+ return r;
+}
+
+
Modified: freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c (14663 => 14664)
--- freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c 2009-08-28 12:37:42 UTC (rev 14663)
+++ freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c 2009-08-28 14:31:26 UTC (rev 14664)
@@ -651,7 +651,11 @@
int samples;
- if ((samples = snd_pcm_readi(tech_pvt->alsac, tech_pvt->read_frame.data, tech_pvt->read_codec.implementation->samples_per_packet)) > 0) {
+ //if ((samples = snd_pcm_readi(tech_pvt->alsac, tech_pvt->read_frame.data, tech_pvt->read_codec.implementation->samples_per_packet)) > 0)
+ if ((samples = alsa_read(tech_pvt, tech_pvt->read_frame.data, tech_pvt->read_codec.implementation->samples_per_packet * 2)) > 0)
+
+
+{
tech_pvt->read_frame.datalen = samples * 2;
tech_pvt->read_frame.samples = samples;
@@ -664,6 +668,7 @@
switch_set_flag(tech_pvt, TFLAG_VOICE);
+//usleep(17000);
usleep(17000);
@@ -1388,6 +1393,8 @@
switch_set_string(globals.SKYPIAX_INTERFACES[interface_id].alsapname , "plughw:1");
+ globals.SKYPIAX_INTERFACES[interface_id].alsa_play_is_mono = 1;
+ globals.SKYPIAX_INTERFACES[interface_id].alsa_capture_is_mono = 1;