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); } }
// 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; }
void HDHRStreamHandler::GetTunerStatus(struct hdhomerun_tuner_status_t *status) { hdhomerun_device_get_tuner_status(_hdhomerun_device, NULL, status); }