audio_policy.c revision 5161a847dd2108bec49f1ce3fa1d1c3e3cd0c851
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
618cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_phone_state(struct audio_policy *pol, int state)
628cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
638cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
648cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
658cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode,
668cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                               uint32_t mask)
678cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
688cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
698cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
708cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_force_use(struct audio_policy *pol,
718cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                          audio_policy_force_use_t usage,
728cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                          audio_policy_forced_cfg_t config)
738cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
748cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
758cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
768cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    /* retreive current device category forced for a given usage */
778cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_policy_forced_cfg_t ap_get_force_use(
788cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                               const struct audio_policy *pol,
798cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                               audio_policy_force_use_t usage)
808cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
818cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return AUDIO_POLICY_FORCE_NONE;
828cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
838cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
848cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
858cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin * can still be muted. */
868cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_set_can_mute_enforced_audible(struct audio_policy *pol,
878cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                             bool can_mute)
888cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
898cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
908cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
918cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_init_check(const struct audio_policy *pol)
928cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
938cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
948cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
958cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
968cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_io_handle_t ap_get_output(struct audio_policy *pol,
978cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       audio_stream_type_t stream,
988cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       uint32_t sampling_rate,
998cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       uint32_t format,
1008cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       uint32_t channels,
1018cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                       audio_policy_output_flags_t flags)
1028cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1038cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1048cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1058cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1068cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_start_output(struct audio_policy *pol, audio_io_handle_t output,
1078cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                           audio_stream_type_t stream, int session)
1088cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1098cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output,
1138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                          audio_stream_type_t stream, int session)
1148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1168cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1178cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1188cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_release_output(struct audio_policy *pol,
1198cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              audio_io_handle_t output)
1208cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1218cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, int inputSource,
1248cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      uint32_t sampling_rate,
1258cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      uint32_t format,
1268cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      uint32_t channels,
1278cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      audio_in_acoustics_t acoustics)
1288cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1298cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1308cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1318cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1328cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_start_input(struct audio_policy *pol, audio_io_handle_t input)
1338cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1348cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1358cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1368cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1378cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input)
1388cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1398cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1408cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1418cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1428cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_release_input(struct audio_policy *pol, audio_io_handle_t input)
1438cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1448cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1458cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1468cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic void ap_init_stream_volume(struct audio_policy *pol,
1478cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                  audio_stream_type_t stream, int index_min,
1488cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                  int index_max)
1498cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1508cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1518cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1528cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_set_stream_volume_index(struct audio_policy *pol,
1538cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      audio_stream_type_t stream,
1548cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      int index)
1558cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1568cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1578cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1588cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1598cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol,
1608cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      audio_stream_type_t stream,
1618cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                      int *index)
1628cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1638cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1648cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1658cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1668cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
1678cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                           audio_stream_type_t stream)
1688cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1698cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1708cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1718cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1728cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic uint32_t ap_get_devices_for_stream(const struct audio_policy *pol,
1738cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                          audio_stream_type_t stream)
1748cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1758cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1768cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1778cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1788cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
1798cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                            struct effect_descriptor_s *desc)
1808cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1818cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
1828cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1838cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1848cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_register_effect(struct audio_policy *pol,
1858cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              struct effect_descriptor_s *desc,
1868cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              audio_io_handle_t output,
1878cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              uint32_t strategy,
1888cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              int session,
1898cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              int id)
1908cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1918cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1928cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1938cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
1948cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id)
1958cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
1968cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
1978cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
1988cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
19978d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
20078d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent{
20178d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent    return -ENOSYS;
20278d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent}
20378d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent
2045161a847dd2108bec49f1ce3fa1d1c3e3cd0c851Glenn Kastenstatic bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream,
2058cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                                uint32_t in_past_ms)
2068cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2078cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return false;
2088cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2098cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd)
2118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return -ENOSYS;
2138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int create_default_ap(const struct audio_policy_device *device,
2168cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                             struct audio_policy_service_ops *aps_ops,
2178cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                             void *service,
2188cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                             struct audio_policy **ap)
2198cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2208cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct default_ap_device *dev;
2218cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct default_audio_policy *dap;
2228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    int ret;
2238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2248cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *ap = NULL;
2258cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2268cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (!service || !aps_ops)
2278cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -EINVAL;
2288cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2298cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap = (struct default_audio_policy *)calloc(1, sizeof(*dap));
2308cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (!dap)
2318cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -ENOMEM;
2328cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2338cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_device_connection_state = ap_set_device_connection_state;
2348cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_device_connection_state = ap_get_device_connection_state;
2358cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_phone_state = ap_set_phone_state;
2368cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_ringer_mode = ap_set_ringer_mode;
2378cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_force_use = ap_set_force_use;
2388cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_force_use = ap_get_force_use;
2398cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_can_mute_enforced_audible =
2408cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        ap_set_can_mute_enforced_audible;
2418cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.init_check = ap_init_check;
2428cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_output = ap_get_output;
2438cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.start_output = ap_start_output;
2448cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.stop_output = ap_stop_output;
2458cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.release_output = ap_release_output;
2468cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_input = ap_get_input;
2478cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.start_input = ap_start_input;
2488cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.stop_input = ap_stop_input;
2498cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.release_input = ap_release_input;
2508cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.init_stream_volume = ap_init_stream_volume;
2518cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.set_stream_volume_index = ap_set_stream_volume_index;
2528cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_stream_volume_index = ap_get_stream_volume_index;
2538cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
2548cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_devices_for_stream = ap_get_devices_for_stream;
2558cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.get_output_for_effect = ap_get_output_for_effect;
2568cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.register_effect = ap_register_effect;
2578cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.unregister_effect = ap_unregister_effect;
25878d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent    dap->policy.set_effect_enabled = ap_set_effect_enabled;
2598cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.is_stream_active = ap_is_stream_active;
2608cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->policy.dump = ap_dump;
2618cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2628cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->service = service;
2638cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dap->aps_ops = aps_ops;
2648cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2658cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *ap = &dap->policy;
2668cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
2678cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2688cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2698cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int destroy_default_ap(const struct audio_policy_device *ap_dev,
2708cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                              struct audio_policy *ap)
2718cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2728cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    free(ap);
2738cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
2748cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2758cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2768cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int default_ap_dev_close(hw_device_t* device)
2778cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2788cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    free(device);
2798cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
2808cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
2818cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2828cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic int default_ap_dev_open(const hw_module_t* module, const char* name,
2838cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin                               hw_device_t** device)
2848cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin{
2858cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    struct default_ap_device *dev;
2868cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2878cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *device = NULL;
2888cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2898cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
2908cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -EINVAL;
2918cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2928cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev = (struct default_ap_device *)calloc(1, sizeof(*dev));
2938cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    if (!dev)
2948cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        return -ENOMEM;
2958cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
2968cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.tag = HARDWARE_DEVICE_TAG;
2978cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.version = 0;
2988cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.module = (hw_module_t *)module;
2998cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.common.close = default_ap_dev_close;
3008cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.create_audio_policy = create_default_ap;
3018cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    dev->device.destroy_audio_policy = destroy_default_ap;
3028cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3038cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    *device = &dev->device.common;
3048cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3058cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    return 0;
3068cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin}
3078cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3088cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstatic struct hw_module_methods_t default_ap_module_methods = {
3098cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    .open = default_ap_dev_open,
3108cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
3118cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin
3128cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavinstruct default_ap_module HAL_MODULE_INFO_SYM = {
3138cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    .module = {
3148cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        .common = {
3158cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .tag            = HARDWARE_MODULE_TAG,
3168cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .version_major  = 1,
3178cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .version_minor  = 0,
3188cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .id             = AUDIO_POLICY_HARDWARE_MODULE_ID,
3198cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .name           = "Default audio policy HAL",
3208cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .author         = "The Android Open Source Project",
3218cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin            .methods        = &default_ap_module_methods,
3228cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin        },
3238cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin    },
3248cc353abc94a557dcff0f2989f7ca6351fcfdb08Dima Zavin};
325