static int channelscan_find_lock(struct hdhomerun_channelscan_t *scan, uint32_t frequency, struct hdhomerun_channelscan_result_t *result)
{
	/* Set channel. */
	char channel_str[64];
	hdhomerun_sprintf(channel_str, channel_str + sizeof(channel_str), "auto:%u", (unsigned int)frequency);

	int ret = hdhomerun_device_set_tuner_channel(scan->hd, channel_str);
	if (ret <= 0) {
		return ret;
	}

	/* Wait for lock. */
	ret = hdhomerun_device_wait_for_lock(scan->hd, &result->status);
	if (ret <= 0) {
		return ret;
	}
	if (!result->status.lock_supported) {
		return 1;
	}

	/* Wait for symbol quality = 100%. */
	uint64_t timeout = getcurrenttime() + 5000;
	while (1) {
		ret = hdhomerun_device_get_tuner_status(scan->hd, NULL, &result->status);
		if (ret <= 0) {
			return ret;
		}

		if (result->status.symbol_error_quality == 100) {
			return 1;
		}

		if (getcurrenttime() >= timeout) {
			return 1;
		}

		msleep_approx(250);
	}
}
Beispiel #2
0
// 0 = no lock, 1 = lock, -1 on error
int HDHRDevice::getTuningStatus(bool& locked, int& strength)
{
	int result = 0;
	
	locked = false; // signal locked
	strength = 0;
	
	if(mDeviceConnection) {
		struct hdhomerun_tuner_status_t status;
		char *statusString;
		if(hdhomerun_device_get_tuner_status(mDeviceConnection, &statusString, &status) < 0) {
			flog( "Native.log",  "HDHRDevice::getSignalStrength: Error reading tuner status: %s\r\n", (statusString != NULL) ? statusString : "(null)");
			return -1;
		}
		
		// signal_present seems to be inaccurate, use the lock_str value to determine lock
		if(strcmp(status.lock_str, "none") && strcmp(status.lock_str, "(ntsc)")) {
			locked = true; // if anything besides none, then we're locked
			result = 1;
			strength = (int)status.signal_strength;
		}
		
		if ( 0 )
		flog( "Native.log",  "HDHRDevice::getSignalStrength channel:%s lock_str:%s signal_present:%s strength:%d snr:%d seq:%d raw_bps:%ld pps:%ld (%s, %d, %d)\r\n",
				status.channel, status.lock_str,
				(status.signal_present ? "true" : "false"),
				status.signal_strength, status.signal_to_noise_quality, status.symbol_error_quality,
				(long)status.raw_bits_per_second, (long)status.packets_per_second,
				locked ? "LOCK" : "NOLOCK",
				strength,
				result
		);
	} else return -1;
	
	return result;
}
Beispiel #3
0
void HDHRStreamHandler::GetTunerStatus(struct hdhomerun_tuner_status_t *status)
{
    hdhomerun_device_get_tuner_status(_hdhomerun_device, NULL, status);
}