2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <sound_manager.h>
18 #include <sound_manager_private.h>
19 #include <sound_manager_internal.h>
22 #ifndef TIZEN_FEATURE_TV_PROD
23 int sound_manager_get_max_master_volume(int *max_level)
25 int ret = SOUND_MANAGER_ERROR_NONE;
26 unsigned int volume_level = 0;
28 SM_ARG_CHECK(max_level);
30 ret = _get_volume_max_level(DIRECTION_OUT_STR, SOUND_TYPE_MASTER_STR, &volume_level);
31 if (ret == SOUND_MANAGER_ERROR_NONE) {
32 *max_level = (int)volume_level;
33 LOGI("max_level[%d]", *max_level);
39 int sound_manager_set_master_volume(int level)
41 int ret = SOUND_MANAGER_ERROR_NONE;
43 LOGI("level[%d]", level);
45 ret = _set_volume_level(DIRECTION_OUT_STR, SOUND_TYPE_MASTER_STR, (unsigned int)level);
47 LOGI("ret[0x%x]", ret);
52 int sound_manager_get_master_volume(int *level)
54 int ret = SOUND_MANAGER_ERROR_NONE;
55 unsigned int volume_level = 0;
59 ret = _get_volume_level(DIRECTION_OUT_STR, SOUND_TYPE_MASTER_STR, &volume_level);
60 if (ret == SOUND_MANAGER_ERROR_NONE) {
61 *level = (int)volume_level;
62 LOGI("level[%d]", *level);
65 LOGI("ret[0x%x]", ret);
71 int sound_manager_set_mute(sound_type_e type, bool mute)
73 int ret = MM_ERROR_NONE;
75 SM_ARG_CHECK(type < SOUND_TYPE_NUM);
77 LOGI("type[%d] mute[%d]", type, mute);
79 ret = mm_sound_set_mute(type, mute);
81 return _convert_sound_manager_error_code(__func__, ret);
84 int sound_manager_get_mute(sound_type_e type, bool *muted)
86 int ret = MM_ERROR_NONE;
88 SM_ARG_CHECK(type < SOUND_TYPE_NUM);
91 LOGI("type[%d]", type);
93 ret = mm_sound_get_mute(type, muted);
95 LOGI("muted[%d]", *muted);
97 return _convert_sound_manager_error_code(__func__, ret);
100 int sound_manager_get_max_volume_internal(sound_type_internal_e type, int *max)
102 const char *volume_type = NULL;
103 unsigned int max_level = 0;
104 int ret = SOUND_MANAGER_ERROR_NONE;
107 SM_ARG_CHECK(type < SOUND_TYPE_INTERNAL_NUM);
109 LOGI("type[%d]", type);
111 ret = _convert_sound_type_for_internal(type, &volume_type);
112 if (ret == SOUND_MANAGER_ERROR_NONE) {
113 ret = _get_volume_max_level(DIRECTION_OUT_STR, volume_type, &max_level);
114 if (ret == SOUND_MANAGER_ERROR_NONE) {
115 *max = (int)max_level -1; /* actual volume step can be max step - 1 */
116 LOGI("volume_type[%s] max_level[%d]", volume_type, *max);
120 LOGI("ret[0x%x]", ret);
125 int sound_manager_set_volume_internal(sound_type_internal_e type, int level)
127 int ret = MM_ERROR_NONE;
129 SM_ARG_CHECK(type < SOUND_TYPE_INTERNAL_NUM);
130 SM_ARG_CHECK(level >= 0);
132 LOGI("type[%d] level[%d]", type, level);
134 ret = mm_sound_volume_set_value_internal(type, level);
136 return _convert_sound_manager_error_code(__func__, ret);
139 int sound_manager_get_volume_internal(sound_type_internal_e type, int *level)
141 int ret = MM_ERROR_NONE;
142 unsigned int uvolume;
144 SM_ARG_CHECK(type < SOUND_TYPE_INTERNAL_NUM);
147 LOGI("type[%d]", type);
149 ret = mm_sound_volume_get_value_internal(type, &uvolume);
150 if (ret == MM_ERROR_NONE) {
152 LOGI("level[%d]", *level);
155 return _convert_sound_manager_error_code(__func__, ret);
158 int sound_manager_get_current_sound_type_internal(sound_type_internal_e *type)
160 int ret = SOUND_MANAGER_ERROR_NONE;
161 char *volume_type = NULL;
165 /* get the volume type of the current playing stream */
166 ret = _get_current_volume_type(DIRECTION_OUT_STR, &volume_type);
167 if (ret == SOUND_MANAGER_ERROR_NONE) {
168 ret = _convert_sound_type_to_enum_for_internal((const char*)volume_type, type);
169 if (ret == SOUND_MANAGER_ERROR_NONE)
170 LOGI("volume_type[%s] type[%d]", volume_type, *type);
173 LOGI("ret[0x%x]", ret);
178 int sound_manager_add_volume_changed_cb_internal(sound_manager_volume_changed_cb_internal callback, void *user_data, int *id)
180 int ret = MM_ERROR_NONE;
182 SM_ARG_CHECK(callback);
185 LOGI("callback[%p] user_data[%p]", callback, user_data);
187 ret = mm_sound_add_volume_changed_callback_internal((mm_sound_volume_changed_cb_internal)callback, user_data, (unsigned int*)id);
191 return _convert_sound_manager_error_code(__func__, ret);
194 int sound_manager_remove_volume_changed_cb_internal(int id)
196 int ret = MM_ERROR_NONE;
198 SM_ARG_CHECK(id >= 0);
202 ret = mm_sound_remove_volume_changed_callback_internal(id);
204 return _convert_sound_manager_error_code(__func__, ret);
207 int sound_manager_create_stream_information_internal(sound_stream_type_internal_e stream_type, sound_stream_focus_state_changed_cb callback, void *user_data, sound_stream_info_h *stream_info)
209 int ret = SOUND_MANAGER_ERROR_NONE;
211 SM_ARG_CHECK(stream_info);
213 LOGI("stream_type[%d] callback[%p] user_data[%p]", stream_type, callback, user_data);
215 sound_stream_info_s *stream_h = malloc(sizeof(sound_stream_info_s));
217 ret = SOUND_MANAGER_ERROR_INTERNAL;
221 memset(stream_h, 0, sizeof(sound_stream_info_s));
222 ret = _convert_stream_type_for_internal(stream_type, &stream_h->stream_type);
223 if (ret == SOUND_MANAGER_ERROR_NONE) {
224 _set_focus_availability(stream_h);
225 ret = _make_pa_connection_and_register_focus(stream_h, callback, user_data);
226 if (ret == SOUND_MANAGER_ERROR_NONE) {
227 *stream_info = (sound_stream_info_h)stream_h;
228 LOGI("stream_info[%p, type:%s] pa_index[%u] focus_id[%d]",
229 stream_info, stream_h->stream_type, stream_h->pa_info.index, stream_h->focus_id);
235 SM_SAFE_FREE(stream_h);
237 LOGI("ret[0x%x]", ret);
242 int sound_manager_set_stream_routing_option(sound_stream_info_h stream_info, const char *name, int value)
244 sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
246 SM_ARG_CHECK(stream_h);
249 LOGI("stream_info[%p] name[%s] value[%d]", stream_info, name, value);
251 return _set_route_option(stream_h->pa_info.index, name, value);
254 int sound_manager_is_available_stream_information(sound_stream_info_h stream_info, native_api_e api_name, bool *is_available)
257 const char *name = NULL;
258 sound_stream_info_s* stream_h = (sound_stream_info_s*)stream_info;
260 SM_ARG_CHECK(stream_h);
261 SM_ARG_CHECK(is_available);
263 *is_available = false;
265 name = _convert_api_name(api_name);
266 for (i = 0; i < AVAIL_FRAMEWORKS_MAX; i++) {
267 if (stream_h->stream_conf_info.avail_frameworks[i] && !strncmp(stream_h->stream_conf_info.avail_frameworks[i], name, strlen(name))) {
268 *is_available = true;
272 LOGI("stream_type[%s] native api[%s] is_available[%d]", stream_h->stream_type, name, *is_available);
274 return SOUND_MANAGER_ERROR_NONE;
277 int sound_manager_get_type_from_stream_information(sound_stream_info_h stream_info, char **type)
279 sound_stream_info_s* stream_h = (sound_stream_info_s*)stream_info;
281 SM_ARG_CHECK(stream_h);
284 *type = stream_h->stream_type;
285 LOGI("stream_type[%s]", *type);
287 return SOUND_MANAGER_ERROR_NONE;
289 int sound_manager_get_index_from_stream_information(sound_stream_info_h stream_info, int *index)
291 sound_stream_info_s* stream_h = (sound_stream_info_s*)stream_info;
293 SM_ARG_CHECK(stream_h);
296 *index = stream_h->pa_info.index;
297 LOGI("stream_index[%u]", stream_h->pa_info.index);
299 return SOUND_MANAGER_ERROR_NONE;
302 int sound_manager_add_device_id_for_stream_routing(sound_stream_info_h stream_info, int device_id)
304 SM_ARG_CHECK(stream_info);
306 LOGI("stream_info[%p] device_id[%d]", stream_info, device_id);
308 return _add_device_id_for_stream_routing((sound_stream_info_s*)stream_info, device_id);
311 int sound_manager_remove_device_id_for_stream_routing(sound_stream_info_h stream_info, int device_id)
313 SM_ARG_CHECK(stream_info);
315 LOGI("stream_info[%p] device_id[%d]", stream_info, device_id);
317 return _remove_device_id_for_stream_routing((sound_stream_info_s*)stream_info, device_id);
320 int sound_manager_set_stream_preferred_device_id(sound_stream_info_h stream_info, sound_device_io_direction_e io_direction, int device_id)
322 SM_ARG_CHECK(stream_info);
324 LOGI("stream_info[%p] io_direction[%d] device_id[%d]", stream_info, io_direction, device_id);
326 return _set_preferred_device_id((sound_stream_info_s*)stream_info, io_direction, device_id);
329 int sound_manager_get_device_state_by_id(int device_id, sound_device_state_e *state)
331 int ret = MM_ERROR_NONE;
332 MMSoundDevice_t device = NULL;
336 LOGI("device_id[%d]", device_id);
338 if ((ret = mm_sound_get_device_by_id(device_id, &device)) != MM_ERROR_NONE) {
339 LOGE("failed to mm_sound_get_device_by_id()");
343 ret = mm_sound_get_device_state(device, (mm_sound_device_state_e*)state);
345 LOGI("state[%d]", *state);
347 mm_sound_free_device(device);
349 return _convert_sound_manager_error_code(__func__, ret);
352 int sound_manager_is_device_running_by_id(int device_id, bool *is_running)
354 SM_ARG_CHECK(is_running);
356 LOGI("device_id[%d]", device_id);
358 return _is_device_running_by_id(device_id, is_running);
361 int sound_manager_get_supported_sample_formats_by_id(int device_id, sound_sample_format_e **formats, unsigned int *num_of_elems)
363 SM_ARG_CHECK(formats);
364 SM_ARG_CHECK(num_of_elems);
366 LOGI("device_id[%d]", device_id);
368 return _get_supported_sample_formats(device_id, formats, num_of_elems);
371 int sound_manager_set_sample_format_by_id(int device_id, sound_sample_format_e format)
373 LOGI("device_id[%d] format[%d]", device_id, format);
375 return _set_sample_format(device_id, format);
378 int sound_manager_get_sample_format_by_id(int device_id, sound_sample_format_e *format)
380 SM_ARG_CHECK(format);
382 LOGI("device_id[%d]", device_id);
384 return _get_sample_format(device_id, format);
387 int sound_manager_get_supported_sample_rates_by_id(int device_id, sound_sample_rate_e **rates, unsigned int *num_of_elems)
390 SM_ARG_CHECK(num_of_elems);
392 LOGI("device_id[%d]", device_id);
394 return _get_supported_sample_rates(device_id, rates, num_of_elems);
397 int sound_manager_set_sample_rate_by_id(int device_id, sound_sample_rate_e rate)
399 LOGI("device_id[%d] rate[%d]", device_id, rate);
401 return _set_sample_rate(device_id, rate);
404 int sound_manager_get_sample_rate_by_id(int device_id, sound_sample_rate_e *rate)
408 LOGI("device_id[%d]", device_id);
410 return _get_sample_rate(device_id, rate);
413 int sound_manager_set_avoid_resampling_by_id(int device_id, bool enable)
415 LOGI("device_id[%d] enable[%d]", device_id, enable);
417 return _set_avoid_resampling(device_id, enable);
420 int sound_manager_get_avoid_resampling_by_id(int device_id, bool *enabled)
422 SM_ARG_CHECK(enabled);
424 LOGI("device_id[%d]", device_id);
426 return _get_avoid_resampling(device_id, enabled);
429 int sound_manager_set_media_stream_only_by_id(int device_id, bool enable)
431 LOGI("device_id[%d] enable[%d]", device_id, enable);
433 return _set_media_stream_only(device_id, enable);
436 int sound_manager_get_media_stream_only_by_id(int device_id, bool *enabled)
438 SM_ARG_CHECK(enabled);
440 LOGI("device_id[%d]", device_id);
442 return _get_media_stream_only(device_id, enabled);
445 int sound_manager_create_virtual_stream(sound_stream_info_h stream_info, virtual_sound_stream_h *virtual_stream)
447 int ret = SOUND_MANAGER_ERROR_NONE;
448 virtual_sound_stream_info_s *vstream_h = NULL;
449 sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
451 SM_ARG_CHECK(stream_h);
452 SM_ARG_CHECK(virtual_stream);
454 LOGI("stream_info[%p, type:%s]", stream_info, stream_h->stream_type);
456 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
458 if (stream_h->vstream) {
459 LOGE("virtual stream was already created. vstream(%p)", stream_h->vstream);
460 SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
461 return SOUND_MANAGER_ERROR_INVALID_OPERATION;
464 ret = _create_virtual_stream(stream_h, &vstream_h);
465 if (ret == SOUND_MANAGER_ERROR_NONE) {
466 *virtual_stream = stream_h->vstream = (virtual_sound_stream_h)vstream_h;
467 LOGI("virtual_stream[%p]", *virtual_stream);
470 SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
472 LOGI("ret[0x%x]", ret);
477 int sound_manager_destroy_virtual_stream(virtual_sound_stream_h virtual_stream)
479 int ret = SOUND_MANAGER_ERROR_NONE;
480 pthread_mutex_t *vstream_mutex;
481 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
483 SM_ARG_CHECK(vstream_h);
484 SM_ARG_CHECK(vstream_h->stream_info);
486 LOGI("virtual_stream[%p] stream_type[%s]", virtual_stream, vstream_h->stream_info->stream_type);
488 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
490 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
492 ret = _destroy_virtual_stream(vstream_h);
494 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
496 LOGI("ret[0x%x]", ret);
501 int sound_manager_start_virtual_stream(virtual_sound_stream_h virtual_stream)
503 int ret = SOUND_MANAGER_ERROR_NONE;
504 pthread_mutex_t *vstream_mutex;
505 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
507 SM_ARG_CHECK(vstream_h);
508 SM_ARG_CHECK(vstream_h->stream_info);
510 LOGI("virtual_stream[%p] stream_type[%s]", virtual_stream, vstream_h->stream_info->stream_type);
512 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
514 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
516 ret = _start_virtual_stream(vstream_h);
518 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
520 LOGI("ret[0x%x]", ret);
525 int sound_manager_stop_virtual_stream(virtual_sound_stream_h virtual_stream)
527 int ret = SOUND_MANAGER_ERROR_NONE;
528 pthread_mutex_t *vstream_mutex;
529 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
531 SM_ARG_CHECK(vstream_h);
532 SM_ARG_CHECK(vstream_h->stream_info);
534 LOGI("virtual_stream[%p] stream_type[%s]", virtual_stream, vstream_h->stream_info->stream_type);
536 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
538 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
540 ret = _stop_virtual_stream(vstream_h);
542 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
544 LOGI("ret[0x%x]", ret);
549 int sound_manager_set_virtual_stream_volume(virtual_sound_stream_h virtual_stream, double ratio)
551 int ret = SOUND_MANAGER_ERROR_NONE;
552 pthread_mutex_t *vstream_mutex;
553 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
555 SM_ARG_CHECK(vstream_h);
556 SM_ARG_CHECK(vstream_h->stream_info);
558 LOGI("virtual_stream[%p] ratio[%lf]", virtual_stream, ratio);
560 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
562 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
564 ret = _set_virtual_stream_volume(vstream_h, ratio);
566 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
568 LOGI("ret[0x%x]", ret);
573 static int _convert_filter(sound_filter_e filter, char **filter_str, char **filter_params_str)
575 SM_ARG_CHECK(filter_str);
576 SM_ARG_CHECK(filter_params_str);
579 case SOUND_FILTER_LOW_PASS:
580 *filter_str = "ladspa-sink";
581 *filter_params_str = "plugin=filter label=lpf control=22050";
583 case SOUND_FILTER_HIGH_PASS:
584 *filter_str = "ladspa-sink";
585 *filter_params_str = "plugin=filter label=hpf control=2";
587 case SOUND_FILTER_DELAY:
588 *filter_str = "ladspa-sink";
589 *filter_params_str = "plugin=delay label=delay_5s control=0,0";
592 case SOUND_FILTER_SOUNDALIVE:
593 *filter_str = "ladspa-sink";
594 *filter_params_str = "plugin=audiofilters-sec-ladspa label=audiofiltersec_stereo control=1,0";
597 LOGE("could not find filter[%d]", filter);
598 return SOUND_MANAGER_ERROR_INTERNAL;
601 LOGI("filter[%s] param[%s]", *filter_str, *filter_params_str);
603 return SOUND_MANAGER_ERROR_NONE;
606 static int _convert_filter_preset(sound_filter_preset_e preset, char **control)
608 SM_ARG_CHECK(control);
611 case SOUND_FILTER_PRESET_LOW_PASS_NONE:
614 case SOUND_FILTER_PRESET_LOW_PASS_UNDER_240HZ:
617 case SOUND_FILTER_PRESET_LOW_PASS_UNDER_480HZ:
620 case SOUND_FILTER_PRESET_HIGH_PASS_NONE:
623 case SOUND_FILTER_PRESET_HIGH_PASS_OVER_240HZ:
626 case SOUND_FILTER_PRESET_HIGH_PASS_OVER_480HZ:
629 case SOUND_FILTER_PRESET_DELAY_NONE:
632 case SOUND_FILTER_PRESET_DELAY_1SEC:
635 case SOUND_FILTER_PRESET_DELAY_2SEC:
639 case SOUND_FILTER_PRESET_SOUNDALIVE_NORMAL:
642 case SOUND_FILTER_PRESET_SOUNDALIVE_TUBE:
645 case SOUND_FILTER_PRESET_SOUNDALIVE_VIRT71:
648 case SOUND_FILTER_PRESET_SOUNDALIVE_STUDIO:
651 case SOUND_FILTER_PRESET_SOUNDALIVE_CLUB:
654 case SOUND_FILTER_PRESET_SOUNDALIVE_CONCERT_HALL:
659 LOGE("could not find the preset[%d]", preset);
660 return SOUND_MANAGER_ERROR_INTERNAL;
662 LOGI("preset[%s]", *control);
664 return SOUND_MANAGER_ERROR_NONE;
667 static int _check_valid_filter_preset(sound_filter_e filter, sound_filter_preset_e preset)
670 case SOUND_FILTER_LOW_PASS:
671 if (preset > SOUND_FILTER_PRESET_LOW_PASS_UNDER_480HZ) {
672 LOGE("invalid preset(%d) for low pass filter", preset);
673 goto ERROR_INVALID_ARGS;
676 case SOUND_FILTER_HIGH_PASS:
677 if (preset < SOUND_FILTER_PRESET_HIGH_PASS_NONE || preset > SOUND_FILTER_PRESET_HIGH_PASS_OVER_480HZ) {
678 LOGE("invalid preset(%d) for high pass filter", preset);
679 goto ERROR_INVALID_ARGS;
682 case SOUND_FILTER_DELAY:
683 if (preset < SOUND_FILTER_PRESET_DELAY_NONE || preset > SOUND_FILTER_PRESET_DELAY_2SEC) {
684 LOGE("invalid preset(%d) for delay filter", preset);
685 goto ERROR_INVALID_ARGS;
689 case SOUND_FILTER_SOUNDALIVE:
690 if (preset < SOUND_FILTER_PRESET_SOUNDALIVE_NORMAL || preset > SOUND_FILTER_PRESET_SOUNDALIVE_CONCERT_HALL) {
691 LOGE("invalid preset(%d) for soundAlive filter", preset);
692 goto ERROR_INVALID_ARGS;
697 LOGE("invalid filter(%d)", filter);
698 return SOUND_MANAGER_ERROR_INVALID_PARAMETER;
701 return SOUND_MANAGER_ERROR_NONE;
704 LOGE("invalid preset(%d) for filter(%d)", preset, filter);
705 return SOUND_MANAGER_ERROR_INVALID_PARAMETER;
708 int sound_manager_set_filter(sound_stream_type_e stream_type, sound_filter_e filter)
710 int ret = SOUND_MANAGER_ERROR_NONE;
711 char *stream_type_str = NULL;
712 char *filter_str = NULL;
713 char *filter_params_str = NULL;
715 LOGI("stream_type[%d] filter[%d]", stream_type, filter);
717 if (stream_type != SOUND_STREAM_TYPE_MEDIA) {
718 LOGE("Not supported stream type(%d)", stream_type);
719 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
722 if ((ret = _convert_stream_type(stream_type, &stream_type_str)) != SOUND_MANAGER_ERROR_NONE)
724 if ((ret = _convert_filter(filter, &filter_str, &filter_params_str)) != SOUND_MANAGER_ERROR_NONE)
727 return _convert_sound_manager_error_code(__func__, mm_sound_set_filter(stream_type_str, filter_str, filter_params_str, stream_type_str));
730 int sound_manager_unset_filter(sound_stream_type_e stream_type)
732 int ret = SOUND_MANAGER_ERROR_NONE;
733 char *stream_type_str = NULL;
735 LOGI("stream_type[%d]", stream_type);
737 if ((ret = _convert_stream_type(stream_type, &stream_type_str)) != SOUND_MANAGER_ERROR_NONE)
740 return _convert_sound_manager_error_code(__func__, mm_sound_unset_filter(stream_type_str));
743 int sound_manager_set_filter_preset(sound_stream_type_e stream_type, sound_filter_e filter, sound_filter_preset_e preset)
745 int ret = SOUND_MANAGER_ERROR_NONE;
746 char *stream_type_str = NULL;
747 char *filter_str = NULL;
748 char *filter_params_str = NULL;
749 char *control_str = NULL;
751 if (stream_type != SOUND_STREAM_TYPE_MEDIA) {
752 LOGE("Not supported stream type(%d)", stream_type);
753 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
756 LOGI("stream_type[%d] filter[%d] preset[%d]", stream_type, filter, preset);
758 if ((ret = _check_valid_filter_preset(filter, preset)) != SOUND_MANAGER_ERROR_NONE)
760 if ((ret = _convert_stream_type(stream_type, &stream_type_str)) != SOUND_MANAGER_ERROR_NONE)
762 if ((ret = _convert_filter(filter, &filter_str, &filter_params_str)) != SOUND_MANAGER_ERROR_NONE)
764 if ((ret = _convert_filter_preset(preset, &control_str)) != SOUND_MANAGER_ERROR_NONE)
767 return _convert_sound_manager_error_code(__func__, mm_sound_control_filter(stream_type_str, filter_str, control_str));
770 int sound_manager_get_device_vendor_id(sound_device_h device, int *vendor_id)
772 int ret = MM_ERROR_NONE;
773 mm_sound_device_type_e type;
775 SM_ARG_CHECK(device);
776 SM_ARG_CHECK(vendor_id);
778 LOGI("device[%p]", device);
780 if ((ret = mm_sound_get_device_type(device, &type)) != MM_ERROR_NONE)
781 return _convert_sound_manager_error_code(__func__, ret);
783 if (type != MM_SOUND_DEVICE_TYPE_USB_AUDIO) {
784 LOGE("device type is not USB audio device, device_type[%d]", type);
785 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
788 ret = mm_sound_get_device_vendor_id(device, vendor_id);
790 LOGI("vendor_id[%d]", *vendor_id);
792 return _convert_sound_manager_error_code(__func__, ret);
795 int sound_manager_get_device_product_id(sound_device_h device, int *product_id)
797 int ret = MM_ERROR_NONE;
798 mm_sound_device_type_e type;
800 SM_ARG_CHECK(device);
801 SM_ARG_CHECK(product_id);
803 LOGI("device[%p]", device);
805 if ((ret = mm_sound_get_device_type(device, &type)) != MM_ERROR_NONE)
806 return _convert_sound_manager_error_code(__func__, ret);
808 if (type != MM_SOUND_DEVICE_TYPE_USB_AUDIO) {
809 LOGE("device type is not USB audio device, device_type[%d]", type);
810 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
813 ret = mm_sound_get_device_product_id(device, product_id);
815 LOGI("product_id[%d]", *product_id);
817 return _convert_sound_manager_error_code(__func__, ret);
820 int sound_manager_is_stream_on_device_by_id(sound_stream_info_h stream_info, int device_id, bool *is_on)
822 int ret = MM_ERROR_NONE;
823 sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
825 SM_ARG_CHECK(stream_h);
828 LOGI("stream_info[%p, type:%s] device_id[%d]", stream_info, stream_h->stream_type, device_id);
830 ret = mm_sound_is_stream_on_device_by_id(stream_h->pa_info.index, device_id, is_on);
832 LOGI("is_on[%d]", *is_on);
834 return _convert_sound_manager_error_code(__func__, ret);
837 int sound_manager_set_acm_master_mode(bool enable)
839 LOGI("enable[%d]", enable);
841 return _set_acm_master_mode(enable);
844 int sound_manager_get_latest_stream_pid(int stream_type, unsigned int *pid)
846 SM_ARG_CHECK(stream_type >= 0);
849 LOGI("stream_type[0x%x]", stream_type);
851 return _get_latest_stream_pid(stream_type, pid);
854 int sound_manager_set_stream_preemptive_device(sound_stream_type_e stream_type, sound_device_io_direction_e io_direction, int device_id)
856 LOGI("stream_type[%d] io_direction[%d] device_id[%d]", stream_type, io_direction, device_id);
858 return _set_preemptive_device(stream_type, io_direction, device_id);
861 int sound_manager_get_stream_preemptive_device(sound_stream_type_e stream_type, int *in_device_id, int *out_device_id)
863 SM_ARG_CHECK(in_device_id || out_device_id);
865 LOGI("stream_type[%d]", stream_type);
867 return _get_preemptive_device(stream_type, in_device_id, out_device_id);
870 int sound_manager_start_discover_remote_device(void)
872 return _discover_remote_device(true);
875 int sound_manager_stop_discover_remote_device(void)
877 return _discover_remote_device(false);
880 int sound_manager_publish_local_device(sound_manager_remote_client_connected_cb callback, void *user_data)
882 SM_ARG_CHECK(callback);
884 return _publish_local_device(callback, user_data);
887 int sound_manager_unpublish_local_device(void)
889 return _unpublish_local_device();
892 int sound_manager_set_remote_permission(int id, bool allowed)
894 return _set_remote_permission(id, allowed);
897 int sound_manager_set_echo_cancel_reference_device(sound_stream_info_h stream_info, sound_device_h device)
899 return _set_echo_cancel_reference_device((sound_stream_info_s*)stream_info, device);
902 int sound_manager_get_echo_cancel_reference_device(sound_stream_info_h stream_info, int *device_id)
904 return _get_echo_cancel_reference_device((sound_stream_info_s*)stream_info, device_id);
907 int sound_manager_set_rpi_playback_route(sound_rpi_playback_route_type type)
909 return _set_rpi_playback_route(type);
912 int sound_manager_get_rpi_playback_route(sound_rpi_playback_route_type *type)
914 return _get_rpi_playback_route(type);
917 int sound_manager_set_host_volume(sound_type_e type, int volume)
919 int ret = SOUND_MANAGER_ERROR_NONE;
920 const char *volume_type = NULL;
922 SM_ARG_CHECK(type < SOUND_TYPE_NUM);
924 LOGI("type[%d] volume[%d]", type, volume);
926 ret = _convert_sound_type(type, &volume_type);
927 if (ret != SOUND_MANAGER_ERROR_NONE)
930 ret = _set_host_volume_level(DIRECTION_OUT_STR, volume_type, (unsigned int)volume);
932 return _convert_sound_manager_error_code(__func__, ret);
935 int sound_manager_get_host_volume(sound_type_e type, int *volume)
937 int ret = SOUND_MANAGER_ERROR_NONE;
938 const char *volume_type = NULL;
939 unsigned int volume_level = 0;
941 SM_ARG_CHECK(volume);
943 LOGI("type[%d]", type);
945 ret = _convert_sound_type(type, &volume_type);
946 if (ret != SOUND_MANAGER_ERROR_NONE)
949 ret = _get_host_volume_level(DIRECTION_OUT_STR, volume_type, &volume_level);
950 if (ret == SOUND_MANAGER_ERROR_NONE) {
951 *volume = (int)volume_level;
952 LOGI("host volume[%d]", *volume);
955 return _convert_sound_manager_error_code(__func__, ret);