# HG changeset patch # User rosfran # Date 1169167909 0 # Node ID 890b023c759f430e1be5e9e4dcd6a5b45d7bc1c2 # Parent ed5172cf0f1b30a6a4505a071cc8f9c4c176cfd5 [svn r278] Added LiveTV streaming to the gnomevfs mythtv plug-in. diff -r ed5172cf0f1b -r 890b023c759f libgnomevfs2-mythtv/README --- a/libgnomevfs2-mythtv/README Thu Jan 18 21:03:14 2007 +0000 +++ b/libgnomevfs2-mythtv/README Fri Jan 19 00:51:49 2007 +0000 @@ -1,3 +1,7 @@ URI: myth://host:port/filename +or, when downloading LiveTV content... + +URI: myth://user:password@host:port/?dbname&channel=channel_num + sample: gnomevfs-cat myth://127.0.0.1:7654/video.nuv diff -r ed5172cf0f1b -r 890b023c759f libgnomevfs2-mythtv/modules/mythtv-method.c --- a/libgnomevfs2-mythtv/modules/mythtv-method.c Thu Jan 18 21:03:14 2007 +0000 +++ b/libgnomevfs2-mythtv/modules/mythtv-method.c Fri Jan 19 00:51:49 2007 +0000 @@ -27,12 +27,16 @@ #include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define GST_MYTHTV_ID_NUM 1 #define MYTHTV_VERSION_DEFAULT 30 +#define MYTHTV_TRANSFER_MAX_WAITS 100 #define MYTHTV_BUFFER_SIZE 1024*64 @@ -45,6 +49,8 @@ typedef struct { GMythFileTransfer *file_transfer; + GMythLiveTV *livetv; + gint channel_num; gint mythtv_version; guint64 content_size; @@ -65,7 +71,10 @@ { MythtvHandle *myth_handle; GMythBackendInfo *backend_info; - gboolean ret; + GMythURI *gmyth_uri = NULL; + gboolean ret = TRUE; + gboolean is_livetv = FALSE; + gint wait_to_transfer = 0; _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL); _GNOME_VFS_METHOD_PARAM_CHECK (uri != NULL); @@ -82,36 +91,83 @@ /* Initialize mythtv handler*/ myth_handle->file_transfer = NULL; + myth_handle->livetv = NULL; myth_handle->mythtv_version = MYTHTV_VERSION_DEFAULT; myth_handle->bytes_read = 0; myth_handle->content_size = -1; - /* Creates and fills out the backend info structure */ - backend_info = gmyth_backend_info_new_full ( - gnome_vfs_uri_get_host_name (uri), - NULL, NULL, NULL, - gnome_vfs_uri_get_host_port (uri)); + /* Creates and fills out the backend info structure */ + backend_info = gmyth_backend_info_new_with_uri ( gnome_vfs_uri_to_string( uri, GNOME_VFS_URI_HIDE_NONE ) ); + + /* creates an instance of */ + gmyth_uri = gmyth_uri_new_with_value( gnome_vfs_uri_to_string( uri, GNOME_VFS_URI_HIDE_NONE ) ); + + /* Connect to the backend */ + if ( gmyth_uri != NULL && ( is_livetv = gmyth_uri_is_livetv( gmyth_uri ) ) == TRUE ) { + myth_handle->livetv = gmyth_livetv_new (); + myth_handle->channel_num = gmyth_uri_get_channel_num( gmyth_uri ); + + if ( myth_handle->channel_num != -1 ) { + if (gmyth_livetv_channel_setup (myth_handle->livetv, myth_handle->channel_num, + backend_info) == FALSE) { + g_object_unref( gmyth_uri ); + ret = FALSE; + } + } else { + if ( gmyth_livetv_setup (myth_handle->livetv, backend_info) == FALSE ) { + g_object_unref( gmyth_uri ); + ret = FALSE; + } + } + + myth_handle->file_transfer = gmyth_livetv_create_file_transfer (myth_handle->livetv); + + if (NULL == myth_handle->file_transfer) { + ret = FALSE; + } + + if ( gmyth_uri != NULL ) + g_object_unref( gmyth_uri ); + + } else { + + myth_handle->file_transfer = gmyth_file_transfer_new (backend_info); + + /* Verifies if the file exists */ + if (!gmyth_util_file_exists (backend_info, gnome_vfs_uri_get_path (uri))) { + g_object_unref (backend_info); + return GNOME_VFS_ERROR_NOT_FOUND; + } + + /* sets the Playback monitor connection */ + ret = gmyth_file_transfer_open ( myth_handle->file_transfer, gnome_vfs_uri_get_path (uri) ); + + } /* if - LiveTV or not? */ + + if (ret == FALSE) { + g_warning ("MythTV FileTransfer open error\n"); + return GNOME_VFS_ERROR_NOT_OPEN; + } + + if ( is_livetv == TRUE && ret == TRUE ) { + /* loop finished, set the max tries variable to zero again... */ + wait_to_transfer = 0; + + while ( wait_to_transfer++ < MYTHTV_TRANSFER_MAX_WAITS && + (gmyth_livetv_is_recording (myth_handle->livetv) == FALSE)) + g_usleep (500); + + /* IS_RECORDING again, just like the MythTV backend does... */ + gmyth_livetv_is_recording (myth_handle->livetv); + + sleep (4); /* FIXME: this is evil (tpm) */ + } - /* Verifies if the file exists */ - if (!gmyth_util_file_exists (backend_info, gnome_vfs_uri_get_path (uri))) { - g_object_unref (backend_info); - return GNOME_VFS_ERROR_NOT_FOUND; - } - - /* Connect to the backend */ - myth_handle->file_transfer = gmyth_file_transfer_new (backend_info); g_object_unref (backend_info); g_return_val_if_fail (myth_handle->file_transfer != NULL, GNOME_VFS_ERROR_NOT_OPEN); - /* sets the Playback monitor connection */ - ret = gmyth_file_transfer_open (myth_handle->file_transfer, gnome_vfs_uri_get_path (uri)); - if (ret == FALSE) { - g_warning ("Mythtv FileTransfer open error\n"); - return GNOME_VFS_ERROR_NOT_OPEN; - } - myth_handle->content_size = myth_handle->file_transfer->filesize; myth_handle->buffer = g_byte_array_sized_new (MYTHTV_BUFFER_SIZE); @@ -201,6 +257,11 @@ myth_handle->file_transfer = NULL; } + if (myth_handle->livetv) { + g_object_unref (myth_handle->livetv); + myth_handle->livetv = NULL; + } + if (myth_handle->buffer) { g_byte_array_free (myth_handle->buffer, TRUE); myth_handle->buffer = NULL;