This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/cgit.cgi/tvtime.git tree:

Subject: alsa_stream: Auto-detect the alsa capture device based on the v4ldev
Author:  Hans de Goede <[email protected]>
Date:    Sat Feb 13 16:47:30 2016 -0200

Based on the xawtv3 code to do the same. This is useful to make tvtime
work in a more plug and play fashion.

Signed-off-by: Hans de Goede <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 src/mixer.c      | 41 ++++++++++++++++++++++++++++++++++++-----
 src/mixer.h      |  2 +-
 src/tvtime.c     |  2 +-
 src/tvtimeconf.c |  6 ++++--
 src/videoinput.c |  8 +++++++-
 src/videoinput.h |  5 +++++
 6 files changed, 54 insertions(+), 10 deletions(-)

---

http://git.linuxtv.org/cgit.cgi/tvtime.git/commit/?id=8978195e5dec69636cfccd395fd15f57e8dce466
diff --git a/src/mixer.c b/src/mixer.c
index a3e7826477a2..01802034afb9 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -20,7 +20,9 @@
  */
 
 #include <stdio.h>
+#include <string.h>
 #include "alsa_stream.h"
+#include "get_media_devices.h"
 #include "mixer.h"
 #include "tvtimeconf.h"
 
@@ -109,18 +111,49 @@ struct mixer *mixer = &null_mixer;
 
 /* Config settings */
 config_t *mixer_cfg;
+const char *mixer_capdev;
 
 /**
  * Sets the mixer device and channel.
  * Try each access method until one succeeds.
  */
-void mixer_init( config_t *cfg )
+void mixer_init( config_t *cfg, const char *v4ldev )
 {
     const char *devname;
     int i;
 
     mixer_cfg = cfg;
     devname = config_get_mixer_device( mixer_cfg );
+    mixer_capdev = config_get_alsa_inputdev( mixer_cfg );
+
+#ifdef __linux__ /* Because this depends on get_media_devices.c */
+    if( !strcmp( mixer_capdev, "auto" ) ) {
+       const char *p;
+       void *md;
+
+       md = discover_media_devices();
+       if( !md ) {
+           fprintf( stderr, "Mixer: cannot enumerate video devices\n" );
+           return;
+       }
+
+       p = strrchr( v4ldev, '/' );
+       if (p)
+           p++;
+       else
+           p = v4ldev;
+
+       p = get_associated_device( md, NULL, MEDIA_SND_CAP, p, MEDIA_V4L_VIDEO 
);
+       if( p ) {
+           mixer_capdev = strdup( p );
+           fprintf( stderr, "Alsa devices: cap: %s (%s), out: %s\n",
+                    mixer_capdev, v4ldev,
+                    config_get_alsa_outputdev( mixer_cfg ) );
+       }
+
+       free_media_devices(md);
+    }
+#endif
 
     for (i = 0; i < sizeof(mixers)/sizeof(mixers[0]); i++) {
         mixer = mixers[i];
@@ -153,9 +186,7 @@ void mixer_mute( int mute )
     } else {
        mixer->mute( 0 );
        alsa_thread_startup( config_get_alsa_outputdev( mixer_cfg ),
-                            config_get_alsa_inputdev( mixer_cfg ),
-                            config_get_alsa_latency( mixer_cfg ),
-                            stderr,
-                            config_get_verbose( mixer_cfg ) );
+                            mixer_capdev, config_get_alsa_latency( mixer_cfg ),
+                            stderr, config_get_verbose( mixer_cfg ) );
     }
 }
diff --git a/src/mixer.h b/src/mixer.h
index 9b5365aa521f..f51f481d3835 100644
--- a/src/mixer.h
+++ b/src/mixer.h
@@ -32,7 +32,7 @@ extern "C" {
  * Sets the mixer device and channel.
  * All interfaces are scanned until one succeeds.
  */
-void mixer_init( config_t *cfg );
+void mixer_init( config_t *cfg, const char *v4ldev );
 void mixer_exit( void );
 void mixer_mute( int mute );
 
diff --git a/src/tvtime.c b/src/tvtime.c
index 1d079811441b..c8433afdaf58 100644
--- a/src/tvtime.c
+++ b/src/tvtime.c
@@ -1417,7 +1417,7 @@ int tvtime_main( rtctimer_t *rtctimer, int read_stdin, 
int realtime,
     secondlastframe = lastframe = blueframe;
 
     /* Init the mixer (and alsa digital loopback) */
-    mixer_init( ct );
+    mixer_init( ct, videoinput_get_v4ldev( vidin ) );
 
     /* Setup OSD stuff. */
     pixel_aspect = ( (double) width ) /
diff --git a/src/tvtimeconf.c b/src/tvtimeconf.c
index a634f551495b..c9d8efddadbc 100644
--- a/src/tvtimeconf.c
+++ b/src/tvtimeconf.c
@@ -53,8 +53,10 @@
 
 #ifdef __linux__ /* This depends on sysfs, so it is linux only */
 #define DEFAULT_VIDEO_DEV "auto"
+#define DEFAULT_ALSA_INPUT "auto"
 #else
 #define DEFAULT_VIDEO_DEV "/dev/video0"
+#define DEFAULT_ALSA_INPUT "hw:1,0"
 #endif
 
 struct config_s
@@ -721,7 +723,7 @@ static void print_config_usage( char **argv )
               "                                 video, radio, monitor\n"), 
stderr );
     lfputs( _("  -p, --alsainputdev=DEV     Specifies an ALSA device to read 
input on\n"
               "                                 Examples:\n"
-              "                                          hw:1,0\n"
+             "                                          " DEFAULT_ALSA_INPUT 
"\n"
               "                                          disabled\n"), stderr 
);
     lfputs( _("  -P, --alsaoutputdev=DEV    Specifies an ALSA device to write 
output to\n"
               "                                 Examples:\n"
@@ -827,7 +829,7 @@ config_t *config_new( void )
     ct->config_filename = 0;
     ct->doc = 0;
 
-    ct->alsa_inputdev = strdup( "hw:1,0" );
+    ct->alsa_inputdev = strdup( DEFAULT_ALSA_INPUT );
     ct->alsa_outputdev = strdup( "default" );
     ct->alsa_latency = 50;
 
diff --git a/src/videoinput.c b/src/videoinput.c
index f8939c07879e..5c147c8e079e 100644
--- a/src/videoinput.c
+++ b/src/videoinput.c
@@ -143,6 +143,7 @@ struct videoinput_s
 {
     int verbose;
     int grab_fd;
+    char v4ldev[ PATH_MAX ];
     char drivername[ 64 ];
     char shortdriver[ 64 ];
 
@@ -361,6 +362,7 @@ int videoinput_open_v4l_device( videoinput_t *vidin, const 
char *path,
                 caps_v4l2.version, caps_v4l2.capabilities );
     }
     vidin->isv4l2 = 1;
+    snprintf( vidin->v4ldev, sizeof( vidin->v4ldev ), "%s", path );
     snprintf( vidin->drivername, sizeof( vidin->drivername ), "%s [%s/%s/%u]",
              caps_v4l2.driver, caps_v4l2.card,
              caps_v4l2.bus_info, caps_v4l2.version );
@@ -1128,6 +1130,11 @@ const char *videoinput_get_input_name( videoinput_t 
*vidin )
     return vidin->inputname;
 }
 
+const char *videoinput_get_v4ldev( videoinput_t *vidin )
+{
+    return vidin->v4ldev;
+}
+
 const char *videoinput_get_driver_name( videoinput_t *vidin )
 {
     return vidin->drivername;
@@ -1141,4 +1148,3 @@ void videoinput_set_capture_volume( videoinput_t *vidin, 
int volume )
                                     ((double) vidin->volume) / 100.0 );
     }
 }
-
diff --git a/src/videoinput.h b/src/videoinput.h
index 808896dab68a..3f21dee9c6f6 100644
--- a/src/videoinput.h
+++ b/src/videoinput.h
@@ -278,6 +278,11 @@ void videoinput_set_pal_audio_mode( videoinput_t *vidin, 
int amode );
 int videoinput_get_pal_audio_mode( videoinput_t *vidin );
 
 /**
+ * Returns the path to the v4ldev.
+ */
+const char *videoinput_get_v4ldev( videoinput_t *vidin );
+
+/**
  * Returns the name of the capture card driver.
  */
 const char *videoinput_get_driver_name( videoinput_t *vidin );

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to