[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdemultimedia
From:       Colin Guthrie <cguthrie () mandriva ! org>
Date:       2012-01-05 10:05:08
Message-ID: 20120105100508.D14C6AC890 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1271781 by cguthrie:

kmix: Add sound feedback for volume changes via libcanberra.

For now this is only available on the PulseAudio backend, but it should be \
somewhat trivial to do the same for the ALSA backend.

 M  +2 -0      CMakeLists.txt  
 M  +22 -0     kmix/CMakeLists.txt  
 M  +61 -0     kmix/backends/mixer_pulse.cpp  


--- trunk/KDE/kdemultimedia/CMakeLists.txt #1271780:1271781
@@ -12,6 +12,8 @@
 macro_optional_find_package(PulseAudio)
 macro_log_feature(PULSEAUDIO_FOUND "PulseAudio" "PulseAudio Audio Server" \
"http://www.pulseaudio.org/" FALSE "0.9.12" "libpulse is needed to let KMix \
control PulseAudio")  find_package(GLIB2)
+pkg_check_modules(CANBERRA libcanberra)
+macro_log_feature(CANBERRA_FOUND "libcanberra" "libcanberra audio library" \
"http://0pointer.de/lennart/projects/libcanberra/" FALSE "" "libcanberra is \
needed for kmix sound feedback")  macro_optional_find_package(MusicBrainz3)
 macro_log_feature(MUSICBRAINZ3_FOUND "MusicBrainz3" "A library that \
provides access to metadata lookup on the MusicBrainz server" \
"http://www.musicbrainz.org" FALSE "" "Music metadata lookup for KDE \
multimedia applications. You need version 3.x of libmusicbrainz, otherwise \
kscd will not be compiled.")  
--- trunk/KDE/kdemultimedia/kmix/CMakeLists.txt #1271780:1271781
@@ -21,6 +21,17 @@
 add_subdirectory( profiles ) 
 #add_subdirectory( tests )
 
+if (HAVE_PULSE)
+  include_directories(${PULSEAUDIO_INCLUDE_DIR})
+endif (HAVE_PULSE)
+
+if (CANBERRA_FOUND)
+  add_definitions(-DHAVE_CANBERRA)
+
+  include_directories(${CANBERRA_INCLUDE_DIRS})
+endif (CANBERRA_FOUND)
+
+
 set(kmix_adaptor_SRCS
 	dbus/dbusmixerwrapper.cpp
 	dbus/dbusmixsetwrapper.cpp
@@ -93,6 +104,9 @@
     target_link_libraries(kdeinit_kmix ${PULSEAUDIO_LIBRARY} \
${PULSEAUDIO_MAINLOOP_LIBRARY} ${GLIB2_LIBRARIES})  endif (HAVE_PULSE)
 
+if (CANBERRA_FOUND)
+  target_link_libraries(kdeinit_kmix ${CANBERRA_LIBRARIES})
+endif (CANBERRA_FOUND)
 
 install(TARGETS kdeinit_kmix  DESTINATION ${LIB_INSTALL_DIR} )
 
@@ -129,6 +143,10 @@
     target_link_libraries(kded_kmixd ${PULSEAUDIO_LIBRARY} \
${PULSEAUDIO_MAINLOOP_LIBRARY} ${GLIB2_LIBRARIES})  endif (HAVE_PULSE)
 
+if (CANBERRA_FOUND)
+  target_link_libraries(kded_kmixd ${CANBERRA_LIBRARIES})
+endif (CANBERRA_FOUND)
+
 install(TARGETS kded_kmixd DESTINATION ${PLUGIN_INSTALL_DIR})
 
 #target_link_libraries( kmixd kded_kmixd )
@@ -164,6 +182,10 @@
     target_link_libraries(kdeinit_kmixctrl ${PULSEAUDIO_LIBRARY} \
${PULSEAUDIO_MAINLOOP_LIBRARY} ${GLIB2_LIBRARIES})  endif (HAVE_PULSE)
 
+if (CANBERRA_FOUND)
+  target_link_libraries(kdeinit_kmixctrl ${CANBERRA_LIBRARIES})
+endif (CANBERRA_FOUND)
+
 ########### next target ###############
 add_subdirectory( plasma )
 
--- trunk/KDE/kdemultimedia/kmix/backends/mixer_pulse.cpp #1271780:1271781
@@ -31,6 +31,9 @@
 
 #include <pulse/glib-mainloop.h>
 #include <pulse/ext-stream-restore.h>
+#if defined(HAVE_CANBERRA)
+#  include <canberra.h>
+#endif
 
 #define HAVE_SOURCE_OUTPUT_VOLUMES PA_CHECK_VERSION(1,0,0)
 
@@ -48,6 +51,10 @@
 static enum { UNKNOWN, ACTIVE, INACTIVE } s_pulseActive = UNKNOWN;
 static int s_outstandingRequests = 0;
 
+#if defined(HAVE_CANBERRA)
+static ca_context *s_ccontext = NULL;
+#endif
+
 QMap<int,Mixer_PULSE*> s_mixers;
 
 typedef QMap<int,devinfo> devmap;
@@ -942,6 +949,15 @@
             Q_ASSERT(s_mainloop);
 
             connectToDaemon();
+
+#if defined(HAVE_CANBERRA)
+            int ret = ca_context_create(&s_ccontext);
+            if (ret < 0) {
+                kDebug(67100) << "Disabling Sound Feedback. Canberra \
context failed."; +                s_ccontext = NULL;
+            } else
+                ca_context_set_driver(s_ccontext, "pulse");
+#endif
         }
 
         kDebug(67100) <<  "PulseAudio status: " << (s_pulseActive==UNKNOWN \
? "Unknown (bug)" : (s_pulseActive==ACTIVE ? "Active" : "Inactive")); @@ \
                -960,6 +976,13 @@
         --refcount;
         if (0 == refcount)
         {
+#if defined(HAVE_CANBERRA)
+            if (s_ccontext) {
+                ca_context_destroy(s_ccontext);
+                s_ccontext = NULL;
+            }
+#endif
+
             if (s_context) {
                 pa_context_unref(s_context);
                 s_context = NULL;
@@ -1079,6 +1102,44 @@
                 }
                 pa_operation_unref(o);
 
+#if defined(HAVE_CANBERRA)
+                if (s_ccontext) {
+                    int playing = 0;
+                    int cindex = 2; // Note "2" is simply the index we've \
picked. It's somewhat irrelevant. +
+                    
+                    ca_context_playing(s_ccontext, cindex, &playing);
+
+                    // NB Depending on how this is desired to work, we may \
want to simply +                    // skip playing, or cancel the \
currently playing sound and play our +                    // new one... for \
now, let's do the latter. +                    if (playing) {
+                        ca_context_cancel(s_ccontext, cindex);
+                        playing = 0;
+                    }
+                    
+                    if (!playing) {
+                        char dev[64];
+
+                        snprintf(dev, sizeof(dev), "%lu", (unsigned long) \
iter->index); +                        ca_context_change_device(s_ccontext, \
dev); +
+                        // Ideally we'd use something like \
ca_gtk_play_for_widget()... +                        ca_context_play(
+                            s_ccontext,
+                            cindex,
+                            CA_PROP_EVENT_DESCRIPTION, i18n("Volume \
Control Feedback Sound").toUtf8().constData(), +                            \
CA_PROP_EVENT_ID, "audio-volume-change", +                            \
CA_PROP_CANBERRA_CACHE_CONTROL, "permanent", +                            \
CA_PROP_CANBERRA_ENABLE, "1", +                            NULL
+                        );
+
+                        ca_context_change_device(s_ccontext, NULL);
+                    }
+                }
+#endif
+
                 return 0;
             }
         }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic