Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e1b2ac4d authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

[media] siano: Only feed DVB data when there's a feed



Right now, the driver sends DVB data even before tunning.
It was noticed that this may lead into some mistakes at DVB
decode, as the PIDs from wrong channels may be associated with
another frequency, as they may already be inside the PID buffers.
So, prevent it by not feeding DVB demux with data while there's no
feed or while the device is not tuned.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 5c3b8743
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -512,6 +512,11 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)

	switch (phdr->msgType) {
	case MSG_SMS_DVBT_BDA_DATA:
		/*
		 * Only feed data to dvb demux if are there any feed listening
		 * to it and if the device has tuned
		 */
		if (client->feed_users && client->has_tuned)
			dvb_dmx_swfilter(&client->demux, p,
					 cb->size - sizeof(struct SmsMsgHdr_ST));
		break;
@@ -579,9 +584,10 @@ static int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
				sms_board_dvb3_event(client, DVB3_EVENT_UNC_OK);
			else
				sms_board_dvb3_event(client, DVB3_EVENT_UNC_ERR);
			client->has_tuned = true;
		} else {
			smsdvb_stats_not_ready(fe);

			client->has_tuned = false;
			sms_board_dvb3_event(client, DVB3_EVENT_FE_UNLOCK);
		}
		complete(&client->stats_done);
@@ -623,6 +629,8 @@ static int smsdvb_start_feed(struct dvb_demux_feed *feed)
	sms_debug("add pid %d(%x)",
		  feed->pid, feed->pid);

	client->feed_users++;

	PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
	PidMsg.xMsgHeader.msgDstId = HIF_TASK;
	PidMsg.xMsgHeader.msgFlags = 0;
@@ -643,6 +651,8 @@ static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
	sms_debug("remove pid %d(%x)",
		  feed->pid, feed->pid);

	client->feed_users--;

	PidMsg.xMsgHeader.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
	PidMsg.xMsgHeader.msgDstId = HIF_TASK;
	PidMsg.xMsgHeader.msgFlags = 0;
@@ -963,6 +973,8 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe)
	c->strength.stat[0].uvalue = 0;
	c->cnr.stat[0].uvalue = 0;

	client->has_tuned = false;

	switch (smscore_get_device_mode(coredev)) {
	case DEVICE_MODE_DVBT:
	case DEVICE_MODE_DVBT_BDA:
+3 −0
Original line number Diff line number Diff line
@@ -54,6 +54,9 @@ struct smsdvb_client_t {

	unsigned long		get_stats_jiffies;

	int			feed_users;
	bool			has_tuned;

	/* Stats debugfs data */
	struct dentry		*debugfs;