1/*
2 * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
3 * Not a Contribution.
4 *
5 * Copyright (C) 2013 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#ifndef AUDIO_EXTN_H
21#define AUDIO_EXTN_H
22
23#include <cutils/str_parms.h>
24
25#ifndef PCM_OFFLOAD_ENABLED
26#define AUDIO_FORMAT_PCM_OFFLOAD 0x17000000UL
27#define AUDIO_FORMAT_PCM_16_BIT_OFFLOAD (AUDIO_FORMAT_PCM_OFFLOAD | AUDIO_FORMAT_PCM_SUB_16_BIT)
28#define AUDIO_FORMAT_PCM_24_BIT_OFFLOAD (AUDIO_FORMAT_PCM_OFFLOAD | AUDIO_FORMAT_PCM_SUB_8_24_BIT)
29#define AUDIO_OFFLOAD_CODEC_FORMAT  "music_offload_codec_format"
30#define audio_is_offload_pcm(format) (0)
31#endif
32
33#ifndef AFE_PROXY_ENABLED
34#define AUDIO_DEVICE_OUT_PROXY 0x40000
35#endif
36
37#ifndef COMPRESS_VOIP_ENABLED
38#define AUDIO_OUTPUT_FLAG_VOIP_RX 0x4000
39#endif
40
41#ifndef INCALL_MUSIC_ENABLED
42#define AUDIO_OUTPUT_FLAG_INCALL_MUSIC 0x8000
43#endif
44
45#ifndef AUDIO_DEVICE_OUT_FM_TX
46#define AUDIO_DEVICE_OUT_FM_TX 0x8000000
47#endif
48
49#ifndef FLAC_OFFLOAD_ENABLED
50#define AUDIO_FORMAT_FLAC 0x1B000000UL
51#endif
52
53#ifndef WMA_OFFLOAD_ENABLED
54#define AUDIO_FORMAT_WMA 0x12000000UL
55#define AUDIO_FORMAT_WMA_PRO 0x13000000UL
56#endif
57
58#ifndef ALAC_OFFLOAD_ENABLED
59#define AUDIO_FORMAT_ALAC 0x1C000000UL
60#endif
61
62#ifndef APE_OFFLOAD_ENABLED
63#define AUDIO_FORMAT_APE 0x1D000000UL
64#endif
65
66#ifndef COMPRESS_METADATA_NEEDED
67#define audio_extn_parse_compress_metadata(out, parms) (0)
68#else
69int audio_extn_parse_compress_metadata(struct stream_out *out,
70                                       struct str_parms *parms);
71#endif
72
73#ifdef PCM_OFFLOAD_ENABLED_24
74#define PCM_OUTPUT_BIT_WIDTH (config->offload_info.bit_width)
75#else
76#define PCM_OUTPUT_BIT_WIDTH (CODEC_BACKEND_DEFAULT_BIT_WIDTH)
77#endif
78
79#define MAX_LENGTH_MIXER_CONTROL_IN_INT                  (128)
80
81void audio_extn_set_parameters(struct audio_device *adev,
82                               struct str_parms *parms);
83
84void audio_extn_get_parameters(const struct audio_device *adev,
85                               struct str_parms *query,
86                               struct str_parms *reply);
87
88#ifndef ANC_HEADSET_ENABLED
89#define audio_extn_get_anc_enabled()                     (0)
90#define audio_extn_should_use_fb_anc()                   (0)
91#define audio_extn_should_use_handset_anc(in_channels)   (0)
92#else
93bool audio_extn_get_anc_enabled(void);
94bool audio_extn_should_use_fb_anc(void);
95bool audio_extn_should_use_handset_anc(int in_channels);
96#endif
97
98#ifndef FLUENCE_ENABLED
99#define audio_extn_set_fluence_parameters(adev, parms) (0)
100#define audio_extn_get_fluence_parameters(adev, query, reply) (0)
101#else
102void audio_extn_set_fluence_parameters(struct audio_device *adev,
103                                           struct str_parms *parms);
104int audio_extn_get_fluence_parameters(const struct audio_device *adev,
105                  struct str_parms *query, struct str_parms *reply);
106#endif
107
108#ifndef AFE_PROXY_ENABLED
109#define audio_extn_set_afe_proxy_channel_mixer(adev,channel_count)     (0)
110#define audio_extn_read_afe_proxy_channel_masks(out)                   (0)
111#define audio_extn_get_afe_proxy_channel_count()                       (0)
112#else
113int32_t audio_extn_set_afe_proxy_channel_mixer(struct audio_device *adev,
114                                                    int channel_count);
115int32_t audio_extn_read_afe_proxy_channel_masks(struct stream_out *out);
116int32_t audio_extn_get_afe_proxy_channel_count();
117
118#endif
119
120#ifndef USB_HEADSET_ENABLED
121#define audio_extn_usb_init(adev)                        (0)
122#define audio_extn_usb_deinit()                          (0)
123#define audio_extn_usb_start_playback(adev)              (0)
124#define audio_extn_usb_stop_playback()                   (0)
125#define audio_extn_usb_start_capture(adev)               (0)
126#define audio_extn_usb_stop_capture()                    (0)
127#define audio_extn_usb_set_proxy_sound_card(sndcard_idx) (0)
128#define audio_extn_usb_is_proxy_inuse()                  (0)
129#else
130void initPlaybackVolume();
131void audio_extn_usb_init(void *adev);
132void audio_extn_usb_deinit();
133void audio_extn_usb_start_playback(void *adev);
134void audio_extn_usb_stop_playback();
135void audio_extn_usb_start_capture(void *adev);
136void audio_extn_usb_stop_capture();
137void audio_extn_usb_set_proxy_sound_card(uint32_t sndcard_idx);
138bool audio_extn_usb_is_proxy_inuse();
139#endif
140
141#ifndef SPLIT_A2DP_ENABLED
142#define audio_extn_a2dp_init()                       (0)
143#define audio_extn_a2dp_start_playback()             (0)
144#define audio_extn_a2dp_stop_playback()              (0)
145#define audio_extn_a2dp_set_parameters(parms)      (0)
146#else
147void audio_extn_a2dp_init();
148void audio_extn_a2dp_start_playback();
149void audio_extn_a2dp_stop_playback();
150void audio_extn_a2dp_set_parameters(struct str_parms *parms);
151#endif
152
153#ifndef SSR_ENABLED
154#define audio_extn_ssr_init(in)                       (0)
155#define audio_extn_ssr_deinit()                       (0)
156#define audio_extn_ssr_update_enabled()               (0)
157#define audio_extn_ssr_get_enabled()                  (0)
158#define audio_extn_ssr_read(stream, buffer, bytes)    (0)
159#else
160int32_t audio_extn_ssr_init(struct stream_in *in);
161int32_t audio_extn_ssr_deinit();
162void audio_extn_ssr_update_enabled();
163bool audio_extn_ssr_get_enabled();
164int32_t audio_extn_ssr_read(struct audio_stream_in *stream,
165                       void *buffer, size_t bytes);
166#endif
167
168#ifndef HW_VARIANTS_ENABLED
169#define hw_info_init(snd_card_name)                  (0)
170#define hw_info_deinit(hw_info)                      (0)
171#define hw_info_append_hw_type(hw_info,\
172        snd_device, device_name)                     (0)
173#else
174void *hw_info_init(const char *snd_card_name);
175void hw_info_deinit(void *hw_info);
176void hw_info_append_hw_type(void *hw_info, snd_device_t snd_device,
177                             char *device_name);
178#endif
179
180#ifndef AUDIO_LISTEN_ENABLED
181#define audio_extn_listen_init(adev, snd_card)                  (0)
182#define audio_extn_listen_deinit(adev)                          (0)
183#define audio_extn_listen_update_device_status(snd_dev, event)  (0)
184#define audio_extn_listen_update_stream_status(uc_info, event)  (0)
185#define audio_extn_listen_set_parameters(adev, parms)           (0)
186#else
187enum listen_event_type {
188    LISTEN_EVENT_SND_DEVICE_FREE,
189    LISTEN_EVENT_SND_DEVICE_BUSY,
190    LISTEN_EVENT_STREAM_FREE,
191    LISTEN_EVENT_STREAM_BUSY
192};
193typedef enum listen_event_type listen_event_type_t;
194
195int audio_extn_listen_init(struct audio_device *adev, unsigned int snd_card);
196void audio_extn_listen_deinit(struct audio_device *adev);
197void audio_extn_listen_update_device_status(snd_device_t snd_device,
198                                     listen_event_type_t event);
199void audio_extn_listen_update_stream_status(struct audio_usecase *uc_info,
200                                     listen_event_type_t event);
201void audio_extn_listen_set_parameters(struct audio_device *adev,
202                                      struct str_parms *parms);
203#endif /* AUDIO_LISTEN_ENABLED */
204
205#ifndef SOUND_TRIGGER_ENABLED
206#define audio_extn_sound_trigger_init(adev)                            (0)
207#define audio_extn_sound_trigger_deinit(adev)                          (0)
208#define audio_extn_sound_trigger_update_device_status(snd_dev, event)  (0)
209#define audio_extn_sound_trigger_update_stream_status(uc_info, event)  (0)
210#define audio_extn_sound_trigger_set_parameters(adev, parms)           (0)
211#define audio_extn_sound_trigger_check_and_get_session(in)             (0)
212#define audio_extn_sound_trigger_stop_lab(in)                          (0)
213#else
214
215enum st_event_type {
216    ST_EVENT_SND_DEVICE_FREE,
217    ST_EVENT_SND_DEVICE_BUSY,
218    ST_EVENT_STREAM_FREE,
219    ST_EVENT_STREAM_BUSY
220};
221typedef enum st_event_type st_event_type_t;
222
223int audio_extn_sound_trigger_init(struct audio_device *adev);
224void audio_extn_sound_trigger_deinit(struct audio_device *adev);
225void audio_extn_sound_trigger_update_device_status(snd_device_t snd_device,
226                                     st_event_type_t event);
227void audio_extn_sound_trigger_update_stream_status(struct audio_usecase *uc_info,
228                                     st_event_type_t event);
229void audio_extn_sound_trigger_set_parameters(struct audio_device *adev,
230                                             struct str_parms *parms);
231void audio_extn_sound_trigger_check_and_get_session(struct stream_in *in);
232void audio_extn_sound_trigger_stop_lab(struct stream_in *in);
233#endif
234
235#ifndef AUXPCM_BT_ENABLED
236#define audio_extn_read_xml(adev, mixer_card, MIXER_XML_PATH, \
237                            MIXER_XML_PATH_AUXPCM)               (-ENOSYS)
238#else
239int32_t audio_extn_read_xml(struct audio_device *adev, uint32_t mixer_card,
240                            const char* mixer_xml_path,
241                            const char* mixer_xml_path_auxpcm);
242#endif /* AUXPCM_BT_ENABLED */
243#ifndef SPKR_PROT_ENABLED
244#define audio_extn_spkr_prot_init(adev)       (0)
245#define audio_extn_spkr_prot_start_processing(snd_device)    (-EINVAL)
246#define audio_extn_spkr_prot_calib_cancel(adev) (0)
247#define audio_extn_spkr_prot_stop_processing(snd_device)     (0)
248#define audio_extn_spkr_prot_is_enabled() (false)
249#define audio_extn_spkr_prot_get_acdb_id(snd_device)         (-EINVAL)
250#define audio_extn_get_spkr_prot_snd_device(snd_device) (snd_device)
251#else
252void audio_extn_spkr_prot_init(void *adev);
253int audio_extn_spkr_prot_start_processing(snd_device_t snd_device);
254void audio_extn_spkr_prot_stop_processing(snd_device_t snd_device);
255bool audio_extn_spkr_prot_is_enabled();
256int audio_extn_spkr_prot_get_acdb_id(snd_device_t snd_device);
257int audio_extn_get_spkr_prot_snd_device(snd_device_t snd_device);
258void audio_extn_spkr_prot_calib_cancel(void *adev);
259#endif
260
261#ifndef COMPRESS_CAPTURE_ENABLED
262#define audio_extn_compr_cap_init(in)                     (0)
263#define audio_extn_compr_cap_enabled()                    (0)
264#define audio_extn_compr_cap_format_supported(format)     (0)
265#define audio_extn_compr_cap_usecase_supported(usecase)   (0)
266#define audio_extn_compr_cap_get_buffer_size(format)      (0)
267#define audio_extn_compr_cap_read(in, buffer, bytes)      (0)
268#define audio_extn_compr_cap_deinit()                     (0)
269#else
270void audio_extn_compr_cap_init(struct stream_in *in);
271bool audio_extn_compr_cap_enabled();
272bool audio_extn_compr_cap_format_supported(audio_format_t format);
273bool audio_extn_compr_cap_usecase_supported(audio_usecase_t usecase);
274size_t audio_extn_compr_cap_get_buffer_size(audio_format_t format);
275size_t audio_extn_compr_cap_read(struct stream_in *in,
276                                        void *buffer, size_t bytes);
277void audio_extn_compr_cap_deinit();
278#endif
279
280#if defined(DS1_DOLBY_DDP_ENABLED) || defined(DS1_DOLBY_DAP_ENABLED)
281void audio_extn_dolby_set_dmid(struct audio_device *adev);
282#else
283#define audio_extn_dolby_set_dmid(adev)                 (0)
284#endif
285
286
287#if defined(DS1_DOLBY_DDP_ENABLED) || defined(DS1_DOLBY_DAP_ENABLED) || defined(DS2_DOLBY_DAP_ENABLED)
288void audio_extn_dolby_set_license(struct audio_device *adev);
289#else
290#define audio_extn_dolby_set_license(adev)              (0)
291#endif
292
293#ifndef DS1_DOLBY_DAP_ENABLED
294#define audio_extn_dolby_set_endpoint(adev)                 (0)
295#else
296void audio_extn_dolby_set_endpoint(struct audio_device *adev);
297#endif
298
299
300#if defined(DS1_DOLBY_DDP_ENABLED) || defined(DS2_DOLBY_DAP_ENABLED)
301bool audio_extn_is_dolby_format(audio_format_t format);
302int audio_extn_dolby_get_snd_codec_id(struct audio_device *adev,
303                                      struct stream_out *out,
304                                      audio_format_t format);
305#else
306#define audio_extn_is_dolby_format(format)              (0)
307#define audio_extn_dolby_get_snd_codec_id(adev, out, format)       (0)
308#endif
309
310#ifndef DS1_DOLBY_DDP_ENABLED
311#define audio_extn_ddp_set_parameters(adev, parms)      (0)
312#define audio_extn_dolby_send_ddp_endp_params(adev)     (0)
313#else
314void audio_extn_ddp_set_parameters(struct audio_device *adev,
315                                   struct str_parms *parms);
316void audio_extn_dolby_send_ddp_endp_params(struct audio_device *adev);
317#endif
318
319#ifndef HFP_ENABLED
320#define audio_extn_hfp_is_active(adev)                  (0)
321#define audio_extn_hfp_get_usecase()                    (-1)
322#else
323bool audio_extn_hfp_is_active(struct audio_device *adev);
324audio_usecase_t audio_extn_hfp_get_usecase();
325#endif
326
327#ifndef DEV_ARBI_ENABLED
328#define audio_extn_dev_arbi_init()                  (0)
329#define audio_extn_dev_arbi_deinit()                (0)
330#define audio_extn_dev_arbi_acquire(snd_device)     (0)
331#define audio_extn_dev_arbi_release(snd_device)     (0)
332#else
333int audio_extn_dev_arbi_init();
334int audio_extn_dev_arbi_deinit();
335int audio_extn_dev_arbi_acquire(snd_device_t snd_device);
336int audio_extn_dev_arbi_release(snd_device_t snd_device);
337#endif
338
339#ifndef PM_SUPPORT_ENABLED
340#define audio_extn_pm_set_parameters(params) (0)
341#define audio_extn_pm_vote(void) (0)
342#define audio_extn_pm_unvote(void) (0)
343#else
344void audio_extn_pm_set_parameters(struct str_parms *parms);
345int audio_extn_pm_vote (void);
346void audio_extn_pm_unvote(void);
347#endif
348
349void audio_extn_utils_update_streams_output_cfg_list(void *platform,
350                                  struct mixer *mixer,
351                                  struct listnode *streams_output_cfg_list);
352void audio_extn_utils_dump_streams_output_cfg_list(
353                                  struct listnode *streams_output_cfg_list);
354void audio_extn_utils_release_streams_output_cfg_list(
355                                  struct listnode *streams_output_cfg_list);
356void audio_extn_utils_update_stream_app_type_cfg(void *platform,
357                                  struct listnode *streams_output_cfg_list,
358                                  audio_devices_t devices,
359                                  audio_output_flags_t flags,
360                                  audio_format_t format,
361                                  uint32_t sample_rate,
362                                  uint32_t bit_width,
363                                  struct stream_app_type_cfg *app_type_cfg);
364int audio_extn_utils_send_app_type_cfg(struct audio_usecase *usecase);
365void audio_extn_utils_send_audio_calibration(struct audio_device *adev,
366                                             struct audio_usecase *usecase);
367#ifdef DS2_DOLBY_DAP_ENABLED
368#define LIB_DS2_DAP_HAL "vendor/lib/libhwdaphal.so"
369#define SET_HW_INFO_FUNC "dap_hal_set_hw_info"
370typedef enum {
371    SND_CARD            = 0,
372    HW_ENDPOINT         = 1,
373    DMID                = 2,
374    DEVICE_BE_ID_MAP    = 3,
375    DAP_BYPASS          = 4,
376} dap_hal_hw_info_t;
377typedef int (*dap_hal_set_hw_info_t)(int32_t hw_info, void* data);
378typedef struct {
379     int (*device_id_to_be_id)[2];
380     int len;
381} dap_hal_device_be_id_map_t;
382
383int audio_extn_dap_hal_init(int snd_card);
384int audio_extn_dap_hal_deinit();
385void audio_extn_dolby_ds2_set_endpoint(struct audio_device *adev);
386int audio_extn_ds2_enable(struct audio_device *adev);
387int audio_extn_dolby_set_dap_bypass(struct audio_device *adev, int state);
388void audio_extn_ds2_set_parameters(struct audio_device *adev,
389                                   struct str_parms *parms);
390
391#else
392#define audio_extn_dap_hal_init(snd_card)                             (0)
393#define audio_extn_dap_hal_deinit()                                   (0)
394#define audio_extn_dolby_ds2_set_endpoint(adev)                       (0)
395#define audio_extn_ds2_enable(adev)                                   (0)
396#define audio_extn_dolby_set_dap_bypass(adev, state)                  (0)
397#define audio_extn_ds2_set_parameters(adev, parms);                   (0)
398#endif
399typedef enum {
400    DAP_STATE_ON = 0,
401    DAP_STATE_BYPASS,
402};
403#ifndef AUDIO_FORMAT_E_AC3_JOC
404#define AUDIO_FORMAT_E_AC3_JOC  0x19000000UL
405#endif
406
407#ifndef AUDIO_FORMAT_DTS_LBR
408#define AUDIO_FORMAT_DTS_LBR 0x1E000000UL
409#endif
410
411int read_line_from_file(const char *path, char *buf, size_t count);
412
413#ifndef KPI_OPTIMIZE_ENABLED
414#define audio_extn_perf_lock_init() (0)
415#define audio_extn_perf_lock_acquire() (0)
416#define audio_extn_perf_lock_release() (0)
417#else
418int audio_extn_perf_lock_init(void);
419void audio_extn_perf_lock_acquire(void);
420void audio_extn_perf_lock_release(void);
421#endif /* KPI_OPTIMIZE_ENABLED */
422#endif /* AUDIO_EXTN_H */
423