changeset 22754:8d480f1b41df

Radio driver loading rework. Available interfaces are showed in verbose mode.
author voroshil
date Wed, 21 Mar 2007 18:39:57 +0000
parents 42bbd2c1c5e6
children dfe4db89562c
files help/help_mp-en.h stream/stream_radio.c
diffstat 2 files changed, 87 insertions(+), 134 deletions(-) [+]
line wrap: on
line diff
--- a/help/help_mp-en.h	Wed Mar 21 08:44:45 2007 +0000
+++ b/help/help_mp-en.h	Wed Mar 21 18:39:57 2007 +0000
@@ -1982,11 +1982,11 @@
 #define MSGTR_RADIO_CaptureStarting "[radio] Starting capture stuff.\n"
 #define MSGTR_RADIO_ClearBufferFailed "[radio] Clearing buffer failed: %s\n"
 #define MSGTR_RADIO_StreamEnableCacheFailed "[radio] Call to stream_enable_cache failed: %s\n"
-#define MSGTR_RADIO_DriverUnknownId "[radio] Unknown driver id: %d\n"
 #define MSGTR_RADIO_DriverUnknownStr "[radio] Unknown driver name: %s\n"
 #define MSGTR_RADIO_DriverV4L2 "[radio] Using V4Lv2 radio interface.\n"
 #define MSGTR_RADIO_DriverV4L "[radio] Using V4Lv1 radio interface.\n"
 #define MSGTR_RADIO_DriverBSDBT848 "[radio] Using *BSD BT848 radio interface.\n"
+#define MSGTR_RADIO_AvailableDrivers "[radio] Available drivers: "
 
 // ================================== LIBASS ====================================
 
--- a/stream/stream_radio.c	Wed Mar 21 08:44:45 2007 +0000
+++ b/stream/stream_radio.c	Wed Mar 21 18:39:57 2007 +0000
@@ -77,11 +77,6 @@
 
 #endif
 
-#define RADIO_DRIVER_UNKNOWN    0
-#define RADIO_DRIVER_V4L        1
-#define RADIO_DRIVER_V4L2       2
-#define RADIO_DRIVER_BSDBT848   3
-
 typedef struct radio_channels_s {
     int index;     ///< channel index in channels list
     float freq;    ///< frequency in MHz
@@ -132,7 +127,7 @@
     radio_channels_t*   radio_channel_current;
     float rangelow;                        ///< lowest tunable frequency in MHz
     float rangehigh;                       ///< highest tunable frequency in MHz
-    int                 driver;
+    const struct radio_driver_s*     driver;
     int                 old_snd_volume;
 #ifdef USE_RADIO_CAPTURE
     volatile int        do_capture;        ///< is capture enabled
@@ -147,6 +142,16 @@
 #endif
 } radio_priv_t;
 
+typedef struct radio_driver_s {
+    char* name;
+    char* info;
+    int (*init_frac)(radio_priv_t* priv);
+    void (*set_volume)(radio_priv_t* priv,int volume);
+    int (*get_volume)(radio_priv_t* priv,int* volume);
+    int (*set_frequency)(radio_priv_t* priv,float frequency);
+    int (*get_frequency)(radio_priv_t* priv,float* frequency);
+} radio_driver_t;
+
 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
 static m_option_t stream_opts_fields[] = {
     {"hostname", ST_OFF(radio_param_freq_channel), CONF_TYPE_FLOAT, 0, 0 ,0, NULL},
@@ -404,6 +409,17 @@
 
     return STREAM_OK;
 }
+
+/* v4l2 driver info structure */
+static const radio_driver_t radio_driver_v4l2={
+    "v4l2",
+    MSGTR_RADIO_DriverV4L2,
+    init_frac_v4l2,
+    set_volume_v4l2,
+    get_volume_v4l2,
+    set_frequency_v4l2,
+    get_frequency_v4l2
+};
 #endif //HAVE_RADIO_V4L2
 #ifdef HAVE_RADIO_V4L
 /*****************************************************************
@@ -524,6 +540,17 @@
 
     return STREAM_ERROR;
 }
+
+/* v4l driver info structure */
+static const radio_driver_t radio_driver_v4l={
+    "v4l",
+    MSGTR_RADIO_DriverV4L,
+    init_frac_v4l,
+    set_volume_v4l,
+    get_volume_v4l,
+    set_frequency_v4l,
+    get_frequency_v4l
+};
 #endif //HAVE_RADIO_V4L
 #ifdef RADIO_BSDBT848_HDR
 /*****************************************************************
@@ -624,54 +651,30 @@
 
     return STREAM_OK;
 }
+
+/* bsdbt848 driver info structure */
+static const radio_driver_t radio_driver_bstbt848={
+    "bsdbt848",
+    MSGTR_RADIO_DriverBSTBT848,
+    init_frac_bstbt848,
+    set_volume_bstbt848,
+    get_volume_bstbt848,
+    set_frequency_bstbt848,
+    get_frequency_bstbt848
+};
 #endif //RADIO_BSDBT848_HDR
 
 static inline int init_frac(radio_priv_t* priv){ 
-    switch(priv->driver){
-#ifdef HAVE_RADIO_V4L
-        case RADIO_DRIVER_V4L:
-            return init_frac_v4l(priv);
-#endif
-#ifdef HAVE_RADIO_V4L2
-        case RADIO_DRIVER_V4L2:
-            return init_frac_v4l2(priv);
-#endif
-#ifdef RADIO_BSDBT848_HDR
-        case RADIO_DRIVER_BSDBT848:
-            return init_frac_bsdbt848(priv);
-#endif
-    }
-    mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_DriverUnknownId,priv->driver);
-    return STREAM_ERROR;
+    return priv->driver->init_frac(priv);
 }
 static inline int set_frequency(radio_priv_t* priv,float frequency){ 
     if ((frequency<priv->rangelow)||(frequency>priv->rangehigh)){
         mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_WrongFreq,frequency);
         return STREAM_ERROR;
     }
-    switch(priv->driver){
-#ifdef HAVE_RADIO_V4L
-        case RADIO_DRIVER_V4L:
-            if(set_frequency_v4l(priv,frequency)!=STREAM_OK)
-                return STREAM_ERROR;
-            break;
-#endif
-#ifdef HAVE_RADIO_V4L2
-        case RADIO_DRIVER_V4L2:
-            if(set_frequency_v4l2(priv,frequency)!=STREAM_OK)
-                return STREAM_ERROR;
-            break;     
-#endif
-#ifdef RADIO_BSDBT848_HDR
-        case RADIO_DRIVER_BSDBT848:
-            if(set_frequency_bsdbt848(priv,frequency)!=STREAM_OK)
-                return STREAM_ERROR;
-            break;
-#endif
-        default:
-            mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_DriverUnknownId,priv->driver);
-            return STREAM_ERROR;
-    }
+    if(priv->driver->set_frequency(priv,frequency)!=STREAM_OK)
+        return STREAM_ERROR;
+	
 #ifdef USE_RADIO_CAPTURE
     if(clear_buffer(priv)!=STREAM_OK){
         mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_ClearBufferFailed,strerror(errno));
@@ -681,60 +684,13 @@
    return STREAM_OK;
 }
 static inline int get_frequency(radio_priv_t* priv,float* frequency){ 
-    switch(priv->driver){
-#ifdef HAVE_RADIO_V4L
-        case RADIO_DRIVER_V4L:
-            return get_frequency_v4l(priv,frequency);
-#endif
-#ifdef HAVE_RADIO_V4L2
-        case RADIO_DRIVER_V4L2:
-            return get_frequency_v4l2(priv,frequency);
-#endif
-#ifdef RADIO_BSDBT848_HDR
-        case RADIO_DRIVER_BSDBT848:
-            return get_frequency_bsdbt848(priv,frequency);
-#endif
-    }
-    mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_DriverUnknownId,priv->driver);
-    return STREAM_ERROR;
+    return priv->driver->get_frequency(priv,frequency);
 }
 static inline void set_volume(radio_priv_t* priv,int volume){ 
-    switch(priv->driver){
-#ifdef HAVE_RADIO_V4L
-        case RADIO_DRIVER_V4L:
-            set_volume_v4l(priv,volume);
-            return;
-#endif
-#ifdef HAVE_RADIO_V4L2
-        case RADIO_DRIVER_V4L2:
-            set_volume_v4l2(priv,volume);
-            return;
-#endif
-#ifdef RADIO_BSDBT848_HDR
-        case RADIO_DRIVER_BSDBT848:
-            set_volume_bsdbt848(priv,volume);
-            return;
-#endif
-    }
-    mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_DriverUnknownId,priv->driver);
+    priv->driver->set_volume(priv,volume);
 }
 static inline int get_volume(radio_priv_t* priv,int* volume){ 
-    switch(priv->driver){
-#ifdef HAVE_RADIO_V4L
-        case RADIO_DRIVER_V4L:
-            return get_volume_v4l(priv,volume);
-#endif
-#ifdef HAVE_RADIO_V4L2
-        case RADIO_DRIVER_V4L2:
-            return get_volume_v4l2(priv,volume);
-#endif
-#ifdef RADIO_BSDBT848_HDR
-        case RADIO_DRIVER_BSDBT848:
-            return get_volume_bsdbt848(priv,volume);
-#endif
-    }
-    mp_msg(MSGT_RADIO,MSGL_ERR,MSGTR_RADIO_DriverUnknownId,priv->driver);
-    return STREAM_ERROR;
+    return priv->driver->get_volume(priv,volume);
 }
 
 
@@ -1125,6 +1081,24 @@
     return len;
 }
 
+
+/*
+ order if significant! 
+ when no driver explicitly specified first available will be used
+ */
+static const radio_driver_t* radio_drivers[]={
+#ifdef RADIO_BSDBT848_HDR
+    &radio_driver_bstbt848,
+#endif
+#ifdef HAVE_RADIO_V4L2
+    &radio_driver_v4l2,
+#endif
+#ifdef HAVE_RADIO_V4L
+    &radio_driver_v4l,
+#endif
+    0
+};
+
 /*****************************************************************
  * Stream initialization
  * \return STREAM_OK if success, STREAM_ERROR otherwise
@@ -1133,6 +1107,7 @@
     struct stream_priv_s* p=(struct stream_priv_s*)opts;
     radio_priv_t* priv;
     float frequency=0;
+    int i;
 
     if (strncmp("radio://",stream->url,8) != 0)
         return STREAM_UNSUPORTED;
@@ -1158,46 +1133,24 @@
 
 
     if (strncmp(radio_param_driver,"default",7)==0)
-#if defined(HAVE_RADIO_V4L2)
-        priv->driver=RADIO_DRIVER_V4L2;
-#elif defined(RADIO_BSDBT848_HDR)
-        priv->driver=RADIO_DRIVER_BSDBT848;
-#else
-        priv->driver=RADIO_DRIVER_V4L;
-#endif
-    else
-#ifdef HAVE_RADIO_V4L2
-    if (strncmp(radio_param_driver,"v4l2",4)==0)
-        priv->driver=RADIO_DRIVER_V4L2;
-    else
-#endif
-#ifdef HAVE_RADIO_V4L
-    if (strncmp(radio_param_driver,"v4l",3)==0)
-        priv->driver=RADIO_DRIVER_V4L;
+        priv->driver=radio_drivers[0];
     else
-#endif
-#ifdef RADIO_BSDBT848_HDR
-    if (strncmp(radio_param_driver,"bsdbt848",8)==0)
-        priv->driver=RADIO_DRIVER_BSDBT848;
-    else
-#endif
-    priv->driver=RADIO_DRIVER_UNKNOWN;
-
+        priv->driver=NULL;
 
-    switch(priv->driver){
-        case RADIO_DRIVER_V4L:
-            mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverV4L);
-            break;
-        case RADIO_DRIVER_V4L2:
-            mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverV4L2);
-            break;
-        case RADIO_DRIVER_BSDBT848:
-            mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverBSDBT848);
-            break;
-        default:
-            mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverUnknownStr,radio_param_driver);
-            close_s(stream);
-            return STREAM_ERROR;
+    mp_msg(MSGT_RADIO,MSGL_V,MSGTR_RADIO_AvailableDrivers);
+    for(i=0;radio_drivers[i];i++){
+        mp_msg(MSGT_RADIO,MSGL_V,"%s, ",radio_drivers[i]->name);
+        if(strcmp(radio_param_driver,radio_drivers[i]->name)==0)
+            priv->driver=radio_drivers[i];
+    }
+    mp_msg(MSGT_RADIO,MSGL_V,"\n");
+    
+    if(priv->driver)
+        mp_msg(MSGT_RADIO, MSGL_INFO, priv->driver->info);
+    else{
+        mp_msg(MSGT_RADIO, MSGL_INFO, MSGTR_RADIO_DriverUnknownStr,radio_param_driver);
+        close_s(stream);
+        return STREAM_ERROR;
     }
 
     stream->type = STREAMTYPE_RADIO;