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; }
void tl_hdhr_playback_manager_stop_streaming(TLHDHRPlaybackManager *self) { g_assert(self != NULL); hdhomerun_device_set_tuner_target(self->priv->playback_device, "none"); hdhomerun_device_tuner_lockkey_release(self->priv->playback_device); self->priv->playback_device = NULL; }
static int cmd_scan(const char *tuner_str, const char *filename) { if (hdhomerun_device_set_tuner_from_str(hd, tuner_str) <= 0) { fprintf(stderr, "invalid tuner number\n"); return -1; } char *ret_error; if (hdhomerun_device_tuner_lockkey_request(hd, &ret_error) <= 0) { fprintf(stderr, "failed to lock tuner\n"); if (ret_error) { fprintf(stderr, "%s\n", ret_error); } return -1; } hdhomerun_device_set_tuner_target(hd, "none"); char *channelmap; if (hdhomerun_device_get_tuner_channelmap(hd, &channelmap) <= 0) { fprintf(stderr, "failed to query channelmap from device\n"); return -1; } const char *channelmap_scan_group = hdhomerun_channelmap_get_channelmap_scan_group(channelmap); if (!channelmap_scan_group) { fprintf(stderr, "unknown channelmap '%s'\n", channelmap); return -1; } if (hdhomerun_device_channelscan_init(hd, channelmap_scan_group) <= 0) { fprintf(stderr, "failed to initialize channel scan\n"); return -1; } FILE *fp = NULL; if (filename) { fp = fopen(filename, "w"); if (!fp) { fprintf(stderr, "unable to create file: %s\n", filename); return -1; } } register_signal_handlers(sigabort_handler, sigabort_handler, siginfo_handler); int ret = 0; while (!sigabort_flag) { struct hdhomerun_channelscan_result_t result; ret = hdhomerun_device_channelscan_advance(hd, &result); if (ret <= 0) { break; } cmd_scan_printf(fp, "SCANNING: %lu (%s)\n", (unsigned long)result.frequency, result.channel_str ); ret = hdhomerun_device_channelscan_detect(hd, &result); if (ret <= 0) { break; } cmd_scan_printf(fp, "LOCK: %s (ss=%u snq=%u seq=%u)\n", result.status.lock_str, result.status.signal_strength, result.status.signal_to_noise_quality, result.status.symbol_error_quality ); if (result.transport_stream_id_detected) { cmd_scan_printf(fp, "TSID: 0x%04X\n", result.transport_stream_id); } int i; for (i = 0; i < result.program_count; i++) { struct hdhomerun_channelscan_program_t *program = &result.programs[i]; cmd_scan_printf(fp, "PROGRAM %s\n", program->program_str); } } hdhomerun_device_tuner_lockkey_release(hd); if (fp) { fclose(fp); } if (ret < 0) { fprintf(stderr, "communication error sending request to hdhomerun device\n"); } return ret; }