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 =======================================================================================*/
25 #include "mm_camcorder_internal.h"
26 #include "mm_camcorder_sound.h"
28 /*---------------------------------------------------------------------------------------
29 | GLOBAL VARIABLE DEFINITIONS for internal |
30 ---------------------------------------------------------------------------------------*/
32 /*---------------------------------------------------------------------------------------
33 | LOCAL VARIABLE DEFINITIONS for internal |
34 ---------------------------------------------------------------------------------------*/
37 /*---------------------------------------------------------------------------------------
38 | LOCAL FUNCTION PROTOTYPES: |
39 ---------------------------------------------------------------------------------------*/
43 gboolean _mmcamcorder_sound_init(MMHandleType handle)
45 int sound_enable = TRUE;
46 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
47 SOUND_INFO *info = NULL;
49 mmf_return_val_if_fail(hcamcorder, FALSE);
51 info = &(hcamcorder->snd_info);
53 g_mutex_lock(&info->open_mutex);
55 /* check sound state */
56 if (info->state > _MMCAMCORDER_SOUND_STATE_NONE) {
57 _mmcam_dbg_warn("already initialized [%d]", info->state);
58 g_mutex_unlock(&info->open_mutex);
62 /* check sound play enable */
63 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
64 MMCAM_CAPTURE_SOUND_ENABLE, &sound_enable,
66 _mmcam_dbg_log("Capture sound enable %d", sound_enable);
68 _mmcam_dbg_warn("capture sound disabled");
69 g_mutex_unlock(&info->open_mutex);
73 /* check shutter sound policy and status of system */
74 if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_OFF &&
75 hcamcorder->sub_context->info_image->sound_status == FALSE) {
76 _mmcam_dbg_warn("skip sound init : Sound Policy OFF and Silent status");
77 g_mutex_unlock(&info->open_mutex);
81 info->state = _MMCAMCORDER_SOUND_STATE_INIT;
83 _mmcam_dbg_log("init DONE");
85 g_mutex_unlock(&info->open_mutex);
91 gboolean _mmcamcorder_sound_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
93 int sound_enable = TRUE;
94 const char *volume_gain = NULL;
96 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
97 SOUND_INFO *info = NULL;
99 mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
101 /* check sound play enable */
102 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
103 MMCAM_CAPTURE_SOUND_ENABLE, &sound_enable,
105 _mmcam_dbg_log("Capture sound enable %d", sound_enable);
107 _mmcam_dbg_warn("capture sound disabled");
111 info = &(hcamcorder->snd_info);
113 g_mutex_lock(&info->open_mutex);
115 if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
116 _mmcam_dbg_log("not initialized state:[%d]", info->state);
117 g_mutex_unlock(&info->open_mutex);
121 if (!strcmp(sample_name, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE02))
122 volume_gain = "shutter2";
123 else if (!strcmp(sample_name, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP))
124 volume_gain = "camcording";
126 _mmcam_dbg_log("Play start - sample name [%s]", sample_name);
128 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
129 &hcamcorder->gdbus_info_sound, sample_name, "system", volume_gain, sync_play);
131 g_mutex_unlock(&info->open_mutex);
133 _mmcam_dbg_log("Done");
139 gboolean _mmcamcorder_sound_finalize(MMHandleType handle)
141 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
142 SOUND_INFO *info = NULL;
144 mmf_return_val_if_fail(hcamcorder, FALSE);
146 info = &(hcamcorder->snd_info);
148 _mmcam_dbg_err("START");
150 g_mutex_lock(&info->open_mutex);
152 if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
153 _mmcam_dbg_warn("not initialized");
154 g_mutex_unlock(&info->open_mutex);
158 info->state = _MMCAMCORDER_SOUND_STATE_NONE;
160 _mmcam_dbg_err("DONE");
162 g_mutex_unlock(&info->open_mutex);
168 int _mmcamcorder_sound_solo_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
170 int sound_enable = TRUE;
171 int current_state = MM_CAMCORDER_STATE_NONE;
173 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
175 mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
177 _mmcam_dbg_log("START : [%s]", sample_name);
179 _mmcamcorder_sound_solo_play_wait(handle);
181 current_state = _mmcamcorder_get_state(handle);
182 if (current_state < MM_CAMCORDER_STATE_PREPARE) {
183 _mmcam_dbg_warn("invalid state %d", current_state);
187 /* check sound play enable */
188 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
189 MMCAM_CAPTURE_SOUND_ENABLE, &sound_enable,
191 _mmcam_dbg_log("Capture sound enable %d", sound_enable);
193 _mmcam_dbg_warn("capture sound disabled");
197 _mmcam_dbg_log("Play start - sample name [%s]", sample_name);
199 if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON ||
200 hcamcorder->sub_context->info_image->sound_status) {
201 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
202 &hcamcorder->gdbus_info_solo_sound, sample_name, "system", "shutter1", sync_play);
204 _mmcam_dbg_warn("skip shutter sound : sound policy %d, sound status %d",
205 hcamcorder->shutter_sound_policy, hcamcorder->sub_context->info_image->sound_status);
208 _mmcam_dbg_log("Done");
214 void _mmcamcorder_sound_solo_play_wait(MMHandleType handle)
216 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
218 mmf_return_if_fail(hcamcorder);
220 _mmcam_dbg_log("START");
222 /* check playing sound count */
223 g_mutex_lock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
225 if (hcamcorder->gdbus_info_solo_sound.is_playing) {
228 _mmcam_dbg_log("Wait for signal");
230 end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND;
232 if (g_cond_wait_until(&hcamcorder->gdbus_info_solo_sound.sync_cond,
233 &hcamcorder->gdbus_info_solo_sound.sync_mutex, end_time)) {
234 _mmcam_dbg_log("signal received.");
236 _mmcam_dbg_warn("capture sound play timeout.");
239 _mmcam_dbg_warn("no playing sound");
242 g_mutex_unlock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
244 _mmcam_dbg_log("DONE");