4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>,YeJin Cho <cho.yejin@samsung.com>, YoungHwan An <younghwan_.an@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.
24 #include "mm_player_utils.h"
25 #include "mm_player_audioeffect.h"
26 #include "mm_player_ini.h"
27 #include "mm_player_priv.h"
32 mm_player_get_foreach_present_supported_effect_type(MMHandleType hplayer, MMAudioEffectType effect_type, mmplayer_supported_audio_effect_cb foreach_cb, void *user_data)
34 mm_player_t *player = NULL;
35 int result = MM_ERROR_NONE;
36 mm_sound_device_flags_e flags = MM_SOUND_DEVICE_IO_DIRECTION_OUT_FLAG | MM_SOUND_DEVICE_STATE_ACTIVATED_FLAG;
37 MMSoundDeviceList_t device_list;
38 MMSoundDevice_t device_h = NULL;
39 mm_sound_device_type_e device_type;
44 MMPLAYER_RETURN_VAL_IF_FAIL(hplayer, MM_ERROR_PLAYER_NOT_INITIALIZED);
46 player = MM_PLAYER_CAST(hplayer);
48 /* get status if speaker is activated */
49 /* (1) get current device list */
50 result = mm_sound_get_current_device_list(flags, &device_list);
53 LOGE("mm_sound_get_current_device_list() failed [%x]!!", result);
58 /* (2) get device handle of device list */
59 result = mm_sound_get_next_device(device_list, &device_h);
62 LOGE("mm_sound_get_next_device() failed [%x]!!", result);
67 /* (3) get device type */
68 result = mm_sound_get_device_type(device_h, &device_type);
71 LOGE("mm_sound_get_device_type() failed [%x]!!", result);
76 if (effect_type == MM_AUDIO_EFFECT_TYPE_PRESET) {
78 for (i = 0; i < MM_AUDIO_EFFECT_PRESET_NUM; i++) {
79 if (player->ini.audio_effect_preset_list[i]) {
80 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
81 player->ini.audio_effect_preset_earphone_only_list[i])
84 if (!foreach_cb(effect_type, i, user_data))
88 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_CUSTOM) {
90 for (i = 0; i < MM_AUDIO_EFFECT_CUSTOM_NUM; i++) {
91 if (player->ini.audio_effect_custom_list[i]) {
92 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
93 player->ini.audio_effect_custom_earphone_only_list[i]) {
96 if (!foreach_cb(effect_type, i, user_data))
101 LOGE("invalid effect type(%d)", effect_type);
102 result = MM_ERROR_INVALID_ARGUMENT;
110 LOGE("foreach callback returned error");
112 return MM_ERROR_PLAYER_INTERNAL;
117 __mmplayer_set_harmony_effect(mm_player_t *player, GstElement *audio_effect_element)
119 gint *ext_effect_level_list = NULL;
120 int count = 1; /* start from 1, because of excepting eq index */
121 int ext_level_index = 0;
122 int result = MM_ERROR_NONE;
126 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
127 MMPLAYER_RETURN_VAL_IF_FAIL(audio_effect_element, MM_ERROR_INVALID_ARGUMENT);
130 if (player->ini.audio_effect_custom_eq_band_num) {
131 LOGD("pass custom EQ level list to audio effect plugin");
132 /* set custom-equalizer level list */
133 g_object_set(audio_effect_element, "custom-eq", player->audio_effect_info.custom_eq_level, NULL);
135 LOGW("no custom EQ");
137 /* Custom Extension effects */
138 if (player->ini.audio_effect_custom_ext_num) {
139 LOGD("pass custom extension level list to audio effect plugin");
140 ext_effect_level_list = player->audio_effect_info.custom_ext_level_for_plugin;
141 if (!ext_effect_level_list) {
142 ext_effect_level_list = (gint*) malloc(sizeof(gint)*player->ini.audio_effect_custom_ext_num);
143 if (!ext_effect_level_list) {
144 LOGE("memory allocation for extension effect list failed");
145 return MM_ERROR_OUT_OF_MEMORY;
147 memset(ext_effect_level_list, 0, player->ini.audio_effect_custom_ext_num);
149 /* associate it to player handle */
150 player->audio_effect_info.custom_ext_level_for_plugin = ext_effect_level_list;
154 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
155 if (player->ini.audio_effect_custom_list[count]) {
156 ext_effect_level_list[ext_level_index] = player->audio_effect_info.custom_ext_level[count-1];
158 if (ext_level_index == player->ini.audio_effect_custom_ext_num)
164 /* set custom-extension effects level list */
165 g_object_set(audio_effect_element, "custom-ext", ext_effect_level_list, NULL);
167 LOGW("no custom extension effect");
169 /* order action to audio effect plugin */
170 g_object_set(audio_effect_element, "filter-action", MM_AUDIO_EFFECT_TYPE_CUSTOM, NULL);
171 LOGD("filter-action = %d", MM_AUDIO_EFFECT_TYPE_CUSTOM);
180 __mmplayer_is_earphone_only_effect_type(mm_player_t *player, MMAudioEffectType effect_type, int effect)
182 gboolean result = FALSE;
187 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
189 if (effect_type == MM_AUDIO_EFFECT_TYPE_PRESET) {
191 if (player->ini.audio_effect_preset_earphone_only_list[effect]) {
192 LOGI("this preset effect(%d) is only available with earphone", effect);
195 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_CUSTOM) {
197 for (i = 1; i < MM_AUDIO_EFFECT_CUSTOM_NUM; i++) {
198 /* it starts from 1(except testing for EQ) */
199 if (player->ini.audio_effect_custom_earphone_only_list[i]) {
200 /* check if the earphone only custom effect was set */
201 if (player->audio_effect_info.custom_ext_level[i-1]) {
202 LOGI("this custom effect(%d) is only available with earphone", i);
208 LOGE("invalid effect type(%d)", effect_type);
216 __mmplayer_audio_set_output_type(mm_player_t *player, MMAudioEffectType effect_type, int effect)
218 GstElement *audio_effect_element = NULL;
219 mm_sound_device_flags_e flags = MM_SOUND_DEVICE_ALL_FLAG;
220 MMSoundDeviceList_t device_list;
221 MMSoundDevice_t device_h = NULL;
222 mm_sound_device_type_e device_type;
224 int result = MM_ERROR_NONE;
228 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
230 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
232 /* (1) get current device list */
233 result = mm_sound_get_current_device_list(flags, &device_list);
236 LOGE("mm_sound_get_current_device_list() failed [%x]!!", result);
241 /* (2) get device handle of device list */
242 result = mm_sound_get_next_device(device_list, &device_h);
245 LOGE("mm_sound_get_next_device() failed [%x]!!", result);
250 /* (3) get device type */
251 result = mm_sound_get_device_type(device_h, &device_type);
254 LOGE("mm_sound_get_device_type() failed [%x]!!", result);
260 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER) {
261 if (MM_AUDIO_EFFECT_TYPE_SQUARE != effect_type) {
262 if (__mmplayer_is_earphone_only_effect_type(player, effect_type, effect)) {
263 LOGE("earphone is not equipped, this filter will not be applied");
265 return MM_ERROR_PLAYER_SOUND_EFFECT_INVALID_STATUS;
268 output_type = MM_AUDIO_EFFECT_OUTPUT_SPK;
269 } else if (device_type == MM_SOUND_DEVICE_TYPE_MIRRORING) {
270 output_type = MM_AUDIO_EFFECT_OUTPUT_OTHERS;
271 } else if (device_type == MM_SOUND_DEVICE_TYPE_HDMI) {
272 output_type = MM_AUDIO_EFFECT_OUTPUT_HDMI;
273 } else if (device_type == MM_SOUND_DEVICE_TYPE_BLUETOOTH) {
274 output_type = MM_AUDIO_EFFECT_OUTPUT_BT;
275 } else if (device_type == MM_SOUND_DEVICE_TYPE_USB_AUDIO) {
276 output_type = MM_AUDIO_EFFECT_OUTPUT_USB_AUDIO;
278 /* Other case, include WIRED_ACCESSORY */
279 output_type = MM_AUDIO_EFFECT_OUTPUT_EAR;
281 LOGW("output_type = %d (0:spk,1:ear,2:others)", output_type);
283 /* set filter output mode */
284 g_object_set(audio_effect_element, "filter-output-mode", output_type, NULL);
290 _mmplayer_is_supported_effect_type(mm_player_t* player, MMAudioEffectType effect_type, int effect)
292 gboolean result = TRUE;
293 mm_sound_device_flags_e flags = MM_SOUND_DEVICE_ALL_FLAG;
294 MMSoundDeviceList_t device_list;
295 MMSoundDevice_t device_h = NULL;
296 mm_sound_device_type_e device_type;
297 int ret = MM_ERROR_NONE;
301 /* get status if speaker is activated */
302 /* (1) get current device list */
303 ret = mm_sound_get_current_device_list(flags, &device_list);
306 LOGE("mm_sound_get_current_device_list() failed [%x]!!", ret);
310 /* (2) get device handle of device list */
311 ret = mm_sound_get_next_device(device_list, &device_h);
314 LOGE("mm_sound_get_next_device() failed [%x]!!", ret);
319 /* (3) get device type */
320 ret = mm_sound_get_device_type(device_h, &device_type);
323 LOGE("mm_sound_get_device_type() failed [%x]!!", ret);
329 if (effect_type == MM_AUDIO_EFFECT_TYPE_PRESET) {
330 if (effect < MM_AUDIO_EFFECT_PRESET_AUTO || effect >= MM_AUDIO_EFFECT_PRESET_NUM) {
331 LOGE("out of range, preset effect(%d)", effect);
334 if (!player->ini.audio_effect_preset_list[effect]) {
335 LOGE("this effect(%d) is not supported", effect);
338 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
339 player->ini.audio_effect_preset_earphone_only_list[effect]) {
344 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_CUSTOM) {
346 if (effect < MM_AUDIO_EFFECT_CUSTOM_EQ || effect >= MM_AUDIO_EFFECT_CUSTOM_NUM) {
347 LOGE("out of range, custom effect(%d)", effect);
350 if (!player->ini.audio_effect_custom_list[effect]) {
351 LOGE("this custom effect(%d) is not supported", effect);
354 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
355 player->ini.audio_effect_custom_earphone_only_list[effect]) {
360 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_SQUARE) {
361 if (!player->ini.use_audio_effect_custom) {
362 LOGE("Square effect is not supported");
366 LOGE("invalid effect type(%d)", effect_type);
377 _mmplayer_audio_effect_custom_apply(mm_player_t *player)
379 GstElement *audio_effect_element = NULL;
380 int result = MM_ERROR_NONE;
384 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
386 /* Music Player can set audio effect value before Audiobin is created. */
387 if (!player->pipeline || !player->pipeline->audiobin || !player->pipeline->audiobin[MMPLAYER_A_FILTER].gst) {
388 LOGW("effect element is not created yet.");
389 player->bypass_audio_effect = FALSE;
391 /* store audio effect setting in order to apply it when audio effect plugin is created */
392 player->audio_effect_info.effect_type = MM_AUDIO_EFFECT_TYPE_CUSTOM;
394 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
396 /* get status if speaker is activated */
397 result = __mmplayer_audio_set_output_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, 0);
399 if (result != MM_ERROR_NONE) {
400 LOGE("failed to set output mode");
405 result = __mmplayer_set_harmony_effect(player, audio_effect_element);
407 LOGE("_set_harmony_effect() failed(%x)", result);
412 player->set_mode.rich_audio = TRUE;
420 _mmplayer_audio_effect_custom_update_level(mm_player_t *player)
422 GstElement *audio_effect_element = NULL;
423 int result = MM_ERROR_NONE;
424 int ext_level_index = 0;
427 gint *custom_eq = NULL;
428 gint *custom_ext_effect_level_list = NULL;
432 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
434 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
436 /* get custom eq effect */
437 g_object_get(audio_effect_element, "custom-eq", &custom_eq, NULL);
439 memcpy(player->audio_effect_info.custom_eq_level, custom_eq, sizeof(gint) * player->ini.audio_effect_custom_eq_band_num);
441 for (i = 0; i < player->ini.audio_effect_custom_eq_band_num; i++)
442 LOGD("updated custom-eq [%d] = %d", i, player->audio_effect_info.custom_eq_level[i]);
444 /* get custom ext effect */
446 g_object_get(audio_effect_element, "custom-ext", &custom_ext_effect_level_list, NULL);
448 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
449 if (player->ini.audio_effect_custom_list[count]) {
450 player->audio_effect_info.custom_ext_level[count-1]
451 = custom_ext_effect_level_list[ext_level_index];
452 LOGD("updated custom-ext [%d] = %d", count, player->audio_effect_info.custom_ext_level[count-1]);
465 mm_player_audio_effect_custom_clear_eq_all(MMHandleType hplayer)
467 int result = MM_ERROR_NONE;
468 mm_player_t* player = (mm_player_t*)hplayer;
472 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
474 /* clear EQ custom effect */
475 memset(player->audio_effect_info.custom_eq_level, MM_AUDIO_EFFECT_CUSTOM_LEVEL_INIT, sizeof(int)*MM_AUDIO_EFFECT_EQ_BAND_NUM_MAX);
477 LOGI("All the EQ bands clearing success");
486 mm_player_audio_effect_custom_clear_ext_all(MMHandleType hplayer)
489 int result = MM_ERROR_NONE;
490 mm_player_t* player = (mm_player_t*)hplayer;
494 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
496 /* clear ALL custom effects, except EQ */
497 for (i = 0 ; i < MM_AUDIO_EFFECT_CUSTOM_NUM - 1 ; i++)
498 player->audio_effect_info.custom_ext_level[i] = MM_AUDIO_EFFECT_CUSTOM_LEVEL_INIT;
500 LOGI("All the extension effects clearing success");
509 mm_player_is_supported_preset_effect_type(MMHandleType hplayer, MMAudioEffectPresetType effect)
511 mm_player_t* player = (mm_player_t*)hplayer;
512 int result = MM_ERROR_NONE;
516 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
518 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_PRESET, effect))
519 result = MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
528 mm_player_is_supported_custom_effect_type(MMHandleType hplayer, MMAudioEffectCustomType effect)
530 mm_player_t* player = (mm_player_t*)hplayer;
531 int result = MM_ERROR_NONE;
535 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
537 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, effect))
538 result = MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
546 mm_player_audio_effect_custom_apply(MMHandleType hplayer)
548 mm_player_t* player = (mm_player_t*)hplayer;
549 int result = MM_ERROR_NONE;
553 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
555 if (!player->ini.use_audio_effect_custom) {
556 LOGE("audio effect(custom) is not supported");
558 return MM_ERROR_NOT_SUPPORT_API;
561 result = _mmplayer_audio_effect_custom_apply(player);
570 mm_player_audio_effect_bypass(MMHandleType hplayer)
572 mm_player_t* player = (mm_player_t*)hplayer;
573 int result = MM_ERROR_NONE;
574 GstElement *audio_effect_element = NULL;
578 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
580 if (!player->ini.use_audio_effect_preset && !player->ini.use_audio_effect_custom) {
581 LOGE("audio effect(preset/custom) is not supported");
583 return MM_ERROR_NOT_SUPPORT_API;
585 if (!player->pipeline || !player->pipeline->audiobin || !player->pipeline->audiobin[MMPLAYER_A_FILTER].gst) {
586 LOGW("effect element is not created yet.");
588 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
590 /* order action to audio effect plugin */
591 g_object_set(audio_effect_element, "filter-action", MM_AUDIO_EFFECT_TYPE_NONE, NULL);
592 LOGD("filter-action = %d", MM_AUDIO_EFFECT_TYPE_NONE);
602 _mmplayer_audio_effect_custom_set_level_ext(mm_player_t *player, MMAudioEffectCustomType custom_effect_type, int level)
604 int effect_level_max = 0;
605 int effect_level_min = 0;
606 int count = 1; /* start from 1, because of excepting eq index */
607 int ext_level_index = 1; /* start from 1, because of excepting eq index */
608 int result = MM_ERROR_NONE;
612 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
614 /* check if EQ is supported */
615 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, custom_effect_type)) {
617 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
620 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
621 if (player->ini.audio_effect_custom_list[count]) {
622 if (count == custom_effect_type) {
623 effect_level_min = player->ini.audio_effect_custom_min_level_list[ext_level_index];
624 effect_level_max = player->ini.audio_effect_custom_max_level_list[ext_level_index];
625 LOGI("level min value(%d), level max value(%d)", effect_level_min, effect_level_max);
629 if (ext_level_index == player->ini.audio_effect_custom_ext_num + 1) {
630 LOGE("could not find min, max value. maybe effect information in ini file is not proper for audio effect plugin");
637 if (level < effect_level_min || level > effect_level_max) {
638 LOGE("out of range, level(%d)", level);
639 result = MM_ERROR_INVALID_ARGUMENT;
641 player->audio_effect_info.custom_ext_level[custom_effect_type-1] = level;
642 LOGI("set ext[%d] = %d", custom_effect_type-1, level);
652 _mmplayer_audio_effect_custom_set_level_eq(mm_player_t *player, int index, int level)
654 gint eq_level_max = 0;
655 gint eq_level_min = 0;
656 int result = MM_ERROR_NONE;
660 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
662 /* check if EQ is supported */
663 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ)) {
665 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
668 if (index < 0 || index > player->ini.audio_effect_custom_eq_band_num - 1) {
669 LOGE("out of range, index(%d)", index);
670 result = MM_ERROR_INVALID_ARGUMENT;
672 eq_level_min = player->ini.audio_effect_custom_min_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
673 eq_level_max = player->ini.audio_effect_custom_max_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
674 LOGI("EQ level min value(%d), EQ level max value(%d)", eq_level_min, eq_level_max);
676 if (level < eq_level_min || level > eq_level_max) {
677 LOGE("out of range, EQ level(%d)", level);
678 result = MM_ERROR_INVALID_ARGUMENT;
680 player->audio_effect_info.custom_eq_level[index] = level;
681 LOGI("set EQ[%d] = %d", index, level);
691 /* NOTE : parameter eq_index is only used for _set_eq_level() */
693 mm_player_audio_effect_custom_set_level(MMHandleType hplayer, MMAudioEffectCustomType effect_custom_type, int eq_index, int level)
695 mm_player_t* player = (mm_player_t*)hplayer;
696 int result = MM_ERROR_NONE;
700 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
702 /* check if this effect type is supported */
703 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, effect_custom_type)) {
704 result = MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
706 if (effect_custom_type == MM_AUDIO_EFFECT_CUSTOM_EQ) {
707 result = _mmplayer_audio_effect_custom_set_level_eq(player, eq_index, level);
708 } else if (effect_custom_type > MM_AUDIO_EFFECT_CUSTOM_EQ && effect_custom_type < MM_AUDIO_EFFECT_CUSTOM_NUM) {
709 result = _mmplayer_audio_effect_custom_set_level_ext(player, effect_custom_type, level);
711 LOGE("out of range, effect type(%d)", effect_custom_type);
712 result = MM_ERROR_INVALID_ARGUMENT;
723 mm_player_audio_effect_custom_get_eq_bands_number(MMHandleType hplayer, int *bands)
725 mm_player_t* player = (mm_player_t*)hplayer;
726 int result = MM_ERROR_NONE;
730 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
732 /* check if EQ is supported */
733 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ)) {
735 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
738 *bands = player->ini.audio_effect_custom_eq_band_num;
739 LOGD("number of custom EQ band = %d", *bands);
748 mm_player_audio_effect_custom_get_eq_bands_width(MMHandleType hplayer, int band_idx, int *width)
750 mm_player_t* player = (mm_player_t*)hplayer;
751 int result = MM_ERROR_NONE;
752 unsigned int eq_num = 0;
756 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
758 /* check if EQ is supported */
759 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ)) {
761 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
764 eq_num = player->ini.audio_effect_custom_eq_band_num;
765 if (band_idx < 0 || band_idx > eq_num-1) {
766 LOGE("out of range, invalid band_idx(%d)", band_idx);
767 result = MM_ERROR_INVALID_ARGUMENT;
769 /* set the width of EQ band */
770 *width = player->ini.audio_effect_custom_eq_band_width[band_idx];
771 LOGD("width of band_idx(%d) = %dHz", band_idx, *width);
781 mm_player_audio_effect_custom_get_eq_bands_freq(MMHandleType hplayer, int band_idx, int *freq)
783 mm_player_t* player = (mm_player_t*)hplayer;
784 int result = MM_ERROR_NONE;
785 unsigned int eq_num = 0;
789 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
791 /* check if EQ is supported */
792 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ)) {
794 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
797 eq_num = player->ini.audio_effect_custom_eq_band_num;
798 if (band_idx < 0 || band_idx > eq_num-1) {
799 LOGE("out of range, invalid band_idx(%d)", band_idx);
800 result = MM_ERROR_INVALID_ARGUMENT;
802 /* set the frequency of EQ band */
803 *freq = player->ini.audio_effect_custom_eq_band_freq[band_idx];
804 LOGD("frequency of band_idx(%d) = %dHz", band_idx, *freq);
814 mm_player_audio_effect_custom_get_level(MMHandleType hplayer, MMAudioEffectCustomType type, int eq_index, int *level)
816 mm_player_t* player = (mm_player_t*)hplayer;
817 int result = MM_ERROR_NONE;
821 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
822 MMPLAYER_RETURN_VAL_IF_FAIL(level, MM_ERROR_PLAYER_NOT_INITIALIZED);
824 /* check if this effect type is supported */
825 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, type)) {
827 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
830 if (type == MM_AUDIO_EFFECT_CUSTOM_EQ) {
831 if (eq_index < 0 || eq_index > player->ini.audio_effect_custom_eq_band_num - 1) {
832 LOGE("out of range, EQ index(%d)", eq_index);
833 result = MM_ERROR_INVALID_ARGUMENT;
835 *level = player->audio_effect_info.custom_eq_level[eq_index];
836 LOGD("EQ index = %d, level = %d", eq_index, *level);
838 } else if (type > MM_AUDIO_EFFECT_CUSTOM_EQ && type < MM_AUDIO_EFFECT_CUSTOM_NUM) {
839 *level = player->audio_effect_info.custom_ext_level[type-1];
840 LOGD("extension effect index = %d, level = %d", type, *level);
842 LOGE("out of range, type(%d)", type);
843 result = MM_ERROR_INVALID_ARGUMENT;
853 mm_player_audio_effect_custom_get_level_range(MMHandleType hplayer, MMAudioEffectCustomType type, int *min, int *max)
855 mm_player_t* player = (mm_player_t*)hplayer;
856 int result = MM_ERROR_NONE;
857 int count = 1; /* start from 1, because of excepting eq index */
858 int ext_level_index = 1; /* start from 1, because of excepting eq index */
862 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
863 MMPLAYER_RETURN_VAL_IF_FAIL(min, MM_ERROR_PLAYER_NOT_INITIALIZED);
864 MMPLAYER_RETURN_VAL_IF_FAIL(max, MM_ERROR_PLAYER_NOT_INITIALIZED);
866 /* check if this effect type is supported */
867 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, type)) {
869 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
872 if (type == MM_AUDIO_EFFECT_CUSTOM_EQ) {
873 *min = player->ini.audio_effect_custom_min_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
874 *max = player->ini.audio_effect_custom_max_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
875 LOGD("EQ min level = %d, max level = %d", *min, *max);
877 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
878 if (player->ini.audio_effect_custom_list[count]) {
880 *min = player->ini.audio_effect_custom_min_level_list[ext_level_index];
881 *max = player->ini.audio_effect_custom_max_level_list[ext_level_index];
882 LOGI("Extension effect(%d) min level = %d, max level = %d", count, *min, *max);
886 if (ext_level_index == player->ini.audio_effect_custom_ext_num + 1) {
887 LOGE("could not find min, max value. maybe effect information in ini file is not proper for audio effect plugin");
902 mm_player_audio_effect_custom_set_level_eq_from_list(MMHandleType hplayer, int *level_list, int size)
904 mm_player_t *player = (mm_player_t*)hplayer;
906 gint eq_level_min = 0;
907 gint eq_level_max = 0;
908 int result = MM_ERROR_NONE;
912 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
914 /* check if EQ is supported */
915 if (!_mmplayer_is_supported_effect_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ)) {
917 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
920 if (size != player->ini.audio_effect_custom_eq_band_num) {
921 LOGE("input size variable(%d) does not match with number of eq band(%d)", size, player->ini.audio_effect_custom_eq_band_num);
922 result = MM_ERROR_INVALID_ARGUMENT;
924 eq_level_min = player->ini.audio_effect_custom_min_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
925 eq_level_max = player->ini.audio_effect_custom_max_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
927 for (i = 0 ; i < size ; i++) {
928 if (level_list[i] < eq_level_min || level_list[i] > eq_level_max) {
929 LOGE("out of range, level[%d]=%d", i, level_list[i]);
930 result = MM_ERROR_INVALID_ARGUMENT;
933 player->audio_effect_info.custom_eq_level[i] = level_list[i];