renatofilho@320: /** renatofilho@320: * GMyth Library renatofilho@320: * renatofilho@320: * @file gmyth/gmyth_remote_encoder.c renatofilho@320: * renatofilho@320: * @brief

GMythRecorder class defines functions for playing live tv. renatofilho@320: * renatofilho@320: * The remote encoder is used by gmyth_tvplayer to setup livetv. renatofilho@320: * renatofilho@320: * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia. renatofilho@320: * @author Hallyson Luiz de Morais Melo renatofilho@320: * renatofilho@320: *//* renatofilho@320: * renatofilho@320: * This program is free software; you can redistribute it and/or modify renatofilho@320: * it under the terms of the GNU Lesser General Public License as published by renatofilho@320: * the Free Software Foundation; either version 2 of the License, or renatofilho@320: * (at your option) any later version. renatofilho@320: * renatofilho@320: * This program is distributed in the hope that it will be useful, renatofilho@320: * but WITHOUT ANY WARRANTY; without even the implied warranty of renatofilho@320: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the renatofilho@320: * GNU General Public License for more details. renatofilho@320: * renatofilho@320: * You should have received a copy of the GNU Lesser General Public License renatofilho@320: * along with this program; if not, write to the Free Software renatofilho@320: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA renatofilho@320: */ renatofilho@320: renatofilho@320: #ifdef HAVE_CONFIG_H renatofilho@320: #include "config.h" renatofilho@320: #endif renatofilho@320: renatofilho@320: #include "gmyth_recorder.h" renatofilho@320: renatofilho@320: #include renatofilho@320: renatofilho@320: #include "gmyth_stringlist.h" renatofilho@320: #include "gmyth_util.h" renatofilho@320: #include "gmyth_debug.h" renatofilho@320: renatofilho@320: #define GMYTHTV_RECORDER_HEADER "QUERY_RECORDER" renatofilho@320: renatofilho@320: static void gmyth_recorder_class_init (GMythRecorderClass *klass); renatofilho@320: static void gmyth_recorder_init (GMythRecorder *object); renatofilho@320: renatofilho@320: static void gmyth_recorder_dispose (GObject *object); renatofilho@320: static void gmyth_recorder_finalize (GObject *object); renatofilho@320: renatofilho@320: G_DEFINE_TYPE(GMythRecorder, gmyth_recorder, G_TYPE_OBJECT) renatofilho@320: renatofilho@320: static void renatofilho@320: gmyth_recorder_class_init (GMythRecorderClass *klass) renatofilho@320: { renatofilho@320: GObjectClass *gobject_class; renatofilho@320: renatofilho@320: gobject_class = (GObjectClass *) klass; renatofilho@320: renatofilho@320: gobject_class->dispose = gmyth_recorder_dispose; renatofilho@320: gobject_class->finalize = gmyth_recorder_finalize; renatofilho@320: } renatofilho@320: renatofilho@320: static void renatofilho@320: gmyth_recorder_init (GMythRecorder *gmyth_remote_encoder) renatofilho@320: { renatofilho@320: } renatofilho@320: renatofilho@320: static void renatofilho@320: gmyth_recorder_dispose (GObject *object) renatofilho@320: { renatofilho@320: // GMythRecorder *gmyth_remote_encoder = GMYTH_RECORDER(object); renatofilho@320: renatofilho@320: G_OBJECT_CLASS (gmyth_recorder_parent_class)->dispose (object); renatofilho@320: } renatofilho@320: renatofilho@320: renatofilho@320: static void renatofilho@320: gmyth_recorder_finalize (GObject *object) renatofilho@320: { renatofilho@320: g_signal_handlers_destroy (object); renatofilho@320: renatofilho@320: GMythRecorder *recorder = GMYTH_RECORDER(object); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] Closing control socket", __FUNCTION__); renatofilho@320: gmyth_socket_close_connection(recorder->myth_socket); renatofilho@320: g_object_unref (recorder->myth_socket); renatofilho@320: renatofilho@320: G_OBJECT_CLASS (gmyth_recorder_parent_class)->finalize (object); renatofilho@320: } renatofilho@320: renatofilho@320: /** Creates a new instance of GMythRecorder. renatofilho@320: * renatofilho@320: * @return a new instance of GMythRecorder. renatofilho@320: */ renatofilho@320: GMythRecorder* renatofilho@320: gmyth_recorder_new (int num, GString *hostname, gshort port) renatofilho@320: { renatofilho@320: GMythRecorder *encoder = GMYTH_RECORDER ( g_object_new ( renatofilho@320: GMYTH_RECORDER_TYPE, FALSE )); renatofilho@320: renatofilho@320: encoder->recorder_num = num; renatofilho@320: encoder->hostname = g_string_new (hostname->str); renatofilho@320: encoder->port = port; renatofilho@320: renatofilho@320: return encoder; renatofilho@320: } renatofilho@320: renatofilho@320: /** Configures the remote encoder instance connecting it to Mythtv backend. renatofilho@320: * renatofilho@320: * @param recorder the GMythRecorder instance. renatofilho@320: * @return TRUE if successfull, FALSE if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_setup (GMythRecorder *recorder) renatofilho@320: { renatofilho@320: assert (recorder); renatofilho@320: gmyth_debug ("[%s] Creating socket and connecting to backend", __FUNCTION__); renatofilho@320: renatofilho@320: if (recorder->myth_socket == NULL) { renatofilho@320: renatofilho@320: recorder->myth_socket = gmyth_socket_new (); renatofilho@320: renatofilho@320: if (!gmyth_socket_connect_to_backend ( recorder->myth_socket, recorder->hostname->str, renatofilho@320: recorder->port, TRUE ) ) { renatofilho@320: g_warning ("GMythRemoteEncoder: Connection to backend failed"); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: } else { renatofilho@320: g_warning("Remote encoder socket already created\n"); renatofilho@320: } renatofilho@320: renatofilho@320: return TRUE; renatofilho@320: } renatofilho@320: renatofilho@320: /** Sends the SPAWN_LIVETV command through Mythtv protocol. This command renatofilho@320: * requests the backend to start capturing TV content. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @param tvchain_id The tvchain unique id. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_spawntv (GMythRecorder *recorder, GString *tvchain_id) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] Spawntv with tvchain_id = %s", __FUNCTION__, tvchain_id->str); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("SPAWN_LIVETV")); renatofilho@320: gmyth_string_list_append_string (str_list, tvchain_id); renatofilho@320: gmyth_string_list_append_int (str_list, 0); // PIP = FALSE (0) renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) { renatofilho@320: g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** renatofilho@320: * Sends the SPAWN_LIVETV command through Mythtv protocol. This command renatofilho@320: * requests the backend to start capturing TV content, but it doesn't need renatofilho@320: * the TV chain ID. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_spawntv_no_tvchain (GMythRecorder *recorder) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] Spawntv, no TV chain!", __FUNCTION__); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("SPAWN_LIVETV")); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) { renatofilho@320: g_warning ("[%s] Spawntv request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Sends the command STOP_LIVETV to Mythtv backend. renatofilho@320: * renatofilho@320: * @param recorder the GMythRecorder instance. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_stop_livetv (GMythRecorder *recorder) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s]", __FUNCTION__); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: gmyth_string_list_append_char_array( str_list, "STOP_LIVETV" ); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) { renatofilho@320: g_warning ("[%s] Stop livetv request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Sends the FRONTEND_READY command through Mythtv protocol. This command renatofilho@320: * advertises the backend to start capturing TV content. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @return TRUE if success, FALSE if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_send_frontend_ready_command (GMythRecorder *recorder) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ( "[%s] FRONTEND_READY with recorder id = %d", __FUNCTION__, recorder->recorder_num ); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("FRONTEND_READY")); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] FRONTEND_READY command request couldn't returns, reason: %s", __FUNCTION__, tmp_str->str); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) { renatofilho@320: g_warning ("[%s] FRONTEND_READY request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Send a CHECK_CHANNEL command request to the backend, in order to find if a renatofilho@320: * certain channel actually exists. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @param channel The new channel to be checked (string format). renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_check_channel_name (GMythRecorder *recorder, gchar* channel) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] CHECK_CHANNEL with channel = %s", __FUNCTION__, channel); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("CHECK_CHANNEL")); renatofilho@320: gmyth_string_list_append_char_array (str_list, channel); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] CHECK_CHANNEL request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2) == 0 || g_ascii_strncasecmp (tmp_str->str, "0", 1) == 0 ) { renatofilho@320: g_warning ("[%s] CHECK_CHANNEL request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Send a CHECK_CHANNEL command request to the backend, in order to find if a renatofilho@320: * certain channel actually exists. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @param channel The new channel to be checked (decimal integer value). renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_check_channel (GMythRecorder *recorder, gint channel) renatofilho@320: { renatofilho@320: return gmyth_recorder_check_channel_name( recorder, g_strdup_printf( "%d", channel ) ); renatofilho@320: } renatofilho@320: renatofilho@320: /** Send a SET_CHANNEL command request to the backend, to start streaming on another renatofilho@320: * TV content channel. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @param channel The new channel to be loaded. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_set_channel (GMythRecorder *recorder, gint channel) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] SET_CHANNEL with channel = %d", __FUNCTION__, channel); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("SET_CHANNEL")); renatofilho@320: gmyth_string_list_append_int (str_list, channel); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] SET_CHANNEL request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) { renatofilho@320: g_warning ("[%s] SET_CHANNEL request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Send a SET_CHANNEL command request to the backend, to start streaming on another renatofilho@320: * TV content channel. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @param channel The new channel to be loaded. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_set_channel_name (GMythRecorder *recorder, const gchar* channel) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] SET_CHANNEL with channel name = %s", __FUNCTION__, channel); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("SET_CHANNEL")); renatofilho@320: gmyth_string_list_append_char_array (str_list, channel); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] SET_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str ); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2) || g_ascii_strtoull( tmp_str->str, NULL, 10 ) == 0 ) { renatofilho@320: g_warning ("[%s] SET_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** renatofilho@320: * Changes the channel of the actual Recorder. renatofilho@320: * renatofilho@320: * CHANNEL_DIRECTION_UP - Go up one channel in the listing renatofilho@320: * renatofilho@320: * CHANNEL_DIRECTION_DOWN - Go down one channel in the listing renatofilho@320: * renatofilho@320: * CHANNEL_DIRECTION_FAVORITE - Go to the next favorite channel renatofilho@320: * renatofilho@320: * CHANNEL_DIRECTION_SAME - Stay renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @param direction The new channel direction where to move to. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_change_channel (GMythRecorder *recorder, const GMythRecorderChannelChangeDirection direction) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] CHANGE_CHANNEL to the channel direction = %u", __FUNCTION__, direction); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("CHANGE_CHANNEL")); renatofilho@320: gmyth_string_list_append_int (str_list, direction); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] CHANGE_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str ); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2) || g_ascii_strtoull( tmp_str->str, NULL, 10 ) == 0 ) { renatofilho@320: g_warning ("[%s] CHANGE_CHANNEL name request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** Send a PAUSE command request to the backend, to pause streaming on another renatofilho@320: * TV content channel. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @return true if success, false if any error happens. renatofilho@320: */ renatofilho@320: gboolean renatofilho@320: gmyth_recorder_pause_recording ( GMythRecorder *recorder ) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: gmyth_debug ("[%s] PAUSE", __FUNCTION__); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("PAUSE")); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: tmp_str = gmyth_string_list_get_string (str_list, 0); renatofilho@320: if (tmp_str == NULL) { renatofilho@320: g_warning ("[%s] PAUSE name request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: if (g_ascii_strncasecmp (tmp_str->str, "ok", 2)) { renatofilho@320: g_warning ("[%s] PAUSE name request returned %s", __FUNCTION__, tmp_str->str); renatofilho@320: g_object_unref (str_list); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return TRUE; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: /** renatofilho@320: * Requests the actual program info from the MythTV backend server. renatofilho@320: * renatofilho@320: * @param recorder The GMythRecorder instance. renatofilho@320: * @return The actual program info. renatofilho@320: */ renatofilho@320: GMythProgramInfo * renatofilho@320: gmyth_recorder_get_current_program_info ( GMythRecorder *recorder ) renatofilho@320: { renatofilho@320: GMythStringList *str_list; renatofilho@320: GMythProgramInfo *program_info = gmyth_program_info_new(); renatofilho@320: GString *tmp_str = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf ( tmp_str, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, tmp_str); renatofilho@320: renatofilho@320: if ( recorder->myth_socket->mythtv_version >= 26 ) renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("GET_CURRENT_RECORDING")); renatofilho@320: else renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("GET_PROGRAM_INFO")); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist (recorder->myth_socket, str_list); renatofilho@320: renatofilho@320: g_string_free (tmp_str, TRUE); renatofilho@320: renatofilho@320: if (str_list == NULL) { renatofilho@320: g_warning ("[%s] GET_PROGRAM_INFO request returned. Error getting program info, string list equals to NULL!", __FUNCTION__); renatofilho@320: return FALSE; renatofilho@320: } renatofilho@320: renatofilho@320: program_info = gmyth_program_info_from_string_list( str_list ); renatofilho@320: renatofilho@320: if ( NULL == program_info ) { renatofilho@320: g_warning ("[%s] GET_PROGRAM_INFO request returned. Error getting program info, it is equals to NULL!!!", __FUNCTION__); renatofilho@320: g_object_unref (program_info); renatofilho@320: return NULL; renatofilho@320: } renatofilho@320: renatofilho@320: g_object_unref (str_list); renatofilho@320: return program_info; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: gint64 renatofilho@320: gmyth_recorder_get_file_position ( GMythRecorder *recorder ) renatofilho@320: { renatofilho@320: gint64 pos = 0; renatofilho@320: GString *query = g_string_new( GMYTHTV_RECORDER_HEADER ); renatofilho@320: renatofilho@320: GMythStringList *str_list = gmyth_string_list_new (); renatofilho@320: renatofilho@320: g_string_append_printf( query, " %d", recorder->recorder_num ); renatofilho@320: renatofilho@320: gmyth_string_list_append_string (str_list, query); renatofilho@320: gmyth_string_list_append_char_array( str_list, "GET_FILE_POSITION" ); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist ( recorder->myth_socket, str_list ); renatofilho@320: renatofilho@320: if ( str_list != NULL && gmyth_string_list_length(str_list) > 0 ) renatofilho@320: { renatofilho@320: GString *str = NULL; renatofilho@320: if ( ( str = gmyth_string_list_get_string( str_list, 0 ) ) != NULL && strstr ( str->str, "bad" ) == NULL ) renatofilho@320: pos = gmyth_util_decode_long_long( str_list, 0 ); renatofilho@320: } renatofilho@320: renatofilho@320: #ifndef GMYTHTV_ENABLE_DEBUG renatofilho@320: g_print( "[%s] Got file position = %lld\n", __FUNCTION__, pos ); renatofilho@320: #endif renatofilho@320: if (str_list!=NULL) renatofilho@320: g_object_unref (str_list); renatofilho@320: renatofilho@320: return pos; renatofilho@320: renatofilho@320: } renatofilho@320: renatofilho@320: gboolean renatofilho@320: gmyth_recorder_is_recording ( GMythRecorder *recorder ) renatofilho@320: { renatofilho@320: gboolean ret = TRUE; renatofilho@320: renatofilho@320: g_return_val_if_fail( recorder != NULL, FALSE ); renatofilho@320: renatofilho@320: GMythStringList *str_list = gmyth_string_list_new (); renatofilho@320: GString *message = g_string_new (""); renatofilho@320: renatofilho@320: g_string_printf( message, "%s %d", GMYTHTV_RECORDER_HEADER, recorder->recorder_num); renatofilho@320: gmyth_string_list_append_string (str_list, message); renatofilho@320: gmyth_string_list_append_string (str_list, g_string_new ("IS_RECORDING")); renatofilho@320: renatofilho@320: gmyth_socket_sendreceive_stringlist ( recorder->myth_socket, str_list ); renatofilho@320: renatofilho@320: if ( str_list != NULL && gmyth_string_list_length(str_list) > 0 ) renatofilho@320: { renatofilho@320: GString *str = NULL; renatofilho@320: if ( ( str = gmyth_string_list_get_string( str_list, 0 ) ) != NULL && strcmp( str->str, "bad" )!= 0 ) renatofilho@320: { renatofilho@320: gint is_rec = gmyth_string_list_get_int( str_list, 0 ); renatofilho@320: if ( is_rec != 0 ) renatofilho@320: ret = TRUE; renatofilho@320: else renatofilho@320: ret = FALSE; renatofilho@320: } renatofilho@320: } renatofilho@320: gmyth_debug( "%s, stream is %s being recorded!\n", ret ? "YES" : "NO", ret ? "" : "NOT" ); renatofilho@320: //g_static_mutex_unlock (&mutex); renatofilho@320: renatofilho@320: if ( str_list != NULL ) renatofilho@320: g_object_unref (str_list); renatofilho@320: renatofilho@320: return ret; renatofilho@320: renatofilho@320: }