summaryrefslogtreecommitdiff
path: root/src/tv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tv.c')
-rw-r--r--src/tv.c1169
1 files changed, 0 insertions, 1169 deletions
diff --git a/src/tv.c b/src/tv.c
deleted file mode 100644
index cfd92dc..0000000
--- a/src/tv.c
+++ /dev/null
@@ -1,1169 +0,0 @@
-/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <app.h>
-#include <iconv.h>
-#include <math.h>
-#include <app_debug.h>
-#include <app_contents.h>
-
-#include <tv_service_proxy.h>
-#include <tv_service_proxy_epg.h>
-
-#include <glib.h>
-#include <glib-object.h>
-
-#include "define.h"
-#include "tv.h"
-
-#define DEFAULT_SERVICE 1
-
-struct _channel_history {
- int service_id[2];
- unsigned int idx;
-};
-
-/**
- * The Storage structure to used by tv related functions and events.
- */
-struct _tv_info {
- /**< The handle to use tv service live api. */
- TvServiceLive live_svc;
- /**< The handle to use tv service epg api. */
- TvServiceEpg epg_svc;
-
- /**< Stores service id if tune to locked channel was succeeded. */
- int viewing_locked_channel;
- /**< Stores previous service id. */
- struct _channel_history history;
-
- /**< The function pointer to pass tv signal event */
- void (*signal_cb)(void *data, int is_signal);
- /**< An Additional data to passed to tv signal event */
- void *signal_cb_data;
-};
-
-static struct _tv_info g_tv_info;
-
-/**
- * Gets the tv_channel_info with supplied TvServiceChannel.
- *
- * Abstracts tv service data structure.
- *
- * @param channel The channel data defined by tv service
- * @return Channel information, or NULL if fails
- */
-static struct tv_channel_info *_tv_channel_get_info(TvServiceChannel *channel)
-{
- struct tv_channel_info *channel_info = NULL;
-
- if (!channel) {
- _ERR("failed to get channel");
- return NULL;
- }
-
- channel_info = calloc(1, sizeof(*channel_info));
- if (!channel_info) {
- _ERR("failed to calloc channel info");
- return NULL;
- }
-
- channel_info->service_id = channel->service_id;
- channel_info->channel_major = channel->major;
- channel_info->channel_minor = channel->minor;
- channel_info->channel_type = channel->channel_type;
- channel_info->locked = channel->locked;
- channel_info->digital = channel->digital;
- channel_info->favorite = channel->favorite;
- channel_info->remembered = channel->remembered;
- strncpy(channel_info->channel_name, channel->program_name,
- CHANNEL_NAME_MAX);
-
- if (channel->service_id == g_tv_info.viewing_locked_channel)
- channel_info->tune_locked = EINA_TRUE;
-
- return channel_info;
-}
-
-/**
- * Clones the tv_channel_info.
- *
- * @param channel_info tv_channel_info pointer to be cloned
- * @return Channel information, or NULL if fails
- */
-const struct tv_channel_info *tv_channel_clone_info(
- const struct tv_channel_info *channel_info)
-{
- struct tv_channel_info *new_channel_info = NULL;
-
- if (!channel_info) {
- _ERR("failed to get channel info");
- return NULL;
- }
-
- new_channel_info = calloc(1, sizeof(*channel_info));
- if (!new_channel_info) {
- _ERR("failed to calloc channel info");
- return NULL;
- }
-
- memcpy(new_channel_info, channel_info, sizeof(*new_channel_info));
-
- return new_channel_info;
-}
-
-/**
- * Frees the tv_channel_info.
- *
- * @param channel_info tv_channel_info pointer to be freed
- */
-void tv_channel_del_info(const struct tv_channel_info *channel_info)
-{
- if (!channel_info) {
- _ERR("failed to get channel info");
- return;
- }
-
- free((void *)channel_info);
-}
-
-/**
- * Gets current channel's TvServiceChannel data from tv service.
- *
- * @param channel The pointer to store TvServiceChannel
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-static int _tv_get_channel(TvServiceChannel *channel)
-{
- gint svc_id;
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- r = tv_service_live_get_service_id(g_tv_info.live_svc, &svc_id);
- if (r < 0) {
- _ERR("failed to get service id");
- return -1;
- }
-
- r = tv_service_get_channel(svc_id, channel);
- if (r < 0) {
- _ERR("failed to get channel");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Returns current channel's info.
- *
- * tv_channel_get_info retrieves current channel's information
- * from tv service.
- *
- * @return Returns current channel info, or NULL if fails
- */
-const struct tv_channel_info *tv_channel_get_info(void)
-{
- const struct tv_channel_info *channel_info;
- TvServiceChannel channel;
- int r;
-
- r = _tv_get_channel(&channel);
- if (r < 0) {
- _ERR("failed to get channel");
- return NULL;
- }
-
- channel_info = _tv_channel_get_info(&channel);
-
- return channel_info;
-}
-
-/**
- * Returns tv_program_info with supplied TvServiceEpgEventData.
- *
- * Abstracts tv service data structure.
- *
- * @param prog TvServiceEpgEventData passed from tv service
- * @return Returns tv_program_info, or NULL if fails
- */
-static struct tv_program_info *_tv_get_program_info(TvServiceEpgEventData *prog)
-{
- struct tv_program_info *prog_info;
-
- prog_info = calloc(1, sizeof(*prog_info));
- if (!prog_info) {
- _ERR("failed to calloc program info");
- return NULL;
- }
-
- prog_info->service_id = prog->service_id;
- prog_info->start_time = prog->start_time;
- prog_info->end_time = prog->start_time + prog->length_in_seconds;
- prog_info->duration = prog->length_in_seconds;
- prog_info->current_time = prog->current_time;
- strncpy(prog_info->prog_title, (char *)prog->title_text,
- sizeof(prog_info->prog_title) - 1);
- strncpy(prog_info->prog_description, (char *)prog->extended_text,
- sizeof(prog_info->prog_description) - 1);
-
- return prog_info;
-}
-
-/**
- * Gets current channel's service id from tv service.
- *
- * @param service_id The pointer to store service id
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_get_current_service_id(int *service_id)
-{
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- r = tv_service_live_get_service_id(g_tv_info.live_svc, service_id);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get current service info");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Frees epg list.
- *
- * @param epg_list Eina_List to be freed
- */
-static void _tv_epg_del_list(Eina_List *epg_list)
-{
- struct tv_program_info *data;
-
- EINA_LIST_FREE(epg_list, data)
- free(data);
-}
-
-/**
- * Callback function to get EPG program list from tv service.
- *
- * _tv_epg_event_cb is called from tv service when banner
- * have requested to get program data.
- * If this function is called, then derives program list from epg_list
- * and calls banner's callback function which included in user_data.
- *
- * @param type Event type
- * @param epg_list EPG program list
- * @param user_data tv_program_request to handle request
- */
-static void _tv_epg_event_cb(tvs_epg_event_e type, GList *epg_list,
- void *user_data)
-{
- int i;
- Eina_List *list = NULL;
- TvServiceEpgEventData *epg_data;
- struct tv_program_info *prog_info;
- struct tv_program_request *request;
-
- if (!user_data) {
- _ERR("failed to get user_data");
- return;
- }
-
- for (i = 0; i < g_list_length(epg_list); i++) {
- epg_data = (TvServiceEpgEventData *)
- g_list_nth_data(epg_list, i);
-
- if (!epg_data)
- continue;
-
- prog_info = _tv_get_program_info(epg_data);
- if (prog_info)
- list = eina_list_append(list, prog_info);
- }
-
- request = (struct tv_program_request *) user_data;
- if (request->tv_program_cb)
- request->tv_program_cb(list, request->user_data);
-
- if (list)
- _tv_epg_del_list(list);
-
- free(request);
-}
-
-/**
- * Send a request to tv service to get a current program with supplied service_id.
- *
- * Beware that service_id should be current tuned channel.
- * If not, calling this function may cause unexpected behavior.
- * And note that get a EPG program is asynchronous operation.
- * So tv_program_request should be supplied to get a result from tv service.
- *
- * @param service_id The channel id to get current program
- * @param request The structure for return program data which contains function pointer
- * and additional data for banner
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_epg_get_program(int service_id, struct tv_program_request *request)
-{
- int r;
-
- if (!g_tv_info.epg_svc) {
- _ERR("failed to get epg service");
- return -1;
- }
-
- if (!request) {
- _ERR("failed to get tv_program_request");
- return -1;
- }
-
- r = tv_service_epg_get_current_program(g_tv_info.epg_svc, service_id,
- (TvServiceEpgCallback) _tv_epg_event_cb, request);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get epg get current program : %d", service_id);
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Gets a cached current program with supplied service_id from tv service.
- *
- * Note that this function is vaild only when tv service having a cached data
- * on that channel.
- * To have a cached data, the channel ever been tuned before calling
- * this function.
- *
- * @param service_id The channel id to get current program
- * @param request The structure for return program data which contains
- * function pointer and additional data for banner
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_epg_get_cache_program(int service_id, struct tv_program_request *request)
-{
- Eina_List *list = NULL;
- TvServiceEpgEventData epg_data;
- struct tv_program_info *prog_info;
-
- int r;
-
- if (!g_tv_info.epg_svc) {
- _ERR("failed to get epg service");
- return -1;
- }
-
- if (!request) {
- _ERR("failed to get tv_program_request");
- return -1;
- }
-
- r = tv_service_epg_get_cache_current_program(
- g_tv_info.epg_svc, service_id, &epg_data);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get epg get cached current program : %d",
- service_id);
- return -1;
- }
-
- prog_info = _tv_get_program_info(&epg_data);
- if (prog_info)
- list = eina_list_append(list, prog_info);
-
- if (request->tv_program_cb)
- request->tv_program_cb(list, request->user_data);
-
- if (list)
- _tv_epg_del_list(list);
-
- free(request);
-
- return 0;
-}
-
-/**
- * Sends a request to tv service to get programs with supplied service_id.
- *
- * Beware that service_id should be current tuned channel.
- * If not, calling this function may cause unexpected behavior.
- * And note that get a EPG program is asynchronous operation.
- * So tv_program_request should be supplied to get a result from tv service.
- *
- * @param service_id The channel id to get current program
- * @param request The structure for return program data which contains function pointer and additional data for banner
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_epg_get_program_list(int service_id,
- struct tv_program_request *request)
-{
- int r;
-
- if (!g_tv_info.epg_svc) {
- _ERR("failed to get epg service");
- return -1;
- }
-
- if (!request) {
- _ERR("failed to get tv_program_request");
- return -1;
- }
-
- r = tv_service_epg_get_program_list(g_tv_info.epg_svc, service_id,
- TVS_EPG_CURRENT_TIME, EPG_PROGRAM_OFFSET,
- (TvServiceEpgCallback) _tv_epg_event_cb, request);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get epg get current program");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Frees the TvServiceFilterNode.
- *
- * @param data TvServiceFilterNode pointer to be freed
- */
-static void _tv_channel_free_filter(gpointer data)
-{
- TvServiceFilterNode *filter_node;
-
- if (!data)
- return;
-
- filter_node = (TvServiceFilterNode *) data;
-
- g_value_unset(filter_node->value);
- g_free(filter_node->value);
- g_free(filter_node);
-}
-
-/**
- * Gets a available channel list.
- *
- * Note that deleted channels and service channels are excluded by default.
- *
- * @return Available channel list, or NULL if fails
- */
-Eina_List *tv_channel_get_list()
-{
- GList *tvs_list = NULL;
- Eina_List *channel_list = NULL;
- TvServiceChannel *tvs_data = NULL;
- const struct tv_channel_info *channel_info;
- int r, i;
-
- r = tv_service_get_channel_list(
- TV_SERVICE_CHANNEL_MODE_DIGITAL_ANALOG,
- TV_SERVICE_ANTENNA_TYPE_ALL, &tvs_list);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get channel list");
- return NULL;
- }
-
- for (i = 0; i < g_list_length(tvs_list); i++) {
- tvs_data = (TvServiceChannel *) g_list_nth_data(tvs_list, i);
- if (tvs_data) {
- channel_info = _tv_channel_get_info(tvs_data);
- if (channel_info)
- channel_list = eina_list_append(channel_list,
- channel_info);
- }
- }
-
- tv_service_free_channel_list(tvs_list);
-
- return channel_list;
-}
-
-/**
- * Gets a favorite channel list.
- *
- * @return Favorite channel list, or NULL if fails
- */
-Eina_List *tv_channel_get_favorite_list()
-{
- GList *tvs_list = NULL;
- Eina_List *channel_list = NULL;
- TvServiceChannel *tvs_data = NULL;
- const struct tv_channel_info *channel_info;
- int r, i;
-
- r = tv_service_get_channel_list(
- TV_SERVICE_CHANNEL_MODE_FAVORITE,
- TV_SERVICE_ANTENNA_TYPE_ALL, &tvs_list);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get channel list");
- return NULL;
- }
-
- for (i = 0; i < g_list_length(tvs_list); i++) {
- tvs_data = (TvServiceChannel *) g_list_nth_data(tvs_list, i);
- if (tvs_data) {
- channel_info = _tv_channel_get_info(tvs_data);
- if (channel_info)
- channel_list = eina_list_append(channel_list,
- channel_info);
- }
- }
-
- tv_service_free_channel_list(tvs_list);
-
- return channel_list;
-}
-
-TvServiceFilterNode *_tv_channel_get_filter(
- TvServiceChannelDataAttr attribute, int type, void *data)
-{
- TvServiceFilterNode *filter;
- GValue *value;
-
- filter = g_malloc0(sizeof(*filter));
- if (!filter)
- return NULL;
-
- filter->attribute = attribute;
-
- value = g_malloc0(sizeof(GValue));
- if (!value) {
- g_free(filter);
- return NULL;
- }
-
- switch (type) {
- case G_TYPE_STRING:
- g_value_init(value, G_TYPE_STRING);
- g_value_set_string(value, data);
-
- filter->match_type = CHANNEL_FILTER_MATCH_CONTAIN;
- break;
- case G_TYPE_INT:
- g_value_init(value, G_TYPE_INT);
- g_value_set_int(value, (gint) data);
-
- filter->match_type = CHANNEL_FILTER_MATCH_EQUAL;
- break;
- }
- filter->value = value;
-
- return filter;
-}
-
-/**
- * Search channels that are starts with supplied major and minor number.
- *
- * Note that deleted channels and service channels are excluded by default.
- *
- * @param major Major channel number to search
- * @param minor Minor channel number to search
- * @return Found channel list, or NULL if fails
- */
-Eina_List *tv_channel_search_by_number(long major, long minor)
-{
- char buf[CHANNEL_FILTER_STRING_MAX_LEN];
- GList *tvs_list = NULL, *filter = NULL;
- TvServiceFilterNode *filter_node;
- TvServiceChannel *tvs_data;
- Eina_List *channel_list = NULL;
- const struct tv_channel_info *channel_info;
- int i, r;
-
- if (major > 0 && major < MAJOR_MAX) {
- snprintf(buf, CHANNEL_FILTER_STRING_MAX_LEN, "%ld", major);
-
- filter_node = _tv_channel_get_filter(
- TV_SERVICE_CHANNEL_DATA_MAJOR_NUMBER,
- G_TYPE_STRING, buf);
- if (filter_node)
- filter = g_list_append(filter, (gpointer)filter_node);
- }
-
- if (minor > 0 && minor < MINOR_MAX) {
- snprintf(buf, CHANNEL_FILTER_STRING_MAX_LEN, "%ld", minor);
-
- filter_node = _tv_channel_get_filter(
- TV_SERVICE_CHANNEL_DATA_MINOR_NUMBER,
- G_TYPE_STRING, buf);
- if (filter_node)
- filter = g_list_append(filter, (gpointer)filter_node);
- }
-
- if (!filter) {
- _ERR("failed to get filter");
- return NULL;
- }
-
- r = tv_service_get_channel_list_ex(
- TV_SERVICE_CHANNEL_MODE_ALL_DIGITAL_ANALOG,
- TV_SERVICE_ANTENNA_TYPE_ALL, &tvs_list, filter, 0);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to get channel list");
- goto free;
- }
-
- for (i = 0; i < g_list_length(tvs_list); i++) {
- tvs_data = (TvServiceChannel *) g_list_nth_data(tvs_list, i);
- if (!tvs_data)
- continue;
-
- channel_info = _tv_channel_get_info(tvs_data);
- if (channel_info)
- channel_list = eina_list_append(channel_list,
- channel_info);
- }
-
-free:
- tv_service_free_channel_list(tvs_list);
-
- g_list_foreach(filter, (GFunc) _tv_channel_free_filter, NULL);
- g_list_free(filter);
-
- return channel_list;
-}
-
-/**
- * Frees the tv_channel_info.
- *
- * @param channel_list channel_list pointer to be freed
- */
-void tv_channel_del_list(Eina_List *channel_list)
-{
- struct tv_channel_info *data;
-
- EINA_LIST_FREE(channel_list, data)
- free(data);
-}
-
-static void _tv_channel_add_history(int service_id)
-{
- char buf[128];
-
- g_tv_info.history.service_id[g_tv_info.history.idx++ % 2]
- = service_id;
-
- snprintf(buf, sizeof(buf), "%d", service_id);
- app_contents_recent_add(CONTENTS_CHANNEL, buf);
-}
-
-static int _tv_channel_get_history(void)
-{
- int service_id;
-
- service_id = g_tv_info.history.service_id[g_tv_info.history.idx % 2];
-
- return service_id;
-}
-
-/**
- * Tunes to specific channel with service id.
- *
- * @param service_id The channel id
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_tune_with_service_id(int service_id)
-{
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- r = tv_service_live_tune(g_tv_info.live_svc, service_id);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to set service");
- return -1;
- }
-
- _tv_channel_add_history(service_id);
-
- g_tv_info.viewing_locked_channel = -1;
-
- return 0;
-}
-
-/**
- * Tunes to last viewed channel.
- *
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_tune(void)
-{
- int service_id;
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- r = tv_service_live_get_last_channel(&service_id);
- if (r < 0 || service_id < 1) {
- _ERR("failed to get current service id");
- service_id = DEFAULT_SERVICE;
- }
-
- r = tv_service_live_tune(g_tv_info.live_svc, service_id);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to set service");
- return -1;
- }
-
- _tv_channel_add_history(service_id);
-
- g_tv_info.viewing_locked_channel = -1;
-
- return 0;
-}
-
-/**
- * Tunes to previously viewed channel.
- *
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_tune_prev_channel(void)
-{
- int service_id;
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- service_id = _tv_channel_get_history();
- if (service_id < 1) {
- _ERR("no previous channel");
- return -1;
- }
-
- r = tv_service_live_tune(g_tv_info.live_svc, service_id);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to set service");
- return -1;
- }
-
- _tv_channel_add_history(service_id);
-
- g_tv_info.viewing_locked_channel = -1;
-
- return 0;
-}
-
-/**
- * Tunes to specific channel with major and minor.
- *
- * @param service_id The channel id
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_direct_tune(long major, long minor)
-{
- GList *tvs_list = NULL, *filter = NULL;
- TvServiceFilterNode *filter_node;
- TvServiceChannel *tvs_data;
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- if (major > 0 && major < MAJOR_MAX) {
- filter_node = _tv_channel_get_filter(
- TV_SERVICE_CHANNEL_DATA_MAJOR_NUMBER,
- G_TYPE_INT, (void *) major);
- if (filter_node)
- filter = g_list_append(filter, (gpointer)filter_node);
- }
-
- if (minor > 0 && minor < MINOR_MAX) {
- filter_node = _tv_channel_get_filter(
- TV_SERVICE_CHANNEL_DATA_MINOR_NUMBER,
- G_TYPE_INT, (void *) minor);
- if (filter_node)
- filter = g_list_append(filter, (gpointer)filter_node);
- }
-
- if (!filter) {
- _ERR("failed to get filter");
- return -1;
- }
-
- r = tv_service_get_channel_list_ex(
- TV_SERVICE_CHANNEL_MODE_ALL_DIGITAL_ANALOG,
- TV_SERVICE_ANTENNA_TYPE_ALL, &tvs_list, filter, 0);
- if (r != TVS_ERROR_OK)
- goto free;
-
- tvs_data = (TvServiceChannel *) g_list_nth_data(tvs_list, 0);
- if (tvs_data)
- r = tv_channel_tune_with_service_id(tvs_data->service_id);
- else {
- _ERR("failed to get tvs_data");
- r = -1;
- }
-
- if (r == TVS_ERROR_OK)
- g_tv_info.viewing_locked_channel = -1;
-
- tv_service_free_channel_list(tvs_list);
-
-free:
- g_list_foreach(filter, (GFunc) _tv_channel_free_filter, NULL);
- g_list_free(filter);
-
- return r;
-}
-
-/**
- * Tunes to locked channel.
- *
- * @param service_id The channel id
- * @param password 4 digit password
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_tune_locked_channel(int service_id, char *password)
-{
- int r;
-
- if (!g_tv_info.live_svc) {
- _ERR("failed to get live service");
- return -1;
- }
-
- r = tv_service_live_tune_locked_channel(g_tv_info.live_svc,
- service_id, password);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to set service");
- return -1;
- }
-
- _tv_channel_add_history(service_id);
-
- g_tv_info.viewing_locked_channel = service_id;
-
- return 0;
-}
-
-/**
- * Sets the channel's favorite status.
- *
- * @param service_id The channel id
- * @param flag The value to be set
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_set_favorite(int service_id, Eina_Bool flag)
-{
- int r;
-
- if (flag) {
- r = tv_service_add_favorite_channel(service_id);
- if (r < 0) {
- _ERR("failed to add favorite channel");
- return -1;
- }
- } else {
- r = tv_service_delete_favorite_channel(service_id);
- if (r < 0) {
- _ERR("failed to delete favorite channel");
- return -1;
- }
- }
-
- return 0;
-}
-
-/**
- * Adds the channel.
- *
- * If channel is added, the channel will be included at
- * tv_channel_next, tv_channel_prev and tv_channel_get_list.
- *
- * @param service_id The channel id
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_add_channel(int service_id)
-{
- int r;
-
- r = tv_service_add_channel(service_id);
- if (r < 0) {
- _ERR("failed to add channel");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Deletes the channel.
- *
- * If channel is deleted, the channel will be omitted at
- * tv_channel_next, tv_channel_prev and tv_channel_get_list.
- *
- * @param service_id The channel id
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_del_channel(int service_id)
-{
- int r;
-
- r = tv_service_delete_channel(service_id);
- if (r < 0) {
- _ERR("failed to delete channel");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Locks the channel.
- *
- * @param service_id The channel id
- * @param password 4 digits password
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_lock_channel(int service_id, char *password)
-{
- int r;
-
- r = tv_service_lock_channel(service_id, password);
- if (r < 0) {
- _ERR("failed to lock channel");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Unlocks the channel.
- *
- * @param service_id The channel id
- * @param password 4 digits password
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_channel_unlock_channel(int service_id, char *password)
-{
- int r;
-
- r = tv_service_unlock_channel(service_id, password);
- if (r < 0) {
- _ERR("failed to unlock channel");
- return -1;
- }
-
- return 0;
-}
-
-/**
- * Callback function for receives tv service events.
- *
- * @param event Event type
- * @param user_data Not in use
- * @param data Event specific detailed data
- */
-void _tv_service_event_cb(TvServiceLiveEvent event,
- gpointer user_data, const gpointer data)
-{
- gboolean *lock_status;
-
- switch (event) {
- case TV_SERVICE_LIVE_EVENT_TUNER_LOCK:
- if (!data) {
- _ERR("failed to get data");
- break;
- }
-
- lock_status = (gboolean *) data;
- if (g_tv_info.signal_cb)
- g_tv_info.signal_cb(g_tv_info.signal_cb_data,
- *lock_status);
- break;
- case TV_SERVICE_LIVE_EVENT_AUTO_DESTROY:
- g_tv_info.live_svc = NULL;
- break;
- case TV_SERVICE_LIVE_EVENT_RESOLUTION:
- case TV_SERVICE_LIVE_EVENT_BEGIN:
- case TV_SERVICE_LIVE_EVENT_CHANNEL_LOCK:
- case TV_SERVICE_LIVE_EVENT_CHANNEL_UNLOCK:
- break;
- }
-}
-
-/**
- * Sets tv signal callback function.
- *
- * @param cb The function pointer to get callback
- * @param data An Additional data to passed to callback
- */
-void tv_signal_cb_set(void (*cb)(void *data, int is_signal), void *data)
-{
- g_tv_info.signal_cb = cb;
- g_tv_info.signal_cb_data = data;
-}
-
-/**
- * Destory the tv service handles.
- *
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_destroy(void)
-{
- int r;
-
- if (g_tv_info.live_svc)
- g_tv_info.live_svc = NULL;
-
- r = tv_service_channel_info_destroy();
- if (r < 0)
- _ERR("failed to destroy channel info service");
-
- if (g_tv_info.epg_svc) {
- r = tv_service_epg_destroy(g_tv_info.epg_svc);
- if (r != 0)
- _ERR("failed to destroy epg service");
- g_tv_info.epg_svc = NULL;
- }
-
- return 0;
-}
-
-/**
- * Create the tv service handles.
- *
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_create(void)
-{
- int r;
-
- r = tv_service_live_create(&g_tv_info.live_svc);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to create live service");
- goto err;
- }
-
- r = tv_service_live_register_callback(g_tv_info.live_svc,
- _tv_service_event_cb, NULL);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to register live callback");
- goto err;
- }
-
- r = tv_service_channel_info_create();
- if (r != TVS_ERROR_OK) {
- _ERR("failed to create channel info service");
- goto err;
- }
-
- /*
- r = tv_service_epg_create(&g_tv_info.epg_svc);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to create epg service");
- goto err;
- }
- */
-
- memset(&g_tv_info.history, 0, sizeof(g_tv_info.history));
-
- return 0;
-err:
- tv_destroy();
- return -1;
-}
-
-/**
- * Pause the tv service handles.
- *
- * @return If the operation was sucessful 0 is returned; otherwise negative value is returned
- */
-int tv_pause(void)
-{
- int r;
-
- if (g_tv_info.live_svc) {
- r = tv_service_live_tune_pause(g_tv_info.live_svc);
- if (r != TVS_ERROR_OK)
- _ERR("failed to pause live service");
- }
-
- return 0;
-}
-
-/**
- * Resume the tv service handles.
- *
- * Live service could be destroyed by tv service while app is pausing.
- * If live service is destroyed, then _tv_service_event_cb sets
- * g_tv_info.live_svc to NULL.
- * So if g_tv_info.live_svc is NULL, then recreates live service and returns 1.
- * Therefore, if tv_resume returns 1, then app needs to be set overlay and tune.
- * Or returns 0, then app just needs to set overlay.
- *
- * @return 0 if successful; 1 if live service was destroyed; otherwise negative value is returned
- */
-int tv_resume(void)
-{
- int r;
-
- if (!g_tv_info.live_svc) {
- r = tv_service_live_create(&g_tv_info.live_svc);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to create live service");
- goto err;
- }
-
- r = tv_service_live_register_callback(g_tv_info.live_svc,
- _tv_service_event_cb, NULL);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to register live callback");
- goto err;
- }
-
- return 1;
- }
-
- r = tv_service_live_tune_resume(g_tv_info.live_svc);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to create live service");
- goto err;
- }
-
- r = tv_service_live_register_callback(g_tv_info.live_svc,
- _tv_service_event_cb, NULL);
- if (r != TVS_ERROR_OK) {
- _ERR("failed to register live callback");
- goto err;
- }
-
- return 0;
-
-err:
- tv_destroy();
- return -1;
-}