add screen capture effect sound
authorHyoyoung Chang <hyoyoung.chang@samsung.com>
Tue, 28 Dec 2010 11:10:37 +0000 (20:10 +0900)
committerHyoyoung Chang <hyoyoung.chang@samsung.com>
Tue, 28 Dec 2010 11:10:37 +0000 (20:10 +0900)
CMakeLists.txt
debian/control
src/clipdrawer.c
src/scrcapture.c

index 57f4dc3..75e2143 100755 (executable)
@@ -11,7 +11,7 @@ SET(SRCS src/cbhm_main.c
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
 
 INCLUDE(FindPkgConfig)
-pkg_check_modules(pkgs REQUIRED elementary appcore-efl appcore-common x11 ecore-x utilX)
+pkg_check_modules(pkgs REQUIRED elementary appcore-efl appcore-common x11 ecore-x utilX mm-common mm-sound)
 
 FOREACH(flag ${pkgs_CFLAGS})
        SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
@@ -41,5 +41,6 @@ ADD_DEPENDENCIES(${PROJECT_NAME} cbhmdrawer.edj)
 
 INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin)
 INSTALL(FILES ${CMAKE_BINARY_DIR}/data/themes/cbhmdrawer.edj DESTINATION share/edje)
-INSTALL(FILES ${CMAKE_BINARY_DIR}/data/images/cbhm_default_img.png DESTINATION share/icon/cbhm)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/data/images/cbhm_default_img.png DESTINATION share/cbhm/icons)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/data/sounds/Shutter_01.wav DESTINATION share/cbhm/sounds)
 INSTALL(FILES ${CMAKE_BINARY_DIR}/data/init_script/cbhm DESTINATION /etc/init.d PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
index 84b0a92..ac907e4 100755 (executable)
@@ -2,7 +2,7 @@ Source: cbhm
 Section: devel
 Priority: extra
 Maintainer: Hyoyoung Chang <hyoyoung.chang@samsung.com>
-Build-Depends: debhelper (>= 5), libelm-dev, libappcore-efl-dev, libappcore-common-dev, libx11-dev, libecore-dev, libslp-utilx-dev, x11-xserver-utils-ex
+Build-Depends: debhelper (>= 5), libelm-dev, libappcore-efl-dev, libappcore-common-dev, libx11-dev, libecore-dev, libslp-utilx-dev, x11-xserver-utils-ex, libmm-common-dev, libmm-sound-dev
 Standards-Version: 0.1.1
 
 Package: cbhm
index 86164d5..9e9e8ce 100644 (file)
@@ -4,8 +4,8 @@
 #include "xcnphandler.h"
 #include "clipdrawer.h"
 
-#define DELETE_ICON_PATH "/usr/share/icon/cbhm/05_delete.png"
-#define IM     "/usr/share/icon/cbhm/"
+#define DELETE_ICON_PATH "/usr/share/cbhm/icons/05_delete.png"
+#define IM     "/usr/share/cbhm/icons/"
 static const char *g_images_path[] = {
        IM"cbhm_default_img.png",
 };
index 5607416..ba295cf 100644 (file)
 
 #define IMAGE_SAVE_DIR "/opt/media/Images and videos/My photo clips"
 #define IMAGE_SAVE_FILE_TYPE ".jpg"
+#define CAPTURE_SOUND_FILE "/usr/share/cbhm/sounds/Shutter_01.wav"
+#define CAPTURE_SOUND_TIMEOUT_SEC 2
+                       
+#include <mmf/mm_sound_private.h>
+#include <pthread.h>
+#include <errno.h>
+#include <sys/time.h>
+
+static pthread_mutex_t g_sound_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t g_sound_cond = PTHREAD_COND_INITIALIZER;
+static Eina_Bool g_shot = EINA_FALSE;
 
 typedef struct tag_captureimginfo
 {
@@ -37,6 +48,69 @@ static Eina_Bool get_image_filename_with_date(char *dstr)
        return EINA_TRUE;
 }
 
+static void _sound_callback(void *data)
+{
+               DTRACE("_sound_callback\n");
+        pthread_cond_broadcast(&g_sound_cond);
+        return;
+}
+
+static void _play_capture_sound()
+{
+       int ret, step, handle;
+       MMSoundParamType pparam = {0,};
+       Eina_Bool sync = EINA_FALSE;
+       struct timespec timeout;
+       struct timeval tv;
+       ret = mm_sound_set_path(MM_SOUND_GAIN_CAMERA, MM_SOUND_PATH_SPK, MM_SOUND_PATH_NONE, MM_SOUND_PATH_OPTION_NONE);         
+       if (ret != MM_ERROR_NONE)
+       {
+               DTRACE("mm_sound_set_path is failed\n");
+               return;
+       }
+       ret = mm_sound_volume_get_step(VOLUME_TYPE_FIXED, &step);
+       if (ret != MM_ERROR_NONE)
+       {
+               DTRACE("mm_sound_volume_get_step is failed\n");
+               return;
+       }
+       if (pthread_mutex_trylock(&g_sound_lock) == EBUSY)
+       {
+               DTRACE("trylock is fail - g_sound_lock\n");
+               return;
+       }
+       pparam.filename = CAPTURE_SOUND_FILE;
+       pparam.loop = 1;
+       pparam.volume = step-1;
+       pparam.callback = _sound_callback;
+
+       if (mm_sound_play_loud_solo_sound(CAPTURE_SOUND_FILE, 
+                                                                         VOLUME_TYPE_FIXED, _sound_callback, 
+                                                                         NULL, &handle) 
+               == MM_ERROR_NONE)
+       {
+               if(sync)
+               {
+                       gettimeofday(&tv, NULL);
+                       timeout.tv_sec = tv.tv_sec + CAPTURE_SOUND_TIMEOUT_SEC;
+                       timeout.tv_nsec = tv.tv_usec;
+                       if(ETIMEDOUT == pthread_cond_timedwait(&g_sound_cond, &g_sound_lock, &timeout))
+                       {
+                               if(handle>0)
+                                       mm_sound_stop_sound(handle);
+                       }
+               }
+       }
+       else
+       {
+               DTRACE("effect sound play failed\n");
+               pthread_mutex_unlock(&g_sound_lock);
+               return;
+       }
+       pthread_mutex_unlock(&g_sound_lock);
+       DTRACE("sound play success\n");
+}
+
 static Eina_Bool _scrcapture_capture_postprocess(void* data)
 {
        captureimginfo_t *capimginfo = data;
@@ -63,6 +137,10 @@ static Eina_Bool _scrcapture_capture_postprocess(void* data)
        free(capimginfo->imgdata);
        free(capimginfo);
 
+       _play_capture_sound();
+
+       g_shot = EINA_FALSE;
+
        return EINA_FALSE;
 }
 
@@ -70,6 +148,13 @@ Eina_Bool capture_current_screen(void *data)
 {
        struct appdata *ad = data;
 
+       if (g_shot)
+       {
+               DTRACE("too early to capture current screen\n");
+               return EINA_FALSE;
+       }
+       g_shot = EINA_TRUE;
+
        captureimginfo_t *capimginfo = NULL;
        capimginfo = malloc(sizeof(captureimginfo_t) * 1);
        get_image_filename_with_date(capimginfo->filename);
@@ -97,6 +182,8 @@ Eina_Bool capture_current_screen(void *data)
                return EINA_FALSE;
        }
 
+       DTRACE("screen capture prepared\n");
+
        evas_object_image_data_set(capimginfo->eo, NULL);
        evas_object_image_size_set(capimginfo->eo, width, height);
        evas_object_image_data_set(capimginfo->eo, capimginfo->imgdata);
@@ -131,6 +218,9 @@ int init_scrcapture(void *data)
 
        ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, scrcapture_keydown_cb, ad);
 
+       pthread_mutex_init(&g_sound_lock, NULL);
+       pthread_cond_init(&g_sound_cond, NULL);
+
        return 0;
 }
 
@@ -140,6 +230,9 @@ void close_scrcapture(void *data)
 
        Ecore_X_Display *xdisp = ecore_x_display_get();
        Ecore_X_Window xwin = (Ecore_X_Window)ecore_evas_window_get(ecore_evas_ecore_evas_get(ad->evas));
+
+       pthread_mutex_destroy(&g_sound_lock);
+       pthread_cond_destroy(&g_sound_cond);
 }
 
 
@@ -411,9 +504,9 @@ char *scrcapture_capture_screen_by_x11(Window xid, int *size)
        return captured_image;
 }
 
-char *scrcapture_capture_screen_by_xv_ext(int width, int height)
+char *scrcapture_capture_screen_by_xv_ext(int w, int h)
 {
-       return createScreenShot(width, height);
+       return createScreenShot(w, h);
 }
 
 void scrcapture_release_screen_by_xv_ext(const char *s)