1f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/*
2f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Copyright (C) 2011 The Android Open Source Project
3f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *
4f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License");
5f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * you may not use this file except in compliance with the License.
6f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * You may obtain a copy of the License at
7f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *
8f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *      http://www.apache.org/licenses/LICENSE-2.0
9f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *
10f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Unless required by applicable law or agreed to in writing, software
11f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS,
12f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * See the License for the specific language governing permissions and
14f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * limitations under the License.
15f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */
16f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
17f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
18f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#ifndef ANDROID_AUDIO_POLICY_INTERFACE_H
19f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#define ANDROID_AUDIO_POLICY_INTERFACE_H
20f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
21f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <stdint.h>
22f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <sys/cdefs.h>
23f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <sys/types.h>
24f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
25f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#include <hardware/hardware.h>
26f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
27aa21172bcd4c332eec78d34ffdafd8cc0178ea95Dima Zavin#include <system/audio.h>
281199865d0cb68750e2b959cb3ed04e1bc0f1c9d1Dima Zavin#include <system/audio_policy.h>
29f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
30f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin__BEGIN_DECLS
31f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
32f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/**
33f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The id of this module
34f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */
35f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#define AUDIO_POLICY_HARDWARE_MODULE_ID "audio_policy"
36f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
37f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/**
38f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Name of the audio devices to open
39f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */
40f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#define AUDIO_POLICY_INTERFACE "policy"
41f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
42f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/* ---------------------------------------------------------------------------- */
43f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
44f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/*
45f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The audio_policy and audio_policy_service_ops structs define the
46f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * communication interfaces between the platform specific audio policy manager
47f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * and Android generic audio policy manager.
48f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The platform specific audio policy manager must implement methods of the
49f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * audio_policy struct.
50f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * This implementation makes use of the audio_policy_service_ops to control
51f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * the activity and configuration of audio input and output streams.
52f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *
53f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The platform specific audio policy manager is in charge of the audio
54f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * routing and volume control policies for a given platform.
55f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * The main roles of this module are:
56f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   - keep track of current system state (removable device connections, phone
57f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     state, user requests...).
58f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   System state changes and user actions are notified to audio policy
59f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   manager with methods of the audio_policy.
60f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *
61f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   - process get_output() queries received when AudioTrack objects are
62f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     created: Those queries return a handler on an output that has been
63f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     selected, configured and opened by the audio policy manager and that
64f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     must be used by the AudioTrack when registering to the AudioFlinger
65f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     with the createTrack() method.
66f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   When the AudioTrack object is released, a release_output() query
67f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   is received and the audio policy manager can decide to close or
68f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   reconfigure the output depending on other streams using this output and
69f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   current system state.
70f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *
71f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   - similarly process get_input() and release_input() queries received from
72f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     AudioRecord objects and configure audio inputs.
73f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *   - process volume control requests: the stream volume is converted from
74f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     an index value (received from UI) to a float value applicable to each
75f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     output as a function of platform specific settings and current output
76f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     route (destination device). It also make sure that streams are not
77f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin *     muted if not allowed (e.g. camera shutter sound in some countries).
78f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */
79f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
80f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/* XXX: this should be defined OUTSIDE of frameworks/base */
81f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct effect_descriptor_s;
82f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
83f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_policy {
84f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /*
85f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * configuration functions
86f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
87f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
88f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* indicate a change in device connection status */
89f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*set_device_connection_state)(struct audio_policy *pol,
90f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                       audio_devices_t device,
91f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                       audio_policy_dev_state_t state,
92f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                       const char *device_address);
93f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
94ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    /* retrieve a device connection status */
95f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_policy_dev_state_t (*get_device_connection_state)(
96f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                            const struct audio_policy *pol,
97f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                            audio_devices_t device,
98f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                            const char *device_address);
99f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
100f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* indicate a change in phone state. Valid phones states are defined
101f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * by audio_mode_t */
1026df641e269639dbb81bb1c19f47d3b9e5e3ff7d7Glenn Kasten    void (*set_phone_state)(struct audio_policy *pol, audio_mode_t state);
103f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
104080a80212b6ec954fe8a424d9fb286c5cf1d5021Glenn Kasten    /* deprecated, never called (was "indicate a change in ringer mode") */
105f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*set_ringer_mode)(struct audio_policy *pol, uint32_t mode,
106f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                            uint32_t mask);
107f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
108f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* force using a specific device category for the specified usage */
109f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*set_force_use)(struct audio_policy *pol,
110f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                          audio_policy_force_use_t usage,
111f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                          audio_policy_forced_cfg_t config);
112f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
113ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    /* retrieve current device category forced for a given usage */
114f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_policy_forced_cfg_t (*get_force_use)(const struct audio_policy *pol,
115f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                               audio_policy_force_use_t usage);
116f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
117f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* if can_mute is true, then audio streams that are marked ENFORCED_AUDIBLE
118f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * can still be muted. */
119f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*set_can_mute_enforced_audible)(struct audio_policy *pol,
120f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                          bool can_mute);
121f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
122f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* check proper initialization */
123f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*init_check)(const struct audio_policy *pol);
124f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
125f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /*
126f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * Audio routing query functions
127f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
128f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
1290cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten    /* request an output appropriate for playback of the supplied stream type and
130f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * parameters */
131f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_io_handle_t (*get_output)(struct audio_policy *pol,
132f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                    audio_stream_type_t stream,
133f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                    uint32_t samplingRate,
134fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten                                    audio_format_t format,
135a635449697a2df5de98e72cfc24e926b641d5544Glenn Kasten                                    audio_channel_mask_t channelMask,
136f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald                                    audio_output_flags_t flags,
137f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald                                    const audio_offload_info_t *offloadInfo);
138f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
139f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* indicates to the audio policy manager that the output starts being used
140f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * by corresponding stream. */
141f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*start_output)(struct audio_policy *pol,
142f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                        audio_io_handle_t output,
143f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                        audio_stream_type_t stream,
14413091fe19a019b2613a149d63a0e13087973f40eGlenn Kasten                        audio_session_t session);
145f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
146f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* indicates to the audio policy manager that the output stops being used
147f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * by corresponding stream. */
148f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*stop_output)(struct audio_policy *pol,
149f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                       audio_io_handle_t output,
150f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                       audio_stream_type_t stream,
15113091fe19a019b2613a149d63a0e13087973f40eGlenn Kasten                       audio_session_t session);
152f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
153f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* releases the output. */
154f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*release_output)(struct audio_policy *pol, audio_io_handle_t output);
155f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
156ae2e42b2447d011bd6cf9d5b4413dd3557de0035Glenn Kasten    /* request an input appropriate for record from the supplied device with
157f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * supplied parameters. */
158ae2e42b2447d011bd6cf9d5b4413dd3557de0035Glenn Kasten    audio_io_handle_t (*get_input)(struct audio_policy *pol, audio_source_t inputSource,
159f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                   uint32_t samplingRate,
160fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten                                   audio_format_t format,
161a635449697a2df5de98e72cfc24e926b641d5544Glenn Kasten                                   audio_channel_mask_t channelMask,
162f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                   audio_in_acoustics_t acoustics);
163f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
164f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* indicates to the audio policy manager that the input starts being used */
165f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*start_input)(struct audio_policy *pol, audio_io_handle_t input);
166f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
167f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* indicates to the audio policy manager that the input stops being used. */
168f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*stop_input)(struct audio_policy *pol, audio_io_handle_t input);
169f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
170f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* releases the input. */
171f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*release_input)(struct audio_policy *pol, audio_io_handle_t input);
172f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
173f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /*
174f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * volume control functions
175f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
176f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
177f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* initialises stream volume conversion parameters by specifying volume
178ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent     * index range. The index range for each stream is defined by AudioService. */
179f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*init_stream_volume)(struct audio_policy *pol,
180f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                               audio_stream_type_t stream,
181f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                               int index_min,
182f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                               int index_max);
183f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
184f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* sets the new stream volume at a level corresponding to the supplied
185ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent     * index. The index is within the range specified by init_stream_volume() */
186f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*set_stream_volume_index)(struct audio_policy *pol,
187f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                   audio_stream_type_t stream,
188f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                   int index);
189f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
190ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    /* retrieve current volume index for the specified stream */
191f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*get_stream_volume_index)(const struct audio_policy *pol,
192f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                   audio_stream_type_t stream,
193f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                   int *index);
194f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
195ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    /* sets the new stream volume at a level corresponding to the supplied
196ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent     * index for the specified device.
197ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent     * The index is within the range specified by init_stream_volume() */
198ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    int (*set_stream_volume_index_for_device)(struct audio_policy *pol,
199ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                   audio_stream_type_t stream,
200ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                   int index,
201ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                   audio_devices_t device);
202ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent
203ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    /* retrieve current volume index for the specified stream for the specified device */
204ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent    int (*get_stream_volume_index_for_device)(const struct audio_policy *pol,
205ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                   audio_stream_type_t stream,
206ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                   int *index,
207ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent                                   audio_devices_t device);
208ca20b17b419eec2b196877be38f9c4290449aeacEric Laurent
209f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* return the strategy corresponding to a given stream type */
210f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    uint32_t (*get_strategy_for_stream)(const struct audio_policy *pol,
211f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                        audio_stream_type_t stream);
212f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
213f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* return the enabled output devices for the given stream type */
21483c62ce4e319a11d14a27c6368811f9efc1e8c5aEric Laurent    audio_devices_t (*get_devices_for_stream)(const struct audio_policy *pol,
215f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                       audio_stream_type_t stream);
216f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
217f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* Audio effect management */
218f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_io_handle_t (*get_output_for_effect)(struct audio_policy *pol,
21948915acb392773c1fcb86e2711eab468410a0baaGlenn Kasten                                            const struct effect_descriptor_s *desc);
220f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
221f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*register_effect)(struct audio_policy *pol,
22248915acb392773c1fcb86e2711eab468410a0baaGlenn Kasten                           const struct effect_descriptor_s *desc,
223f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                           audio_io_handle_t output,
224f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                           uint32_t strategy,
22513091fe19a019b2613a149d63a0e13087973f40eGlenn Kasten                           audio_session_t session,
226f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                           int id);
227f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
228f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*unregister_effect)(struct audio_policy *pol, int id);
229f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
23078d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent    int (*set_effect_enabled)(struct audio_policy *pol, int id, bool enabled);
23178d2c69af4ab35ac6ae8e78fc3a61e7023a60769Eric Laurent
232f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    bool (*is_stream_active)(const struct audio_policy *pol,
2332661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi            audio_stream_type_t stream,
2342661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi            uint32_t in_past_ms);
2352661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi
2362661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi    bool (*is_stream_active_remotely)(const struct audio_policy *pol,
2372661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi            audio_stream_type_t stream,
2382661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi            uint32_t in_past_ms);
239f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
24020c7f50cd5d60ee7d76f2f502866187992e7675bJean-Michel Trivi    bool (*is_source_active)(const struct audio_policy *pol,
2412661f346abc58ddc238b68ad7d1d0a29642dd8b3Jean-Michel Trivi            audio_source_t source);
24220c7f50cd5d60ee7d76f2f502866187992e7675bJean-Michel Trivi
243f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* dump state */
244f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*dump)(const struct audio_policy *pol, int fd);
245f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald
246f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald    /* check if offload is possible for given sample rate, bitrate, duration, ... */
247f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald    bool (*is_offload_supported)(const struct audio_policy *pol,
248f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald                                const audio_offload_info_t *info);
249f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin};
250f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
251c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent
252f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_policy_service_ops {
253f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /*
254f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * Audio output Control functions
255f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
256f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
257f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* Opens an audio output with the requested parameters.
258f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     *
259f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * The parameter values can indicate to use the default values in case the
260f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * audio policy manager has no specific requirements for the output being
261f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * opened.
262f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     *
263f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * When the function returns, the parameter values reflect the actual
264f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * values used by the audio hardware output stream.
265f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     *
266f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * The audio policy manager can check if the proposed parameters are
267f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * suitable or not and act accordingly.
268f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
269f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_io_handle_t (*open_output)(void *service,
270c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     audio_devices_t *pDevices,
271f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                     uint32_t *pSamplingRate,
272fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten                                     audio_format_t *pFormat,
273c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     audio_channel_mask_t *pChannelMask,
274f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                     uint32_t *pLatencyMs,
275da4b0b26d170971448fdb04817b308900b5a6dd8Eric Laurent                                     audio_output_flags_t flags);
276f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
277f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* creates a special output that is duplicated to the two outputs passed as
278f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * arguments. The duplication is performed by
279f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * a special mixer thread in the AudioFlinger.
280f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
281f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_io_handle_t (*open_duplicate_output)(void *service,
282f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                               audio_io_handle_t output1,
283f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                               audio_io_handle_t output2);
284f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
285f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* closes the output stream */
286f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*close_output)(void *service, audio_io_handle_t output);
287f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
288f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* suspends the output.
289f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     *
290f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * When an output is suspended, the corresponding audio hardware output
291f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * stream is placed in standby and the AudioTracks attached to the mixer
292f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * thread are still processed but the output mix is discarded.
293f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
294f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*suspend_output)(void *service, audio_io_handle_t output);
295f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
296f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* restores a suspended output. */
297f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*restore_output)(void *service, audio_io_handle_t output);
298f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
299f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* */
300f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* Audio input Control functions */
301f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* */
302f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
303e57a2d2ec601c54852a1cf55c11186bbf5c6c8f5Glenn Kasten    /* opens an audio input
304e57a2d2ec601c54852a1cf55c11186bbf5c6c8f5Glenn Kasten     * deprecated - new implementations should use open_input_on_module,
305e57a2d2ec601c54852a1cf55c11186bbf5c6c8f5Glenn Kasten     * and the acoustics parameter is ignored
306e57a2d2ec601c54852a1cf55c11186bbf5c6c8f5Glenn Kasten     */
307f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    audio_io_handle_t (*open_input)(void *service,
308c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    audio_devices_t *pDevices,
309f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                    uint32_t *pSamplingRate,
310fe79eb3f06967f863a637e546eb4421d0da2283bGlenn Kasten                                    audio_format_t *pFormat,
311c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    audio_channel_mask_t *pChannelMask,
312114c2fd2d3d953763edb4372324c993bd66cbe91Glenn Kasten                                    audio_in_acoustics_t acoustics);
313f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
314f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* closes an audio input */
315f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*close_input)(void *service, audio_io_handle_t input);
316f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
317f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* */
318f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* misc control functions */
319f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* */
320f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
321f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* set a stream volume for a particular output.
322f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     *
323f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * For the same user setting, a given stream type can have different
324f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * volumes for each output (destination device) it is attached to.
325f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
326f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*set_stream_volume)(void *service,
327f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                             audio_stream_type_t stream,
328f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                             float volume,
329f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                             audio_io_handle_t output,
330f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                             int delay_ms);
331f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
3323f56a10cc39a46a9d17e59b64f7f744feba9d8c1Glenn Kasten    /* invalidate a stream type, causing a reroute to an unspecified new output */
3333f56a10cc39a46a9d17e59b64f7f744feba9d8c1Glenn Kasten    int (*invalidate_stream)(void *service,
3343f56a10cc39a46a9d17e59b64f7f744feba9d8c1Glenn Kasten                             audio_stream_type_t stream);
335f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
336f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* function enabling to send proprietary informations directly from audio
337f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * policy manager to audio hardware interface. */
338f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    void (*set_parameters)(void *service,
339f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                           audio_io_handle_t io_handle,
340f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                           const char *kv_pairs,
341f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                           int delay_ms);
342f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
343f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* function enabling to receive proprietary informations directly from
344f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * audio hardware interface to audio policy manager.
345f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     *
346f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * Returns a pointer to a heap allocated string. The caller is responsible
3470cacd8d44b3f6ff6ec947bb6b2db1e382ee73bdbGlenn Kasten     * for freeing the memory for it using free().
348f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
349f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
350f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    char * (*get_parameters)(void *service, audio_io_handle_t io_handle,
351f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                             const char *keys);
352f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
353f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* request the playback of a tone on the specified stream.
354f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * used for instance to replace notification sounds when playing over a
355f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     * telephony device during a phone call.
356f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin     */
357f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*start_tone)(void *service,
358f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                      audio_policy_tone_t tone,
359f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                      audio_stream_type_t stream);
360f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
361f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*stop_tone)(void *service);
362f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
363f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* set down link audio volume. */
364f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*set_voice_volume)(void *service,
365f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                            float volume,
366f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                            int delay_ms);
367f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
368f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    /* move effect to the specified output */
369f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*move_effects)(void *service,
37013091fe19a019b2613a149d63a0e13087973f40eGlenn Kasten                        audio_session_t session,
371f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                        audio_io_handle_t src_output,
372f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                        audio_io_handle_t dst_output);
373c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent
374c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent    /* loads an audio hw module.
375c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     *
376c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     * The module name passed is the base name of the HW module library, e.g "primary" or "a2dp".
377c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     * The function returns a handle on the module that will be used to specify a particular
378c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     * module when calling open_output_on_module() or open_input_on_module()
379c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     */
380c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent    audio_module_handle_t (*load_hw_module)(void *service,
381c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                              const char *name);
382c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent
383c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent    /* Opens an audio output on a particular HW module.
384c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     *
385c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     * Same as open_output() but specifying a specific HW module on which the output must be opened.
386c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     */
387c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent    audio_io_handle_t (*open_output_on_module)(void *service,
388c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     audio_module_handle_t module,
389c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     audio_devices_t *pDevices,
390c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     uint32_t *pSamplingRate,
391c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     audio_format_t *pFormat,
392c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     audio_channel_mask_t *pChannelMask,
393c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                     uint32_t *pLatencyMs,
394f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald                                     audio_output_flags_t flags,
395f37f187bbac1fd7bf884eb3ea5c47aa78cb68cdcRichard Fitzgerald                                     const audio_offload_info_t *offloadInfo);
396c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent
397c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent    /* Opens an audio input on a particular HW module.
398c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     *
399c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     * Same as open_input() but specifying a specific HW module on which the input must be opened.
400c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     * Also removed deprecated acoustics parameter
401c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent     */
402c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent    audio_io_handle_t (*open_input_on_module)(void *service,
403c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    audio_module_handle_t module,
404c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    audio_devices_t *pDevices,
405c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    uint32_t *pSamplingRate,
406c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    audio_format_t *pFormat,
407c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent                                    audio_channel_mask_t *pChannelMask);
408c65a2fe3925f46b4d4301cef97b308dbc3e22da9Eric Laurent
409f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin};
410f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
411f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/**********************************************************************/
412f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
413f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/**
414f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
415f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * and the fields of this data structure must begin with hw_module_t
416f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin * followed by module specific information.
417f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin */
418f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavintypedef struct audio_policy_module {
419f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    struct hw_module_t common;
420f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin} audio_policy_module_t;
421f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
422f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstruct audio_policy_device {
42384d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles    /**
42484d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * Common methods of the audio policy device.  This *must* be the first member of
42584d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * audio_policy_device as users of this structure will cast a hw_device_t to
42684d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * audio_policy_device pointer in contexts where it's known the hw_device_t references an
42784d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     * audio_policy_device.
42884d35492b145cebc000f8fd72818eb25b8e65c04Stewart Miles     */
429f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    struct hw_device_t common;
430f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
431f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*create_audio_policy)(const struct audio_policy_device *device,
432f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                               struct audio_policy_service_ops *aps_ops,
433f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                               void *service,
434f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                               struct audio_policy **ap);
435f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
436f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    int (*destroy_audio_policy)(const struct audio_policy_device *device,
437f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                struct audio_policy *ap);
438f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin};
439f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
440f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin/** convenience API for opening and closing a supported device */
441f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
442f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstatic inline int audio_policy_dev_open(const hw_module_t* module,
443f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                    struct audio_policy_device** device)
444f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin{
445f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    return module->methods->open(module, AUDIO_POLICY_INTERFACE,
446f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin                                 (hw_device_t**)device);
447f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}
448f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
449f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavinstatic inline int audio_policy_dev_close(struct audio_policy_device* device)
450f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin{
451f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin    return device->common.close(&device->common);
452f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin}
453f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
454f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
455f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin__END_DECLS
456f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin
457f1504dbca386fc454b8ded7669012f3d4d27eab7Dima Zavin#endif  // ANDROID_AUDIO_POLICY_INTERFACE_H
458