X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftv.c;h=cfd92dcce2a7ca76800f3a366a1d33338fbe921b;hb=f0e37edfb011436627c84eef75af65014a57ad6d;hp=fdae39fcd77eaf24a7fb636ba53975009bdbcf09;hpb=7fdb859322266c712bfcda78b7cf2572aaa3d3e5;p=profile%2Ftv%2Fapps%2Fnative%2Fair_livetv.git diff --git a/src/tv.c b/src/tv.c index fdae39f..cfd92dc 100644 --- a/src/tv.c +++ b/src/tv.c @@ -32,6 +32,11 @@ #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. */ @@ -43,6 +48,8 @@ struct _tv_info { /**< 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); @@ -337,7 +344,6 @@ int tv_epg_get_program(int service_id, struct tv_program_request *request) (TvServiceEpgCallback) _tv_epg_event_cb, request); if (r != TVS_ERROR_OK) { _ERR("failed to get epg get current program : %d", service_id); - free(request); return -1; } @@ -485,10 +491,47 @@ Eina_List *tv_channel_get_list() if (channel_info) channel_list = eina_list_append(channel_list, channel_info); - free(tvs_data); } } + 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; } @@ -590,12 +633,10 @@ Eina_List *tv_channel_search_by_number(long major, long minor) if (channel_info) channel_list = eina_list_append(channel_list, channel_info); - free(tvs_data); } free: - if (tvs_list) - g_list_free(tvs_list); + tv_service_free_channel_list(tvs_list); g_list_foreach(filter, (GFunc) _tv_channel_free_filter, NULL); g_list_free(filter); @@ -616,14 +657,26 @@ void tv_channel_del_list(Eina_List *channel_list) free(data); } -void _tv_channel_add_history(int service_id) +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. * @@ -668,7 +721,7 @@ int tv_channel_tune(void) } r = tv_service_live_get_last_channel(&service_id); - if (r < 0) { + if (r < 0 || service_id < 1) { _ERR("failed to get current service id"); service_id = DEFAULT_SERVICE; } @@ -687,6 +740,40 @@ int tv_channel_tune(void) } /** + * 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 @@ -699,6 +786,11 @@ int tv_channel_direct_tune(long major, long minor) 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, @@ -737,8 +829,7 @@ int tv_channel_direct_tune(long major, long minor) if (r == TVS_ERROR_OK) g_tv_info.viewing_locked_channel = -1; - g_list_foreach(tvs_list, (GFunc) g_free, NULL); - g_list_free(tvs_list); + tv_service_free_channel_list(tvs_list); free: g_list_foreach(filter, (GFunc) _tv_channel_free_filter, NULL); @@ -778,92 +869,6 @@ int tv_channel_tune_locked_channel(int service_id, char *password) } /** - * Tunes to next channel. - * - * Note that deleted channels and service channels will skipped. - * - * @return If the operation was sucessful 0 is returned; otherwise negative value is returned - */ -int tv_channel_next(void) -{ - TvServiceAntenna antenna_type; - int service_id, r; - - if (!g_tv_info.live_svc) { - _ERR("failed to get live service"); - return -1; - } - - r = tv_service_live_get_antenna_type(g_tv_info.live_svc, &antenna_type); - if (r < 0) { - _ERR("failed to get antenna type"); - return -1; - } - - r = tv_service_live_tune_up(g_tv_info.live_svc, - TV_SERVICE_CHANNEL_MODE_DIGITAL_ANALOG, antenna_type); - if (r < 0) { - _ERR("failed to tune up"); - return -1; - } - - g_tv_info.viewing_locked_channel = -1; - - r = tv_service_live_get_service_id(g_tv_info.live_svc, &service_id); - if (r < 0) { - _ERR("failed to get service id"); - return -1; - } - - _tv_channel_add_history(service_id); - - return 0; -} - -/** - * Tunes to previous channel. - * - * Note that deleted channels and service channels will skipped. - * - * @return If the operation was sucessful 0 is returned; otherwise negative value is returned - */ -int tv_channel_prev(void) -{ - TvServiceAntenna antenna_type; - int service_id, r; - - if (!g_tv_info.live_svc) { - _ERR("failed to get live service"); - return -1; - } - - r = tv_service_live_get_antenna_type(g_tv_info.live_svc, &antenna_type); - if (r < 0) { - _ERR("failed to get antenna type"); - return -1; - } - - r = tv_service_live_tune_down(g_tv_info.live_svc, - TV_SERVICE_CHANNEL_MODE_DIGITAL_ANALOG, antenna_type); - if (r < 0) { - _ERR("failed to tune down"); - return -1; - } - - g_tv_info.viewing_locked_channel = -1; - - r = tv_service_live_get_service_id(g_tv_info.live_svc, &service_id); - if (r < 0) { - _ERR("failed to get service id"); - return -1; - } - - _tv_channel_add_history(service_id); - - return 0; -} - -/** * Sets the channel's favorite status. * * @param service_id The channel id @@ -1023,30 +1028,6 @@ void tv_signal_cb_set(void (*cb)(void *data, int is_signal), void *data) } /** - * Sets window id for tv overlay. - * - * @param window_id The window id to overlay - * @return If the operation was sucessful 0 is returned; otherwise negative value is returned - */ -int tv_overlay_set(void *window_id) -{ - int r; - - if (!g_tv_info.live_svc) { - _ERR("failed to get live service"); - return -1; - } - - r = tv_service_live_set_window_overlay(g_tv_info.live_svc, window_id); - if (r < 0) { - _ERR("failed to set overlay"); - return -1; - } - - return 0; -} - -/** * Destory the tv service handles. * * @return If the operation was sucessful 0 is returned; otherwise negative value is returned @@ -1055,12 +1036,8 @@ int tv_destroy(void) { int r; - if (g_tv_info.live_svc) { - r = tv_service_live_destroy(g_tv_info.live_svc); - if (r != TVS_ERROR_OK) - _ERR("failed to destroy live service"); + if (g_tv_info.live_svc) g_tv_info.live_svc = NULL; - } r = tv_service_channel_info_destroy(); if (r < 0) @@ -1104,11 +1081,15 @@ int tv_create(void) 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: @@ -1126,10 +1107,9 @@ int tv_pause(void) int r; if (g_tv_info.live_svc) { - r = tv_service_live_destroy(g_tv_info.live_svc); + r = tv_service_live_tune_pause(g_tv_info.live_svc); if (r != TVS_ERROR_OK) - _ERR("failed to destroy live service"); - g_tv_info.live_svc = NULL; + _ERR("failed to pause live service"); } return 0; @@ -1151,10 +1131,24 @@ int tv_resume(void) { int r; - if (g_tv_info.live_svc) - return 0; + 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_create(&g_tv_info.live_svc); + 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; @@ -1167,7 +1161,7 @@ int tv_resume(void) goto err; } - return 1; + return 0; err: tv_destroy();