{
GstJack *this;
GList *pads;
- gint len;
+ gint len, peeked_len;
gchar *peeked;
gint avail;
GstEvent *event;
if (!pad->bs)
pad->bs = gst_bytestream_new (pad->pad);
- if (gst_bytestream_peek_bytes (pad->bs, (guint8**)&peeked, len) < len) {
+ read:
+ peeked_len = gst_bytestream_peek_bytes (pad->bs, (guint8**)&peeked, len);
+ if (peeked_len < len) {
gst_bytestream_get_status(pad->bs, &avail, &event);
if (event) {
g_warning("got an event on jacksink");
* me know when this is needed ;)
* also, for sample accuracy etc, we should play avail
* bytes, but hey. */
- gst_element_set_eos(GST_ELEMENT(this));
- gst_event_free(event);
+ gst_element_set_eos (element);
+ gst_event_free (event);
+ gst_element_yield (element); /* shouldn't return */
+ return;
}
+ goto read;
} else {
/* the element at the top of the chain did not emit an eos
* event. this is a Bug(tm) */
}
}
- memcpy (pad->data, peeked, len);
- gst_bytestream_flush (pad->bs, len);
+
+ memcpy (pad->data, peeked, peeked_len);
+ gst_bytestream_flush (pad->bs, peeked_len);
} else {
buffer = gst_buffer_new ();
GST_BUFFER_DATA (buffer) = pad->data;
switch (GST_STATE_PENDING (element)) {
case GST_STATE_NULL:
- g_message ("jack: NULL state");
+ g_message ("jackbin: NULL state");
if (this->client) {
g_message ("jack: closing client");
jack_client_close (this->client);
break;
case GST_STATE_READY:
- g_message ("jack: READY");
+ g_message ("jackbin: READY");
if (!this->client) {
if (!(this->client = jack_client_new ("gst-jack"))) {
g_warning ("jack server not running?");
break;
case GST_STATE_PAUSED:
- g_message ("jack: PAUSED");
+ g_message ("jackbin: PAUSED");
if (!GST_FLAG_IS_SET (GST_OBJECT (this), GST_JACK_OPEN)) {
l = this->src_pads;
while (l) {
pad = GST_JACK_PAD (l);
g_message ("jack: registering pad %s:%s", pad->name, pad->peer_name);
- pad->port = jack_port_register (this->client, pad->name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
+ pad->port = jack_port_register (this->client, pad->name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput|JackPortIsTerminal, 0);
l = g_list_next (l);
}
l = this->sink_pads;
while (l) {
pad = GST_JACK_PAD (l);
g_message ("jack: registering pad %s:%s", pad->name, pad->peer_name);
- pad->port = jack_port_register (this->client, pad->name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ pad->port = jack_port_register (this->client, pad->name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput|JackPortIsTerminal, 0);
l = g_list_next (l);
}
+ /* must activate before connecting */
if (!GST_FLAG_IS_SET (GST_OBJECT (this), GST_JACK_ACTIVE)) {
g_message ("jack: activating client");
jack_activate (this->client);
l = g_list_next (l);
}
- g_message ("jack: setting OPEN flag");
+ g_message ("jackbin: setting OPEN flag");
GST_FLAG_SET (GST_OBJECT (this), GST_JACK_OPEN);
} else {
g_cond_wait (this->cond, this->lock);