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_is_device_running_by_id(int device_id, bool *is_running)
331 SM_ARG_CHECK(is_running);
333 LOGI("device_id[%d]", device_id);
335 return _is_device_running_by_id(device_id, is_running);
338 int sound_manager_get_supported_sample_formats_by_id(int device_id, sound_sample_format_e **formats, unsigned int *num_of_elems)
340 SM_ARG_CHECK(formats);
341 SM_ARG_CHECK(num_of_elems);
343 LOGI("device_id[%d]", device_id);
345 return _get_supported_sample_formats(device_id, formats, num_of_elems);
348 int sound_manager_set_sample_format_by_id(int device_id, sound_sample_format_e format)
350 LOGI("device_id[%d] format[%d]", device_id, format);
352 return _set_sample_format(device_id, format);
355 int sound_manager_get_sample_format_by_id(int device_id, sound_sample_format_e *format)
357 SM_ARG_CHECK(format);
359 LOGI("device_id[%d]", device_id);
361 return _get_sample_format(device_id, format);
364 int sound_manager_get_supported_sample_rates_by_id(int device_id, sound_sample_rate_e **rates, unsigned int *num_of_elems)
367 SM_ARG_CHECK(num_of_elems);
369 LOGI("device_id[%d]", device_id);
371 return _get_supported_sample_rates(device_id, rates, num_of_elems);
374 int sound_manager_set_sample_rate_by_id(int device_id, sound_sample_rate_e rate)
376 LOGI("device_id[%d] rate[%d]", device_id, rate);
378 return _set_sample_rate(device_id, rate);
381 int sound_manager_get_sample_rate_by_id(int device_id, sound_sample_rate_e *rate)
385 LOGI("device_id[%d]", device_id);
387 return _get_sample_rate(device_id, rate);
390 int sound_manager_set_avoid_resampling_by_id(int device_id, bool enable)
392 LOGI("device_id[%d] enable[%d]", device_id, enable);
394 return _set_avoid_resampling(device_id, enable);
397 int sound_manager_get_avoid_resampling_by_id(int device_id, bool *enabled)
399 SM_ARG_CHECK(enabled);
401 LOGI("device_id[%d]", device_id);
403 return _get_avoid_resampling(device_id, enabled);
406 int sound_manager_set_media_stream_only_by_id(int device_id, bool enable)
408 LOGI("device_id[%d] enable[%d]", device_id, enable);
410 return _set_media_stream_only(device_id, enable);
413 int sound_manager_get_media_stream_only_by_id(int device_id, bool *enabled)
415 SM_ARG_CHECK(enabled);
417 LOGI("device_id[%d]", device_id);
419 return _get_media_stream_only(device_id, enabled);
422 int sound_manager_create_virtual_stream(sound_stream_info_h stream_info, virtual_sound_stream_h *virtual_stream)
424 int ret = SOUND_MANAGER_ERROR_NONE;
425 virtual_sound_stream_info_s *vstream_h = NULL;
426 sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
428 SM_ARG_CHECK(stream_h);
429 SM_ARG_CHECK(virtual_stream);
431 LOGI("stream_info[%p, type:%s]", stream_info, stream_h->stream_type);
433 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
435 if (stream_h->vstream) {
436 LOGE("virtual stream was already created. vstream(%p)", stream_h->vstream);
437 SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
438 return SOUND_MANAGER_ERROR_INVALID_OPERATION;
441 ret = _create_virtual_stream(stream_h, &vstream_h);
442 if (ret == SOUND_MANAGER_ERROR_NONE) {
443 *virtual_stream = stream_h->vstream = (virtual_sound_stream_h)vstream_h;
444 LOGI("virtual_stream[%p]", *virtual_stream);
447 SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
449 LOGI("ret[0x%x]", ret);
454 int sound_manager_destroy_virtual_stream(virtual_sound_stream_h virtual_stream)
456 int ret = SOUND_MANAGER_ERROR_NONE;
457 pthread_mutex_t *vstream_mutex;
458 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
460 SM_ARG_CHECK(vstream_h);
461 SM_ARG_CHECK(vstream_h->stream_info);
463 LOGI("virtual_stream[%p] stream_type[%s]", virtual_stream, vstream_h->stream_info->stream_type);
465 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
467 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
469 ret = _destroy_virtual_stream(vstream_h);
471 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
473 LOGI("ret[0x%x]", ret);
478 int sound_manager_start_virtual_stream(virtual_sound_stream_h virtual_stream)
480 int ret = SOUND_MANAGER_ERROR_NONE;
481 pthread_mutex_t *vstream_mutex;
482 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
484 SM_ARG_CHECK(vstream_h);
485 SM_ARG_CHECK(vstream_h->stream_info);
487 LOGI("virtual_stream[%p] stream_type[%s]", virtual_stream, vstream_h->stream_info->stream_type);
489 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
491 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
493 ret = _start_virtual_stream(vstream_h);
495 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
497 LOGI("ret[0x%x]", ret);
502 int sound_manager_stop_virtual_stream(virtual_sound_stream_h virtual_stream)
504 int ret = SOUND_MANAGER_ERROR_NONE;
505 pthread_mutex_t *vstream_mutex;
506 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
508 SM_ARG_CHECK(vstream_h);
509 SM_ARG_CHECK(vstream_h->stream_info);
511 LOGI("virtual_stream[%p] stream_type[%s]", virtual_stream, vstream_h->stream_info->stream_type);
513 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
515 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
517 ret = _stop_virtual_stream(vstream_h);
519 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
521 LOGI("ret[0x%x]", ret);
526 int sound_manager_set_virtual_stream_volume(virtual_sound_stream_h virtual_stream, double ratio)
528 int ret = SOUND_MANAGER_ERROR_NONE;
529 pthread_mutex_t *vstream_mutex;
530 virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
532 SM_ARG_CHECK(vstream_h);
533 SM_ARG_CHECK(vstream_h->stream_info);
535 LOGI("virtual_stream[%p] ratio[%lf]", virtual_stream, ratio);
537 vstream_mutex = &vstream_h->stream_info->vstream_mutex;
539 SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
541 ret = _set_virtual_stream_volume(vstream_h, ratio);
543 SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
545 LOGI("ret[0x%x]", ret);
550 static int _convert_filter(sound_filter_e filter, char **filter_str, char **filter_params_str)
552 SM_ARG_CHECK(filter_str);
553 SM_ARG_CHECK(filter_params_str);
556 case SOUND_FILTER_LOW_PASS:
557 *filter_str = "ladspa-sink";
558 *filter_params_str = "plugin=filter label=lpf control=22050";
560 case SOUND_FILTER_HIGH_PASS:
561 *filter_str = "ladspa-sink";
562 *filter_params_str = "plugin=filter label=hpf control=2";
564 case SOUND_FILTER_DELAY:
565 *filter_str = "ladspa-sink";
566 *filter_params_str = "plugin=delay label=delay_5s control=0,0";
569 case SOUND_FILTER_SOUNDALIVE:
570 *filter_str = "ladspa-sink";
571 *filter_params_str = "plugin=audiofilters-sec-ladspa label=audiofiltersec_stereo control=1,0";
574 LOGE("could not find filter[%d]", filter);
575 return SOUND_MANAGER_ERROR_INTERNAL;
578 LOGI("filter[%s] param[%s]", *filter_str, *filter_params_str);
580 return SOUND_MANAGER_ERROR_NONE;
583 static int _convert_filter_preset(sound_filter_preset_e preset, char **control)
585 SM_ARG_CHECK(control);
588 case SOUND_FILTER_PRESET_LOW_PASS_NONE:
591 case SOUND_FILTER_PRESET_LOW_PASS_UNDER_240HZ:
594 case SOUND_FILTER_PRESET_LOW_PASS_UNDER_480HZ:
597 case SOUND_FILTER_PRESET_HIGH_PASS_NONE:
600 case SOUND_FILTER_PRESET_HIGH_PASS_OVER_240HZ:
603 case SOUND_FILTER_PRESET_HIGH_PASS_OVER_480HZ:
606 case SOUND_FILTER_PRESET_DELAY_NONE:
609 case SOUND_FILTER_PRESET_DELAY_1SEC:
612 case SOUND_FILTER_PRESET_DELAY_2SEC:
616 case SOUND_FILTER_PRESET_SOUNDALIVE_NORMAL:
619 case SOUND_FILTER_PRESET_SOUNDALIVE_TUBE:
622 case SOUND_FILTER_PRESET_SOUNDALIVE_VIRT71:
625 case SOUND_FILTER_PRESET_SOUNDALIVE_STUDIO:
628 case SOUND_FILTER_PRESET_SOUNDALIVE_CLUB:
631 case SOUND_FILTER_PRESET_SOUNDALIVE_CONCERT_HALL:
636 LOGE("could not find the preset[%d]", preset);
637 return SOUND_MANAGER_ERROR_INTERNAL;
639 LOGI("preset[%s]", *control);
641 return SOUND_MANAGER_ERROR_NONE;
644 static int _check_valid_filter_preset(sound_filter_e filter, sound_filter_preset_e preset)
647 case SOUND_FILTER_LOW_PASS:
648 if (preset > SOUND_FILTER_PRESET_LOW_PASS_UNDER_480HZ) {
649 LOGE("invalid preset(%d) for low pass filter", preset);
650 goto ERROR_INVALID_ARGS;
653 case SOUND_FILTER_HIGH_PASS:
654 if (preset < SOUND_FILTER_PRESET_HIGH_PASS_NONE || preset > SOUND_FILTER_PRESET_HIGH_PASS_OVER_480HZ) {
655 LOGE("invalid preset(%d) for high pass filter", preset);
656 goto ERROR_INVALID_ARGS;
659 case SOUND_FILTER_DELAY:
660 if (preset < SOUND_FILTER_PRESET_DELAY_NONE || preset > SOUND_FILTER_PRESET_DELAY_2SEC) {
661 LOGE("invalid preset(%d) for delay filter", preset);
662 goto ERROR_INVALID_ARGS;
666 case SOUND_FILTER_SOUNDALIVE:
667 if (preset < SOUND_FILTER_PRESET_SOUNDALIVE_NORMAL || preset > SOUND_FILTER_PRESET_SOUNDALIVE_CONCERT_HALL) {
668 LOGE("invalid preset(%d) for soundAlive filter", preset);
669 goto ERROR_INVALID_ARGS;
674 LOGE("invalid filter(%d)", filter);
675 return SOUND_MANAGER_ERROR_INVALID_PARAMETER;
678 return SOUND_MANAGER_ERROR_NONE;
681 LOGE("invalid preset(%d) for filter(%d)", preset, filter);
682 return SOUND_MANAGER_ERROR_INVALID_PARAMETER;
685 int sound_manager_set_filter(sound_stream_type_e stream_type, sound_filter_e filter)
687 int ret = SOUND_MANAGER_ERROR_NONE;
688 char *stream_type_str = NULL;
689 char *filter_str = NULL;
690 char *filter_params_str = NULL;
692 LOGI("stream_type[%d] filter[%d]", stream_type, filter);
694 if (stream_type != SOUND_STREAM_TYPE_MEDIA) {
695 LOGE("Not supported stream type(%d)", stream_type);
696 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
699 if ((ret = _convert_stream_type(stream_type, &stream_type_str)) != SOUND_MANAGER_ERROR_NONE)
701 if ((ret = _convert_filter(filter, &filter_str, &filter_params_str)) != SOUND_MANAGER_ERROR_NONE)
704 return _convert_sound_manager_error_code(__func__, mm_sound_set_filter(stream_type_str, filter_str, filter_params_str, stream_type_str));
707 int sound_manager_unset_filter(sound_stream_type_e stream_type)
709 int ret = SOUND_MANAGER_ERROR_NONE;
710 char *stream_type_str = NULL;
712 LOGI("stream_type[%d]", stream_type);
714 if ((ret = _convert_stream_type(stream_type, &stream_type_str)) != SOUND_MANAGER_ERROR_NONE)
717 return _convert_sound_manager_error_code(__func__, mm_sound_unset_filter(stream_type_str));
720 int sound_manager_set_filter_preset(sound_stream_type_e stream_type, sound_filter_e filter, sound_filter_preset_e preset)
722 int ret = SOUND_MANAGER_ERROR_NONE;
723 char *stream_type_str = NULL;
724 char *filter_str = NULL;
725 char *filter_params_str = NULL;
726 char *control_str = NULL;
728 if (stream_type != SOUND_STREAM_TYPE_MEDIA) {
729 LOGE("Not supported stream type(%d)", stream_type);
730 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
733 LOGI("stream_type[%d] filter[%d] preset[%d]", stream_type, filter, preset);
735 if ((ret = _check_valid_filter_preset(filter, preset)) != SOUND_MANAGER_ERROR_NONE)
737 if ((ret = _convert_stream_type(stream_type, &stream_type_str)) != SOUND_MANAGER_ERROR_NONE)
739 if ((ret = _convert_filter(filter, &filter_str, &filter_params_str)) != SOUND_MANAGER_ERROR_NONE)
741 if ((ret = _convert_filter_preset(preset, &control_str)) != SOUND_MANAGER_ERROR_NONE)
744 return _convert_sound_manager_error_code(__func__, mm_sound_control_filter(stream_type_str, filter_str, control_str));
747 int sound_manager_get_device_vendor_id(sound_device_h device, int *vendor_id)
749 int ret = MM_ERROR_NONE;
750 mm_sound_device_type_e type;
752 SM_ARG_CHECK(device);
753 SM_ARG_CHECK(vendor_id);
755 LOGI("device[%p]", device);
757 if ((ret = mm_sound_get_device_type(device, &type)) != MM_ERROR_NONE)
758 return _convert_sound_manager_error_code(__func__, ret);
760 if (type != MM_SOUND_DEVICE_TYPE_USB_AUDIO) {
761 LOGE("device type is not USB audio device, device_type[%d]", type);
762 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
765 ret = mm_sound_get_device_vendor_id(device, vendor_id);
767 LOGI("vendor_id[%d]", *vendor_id);
769 return _convert_sound_manager_error_code(__func__, ret);
772 int sound_manager_get_device_product_id(sound_device_h device, int *product_id)
774 int ret = MM_ERROR_NONE;
775 mm_sound_device_type_e type;
777 SM_ARG_CHECK(device);
778 SM_ARG_CHECK(product_id);
780 LOGI("device[%p]", device);
782 if ((ret = mm_sound_get_device_type(device, &type)) != MM_ERROR_NONE)
783 return _convert_sound_manager_error_code(__func__, ret);
785 if (type != MM_SOUND_DEVICE_TYPE_USB_AUDIO) {
786 LOGE("device type is not USB audio device, device_type[%d]", type);
787 return SOUND_MANAGER_ERROR_NOT_SUPPORTED;
790 ret = mm_sound_get_device_product_id(device, product_id);
792 LOGI("product_id[%d]", *product_id);
794 return _convert_sound_manager_error_code(__func__, ret);
797 int sound_manager_get_device_sample_format(sound_device_h device, sound_sample_format_e *format)
799 int ret = MM_ERROR_NONE;
802 SM_ARG_CHECK(device);
803 SM_ARG_CHECK(format);
805 LOGI("device[%p]", device);
807 if ((ret = mm_sound_get_device_sample_format(device, &_format)) != MM_ERROR_NONE)
808 return _convert_sound_manager_error_code(__func__, ret);
810 ret = _convert_sample_format_str_to_enum(pa_sample_format_to_string(_format), format);
812 LOGI("sample_format [%d]", *format);
814 return _convert_sound_manager_error_code(__func__, ret);
817 int sound_manager_get_device_sample_rate(sound_device_h device, sound_sample_rate_e *samplerate)
819 int ret = MM_ERROR_NONE;
822 SM_ARG_CHECK(device);
823 SM_ARG_CHECK(samplerate);
825 LOGI("device[%p]", device);
827 if ((ret = mm_sound_get_device_sample_rate(device, &_samplerate)) != MM_ERROR_NONE)
828 return _convert_sound_manager_error_code(__func__, ret);
830 ret = _convert_sample_rate_to_enum(_samplerate, samplerate);
832 LOGI("sample_rate [%d]", *samplerate);
834 return _convert_sound_manager_error_code(__func__, ret);
837 int sound_manager_get_device_channels(sound_device_h device, int *channels)
839 int ret = MM_ERROR_NONE;
841 SM_ARG_CHECK(device);
842 SM_ARG_CHECK(channels);
844 LOGI("device[%p]", device);
846 ret = mm_sound_get_device_channels(device, channels);
848 LOGI("channels [%d]", *channels);
850 return _convert_sound_manager_error_code(__func__, ret);
853 int sound_manager_is_stream_on_device_by_id(sound_stream_info_h stream_info, int device_id, bool *is_on)
855 int ret = MM_ERROR_NONE;
856 sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
858 SM_ARG_CHECK(stream_h);
861 LOGI("stream_info[%p, type:%s] device_id[%d]", stream_info, stream_h->stream_type, device_id);
863 ret = mm_sound_is_stream_on_device_by_id(stream_h->pa_info.index, device_id, is_on);
865 LOGI("is_on[%d]", *is_on);
867 return _convert_sound_manager_error_code(__func__, ret);
870 int sound_manager_set_acm_master_mode(bool enable)
872 LOGI("enable[%d]", enable);
874 return _set_acm_master_mode(enable);
877 int sound_manager_get_latest_stream_pid(int stream_type, unsigned int *pid)
879 SM_ARG_CHECK(stream_type >= 0);
882 LOGI("stream_type[0x%x]", stream_type);
884 return _get_latest_stream_pid(stream_type, pid);
887 int sound_manager_set_stream_preemptive_device(sound_stream_type_e stream_type, sound_device_io_direction_e io_direction, int device_id)
889 LOGI("stream_type[%d] io_direction[%d] device_id[%d]", stream_type, io_direction, device_id);
891 return _set_preemptive_device(stream_type, io_direction, device_id);
894 int sound_manager_get_stream_preemptive_device(sound_stream_type_e stream_type, int *in_device_id, int *out_device_id)
896 SM_ARG_CHECK(in_device_id || out_device_id);
898 LOGI("stream_type[%d]", stream_type);
900 return _get_preemptive_device(stream_type, in_device_id, out_device_id);
903 int sound_manager_start_discover_remote_device(void)
905 return _discover_remote_device(true);
908 int sound_manager_stop_discover_remote_device(void)
910 return _discover_remote_device(false);
913 int sound_manager_publish_local_device(sound_manager_remote_client_connected_cb callback, void *user_data)
915 SM_ARG_CHECK(callback);
917 return _publish_local_device(callback, user_data);
920 int sound_manager_unpublish_local_device(void)
922 return _unpublish_local_device();
925 int sound_manager_set_remote_permission(int id, bool allowed)
927 return _set_remote_permission(id, allowed);
930 int sound_manager_set_rpi_playback_route(sound_rpi_playback_route_type type)
932 return _set_rpi_playback_route(type);
935 int sound_manager_get_rpi_playback_route(sound_rpi_playback_route_type *type)
937 return _get_rpi_playback_route(type);
940 int sound_manager_set_host_volume(sound_type_e type, int volume)
942 int ret = SOUND_MANAGER_ERROR_NONE;
943 const char *volume_type = NULL;
945 SM_ARG_CHECK(type < SOUND_TYPE_NUM);
947 LOGI("type[%d] volume[%d]", type, volume);
949 ret = _convert_sound_type(type, &volume_type);
950 if (ret != SOUND_MANAGER_ERROR_NONE)
953 ret = _set_host_volume_level(DIRECTION_OUT_STR, volume_type, (unsigned int)volume);
955 return _convert_sound_manager_error_code(__func__, ret);
958 int sound_manager_get_host_volume(sound_type_e type, int *volume)
960 int ret = SOUND_MANAGER_ERROR_NONE;
961 const char *volume_type = NULL;
962 unsigned int volume_level = 0;
964 SM_ARG_CHECK(volume);
966 LOGI("type[%d]", type);
968 ret = _convert_sound_type(type, &volume_type);
969 if (ret != SOUND_MANAGER_ERROR_NONE)
972 ret = _get_host_volume_level(DIRECTION_OUT_STR, volume_type, &volume_level);
973 if (ret == SOUND_MANAGER_ERROR_NONE) {
974 *volume = (int)volume_level;
975 LOGI("host volume[%d]", *volume);
978 return _convert_sound_manager_error_code(__func__, ret);
981 int sound_manager_get_current_media_playback_device_id(int *device_id)
983 sound_device_type_e unused;
984 SM_ARG_CHECK(device_id);
986 return _get_current_media_routing_path("out", device_id, &unused);