void channelscan_destroy(struct hdhomerun_channelscan_t *scan)
{
	hdhomerun_channel_list_destroy(scan->channel_list);
	free(scan);
}
Exemplo n.º 2
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
}