--- linphone-0.12.2/mediastreamer/jackcard.new.c 2004-11-01 22:41:13.000000000 +0100 +++ linphone-0.12.2/mediastreamer/jackcard.c 2004-11-02 02:35:33.000000000 +0100 @@ -50,8 +50,14 @@ jack_shutdown (void *arg) obj->jack_running = FALSE; obj->jack_active = FALSE; - if (obj->read.open) obj->read.init = TRUE; - if (obj->write.open) obj->write.init = TRUE; + if (obj->read.open) { + obj->read.init = TRUE; + obj->read.reg = FALSE; + } + if (obj->write.open) { + obj->write.init = TRUE; + obj->write.reg = FALSE; + } // obj->read.can_process = FALSE; // obj->write.can_process = FALSE; // obj->can_process = FALSE; @@ -105,6 +111,12 @@ process (jack_nframes_t nframes, void *a size_t bytes2; #endif + if (obj->clear && !obj->write.can_process) { + out = (sample_t *) jack_port_get_buffer (obj->write.port, nframes); + memset (out, 0, nframes * sizeof(sample_t)); + obj->clear = FALSE; + } + if (!obj->can_process) return 0; @@ -181,9 +193,12 @@ int jack_init(JackCard* obj) } if (obj->read.init) { - if ((obj->read.port = jack_port_register (obj->client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0))==NULL) { - g_warning("error while trying to register input port"); - return -1; + if (!obj->read.reg) { + if ((obj->read.port = jack_port_register (obj->client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0))==NULL) { + g_warning("error while trying to register input port"); + return -1; + } else + obj->read.reg = TRUE; } if (obj->read.phys_ports) { g_free(obj->read.phys_ports); @@ -192,6 +207,7 @@ int jack_init(JackCard* obj) if ((obj->read.phys_ports = jack_get_ports (obj->client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == NULL) { g_warning("Cannot find any physical capture ports\n"); jack_port_unregister(obj->client, obj->read.port); + obj->read.reg = FALSE; return -1; } #ifdef DEBUG @@ -202,15 +218,19 @@ int jack_init(JackCard* obj) if (error == EEXIST) g_warning("connection already made"); else { jack_port_unregister(obj->client, obj->read.port); + obj->read.reg = FALSE; return -1; } } obj->read.init = FALSE; } if (obj->write.init) { - if ((obj->write.port = jack_port_register (obj->client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))==NULL) { - g_warning("error while trying to register output port"); - return -1; + if (!obj->write.reg) { + if ((obj->write.port = jack_port_register (obj->client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))==NULL) { + g_warning("error while trying to register output port"); + return -1; + } else + obj->write.reg = TRUE; } if (obj->write.phys_ports) { g_free(obj->write.phys_ports); @@ -219,6 +239,7 @@ int jack_init(JackCard* obj) if ((obj->write.phys_ports = jack_get_ports (obj->client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL) { g_warning("Cannot find any physical playback ports\n"); jack_port_unregister(obj->client, obj->write.port); + obj->write.reg = FALSE; return -1; } #ifdef DEBUG @@ -229,6 +250,7 @@ int jack_init(JackCard* obj) if (error == EEXIST) g_warning("connection already made"); else { jack_port_unregister(obj->client, obj->write.port); + obj->write.reg = FALSE; return -1; } } @@ -237,6 +259,7 @@ int jack_init(JackCard* obj) if (error == EEXIST) g_warning("connection already made"); else { jack_port_unregister(obj->client, obj->write.port); + obj->write.reg = FALSE; return -1; } } @@ -336,12 +359,15 @@ void jack_card_close_r(JackCard *obj) jack_disconnect(obj->client, obj->read.phys_ports[0], jack_port_name(obj->read.port)); g_free(obj->read.phys_ports); obj->read.phys_ports = NULL; - jack_port_unregister(obj->client, obj->read.port); - if ((obj->jack_active)&&(!obj->write.open)) { - obj->can_process = FALSE; - if (jack_deactivate(obj->client)) - g_warning("jack_card_close_r: Error while deactivating JACK"); - obj->jack_active = FALSE; + if (!obj->persistent) { + jack_port_unregister(obj->client, obj->read.port); + obj->read.reg = FALSE; + if ((obj->jack_active)&&(!obj->write.open)) { + obj->can_process = FALSE; + if (jack_deactivate(obj->client)) + g_warning("jack_card_close_r: Error while deactivating JACK"); + obj->jack_active = FALSE; + } } } if (obj->read.src_state) @@ -365,16 +391,20 @@ void jack_card_close_w(JackCard *obj) // has played back everything, we won't hear everything. while (obj->write.real_total_bytes + 1024 < obj->write.total_bytes) g_usleep(1000); obj->write.can_process = FALSE; + obj->clear = TRUE; jack_disconnect (obj->client, jack_port_name (obj->write.port), obj->write.phys_ports[0]); jack_disconnect (obj->client, jack_port_name (obj->write.port), obj->write.phys_ports[1]); g_free(obj->write.phys_ports); obj->write.phys_ports = NULL; - jack_port_unregister(obj->client, obj->write.port); - if ((obj->jack_active)&&(!obj->read.open)) { - obj->can_process = FALSE; - if (jack_deactivate(obj->client)) - g_warning("jack_card_close_w: Error while deactivating JACK"); - obj->jack_active = FALSE; + if (!obj->persistent) { + jack_port_unregister(obj->client, obj->write.port); + obj->write.reg = FALSE; + if ((obj->jack_active)&&(!obj->read.open)) { + obj->can_process = FALSE; + if (jack_deactivate(obj->client)) + g_warning("jack_card_close_w: Error while deactivating JACK"); + obj->jack_active = FALSE; + } } } if (obj->write.src_state) @@ -602,13 +632,17 @@ SndCard * jack_card_new(jack_client_t *c obj->jack_running = TRUE; obj->jack_active = FALSE; obj->can_process = FALSE; + obj->clear = TRUE; + obj->persistent = TRUE; obj->write.can_process = FALSE; obj->write.open = FALSE; obj->write.init = FALSE; + obj->write.reg = FALSE; obj->write.phys_ports = NULL; obj->read.can_process = FALSE; obj->read.open = FALSE; obj->read.init = FALSE; + obj->read.reg = FALSE; obj->read.phys_ports = NULL; /* tell the JACK server to call `process()' whenever @@ -626,20 +660,26 @@ SndCard * jack_card_new(jack_client_t *c obj->rate = jack_get_sample_rate (client); obj->buffer_size = jack_get_buffer_size(obj->client); - /* - if ((obj->write.port = jack_port_register (obj->client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))==NULL) - g_warning("error while trying to register output port"); - if ((obj->read.port = jack_port_register (obj->client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0))==NULL) - g_warning("error while trying to register input port"); - */ + + if (obj->persistent) { + if ((obj->write.port = jack_port_register (obj->client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))==NULL) + g_warning("error while trying to register output port"); + else + obj->write.reg = TRUE; + if ((obj->read.port = jack_port_register (obj->client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0))==NULL) + g_warning("error while trying to register input port"); + else + obj->read.reg = TRUE; + } + base= SND_CARD(obj); snd_card_init(base); #ifdef HAVE_GLIB - base->card_name=g_strdup_printf("JACK client"); + base->card_name=g_strdup_printf("JACK client %s", obj->persistent?"persistent":""); #else base->card_name=malloc(100); - snprintf(base->card_name, 100, "JACK client"); + snprintf(base->card_name, 100, "JACK client %s", obj->persistent?"persistent":""); #endif base->_probe=(SndCardOpenFunc)jack_card_probe; --- linphone-0.12.2/mediastreamer/jackcard.new.h 2004-11-01 22:41:13.000000000 +0100 +++ linphone-0.12.2/mediastreamer/jackcard.h 2004-11-02 01:38:26.000000000 +0100 @@ -51,6 +51,7 @@ typedef struct { gboolean can_process; gboolean open; gboolean init; + gboolean reg; } jackcard_mode_t; struct _JackCard @@ -66,6 +67,8 @@ struct _JackCard gint frame_size; gint rate; gboolean can_process; + gboolean clear; + gboolean persistent; jackcard_mode_t read, write; };