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
87e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_phone_state(struct audio_policy *pol, int state)
88e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
89e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
90e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->setPhoneState(state);
91e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
92e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
93e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    /* indicate a change in ringer mode */
94e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic void ap_set_ringer_mode(struct audio_policy *pol, uint32_t mode,
95e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                               uint32_t mask)
96e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
97e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
98e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm->setRingerMode(mode, mask);
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,
139e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       uint32_t format,
140e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       uint32_t channels,
141e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       audio_policy_output_flags_t flags)
142e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
143e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
144e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
145e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    LOGV("%s: tid %d", __func__, gettid());
146e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getOutput((AudioSystem::stream_type)stream,
147e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                               sampling_rate, format, channels,
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
174e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_input(struct audio_policy *pol, int inputSource,
175e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      uint32_t sampling_rate,
176e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      uint32_t format,
177e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      uint32_t channels,
178e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_in_acoustics_t acoustics)
179e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
180e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
181e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getInput(inputSource, sampling_rate, format, channels,
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,
218e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                          index);
219e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
220e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
221e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_get_stream_volume_index(const struct audio_policy *pol,
222e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      audio_stream_type_t stream,
223e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                      int *index)
224e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
225e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
226e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream,
227e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                          index);
228e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
229e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
230e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_strategy_for_stream(const struct audio_policy *pol,
231e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                           audio_stream_type_t stream)
232e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
233e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
234e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getStrategyForStream((AudioSystem::stream_type)stream);
235e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
236e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
237e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic uint32_t ap_get_devices_for_stream(const struct audio_policy *pol,
238e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                       audio_stream_type_t stream)
239e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
240e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
241e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getDevicesForStream((AudioSystem::stream_type)stream);
242e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
243e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
244e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic audio_io_handle_t ap_get_output_for_effect(struct audio_policy *pol,
245e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                            struct effect_descriptor_s *desc)
246e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
247e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
248e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->getOutputForEffect(desc);
249e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
250e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
251e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_register_effect(struct audio_policy *pol,
252e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              struct effect_descriptor_s *desc,
2531c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent                              audio_io_handle_t io,
254e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              uint32_t strategy,
255e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              int session,
256e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                              int id)
257e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
258e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
2591c65a49da0c89f75e528354ef02de5dc93a28232Eric Laurent    return lap->apm->registerEffect(desc, io, strategy, session, id);
260e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
261e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
262e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_unregister_effect(struct audio_policy *pol, int id)
263e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
264e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(pol);
265e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->unregisterEffect(id);
266e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
267e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
268582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurentstatic int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled)
269582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent{
270582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    struct legacy_audio_policy *lap = to_lap(pol);
271582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    return lap->apm->setEffectEnabled(id, enabled);
272582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent}
273582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent
274e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic bool ap_is_stream_active(const struct audio_policy *pol, int stream,
275e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                uint32_t in_past_ms)
276e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
277e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
278e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->isStreamActive(stream, in_past_ms);
279e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
280e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
281e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int ap_dump(const struct audio_policy *pol, int fd)
282e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
283e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    const struct legacy_audio_policy *lap = to_clap(pol);
284e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return lap->apm->dump(fd);
285e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
286e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
287e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int create_legacy_ap(const struct audio_policy_device *device,
288e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            struct audio_policy_service_ops *aps_ops,
289e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            void *service,
290e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                            struct audio_policy **ap)
291e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
292e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap;
293e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    int ret;
294e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
295e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!service || !aps_ops)
296e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -EINVAL;
297e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
298e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap));
299e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap)
300e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -ENOMEM;
301e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
302e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_device_connection_state = ap_set_device_connection_state;
303e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_device_connection_state = ap_get_device_connection_state;
304e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_phone_state = ap_set_phone_state;
305e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_ringer_mode = ap_set_ringer_mode;
306e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_force_use = ap_set_force_use;
307e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_force_use = ap_get_force_use;
308e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_can_mute_enforced_audible =
309e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ap_set_can_mute_enforced_audible;
310e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.init_check = ap_init_check;
311e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_output = ap_get_output;
312e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.start_output = ap_start_output;
313e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.stop_output = ap_stop_output;
314e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.release_output = ap_release_output;
315e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_input = ap_get_input;
316e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.start_input = ap_start_input;
317e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.stop_input = ap_stop_input;
318e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.release_input = ap_release_input;
319e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.init_stream_volume = ap_init_stream_volume;
320e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.set_stream_volume_index = ap_set_stream_volume_index;
321e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_stream_volume_index = ap_get_stream_volume_index;
322e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_strategy_for_stream = ap_get_strategy_for_stream;
323e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_devices_for_stream = ap_get_devices_for_stream;
324e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.get_output_for_effect = ap_get_output_for_effect;
325e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.register_effect = ap_register_effect;
326e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.unregister_effect = ap_unregister_effect;
327582a15744be109fb630db7dbd1d1bdf22ff44f12Eric Laurent    lap->policy.set_effect_enabled = ap_set_effect_enabled;
328e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.is_stream_active = ap_is_stream_active;
329e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->policy.dump = ap_dump;
330e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
331e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->service = service;
332e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->aps_ops = aps_ops;
333e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->service_client =
334e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        new AudioPolicyCompatClient(aps_ops, service);
335e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap->service_client) {
336e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ret = -ENOMEM;
337e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        goto err_new_compat_client;
338e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    }
339e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
340e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    lap->apm = createAudioPolicyManager(lap->service_client);
341e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap->apm) {
342e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        ret = -ENOMEM;
343e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        goto err_create_apm;
344e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    }
345e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
346e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *ap = &lap->policy;
347e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
348e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
349e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_create_apm:
350e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    delete lap->service_client;
351e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinerr_new_compat_client:
352e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    free(lap);
353e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *ap = NULL;
354e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return ret;
355e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
356e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
357e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int destroy_legacy_ap(const struct audio_policy_device *ap_dev,
358e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                             struct audio_policy *ap)
359e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
360e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_audio_policy *lap = to_lap(ap);
361e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
362e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!lap)
363e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return 0;
364e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
365e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (lap->apm)
366e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        destroyAudioPolicyManager(lap->apm);
367e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (lap->service_client)
368e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        delete lap->service_client;
369e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    free(lap);
370e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
371e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
372e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
373e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_close(hw_device_t* device)
374e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
375e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (device)
376e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        free(device);
377e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
378e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
379e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
380e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic int legacy_ap_dev_open(const hw_module_t* module, const char* name,
381e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin                                    hw_device_t** device)
382e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin{
383e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    struct legacy_ap_device *dev;
384e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
385e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0)
386e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -EINVAL;
387e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
388e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev = (struct legacy_ap_device *)calloc(1, sizeof(*dev));
389e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    if (!dev)
390e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        return -ENOMEM;
391e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
392e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.tag = HARDWARE_DEVICE_TAG;
393e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.version = 0;
394e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.module = const_cast<hw_module_t*>(module);
395e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.common.close = legacy_ap_dev_close;
396e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.create_audio_policy = create_legacy_ap;
397e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    dev->device.destroy_audio_policy = destroy_legacy_ap;
398e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
399e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    *device = &dev->device.common;
400e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
401e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    return 0;
402e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}
403e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
404e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstatic struct hw_module_methods_t legacy_ap_module_methods = {
405e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        open: legacy_ap_dev_open
406e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
407e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
408e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavinstruct legacy_ap_module HAL_MODULE_INFO_SYM = {
409e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    module: {
410e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        common: {
411e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            tag: HARDWARE_MODULE_TAG,
412e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            version_major: 1,
413e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            version_minor: 0,
414e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            id: AUDIO_POLICY_HARDWARE_MODULE_ID,
415e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            name: "LEGACY Audio Policy HAL",
416e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            author: "The Android Open Source Project",
417e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            methods: &legacy_ap_module_methods,
418e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            dso : NULL,
419e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin            reserved : {0},
420e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin        },
421e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin    },
422e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin};
423e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
424e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // extern "C"
425e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin
426e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin}; // namespace android_audio_legacy
427