18cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin/*
28cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * Copyright (C) 2011 The Android Open Source Project
38cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin *
48cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License");
58cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * you may not use this file except in compliance with the License.
68cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * You may obtain a copy of the License at
78cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin *
88cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin *      http://www.apache.org/licenses/LICENSE-2.0
98cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin *
108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * Unless required by applicable law or agreed to in writing, software
118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS,
128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * See the License for the specific language governing permissions and
148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * limitations under the License.
158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin */
168cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
178cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin#define LOG_TAG "audio_policy_default"
188cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin//#define LOG_NDEBUG 0
198cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
208cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin#include <errno.h>
218cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin#include <stdint.h>
228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin#include <stdlib.h>
238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin#include <string.h>
248cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
258cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin#include <hardware/hardware.h>
26aa21172bcd4c332eec78d34ffdafd8cc0178ea95Dima Zavin#include <system/audio.h>
271199865d0cb68750e2b959cb3ed04e1bc0f1c9d1Dima Zavin#include <system/audio_policy.h>
283bc15860a9d8eea076dc19128373631bf1e162caDima Zavin#include <hardware/audio_policy.h>
298cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
308cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstruct default_ap_module {
318cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct audio_policy_module module;
328cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
338cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
348cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstruct default_ap_device {
358cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct audio_policy_device device;
368cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
378cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
388cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstruct default_audio_policy {
398cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct audio_policy policy;
408cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
418cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct audio_policy_service_ops *aps_ops;
428cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    void *service;
438cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
448cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
458cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_set_device_connection_state(struct audio_policy *pol,
468cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                          audio_devices_t device,
478cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                          audio_policy_dev_state_t state,
488cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                          const char *device_address)
498cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
508cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
518cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
528cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
538cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_policy_dev_state_t ap_get_device_connection_state(
548cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                            const struct audio_policy *pol,
558cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                            audio_devices_t device,
568cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                            const char *device_address)
578cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
588cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
598cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
608cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
616df641e269639dbb81bb1c19f47d3b9e5e3ff7d7Glenn Kastenstatic void ap_set_phone_state(struct audio_policy *pol, audio_mode_t state)
628cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
638cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
648cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
65080a80212b6ec954fe8a424d9fb286c5cf1d5021Glenn Kasten// deprecated, never called
668cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode,
678cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                               uint32_t mask)
688cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
698cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
708cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
718cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_force_use(struct audio_policy *pol,
728cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                          audio_policy_force_use_t usage,
738cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                          audio_policy_forced_cfg_t config)
748cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
758cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
768cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
778cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    /* retreive current device category forced for a given usage */
788cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_policy_forced_cfg_t ap_get_force_use(
798cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                               const struct audio_policy *pol,
808cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                               audio_policy_force_use_t usage)
818cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
828cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return AUDIO_POLICY_FORCE_NONE;
838cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
848cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
858cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
868cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * can still be muted. */
878cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_can_mute_enforced_audible(struct audio_policy *pol,
888cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                             bool can_mute)
898cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
908cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
918cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
928cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_init_check(const struct audio_policy *pol)
938cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
948cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
958cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
968cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
978cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_io_handle_t ap_get_output(struct audio_policy *pol,
988cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       audio_stream_type_t stream,
998cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       uint32_t sampling_rate,
100fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten                                       audio_format_t format,
101a635449697a2df5de98e72cfc24e926b641d5544Glenn Kasten                                       audio_channel_mask_t channelMask,
102da4b0b26d170971448fdb04817b308900b5a6dd8Eric Laurent                                       audio_output_flags_t flags)
1038cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1048cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1058cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1068cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1078cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_start_output(struct audio_policy *pol, audio_io_handle_t output,
1088cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                           audio_stream_type_t stream, int session)
1098cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output,
1148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                          audio_stream_type_t stream, int session)
1158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1168cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1178cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1188cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1198cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_release_output(struct audio_policy *pol,
1208cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              audio_io_handle_t output)
1218cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
124ae2e42b2447d011bd6cf9d5b4413dd3557de0035Glenn Kastenstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource,
1258cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      uint32_t sampling_rate,
126fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten                                      audio_format_t format,
127a635449697a2df5de98e72cfc24e926b641d5544Glenn Kasten                                      audio_channel_mask_t channelMask,
1288cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      audio_in_acoustics_t acoustics)
1298cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1308cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1318cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1328cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1338cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_start_input(struct audio_policy *pol, audio_io_handle_t input)
1348cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1358cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1368cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1378cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1388cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input)
1398cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1408cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1418cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1428cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1438cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_release_input(struct audio_policy *pol, audio_io_handle_t input)
1448cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1458cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1468cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1478cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_init_stream_volume(struct audio_policy *pol,
1488cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                  audio_stream_type_t stream, int index_min,
1498cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                  int index_max)
1508cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1518cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1528cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1538cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_set_stream_volume_index(struct audio_policy *pol,
1548cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      audio_stream_type_t stream,
1558cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      int index)
1568cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1578cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1588cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1598cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1608cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol,
1618cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      audio_stream_type_t stream,
1628cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      int *index)
1638cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1648cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1658cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1668cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
167ca20b17b419eec2b196877be38f9c4290449aeacEric Laurentstatic int ap_set_stream_volume_index_for_device(struct audio_policy *pol,
168ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                      audio_stream_type_t stream,
169ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                      int index,
170ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                      audio_devices_t device)
171ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent{
172ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    return -ENOSYS;
173ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent}
174ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent
175ca20b17b419eec2b196877be38f9c4290449aeacEric Laurentstatic int ap_get_stream_volume_index_for_device(const struct audio_policy *pol,
176ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                      audio_stream_type_t stream,
177ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                      int *index,
178ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                      audio_devices_t device)
179ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent{
180ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    return -ENOSYS;
181ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent}
182ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent
1838cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
1848cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                           audio_stream_type_t stream)
1858cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1868cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1878cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1888cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
18983c62ce4e319a11d14a27c6368811f9efc1e8c5aEric Laurentstatic audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol,
1908cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                          audio_stream_type_t stream)
1918cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1928cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1938cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1948cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1958cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
19648915acb392773c1fcb86e2711eab468410a0baaGlenn Kasten                                            const struct effect_descriptor_s *desc)
1978cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1988cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1998cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2008cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2018cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_register_effect(struct audio_policy *pol,
20248915acb392773c1fcb86e2711eab468410a0baaGlenn Kasten                              const struct effect_descriptor_s *desc,
2038cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              audio_io_handle_t output,
2048cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              uint32_t strategy,
2058cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              int session,
2068cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              int id)
2078cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2088cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
2098cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id)
2128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
2148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
21678d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
21778d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent{
21878d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent    return -ENOSYS;
21978d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent}
22078d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent
2215161a847dd2108bec49f1ce3fa1d1c3e3cd0c851Glenn Kastenstatic bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream,
2228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                uint32_t in_past_ms)
2238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2248cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return false;
2258cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2268cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2278cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd)
2288cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2298cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
2308cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2318cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2328cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int create_default_ap(const struct audio_policy_device *device,
2338cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                             struct audio_policy_service_ops *aps_ops,
2348cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                             void *service,
2358cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                             struct audio_policy **ap)
2368cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2378cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct default_ap_device *dev;
2388cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct default_audio_policy *dap;
2398cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    int ret;
2408cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2418cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *ap = NULL;
2428cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2438cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (!service || !aps_ops)
2448cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -EINVAL;
2458cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2468cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap = (struct default_audio_policy *)calloc(1, sizeof(*dap));
2478cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (!dap)
2488cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -ENOMEM;
2498cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2508cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_device_connection_state = ap_set_device_connection_state;
2518cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_device_connection_state = ap_get_device_connection_state;
2528cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_phone_state = ap_set_phone_state;
2538cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_ringer_mode = ap_set_ringer_mode;
2548cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_force_use = ap_set_force_use;
2558cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_force_use = ap_get_force_use;
2568cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_can_mute_enforced_audible =
2578cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        ap_set_can_mute_enforced_audible;
2588cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.init_check = ap_init_check;
2598cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_output = ap_get_output;
2608cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.start_output = ap_start_output;
2618cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.stop_output = ap_stop_output;
2628cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.release_output = ap_release_output;
2638cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_input = ap_get_input;
2648cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.start_input = ap_start_input;
2658cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.stop_input = ap_stop_input;
2668cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.release_input = ap_release_input;
2678cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.init_stream_volume = ap_init_stream_volume;
2688cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_stream_volume_index = ap_set_stream_volume_index;
2698cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_stream_volume_index = ap_get_stream_volume_index;
270ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    dap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device;
271ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    dap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device;
2728cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
2738cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_devices_for_stream = ap_get_devices_for_stream;
2748cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_output_for_effect = ap_get_output_for_effect;
2758cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.register_effect = ap_register_effect;
2768cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.unregister_effect = ap_unregister_effect;
27778d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent    dap->policy.set_effect_enabled = ap_set_effect_enabled;
2788cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.is_stream_active = ap_is_stream_active;
2798cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.dump = ap_dump;
2808cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2818cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->service = service;
2828cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->aps_ops = aps_ops;
2838cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2848cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *ap = &dap->policy;
2858cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
2868cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2878cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2888cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int destroy_default_ap(const struct audio_policy_device *ap_dev,
2898cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              struct audio_policy *ap)
2908cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2918cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    free(ap);
2928cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
2938cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2948cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2958cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int default_ap_dev_close(hw_device_t* device)
2968cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2978cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    free(device);
2988cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
2998cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
3008cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3018cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int default_ap_dev_open(const hw_module_t* module, const char* name,
3028cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                               hw_device_t** device)
3038cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
3048cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct default_ap_device *dev;
3058cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3068cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *device = NULL;
3078cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3088cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
3098cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -EINVAL;
3108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev = (struct default_ap_device *)calloc(1, sizeof(*dev));
3128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (!dev)
3138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -ENOMEM;
3148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.tag = HARDWARE_DEVICE_TAG;
3168cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.version = 0;
3178cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.module = (hw_module_t *)module;
3188cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.close = default_ap_dev_close;
3198cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.create_audio_policy = create_default_ap;
3208cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.destroy_audio_policy = destroy_default_ap;
3218cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *device = &dev->device.common;
3238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3248cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
3258cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
3268cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3278cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic struct hw_module_methods_t default_ap_module_methods = {
3288cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    .open = default_ap_dev_open,
3298cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
3308cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3318cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstruct default_ap_module HAL_MODULE_INFO_SYM = {
3328cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    .module = {
3338cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        .common = {
3348cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .tag            = HARDWARE_MODULE_TAG,
3358cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .version_major  = 1,
3368cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .version_minor  = 0,
3378cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .id             = AUDIO_POLICY_HARDWARE_MODULE_ID,
3388cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .name           = "Default audio policy HAL",
3398cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .author         = "The Android Open Source Project",
3408cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .methods        = &default_ap_module_methods,
3418cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        },
3428cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    },
3438cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
344