audio_policy_hal.cpp revision dc3bf1a37425697277f6ed04fc8cfe4a52fd678a
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,
1410977cf534ffb71c2abac622716510ae8ea25f3e9Eric Laurent                                       audio_output_flags_t flags)
142e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
143e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
144e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
1456a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("%s: tid %d", __func__, gettid());
146e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getOutput((AudioSystem::stream_type)stream,
147551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten                               sampling_rate, (int) format, channelMask,
148e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                               (AudioSystem::output_flags)flags);
149e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
150e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
151e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_output(struct audio_policy *pol, audio_io_handle_t output,
152e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                           audio_stream_type_t stream, int session)
153e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
154e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
155e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->startOutput(output, (AudioSystem::stream_type)stream,
156e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                 session);
157e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
158e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
159e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_output(struct audio_policy *pol, audio_io_handle_t output,
160e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                          audio_stream_type_t stream, int session)
161e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
162e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
163e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->stopOutput(output, (AudioSystem::stream_type)stream,
164e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                session);
165e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
166e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
167e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_output(struct audio_policy *pol,
168e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              audio_io_handle_t output)
169e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
170e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
171e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->releaseOutput(output);
172e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
173e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
174f3b5a0736ef9545f82f3d4ceea3359776d6f0c92Glenn Kastenstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t inputSource,
175e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      uint32_t sampling_rate,
17653e2cfab45b411db0bf6c4b5d146cd9d8b1b1425Glenn Kasten                                      audio_format_t format,
177551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten                                      audio_channel_mask_t channelMask,
178e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_in_acoustics_t acoustics)
179e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
180e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
181551b6a3b5cbf314b4021da64fada0c9119b2535fGlenn Kasten    return lap->apm->getInput((int) inputSource, sampling_rate, (int) format, channelMask,
182e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              (AudioSystem::audio_in_acoustics)acoustics);
183e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
184e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
185e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_start_input(struct audio_policy *pol, audio_io_handle_t input)
186e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
187e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
188e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->startInput(input);
189e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
190e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
191e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_stop_input(struct audio_policy *pol, audio_io_handle_t input)
192e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
193e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
194e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->stopInput(input);
195e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
196e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
197e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_release_input(struct audio_policy *pol, audio_io_handle_t input)
198e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
199e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
200e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->releaseInput(input);
201e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
202e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
203e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_init_stream_volume(struct audio_policy *pol,
204e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                  audio_stream_type_t stream, int index_min,
205e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                  int index_max)
206e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
207e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
208e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->initStreamVolume((AudioSystem::stream_type)stream, index_min,
209e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                               index_max);
210e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
211e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
212e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_set_stream_volume_index(struct audio_policy *pol,
213e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_stream_type_t stream,
214e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      int index)
215e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
216e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
217e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream,
218c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
219c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          AUDIO_DEVICE_OUT_DEFAULT);
220e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
221e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
222e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol,
223e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_stream_type_t stream,
224e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      int *index)
225e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
226e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
227e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream,
228c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
229c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          AUDIO_DEVICE_OUT_DEFAULT);
230c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent}
231c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent
232c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_set_stream_volume_index_for_device(struct audio_policy *pol,
233c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_stream_type_t stream,
234c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      int index,
235c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_devices_t device)
236c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{
237c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    struct legacy_audio_policy *lap = to_lap(pol);
238c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    return lap->apm->setStreamVolumeIndex((AudioSystem::stream_type)stream,
239c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
240c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          device);
241c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent}
242c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent
243c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurentstatic int ap_get_stream_volume_index_for_device(const struct audio_policy *pol,
244c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_stream_type_t stream,
245c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      int *index,
246c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                      audio_devices_t device)
247c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent{
248c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    const struct legacy_audio_policy *lap = to_clap(pol);
249c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream,
250c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          index,
251c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent                                          device);
252e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
253e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
254e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
255e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                           audio_stream_type_t stream)
256e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
257e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
258e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getStrategyForStream((AudioSystem::stream_type)stream);
259e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
260e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
261f9a4e2eccfbbe451512337af0806cfc54be0eaf9Eric Laurentstatic audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol,
262e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       audio_stream_type_t stream)
263e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
264e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
265e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getDevicesForStream((AudioSystem::stream_type)stream);
266e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
267e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
268e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
269c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten                                            const struct effect_descriptor_s *desc)
270e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
271e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
272e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getOutputForEffect(desc);
273e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
274e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
275e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_register_effect(struct audio_policy *pol,
276c94dccc97cc3ed5171b45f46a0f7f8762d37156fGlenn Kasten                              const struct effect_descriptor_s *desc,
2771c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent                              audio_io_handle_t io,
278e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              uint32_t strategy,
279e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              int session,
280e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              int id)
281e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
282e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
2831c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent    return lap->apm->registerEffect(desc, io, strategy, session, id);
284e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
285e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
286e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id)
287e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
288e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
289e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->unregisterEffect(id);
290e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
291e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
292582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
293582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent{
294582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    struct legacy_audio_policy *lap = to_lap(pol);
295582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    return lap->apm->setEffectEnabled(id, enabled);
296582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent}
297582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent
298d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kastenstatic bool ap_is_stream_active(const struct audio_policy *pol, audio_stream_type_t stream,
299e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                uint32_t in_past_ms)
300e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
301e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
302d97809bca3b086fe85475f462b6fdba6775f5ae1Glenn Kasten    return lap->apm->isStreamActive((int) stream, in_past_ms);
303e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
304e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
305dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivistatic bool ap_is_stream_active_remotely(const struct audio_policy *pol, audio_stream_type_t stream,
306dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi                                uint32_t in_past_ms)
307dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi{
308dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi    const struct legacy_audio_policy *lap = to_clap(pol);
309dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi    return lap->apm->isStreamActiveRemotely((int) stream, in_past_ms);
310dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi}
311dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi
312abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivistatic bool ap_is_source_active(const struct audio_policy *pol, audio_source_t source)
313abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi{
314abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi    const struct legacy_audio_policy *lap = to_clap(pol);
315abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi    return lap->apm->isSourceActive(source);
316abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi}
317abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi
318e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd)
319e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
320e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
321e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->dump(fd);
322e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
323e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
324e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int create_legacy_ap(const struct audio_policy_device *device,
325e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            struct audio_policy_service_ops *aps_ops,
326e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            void *service,
327e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            struct audio_policy **ap)
328e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
329e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap;
330e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    int ret;
331e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
332e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!service || !aps_ops)
333e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -EINVAL;
334e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
335e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap));
336e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap)
337e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -ENOMEM;
338e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
339e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_device_connection_state = ap_set_device_connection_state;
340e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_device_connection_state = ap_get_device_connection_state;
341e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_phone_state = ap_set_phone_state;
342e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_ringer_mode = ap_set_ringer_mode;
343e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_force_use = ap_set_force_use;
344e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_force_use = ap_get_force_use;
345e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_can_mute_enforced_audible =
346e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ap_set_can_mute_enforced_audible;
347e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.init_check = ap_init_check;
348e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_output = ap_get_output;
349e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.start_output = ap_start_output;
350e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.stop_output = ap_stop_output;
351e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.release_output = ap_release_output;
352e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_input = ap_get_input;
353e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.start_input = ap_start_input;
354e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.stop_input = ap_stop_input;
355e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.release_input = ap_release_input;
356e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.init_stream_volume = ap_init_stream_volume;
357e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_stream_volume_index = ap_set_stream_volume_index;
358e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_stream_volume_index = ap_get_stream_volume_index;
359c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    lap->policy.set_stream_volume_index_for_device = ap_set_stream_volume_index_for_device;
360c6f331b3f48455c9a9cdf00fc82894badd0a7da6Eric Laurent    lap->policy.get_stream_volume_index_for_device = ap_get_stream_volume_index_for_device;
361e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
362e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_devices_for_stream = ap_get_devices_for_stream;
363e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_output_for_effect = ap_get_output_for_effect;
364e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.register_effect = ap_register_effect;
365e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.unregister_effect = ap_unregister_effect;
366582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    lap->policy.set_effect_enabled = ap_set_effect_enabled;
367e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.is_stream_active = ap_is_stream_active;
368dc3bf1a37425697277f6ed04fc8cfe4a52fd678aJean-Michel Trivi    lap->policy.is_stream_active_remotely = ap_is_stream_active_remotely;
369abc55c698301e05a80d7f9394c75abca0b307602Jean-Michel Trivi    lap->policy.is_source_active = ap_is_source_active;
370e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.dump = ap_dump;
371e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
372e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->service = service;
373e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->aps_ops = aps_ops;
374e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->service_client =
375e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        new AudioPolicyCompatClient(aps_ops, service);
376e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap->service_client) {
377e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ret = -ENOMEM;
378e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        goto err_new_compat_client;
379e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    }
380e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
381e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm = createAudioPolicyManager(lap->service_client);
382e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap->apm) {
383e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ret = -ENOMEM;
384e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        goto err_create_apm;
385e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    }
386e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
387e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *ap = &lap->policy;
388e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
389e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
390e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_create_apm:
391e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    delete lap->service_client;
392e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_new_compat_client:
393e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    free(lap);
394e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *ap = NULL;
395e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return ret;
396e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
397e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
398e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int destroy_legacy_ap(const struct audio_policy_device *ap_dev,
399e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                             struct audio_policy *ap)
400e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
401e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(ap);
402e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
403e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap)
404e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return 0;
405e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
406e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (lap->apm)
407e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        destroyAudioPolicyManager(lap->apm);
408e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (lap->service_client)
409e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        delete lap->service_client;
410e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    free(lap);
411e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
412e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
413e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
414e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_close(hw_device_t* device)
415e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
416e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (device)
417e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        free(device);
418e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
419e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
420e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
421e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_open(const hw_module_t* module, const char* name,
422e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                    hw_device_t** device)
423e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
424e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_ap_device *dev;
425e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
426e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
427e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -EINVAL;
428e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
429e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev = (struct legacy_ap_device *)calloc(1, sizeof(*dev));
430e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!dev)
431e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -ENOMEM;
432e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
433e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.tag = HARDWARE_DEVICE_TAG;
434e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.version = 0;
435e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.module = const_cast<hw_module_t*>(module);
436e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.close = legacy_ap_dev_close;
437e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.create_audio_policy = create_legacy_ap;
438e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.destroy_audio_policy = destroy_legacy_ap;
439e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
440e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *device = &dev->device.common;
441e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
442e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
443e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
444e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
445e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic struct hw_module_methods_t legacy_ap_module_methods = {
446e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        open: legacy_ap_dev_open
447e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
448e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
449e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module HAL_MODULE_INFO_SYM = {
450e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    module: {
451e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        common: {
452e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            tag: HARDWARE_MODULE_TAG,
453e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            version_major: 1,
454e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            version_minor: 0,
455e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            id: AUDIO_POLICY_HARDWARE_MODULE_ID,
456e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            name: "LEGACY Audio Policy HAL",
457e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            author: "The Android Open Source Project",
458e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            methods: &legacy_ap_module_methods,
459e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            dso : NULL,
460e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            reserved : {0},
461e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        },
462e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    },
463e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
464e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
465e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // extern "C"
466e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
467e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // namespace android_audio_legacy
468