Ignore get stream type error
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_sound.c
1 /*
2  * libmm-camcorder
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jeongmo Yang <jm80.yang@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 /*=======================================================================================
23 |  INCLUDE FILES                                                                        |
24 =======================================================================================*/
25 #include <mm_sound.h>
26 #include <mm_sound_private.h>
27 #include "mm_camcorder_internal.h"
28 #include "mm_camcorder_sound.h"
29
30 /*---------------------------------------------------------------------------------------
31 |    GLOBAL VARIABLE DEFINITIONS for internal                                           |
32 ---------------------------------------------------------------------------------------*/
33
34 /*---------------------------------------------------------------------------------------
35 |    LOCAL VARIABLE DEFINITIONS for internal                                            |
36 ---------------------------------------------------------------------------------------*/
37
38
39 /*---------------------------------------------------------------------------------------
40 |    LOCAL FUNCTION PROTOTYPES:                                                         |
41 ---------------------------------------------------------------------------------------*/
42
43
44
45 gboolean _mmcamcorder_sound_init(MMHandleType handle)
46 {
47         int sound_enable = TRUE;
48         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
49         SOUND_INFO *info = NULL;
50
51         mmf_return_val_if_fail(hcamcorder, FALSE);
52
53         info = &(hcamcorder->snd_info);
54
55         g_mutex_lock(&info->open_mutex);
56
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);
61                 return TRUE;
62         }
63
64         /* check sound play enable */
65         mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
66                 "capture-sound-enable", &sound_enable,
67                 NULL);
68         _mmcam_dbg_log("Capture sound enable %d", sound_enable);
69         if (!sound_enable) {
70                 _mmcam_dbg_warn("capture sound disabled");
71                 g_mutex_unlock(&info->open_mutex);
72                 return FALSE;
73         }
74
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);
80                 return FALSE;
81         }
82
83         info->state = _MMCAMCORDER_SOUND_STATE_INIT;
84
85         _mmcam_dbg_log("init DONE");
86
87         g_mutex_unlock(&info->open_mutex);
88
89         return TRUE;
90 }
91
92
93 gboolean _mmcamcorder_sound_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
94 {
95         int sound_enable = TRUE;
96         const char *volume_gain = NULL;
97
98         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
99         SOUND_INFO *info = NULL;
100
101         mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
102
103         /* check sound play enable */
104         mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
105                 "capture-sound-enable", &sound_enable,
106                 NULL);
107         _mmcam_dbg_log("Capture sound enable %d", sound_enable);
108         if (!sound_enable) {
109                 _mmcam_dbg_warn("capture sound disabled");
110                 return FALSE;
111         }
112
113         info = &(hcamcorder->snd_info);
114
115         g_mutex_lock(&info->open_mutex);
116
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);
120                 return FALSE;
121         }
122
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";
127
128         _mmcam_dbg_log("Play start - sample name [%s]", sample_name);
129
130         _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
131                 &hcamcorder->gdbus_info_sound, sample_name, "system", volume_gain, sync_play);
132
133         g_mutex_unlock(&info->open_mutex);
134
135         _mmcam_dbg_log("Done");
136
137         return TRUE;
138 }
139
140
141 gboolean _mmcamcorder_sound_finalize(MMHandleType handle)
142 {
143         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
144         SOUND_INFO *info = NULL;
145
146         mmf_return_val_if_fail(hcamcorder, FALSE);
147
148         info = &(hcamcorder->snd_info);
149
150         _mmcam_dbg_err("START");
151
152         g_mutex_lock(&info->open_mutex);
153
154         if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
155                 _mmcam_dbg_warn("not initialized");
156                 g_mutex_unlock(&info->open_mutex);
157                 return TRUE;
158         }
159
160         info->state = _MMCAMCORDER_SOUND_STATE_NONE;
161
162         _mmcam_dbg_err("DONE");
163
164         g_mutex_unlock(&info->open_mutex);
165
166         return TRUE;
167 }
168
169
170 int _mmcamcorder_sound_solo_play(MMHandleType handle, const char *sample_name, gboolean sync_play)
171 {
172         int sound_enable = TRUE;
173         int current_state = MM_CAMCORDER_STATE_NONE;
174
175         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
176
177         mmf_return_val_if_fail(hcamcorder && sample_name, FALSE);
178
179         _mmcam_dbg_log("START : [%s]", sample_name);
180
181         _mmcamcorder_sound_solo_play_wait(handle);
182
183         current_state = _mmcamcorder_get_state(handle);
184         if (current_state < MM_CAMCORDER_STATE_PREPARE) {
185                 _mmcam_dbg_warn("invalid state %d", current_state);
186                 return FALSE;
187         }
188
189         /* check sound play enable */
190         mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
191                 "capture-sound-enable", &sound_enable,
192                 NULL);
193         _mmcam_dbg_log("Capture sound enable %d", sound_enable);
194         if (!sound_enable) {
195                 _mmcam_dbg_warn("capture sound disabled");
196                 return FALSE;
197         }
198
199         _mmcam_dbg_log("Play start - sample name [%s]", sample_name);
200
201         if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON ||
202                 hcamcorder->sub_context->info_image->sound_status) {
203                 _mmcamcorder_send_sound_play_message(hcamcorder->gdbus_conn,
204                         &hcamcorder->gdbus_info_solo_sound, sample_name, "system", "shutter1", sync_play);
205         } else {
206                 _mmcam_dbg_warn("skip shutter sound : sound policy %d, sound status %d",
207                         hcamcorder->shutter_sound_policy, hcamcorder->sub_context->info_image->sound_status);
208         }
209
210         _mmcam_dbg_log("Done");
211
212         return TRUE;
213 }
214
215
216 void _mmcamcorder_sound_solo_play_wait(MMHandleType handle)
217 {
218         mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
219
220         mmf_return_if_fail(hcamcorder);
221
222         _mmcam_dbg_log("START");
223
224         /* check playing sound count */
225         g_mutex_lock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
226
227         if (hcamcorder->gdbus_info_solo_sound.is_playing) {
228                 gint64 end_time = 0;
229
230                 _mmcam_dbg_log("Wait for signal");
231
232                 end_time = g_get_monotonic_time() + G_TIME_SPAN_SECOND;
233
234                 if (g_cond_wait_until(&hcamcorder->gdbus_info_solo_sound.sync_cond,
235                         &hcamcorder->gdbus_info_solo_sound.sync_mutex, end_time)) {
236                         _mmcam_dbg_log("signal received.");
237                 } else {
238                         _mmcam_dbg_warn("capture sound play timeout.");
239                 }
240         } else {
241                 _mmcam_dbg_warn("no playing sound");
242         }
243
244         g_mutex_unlock(&hcamcorder->gdbus_info_solo_sound.sync_mutex);
245
246         _mmcam_dbg_log("DONE");
247
248         return;
249 }