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;
}
Esempio n. 3
0
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;
}