gboolean tl_hdhr_playback_manager_stream_channel_to_ip(TLHDHRPlaybackManager *self, guint32 frequency, guint32 program_id, uint32_t device_id, gchar *ip, guint port) { gboolean succeeded; gchar *url; gchar *freq_str; gchar *pid_str; g_assert(self != NULL); g_assert(ip != NULL); succeeded = FALSE; if (self->priv->playback_device != NULL) { tl_hdhr_playback_manager_stop_streaming(self); } self->priv->playback_device = tl_hdhr_manager_get_tuner(TL_HDHR_MANAGER(self), device_id); if (self->priv->playback_device == NULL) { g_error("Could not acquire tuner."); } else { g_debug("Streaming using device %X and tuner %d", device_id, hdhomerun_device_get_tuner(self->priv->playback_device)); freq_str = g_strdup_printf("%d", frequency); pid_str = g_strdup_printf("%d", program_id); url = g_strdup_printf("udp://%s:%d", ip, port); hdhomerun_device_set_tuner_channel(self->priv->playback_device, freq_str); hdhomerun_device_set_tuner_program(self->priv->playback_device, pid_str); succeeded = (gboolean) hdhomerun_device_set_tuner_target(self->priv->playback_device, url); g_free(freq_str); g_free(pid_str); } g_free(url); return succeeded; }
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); } }
// 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 }