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 | LOCAL VARIABLE DEFINITIONS for internal |
30 ---------------------------------------------------------------------------------------*/
31 #define _MMCAMCORDER_SOLO_PLAY_WAIT_TIMEOUT (G_TIME_SPAN_SECOND * 3)
34 /*---------------------------------------------------------------------------------------
35 | LOCAL FUNCTION PROTOTYPES: |
36 ---------------------------------------------------------------------------------------*/
40 gboolean _mmcamcorder_sound_init(MMHandleType handle)
42 int sound_enable = TRUE;
43 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
44 SOUND_INFO *info = NULL;
46 mmf_return_val_if_fail(hcamcorder, FALSE);
48 info = &(hcamcorder->snd_info);
50 g_mutex_lock(&info->open_mutex);
52 /* check sound state */
53 if (info->state > _MMCAMCORDER_SOUND_STATE_NONE) {
54 MMCAM_LOG_WARNING("already initialized [%d]", info->state);
55 g_mutex_unlock(&info->open_mutex);
59 /* check sound play enable */
60 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
61 MMCAM_CAPTURE_SOUND_ENABLE, &sound_enable,
63 MMCAM_LOG_INFO("Capture sound enable %d", sound_enable);
65 MMCAM_LOG_WARNING("capture sound disabled");
66 g_mutex_unlock(&info->open_mutex);
70 /* check shutter sound policy and status of system */
71 if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_OFF &&
72 hcamcorder->sub_context->info_image->sound_status == FALSE) {
73 MMCAM_LOG_WARNING("skip sound init : Sound Policy OFF and Silent status");
74 g_mutex_unlock(&info->open_mutex);
78 info->state = _MMCAMCORDER_SOUND_STATE_INIT;
80 MMCAM_LOG_INFO("init DONE");
82 g_mutex_unlock(&info->open_mutex);
88 gboolean _mmcamcorder_sound_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
90 int sound_enable = TRUE;
91 const char *volume_gain = NULL;
93 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
94 SOUND_INFO *info = NULL;
96 mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
98 /* check sound play enable */
99 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
100 MMCAM_CAPTURE_SOUND_ENABLE, &sound_enable,
102 MMCAM_LOG_INFO("Capture sound enable %d", sound_enable);
104 MMCAM_LOG_WARNING("capture sound disabled");
108 info = &(hcamcorder->snd_info);
110 g_mutex_lock(&info->open_mutex);
112 if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
113 MMCAM_LOG_INFO("not initialized state:[%d]", info->state);
114 g_mutex_unlock(&info->open_mutex);
118 if (!strcmp(sample_name, _MMCAMCORDER_SAMPLE_SOUND_NAME_CAPTURE02))
119 volume_gain = "shutter2";
120 else if (!strcmp(sample_name, _MMCAMCORDER_SAMPLE_SOUND_NAME_REC_STOP))
121 volume_gain = "camcording";
123 MMCAM_LOG_INFO("Play start - sample name [%s]", sample_name);
125 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
126 hcamcorder->gdbus_info_sound, sample_name, "system", volume_gain, sync_play);
128 g_mutex_unlock(&info->open_mutex);
130 MMCAM_LOG_INFO("Done");
136 gboolean _mmcamcorder_sound_finalize(MMHandleType handle)
138 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
139 SOUND_INFO *info = NULL;
141 mmf_return_val_if_fail(hcamcorder, FALSE);
143 info = &(hcamcorder->snd_info);
145 MMCAM_LOG_ERROR("START");
147 g_mutex_lock(&info->open_mutex);
149 if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
150 MMCAM_LOG_WARNING("not initialized");
151 g_mutex_unlock(&info->open_mutex);
155 info->state = _MMCAMCORDER_SOUND_STATE_NONE;
157 MMCAM_LOG_ERROR("DONE");
159 g_mutex_unlock(&info->open_mutex);
165 int _mmcamcorder_sound_solo_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
167 int sound_enable = TRUE;
168 int current_state = MM_CAMCORDER_STATE_NONE;
170 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
172 mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
174 MMCAM_LOG_INFO("START : [%s]", sample_name);
176 _mmcamcorder_sound_solo_play_wait(handle);
178 current_state = _mmcamcorder_get_state(handle);
179 if (current_state < MM_CAMCORDER_STATE_PREPARE) {
180 MMCAM_LOG_WARNING("invalid state %d", current_state);
184 /* check sound play enable */
185 mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
186 MMCAM_CAPTURE_SOUND_ENABLE, &sound_enable,
188 MMCAM_LOG_INFO("Capture sound enable %d", sound_enable);
190 MMCAM_LOG_WARNING("capture sound disabled");
194 MMCAM_LOG_INFO("Play start - sample name [%s]", sample_name);
196 if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON ||
197 hcamcorder->sub_context->info_image->sound_status) {
198 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
199 hcamcorder->gdbus_info_solo_sound, sample_name, "system", "shutter1", sync_play);
201 MMCAM_LOG_WARNING("skip shutter sound : sound policy %d, sound status %d",
202 hcamcorder->shutter_sound_policy, hcamcorder->sub_context->info_image->sound_status);
205 MMCAM_LOG_INFO("Done");
211 void _mmcamcorder_sound_solo_play_wait(MMHandleType handle)
214 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
215 _MMCamcorderGDbusCbInfo *info = NULL;
217 mmf_return_if_fail(hcamcorder && hcamcorder->gdbus_info_solo_sound);
219 info = hcamcorder->gdbus_info_solo_sound;
221 end_time = g_get_monotonic_time() + _MMCAMCORDER_SOLO_PLAY_WAIT_TIMEOUT;
223 g_mutex_lock(&info->sync_mutex);
225 MMCAM_LOG_INFO("is_playing[%d]", info->is_playing);
227 while (info->is_playing) {
228 MMCAM_LOG_INFO("Wait for signal");
230 if (!g_cond_wait_until(&info->sync_cond, &info->sync_mutex, end_time)) {
231 MMCAM_LOG_WARNING("sound play EOS timeout");
235 MMCAM_LOG_INFO("signal received, check again[is_playing:%d]", info->is_playing);
238 g_mutex_unlock(&info->sync_mutex);
240 MMCAM_LOG_INFO("DONE");