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, mm_audio_effect_type_e effect_type, mmplayer_supported_audio_effect_cb foreach_cb, void *user_data)
34 mmplayer_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 = NULL;
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_device_list(flags, &device_list);
51 if (result != MM_ERROR_NONE) {
52 LOGE("mm_sound_get_device_list() failed [0x%x]!!", result);
57 /* (2) get device handle of device list */
58 result = mm_sound_get_next_device(device_list, &device_h);
59 if (result != MM_ERROR_NONE) {
60 LOGE("mm_sound_get_next_device() failed [0x%x]!!", result);
64 /* (3) get device type */
65 result = mm_sound_get_device_type(device_h, &device_type);
66 if (result != MM_ERROR_NONE) {
67 LOGE("mm_sound_get_device_type() failed [0x%x]!!", result);
71 if (effect_type == MM_AUDIO_EFFECT_TYPE_PRESET) {
73 for (i = 0; i < MM_AUDIO_EFFECT_PRESET_NUM; i++) {
74 if (player->ini.audio_effect_preset_list[i]) {
75 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
76 player->ini.audio_effect_preset_earphone_only_list[i])
79 if (!foreach_cb(effect_type, i, user_data)) {
80 LOGE("foreach callback returned error");
81 result = MM_ERROR_PLAYER_INTERNAL;
86 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_CUSTOM) {
88 for (i = 0; i < MM_AUDIO_EFFECT_CUSTOM_NUM; i++) {
89 if (player->ini.audio_effect_custom_list[i]) {
90 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
91 player->ini.audio_effect_custom_earphone_only_list[i]) {
94 if (!foreach_cb(effect_type, i, user_data)) {
95 LOGE("foreach callback returned error");
96 result = MM_ERROR_PLAYER_INTERNAL;
102 LOGE("invalid effect type(%d)", effect_type);
103 result = MM_ERROR_INVALID_ARGUMENT;
108 mm_sound_free_device_list(device_list);
116 __mmplayer_set_harmony_effect(mmplayer_t *player, GstElement *audio_effect_element)
118 gint *ext_effect_level_list = NULL;
119 int count = 1; /* start from 1, because of excepting eq index */
120 int ext_level_index = 0;
121 int result = MM_ERROR_NONE;
125 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
126 MMPLAYER_RETURN_VAL_IF_FAIL(audio_effect_element, MM_ERROR_INVALID_ARGUMENT);
129 if (player->ini.audio_effect_custom_eq_band_num) {
130 LOGD("pass custom EQ level list to audio effect plugin");
131 /* set custom-equalizer level list */
132 g_object_set(audio_effect_element, "custom-eq", player->audio_effect_info.custom_eq_level, NULL);
134 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");
170 /* order action to audio effect plugin */
171 g_object_set(audio_effect_element, "filter-action", MM_AUDIO_EFFECT_TYPE_CUSTOM, NULL);
172 LOGD("filter-action = %d", MM_AUDIO_EFFECT_TYPE_CUSTOM);
181 __mmplayer_is_earphone_only_effect_type(mmplayer_t *player, mm_audio_effect_type_e effect_type, int effect)
183 gboolean result = FALSE;
188 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
190 if (effect_type == MM_AUDIO_EFFECT_TYPE_PRESET) {
192 if (player->ini.audio_effect_preset_earphone_only_list[effect]) {
193 LOGI("this preset effect(%d) is only available with earphone", effect);
196 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_CUSTOM) {
198 for (i = 1; i < MM_AUDIO_EFFECT_CUSTOM_NUM; i++) {
199 /* it starts from 1(except testing for EQ) */
200 if (player->ini.audio_effect_custom_earphone_only_list[i]) {
201 /* check if the earphone only custom effect was set */
202 if (player->audio_effect_info.custom_ext_level[i - 1]) {
203 LOGI("this custom effect(%d) is only available with earphone", i);
209 LOGE("invalid effect type(%d)", effect_type);
218 __mmplayer_audio_set_output_type(mmplayer_t *player, mm_audio_effect_type_e effect_type, int effect)
220 GstElement *audio_effect_element = NULL;
221 mm_sound_device_flags_e flags = MM_SOUND_DEVICE_ALL_FLAG;
222 MMSoundDeviceList_t device_list = NULL;
223 MMSoundDevice_t device_h = NULL;
224 mm_sound_device_type_e device_type;
226 int result = MM_ERROR_NONE;
230 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
232 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
234 /* (1) get current device list */
235 result = mm_sound_get_device_list(flags, &device_list);
236 if (result != MM_ERROR_NONE) {
237 LOGE("mm_sound_get_device_list() failed [0x%x]!!", result);
242 /* (2) get device handle of device list */
243 result = mm_sound_get_next_device(device_list, &device_h);
244 if (result != MM_ERROR_NONE) {
245 LOGE("mm_sound_get_next_device() failed [0x%x]!!", result);
249 /* (3) get device type */
250 result = mm_sound_get_device_type(device_h, &device_type);
251 if (result != MM_ERROR_NONE) {
252 LOGE("mm_sound_get_device_type() failed [0x%x]!!", result);
257 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER) {
258 if (MM_AUDIO_EFFECT_TYPE_SQUARE != effect_type) {
259 if (__mmplayer_is_earphone_only_effect_type(player, effect_type, effect)) {
260 LOGE("earphone is not equipped, this filter will not be applied");
261 result = MM_ERROR_PLAYER_SOUND_EFFECT_INVALID_STATUS;
265 output_type = MM_AUDIO_EFFECT_OUTPUT_SPK;
266 } else if (device_type == MM_SOUND_DEVICE_TYPE_MIRRORING) {
267 output_type = MM_AUDIO_EFFECT_OUTPUT_OTHERS;
268 } else if (device_type == MM_SOUND_DEVICE_TYPE_HDMI) {
269 output_type = MM_AUDIO_EFFECT_OUTPUT_HDMI;
270 } else if (device_type == MM_SOUND_DEVICE_TYPE_BLUETOOTH) {
271 output_type = MM_AUDIO_EFFECT_OUTPUT_BT;
272 } else if (device_type == MM_SOUND_DEVICE_TYPE_USB_AUDIO) {
273 output_type = MM_AUDIO_EFFECT_OUTPUT_USB_AUDIO;
275 /* Other case, include WIRED_ACCESSORY */
276 output_type = MM_AUDIO_EFFECT_OUTPUT_EAR;
278 LOGW("output_type = %d (0:spk,1:ear,2:others)", output_type);
280 /* set filter output mode */
281 g_object_set(audio_effect_element, "filter-output-mode", output_type, NULL);
285 mm_sound_free_device_list(device_list);
292 __mmplayer_is_supported_effect_type(mmplayer_t *player, mm_audio_effect_type_e effect_type, int effect)
294 gboolean result = TRUE;
295 mm_sound_device_flags_e flags = MM_SOUND_DEVICE_ALL_FLAG;
296 MMSoundDeviceList_t device_list = NULL;
297 MMSoundDevice_t device_h = NULL;
298 mm_sound_device_type_e device_type;
299 int ret = MM_ERROR_NONE;
303 /* get status if speaker is activated */
304 /* (1) get current device list */
305 ret = mm_sound_get_device_list(flags, &device_list);
306 if (ret != MM_ERROR_NONE) {
308 LOGE("mm_sound_get_device_list() failed [0x%x]!!", ret);
312 /* (2) get device handle of device list */
313 ret = mm_sound_get_next_device(device_list, &device_h);
314 if (ret != MM_ERROR_NONE) {
315 LOGE("mm_sound_get_next_device() failed [0x%x]!!", ret);
319 /* (3) get device type */
320 ret = mm_sound_get_device_type(device_h, &device_type);
321 if (ret != MM_ERROR_NONE) {
322 LOGE("mm_sound_get_device_type() failed [0x%x]!!", ret);
327 if (effect_type == MM_AUDIO_EFFECT_TYPE_PRESET) {
328 if (effect < MM_AUDIO_EFFECT_PRESET_AUTO || effect >= MM_AUDIO_EFFECT_PRESET_NUM) {
329 LOGE("out of range, preset effect(%d)", effect);
332 if (!player->ini.audio_effect_preset_list[effect]) {
333 LOGE("this effect(%d) is not supported", effect);
336 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
337 player->ini.audio_effect_preset_earphone_only_list[effect]) {
342 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_CUSTOM) {
344 if (effect < MM_AUDIO_EFFECT_CUSTOM_EQ || effect >= MM_AUDIO_EFFECT_CUSTOM_NUM) {
345 LOGE("out of range, custom effect(%d)", effect);
348 if (!player->ini.audio_effect_custom_list[effect]) {
349 LOGE("this custom effect(%d) is not supported", effect);
352 if (device_type == MM_SOUND_DEVICE_TYPE_BUILTIN_SPEAKER &&
353 player->ini.audio_effect_custom_earphone_only_list[effect])
357 } else if (effect_type == MM_AUDIO_EFFECT_TYPE_SQUARE) {
358 if (!player->ini.use_audio_effect_custom) {
359 LOGE("Square effect is not supported");
363 LOGE("invalid effect type(%d)", effect_type);
369 mm_sound_free_device_list(device_list);
376 __mmplayer_audio_effect_check_condition(mmplayer_t *player, mm_audio_effect_type_e effect_type, int effect)
378 int ret = MM_ERROR_NONE;
380 bool available = false;
382 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
384 mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_AUDIO_OFFLOAD, &enabled);
386 LOGW("audio offload is enabled.");
387 return MM_ERROR_PLAYER_SOUND_EFFECT_INVALID_STATUS;
390 ret = _mmplayer_is_audio_control_available((MMHandleType)player, MM_PLAYER_AUDIO_CONTROL_OPT_EFFECT, &available);
391 if (ret != MM_ERROR_NONE || !available)
392 return MM_ERROR_PLAYER_SOUND_EFFECT_INVALID_STATUS;
394 if (!__mmplayer_is_supported_effect_type(player, effect_type, effect)) {
395 LOGW("not supported effect filter %d %d", effect_type, effect);
396 return MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER;
399 return MM_ERROR_NONE;
403 _mmplayer_audio_effect_custom_apply(mmplayer_t *player)
405 GstElement *audio_effect_element = NULL;
406 int result = MM_ERROR_NONE;
410 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
412 /* Music Player can set audio effect value before Audiobin is created. */
413 if (!player->pipeline || !player->pipeline->audiobin || !player->pipeline->audiobin[MMPLAYER_A_FILTER].gst) {
414 LOGW("effect element is not created yet.");
415 player->bypass_audio_effect = FALSE;
417 /* store audio effect setting in order to apply it when audio effect plugin is created */
418 player->audio_effect_info.effect_type = MM_AUDIO_EFFECT_TYPE_CUSTOM;
420 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
422 /* get status if speaker is activated */
423 result = __mmplayer_audio_set_output_type(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, 0);
424 if (result != MM_ERROR_NONE) {
425 LOGE("failed to set output mode");
430 result = __mmplayer_set_harmony_effect(player, audio_effect_element);
432 LOGE("_set_harmony_effect() failed(0x%x)", result);
437 player->set_mode.rich_audio = true;
445 _mmplayer_audio_effect_custom_update_level(mmplayer_t *player)
447 GstElement *audio_effect_element = NULL;
448 int result = MM_ERROR_NONE;
449 int ext_level_index = 0;
452 gint *custom_eq = NULL;
453 gint *custom_ext_effect_level_list = NULL;
457 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
459 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
461 /* get custom eq effect */
462 g_object_get(audio_effect_element, "custom-eq", &custom_eq, NULL);
464 memcpy(player->audio_effect_info.custom_eq_level, custom_eq, sizeof(gint) * player->ini.audio_effect_custom_eq_band_num);
466 for (i = 0; i < player->ini.audio_effect_custom_eq_band_num; i++)
467 LOGD("updated custom-eq [%d] = %d", i, player->audio_effect_info.custom_eq_level[i]);
469 /* get custom ext effect */
470 g_object_get(audio_effect_element, "custom-ext", &custom_ext_effect_level_list, NULL);
472 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
473 if (player->ini.audio_effect_custom_list[count]) {
474 player->audio_effect_info.custom_ext_level[count - 1]
475 = custom_ext_effect_level_list[ext_level_index];
476 LOGD("updated custom-ext [%d] = %d", count, player->audio_effect_info.custom_ext_level[count - 1]);
488 mm_player_audio_effect_custom_clear_eq_all(MMHandleType hplayer)
490 int result = MM_ERROR_NONE;
491 mmplayer_t *player = (mmplayer_t *)hplayer;
495 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
497 /* clear EQ custom effect */
498 memset(player->audio_effect_info.custom_eq_level, MM_AUDIO_EFFECT_CUSTOM_LEVEL_INIT, sizeof(int) * MM_AUDIO_EFFECT_EQ_BAND_NUM_MAX);
500 LOGI("All the EQ bands clearing success");
509 mm_player_audio_effect_custom_clear_ext_all(MMHandleType hplayer)
512 int result = MM_ERROR_NONE;
513 mmplayer_t *player = (mmplayer_t *)hplayer;
517 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
519 /* clear ALL custom effects, except EQ */
520 for (i = 0 ; i < MM_AUDIO_EFFECT_CUSTOM_NUM - 1 ; i++)
521 player->audio_effect_info.custom_ext_level[i] = MM_AUDIO_EFFECT_CUSTOM_LEVEL_INIT;
523 LOGI("All the extension effects clearing success");
531 mm_player_is_available_preset_effect(MMHandleType hplayer, mm_audio_effect_preset_type_e effect, bool *available)
533 mmplayer_t *player = (mmplayer_t *)hplayer;
537 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
538 MMPLAYER_RETURN_VAL_IF_FAIL(available, MM_ERROR_INVALID_ARGUMENT);
540 if (__mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_PRESET, effect) == MM_ERROR_NONE)
547 return MM_ERROR_NONE;
551 mm_player_is_available_custom_effect(MMHandleType hplayer, mm_audio_effect_custom_type_e effect, bool *available)
553 mmplayer_t *player = (mmplayer_t *)hplayer;
556 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
557 MMPLAYER_RETURN_VAL_IF_FAIL(available, MM_ERROR_INVALID_ARGUMENT);
559 if (__mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, effect) == MM_ERROR_NONE)
566 return MM_ERROR_NONE;
570 mm_player_audio_effect_custom_apply(MMHandleType hplayer)
572 mmplayer_t *player = (mmplayer_t *)hplayer;
573 int result = MM_ERROR_NONE;
577 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
579 if (!player->ini.use_audio_effect_custom) {
580 LOGE("audio effect(custom) is not supported");
582 return MM_ERROR_NOT_SUPPORT_API;
585 result = _mmplayer_audio_effect_custom_apply(player);
594 mm_player_audio_effect_bypass(MMHandleType hplayer)
596 mmplayer_t *player = (mmplayer_t *)hplayer;
597 int result = MM_ERROR_NONE;
598 GstElement *audio_effect_element = NULL;
602 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
604 if (!player->ini.use_audio_effect_preset && !player->ini.use_audio_effect_custom) {
605 LOGE("audio effect(preset/custom) is not supported");
607 return MM_ERROR_NOT_SUPPORT_API;
609 if (!player->pipeline || !player->pipeline->audiobin || !player->pipeline->audiobin[MMPLAYER_A_FILTER].gst) {
610 LOGW("effect element is not created yet.");
612 audio_effect_element = player->pipeline->audiobin[MMPLAYER_A_FILTER].gst;
614 /* order action to audio effect plugin */
615 g_object_set(audio_effect_element, "filter-action", MM_AUDIO_EFFECT_TYPE_NONE, NULL);
616 LOGD("filter-action = %d", MM_AUDIO_EFFECT_TYPE_NONE);
626 __mmplayer_audio_effect_custom_set_level_ext(mmplayer_t *player, mm_audio_effect_custom_type_e custom_effect_type, int level)
628 int effect_level_max = 0;
629 int effect_level_min = 0;
630 int count = 1; /* start from 1, because of excepting eq index */
631 int ext_level_index = 1; /* start from 1, because of excepting eq index */
632 int result = MM_ERROR_NONE;
636 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
638 /* check if EQ is supported */
639 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, custom_effect_type);
640 if (result != MM_ERROR_NONE) {
645 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
646 if (player->ini.audio_effect_custom_list[count]) {
647 if (count == custom_effect_type) {
648 effect_level_min = player->ini.audio_effect_custom_min_level_list[ext_level_index];
649 effect_level_max = player->ini.audio_effect_custom_max_level_list[ext_level_index];
650 LOGI("level min value(%d), level max value(%d)", effect_level_min, effect_level_max);
654 if (ext_level_index == player->ini.audio_effect_custom_ext_num + 1) {
655 LOGE("could not find min, max value. maybe effect information in ini file is not proper for audio effect plugin");
662 if (level < effect_level_min || level > effect_level_max) {
663 LOGE("out of range, level(%d)", level);
664 result = MM_ERROR_INVALID_ARGUMENT;
666 player->audio_effect_info.custom_ext_level[custom_effect_type - 1] = level;
667 LOGI("set ext[%d] = %d", custom_effect_type-1, level);
676 __mmplayer_audio_effect_custom_set_level_eq(mmplayer_t *player, int index, int level)
678 gint eq_level_max = 0;
679 gint eq_level_min = 0;
680 int result = MM_ERROR_NONE;
684 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
686 /* check if EQ is supported */
687 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ);
688 if (result != MM_ERROR_NONE) {
693 if (index < 0 || index > player->ini.audio_effect_custom_eq_band_num - 1) {
694 LOGE("out of range, index(%d)", index);
695 result = MM_ERROR_INVALID_ARGUMENT;
697 eq_level_min = player->ini.audio_effect_custom_min_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
698 eq_level_max = player->ini.audio_effect_custom_max_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
699 LOGI("EQ level min value(%d), EQ level max value(%d)", eq_level_min, eq_level_max);
701 if (level < eq_level_min || level > eq_level_max) {
702 LOGE("out of range, EQ level(%d)", level);
703 result = MM_ERROR_INVALID_ARGUMENT;
705 player->audio_effect_info.custom_eq_level[index] = level;
706 LOGI("set EQ[%d] = %d", index, level);
716 /* NOTE : parameter eq_index is only used for _set_eq_level() */
718 mm_player_audio_effect_custom_set_level(MMHandleType hplayer, mm_audio_effect_custom_type_e effect_custom_type, int eq_index, int level)
720 mmplayer_t *player = (mmplayer_t *)hplayer;
721 int result = MM_ERROR_NONE;
725 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
727 /* check if this effect type is supported */
728 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, effect_custom_type);
729 if (result != MM_ERROR_NONE) {
734 if (effect_custom_type == MM_AUDIO_EFFECT_CUSTOM_EQ) {
735 result = __mmplayer_audio_effect_custom_set_level_eq(player, eq_index, level);
736 } else if (effect_custom_type > MM_AUDIO_EFFECT_CUSTOM_EQ && effect_custom_type < MM_AUDIO_EFFECT_CUSTOM_NUM) {
737 result = __mmplayer_audio_effect_custom_set_level_ext(player, effect_custom_type, level);
739 LOGE("out of range, effect type(%d)", effect_custom_type);
740 result = MM_ERROR_INVALID_ARGUMENT;
750 mm_player_audio_effect_custom_get_eq_bands_number(MMHandleType hplayer, int *bands)
752 mmplayer_t *player = (mmplayer_t *)hplayer;
753 int result = MM_ERROR_NONE;
757 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
759 /* check if EQ is supported */
760 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ);
761 if (result != MM_ERROR_NONE) {
766 *bands = player->ini.audio_effect_custom_eq_band_num;
767 LOGD("number of custom EQ band = %d", *bands);
776 mm_player_audio_effect_custom_get_eq_bands_width(MMHandleType hplayer, int band_idx, int *width)
778 mmplayer_t *player = (mmplayer_t *)hplayer;
779 int result = MM_ERROR_NONE;
780 unsigned int eq_num = 0;
784 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
786 /* check if EQ is supported */
787 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ);
788 if (result != MM_ERROR_NONE) {
793 eq_num = player->ini.audio_effect_custom_eq_band_num;
794 if (band_idx < 0 || band_idx > eq_num - 1) {
795 LOGE("out of range, invalid band_idx(%d)", band_idx);
796 result = MM_ERROR_INVALID_ARGUMENT;
798 /* set the width of EQ band */
799 *width = player->ini.audio_effect_custom_eq_band_width[band_idx];
800 LOGD("width of band_idx(%d) = %dHz", band_idx, *width);
810 mm_player_audio_effect_custom_get_eq_bands_freq(MMHandleType hplayer, int band_idx, int *freq)
812 mmplayer_t *player = (mmplayer_t *)hplayer;
813 int result = MM_ERROR_NONE;
814 unsigned int eq_num = 0;
818 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
820 /* check if EQ is supported */
821 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ);
822 if (result != MM_ERROR_NONE) {
827 eq_num = player->ini.audio_effect_custom_eq_band_num;
828 if (band_idx < 0 || band_idx > eq_num - 1) {
829 LOGE("out of range, invalid band_idx(%d)", band_idx);
830 result = MM_ERROR_INVALID_ARGUMENT;
832 /* set the frequency of EQ band */
833 *freq = player->ini.audio_effect_custom_eq_band_freq[band_idx];
834 LOGD("frequency of band_idx(%d) = %dHz", band_idx, *freq);
844 mm_player_audio_effect_custom_get_level(MMHandleType hplayer, mm_audio_effect_custom_type_e type, int eq_index, int *level)
846 mmplayer_t *player = (mmplayer_t *)hplayer;
847 int result = MM_ERROR_NONE;
851 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
852 MMPLAYER_RETURN_VAL_IF_FAIL(level, MM_ERROR_PLAYER_NOT_INITIALIZED);
854 /* check if this effect type is supported */
855 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, type);
856 if (result != MM_ERROR_NONE) {
861 if (type == MM_AUDIO_EFFECT_CUSTOM_EQ) {
862 if (eq_index < 0 || eq_index > player->ini.audio_effect_custom_eq_band_num - 1) {
863 LOGE("out of range, EQ index(%d)", eq_index);
864 result = MM_ERROR_INVALID_ARGUMENT;
866 *level = player->audio_effect_info.custom_eq_level[eq_index];
867 LOGD("EQ index = %d, level = %d", eq_index, *level);
869 } else if (type > MM_AUDIO_EFFECT_CUSTOM_EQ && type < MM_AUDIO_EFFECT_CUSTOM_NUM) {
870 *level = player->audio_effect_info.custom_ext_level[type - 1];
871 LOGD("extension effect index = %d, level = %d", type, *level);
873 LOGE("out of range, type(%d)", type);
874 result = MM_ERROR_INVALID_ARGUMENT;
884 mm_player_audio_effect_custom_get_level_range(MMHandleType hplayer, mm_audio_effect_custom_type_e type, int *min, int *max)
886 mmplayer_t *player = (mmplayer_t *)hplayer;
887 int result = MM_ERROR_NONE;
888 int count = 1; /* start from 1, because of excepting eq index */
889 int ext_level_index = 1; /* start from 1, because of excepting eq index */
893 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
894 MMPLAYER_RETURN_VAL_IF_FAIL(min, MM_ERROR_PLAYER_NOT_INITIALIZED);
895 MMPLAYER_RETURN_VAL_IF_FAIL(max, MM_ERROR_PLAYER_NOT_INITIALIZED);
897 /* check if this effect type is supported */
898 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, type);
899 if (result != MM_ERROR_NONE) {
904 if (type == MM_AUDIO_EFFECT_CUSTOM_EQ) {
905 *min = player->ini.audio_effect_custom_min_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
906 *max = player->ini.audio_effect_custom_max_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
907 LOGD("EQ min level = %d, max level = %d", *min, *max);
909 while (count < MM_AUDIO_EFFECT_CUSTOM_NUM) {
910 if (player->ini.audio_effect_custom_list[count]) {
912 *min = player->ini.audio_effect_custom_min_level_list[ext_level_index];
913 *max = player->ini.audio_effect_custom_max_level_list[ext_level_index];
914 LOGI("Extension effect(%d) min level = %d, max level = %d", count, *min, *max);
918 if (ext_level_index == player->ini.audio_effect_custom_ext_num + 1) {
919 LOGE("could not find min, max value. maybe effect information in ini file is not proper for audio effect plugin");
934 mm_player_audio_effect_custom_set_level_eq_from_list(MMHandleType hplayer, int *level_list, int size)
936 mmplayer_t *player = (mmplayer_t *)hplayer;
938 gint eq_level_min = 0;
939 gint eq_level_max = 0;
940 int result = MM_ERROR_NONE;
944 MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
946 /* check if EQ is supported */
947 result = __mmplayer_audio_effect_check_condition(player, MM_AUDIO_EFFECT_TYPE_CUSTOM, MM_AUDIO_EFFECT_CUSTOM_EQ);
948 if (result != MM_ERROR_NONE) {
953 if (size != player->ini.audio_effect_custom_eq_band_num) {
954 LOGE("input size variable(%d) does not match with number of eq band(%d)", size, player->ini.audio_effect_custom_eq_band_num);
955 result = MM_ERROR_INVALID_ARGUMENT;
957 eq_level_min = player->ini.audio_effect_custom_min_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
958 eq_level_max = player->ini.audio_effect_custom_max_level_list[MM_AUDIO_EFFECT_CUSTOM_EQ];
960 for (i = 0 ; i < size ; i++) {
961 if (level_list[i] < eq_level_min || level_list[i] > eq_level_max) {
962 LOGE("out of range, level[%d]=%d", i, level_list[i]);
963 result = MM_ERROR_INVALID_ARGUMENT;
966 player->audio_effect_info.custom_eq_level[i] = level_list[i];