Пример #1
0
PyObject *py_device_wait_for_lock(py_device_object *self) {
    int success;
    struct hdhomerun_tuner_status_t status;

    success = hdhomerun_device_wait_for_lock(self->hd, &status);
    if(success == -1) {
        PyErr_SetString(PyExc_IOError, DEVICE_ERR_COMMUNICATION);
        return NULL;
    } else if(success == 0) {
        PyErr_SetString(hdhomerun_device_error, "the device did not report lock status");
        return NULL;
    } else if(success != 1) {
        PyErr_SetString(hdhomerun_device_error, DEVICE_ERR_UNDOCUMENTED);
        return NULL;
    }

    return build_tuner_status_dict(&status);
}
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);
	}
}
Пример #3
0
// SageTuner API
int HDHRDevice::setTuning(SageTuningParams *params)
{
	const char *channel_map = NULL;
	char channelSetting[32] = "";
	int bandwidth = 6;
	bool cable = false;
	long channel = 0;
	int result;
	
	if(!mScanning) {
		memcpy(&mTuningParams, params, sizeof(SageTuningParams));
	} else {
		mTuningParams.tuningStandard = params->tuningStandard;
		mTuningParams.tuningFrequency = params->tuningFrequency;
		memcpy(&mTuningParams.dtvParams, &params->dtvParams, sizeof(mTuningParams.dtvParams));
	}
	flog( "Native.log",  "HDHRDevice::setTuning: standard:0x%lx freq:%ld channel:%s\r\n",
			mTuningParams.tuningStandard, mTuningParams.tuningFrequency, mTuningParams.channel);
	
	channel = strtol(mTuningParams.channel, NULL, 10); // first (maybe only) value is physical channel

	// ensure the right channel map is loaded first
	switch (mTuningParams.tuningStandard) {
		case kSageTunerStandard_ATSC:
			if((channel < 2) || (channel > 69)) {
				flog( "Native.log",  "HDHomeRun: Invalid channel number %ld\r\n", channel);
				return -1;
			}
			channel_map = "us-bcast";
			bandwidth = 6;
			cable = false;
			break;
		
		case kSageTunerStandard_QAM:
			if((channel < 1) || (channel > 135)) {
				flog( "Native.log",  "HDHomeRun: Invalid channel number %ld\r\n", channel);
				return -1;
			}
			// use channel group for cable, it should scan normal, hrc then irc
			channel_map = "us-cable us-hrc us-irc";
			bandwidth = 6;
			cable = true;
			break;

		case kSageTunerStandard_DVB_T:
			// use channel group for cable, it should scan normal, hrc then irc
			if (  mTuningParams.countryCode == 61 ) //Australia
			{
				channel_map = "au-bcast";
				bandwidth = mTuningParams.dtvParams.dvbt.bandwidth = 7;
			} else
			if (  mTuningParams.countryCode == 886 ) //taiwan
			{
				channel_map = "tw-bcast";
				bandwidth = mTuningParams.dtvParams.dvbt.bandwidth = 6;
			} else
			{
				channel_map = "eu-bcast";
				bandwidth = mTuningParams.dtvParams.dvbt.bandwidth = 8;
			}
			cable = false;
			break;
		
		case kSageTunerStandard_DVB_C:
			// use channel group for cable, it should scan normal, hrc then irc
			if (  mTuningParams.countryCode == 61 ) //Australia
			{
				channel_map = "au-cable";
				bandwidth = mTuningParams.dtvParams.dvbt.bandwidth;
			} else
			if ( mTuningParams.countryCode == 886 ) //taiwan
			{
				channel_map = "tw-cable";
				bandwidth = mTuningParams.dtvParams.dvbt.bandwidth;
			} else
			{
				channel_map = "eu-cable";
				bandwidth = mTuningParams.dtvParams.dvbt.bandwidth;
			}
			cable = true;
			break;

		default:
			flog( "Native.log",  "HDHomeRun: Invalid tuning standard specified (%ld)\r\n", mTuningParams.tuningStandard);
			return -1;
	}
	
	// ensure channel list is loaded
	if (!mDeviceChannelMap || !mDeviceChannelList || strcmp(mDeviceChannelMap, channel_map)) {
		mDeviceChannelMap = channel_map;
		if(mDeviceChannelList)
			hdhomerun_channel_list_destroy(mDeviceChannelList);
		mDeviceChannelList = hdhomerun_channel_list_create(mDeviceChannelMap);
		if(!mDeviceChannelList) {
			mDeviceChannelMap = NULL;
			flog( "Native.log",  "HDHomeRun: Unable to load channel list for \"%s\"\r\n", channel_map);
			return -1;
		}
	}

	if ( mTuningParams.tuningStandard == kSageTunerStandard_ATSC ||
		 mTuningParams.tuningStandard == kSageTunerStandard_QAM )
	{
		sprintf(channelSetting, "auto%d%c:%ld", bandwidth, cable ? 'c' : 't', channel);
	} else
	{
		sprintf(channelSetting, "%" PRIu32, mTuningParams.tuningFrequency );
	}
	flog( "Native.log",  "HDHRDevice::setTuning: channel %s\r\n", channelSetting);
	
	result = hdhomerun_device_set_tuner_channelmap(mDeviceConnection, mDeviceChannelMap);
	if(result <= 0) {
		flog( "Native.log",  "HDHomeRun: Error trying to set channel map (%d)\r\n", result);
		return -1;
	}
	
	result = hdhomerun_device_set_tuner_channel(mDeviceConnection, channelSetting);
	if(result <= 0) {
		flog( "Native.log",  "HDHomeRun: Error trying to tune channel (%d)\r\n", result);
		return -1;
	}
	
	// when scanning, let's make sure we lock before returning
	if(mScanning) {
		struct hdhomerun_tuner_status_t status;
		result = hdhomerun_device_wait_for_lock(mDeviceConnection, &status);
		
		flog( "Native.log",  "HDHRDevice::setTuning: channel:%s lock_str:%s signal_present:%s strength:%d snr:%d seq:%d raw_bps:%ld pps:%ld\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);
	}
	
	return 0; // could be a format change... don't fail in that case
}