DVB: privatize scan_session
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 5 Mar 2011 14:26:51 +0000 (16:26 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 5 Mar 2011 14:27:04 +0000 (16:27 +0200)
modules/access/dvb/access.c
modules/access/dvb/scan.c
modules/access/dvb/scan.h

index 83217ec..ac77b23 100644 (file)
@@ -555,7 +555,6 @@ static block_t *BlockScan( access_t *p_access )
     access_sys_t *p_sys = p_access->p_sys;
     scan_t *p_scan = p_sys->scan;
     scan_configuration_t cfg;
-    scan_session_t session;
 
     /* */
     if( scan_Next( p_scan, &cfg ) )
@@ -571,8 +570,8 @@ static block_t *BlockScan( access_t *p_access )
     }
 
     /* */
-
-    if( scan_session_Init( VLC_OBJECT(p_access), &session, &cfg ) )
+    scan_session_t *session = scan_session_New( VLC_OBJECT(p_access), &cfg );
+    if( session == NULL )
         return NULL;
 
     /* */
@@ -593,6 +592,7 @@ static block_t *BlockScan( access_t *p_access )
     {
         msg_Err( p_access, "Failed to tune the frontend" );
         p_access->info.b_eof = true;
+        scan_session_Destroy( p_scan, session );
         return NULL;
     }
 
@@ -647,7 +647,7 @@ static block_t *BlockScan( access_t *p_access )
                 continue;
 
             msg_Err( p_access, "poll error: %m" );
-            scan_session_Clean( p_scan, &session );
+            scan_session_Destroy( p_scan, session );
 
             p_access->info.b_eof = true;
             return NULL;
@@ -687,7 +687,7 @@ static block_t *BlockScan( access_t *p_access )
             p_block->i_buffer = i_ret;
 
             /* */
-            if( scan_session_Push( &session, p_block ) )
+            if( scan_session_Push( session, p_block ) )
             {
                 msg_Dbg( p_access, "finished scanning current frequency" );
                 break;
@@ -697,9 +697,9 @@ static block_t *BlockScan( access_t *p_access )
 
     /* */
     if( i_best_snr > 0 )
-        scan_service_SetSNR( &session, i_best_snr );
+        scan_service_SetSNR( session, i_best_snr );
 
-    scan_session_Clean( p_scan, &session );
+    scan_session_Destroy( p_scan, session );
     return NULL;
 }
 
index 31b9f00..e794c16 100644 (file)
 #include <sys/types.h>
 
 /* Include dvbpsi headers */
-# include <dvbpsi/dvbpsi.h>
-# include <dvbpsi/descriptor.h>
-# include <dvbpsi/pat.h>
-# include <dvbpsi/pmt.h>
-# include <dvbpsi/dr.h>
-# include <dvbpsi/psi.h>
-# include <dvbpsi/demux.h>
-# include <dvbpsi/sdt.h>
+#include <dvbpsi/dvbpsi.h>
+#include <dvbpsi/descriptor.h>
+#include <dvbpsi/pat.h>
+#include <dvbpsi/pmt.h>
+#include <dvbpsi/dr.h>
+#include <dvbpsi/psi.h>
+#include <dvbpsi/demux.h>
+#include <dvbpsi/sdt.h>
+#ifdef _DVBPSI_DR_43_H_
+#   define DVBPSI_USE_NIT 1
+#   include <dvbpsi/nit.h>
+#endif
 
 #include "dvb.h"
 #include "scan.h"
@@ -87,6 +91,29 @@ struct scan_t
     scan_service_t **pp_service;
 };
 
+struct scan_session_t
+{
+    vlc_object_t *p_obj;
+
+    scan_configuration_t cfg;
+    int i_snr;
+
+    dvbpsi_handle pat;
+    dvbpsi_pat_t *p_pat;
+    int i_nit_pid;
+
+    dvbpsi_handle sdt;
+    dvbpsi_sdt_t *p_sdt;
+
+#ifdef DVBPSI_USE_NIT
+    dvbpsi_handle nit;
+    dvbpsi_nit_t *p_nit;
+#else
+#   warning NIT is not supported by your libdvbpsi version
+#endif
+
+};
+
 /* */
 static scan_service_t *scan_service_New( int i_program,
                                          const scan_configuration_t *p_cfg )
@@ -757,11 +784,12 @@ static void PSINewTableCallBack( scan_session_t *p_session, dvbpsi_handle h, uin
 #endif
 }
 
-
-int scan_session_Init( vlc_object_t *p_obj, scan_session_t *p_session, const scan_configuration_t *p_cfg )
+scan_session_t *scan_session_New( vlc_object_t *p_obj,
+                                  const scan_configuration_t *p_cfg )
 {
-    /* */
-    memset( p_session, 0, sizeof(*p_session) );
+    scan_session_t *p_session = malloc( sizeof( *p_session ) );
+    if( unlikely(p_session == NULL) )
+        return NULL;
     p_session->p_obj = p_obj;
     p_session->cfg = *p_cfg;
     p_session->i_snr = -1;
@@ -774,10 +802,10 @@ int scan_session_Init( vlc_object_t *p_obj, scan_session_t *p_session, const sca
     p_session->nit = NULL;
     p_session->p_nit = NULL;
 #endif
-    return VLC_SUCCESS;
+    return p_session;;
 }
 
-void scan_session_Clean( scan_t *p_scan, scan_session_t *p_session )
+void scan_session_Destroy( scan_t *p_scan, scan_session_t *p_session )
 {
     const int i_service_start = p_scan->i_service;
 
@@ -910,6 +938,7 @@ void scan_session_Clean( scan_t *p_scan, scan_session_t *p_session )
     if( p_session->p_nit )
         dvbpsi_DeleteNIT( p_session->p_nit );
 #endif
+    free( p_session );
 }
 
 static int ScanServiceCmp( const void *a, const void *b )
index 878962a..10fe3b6 100644 (file)
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA    02111, USA.
  *****************************************************************************/
 
-#ifdef _DVBPSI_DR_43_H_
-#   define DVBPSI_USE_NIT 1
-#   include <dvbpsi/nit.h>
-#endif
-
-#ifndef DVBPSI_USE_NIT
-#   warning NIT is not supported by your libdvbpsi version
-#endif
-
 typedef enum
 {
     SCAN_NONE,
@@ -94,27 +85,6 @@ typedef struct
     char c_polarization;
 } scan_configuration_t;
 
-typedef struct
-{
-    vlc_object_t *p_obj;
-
-    scan_configuration_t cfg;
-    int i_snr;
-
-    dvbpsi_handle pat;
-    dvbpsi_pat_t *p_pat;
-    int i_nit_pid;
-
-    dvbpsi_handle sdt;
-    dvbpsi_sdt_t *p_sdt;
-
-#ifdef DVBPSI_USE_NIT
-    dvbpsi_handle nit;
-    dvbpsi_nit_t *p_nit;
-#endif
-
-} scan_session_t;
-
 scan_t *scan_New( vlc_object_t *p_obj, const scan_parameter_t *p_parameter );
 void scan_Destroy( scan_t *p_scan );
 
@@ -123,8 +93,11 @@ int scan_Next( scan_t *p_scan, scan_configuration_t *p_cfg );
 block_t *scan_GetM3U( scan_t *p_scan );
 bool scan_IsCancelled( scan_t *p_scan );
 
-int  scan_session_Init( vlc_object_t *p_obj, scan_session_t *p_session, const scan_configuration_t *p_cfg );
-void scan_session_Clean( scan_t *p_scan, scan_session_t *p_session );
+typedef struct scan_session_t scan_session_t;
+
+scan_session_t *scan_session_New( vlc_object_t *,
+                                  const scan_configuration_t * );
+void scan_session_Destroy( scan_t *, scan_session_t * );
 bool scan_session_Push( scan_session_t *p_scan, block_t *p_block );
 void scan_service_SetSNR( scan_session_t *p_scan, int i_snr );