renatofilho@487: #ifdef HAVE_CONFIG_H renatofilho@487: #include "config.h" renatofilho@487: #endif renatofilho@487: renatofilho@487: #include renatofilho@487: #include renatofilho@487: #include renatofilho@487: #include renatofilho@487: #include renatofilho@487: #include renatofilho@487: #include renatofilho@487: #include renatofilho@487: renatofilho@487: #include "gmyth-stream-client.h" renatofilho@487: renatofilho@487: renatofilho@487: #define GMYTH_STREAM_CLIENT_GET_PRIVATE(obj) \ renatofilho@487: (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GMYTH_TYPE_STREAM_CLIENT, GMythStreamClientPrivate)) renatofilho@487: renatofilho@487: renatofilho@487: typedef struct _GMythStreamClientPrivate GMythStreamClientPrivate; renatofilho@487: renatofilho@487: struct _GMythStreamClientPrivate renatofilho@487: { renatofilho@487: GList *streams; renatofilho@487: gint sock; renatofilho@487: gboolean connected; renatofilho@487: }; renatofilho@487: renatofilho@487: typedef struct _StreamData StreamData; renatofilho@487: renatofilho@487: struct _StreamData renatofilho@487: { renatofilho@487: guint id; renatofilho@487: guint port; renatofilho@487: }; renatofilho@487: renatofilho@487: static void gmyth_stream_client_class_init (GMythStreamClientClass *klass); renatofilho@487: static void gmyth_stream_client_init (GMythStreamClient *object); renatofilho@487: static void gmyth_stream_client_dispose (GObject *object); renatofilho@487: static void gmyth_stream_client_finalize (GObject *object); renatofilho@487: renatofilho@487: G_DEFINE_TYPE(GMythStreamClient, gmyth_stream_client, G_TYPE_OBJECT) renatofilho@487: renatofilho@487: static void renatofilho@487: gmyth_stream_client_class_init (GMythStreamClientClass *klass) renatofilho@487: { renatofilho@487: GObjectClass *gobject_class; renatofilho@487: renatofilho@487: gobject_class = (GObjectClass *) klass; renatofilho@487: renatofilho@487: g_type_class_add_private (klass, sizeof (GMythStreamClientPrivate)); renatofilho@487: renatofilho@487: gobject_class->dispose = gmyth_stream_client_dispose; renatofilho@487: gobject_class->finalize = gmyth_stream_client_finalize; renatofilho@487: } renatofilho@487: renatofilho@487: static void renatofilho@487: gmyth_stream_client_init (GMythStreamClient *self) renatofilho@487: { renatofilho@487: } renatofilho@487: renatofilho@487: static void renatofilho@487: gmyth_stream_client_dispose (GObject *object) renatofilho@487: { renatofilho@487: gmyth_stream_client_disconnect (GMYTH_STREAM_CLIENT (object)); renatofilho@487: } renatofilho@487: renatofilho@487: renatofilho@487: static void renatofilho@487: gmyth_stream_client_finalize (GObject *object) renatofilho@487: { renatofilho@487: } renatofilho@487: renatofilho@487: GMythStreamClient* renatofilho@487: gmyth_stream_client_new () renatofilho@487: { renatofilho@487: return GMYTH_STREAM_CLIENT (g_object_new (GMYTH_TYPE_STREAM_CLIENT, NULL)); renatofilho@487: } renatofilho@487: renatofilho@487: gboolean renatofilho@487: gmyth_stream_client_connect (GMythStreamClient *self, const gchar *server, guint port) renatofilho@487: { renatofilho@487: struct sockaddr_in addr; renatofilho@487: struct hostent *hp; renatofilho@487: renatofilho@487: GMythStreamClientPrivate *priv = GMYTH_STREAM_CLIENT_GET_PRIVATE (self); renatofilho@487: renatofilho@487: g_return_val_if_fail (priv->connected == FALSE, TRUE); renatofilho@487: renatofilho@487: priv->sock = socket (PF_INET, SOCK_STREAM, 0); renatofilho@487: if (priv->sock == -1) { renatofilho@487: g_debug ("Fail to create sock"); renatofilho@487: return FALSE; renatofilho@487: } renatofilho@487: renatofilho@487: memset(&addr, 0, sizeof(addr)); renatofilho@487: hp = gethostbyname(server); renatofilho@487: memcpy(&addr, *(hp->h_addr_list),sizeof(struct in_addr)); renatofilho@487: addr.sin_family = AF_INET; renatofilho@487: addr.sin_port = htons (port); renatofilho@487: renatofilho@487: if (connect (priv->sock, (struct sockaddr *) &addr, sizeof (addr)) == -1) { renatofilho@487: g_debug ("Fail to connect with server"); renatofilho@487: shutdown (priv->sock, SHUT_RDWR); renatofilho@487: priv->sock = -1; renatofilho@487: return FALSE; renatofilho@487: } renatofilho@487: renatofilho@487: priv->connected = TRUE; renatofilho@487: return TRUE; renatofilho@487: } renatofilho@487: renatofilho@487: void renatofilho@487: gmyth_stream_client_disconnect (GMythStreamClient *self) renatofilho@487: { renatofilho@487: GMythStreamClientPrivate *priv = GMYTH_STREAM_CLIENT_GET_PRIVATE (self); renatofilho@487: renatofilho@487: g_return_if_fail (priv->connected == FALSE); renatofilho@487: renatofilho@487: GList *lst = priv->streams; renatofilho@487: renatofilho@487: for (; lst != NULL; lst = lst->next) { renatofilho@487: StreamData *data = (StreamData *) lst->data; renatofilho@487: gmyth_stream_client_close_stream (self, data->id); renatofilho@487: } renatofilho@487: renatofilho@487: close (priv->sock); renatofilho@487: shutdown (priv->sock, SHUT_RDWR); renatofilho@487: priv->sock = -1; renatofilho@487: priv->connected = FALSE; renatofilho@487: } renatofilho@487: renatofilho@487: guint renatofilho@487: gmyth_stream_client_open_stream (GMythStreamClient *self, renatofilho@487: const gchar* file_name, renatofilho@487: const gchar* mux, renatofilho@487: const gchar* vcodec, renatofilho@487: guint vbitrate, renatofilho@487: gdouble fps, renatofilho@487: const gchar* acodec, renatofilho@487: guint abitrate, renatofilho@487: guint width, guint height, renatofilho@487: guint port, renatofilho@487: const gchar* opt) renatofilho@487: { renatofilho@487: gint stream_id = 0; renatofilho@487: gchar *cmd; renatofilho@487: StreamData *data = NULL; renatofilho@487: GMythStreamClientPrivate *priv = GMYTH_STREAM_CLIENT_GET_PRIVATE (self); renatofilho@487: renatofilho@487: g_return_val_if_fail (priv->connected == TRUE, FALSE); renatofilho@487: renatofilho@487: if (send (priv->sock, "SETUP", 5, MSG_CONFIRM) == -1) renatofilho@487: return -1; renatofilho@487: renatofilho@487: cmd = g_strdup_printf ("%s %s %s %d %f %s %d %d %d %d %s", renatofilho@487: file_name, mux, vcodec, vbitrate, fps, renatofilho@487: acodec, abitrate, width, height, port, opt); renatofilho@487: renatofilho@487: renatofilho@487: if (send (priv->sock, cmd, strlen (cmd), MSG_CONFIRM) == -1) { renatofilho@487: g_free (cmd); renatofilho@487: return -1; renatofilho@487: } renatofilho@487: g_free (cmd); renatofilho@487: renatofilho@487: renatofilho@487: data = g_new0 (StreamData, 1); renatofilho@487: data->id = stream_id; renatofilho@487: data->port = port; renatofilho@487: renatofilho@487: priv->streams = g_list_append (priv->streams, data); renatofilho@487: return stream_id; renatofilho@487: } renatofilho@487: renatofilho@487: gboolean renatofilho@487: gmyth_stream_client_play_stream (GMythStreamClient *self, renatofilho@487: guint stream_id) renatofilho@487: { renatofilho@487: GMythStreamClientPrivate *priv = GMYTH_STREAM_CLIENT_GET_PRIVATE (self); renatofilho@487: renatofilho@487: g_return_val_if_fail (priv->connected == TRUE, FALSE); renatofilho@487: renatofilho@487: if (send (priv->sock, "PLAY", 4, MSG_MORE) == -1) { renatofilho@487: return FALSE; renatofilho@487: } renatofilho@487: return TRUE; renatofilho@487: } renatofilho@487: renatofilho@487: void renatofilho@487: gmyth_stream_client_pause_stream (GMythStreamClient *self, renatofilho@487: guint stream_id) renatofilho@487: { renatofilho@487: GMythStreamClientPrivate *priv = GMYTH_STREAM_CLIENT_GET_PRIVATE (self); renatofilho@487: renatofilho@487: g_return_if_fail (priv->connected == TRUE); renatofilho@487: renatofilho@487: if (send (priv->sock, "PAUSE", 5, MSG_MORE) == -1) { renatofilho@487: return; renatofilho@487: } renatofilho@487: } renatofilho@487: renatofilho@487: void renatofilho@487: gmyth_stream_client_close_stream (GMythStreamClient *self, renatofilho@487: guint stream_id) renatofilho@487: { renatofilho@487: GMythStreamClientPrivate *priv = GMYTH_STREAM_CLIENT_GET_PRIVATE (self); renatofilho@487: renatofilho@487: g_return_if_fail (priv->connected == TRUE); renatofilho@487: renatofilho@487: if (send (priv->sock, "STOP", 4, MSG_MORE) == -1) { renatofilho@487: return; renatofilho@487: } renatofilho@487: renatofilho@487: //TODO: remove from streams list renatofilho@487: renatofilho@487: }