1e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin/*
2e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * Copyright (C) 2011 The Android Open Source Project
3e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *
4e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License");
5e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * you may not use this file except in compliance with the License.
6e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * You may obtain a copy of the License at
7e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *
8e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *      http://www.apache.org/licenses/LICENSE-2.0
9e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *
10e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * Unless required by applicable law or agreed to in writing, software
11e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS,
12e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * See the License for the specific language governing permissions and
14e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * limitations under the License.
15e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin */
16e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
17e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#define LOG_TAG "legacy_audio_policy_hal"
18e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin//#define LOG_NDEBUG 0
19e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
20e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <stdint.h>
21e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
22e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware/hardware.h>
234a0748be283a8c9efa02243c3e1716c49443a87cDima Zavin#include <system/audio.h>
24d17f66f33276e64e8e288f6ff2b1cb8169650c81Dima Zavin#include <system/audio_policy.h>
25e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware/audio_policy.h>
26e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
27e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware_legacy/AudioPolicyInterface.h>
28e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include <hardware_legacy/AudioSystemLegacy.h>
29e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
30e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin#include "AudioPolicyCompatClient.h"
31e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
32e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinnamespace android_audio_legacy {
33e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
34e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinextern "C" {
35e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
36e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module {
37e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct audio_policy_module module;
38e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
39e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
40e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_device {
41e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct audio_policy_device device;
42e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
43e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
44e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_audio_policy {
45e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct audio_policy policy;
46e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
47e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    void *service;
48e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct audio_policy_service_ops *aps_ops;
49e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    AudioPolicyCompatClient *service_client;
50e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    AudioPolicyInterface *apm;
51e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
52e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
53e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic inline struct legacy_audio_policy * to_lap(struct audio_policy *pol)
54e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
55e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return reinterpret_cast<struct legacy_audio_policy *>(pol);
56e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
57e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
58e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic inline const struct legacy_audio_policy * to_clap(const struct audio_policy *pol)
59e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
60e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return reinterpret_cast<const struct legacy_audio_policy *>(pol);
61e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
62e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
63e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
64e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_set_device_connection_state(struct audio_policy *pol,
65e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                          audio_devices_t device,
66e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                          audio_policy_dev_state_t state,
67e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                          const char *device_address)
68e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
69e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
70e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->setDeviceConnectionState(
71e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                    (AudioSystem::audio_devices)device,
72e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                    (AudioSystem::device_connection_state)state,
73e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                    device_address);
74e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
75e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
76e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_policy_dev_state_t ap_get_device_connection_state(
77e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                            const struct audio_policy *pol,
78e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                            audio_devices_t device,
79e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                            const char *device_address)
80e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
81e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
82e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return (audio_policy_dev_state_t)lap->apm->getDeviceConnectionState(
83e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                    (AudioSystem::audio_devices)device,
84e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                    device_address);
85e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
86e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
875c1ebdc9db8d7e5ff51704f80c55f460638eb095Glenn Kastenstatic void ap_set_phone_state(struct audio_policy *pol, audio_mode_t state)
88e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
89e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
905c1ebdc9db8d7e5ff51704f80c55f460638eb095Glenn Kasten    // as this is the legacy API, don't change it to use audio_mode_t instead of int
915c1ebdc9db8d7e5ff51704f80c55f460638eb095Glenn Kasten    lap->apm->setPhoneState((int) state);
92e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
93e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
94e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    /* indicate a change in ringer mode */
95e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode,
96e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                               uint32_t mask)
97e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
98ca0657a1ca087a6d474a75fcfedd6aac3901d587Glenn Kasten    // deprecated, never called
99e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
100e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
101e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    /* force using a specific device category for the specified usage */
102e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_force_use(struct audio_policy *pol,
103e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                          audio_policy_force_use_t usage,
104e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                          audio_policy_forced_cfg_t config)
105e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
106e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
107e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->setForceUse((AudioSystem::force_use)usage,
108e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                          (AudioSystem::forced_config)config);
109e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
110e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
111e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    /* retreive current device category forced for a given usage */
112e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_policy_forced_cfg_t ap_get_force_use(
113e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                               const struct audio_policy *pol,
114e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                               audio_policy_force_use_t usage)
115e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
116e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
117e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return (audio_policy_forced_cfg_t)lap->apm->getForceUse(
118e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                          (AudioSystem::force_use)usage);
119e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
120e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
121e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin/* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
122e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * can still be muted. */
123e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_can_mute_enforced_audible(struct audio_policy *pol,
124e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                             bool can_mute)
125e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
126e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
127e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->setSystemProperty("ro.camera.sound.forced", can_mute ? "0" : "1");
128e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
129e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
130e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_init_check(const struct audio_policy *pol)
131e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
132e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
133e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->initCheck();
134e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
135e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
136e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output(struct audio_policy *pol,
137e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       audio_stream_type_t stream,
138e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       uint32_t sampling_rate,
13953e2cfab45b411db0bf6c4b5d146cd9d8b1b1425Glenn Kasten                                       audio_format_t format,
140551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten                                       audio_channel_mask_t channelMask,
141b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald                                       audio_output_flags_t flags,
142b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald                                       const audio_offload_info_t *offloadInfo)
143e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
144e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
145e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
1466a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("%s: tid %d", __func__, gettid());
147e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getOutput((AudioSystem::stream_type)stream,
148551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten                               sampling_rate, (int) format, channelMask,
149b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald                               (AudioSystem::output_flags)flags,
150b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald                               offloadInfo);
151e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
152e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
153e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_output(struct audio_policy *pol, audio_io_handle_t output,
154e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                           audio_stream_type_t stream, int session)
155e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
156e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
157e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->startOutput(output, (AudioSystem::stream_type)stream,
158e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                 session);
159e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
160e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
161e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output,
162e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                          audio_stream_type_t stream, int session)
163e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
164e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
165e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->stopOutput(output, (AudioSystem::stream_type)stream,
166e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                session);
167e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
168e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
169e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_output(struct audio_policy *pol,
170e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              audio_io_handle_t output)
171e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
172e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
173e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->releaseOutput(output);
174e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
175e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
176f3b5a0736ef9545f82f3d4ceea3359776d6f0c92Glenn Kastenstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource,
177e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      uint32_t sampling_rate,
17853e2cfab45b411db0bf6c4b5d146cd9d8b1b1425Glenn Kasten                                      audio_format_t format,
179551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten                                      audio_channel_mask_t channelMask,
180e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_in_acoustics_t acoustics)
181e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
182e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
183551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten    return lap->apm->getInput((int) inputSource, sampling_rate, (int) format, channelMask,
184e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              (AudioSystem::audio_in_acoustics)acoustics);
185e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
186e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
187e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_input(struct audio_policy *pol, audio_io_handle_t input)
188e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
189e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
190e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->startInput(input);
191e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
192e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
193e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input)
194e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
195e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
196e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->stopInput(input);
197e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
198e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
199e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_input(struct audio_policy *pol, audio_io_handle_t input)
200e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
201e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
202e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->releaseInput(input);
203e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
204e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
205e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_init_stream_volume(struct audio_policy *pol,
206e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                  audio_stream_type_t stream, int index_min,
207e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                  int index_max)
208e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
209e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
210e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->initStreamVolume((AudioSystem::stream_type)stream, index_min,
211e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                               index_max);
212e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
213e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
214e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_set_stream_volume_index(struct audio_policy *pol,
215e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_stream_type_t stream,
216e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      int index)
217e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
218e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
219e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream,
220c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
221c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          AUDIO_DEVICE_OUT_DEFAULT);
222e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
223e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
224e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol,
225e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_stream_type_t stream,
226e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      int *index)
227e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
228e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
229e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream,
230c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
231c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          AUDIO_DEVICE_OUT_DEFAULT);
232c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent}
233c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent
234c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_set_stream_volume_index_for_device(struct audio_policy *pol,
235c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_stream_type_t stream,
236c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      int index,
237c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_devices_t device)
238c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{
239c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    struct legacy_audio_policy *lap = to_lap(pol);
240c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream,
241c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
242c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          device);
243c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent}
244c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent
245c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_get_stream_volume_index_for_device(const struct audio_policy *pol,
246c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_stream_type_t stream,
247c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      int *index,
248c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_devices_t device)
249c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{
250c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    const struct legacy_audio_policy *lap = to_clap(pol);
251c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream,
252c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
253c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          device);
254e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
255e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
256e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
257e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                           audio_stream_type_t stream)
258e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
259e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
260e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getStrategyForStream((AudioSystem::stream_type)stream);
261e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
262e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
263f9a4e2eccfbbe451512337af0806cfc54be0eaf9Eric Laurentstatic audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol,
264e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       audio_stream_type_t stream)
265e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
266e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
267e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getDevicesForStream((AudioSystem::stream_type)stream);
268e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
269e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
270e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
271c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten                                            const struct effect_descriptor_s *desc)
272e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
273e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
274e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getOutputForEffect(desc);
275e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
276e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
277e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_register_effect(struct audio_policy *pol,
278c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten                              const struct effect_descriptor_s *desc,
2791c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent                              audio_io_handle_t io,
280e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              uint32_t strategy,
281e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              int session,
282e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              int id)
283e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
284e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
2851c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent    return lap->apm->registerEffect(desc, io, strategy, session, id);
286e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
287e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
288e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id)
289e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
290e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
291e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->unregisterEffect(id);
292e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
293e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
294582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
295582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent{
296582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    struct legacy_audio_policy *lap = to_lap(pol);
297582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    return lap->apm->setEffectEnabled(id, enabled);
298582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent}
299582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent
300d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kastenstatic bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream,
301e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                uint32_t in_past_ms)
302e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
303e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
304d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kasten    return lap->apm->isStreamActive((int) stream, in_past_ms);
305e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
306e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
307dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivistatic bool ap_is_stream_active_remotely(const struct audio_policy *pol, audio_stream_type_t stream,
308dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi                                uint32_t in_past_ms)
309dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi{
310dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi    const struct legacy_audio_policy *lap = to_clap(pol);
311dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi    return lap->apm->isStreamActiveRemotely((int) stream, in_past_ms);
312dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi}
313dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi
314abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivistatic bool ap_is_source_active(const struct audio_policy *pol, audio_source_t source)
315abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi{
316abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi    const struct legacy_audio_policy *lap = to_clap(pol);
317abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi    return lap->apm->isSourceActive(source);
318abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi}
319abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi
320e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd)
321e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
322e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
323e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->dump(fd);
324e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
325e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
326b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgeraldstatic bool ap_is_offload_supported(const struct audio_policy *pol,
327b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald                                    const audio_offload_info_t *info)
328b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald{
329b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald    const struct legacy_audio_policy *lap = to_clap(pol);
330b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald    return lap->apm->isOffloadSupported(*info);
331b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald}
332b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald
333e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int create_legacy_ap(const struct audio_policy_device *device,
334e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            struct audio_policy_service_ops *aps_ops,
335e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            void *service,
336e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            struct audio_policy **ap)
337e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
338e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap;
339e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    int ret;
340e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
341e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!service || !aps_ops)
342e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -EINVAL;
343e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
344e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap));
345e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap)
346e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -ENOMEM;
347e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
348e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_device_connection_state = ap_set_device_connection_state;
349e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_device_connection_state = ap_get_device_connection_state;
350e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_phone_state = ap_set_phone_state;
351e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_ringer_mode = ap_set_ringer_mode;
352e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_force_use = ap_set_force_use;
353e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_force_use = ap_get_force_use;
354e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_can_mute_enforced_audible =
355e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ap_set_can_mute_enforced_audible;
356e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.init_check = ap_init_check;
357e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_output = ap_get_output;
358e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.start_output = ap_start_output;
359e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.stop_output = ap_stop_output;
360e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.release_output = ap_release_output;
361e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_input = ap_get_input;
362e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.start_input = ap_start_input;
363e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.stop_input = ap_stop_input;
364e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.release_input = ap_release_input;
365e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.init_stream_volume = ap_init_stream_volume;
366e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_stream_volume_index = ap_set_stream_volume_index;
367e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_stream_volume_index = ap_get_stream_volume_index;
368c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    lap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device;
369c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    lap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device;
370e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
371e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_devices_for_stream = ap_get_devices_for_stream;
372e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_output_for_effect = ap_get_output_for_effect;
373e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.register_effect = ap_register_effect;
374e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.unregister_effect = ap_unregister_effect;
375582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    lap->policy.set_effect_enabled = ap_set_effect_enabled;
376e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.is_stream_active = ap_is_stream_active;
377dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi    lap->policy.is_stream_active_remotely = ap_is_stream_active_remotely;
378abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi    lap->policy.is_source_active = ap_is_source_active;
379e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.dump = ap_dump;
380b4d07b97d23cfaffe22c7859ad7c45e168a7df0eRichard Fitzgerald    lap->policy.is_offload_supported = ap_is_offload_supported;
381e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
382e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->service = service;
383e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->aps_ops = aps_ops;
384e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->service_client =
385e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        new AudioPolicyCompatClient(aps_ops, service);
386e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap->service_client) {
387e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ret = -ENOMEM;
388e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        goto err_new_compat_client;
389e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    }
390e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
391e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm = createAudioPolicyManager(lap->service_client);
392e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap->apm) {
393e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ret = -ENOMEM;
394e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        goto err_create_apm;
395e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    }
396e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
397e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *ap = &lap->policy;
398e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
399e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
400e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_create_apm:
401e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    delete lap->service_client;
402e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_new_compat_client:
403e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    free(lap);
404e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *ap = NULL;
405e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return ret;
406e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
407e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
408e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int destroy_legacy_ap(const struct audio_policy_device *ap_dev,
409e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                             struct audio_policy *ap)
410e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
411e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(ap);
412e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
413e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap)
414e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return 0;
415e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
416e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (lap->apm)
417e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        destroyAudioPolicyManager(lap->apm);
418e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (lap->service_client)
419e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        delete lap->service_client;
420e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    free(lap);
421e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
422e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
423e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
424e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_close(hw_device_t* device)
425e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
426e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (device)
427e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        free(device);
428e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
429e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
430e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
431e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_open(const hw_module_t* module, const char* name,
432e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                    hw_device_t** device)
433e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
434e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_ap_device *dev;
435e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
436e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
437e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -EINVAL;
438e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
439e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev = (struct legacy_ap_device *)calloc(1, sizeof(*dev));
440e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!dev)
441e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -ENOMEM;
442e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
443e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.tag = HARDWARE_DEVICE_TAG;
444e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.version = 0;
445e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.module = const_cast<hw_module_t*>(module);
446e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.close = legacy_ap_dev_close;
447e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.create_audio_policy = create_legacy_ap;
448e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.destroy_audio_policy = destroy_legacy_ap;
449e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
450e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *device = &dev->device.common;
451e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
452e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
453e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
454e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
455e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic struct hw_module_methods_t legacy_ap_module_methods = {
456e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        open: legacy_ap_dev_open
457e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
458e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
459e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module HAL_MODULE_INFO_SYM = {
460e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    module: {
461e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        common: {
462e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            tag: HARDWARE_MODULE_TAG,
463e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            version_major: 1,
464e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            version_minor: 0,
465e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            id: AUDIO_POLICY_HARDWARE_MODULE_ID,
466e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            name: "LEGACY Audio Policy HAL",
467e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            author: "The Android Open Source Project",
468e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            methods: &legacy_ap_module_methods,
469e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            dso : NULL,
470e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            reserved : {0},
471e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        },
472e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    },
473e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
474e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
475e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // extern "C"
476e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
477e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // namespace android_audio_legacy
478