Пример #1
0
int satipc_open_device(adapter *ad)
{
	if (!ad->sip)
		return 1;

	int ctime = getTick();
	if ((ad->last_connect > 0) && (ctime - ad->last_connect < 30000))
		return 3;

	ad->last_connect = ctime;
	ad->fe = tcp_connect(ad->sip, ad->sport, NULL, 0); // non-blockin socket
	if (ad->fe < 0)
		return 2;

	LOG("satipc: connected to SAT>IP server %s port %d, handle %d", ad->sip,
			ad->sport, ad->fe);
	ad->listen_rtp = opts.start_rtp + 1000 + ad->id * 2;
	ad->dvr = udp_bind(NULL, ad->listen_rtp);
	ad->rtcp = udp_bind(NULL, ad->listen_rtp + 1);

	ad->fe_sock = sockets_add(ad->fe, NULL, ad->id, TYPE_TCP,
			(socket_action) satipc_reply, (socket_action) satipc_close,
			(socket_action) satipc_timeout);
	ad->rtcp_sock = sockets_add(ad->rtcp, NULL, ad->id, TYPE_TCP,
			(socket_action) satipc_rtcp_reply, (socket_action) satipc_close,
			NULL);
	sockets_timeout(ad->fe_sock, 15000); // 15s
	set_socket_receive_buffer(ad->dvr, opts.output_buffer);
	if (ad->fe_sock < 0 || ad->dvr < 0 || ad->rtcp < 0 || ad->rtcp_sock < 0)
	{
		sockets_del(ad->rtcp_sock);
		sockets_del(ad->fe_sock);
		close(ad->rtcp);
		close(ad->dvr);
		close(ad->fe);
	}
	ad->type = ADAPTER_SATIP;
	ad->session[0] = 0;
	lap[ad->id] = 0;
	ldp[ad->id] = 0;
	ad->cseq = 1;
	ad->err = 0;
	ad->expect_reply = 0;
	ad->last_connect = 0;
	ad->sent_transport = 0;
	ad->session[0] = 0;
	ad->stream_id = -1;
	ad->wp = ad->qp = ad->want_commit = 0;
	ad->rcvp = ad->repno = 0;
	ad->rtp_miss = ad->rtp_ooo = 0;
	ad->rtp_seq = 0xFFFF;
	ad->ignore_packets = 1;
	ad->force_commit = 0;
	ad->satip_last_setup = -10000;
	ad->last_cmd = 0;
	return 0;

}
Пример #2
0
void request_adapter_close(adapter *ad)
{
	ad->force_close = 1;
	sockets_timeout(ad->sock, 1);
}
Пример #3
0
int init_hw(int i)
{
	char name[100];
	adapter *ad;
	if (i < 0 || i >= MAX_ADAPTERS)
		return 1;

	if (a[i] && a[i]->enabled)
		return 1;

	if (!a[i])
		return 1;

	ad = a[i];
	mutex_init(&ad->mutex);
	mutex_lock(&ad->mutex);
	if (ad->force_disable)
		goto NOK;
	if (ad->enabled)
		goto NOK;

	ad->sock = -1;
	ad->id = i;
	ad->fe_sock = -1;
	ad->sock = -1;

	if (ad->enabled)
	{
		goto NOK;
	}

	if (ad->open(ad))
	{
		init_complete = 0;
		goto NOK;
	}
	ad->enabled = 1;

	if (!ad->buf)
		ad->buf = malloc1(opts.adapter_buffer + 10);
	if (!ad->buf)
	{
		LOG(
				"memory allocation failed for %d bytes failed, adapter %d, trying %d bytes",
				opts.adapter_buffer, i, ADAPTER_BUFFER);
		opts.adapter_buffer = ADAPTER_BUFFER;
		ad->buf = malloc1(opts.adapter_buffer + 10);
		if (!ad->buf)
		{
			LOG("memory allocation failed for %d bytes failed, adapter %d",
					opts.adapter_buffer, i);
			close_adapter(i);
		}
		goto NOK;
	}
	memset(ad->buf, 0, opts.adapter_buffer + 1);
	init_dvb_parameters(&ad->tp);
	mark_pids_deleted(i, -1, NULL);
	update_pids(i);
	ad->delsys(i, ad->fe, ad->sys);
	ad->master_sid = -1;
	ad->sid_cnt = 0;
	ad->pid_err = ad->dec_err = 0;
	ad->new_gs = 0;
	ad->force_close = 0;
	ad->ca_mask = 0;
	ad->rtime = getTick();
	ad->sock = sockets_add(ad->dvr, NULL, i, TYPE_DVR, (socket_action) read_dmx,
			(socket_action) close_adapter_for_socket,
			(socket_action) adapter_timeout);
	memset(ad->buf, 0, opts.adapter_buffer + 1);
	set_socket_buffer(ad->sock, (unsigned char*) ad->buf, opts.adapter_buffer);
	sockets_timeout(ad->sock, ADAPTER_TIMEOUT);
	snprintf(ad->name, sizeof(ad->name), "AD%d", i);
	set_socket_thread(ad->sock, start_new_thread(ad->name));
	tables_init_device(ad);
	if (ad->post_init)
		ad->post_init(ad);

//	set_sock_lock(ad->sock, &ad->mutex); // locks automatically the adapter on reading from the DVR 

	LOG("done opening adapter %i fe_sys %d %d %d %d", i, ad->sys[0], ad->sys[1],
			ad->sys[2], ad->sys[3]);

	OK:
	mutex_unlock(&ad->mutex);
	return 0;

	NOK:
	mutex_unlock(&ad->mutex);
	return 1;
}