struct hdhomerun_channelscan_t *channelscan_create(struct hdhomerun_device_t *hd, const char *channelmap) { struct hdhomerun_channelscan_t *scan = (struct hdhomerun_channelscan_t *)calloc(1, sizeof(struct hdhomerun_channelscan_t)); if (!scan) { return NULL; } scan->hd = hd; scan->channel_list = hdhomerun_channel_list_create(channelmap); if (!scan->channel_list) { free(scan); return NULL; } scan->next_channel = hdhomerun_channel_list_last(scan->channel_list); return scan; }
// 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, ¶ms->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 }