4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jeongmo Yang <jm80.yang@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 /*=======================================================================================
24 =======================================================================================*/
26 #include <mm_sound_private.h>
27 #include "mm_camcorder_internal.h"
28 #include "mm_camcorder_sound.h"
30 /*---------------------------------------------------------------------------------------
31 | GLOBAL VARIABLE DEFINITIONS for internal |
32 ---------------------------------------------------------------------------------------*/
34 /*---------------------------------------------------------------------------------------
35 | LOCAL VARIABLE DEFINITIONS for internal |
36 ---------------------------------------------------------------------------------------*/
39 /*---------------------------------------------------------------------------------------
40 | LOCAL FUNCTION PROTOTYPES: |
41 ---------------------------------------------------------------------------------------*/
45 gboolean _mmcamcorder_sound_init(MMHandleType handle)
47 int sound_enable = TRUE;
48 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
49 SOUND_INFO *info = NULL;
51 mmf_return_val_if_fail(hcamcorder, FALSE);
53 info = &(hcamcorder->snd_info);
55 g_mutex_lock(&info->open_mutex);
57 /* check sound state */
58 if (info->state > _MMCAMCORDER_SOUND_STATE_NONE) {
59 _mmcam_dbg_warn("already initialized [%d]", info->state);
60 g_mutex_unlock(&info->open_mutex);
64 /* check sound play enable */
65 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
66 "capture-sound-enable", &sound_enable,
68 _mmcam_dbg_log("Capture sound enable %d", sound_enable);
70 _mmcam_dbg_warn("capture sound disabled");
71 g_mutex_unlock(&info->open_mutex);
75 /* check shutter sound policy and status of system */
76 if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_OFF &&
77 hcamcorder->sub_context->info_image->sound_status == FALSE) {
78 _mmcam_dbg_warn("skip sound init : Sound Policy OFF and Silent status");
79 g_mutex_unlock(&info->open_mutex);
83 info->state = _MMCAMCORDER_SOUND_STATE_INIT;
85 _mmcam_dbg_log("init DONE");
87 g_mutex_unlock(&info->open_mutex);
93 gboolean _mmcamcorder_sound_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
95 int sound_enable = TRUE;
96 const char *volume_gain = NULL;
98 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
99 SOUND_INFO *info = NULL;
101 mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
103 /* check sound play enable */
104 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
105 "capture-sound-enable", &sound_enable,
107 _mmcam_dbg_log("Capture sound enable %d", sound_enable);
109 _mmcam_dbg_warn("capture sound disabled");
113 info = &(hcamcorder->snd_info);
115 g_mutex_lock(&info->open_mutex);
117 if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
118 _mmcam_dbg_log("not initialized state:[%d]", info->state);
119 g_mutex_unlock(&info->open_mutex);
123 if (!strcmp(sample_name, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE02)) {
124 volume_gain = "shutter2";
125 } else if (!strcmp(sample_name, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP)) {
126 volume_gain = "camcording";
129 _mmcam_dbg_log("Play start - sample name [%s]", sample_name);
131 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
132 &hcamcorder->gdbus_info_sound, sample_name, "system", volume_gain, sync_play);
134 g_mutex_unlock(&info->open_mutex);
136 _mmcam_dbg_log("Done");
142 gboolean _mmcamcorder_sound_finalize(MMHandleType handle)
144 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
145 SOUND_INFO *info = NULL;
147 mmf_return_val_if_fail(hcamcorder, FALSE);
149 info = &(hcamcorder->snd_info);
151 _mmcam_dbg_err("START");
153 g_mutex_lock(&info->open_mutex);
155 if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
156 _mmcam_dbg_warn("not initialized");
157 g_mutex_unlock(&info->open_mutex);
161 info->state = _MMCAMCORDER_SOUND_STATE_NONE;
163 _mmcam_dbg_err("DONE");
165 g_mutex_unlock(&info->open_mutex);
171 int _mmcamcorder_sound_solo_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
173 int sound_enable = TRUE;
175 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
177 mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
179 _mmcam_dbg_log("START : [%s]", sample_name);
181 _mmcamcorder_sound_solo_play_wait(handle);
183 /* check sound play enable */
184 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
185 "capture-sound-enable", &sound_enable,
187 _mmcam_dbg_log("Capture sound enable %d", sound_enable);
189 _mmcam_dbg_warn("capture sound disabled");
193 _mmcam_dbg_log("Play start - sample name [%s]", sample_name);
195 if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON ||
196 hcamcorder->sub_context->info_image->sound_status) {
197 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
198 &hcamcorder->gdbus_info_solo_sound, sample_name, "system", "shutter1", sync_play);
200 _mmcam_dbg_warn("skip shutter sound : sound policy %d, sound status %d",
201 hcamcorder->shutter_sound_policy, hcamcorder->sub_context->info_image->sound_status);
204 _mmcam_dbg_log("Done");
210 void _mmcamcorder_sound_solo_play_wait(MMHandleType handle)
212 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
214 mmf_return_if_fail(hcamcorder);
216 _mmcam_dbg_log("START");
218 /* check playing sound count */
219 g_mutex_lock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
221 if (hcamcorder->gdbus_info_solo_sound.is_playing) {
224 _mmcam_dbg_log("Wait for signal");
226 end_time = g_get_monotonic_time() + (2 * G_TIME_SPAN_SECOND);
228 if (g_cond_wait_until(&hcamcorder->gdbus_info_solo_sound.sync_cond,
229 &hcamcorder->gdbus_info_solo_sound.sync_mutex, end_time)) {
230 _mmcam_dbg_log("signal received.");
232 _mmcam_dbg_warn("capture sound play timeout.");
235 _mmcam_dbg_warn("no playing sound");
238 g_mutex_unlock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
240 _mmcam_dbg_log("DONE");